Buffered
TAG -> Dockerlabs | CTF
Enumeración de servicio
Lo primero que siempre debemos hacer antes de iniciar los escaneos o pruebas de vulnerabilidades, es verificar conectividad con la maquina victima, por ejemplo usando el comando ping de la siguiente manera.
❯ ping -c 1 172.17.0.2 -R
PING 172.17.0.2 (172.17.0.2) 56(124) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.122 ms
RR: 172.17.0.1
172.17.0.2
172.17.0.2
172.17.0.1
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.122/0.122/0.122/0.000 msComo vemos, ningún paquete se perdió, así que tenemos conectividad con el servidor, mediante el TTL podemos darnos una idea a lo que nos enfrentamos, en este caso es un TTL de 64 por lo cual podemos pensar en un linux, el TTL puede ser modificado, pero generalmente siempre esta en un rango donde de 128 a 65 es Windows y de 64 a 1 es Linux, después de saber que tenemos conectividad con la maquina, yo hago un escaneo primario con mi script de python de los 1000 puertos mas famosos, luego escaneo los 65535 puertos existentes, primero por TCP y luego por UDP en caso de no encontrar nada interesante, antes que nada para tener todo bien organizado, tengo una función en la bash que es mkt el cual me crea mis carpetas de trabajo de la siguiente manera.
El cual me crea 7 directorios los cuales me ayudan a tener un orden, dentro de recognition lo que are es el escaneo primario con el siguiente comando.
Resultado
Con este escaneo puedo ver algunas cosas interesantes como la redirección de la ip a buffered.dl y es muy interesante que solo el puerto 80 este abierto, lo siguiente que are es agregar la ip y la URL en el /etc/hosts para que mi maquina pueda resolver el dominio.
Quedaría de esta manera, si quisiera escanear los 65535 puertos tendría que usar nmap de la siguiente manera.
Resultado
El archivo grepeable guardado quedaría así:
Podemos usar la función de s4vitar para extraer la información más relevante, es otra función de bash.
Nos daría algo así:
En caso de haber muchos puertos abiertos, esta función nos copia los puertos para agilizar trabajo, ahora si procedamos a ver ese puerto 80 con nmap.
Resultado
Vemos que la pagina usa nginx y también podemos ver el titulo de la pagina, podemos hacer otro escaneo un poco más agresivo de la siguiente manera.
Recordatorio:
Si el puerto abierto en ves de ser el 80 hubiera sido el 443 podríamos usar
openssl s_clienten modo cliente para ver informacion importante como redirecciones, etc.Ejemplo:
openssl s_client -connect <IP>:443
Resultado
Podemos ver un poco más de información sobre el servidor, tambien exportamos el resultado en un xml la forma de darle tratamiento para verlo en la web seria.
Si vamos a la web veríamos lo siguiente en el localhost.

Ahora tiremos algunos scripts mas agresivos de nmap.
Resultado
Vemos mucha información importante, por ejemplo nmap nos dice que el servidor es vulnerable a CSRF y nos da un pequeño fuzzing del contenido en el servidor que veremos mas adelante, también nos da un CVE que pertenece a un DoS, que si estuviéramos haciendo un informe, son cosas muy importante que debemos poner.
Enumeración por Fuzzing
Ahora toca el reconocimiento por Fuzzing pero antes que nada vamos a crear un proyecto en Burp Suite para llevar un registro de todo lo que hagamos, después de abrir Burp Suite iremos a Target y en Scope agregaremos el dominio en el que vamos a trabajar, quedaría de la siguiente manera, también agregamos la casilla de incluir subdominios.

Podemos ir a nuestro explorador para ver la pagina web.

Podemos ver el Wappalyzer para ver las tecnologías que usa esta pagina web.

Podríamos buscar vulnerabilidades en las versiones de estas tecnologías pero en este caso no lo aremos, así que procedemos a ver el Site map de Burp Suite.

Vemos que se va llenando de información referente a la pagina web y solo sobre el dominio que pusimos en el Scope, enumerando la pagina web veo usuarios con sus correos electrónicos, para extraer todos los correos electrónicos de la pagina web, podemos usar cewl de la siguiente manera.

