domingo, 22 de noviembre de 2020

Damn-Vulnerable-Bank: una app Android insegura para practicar

Damn Vulnerable Bank es una aplicación para Android que simula ser una app de un banco y que nos proporciona una interfaz para realizar pruebas y poder obtener una comprensión detallada de los aspectos internos y de seguridad más comunes.

Cómo utilizar la aplicación

- Clonar el repositorio:

$ git clone https://github.com/rewanth1997/Damn-Vulnerable-Bank.git

Servidor de Backend

$ cd Damn-Vulnerable-Bank/BackendServer


Con docker:

  • $ docker-compose up --build
  • Hacer una petición a /api/health/check para ver el estado
    •     curl <IP>:<magic_port>/api/health/check

Sin docker:

  • Instalar dependencias
    • nodejs (v10.19.0)
    • npm (6.14.4)
    • mysql (Ver 8.0.21)
  • Actualizar la configuración de mysql (campos de nombre de usuario, contraseña) en config/config.json
  • Insertar datos en la base de datos
    • cat database/schema+data.sql | mysql -u root -p 
  • Instalar paquetes npm
    • npm install
  • Iniciar el servidor de aplicaciones
    • npm start
  • Hacer una petición a /api/health/check para ver el estado
    •     curl <IP>:<magic_port>/api/health/check
Aplicación
  • Descargar la apk e instalarla a través de adb o manualmente
  • Abrir la aplicación y agregar la IP de backend en la pantalla de inicio
  • Probar el estado de ejecución presionando verificación de estado
  • Crear una cuenta mediante la opción de registro o signup y luego iniciar sesión con las credenciales
  • Realizar operaciones bancarias
  • Iniciar sesión como administrador para aprobar al beneficiario
*La base de datos se completa previamente con algunos usuarios para una exploración rápida.

UsernamePasswordAccount NumberBeneficiariesAdmin privileges
user1 password1 111111 222222, 333333, 444444 No
user2 password2 222222 None No
user3 password3 333333 None No
user4 password4 444444 None No
admin admin 999999 None Yes

Características
  • Sign up/login
  • Interfaz de profile
  • Cambio de contraseña
  • Interfaz de configuración para actualizar la URL del backend
  • Agregar la verificación de fingerprints antes de transferir/ver fondos
  • Agregar chequeo de PIN antes de transferir/ver fondos
  • Ver saldo
  • Transferir dinero
    • Mediante entrada manual
    • Mediante escaneo QR
  • Agregar/Ver beneficiario (eliminar pendiente)
  • Ver historial de transacciones (descarga pendiente)
Construyendo la Apk con ofuscación
  • Ir a Opciones de compilación y seleccionar Generar paquete firmado/Apk
  • Luego seleccionar Apk como opción y hacer clic en siguiente
  • Crear un nuevo almacén de claves para firmar el apk y recordar la contraseña
  • Seleccionar ese almacén de claves e ingresar la contraseña
  • Ahora seleccionar Build variant como Release y Signature version como V2
  • Construir (build) la apk
Lista de vulnerabilidades en la aplicación (Alerta de spoiler)
  • Detección de root y emulador
  •  Comprobaciones anti-debugging (evita hooking con frida, jdb, etc.)
  • SSL pinning: pinear el certificado/clave pública
  • Ofuscar todo el código
  • Cifrar todas las solicitudes y respuestas
  • Información confidencial encodeada
  • Fuga de Logcat
  • Almacenamiento inseguro (tal vez números de tarjetas de crédito guardados)
  • Actividades exportadas
  • Token JWT
  • Integración de WebView
  • Deep links
  • IDOR
TODO
  • Agregar profile y rutas de cambio de contraseña
  • Crear diferentes secrets para administradores y otros usuarios
  • Agregar generación dinámica de secretos para verificar tokens JWT
  • Introducir error o bug en la verificación de jwt
  • Encontrar una manera de almacenar la base de datos y montarla mientras se usa Docker
  • Entorno dockerizado
Autores

Rewanth Cool (Rest API) Github LinkedIn
Hrushikesh Kakade (Android App) Github LinkedIn
Akshansh Jaiswal (Android App)GithubLinkedIn

Repo: https://github.com/rewanth1997/Damn-Vulnerable-Bank

martes, 10 de noviembre de 2020

Usan un zero-day de Solaris para atacar redes corporativas

Desde hace algún tiempo se viene observando un grupo bautizado por Mandiant como UNC1945 que utiliza una serie de herramientas y técnicas contra sistemas Windows, Linux y muy reseñablemente contra sistemas Solaris. Para los que no habéis tenido la oportunidad de tocar este sistema Unix ex-de Sun Microsystems he de deciros que era cosa fina a lomos de un Sparc dentro de una Enteprise 450 o hasta de una Ultra 5/10... pero esas son historias de un admin-cebolleta de hace más de 15 años... 

