25 técnicas de persistencia (Windows) de Pentest Lab

Grandísima recopilación de técnicas de persistencia recogidas en el blog de Penetration Testing Lab y mapeadas con Mitre, indicando además si se necesitan permisos o no de administrador en cada una de ellas:

Cómo eliminar la molesta telemetría de Firefox para trabajar (a gusto) con Burp

Ya sabéis que Firefox, incluso sin extensiones, genera un montón de ruido cuando trabajamos con Burp a modo de conexiones a DetectPortal, SafeBrowsing, reportMalware, version-checks, ping-telemetry, etc.

Para evitarlo podemos cambiar una serie de settings en el UI (por ejemplo, a través de about:config en el navegador) o, más sencillo, configurarlo dentro de un archivo user.js en tu perfil. Las rutas donde se deben guardar dicho archivo según sistema operativo (hay que crearlo si no existe) son las siguientes:
  • Windows: C:\Users\\AppData\Roaming\Mozilla\Firefox\Profiles\xxxxxxxx.default
  • Mac OS X: Users//Library/Application Support/Firefox/Profiles/xxxxxxxx.default
  • Linux: /home//.mozilla/firefox/xxxxxxxx.default
Y gracias a Mikhail Driagunov aka AetherEternity he querido recopilar este user.js para tener siempre a mano:
user_pref("accessibility.force_disabled", 1);
user_pref("accessibility.typeaheadfind.flashBar", 0);
user_pref("app.normandy.first_run", false);
user_pref("app.shield.optoutstudies.enabled", false);
user_pref("app.update.auto", false);
user_pref("app.update.checkInstallTime", false);
user_pref("app.update.doorhanger", false);
user_pref("browser.feeds.showFirstRunUI", false);
user_pref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
user_pref("browser.newtabpage.activity-stream.feeds.snippets", false);
user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
user_pref("browser.newtabpage.activity-stream.feeds.topsites", false);
user_pref("browser.newtabpage.activity-stream.prerender", false);
user_pref("browser.newtabpage.activity-stream.telemetry", false);
user_pref("browser.newtabpage.activity-stream.telemetry.ping.endpoint", "https://localhost");
user_pref("browser.ping-centre.telemetry", false);
user_pref("browser.safebrowsing.blockedURIs.enabled", false);
user_pref("browser.safebrowsing.downloads.enabled", false);
user_pref("browser.safebrowsing.downloads.remote.block_dangerous", false);
user_pref("browser.safebrowsing.downloads.remote.block_dangerous_host", false);
user_pref("browser.safebrowsing.downloads.remote.block_potentially_unwanted", false);
user_pref("browser.safebrowsing.downloads.remote.block_uncommon", false);
user_pref("browser.safebrowsing.downloads.remote.enabled", false);
user_pref("browser.safebrowsing.downloads.remote.url", "https://localhost");
user_pref("browser.safebrowsing.malware.enabled", false);
user_pref("browser.safebrowsing.phishing.enabled", false); 

HTTP-revshell: controla el equipo de la víctima a través de un canal encubierto

Hola a tod@s, mi nombre es Héctor de Armas, 3v4Si0N para los juankers y voy a presentarles una herramienta que desarrollé durante el confinamiento. Esta herramienta se hace llamar HTTP-revshell y consiste en la utilización de un canal encubierto (covert channel) para obtener control sobre el equipo víctima a través de peticiones web y de esta forma evadir soluciones como un IDS, IPS y AV.
Bueno, ¿y qué diablos es un covert channel?

Pues básicamente, es la manipulación de un protocolo de comunicación (en este caso HTTP y HTTPS) para enviar información de una manera fuera de la especificación del protocolo.

HTTP-revshell se ha desarrollado para ser utilizada en ejercicios de RedTeam y/o pentest para poner a prueba las capacidades de detección de las soluciones de seguridad que una empresa puede tener implementadas (siempre para hacer el bien y nunca para el mal, sed buenos).

Utilización de HTTP-revshell

Comenzamos con la instalación de la herramienta. Lo primero, descargar el repositorio que se encuentra en la siguiente URL:

    • https://github.com/3v4Si0N/HTTP-revshell

Para realizar una pequeña muestra de cómo funciona vamos a utilizar la versión de la rama dev ya que, actualmente como se encuentra en desarrollo, está más actualizada que la versión de la rama master. Para ello, utilizamos el siguiente comando:

git clone -b dev https://github.com/3v4Si0N/HTTP-revshell.git


Cómo montar un ISO malicioso correctamente