Usando Cewl.
Resultado
Lo que nos interesa es eso ultimo, lo podemos agregar a un archivo llamado correos.txt, también podemos guardar los nombres de los usuarios en un archivo usuarios.txt, quedaría de la siguiente manera.
Ahora veo el código fuente para ver si hay algo relevante pero no hay nada, así que procedamos con el Fuzzing pero de subdominios primero, la herramienta que generalmente uso para esto es FFuf veamos como podríamos enumerar subdominios con esta herramienta.
Como vemos nos da muchos falsos positivos que podemos filtrar, en este caso usare -fs para filtrar por el tamaño de la respuesta ya que veo que la gran mayoría arroja 36718.
Veo que encontró algo útil y posiblemente el vector de entrada, el subdominio es dashboard antes que nada debemos agregar esto al /etc/hosts, quedaría así.
Ahora en una auditoria podríamos hacer lo siguiente, al ejecutar FFuf para buscar subdominios guardar el resultado con la opción -o esto guardara la informacion en un json el cual le daremos un pequeño tratamiento para verlo mejor y aprovecharlo al máximo.
Podemos poner -o FFuf_subdominios.json y el resultado seria el siguiente.
Tenemos diferentes clave valor, lo que aremos es filtrarlos de la siguiente manera.
Esto nos dará los subdominios que encontró, en este caso solo uno, ahora esto lo podríamos agregar al /etc/host que ya lo hicimos y tambien en un txt de los subdominios, ejemplo.
Ahora teniendo estos subdominios podemos ver en la web el subdominio dashboard.

Vemos que en el Site map se registra correctamente lo que hacemos y la web seria la siguiente.

Aquí ya vamos viendo algunos campos que podríamos vulnerar, pero sigamos haciendo reconocimiento, lo siguiente que haremos es Fuzzing de directorios, en este caso usaremos Feroxbuster lo ejecutaremos de la siguiente manera.
Nota:
En entornos reales una wordlist que da mejores resultados seria
raft-medium-directories.txttambien tiene unlargeysmall.
Resultado
También vemos el resultado en nuestro archivo y ahora aremos lo mismo con el subdominio, cabe resaltar que esto lo podríamos hacer con un bucle for y ahorrarnos un poco de trabajo.
Resultado
Después de ver los diferentes directorios existentes podemos hacer Fuzzing de extensiones de la siguiente manera, este tipo de fuzzing con Feroxbuster puede demorar muchísimo, así que mucha paciencia o usar FFuf para ir con un tipo de extensión e ir más rápido, por ejemplo archivos php
Resultado
Para el subdominio seria lo mismo, solo agregaríamos -x php,html,txt,zip y todas las extensiones que queremos buscar.
Resultado
Ahora algo más que podríamos hacer es usar 2 herramientas que detectan vulnerabilidades, la primera seria nuclei y la otra seria nikto veamos como usarlas.
Nuclei
Nuclei es un escáner de vulnerabilidades rápido y personalizable impulsado por la comunidad de seguridad global y construido sobre un DSL simple basado en YAML, que permite la colaboración para abordar las vulnerabilidades de tendencia en Internet. Le ayuda a encontrar vulnerabilidades en sus aplicaciones, API, redes, DNS y configuraciones de la nube.
Nuclei esta escrito en go, en caso de necesitar alguna cookie de sesión u otras opciones para funcionar se puede agregar con el parámetro -H esto inyecta lo necesario en la cabecera de las solicitudes.
Resultado
Nikto
Nikto es una herramienta de código abierto que analiza servidores web para detectar vulnerabilidades. Entre las cosas que puede hacer, Nikto busca: Software desactualizado o sin parches, Archivos peligrosos, Versiones des actualizadas del software del servidor web.
Resultado
Con estos pasos deberíamos tener suficientes datos para encontrar alguna vulnerabilidad web presente en el servidor.
Explotación de vulnerabilidades
Lo primero que are sera registrarme en la pagina web para ver como es internamente o que cosas tengo a nivel de usuario, el login lo podemos encontrar en el subdominio, si veo los correos que guarde en un inicio, todo tiene como dominio @buffered.dl así que eso usare, me registrare como victor@buffered.dl.

