Skip to content

WriteUp Yincana - Vulnyx

Com sempre, demano disculpes pels errors ortogràfics i per no conèixer els noms de les tècniques; sóc un desenvolupador que es submergeix en el món del hacking. Crec que aquesta vegada és una màquina difícil, encara que algú pot trobar maneres més fàcils de comprometre-la.

Per a la creació, he utilitzat algunes de les tecnologies amb les quals he treballat durant la meva vida professional: PHP, XSLT i NodeJs. És un CTF difícil, i es necessita paciència.

Disfruta de la màquina Yincana i no oblidis regalar flors. 😉

Habilitats: XXE, XSLT, IDOR?, Crackeig de contrasenyes (SHA2, RSA).

Taula de continguts

Obrir taula de continguts

Enumeració

$ nmap -sV -sC -A -p 80,22 192.168.1.120 -oN nmap2.txt -vvv

Imatge Imatge Imatge

$ gobuster dir --url http://192.168.1.120/ --wordlist **/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt** -x .php,.htm,.html,.txt,.db,.bak,.pdf -t 20

Imatge

A la pàgina chat.html, trobem aquesta informació. La data es actualitza cada minut, i trobem un nom de domini.

Imatge

# echo "192.168.1.120 yincana.nyx" >> /etc/hosts

Imatge

Continuem buscant arxius aquesta vegada en l’host virtual yincana.nyx.

Imatge

$ gobuster dir --url http://yincana.nyx/ --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.htm,.html,.txt,.db,.bak,.pdf -t 20

Imatge

Sembla que l’arxiu image.php?id=1 és per mostrar o descarregar imatges de les pàgines:

Imatge

Si busquem subdominis, no en trobarem cap.

Intrusió

Introduïm la nostra IP a la URL i comencem a escoltar amb netcat; sembla que rebem una senyal.

Imatge

Creem una pàgina d’exemple que mostri alguna cosa, l’enviem i busquem la imatge a images.php?id=X, la trobem.

Imatge

Si observem més de prop, sembla ser un “navegador sense cap” (puppeteer o un sistema similar).

Imatge

Fem servir una petita llista de ports comuns per HTTP.

https://github.com/danielmiessler/SecLists/blob/master/Discovery/Infrastructure/common-http-ports.txt

i creem un script en JavaScript per analitzar ports locals utilitzant el navegador sense cap.

Imatge

i descobrim el port 80 (al qual ja teníem accés des de fora) i el port 7001 (probablement només accessible des de localhost, ja que no el vam trobar amb nmap des de fora).

Imatge

Creem un altre script amb un iframe per veure la imatge del que hi ha al port local 7001.

Imatge

i obtenim un missatge: “Need url parameter”, sembla ser el servei intern que gestiona la generació d’aquestes imatges, afegim el paràmetre URL amb “file:///etc/passwd” i continuem provant, també demana “Need id parameter”, així que passem ambdós:

Imatge

Ara a yincana.nyx/image.php?id=41 obtenim

Imatge

i a yincana.nyx/image.php?id=200 obtenim

Imatge

Ja tenim un LFI.

Buscant i escanejant diversos arxius locals per obtenir informació i intentar RCE (logs, variables d’entorn, arxius de configuració, …) trobo l’id_rsa de l’usuari jazmin, però el trobo en una imatge i he de convertir-lo a text per utilitzar-lo.

ImatgeImatge

Instal·lo tesseract OCR.

$ sudo apt install tesseract-ocr

Modifico la imatge amb GIMP per donar-li més resolució, contrast i només prendre la part del text. A més de tesseract-ocr, també provem Google Lens App (una bona opció), Gemini, ChatGPT (problemes de la IA amb filtres de seguretat, prompts llargs), i altres OCRs en línia, no puc obtenir una clau completament correcta de la imatge.

Analitzo el text a la cerca de caràcters inacceptables i el comparo visualment amb la imatge per corregir alguns errors.

Al final, després d’un esforç, obtinc una clau id_rsa correcta però xifrada per a jazmin.

Imatge

La crackejem amb john i rockyou.txt molt ràpidament ;)

Imatge Imatge

Iniciem sessió amb l’usuari jazmin i l’id_rsa al servidor a través de ssh amb la frase de pas “flores”:

Imatge

Podem canviar a un altre usuari amb un nom de flor i a un altre usuari amb un nom de flor en un bucle recursiu utilitzant sudo -u usuari /bin/bash.

Hi ha uns 50 usuaris amb noms de flors i podem canviar d’un a un altre utilitzant sudo per a bash. És com un peix que es mossega la cua i cada usuari pot executar bash com el següent.

Imatge

Estan els usuaris normals (root, mail, www-data, …), 50 usuaris amb noms de flors i un usuari anomenat “manel”.

¡Tenim accés a tots els usuaris amb noms de flors!

A la carpeta d’inici de jazmin, sembla que hi ha l’aplicació que exposa el servei del port 7001 i s’utilitza per crear les imatges de la pàgina de flors.

Imatge

D’altra banda, també trobem els dos llocs web, el predeterminat d’Apache amb els arxius chat.html i index.html, i el lloc web de flors.

A l’arxiu index.php del lloc web de flors, veiem que les credencials de la base de dades es prenen de les variables d’entorn.

Imatge

