pyattck: un paquete en Python para interactuar con el framework MITRE ATT&CK

Si te dedicas a threat hunting y tienes el foco en las tácticas, técnicas y procedimientos (TTP) utilizados por ciertos actores/grupos, entonces ya sabes que el framework de MITRE ATT&CK es muy valioso...


MITRE proporciona una guía con un diseño simple y directo, pero puede ser útil también usarlo mediante programación para medir (o asignar) ciertos controles de seguridad utilizando su framework. Afortunadamente el equipo de investigación de Swimlane ha lanzado pyattck, un paquete Python para interactuar con el framework Mitre ATT&CK de una manera bastante sencilla y que nos permitirá identificar relaciones conocidas entre todas las verticales en MITRE ATT&CK.

Imagina que queremos asegurarnos que estamos protegidos contra las TTP relacionadas con Dragonfly y en lugar de mirar a través de un mapa visual la información sobre este actor, podremos usar pyattck para extraer las herramientas, el malware y las técnicas asociadas o utilizadas por este grupo. Entonces, para recuperar las técnicas usadas por Dragonfly podemos instalar pyattck (pip install pyattck) y programar un sencillo script como este:
import sys
from pyattck import Attck
attack = Attck()
for actor in attack.actors:
 if sys.argv[1] in actor.name:
  for technique in actor.techniques:
   print(technique.name)

Inyección reflejada de DLLs en Windows

Normalmente cuando se carga una DLL en Windows se llama a la función LoadLibrary, que toma la ruta del archivo de la DLL y la carga en la memoria. Sin embargo, existe una técnica que permite a un atacante inyectar una librería en un proceso remoto (víctima) desde la memoria en lugar de desde disco, una forma más sigilosa de ejecutar código malicioso: hablamos de la inyección reflejada de DLLs o, en inglés, "reflective DLL loading".

No obstante, Windows no tiene una función como LoadLibrary para llevarlo a cabo, así que para obtener la funcionalidad tendremos que escribirla nosotros mismos.

Implementando la técnica

La técnica más común para inyectar DLLs de una forma reflejada, bien documentada por el irlandés Stephen Fewer, es doble. En primer lugar, la DLL que queremos inyectar debe estar escrita en el espacio de direcciones del proceso de destino/host. En segundo lugar, la DLL debe cargarse en ese proceso host de tal manera que se cumplan todos los requisitos de tiempo de ejecución de la librería, como resolver sus importaciones o reubicarlas en una ubicación adecuada en la memoria.

Suponiendo que tenemos ejecución de código en el proceso del host y que la librería que deseamos inyectar se ha escrito en una ubicación arbitraria de la memoria en el proceso del host, la inyección reflejada de DLLs funciona de la siguiente manera:

- La ejecución se pasa, ya sea a través de CreateRemoteThread(), una función de API no documentada equivalente como RtlCreateUserThread o un pequeño shellcode bootstrap, a la función ReflectiveLoader de la librería, que es una función exportada que se encuentra en la tabla de exportación de la librería.
- Como la imagen de la librería existirá actualmente en una ubicación arbitraria en la memoria, ReflectiveLoader primero calculará la ubicación actual de su propia imagen en la memoria para poder analizar sus propios headers para su uso posterior.
- ReflectiveLoader luego analizará la tabla de exportación de los procesos del host kernel32.dll para calcular las direcciones de las tres funciones requeridas por el cargador, a saber, LoadLibraryA, GetProcAddress y VirtualAlloc.
- ReflectiveLoader ahora asignará una región continua de memoria en la que procederá a cargar su propia imagen. La ubicación no es importante ya que el cargador re-ubicará correctamente la imagen más adelante.
- Los headers y las secciones de la librería se cargarán en sus nuevas ubicaciones en la memoria.
- ReflectiveLoader procesará la copia recién cargada de la tabla de importación de su imagen, cargando las librerías adicionales y resolviendo sus respectivas direcciones de función importadas.
- ReflectiveLoader procesará la copia recién cargada de la tabla de reubicación de su imagen.
- ReflectiveLoader llamará a la función de punto de entrada de su imagen recién cargada, DllMain con DLL_PROCESS_ATTACH. La librería ahora se habrá cargado con éxito en la memoria.
- Finalmente, ReflectiveLoader devolverá la ejecución al shellcode inicial que lo llamó, o si fue llamado a través de CreateRemoteThread, el hilo terminará.