Cuando iniciamos sesión, vemos que tenemos un dashboard pero no hay ningún campo que podamos intentar vulnerar.
Lo que puedo hacer ahora es verificar si puedo conseguir las credenciales de algún usuario con mas privilegios o iniciar sesión como algún usuario privilegiado, ejemplo admin, primero intento con uno de los correos que tenemos guardados christine@buffered.dl y cualquier contraseña, me muestra lo siguiente.
Y así casi con todos, excepto el ultimo correo que es de wilson@buffered.dl me dice lo siguiente, si intento con el correo de admin@buffered.dl también me dice:
Con estas notificaciones podría hacer un ataque de fuerza bruta porque ya tengo una forma de ver correos validos solo faltaría la contraseña, pero vemos en Burp Suite para ver como es el método de autenticación.
Veo otra forma de iniciar sesión por OAuth Login en Burp Suite veo lo siguiente.

Veo que se manda mi correo con mi contraseña.

Después hace una petición por GET a oauth_callback.

Y por ultimo da el acceso según lo que se envié, en este caso al dashboard de usuario normal, cuando hace la petición GET a oauth_callback podemos modificar los parámetros y suplantar la identidad de admin por ejemplo, en este caso cambiando el gmail, quedaría de la siguiente manera.

Ahora le damos Forward y nos aparecerá lo siguiente.

Vemos que ahora si nos da acceso a admin_dashboard, volvemos a presionar Forward.