Para dar un poquito más de contexto decir que el código fuente de Solaris se liberó en 2005 convirtiéndose en OpenSolaris hasta el año 2010 en el que Oracle compró Sun y decidió que dejara de ser "open". La última versión estable, la 11.4, data de 2018 es decir de hace más de 2 años. Aún así mantiene soporte y sigue habiendo todavía muchos servidores Solaris en circulación (incluso versiones obsoletas) y actores como UNC1945 lo consideran interesante de explotar pues pueden suponer un target importante de cara a infiltrarse en muchas redes corporativas.

Curiosamente, en abril de 2020, encontrábamos en el black market por $3000 USD un exploit con la descripción "Oracle Solaris SSHD Remote Root Exploit" llamado EVILSUN y, oh casualidad, a mediados de 2020 se descubrió en un servidor Solaris 9 una herramienta de UNC1945 que contenía un 0-day bautizado con el CVE-2020-14871 que explotaba una vulnerabilidad recientemente parcheada en el módulo PAM (Pluggable Authentication Module). 

PAM permite que una aplicación Solaris autentique a los usuarios al tiempo que permite que el administrador del sistema configurar en un único sitio los parámetros de autenticación (por ejemplo, la complejidad y la caducidad de la contraseña). La vulnerabilidad real es un desbordamiento de búfer clásico basado en pila ubicado en la función parse_user_name:

static int
parse_user_name(char *user_input, char **ret_username)
{
            register char *ptr;
            register int index = 0;
            char username[PAM_MAX_RESP_SIZE];
       /* ... */

            ptr = user_input;
       /* ... */
             /*
             * username will be the first string we get from user_input
             * - we skip leading whitespaces and ignore trailing whitespaces
             */
            while (*ptr != '\0') {
                  if ((*ptr == ' ') || (*ptr == '\t'))
                               break;
                  else {
                               username[index] = *ptr;
                               index++;
                               ptr++;
                  }
            }
             /* ret_username will be freed in pam_get_user(). */
            if ((*ret_username = malloc(index + 1)) == NULL)
                  return (PAM_BUF_ERR);
            (void) strcpy(*ret_username, username);
            return (PAM_SUCCESS);
}


La vulnerabilidad surge siempre que un nombre de usuario de más tamaño que PAM_MAX_RESP_SIZE (512 bytes) se pasa a parse_user_name. De hecho, es probable que la vulnerabilidad haya existido durante décadas y que haya estado "latente" tanto tiempo porque solo es explotable si una aplicación no limita los nombres de usuario a una longitud menor antes de pasarlos a PAM, como puede ocurrir con un demonio SSH.

La autenticación Keyboard-Interactive es un mecanismo de autenticación de "passthrough" en el que el protocolo SSH transmite mensajes y respuestas entre las librerías PAM del servidor y el cliente. Fue diseñado para admitir formas personalizadas de autenticación, como de doble factor, sin modificar el protocolo SSH. Al manipular la configuración del cliente SSH para forzar la autenticación de Keyboard-Interactive para solicitar el nombre de usuario en lugar de enviarlo por los medios normales, un atacante también puede pasar una entrada ilimitada a la función parse_user_name de PAM.

Exploit PoC


Con el fin de probar rápidamente diferentes versiones de Solaris y ver si pueden ser vulnerables, la gente de Mandiant desarrolló un exploit de prueba para provocar el desbordamiento y bloquear el servidor SSH. El cliente estándar de OpenSSH ofrece todas las opciones necesarias para activar la vulnerabilidad:


Para ver si el servidor es vulnerable basta con recibir un "Authentication failed" (si no lo fuera se nos volvería a pedir el usuario). El desbordamiento en la librería PAM también hace que el servidor SSH crashee:

El sistema operativo escribe un dump por el crash en /core si el servidor SSH falla sin un debugger attacheado. De hecho, si existe un archivo /core en una máquina Solaris y vemos que se trata de sshd, esos son indicadores claros de que e ha explotado previamente esta vulnerabilidad.

Sistemas operativos vulnerables

  • Solaris 9 (algunas versiones)
  • Solaris 10 (todas las versiones)
  • Solaris 11.0
    • Si bien la función parse_user_name sigue siendo vulnerable en Solaris 11.1 sin parches y posteriores algunos cambios no documentados en la librería PAM truncan el nombre de usuario antes de que la función vulnerable lo reciba, lo que hace que el fallo no sea explotable a través de SSH. Si la función parse_user_name fuera accesible en otro contexto, entonces la vulnerabilidad podría volverse explotable.
  • Illumos (OpenIndiana 2020.04)

Mitigaciones y workarounds

