Ataques man-in-the-browser (MitB)

Ya sabéis que un ataque man-in-the-middle (MiTM) el atacante intercepta el tráfico de la víctima, lo que le permite robar la información no protegida y manipular las respuestas. Sin embargo hoy vamos a ver los ataques man-in-the-browser (MitB) que se sitúan entre la víctima y su navegador. Normalmente lo suele implementar malware bancario y extensiones del navegador maliciosas ya que las protecciones como TLS y el segundo factor de autenticación no tienen ningún efecto contra ellos.

El agente de MitB espera hasta que la víctima visite un sitio web relevante y, cuando envía un formulario para realizar un nuevo pago, el agente cambia los valores enviados. Esto significa que en lugar de enviar, digamos, $1000 a un amigo, la víctima termina enviando $10,000 al atacante.


La principal mitigación contra estos ataques MiTB es utilizar mecanismos de autenticación "fuera de banda" en inglés out-of-band (OOB), es decir, utilizar otro medio externo al propio navegador del usuario como un SMS, si bien hay que tener en cuenta que también existe malware man-in-the-mobile (MitMo) en el teléfono móvil... xD

Un ejemplo práctico de un troyano que utiliza MitB

Una cadena de infección típica que incorpora un troyano que intentará realizar transacciones fraudulentas manipulando DOM es la siguiente:

  1. El troyano infecta el software de la computadora, ya sea el sistema operativo o la aplicación.
  2. El troyano instala una extensión en el navegador maliciosa para que se cargue la próxima vez que se inicie el navegador.
  3. Más tarde, el usuario reinicia el navegador.
  4. El navegador carga la extensión.
  5. La extensión registra un controlador para cada carga de página.
  6. Siempre que se carga una página, la extensión busca la URL de la página en una lista de sitios conocidos que son objeto de un ataque.
  7. El usuario inicia sesión de forma segura en, por ejemplo, https://www.banco.site/.
  8. Cuando el controlador detecta una carga de página para un patrón específico en su lista de destino (por ejemplo, https://www.banco.site/cuenta/FormularioPago), registra un controlador de eventos de botón.
  9. Cuando se presiona el botón enviar, la extensión extrae todos los datos de todos los campos del formulario a través de la interfaz DOM en el navegador y recuerda los valores.
  10. La extensión modifica los valores a través de la interfaz DOM.
  11. La extensión le dice al navegador que continúe enviando el formulario al servidor.
  12. El navegador envía el formulario, incluidos los valores modificados, al servidor.
  13. El servidor recibe los valores modificados en el formulario como una solicitud normal. El servidor no puede diferenciar entre los valores originales y los valores modificados, ni detectar los cambios.
  14. El servidor realiza la transacción y genera un recibo.
  15. El navegador recibe el recibo de la transacción modificada.
  16. La extensión detecta la URL https://www.banco.site/cuenta/confirmar, escanea el HTML en busca de los campos del recibo y reemplaza los datos modificados en el recibo con los datos originales que recordaba en el HTML.
  17. El navegador muestra el recibo modificado con los detalles originales.
  18. El usuario cree que la transacción original fue recibida por el servidor intacta y autorizada correctamente.

Sencilla protección contra ransomware mediante Raccine

Muchas familias de ransomware intentan mediante vssadmin borrar todas las shadow copies del sistema, ya sabéis, las instantáneas que va tomando Windows para poder volver a un punto de restauración en caso necesario. Es decir, intentan que la víctima no pueda tirar de ningún backup. ¿Qué pasaría si pudiéramos interceptar ese intento y terminar el proceso que lo invoca? Pues esto es lo que hace la herramienta Raccine del archifamoso Florian Roth aka Neo23x0.

Funcionamiento

  • Se intercepta la llamada a vssadmin.exe (y wmic.exe) y se pasa a raccine.exe como debugger (vssadmin.exe delete shadows se convierte en raccine.exe vssadmin.exe delete shadows)
  • Luego se procesan los argumentos de la línea de comandos y se buscan combinaciones maliciosas usando reglas de Yara.
  • Si no se puede encontrar una combinación maliciosa, se crea un nuevo proceso con los parámetros originales de la línea de comandos.
  • Si se encuentra una combinación maliciosa, se recopilan todos los PID de los procesos principales y comienza a matarlos. Raccine muestra una ventana de línea de comandos con los PID eliminados durante 5 segundos, lo loggea en el registro de eventos de Windows y luego sale.

Ventajas:

  • El método es bastante genérico.
  • No tenemos que reemplazar un archivo de sistema (vssadmin.exe o wmic.exe), lo que podría ocasionar problemas de integridad y podría romper nuestra vacuna cada vez que se parchee
  • Permite usar reglas YARA para buscar parámetros maliciosos en la línea de comandos
  • Los cambios son fáciles de deshacer
  • Se ejecuta en Windows 7/Windows 2008 R2 o superior
  • No se requiere un ejecutable en ejecución o un servicio adicional (sin agente)

Desventajas/Puntos ciegos

  • El uso legítimo de vssadmin.exe para eliminar shadow copies (o cualquier otra combinación blacklisteada) ya no es posible
  • Elimina todos los procesos que intentaron invocar vssadmin.exe, lo que podría ser un proceso de copia de seguridad (falso positivo)
  • Esto no detectará métodos en los que el proceso malicioso no sea uno de los procesos en el árbol que ha invocado vssadmin.exe (por ejemplo, a través de schtasks)

Tritium: una herramienta en go para password spraying

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

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

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

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

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

Uso:

 ./Tritium -h

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

          Author: S4R1N, alfarom256
 


 Required Params:

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

 Optional: 

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

CVE-2020-9484: RCE mediante deserialización en Apache Tomcat con PersistentManager

Hoy vamos a ver la explotación de la vulnerabilidad CVE-2020-9484 que publicó Jarvis Threedr3am, de pdd security research, a comienzos del verano pasado y que permite ejecución remota de código a través de deserialización en versiones de Apache Tomcat anteriores a abril de 2020. 

Eso sí, para que el servidor Tomcat objetivo sea vulnerable además los administradores tienen que haber configurado el uso de PersistentManager editando el archivo conf/context.xml, ya que por defecto Tomcat se ejecutará con StandardManager

  • StandardManager mantendrá las sesiones en la memoria. Si tomcat se cierra correctamente, almacenará las sesiones en un objeto serializado en el disco (llamado "SESSIONS.ser" por defecto). 
  • PersistentManager hace lo mismo, pero con un extra: hacer swapping de sesiones inactivas/idle. Si una sesión ha estado inactiva durante x segundos, se moverá al disco. Es una forma de reducir el uso de memoria. 

Cuando Tomcat recibe una solicitud HTTP con una cookie JSESSIONID, le pedirá al Manager que verifique si esa sesión ya existe. Como se controla el JSESSIONID ¿qué pasa por ejemplo si lo seteamos a un valor como "JSESSIONID=../../../../../../tmp/12345"? 

  • Tomcat solicita al Manager que verifique si existe una sesión con el ID de sesión "../../../../../../tmp/12345"
  • Primero verificará si tiene esa sesión en la memoria. 
  • Si no es así y está configurado PersistentManager verificará si tiene la sesión en el disco.
  • Verificará en el directorio + sessionid + ".session", por lo que se evalúa como “./session/../../../../../../tmp/12345.session“ 
  • Si el archivo existe, lo deserializará y analizará la información de la sesión.

Entonces, ya ha os habéis imaginado que necesitamos cargar un objeto serializado malicioso en un path interno de la máquina para que podamos recuperarlo a través de la cookie JSESSIONID y poder conseguir RCE. 

Taller de exploiting: ret2libc en Linux x64

Seguimos con exploiting en Linux, con el mismo código en la entrada anterior pero esta vez activando el bit NX (no-execute), es decir, la protección que nos marcará el stack como no ejecutable:
#include <stdio.h>
#include <unistd.h>

int vuln() {
    char buf[80];
    int r;
    r = read(0, buf, 400);
    printf("\nHas pasado %d bytes. buf es %s\n", r, buf);
    puts("No shell!");
    return 0;
}

int main(int argc, char *argv[]) {
    vuln();
    return 0;
}
Para ello compilamos el código esta vez sin '-z execstack':
$ gcc -fno-stack-protector ejercicio2x64.c -o ejercicio2x64
No nos olvidamos de desactivar ASLR (de momento) para realizar el ejercicio:
$ sudo sysctl -w kernel.randomize_va_space=0
Y cambiarle los permisos necesarios también:
$ sudo chown root ret2libc
$ sudo chmod 4755 ret2libc
Comprobamos las protecciones del programa compilado:
gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : ENABLED
PIE       : disabled
RELRO     : Partial

Ya tenemos el binario para trabajar con él, pero recordar que ya no podremos apuntar la dirección de retorno a nuestro shellcode directamente en la pila, por lo que tendremos que utilizar la técnica return to libc o ret2libc. 

¿Qué es ret2libc? 

Cada vez que escribimos un programa en C utilizamos funciones como printf, scanf, put, etc. y todas esas funciones estándar de C se han compilado en un solo archivo que es la librería estándar de C o libc, el cual es independiente del binario (programa compilado). 

Ret2libc es una técnica que se basa en ejecutar código que no se encuentra en la pila sino en un sector de la memoria de libc, que es ejecutable. Es decir, el código utilizado para vulnerar el programa son funciones dentro de esta librería. 

Resumiendo: podemos modificar la dirección de retorno para que apunte a libc, que cuenta con funciones muy útiles como system() para, por ejemplo, obtener una shell. 

El resumen del payload más común sería el siguiente: 

Junk + RET + POP RDI + shell + System Address