Y ya vemos algunos campos que podemos seguir intentando vulnerar, intentemos con el capo Search lo siguiente:
Primero intento con inyecciones SQL
' OR '1'='1me devuelve.
En los campos de más abajo tampoco parece funcionar.
Segundo intento con inyecciones html
<h1>hello</h1>me devuelve lo mismo, no parece funcionar.Intentamos con inyecciones js
<script>alert('XSS');</script>y tampoco funciona.Intentemos con inyecciones SSTI
{{7*7}}y nos da un resultado favorable ya que nos resuelve la operación.
Intentemos obtener un RCE aprovechando este SSTI, un repositorio que nos podría ayudar es el siguiente PayloasdAllTheThing tambien tienen una pagina web, esta pagina nos ayuda a determinar frente a que tipo de inyección estamos, en nuestro caso después de probar algunas inyecciones veo que estamos frente a un Jinja2 ya que si por ejemplo inyectamos:
Nos devuelve un trollface y así con comandos como whoami:
[!FAIL] The item with ID ⣿⣿⣿⣿⣿⠟⣋⣭⣭⣭⡭⣭⣍⣉⣉⣉⣭⣭⣭⣭⣍⣙⣛⡛⠿⢿⣿⣿⣿⣿ ⣿⣿⣿⡿⢃⣾⣿⣟⡯⡳⣯⣻⣶⣾⣟⢷⣾⣿⣿⣿⣿⣿⣿⢾⣷⣦⣍⢻⣿⣿ ⣿⣿⡿⢡⣿⣿⣿⣿⣿⠾⠛⠛⢛⡛⠿⣿⣿⣿⣿⣿⣿⠿⠿⢿⣾⣿⣿⡄⢿⣿ ⡿⠫⣠⡬⠛⠛⠿⢽⣧⣬⡤⢄⣬⣍⡓⣈⣿⣿⣟⠉⣀⣤⣤⣤⣿⣿⣿⡽⡦⠙ ⢰⣿⡏⣼⡿⢉⠻⢶⣦⣤⣶⣿⣿⣿⠿⢿⣿⣿⣿⣄⠻⢿⣯⣉⣡⡶⣶⣽⣿⡇ ⡈⢟⢧⣱⣶⡈⠿⣶⡄⣉⣛⠚⠿⢧⣸⣭⣭⣽⠿⠿⣃⣤⣽⣿⠟⠄⢹⣳⡗⣰ ⣿⣦⡉⣾⣿⣷⣄⢢⡄⠈⠛⠻⠷⢰⣦⣬⣍⢉⣉⡈⣉⣩⡍⢴⠆⠆⢸⣿⢠⣿ ⣿⣿⣷⡘⢿⣿⣿⣦⣁⠿⣿⣶⠆⣤⣀⣉⠉⠈⠉⠁⠈⠉⠁⠄⠄⢀⢸⣿⢸⣿ ⣿⣿⣿⣿⣦⡙⢟⡿⣟⡷⣬⣉⡘⠿⠿⣿⠄⣿⣿⢀⣶⠆⡶⠠⠇⣂⣾⣿⢸⣿ ⣿⣿⣿⣿⣿⣿⣶⣬⡑⠫⢷⣻⡽⣻⡶⣶⣶⣶⣶⣶⣶⣶⣶⣾⢟⣿⡿⣿⠈⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣬⣙⠻⠶⣿⣿⣭⣿⣶⣶⣶⣾⣿⣿⣽⣾⡿⢁⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⣭⣉⣛⣛⠛⠿⠿⠟⣛⣋⣴⣿⣿ is not found.
Pero si intentamos con ls nos devuelve contenido.
Intentemos ls -Rla para ver todos los contenido de forma recursiva con sus permisos, en este caso podríamos ir a ver el código fuente de la pagina para ver el contenido mejor.
En el directorio ./local/bin parece que están los comandos con el trollface ya que la gran mayoría tiene 1116 bytes de tamaño, tambien hay un archivo que nos puede llamar la atención .pwgen.py, a simple vista se puede ver que bash no tiene trollface, pero filtremos que comandos nos pueden ser útil para inyectar una reverse shell, copiamos lo que esta en ./local/bin y lo pegamos en un archivo llamado por ejemplo local_bin.txt y filtramos de la siguiente manera.
Vemos varios binarios interesantes, pero bash, php y sh son muy pequeños para ser el binario original, así que los podemos descartar, ls y cat parecen ser los únicos binarios legítimos, hay un archivo llamado loader leamos el contenido para ver si hay información relevante.
Comando:
Resultado
Este script en Python ejecuta un código en formato hexadecimal como si fuera una función, algo que se suele asociar a la ejecución de shellcode en memoria. Un resumen de su funcionamiento:
Conversión de Hexadecimal a Bytes: Toma un string hexadecimal proporcionado como argumento en la línea de comandos y lo convierte en bytes.
Asignación de Memoria Ejecutable: Asigna un bloque de memoria para almacenar estos bytes, con permisos de lectura, escritura y ejecución (RWX). Esto permite ejecutar el código como si fuera una función.
Ejecuta el Código en Memoria: Luego de asignar los permisos, el script trata la memoria asignada como una función y la ejecuta.
Si ejecutamos el script de la siguiente manera veremos
Comando
Resultado
El script nos pide una cadena en hexadecimal, lo que podemos hacer es inyectar una reverse shell en hexadecimal y ponernos en escucha en nc.
Primero nos ponemos en escucha.
Luego usamos msfvenom para crear el payload de la siguiente manera.
Resultado
En este comando usé msfvenom para generar un payload de shell reverso para Linux (x64) con conexión a mi máquina en 172.17.0.1 por el puerto 4444. Excluí el carácter nulo (\x00) y lo formateé en hexadecimal (-f hex).
Lo inyectamos en el servidor.
Y vemos que hemos logrado recibir la shell.
Ahora veamos quienes somos y en que grupo estamos y también la IP de la siguiente manera.
Escalada de privilegios
Bien antes de proseguir deberíamos darle un tratamiento a la TTY, aunque en mi caso optare por usar pwncat-cs para tener un TTY interactiva, me vuelvo a enviar la Reverse Shells.

Con esto ya no tengo que preocuparme por el tratamiento de TTY o que se muera la terminal, ademas de tener muchos módulos muy útiles, como vimos anteriormente, cuando ejecutamos el comando id vemos un grupo interesante:

Con Ctrl + D entramos a la Bash de la victima.
El grupo mysql nos permite ver las bases de datos existentes y demás información sensible pero necesitaremos tener credenciales validas primero, en la home de wilson hay una carpeta dashoard dentro de ella hay algunos archivos:

Hay un archivo oculto llamado .pwngen.py vamos a descargarlo con pwncat.