Podemos encontrar un parche de Oracle para Solaris 10 y 11 entre las actualizaciones de octubre de 2020.
Debido a que Solaris 9 ya no está soportado Oracle ya no se ha publicado un parche. Para los sistemas Solaris 9, así como Solaris 10 u 11 donde la aplicación de parches es inconveniente, se recomienda editar el archivo /etc/ssh/ shd_config para agregar las líneas ChallengeResponseAuthentication no y KbdInteractiveAuthentication no y reiniciar el servidor SSH. Si bien esto elimina la posibilidad de aprovechar la vulnerabilidad mediante la autenticación Keyboard-Interactive SSH, puede haber otras formas de atacar la función parse_user_name y recomendamos usar esta solución solo como una solución provisional hasta que se puedan actualizar los sistemas Solaris 9 o se pueda actualizar el parche de octubre. 

Fuentes: 

Decoder++: una herramienta para codificar/decodificar datos en varios formatos

Decoder++ de bytebutcher es una aplicación para pentesters y desarrolladores bastante chula para decodificar o codificar datos en varios formatos. 

Para instalar la herramienta simplemente podemos usar pip u obtener la fuente desde el repo de Github:

pip3 install decoder-plus-plus

o git clone https://github.com/bytebutcher/decoder-plus-plus.git
En modo gráfico tenemos dos opciones: main-window-mode o dialog-mode. Mientras que el primer modo admite tabs, con el segundo tenemos la opción de devolver el contenido transformado a stdout para su posterior procesamiento. Esto es muy útil si queremos llamar a Decoder++ desde otras herramientas como BurpSuite (echa un vistazo a la extensión de BurpSuite Send-to) o cualquier otro script en el que queramos agregar una interfaz gráfica de usuario.

Por otro lado, si no queremos iniciar una interfaz gráfica podemos usar también la herramienta desde la línea de comandos:

(/tools/decoder-plus-plus/dpp$ python3 runner.py)
$ dpp -e base64 -h sha1 "encodeame y hasheame esto por la gracia de Shon"
763c99199ea69043ea7edb4dcb90e53457e57cd7
Para listar codecs disponibles:
$ dpp -l base enc

Codec                 Type
-----                 ----
base16                encoder
base32                encoder
base64                encoder
Decoder ++ distingue entre codificadores, decodificadores, hashes y scripts. Al igual que la interfaz gráfica por línea de comandos permite utilizar varios códecs en un único comando:
$ dpp "H4sIAAXmeVsC//NIzcnJ11Eozy/KSVEEAObG5usNAAAA" -d base64 -d gzip
Hello, world!
Si bien los codificadores, decodificadores y hashers se pueden usar de primeras, algunos de los scripts pueden requerir configuración adicional. Para mostrar todas las opciones disponibles de un script específico, se puede usar el parámetro de ayuda:
$ dpp "Hello, world!" -s split_and_rejoin help

Split & Rejoin
==============

             Name  Value  Group            Required  Description
             ----  -----  -----            --------  -----------
       split_term  ,                       yes       the parameter used for splitting
   split_by_chars  True   split_behaviour  no        specifies whether text should be split at chars
  split_by_length  False  split_behaviour  no        specifies whether text should be split at interval
rejoin_with_chars                          yes       the chars used to join the split text
Para configurar un script específico, se debe proporcionar las opciones individuales como pares nombre-valor (por ejemplo, search_term = "Hello"):
$ dpp "Hello, world!" -s search_and_replace search_term="Hello" replace_term="Hey"
Hey, world!

Características

  • Interfaces de usuario: 
    • Interfaz gráfica del usuario 
    • Interfaz de línea de comandos 
  • Scripts y códecs preinstalados: 
    • Codificar/Decodificar: Base16, Base32, Base64, Binary, Gzip, Hex, Html, JWT, HTTP64, Octal, Url, Url +, Zlib 
    • Hash: Adler-32, Apache-Md5, CRC32, FreeBSD-NT, Keccak224, Keccak256, Keccak384, Keccak512, LM, Md2, Md4, Md5, NT, PHPass, RipeMd160, Sha1, Sha3 224, Sha3 256, Sha3 384, Sha3 512, Sha224, Sha256, Sha348, Sha512, Sun Md5 
    • Scripts: CSS-Minify, Caesar, Filter-Lines, Identify File Format, Identify Hash Format, JS-Beautifier, JS-to-XML, HTML-Beautifier, Little/Big-Endian Transform, Reformat Text, Remove Newlines, Remove Whitespaces, Search and Replace, Split and Rejoin, Unescape/Escape String 
  • Decodificación inteligente 
  • Sistema de plugins 
  • Cargar y guardar la sesión actual 
  • Plataformas: Windows, Linux y MAC 

Desarrollo de plugins 

Para agregar códecs personalizados, simplemente tenemos que copiarlos en la carpeta $HOME/.config/dpp/plugins/. 

Proyecto: https://github.com/bytebutcher/decoder-plus-plus

 

CLOWN SAW