miércoles, 9 de marzo de 2011

Command Line Kung Fu: LanDiscovery & PortScan

Como comentaba en el anterior post, la pasada semana presenté en RootedCON una serie de Scripts para Meterpreter que usados en conjunto podían crearnos una pequeña réplica de los servicios internos de la organización auditada.

Para ello, evidentemente, necesitamos primero haces un descubrimiento de máquinas y un escaneo de puertos, y además debemos ser capaces de hacerlo con un usuario con bajos privilegios y sin utilizar ningún software adicional al que ya exista en la máquina (built-in).

La respuesta a estos requisitos es conocida como "Command Line Kung Fu", que como su propio nombre indica consiste en el arte de realizar todo tipo de acciones en los sistemas con tan solo el empleo de la linea de comandos y empleando solo aquellos comandos built-in (instalados por defecto) en los diferentes sistemas.

Uno de los recursos que más me gustan de este tipo de técnicas es el blog http://blog.commandlinekungfu.com , en el que se reúnen una serie de expertos en cada uno de las diferentes shells y "se pican" a ver quien saca la mejor solución para hacer cada una de las acciones que les proponen. Uno de ellos, Ed Skoudis, conocido por ser el autor de los cursos de Hacking Ético, Incident Handling y Penetration Testing del SANS Institute, y en mi humilde opinión uno de los mejores instructores que tiene el SANS.

Empleando estas técnicas, desarrollé los scripts landiscovery.rb y portscan.rb, que emplean técnicas de "Command Line Kung Fu" para funcionar, y que únicamente hay que copiarlos en la carpeta scripts/meterpreter dentro del directorio de Metasploit para poderlo utilizar.

LanDiscovery

El script landiscovery.rb intenta realizar un equivalente a un ARP Scan pero utilizando un poco de este Kung Fu del que hablábamos.

En realidad, cualquier inicio de conexión, sea satisfactoria o no, empieza con nuestro sistema haciendo un ARP Request para obtener la MAC del Next Hop, o en este caso, estando en una LAN, la MAC del Host destino. Esto lo podemos utilizar para hacer un pseudo ARP-Scan forzando a realizar algún tipo de conexión (por ejemplo, un ping) del que no esperaremos la respuesta, y posteriormente miraremos la tabla ARP de la máquina, que es accesible por cualquier usuario. Si al mirar la tabla ARP vemos que la IP contra la que hemos lanzado el ping aparece asociada a una MAC, eso quiere decir que la máquina se encuentra activa, independientemente de si respondió al ping o no.

Por el momento, el script identifica si la maquina se trata de un Windows o un Linux, para aplicar el Kung Fu adecuado, o en el caso de que no disponga del comando apropiado para el sistema, lo notifica:

Windows:
FOR /L %i in (1,1,255) do (
@START /B ping #NET#.%i -w 1 -n 1 > NUL
echo %i
arp -a | find /V "00-00-00-00-00-00" | find " #NET#."
)

Linux:
for i in `seq 1 255`
do
ping -c 1 #NET#.$i >/dev/null &
/usr/sbin/arp -na | grep '\(#NET#' |egrep "[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+:[0-9a-fA-F]+"
done

El script ha sido probado en versiones de Meterpreter para Windows y Java, pero a priori debería ser portable a cualquier versión de Meterpreter:

meterpreter > run landiscovery
[*] LINUX KUNG FU...
172.16.146.2
172.16.146.1
172.16.146.147
172.16.146.254

Como medida de rendimiento, el script ha sido probado tanto en Windows como en Linux en una red virtual con 24 bits de máscara, obteniendo un tiempo de ejecución de aproximadamente 12 segundos.

PortScan

El script portscan.rb debería intentar realizar un SYN-Scan a la IP que le pasemos como argumento. Sin embargo, hacer un SYN-Scan requiere altos privilegios en el sistema, así que vamos a tener que conformarnos con hacer un simple Connect-Scan empleando el Kung Fu adecuado. Por temas de eficiencia, por el momento el script escanea los 100 puertos más conocidos según NMap, aunque en el futuro existirán opciones que permitirá elegir al usuario la cantidad de puertos a escanear.

Para Windows se empleó el comando netsh.exe, que dispone de una opción "connect" mediante la cual se puede verificar si un puerto se encuentra abierto o no:

FOR %i in (#PORTS#) do @netsh diag connect iphost #IP# %i | find "\[%i\]"

En Linux no se encontró ninguna manera de hacer nada similar, así que se optó por utilizar el comando ftp para realizar las conexiones en segundo plano y posteriormente utilizar netstatpara ver que conexiones se encuentran en estado activo, que serán aquellas cuyos puertos están abiertos:

for i in #PORTS#
do
ftp #IP# $i 1>/dev/null 2>/dev/null &
done
netstat -n | grep " #IP#:" | cut -d':' -f 3 | cut -d' ' -f 1 | sort | uniq
killall ftp 1>/dev/null 2>/dev/null

Este método da algunos problemas al escanear 127.0.0.1, donde nos encontraremos con falsos positivos, pero por contra es mucho más rápido que la técnica empleada en Windows. Probablemente en las próximas versiones se cambie el Kung Fu de Windows para que sea similar al empleado en Linux.

El comando, cuando se usa desde Meterpreter, se llama con la opción -t IP:

meterpreter > run portscan -h
Meterpreter Script for performing a PortScan with Fu Techniques.
OPTIONS:
-h Help menu.
-t The target IP address

meterpreter > run portscan -t 172.16.146.147
[*] LINUX KUNG FU...
1025
1026
135
139
445

El escaneo empleando esta técnicas es casi inmediato, ya que este mismo que vemos tardó aproximadamente 3 segundos en realizarse.

En el próximo post veremos el script Multirelay, que se apoya en estos dos para realizar el mapeo completo de la red.
Atentos al blog!

6 comentarios :

Anónimo dijo...

Y si en vez del comando 'ftp' utilizaras 'nc' (netcat)?

neofito dijo...

Creo que lo que se trata es de hacerlo lo mas portable posible, y me temo que algunas distribuciones de linux no lo instalan por defecto.

Saludos

PD: Enhorabuena por la charla, y cuidate la garganta :)

Jose Selvi dijo...

@Anónimo: como dice @neofito, la gran mayoría de distribuciones no incluyen NetCat en su instalación estandar, mientras que ftp no he visto ninguna que no lo incluya, y necesitamos algo que pueda funcionar en todos los Linux.

También podía haber usado Telnet, pero me pasaba lo mismo que con NetCat, está empezando a no venir en algunas distribuciones.

Gracias por los comentarios! :)

Jose Selvi dijo...

@neofito: Gracias! La verdad es que sufrí dando la charla :P

Perdón a todos los asistentes, suelo ser bastante más explicativo, pero tengo que poder hablar y respirar con normalidad para serlo, es algo fundamental xD

Santiago Fernandez dijo...

Estimados,

Habria alguna forma, desde metasploit pasar a meterpreter. SIn tener que infectar una PC...

Ejemplo, quiero hacer una Auditoria Interna. Tengo la PC en la misma LAN a Auditar, y tengo que correr dichos Scripts y otros de meterpreter...COmo hago? Saludos y gracias!

Jose Selvi dijo...

@Santiago: No entiendo lo de "desde metasploit pasar a meterpreter sin tener que infectar un PC".

Si estás en la LAN no necesitas hacer esto. Puedes usar NMap para ver los equipos de tu red local. Esto es útil cuando comprometes un equipo remoto y quieres hacerlo en su red local. Si estás ya físicamente en la misma red local... usa otras herramientas.