Cuando le echamos un vistazo a este archivo, vemos que genera una cadena de la siguiente manera n.apellido@buffered.dl_000123 probablemente lo usaremos más adelante, ahora veremos el archivo app.py y verificaremos si tiene credenciales de mysql.

Encontramos una credenciales que nos puede ser útil, vamos a conectarnos a ver si nos deja con el siguiente comando:

Y efectivamente nos deja conectarnos, como podemos apreciar usando el comando:
Nos mostrara las base de datos existentes, una que llama la atención es myflaskapp.

Podemos usar el comando:
Notaremos una tabla de users y otra de users_old, veamos primero users con el siguiente comando:

Aquí es donde se están guardando los usuarios del dashboard, users_old al parecer contiene datos previos los cuales nos copiaremos.

Lo pondremos dentro de un archivo llamado db.txt.

Ahora, sabiendo que somos el usuario wilson, buscaremos archivos a los que este usuario pueda acceder, usando el comando find.

Buscamos desde la raíz y con
grepquitamos rutas como:proc,sysyhome, encontramos un archivo en
Lo que encontramos es un email del usuario Christine el cual parece ser Site Admin de algún sitio web dentro del servidor.
Nos copiamos este email en nuestra maquina.

Ahora seguimos enumerando la maquina y en este caso pasamos a ver puertos internos de la maquina y encontramos que hay otros servicios corriendo ademas del mysql corriendo en distintos puertos.

Los nuevos puertos que encontramos son:
5000
5555
9000
Para tener acceso a esos servicios de manera cómoda usaremos chisel, de esta forma podremos exponer estos servicios en nuestra maquina local, lo primero que aremos es copiar chisel a un directorio de trabajo, luego levantar un servidor sencillo con php o python.

Luego iremos a la maquina victima y verificaremos si tiene instalado wget o curl, en este caso tiene curl así que procedemos a descargar chisel y darle permisos de ejecución dentro del directorio tmp:

Luego en nuestra maquina ejecutamos chisel en modo servidor en nuestra maquina atacante:

Ahora en la maquina victima me conecto al servidor que acabo de levantar como cliente redirigiendo los puertos necesarios:

En nuestra maquina atacante podremos ver las conexiones que se hicieron correctamente:

Ahora usando nmap vamos a verificar que corre cada puerto:

Los 2 primeros parecen ser paginas web levantadas rápidamente con python y el ultimo pareciera ser un binario en escucha por el puerto 9000:

Si vemos la pagina web del puerto 5000:

Podremos ver que es el dashboard que ya vulneramos, en el puerto 5555 podemos ver un panel de autenticación nuevo.

Y por ultimo, en el puerto 9000 veremos bot con nombre Buffer posiblemente una pista de que estamos frente a un Buffer Overflow pero sin el binario, no podremos explotarlo:

Si recordamos el email que encontramos anteriormente nos indicaba que Christine es Site Admin, intentamos logearnos con credenciales tipo pass pero no nos deja, tampoco responde a Inyecciones SQL, no nos da ningún error que podamos ver.

Si recordamos el archivo .pwgen.py genera una cadena con una estética que podría ser credenciales por defecto.

Ya que anteriormente habíamos echo una lista de usuarios, tenemos el nombre completo de Christine, por lo tanto ingresamos esos datos al script.

Nos devuelve la siguiente cadena:
Con esto podemos decir que tenemos una parte de la contraseña de Christine, ahora para tener la parte que falta, podríamos intentar crear una wordlist e intentar crackear el hash que tenemos de la tabla que nos copiamos, vamos a generar la wordlist primero:
Usaremos el comando printf para generar al final de la cadena que ya tenemos números desde 000000 hasta 999999:

En el script se muestra que se usan 0 como relleno cuando son números bajos, así que debemos tener eso en cuenta.
Usando el comando head y tail podemos ver que se genero correctamente, por lo tanto ahora procederemos a copiar el hash e intentar crackearlo.

Escapamos los
$con\.
Ahora debemos identificar que tipo de hash es, en este caso usaremos hashid.

También podemos usar
hashcat.
Los resultados indican que se asemeja bastante a bcrypt, así que procedemos a usar [[John the Ripper]].