El uso de archivos ISO maliciosos se lleva usando desde hace tiempo en muchas campañas de malware: Phobos, ZLoader, LokiBot, Nanocore, Grandoreiro... pero hasta ahora no había visto un artículo tan claro como el de Mateusz, fundador de vx-underground, dónde muestra cómo montar correctamente un archivo ISO para ser utilizado con fines maliciosos. Veamos pues cómo montar una ISO sin establecer una ruta visible para el usuario y/o asignar una letra de dispositivo.

Primero, ¿por qué no usar un archivo VHD/VHDX (disco duro virtual) en lugar de un ISO (imagen de CD o DVD)? Ambos tienen que se virtualizados y montados por Windows y ambos utilizan llamadas a API similares (Virtual Storage API), pero muchos antivirus parecen ser incapaces de montar mediante programación un archivo VHD/VHDX, aunque parece que si son capaces de analizar imágenes ISO en cierta medida. ¿Entonces por que los desarrolladores de malware no usan mejor ficheros VHD? Pues básicamente porque el tamaño mínimo de un archivo VHD que se puede asignar en una Tabla de Partición GUID (GPT) es de 5MB.

Centrémonos entonces en los ISOs, mucho más pequeños y versátiles. Como decíamos, coinciden en el uso de ciertas APIs, y concretamente con AttachVirtualDisk podremos montar y leerlo también. Podremos llamar a OpenVirtualDisk​ como se define a continuación:
DWORD ​OpenVirtualDisk​(
  PVIRTUAL_STORAGE_TYPE         VirtualStorageType,  
  PCWSTR                        Path,  
  VIRTUAL_DISK_ACCESS_MASK      VirtualDiskAccessMask,
  OPEN_VIRTUAL_DISK_FLAG        Flags,
  POPEN_VIRTUAL_DISK_PARAMETERS Parameters,
  PHANDLE                       Handle
);

El primer parámetro, VirtualStorageType, debe ser válido como parte de una estructura VIRTUAL_STORAGE_TYPE que se define como:
typedef​​struct​ _​VIRTUAL_STORAGE_TYPE​ {
  ULONG DeviceId;
  GUID  VendorId;
} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;

El DeviceId debe establecerse en VIRTUAL_STORAGE_TYPE_DEVICE_ISO. Además, VendorId debe establecerse en VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT.
Si hacemos esto así, todo lo demás seguirá siendo prácticamente idéntico que con un archivo VHD/VHDX.

Ultra Tesla: Crear redes distribuidas de servicios, fácil, rápido y seguro

Ultra Tesla es un proyecto de código abierto para crear redes distribuidas de servicios fácil, rápido y seguro, usando el poder de computo de múltiples ordenadores. El proyecto permite unificar los distintos servidores en una única interfaz que es proporcionada para el mismo usuario creando una sensación de transparencia.


Mi primer "Hello World":

Ultra Tesla utiliza servicios, que son básicamente mini-programas que se adhieren a la ejecución del servidor, siguiendo una sintaxis en HTTP como la siguiente: ://///<...>

Donde es 'http' o 'https' según la configuración del servidor; es básicamente la dirección del servidor; es el nombre del servicio, que para este ejemplo será "hello_world" y los demás que son y <...> son básicamente otros mini-programas que se tendrán que usar anteponiendo el nombre del servicio anterior, por ejemplo, ////<...> y así según lo que el administrador haya propuesto.

Código: Python
  1. class Handler:
  2.     async def get(self):
  3.        await self.write('Hello World!')

Un ejemplo real con el servicio nombrado como complements/hello_world.py en una URL se vería como lo siguiente (suponiendo que la dirección del servidor sea localhost): http://localhost:17000/hello_world

Backup-ToSystem: abusando de los permisos de "Backup operators" y el servicio VDS

Buenas, ¿cómo andas cabeshas de mal? Mi nombre es Luis Vacas o CyberVaca como me conocen algunos… y en este post hablaremos sobre los permisos que se otorgan al grupo de “Backup Operators”


SeBackupPrivilege

➔ "Permite al usuario eludir los permisos de archivos y directorios para hacer una copia de seguridad del sistema. Tiene sentido que exista este privilegio para que se pueda realizar backups del sistema. El privilegio se selecciona sólo cuando la aplicación intenta acceder a través de la interfaz de la aplicación de copia de seguridad NTFS. De lo contrario, se aplican los permisos normales de archivos y directorios"

➔ Con este privilegio se puede hacer fácilmente una copia de seguridad del registro de Windows y utilizar herramientas de terceros para extraer los hashes locales de NTLM. Cómo por ejemplo secretsdump.py de impacket.