Intentem llegir les variables d’entorn del servidor Apache, però no podem, o intentem iniciar sessió com a www-data inserint una reverse shell, però no tenim permisos a les carpetes públiques del lloc web, ni hem trobat un LFI real on puguem incloure un arxiu per interpretar en PHP. Al final, trobem les credencials de la base de dades configurades en l’host virtual yincana.nyx.conf.

Imatge

Entrem a la base de dades per examinar el contingut i trobem una taula d’usuaris amb les seves contrasenyes (aparentment hasheejades).

Imatge

Obtenim totes les dades possibles, comentaris de la base de dades, taula d’usuaris i camps. Trobem un comentari al camp de contrasenyes de la taula d’usuaris que indica el tipus de hash (SHA256).

Imatge

Intentem crackejar les contrasenyes, però només aconseguim crackejar la contrasenya de l’usuari “margarita”.

Imatge

Intentem accedir via SSH amb l’usuari margarita i la contrasen

ya flors, però no tenim accés. No obstant això, teníem accés a tots els usuaris amb noms de flors, així que accedim a l’usuari “margarita” des de l’usuari “jazmin”.

Imatge

Ara podem executar el binari xsltproc com a manel amb la contrasenya de margarita.

Verifiquem què és aquest binari i per a què serveix; és un processador XSLT, el fem servir per intentar XXE. No està en gtfobins, però encara es pot abusar del seu privilegi sudo.

Informació del binari.

Imatge

Podem llegir arxius amb privilegis d’usuari manel (XXE), intentem llegir la clau RSA, però no en té cap. Intentem llegir la bandera user.txt.

Imatge

Processarem l’XSL de l’arxiu XML amb el binari xsltproc utilitzant sudo i l’usuari manel:

Hem obtingut la primera bandera user.txt.

Imatge

Creem una clau id_rsa per intentar incloure la clau pública als authorized_keys de manel i utilitzar-la per connectar-nos via SSH.

Imatge

Podem executar el binari xsltproc amb sudo, la contrasenya de margarita com a manel i el paràmetre “output”. Això ens permet crear arxius amb contingut processat per l’xslt amb privilegis de manel.

Creem un arxiu XML sense dades i un altre amb l’XSLT per processar-lo i obtenir id_rsa.pub com a resultat.

Imatge

Executem la següent ordre per intentar incloure la clau pública RSA a l’usuari manel.

margarita@yincana:/tmp$ sudo -u manel /usr/bin/xsltproc -o /home/manel/.ssh/authorized_keys crea_rsa.xml dades.xml

Imatge

Intentem accedir a manel via SSH amb la clau RSA generada des del nostre kali.

Imatge

També podríem realitzar escriptura d’arxius privilegiada utilitzant EXSLT, més informació a: https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection#write-files-with-exslt-extension

¡Genial! Accedim a l’usuari manel, el primer usuari sense nom de flor.

Per curiositat, l’arxiu authorized_keys es veu així, ho arreglem.

Imatge

Obtenir la bandera root.txt

Repassem: Tenim accés a tots els usuaris amb noms de flors i a l’usuari manel. Intentem escalar privilegis a l’usuari root o obtenir la bandera root.

Fem servir pspy64 per monitoritzar els processos que podria estar executant root.

Imatge

Trobar un procés de root per a l’arxiu xsltproc que hem utilitzat anteriorment i sembla que crea els missatges per al /chat.html inicial.

Imatge

Podem modificar l’arxiu /home/mensaje.xml implicat en aquest procés perquè l’usuari manel pertany al grup backupchat.

Imatge

L’arxiu conté les dades (en format XML) dels missatges de xat que es mostren a la pàgina inicial, modifiquem l’arxiu /home/mensajes.xml per intentar obtenir la bandera root.txt a través de XXE.

Imatge

Esperem 1 o 2 minuts i la bandera root.txt apareixerà a l’adreça inicial:

http://192.168.1.120/chat.html

Imatge

Escalada

No hem aconseguit l’escalada de privilegis.

Intentem l’escriptura d’arxius amb EXSLT, però per aconseguir-ho necessitem modificar l’arxiu d’estil XSL i només podem modificar l’arxiu de dades XML, o no sabem o no podem fer-ho.

Analitzem el procés utilitzat per a la lectura d’arxius privilegiada per obtenir més informació. Obtenim /etc/shadow però no podem crackejar la contrasenya de root. Intentem llegir dades dels directoris /proc/, /root, etc.

Després d’un temps, molts dels arxius no es poden veure perquè contenen caràcters no permesos en XML o bytes nuls, alguns sí podem veure i al mirar els arxius trobem la tasca CRON programada:

Imatge

Trobar dues tasques configurades, la que estem explotant amb XSLT i una altra que executa un “chatbackup” el 1 de gener de cada any. Busquem aquest arxiu i el trobem al nostre directori, podem modificar-lo però hauríem d’esperar fins al 1 de gener per executar-lo. Però això ens dóna una pista.

Imatge

La tasca pot executar aquest arxiu perquè està inclòs al PATH (primer quadre vermell a la imatge del crontab) del directori /home/manel/.local/bin.

Imatge

L’ordre que s’executa cada minut utilitza “date” sense una ruta absoluta.

Imatge Imatge

Busquem on es troba el binari date, i està a /usr/bin/date, atès que la ruta /home/manel/.local/bin té permisos d’escriptura i ve abans de /usr/bin, podem intentar reemplaçar “date” amb el nostre “date” maliciós.

Imatge Imatge

Esperem un minut per veure si apareix un bash amb SUID a /tmp.

Imatge

¡Felicitats, som root!