Y listo ya tenemos la contraseña correcta:
Con las credenciales completas ahora si podemos acceder al nuevo panel de Login, cuando entramos nos encontramos con un nuevo panel de administración:

La pagina completa seria:


Al final podemos ver campos donde podemos ingresar datos, pero no parecen hacer nada.

Por ultimo también tenemos un botón que nos descarga un archivo llamado logins.txt:

Como podemos ver, son los intentos de inicio de sesión al panel de administración, lo que podemos hacer en este punto, es interceptar esa petición para verificar si se acontece un LFI y así poder leer información sensible de otros usuarios.

En la petición se ve que se descarga directamente el archivo con el nombre logins.txt, podemos modificarlo y poner por ejemplo /etc/passwd:

Al darle a Forward, vemos que se descarga el archivo con el mismo nombre logins.txt.

Pero al ver su contenido podemos ver que efectivamente se acontece un LFI.

Echando un vistazo podemos ver que existen 3 usuarios: wilson, christine y tyler, lógicamente no tenemos acceso a los archivos de christine ni de tyler, pero podemos buscar si están corriendo algún proceso interesante:

En este caso uso el modulo de
pwncat-cs.
También podemos usar el comando:
Pero como podemos notar en la imagen, christine esta corriendo un proceso ejecutando un archivo llamado app.py, al conocer la ruta absoluta de dicho archivo, podemos descargarlo mediante el LFI.

Le cambiamos el nombre al archivo:

Leyendo el archivo encontramos credenciales para otra base de datos que nos podría ser interesante más adelante.

Al final del archivo encontramos una función que parece estar pidiendo algunos datos, entre ellos mydata, a su vez mydata pide un dato en base64, lo decodifica y lo deserializa con pickle.loads , esto es potencialmente vulnerable a un ataque de deserialización.

Los parámetros parecen ser de la parte final del ultimo panel de administración que vimos, donde pide el nombre de un producto, review y rating, en la siguiente imagen podemos ver como se tramitan los datos por POST, menos mydata:

Para lograr enviar una cadena especial que sea deserializada y nos logre enviar una consola interactiva, podemos usar el siguiente script:
Lo ejecutamos y obtenemos el siguiente resultado:

Luego usamos el comando curl para enviar los datos al sitio web.
Mandamos los datos mediante POST.
Con
-bindicamos la cookie de session.Y con el parámetro
-Fmandamos la data en partes.
Luego inicio otro listener en pwncat por el puerto 1234.

Y apenas mandamos el curl, podremos ver lo siguiente:

También podemos ver a que usuario migramos con el comando sessions --list.

Como podemos apreciar en la imagen, somos el usuario christine, enumerando las posibles formas de seguir escalando privilegios podemos notar que, estamos en el grupo ftp usando el comando id.

Podemos buscar por archivos o directorios que sean parte del grupo ftp, usaremos el comando find:
Resultado

Encontramos en la raíz, una carpeta llamada ftp con un binario dentro, este nombre del binario es parecido o igual al servicio que corre por el puerto 9000, descargaremos dicho binario.

Ahora lo ejecutaremos.
En mi caso, lo are dentro de un contenedor docker, la imagen es un kali con todas las herramientas necesarias para hacer reversin.

Estando dentro del contenedor y después de darle permisos de ejecución podemos ejecutar el binario:
Resultado
Pues al parecer si es el servicio que corre por el puerto 9000, si nos conectamos con nc podremos ver:

Resultado
Podemos ver que es un binario compilado para Linux de 32 bit, vamos a analizarlo con gdb:

Ahora corramos el binario y mandemos muchas A para ver el comportamiento del binario, ejecutamos en binario poniendo r.

Luego enviamos muchas AAAA mediante nc:

Por ultimo podemos ver como el binario es propenso a Buffer Overflow, ya que nos permite sobrescribir áreas de memoria adyacentes:

Si quiere saber más sobre Buffer Overflow puede ver Introducción al Buffer Overflow.
Como siguiente paso lo que are es verificar las protecciones del binario:

