No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Escaneador de puertos con concurrencia

15/19
Recursos

Aportes 5

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Le agregué expresiones regulares en la función checkEnviron par saber si por el ttl estamos en una máquina Linux o una caja windows xd

package main

import (
	"flag"
	"fmt"
	"net"
	"os/exec"
	"regexp"
	"strconv"
	"strings"
	"sync"
)

var (
	host = flag.String("host", "scanme.nmap.org", "host to be scanned")
)

func checkEnviron() (string, error) {

	out, err := exec.Command("ping", "-c", "1", *host).Output()
	if err != nil {
		return "", err
	}
	re := regexp.MustCompile(`ttl=(.?).[\S]`)
	ttl := fmt.Sprintf("%s", re.FindString(string(out)))
	ttl = strings.Split(ttl, "=")[1]
	ttlNum, err := strconv.Atoi(ttl)
	if err != nil {
		return "", err
	}
	if ttlNum <= 64 {
		return "\n\t[+] Linux system\n", nil
	} else if ttlNum >= 127 {
		return "\n\t[+] Windows system\n", nil
	} else {
		return "\n\t[-] the time to the life of the target system doesn't exists\n", nil
	}

}

func main() {

	flag.Parse()

	environ, _ := checkEnviron()
	fmt.Println(environ)

	var wg sync.WaitGroup
	//wg.Add(1000)
	for i := 0; i < 65535; i++ {
		wg.Add(1)
		go func(j int) {
			defer wg.Done()
			conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", *host, j))
			if err != nil {
				return
			}
			conn.Close()
			fmt.Printf("[+] port %d open!!\n", j)
		}(i)
	}
	wg.Wait()
}

Lo seguí probando con solo 100 ciclos, el cambio se nota mucho más.

Mi codigo:

package main

import (
	"flag"
	"fmt"
	"net"
	"sync"
)

func PortOpen(port int, site string, wg sync.WaitGroup) {
	conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", site, port))

	if err != nil {
		return
	}

	wg.Done()
	conn.Close()

	fmt.Printf("Port %d is open.\n", port)

}

const PORTS_TO_SCAN = 10000

var site = flag.String("site", "scanme.nmap.org", "URL to scan.")

func main() {
	flag.Parse()

	var wg sync.WaitGroup

	for i := 0; i < PORTS_TO_SCAN; i++ {
		wg.Add(1)
		go PortOpen(i, *site, wg)
	}

	wg.Wait()
}
package main

import (
	"flag"
	"fmt"
	"net"
	"sync"
)

// Get variable from command line
// Usage: go run net/port.go --site=www.url.com
var site = flag.String("site", "scanme.nmap.org", "Site to scan")

func main() {
	flag.Parse() // parse the flags

	var wg sync.WaitGroup

	// Escanear cada puerto y hacer una conexión
	for i := 0; i < 65535; i++ {
		wg.Add(1)
		go func(port int) {
			defer wg.Done()

			conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", *site, port))
			if err != nil {
				return
			}
			conn.Close()
			fmt.Println("Port", port, "is open")
		}(i)
	}

	wg.Wait()
}

Mucho mejor!!! 😎