Hasta aquí todo correcto, pero un momento, si este privilegio permite leer todos los archivos del sistema, quizá podamos aprovecharnos de ello. Así que intentaremos cambiar las ACL de algún path en el que no deberíamos poder escribir, pero espera ¿Qué diablos es un ACL?

ACL

➔ Una lista de control de acceso (ACL), con respecto a un sistema, es una lista de permisos adjunta a un objeto. Una ACL especifica qué usuarios o procesos del sistema tienen acceso a los objetos, así como qué operaciones están permitidas en determinados objetos. Cada entrada de una ACL especifica un usuario o grupo y una operación. Por ejemplo, si un objeto de archivo tiene una ACL que contiene (Administrador: leer, escribir; Pepe: leer), esto le daría a Administrador permiso para leer y escribir el archivo y a Pepe sólo para leerlo.

Bueno, ya que tenemos claro los conceptos vamos a ver si podemos abusar de él.

SMBleed (CVE-2020-1206): nueva vulnerabilidad en SMB 3.1.1 (y que puede combinarse con SMBGhost para RCE)

Seguro que ya sabéis que hace poco se publicó código que permite la ejecución remota de código o RCE usando SMBGhost (CVE-2020-0796), una vulnerabilidad en el mecanismo de compresión de SMBv3.1.1 PERO que fue parcheada hace tres meses por Microsoft. Hasta ahí todo bien... parche publicado rápidamente por el fabricante y posterior aparición de exploits: desde el que permitía un crash del sistema, pasando por elevación de privilegios hasta este último RCE que comento, algo que no impedirá sin embargo que muchos incautos infecten sus máquinas des-actualizadas con malware ya más "weaponizable".

No obstante, durante la investigación para explotar SMBGhost la gente de ZecOps descubrió otra vulnerabilidad en la funcionalidad de descompresión que permite leer memoria del kernel no inicializada y, lo que es peor, combinada con la ya parcheada SMBGhost permitiría de nuevo ejecución remota de comandos: señores y señoras, con ustedes SMBleed (CVE-2020-1206).

Lectura remota de la memoria del kernel

Si recordáis, SMBGhost se aprovechaba de la falta de comprobaciones contra integer overflows en Srv2DecompressData, la función que recibe el mensaje comprimido que envía el cliente, asigna la cantidad de memoria requerida en el campo OriginalCompressedSegmentSize y descomprime los datos. Concretamente si asignábamos un valor muy grande a OriginalCompressedSegmentSize podíamos desbordarlo y escribir fuera de los límites (o "out of bounds" que en español queda raro). Microsoft lo solucionó pero todavía se dejó un error grave: si seteamos un valor pequeño (x + 0x100) a OriginalCompressedSegmentSize los datos no inicializados del kernel serán tratados como parte del mensaje, básicamente porque en la función FinalCompressedSize se actualiza para mantener el valor de CompressedBufferSize, que es el tamaño del búffer.


La PoC de ZecOps requiere credenciales y un recurso compartido con permisos de escritura, pero el bug aplica a cada mensaje, por lo que puede ser explotado sin autenticación. También hay que tener en cuenta que la memoria filtrada proviene de asignaciones anteriores en el pool NonPagedPoolNx, y, dado que controlamos el tamaño de la asignación o allocation, podríamos controlar los datos que se están filtrando, hasta cierto punto claro.

https://github.com/ZecOps/CVE-2020-1206-POC

Fingerprints para detectar y evadir sandboxes conocidos

Hoy en día detonar malware en una sandbox es uno de los métodos más usados a la hora de analizar malware, sobretodo cuando tenemos un montón de casos e incidentes cada día y poco tiempo para realizar un reversing/análisis estático en profundidad. Desde un simple triage hasta un análisis más completo del comportamiento, incluso extracciones automáticas de familias de malware conocido (CAPE *guiño* *guiño*): el análisis dinámico automatizado es muy, muy importante. Por eso los rojirrins no dejan de implementar medidas para evadir estos sandboxes, desde la detección de la ejecución en entornos virtuales o medidas de debugging o cualquier medida que pueda dar una pista al artefacto de turno para detener su actividad en el caso de que detecte que está siendo "vigilado".

Precisamente leía recientemente en el blog de Hexacorn una serie de características comunes de algunos sandboxes que pueden ser implementadas en cualquier malware para incrementar sus medidas de bypass, un ejemplo claro de que los azulones deben implementar entornos totalmente aleatorizados si no quieren que sus sistemas de análisis se den de bruces con malware cada vez más sofisticados, la eterna lucha del bien y del mal, el ying y el yang...