Y nos encontramos con que no tiene ninguna protección, ahora lo primero que are es crear la estructura básica de un exploit para explotar un Buffer Overflow:
Lo que vamos a hacer es un shellcode injection, ya que las protecciones permite ejecución en la pila, lo que aremos es utilizar el comando pattern create que en GEF genera una cadena de caracteres única de 1024 bytes, esto nos ayudara a identificar con precisión la dirección en la que ocurre la sobreescritura de la dirección de retorno u otros registros críticos.
Resultado

Ahora lo que aremos es volver a correr el programa escribiendo de nuevo r en gdb y como datos mandamos el payload que nos dio pattern create, de primeras no nos funciona por que el payload es muy pequeño, así que simplemente creamos uno más grande:
Ahora si enviamos el payload:

Podemos ver como el binario se rompe, ahora bien lo que debemos ver en este paso es el $eip:
Lo que queremos saber es cuantos caracteres necesitamos antes de sobrescribir el $eip, esto lo podemos contar manualmente o usar el comando pattern de nuevo:
Resultado

Nos dice que en total son 1337 caracteres, que son necesarios introducir en el binario para luego sobrescribir el $eip, ahora sabiendo esto podemos verificarlo de la siguiente manera:
Para enviar directamente el payload

Resultado

Y efectivamente ahora el $eip vale:
Por lo tanto, ahora estamos seguro de que podemos sobrescribir el $eip y que son necesarios 1337 caracteres para llegar a ese punto, ademas la pila o $esp vale:
Por lo tanto ya podemos ir poniendo los valores en el exploit:
Ahora el jmp ESP es una instrucción en ensamblador x86 que significa: Saltar a la dirección almacenada en el registro ESP.
En términos simples: Ejecuta el código que está en la pila (
stack) en ese momento.
Pasos a seguir
Luego:
Primero -> nasm_shell.rb
Herramienta de Metasploit para convertir instrucciones de ensamblador en opcodes.
Escribimos
jmp ESPy nos devuelveFFE4, que es el código en hexadecimal de la instrucción en x86.Esto nos ayuda a identificar
jmp ESPen un binario vulnerable.
Resultado
Segundo -> objdump
objdump -D: Desensambla un binario para ver su código máquina.grep "ff e4": Busca la instrucciónjmp ESPen el binariobufferbot.Nos muestra una dirección (
0x8049559), dondejmp ESPestá presente en la memoria.
Algo que debemos tener en cuenta es que en sistemas de 32 bits, las direcciones de memoria se almacenan en orden "little-endian", lo que significa que los bytes menos significativos van primero.
Dirección original:
0x08049559Orden little-endian:
"\x59\x95\x04\x08"
🔥 ¿Para qué se usa?
Se sobrescribe EIP (Extended Instruction Pointer) con la dirección de
jmp ESPpara redirigir la ejecución a nuestra shellcode.
NOP Sled (nops): Se colocan 32 bytes de \x90 antes del shellcode para evitar problemas de precisión al ejecutar la carga útil.
Ahora vamos a crear nuestro shellcode con msfvenom, un shellcode es un código en ensamblador diseñado para ejecutarse en un sistema víctima. Su nombre viene de "shell" porque típicamente abre una shell inversa o bind shell.
Resultado

Lo que usaremos es:
En este caso, el shellcode que generé crea una reverse shell, es decir, se conecta de vuelta a mi máquina atacante en el puerto 1234.
Opciones explicadas:
-p linux/x86/shell_reverse_tcp: Usa un payload para Linux de arquitectura x86 que hace una shell reversa.LHOST=172.17.0.3: La IP de mi máquina atacante.LPORT=1234: El puerto en el que recibiré la conexión.-b "\x00": Evita el byte nulo (\x00), porque corta cadenas enCy puede romper el exploit.-f py -v shellcode: Genera el payload en formato Python con la variable llamadashellcode.
Otras cadenas que pueden romper el exploit, también conocido como badchars son:> ->
\x00\x0A\x0D\xFF
El resultado fue un shellcode de 95 bytes, codificado con x86/shikata_ga_nai (un encoder polimórfico que lo hace más difícil de detectar).
Nuestro exploit quedaría de la siguiente manera:
Ahora ejecutemos el binario, luego pongámonos en escucha por el puerto 1234 y por ultimo ejecutemos el exploit:

