Vamos directo al grano con el segundo articulo de esta serie. Para poder escanear una red con netcat es necesario combinar el uso de «netcat» con un «ciclo for» en «bash» y el comando final es el siguiente: for ip in {1..254} ;do (ping 192.168.0.$ip -c 1 -w 1 >/dev/null && netcat -v -z -n -w 1 192.168.0.$ip 21-445 2>&1 | grep succeeded &) ;done
El resultado final de la ejecución del código es el siguiente:
Explicación del Script
for ip in {1..254} ;do (echo Hola) ;done
Este código permite iniciar un ciclo for
, el cual permitirá contar del 1 al 254 ({1..254}
) y ejecutar lo que se encuentre dentro del paréntesis en do ()
. Es decir, ejecutara lo que se encuentra en do ()
un total de 254 veces, ademas, almacenará el valor del conteo en la variable ip
.
El comando done
cierra el ciclo for
y los ;
finalizan una linea del script.
Explicando el código dentro del Paréntesis
ping 192.168.0.$ip -c 1 -w 1 >/dev/null && netcat -v -z -n -w 1 192.168.0.$ip 21-445 2>&1 | grep succeeded
Ping 192.168.0.$ip -c 1 -w 1
Este extracto del código permite hacer un ping a una dirección IP en cada conteo del ciclo, en el cual, el ultimo octeto de la ip es definido por el valor de la variable $IP
. El parámetro -c 1
establece que solo se realice una petición y el parámetro -w 1
indica que el tiempo de espera por una respuesta es de 1 segundo.
>/dev/null
Este extracto del script permite enviar el contenido de la salida del comando que se encuentre antes del símbolo >
hacia lo que se encuentre después de el, en este caso/dev/null
. Es decir enviara la respuesta del comando ping hacia /dev/null
.
¿Que es /dev/null
?
/dev/null
es un «Pseudo dispositivo» también conocido como un «archivo especial» o «archivo de dispositivo». Los «pseudo dispositivos» se encuentran en la carpeta /dev/ pero no hacen referencia a ningún hardware en realidad y tampoco es un directorio o archivo normal el cual puedas mover o copiar. El archivo especial /dev/null
anulara todo el contenido recibido, es decir, los envía a un agujero negro y no habrá una respuesta de salida, ni forma de recuperar lo enviado.
&& netcat -v -z -n -w 1 192.168.0.$ip 21-445 2>&1
Terminemos de explicar el resto del código.
&&
ejecutara el comando a continuación si y solo si el comando anterior tuvo éxito. Es decir, si el ping tuvo respuesta ejecutara lo que se encuentre después del &&
.
Netcat -v -z -n -w 1 192.168.0.$ip 21-445 2>&1
Este comando ejecutara netcat en modo verbose con el parámetro -v
. Con el parámetro -z
usa el modo Zero-I/O utilizado para escaneo, el parámetro -n
desactiva la resolución de nombres de dominios y el parámetro -w 1 indica el tiempo de espera en 1 segundo, para que el escaneo sea mas rápido. Finalmente se indica la dirección IP a escanear y el rango de puertos, el cual son del 21 al 445.
2>&1
Esto puede ser un poco complicado de entender así que les recomiendo leer sobre los streams estándar en Linux.
- 0: stdin
- 1: stdout
- 2: stderr
En pocas palabras 2>&1 envía el stream de salida de errores (2:stderr) hacia el stream de salida normal (1:stdout). En donde 2 es la salida de error canalizado con > a la salida 1 (normal). El & es para indicar que el 1 equivale a otro elemento del stream. Se que puede ser complicado de entender pero en pocas palabras esto se utiliza por que netcat envía los logs de salida del modo verbose al estándar error output, es decir, a 2:stderr y si queremos hacer un grep tenemos que enviar el 2:stderr al 1:stdout.