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
$ 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
A la pàgina chat.html, trobem aquesta informació. La data es actualitza cada minut, i trobem un nom de domini.
# echo "192.168.1.120 yincana.nyx" >> /etc/hosts
Continuem buscant arxius aquesta vegada en l’host virtual yincana.nyx.
$ 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
Sembla que l’arxiu image.php?id=1 és per mostrar o descarregar imatges de les pàgines:
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.
Creem una pàgina d’exemple que mostri alguna cosa, l’enviem i busquem la imatge a images.php?id=X, la trobem.
Si observem més de prop, sembla ser un “navegador sense cap” (puppeteer o un sistema similar).
Fem servir una petita llista de ports comuns per HTTP.
i creem un script en JavaScript per analitzar ports locals utilitzant el navegador sense cap.
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).
Creem un altre script amb un iframe per veure la imatge del que hi ha al port local 7001.
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:
Ara a yincana.nyx/image.php?id=41 obtenim
i a yincana.nyx/image.php?id=200 obtenim
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.
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.
La crackejem amb john i rockyou.txt molt ràpidament ;)
Iniciem sessió amb l’usuari jazmin i l’id_rsa al servidor a través de ssh amb la frase de pas “flores”:
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.
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.
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.
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.
Entrem a la base de dades per examinar el contingut i trobem una taula d’usuaris amb les seves contrasenyes (aparentment hasheejades).
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).
Intentem crackejar les contrasenyes, però només aconseguim crackejar la contrasenya de l’usuari “margarita”.
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”.
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.
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.
Processarem l’XSL de l’arxiu XML amb el binari xsltproc utilitzant sudo i l’usuari manel:
Hem obtingut la primera bandera user.txt.
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.
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.
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
Intentem accedir a manel via SSH amb la clau RSA generada des del nostre kali.
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.
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.
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.
Podem modificar l’arxiu /home/mensaje.xml implicat en aquest procés perquè l’usuari manel pertany al grup backupchat.
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.
Esperem 1 o 2 minuts i la bandera root.txt apareixerà a l’adreça inicial:
http://192.168.1.120/chat.html
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:
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.
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.
L’ordre que s’executa cada minut utilitza “date” sense una ruta absoluta.
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.
Esperem un minut per veure si apareix un bash amb SUID a /tmp.
¡Felicitats, som root!