Y vemos que todo funciona correctamente:
A la izquierda vemos como se inyecta el shellcode.
En la parte superior derecha se ejecuta el exploit.
Y debajo se recibe la Reverse Shells.
Ahora hagamos lo mismo con el binario del servidor:
Recordar cambiar el shellcode con la IP y puerto correspondiente.
Nos ponemos en escucha en mi caso por el puerto 8888:

Procedemos a ejecutar el exploit:

Nos conectamos a la 127.0.0.1 porque hay es donde hemos redirigido el servicio interno del servidor que vulneramos.
Y podremos ver como recibimos la Reverse Shells, ademas ejecutando sessions --list, podemos ver como ahora nos pasamos al usuario tyler.

Apenas entramos a la Bash de la Reverse Shells, encontramos un archivo llamado shell con permisos SUID perteneciente a root.

Si lo ejecutamos, nos devuelve una shell que pareciera ser de root, pero algunos comandos no nos deja ejecutarlos:

Si ingresamos muchas AAA, nos devuelve:
Por lo cual podemos intuir que estamos de nuevo frente a un Buffer Overflow, lo descargaremos y pasaremos al contenedor Kali.


Como podemos apreciar en la imagen, el binario es de 64 bits, ademas de que NX esta habilitado lo cual nos impide la ejecución del un shellcode, ahora abramos el binario con gdb:

Ahora como NX esta habilitado, otro vector de entrada que se nos puede ocurrir es ROP, para ver los posibles gadgets primero enumeramos las funciones del programa:

Podemos notar 2 funciones interesantes: _x1 y _x2, aunque lo primero que aremos es ir creando el exploit, debemos tener en cuenta que esta vez ejecutaremos el exploit en el mismo servidor, dado que si usamos librerías como pwntools nos dará error por no estar disponible esta librería en el servidor, revisando un poco encontramos otra librería que nos puede ser útil llamada pexpect.

La librería
pwntoolsno de importa a diferencia depexpect, ademas de quepipno esta instalado.
Ahora bien, volvamos a gdb para ver la función _x1:
Resultado

Esta función solo hace un pop r13 que servirá para meter un valor en el registro r13, hacemos lo mismo con _x2:

La función _x2 es más útil ya que está moviendo el tope de la pila (rsp), al registro rdi, y después esta saltando a r13, recordando la convención de llamadas linux x64, van los argumentos del 1 al 6: rdi,rsi,rdx,rcx,r8,r9 después esta haciendo un salto a r13, en la función _x1, tenía una dirección que estaba haciendo un pop r13, lo que nos permite ingresar un valor a r13, por lo tanto en r13 podríamos cargar la dirección de system@plt y en rsp un "/bin/sh\x00" para que se convierta en el primer argumento rdi y así se convierta en un system(/bin/sh) y me de una consola interactiva.
Primero vamos a buscar el desfase total hasta rsp que es donde vamos a cargar la cadena "/bin/sh\x00", así que vamos a crear una cadena especial con gdb.
Resultado
Enviemos la cadena:

Vemos que los registros se están sobrescribiendo así que buscamos el desfase hasta rsp.

Nos dice que son 136 bytes, para asegurarnos de que este en el tope de rsp vamos a sustraer la cantidad de bytes de la cadena /bin/sh\x00 del desfase de rsp, en nuestro caso seria 136 - 8 = 128 de desfase, después enviamos la cadena /bin/sh\x00, luego de sigue ingresar la dirección de system a r13, por lo cual usamos la dirección de pop r13 para poder ingresar un valor en r13, para saber la dirección de system debemos ejecutar el siguiente comando:
Resultado

La dirección de system@plt seria -> 0x401040, finalmente cargamos la dirección de la función _x2 para que ejecute los valores cargados en los registros, de tal forma que el exploit nos quedaría de la siguiente manera:
Subimos el exploit al servidor mediante el modulo upload y ejecutamos:

Y lo hemos logrado, ahora si somos root, si queremos una Bash simplemente lo escribimos.

Y eso seria todo.
Last updated