* Si queréis ver código C/C++ para implementar muchas de las funciones necesarias os aconsejo que echéis un vistazo al post de 0x00Sec aquí.

Reflective dll inject en Metasploit

Asumimos que el atacante ya ha obtenido una shell de meterpreter en el sistema víctima y ahora intentará realizar una inyección reflexiva de DLL en un proceso remoto, más específicamente en un proceso notepad.exe con PID 6156.

¿Has conseguido credenciales en un pentest y necesitas ayuda para encontrar info sensible? Scavenger, un script que puede ayudarte

Durante un pentest interno, si tenemos suerte y/o la suficiente pericia, obtendremos acceso de nivel administrativo al dominio de Active Directory de Windows. Sin embargo, muchas veces tendremos el problema de tener demasiado acceso a demasiados sistemas con días limitados para pruebas. Necesitamos encontrar información valiosa y lo antes posible...

Scavenger es una herramienta creada por Trustwave que nos permitirá encontrar rápidamente esos archivos y carpetas "interesantes" una vez que hayamos obtenido credenciales (post-explotación). Es multi-hilo y permite escanear sistemas remotos (*nix, Windows y OSX) a través de los servicios SMB y SSH para analizar cada sistema en busca de información valiosa y luego almacenar en caché el resultado de forma ordenada en una base de datos.

La información confidencial puede tomar muchas formas dependiendo de lo que se busca, pero en el caso de un pentester, generalmente reside en contraseñas y nombres de usuario de otros sistemas o incluso de diferentes dominios de Windows. Scavenger busca y peina proactivamente este tipo de información:

- lista de los "últimos" archivos/carpetas accedidos/modificados/creados.
- archivos que contengan palabras interesantes, por ejemplo, "password" o "secret". Una vez detectados, Scavenger los descargará a local.
- archivos que contengan información de cuentas y tarjetas (PCI).
- hashes de contraseñas del archivo SAM local o de la base de datos de Active Directory (ntds.dit).
- contraseñas guardadas en algunas aplicaciones, por ejemplo, las contraseñas que se guardan en Chrome, y también otras aplicaciones como WinSCP.


Además, Scavenger tiene la capacidad de comparar y contrastar la lista almacenada en caché de archivos y carpetas previamente obtenidos con una lista recientemente escaneada y adquirida después de un período de tiempo no determinado (horas o días). Por ejemplo, si obtuvimos acceso de nivel de administrador de dominio el día inicial de la prueba de instrusión, el pentester puede esperar varios días y usar Scavenger para volver a escanear y comparar la lista "nueva" anterior de archivos encontrados con la última lista de archivos.

Esto le da al analista la capacidad de determinar rápidamente qué ha cambiado en ese período de tiempo, por ejemplo, si se han creado nuevos archivos y/o si se ha accedido o modificado los archivos antiguos de alguna manera. Por ejemplo, si vemos que el administrador accede con frecuencia a ciertas contraseñas o archivos, es seguro que lo que hay en esos archivos tiene un valor importante.

Requisitos

Instalar CrackMapExec - CrackMapExec Installation Page

Repo

git clone https://github.com/SpiderLabs/scavenger.git

Ejemplos

$ python3 ./scavenger.py smb -t 10.0.0.10 -u administrator -p Password123 -d test.local

$ python3 ./scavenger.py smb --target iplist --username administrator --password Password123 --domain test.local --overwrite


Fuente:

https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/scavenger-post-exploitation-tool-for-collecting-vital-data/