JujuBox
  • Usuario: enmascarado en los informes como <USER>, pero SID no lo está: S-1-5-21-364843204-231886559-199882026-1001
  • Versión del sistema operativo: sin licencia y detectable comprobando si es software genuino mediante el API: SLIsGenuineLocal.
  • Desktop incluye Acrobat Reader, Firefox, Google Chrome, Open Office 4.1.6, Steam, contabilidad, eula, mydoc, mypresentation, OpenOffice, party y stats; las extensiones de archivo no se muestran, pero son fáciles de adivinar
  • El filename es un <SHA256 hash> .exe
  • La resolución de la pantalla parece ser baja: ¿800x 600?
  • Solo 4 iconos en la barra de tareas

Técnicas de ofuscación de comandos en la consola de Windows (CMD)

En una APT ejecutar comandos en la consola de windows o CMD es sinónimo de ofuscación. Al hilo de ésto, recogemos varias técnicas para ofuscar comandos que pueden evadir las detecciones más simplistas y que aún en día se utilizan y suelen ser muy efectivas para conseguir evadir muchos sistemas de detección. Hagamos un repaso a las mismas:

Empezamos con lo más fácil o tonto, en CMD no se distingue entre mayúsculas y minúsculas, ping = PINg = PING:


Ahora pasamos a los caracteres especiales comúnmente utilizados para ofuscar comandos:

1. El carácter "^" es el carácter de escape más común en la consola de comandos ya que no afecta a la ejecución. En el entorno cmd, algunos caracteres tienen funciones especiales, como >, >> para redireccionar, | para canalizar otros comandos, &, &&, y || para conectar con más instrucciones. Todos tienen funciones específicas. Si se necesitan mostrar como caracteres, se debe escapar de éstos primero: agregue un carácter de escape ^ antes de cada carácter especial. Por ejemplo: echo ^>, echo ^|, echo ^|^|, echo ^^ y c^m^d.


2. La coma "," y el punto y coma ";" son intercambiables y pueden reemplazar los espacios permitidos en el comando. Los espacios múltiples no afectan la ejecución del comando.


3. Los paréntesis emparejados () también pueden aparecer en los parámetros del comando y no afectarán la ejecución del comando. Los paréntesis indican grupos de subcomandos integrados, que también son interpretados por el intéprete de parámetros.

Crackear la contraseña de cualquier usuario de Windows sin ningún privilegio (cuenta de invitado incluida)

¿Quieres crackear la contraseña del administrador local de Windows con la cuenta de invitado o con otro usuario sin privilegios? Pues resulta que el API LogonUserW por defecto no implementa ningún bloqueo por intentos fallidos de login... consecuencia: Jean-Pierre Lesueur (@DarkCoderSc) nos demuestra con su herramienta win-brute-logon lo fácil que sería obtener por fuerza bruta las credenciales localmente, desde Windows XP hasta la última release de Windows 10 (1909).

Tenéis la herramienta en https://github.com/DarkCoderSc/win-brute-logon que además es multihilo y funciona tanto en 32 como en 64 bits.

Para la PoC al igual que en el repo de JP crearemos un usuario local administrador y otro normal:

C:\>net user pepito password1
Se ha completado el comando correctamente.

C:\>net localgroup administradores pepito /add
Se ha completado el comando correctamente.

C:\>net user fulanito /add
Se ha completado el comando correctamente.

C:\>net user fulanito 123456
Se ha completado el comando correctamente.


Como veis hemos usado dos contraseñas bastante predecibles, ambas incluidas en el diccionario de SecList: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10k-most-common.txt.

Así que seleccionamos el usuario y el diccionario correspondiente y, si la contraseña no es lo suficientemente robusta, ocurre la magia:



Por defecto, el nombre de dominio es el valor designado por la variable de entorno %USERDOMAIN%, pero se uede especificar otro con la opción -d.

Y si por lo que sea no conoces el nombre de usuario puedes a probar con distintos usuarios con este sencillo Powershell:
$lista = Get-Content listadeusuarios.txt

Foreach ($usuario in $lista){
.\WinBruteLogon.exe -u $usuario -w 10k-most-common.txt
}

Lo sorprendente es que por defecto en Windows no implementa ningún bloqueo, así que es más que recomendable es configurarlo en secpol.msc:


Por supuesto no olvidar también deshabilitar la cuenta de invitado (si es que no la tenéis ya deshabilitada) y usar whitelisting de aplicaciones siempre que sea posible.