After identifying the ports that are open, you can try to read from the connection and see whether the service provides a banner or an initial message.
The following example works like the previous, but instead of just connecting and disconnecting, it will connect and try to read an initial message from the server. If the server provides any data, it is printed, but if the server does not send any data, nothing is printed:
package main
import (
"strconv"
"log"
"net"
"time"
)
var ipToScan = "127.0.0.1"
func main() {
activeThreads := 0
doneChannel := make(chan bool)
for port := 0; port <= 1024 ; port++ {
go grabBanner(ipToScan, port, doneChannel)
activeThreads++
}
// Wait for all threads to finish
for activeThreads > 0 {
<- doneChannel
activeThreads--
...