Inicio Overthewire - Bandit (16-20)
Entrada
Cancelar

Overthewire - Bandit (16-20)

Cuarto artículo de la serie, donde se agrupan los niveles desde el número 16 hasta el 20.

Entre estos ejercicios destacan dos métodos que suelen usarse para escalar privilegios localmente en máquinas Linux, como son la explotación de ejecutables con permisos SUID y la ejecución de una shell reversa (es la víctima la que lanza la conexión a la máquina atacante), por lo que conviene aprender bien estos conceptos de cara a explotar máquinas reales del sistema del pingüino.


Nivel 16.

Las credenciales para el nivel 17 se pueden recuperar enviando la contraseña del nivel actual (16) a un puerto en localhost en el rango entre el puerto 31000 y el puerto 32000. Primero se debe averiguar cual de estos puertos tiene un servidor escuchando en ellos. Después averiguar cual de ellos sirven el protocolo SSL y entonces enviar la contraseña para recibir la del siguiente nivel.

Se comienza lanzando un comando nmap para saber que puertos están abiertos dentro del rango que indica el enunciado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bandit16@bandit:~$ nmap -p 31000-32000 localhost

Starting Nmap 7.40 ( https://nmap.org ) at 2021-10-15 17:07 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00022s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
31046/tcp open  unknown
31518/tcp open  unknown
31691/tcp open  unknown
31790/tcp open  unknown
31960/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

Entonces, probando los puertos que arroja el comando nmap como abiertos, se puede ver que el 31790 expone una clave pública que al pegar la contraseña del nivel presente, arroja una clave privada que se puede usar como en el nivel 13.

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
bandit16@bandit:~$ openssl s_client -connect localhost:31790
CONNECTED(00000003)
depth=0 CN = localhost
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
---
Certificate chain
 0 s:/CN=localhost
   i:/CN=localhost
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICBjCCAW+gAwIBAgIESHcOOjANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDDAls
b2NhbGhvc3QwHhcNMjEwOTMwMDQ0NjAyWhcNMjIwOTMwMDQ0NjAyWjAUMRIwEAYD
VQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPQcF7d1
ID9LNKC+iUC3Yc6kW3j8S5ZLNi8ZiYa+gtUH5ruwqyC/QMME3/JiY/nzYXZO2X0o
1ANrcaGCDgFNFbNYBxNSdRLNhfQeXX7OfJh7+MTJ/PHBR2kXeSJJES2DjdlxjK4i
ZmnfJSIK9pziiygDwYKSIkkZfkza9YJttGZ1AgMBAAGjZTBjMBQGA1UdEQQNMAuC
CWxvY2FsaG9zdDBLBglghkgBhvhCAQ0EPhY8QXV0b21hdGljYWxseSBnZW5lcmF0
ZWQgYnkgTmNhdC4gU2VlIGh0dHBzOi8vbm1hcC5vcmcvbmNhdC8uMA0GCSqGSIb3
DQEBBQUAA4GBAIxX2OYx2fzO1PsKOjDcTgCEerfX512NxALJjf8EQuro+mUjxCfy
yNzIzYDRx+sGTeolfqwNZXgWIURjJYHGxhvGRPAnf6HisDrAluLwC0qZE+A6Ez5q
Zx9QvjOFHk8uXkmhW5sIeoPV1a0/vf5RpJFptLZz/Gm+Og5cG23sjPL/
-----END CERTIFICATE-----
subject=/CN=localhost
issuer=/CN=localhost
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1019 bytes and written 269 bytes
Verification error: self signed certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 69BF1C11E5E4ED20F89E9A5B37C19FF431D0AA787E176A9B9792454BB29CF1B3
    Session-ID-ctx:
    Master-Key: 505C647D0F85235F0D531C9F21AC0AFD8029C973AE8D76B2706AE7496DD9A556AE08FDD09516AD0BA5DE17ECA93E6545
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 27 6a 7e ce 82 82 53 7f-56 22 fc 0b 04 d0 99 b7   'j~...S.V"......
    0010 - 2c fa fa 7d 7b 00 1c 98-e0 96 80 14 f0 63 6f e3   ,..}{........co.
    0020 - cb ea a2 63 20 26 fb b3-5b 72 0f 14 c5 62 59 4f   ...c &..[r...bYO
    0030 - ac 68 34 d2 1f f9 3d 6a-97 55 55 ea 19 4e 0a fb   .h4...=j.UU..N..
    0040 - c3 69 f8 8e 7c d8 43 f3-89 0a fd 9e 86 92 08 12   .i..|.C.........
    0050 - 6e 65 c1 89 77 31 43 1c-06 0e 7d 8a 1c 4c 98 16   ne..w1C...}..L..
    0060 - 14 1d 6a f6 ae 5c 93 c9-87 09 dd 76 24 f6 e9 de   ..j..\.....v$...
    0070 - dc d8 30 84 69 5a 96 02-2d d3 9f af 17 ec b6 0b   ..0.iZ..-.......
    0080 - 71 99 f4 a2 b2 d3 34 2c-2c 36 4e 7a fd 3d 58 50   q.....4,,6Nz.=XP
    0090 - 35 a9 da 55 1f ea a1 a3-be 60 99 fc 88 71 32 71   5..U.....`...q2q

    Start Time: 1634310673
    Timeout   : 7200 (sec)
    Verify return code: 18 (self signed certificate)
    Extended master secret: yes
---
cluFn7wTiGryunymYOu4RcffSxQluehd
Correct!

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----

closed

Se ha intentado hacer mediante un bucle for, pero no arrojaba los resultados correctamente.

Nivel 17.

Para obtener la contraseña del usuario siguiente, existen dos archivos en el directorio de inicio del usuario bandit17: passwords.old y passwords.new. La contraseña se encuentra en el fichero passwords.new en la única línea diferente entre él y passwords.old.

NOTA: si has resuelto este nivel y ves “¡Adiós!” al intentar entrar en bandit18, esto está relacionado con el siguiente nivel, bandit19

Se ejecuta un comando diff entre los 2 ficheros, y se obtienen 2, quedándose con la del fichero nuevo (kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd).

1
2
3
4
5
bandit17@bandit:~$ diff passwords.old passwords.new
42c42
< w0Yfolrc5bwjS4qw5mq1nnQi6mF03bii
---
> kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd

Al entrar en el siguiente nivel, se cierra la conexión automáticamente como dice la nota.

Nivel 18.

La contraseña para el siguiente nivel se almacena en un archivo readme en el directorio de inicio. Desgraciadamente, alguien ha modificado el fichero .bashrc para que se cierre la sesión cuando se inicie mediante SSH.

Con el comando ssh se pueden lanzar comandos incluyéndolos al final de dicho comando, como si fuera un parámetro más.

Por ello se lanza primero un comando ls para ver el nombre completo del fichero.

1
2
3
4
5
6
ssh bandit18@bandit.labs.overthewire.org -p 2220 ls .
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames

bandit18@bandit.labs.overthewire.org's password:

readme

Entonces, viendo que el fichero se llama readme, se lanza un comando cat mediante SSH para obtener la contraseña de bandit19.

1
2
3
4
5
ssh bandit18@bandit.labs.overthewire.org -p 2220 cat readme
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames

bandit18@bandit.labs.overthewire.org's password:
IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x

Nivel 19.

Para acceder al siguiente nivel, se debe utilizar el binario con permisos setuid en el directorio de origen. Se debe ejecutar previamente sin argumentos para saber cómo utilizarlo y posteriormente, ver como se puede explotar. La contraseña para este nivel se puede encontrar en el lugar habitual (/etc/bandit_pass), después de haber utilizado el binario setuid.

Los permisos SUID hacen que se ejecuten binarios con los permisos del propietario o grupo del fichero, dependiendo de donde tenga el permiso.

Por ello, como el binario que hay en el directorio inicial del usuario tiene como propietario al usuario bandit20, se ejecutará como si dicho usuario lo ejecutara.

1
2
3
bandit19@bandit:~$ ls -rlrt
total 8
-rwsr-x--- 1 bandit20 bandit19 7296 May  7  2020 bandit20-do

Se ejecuta como dice el enunciado, sin parámetros, para ver si muestra alguna ayuda o información del comando.

1
2
3
bandit19@bandit:~$ ./bandit20-do
Run a command as another user.
  Example: ./bandit20-do id

Como se puede ejecutar comandos como si el propio usuario bandit20 los ejecutara, se ejecuta con el comando cat para mostrar el fichero de contraseña del bandit20 alojado en la ruta /etc/bandit_pass.

1
2
bandit19@bandit:~$ ./bandit20-do cat /etc/bandit_pass/bandit20
GbKksEFF4yrVs6il55v6gwY5aVje5f0j

Nivel 20.

El enunciado dice que existe un binario con permisso setuid en el directorio de inicio del usuario que hace lo siguiente: Realiza una conexión a localhost en el puerto que se especifica como argumento en la línea de comandos. Luego lee una línea de texto de la conexión establecida y la compara con la contraseña del nivel anterior (bandit20). Si la contraseña es correcta, transmitirá la contraseña para el siguiente nivel (bandit21).

Lo primero es levantar un puerto con el comando netcat para que se quede a la escucha, en este caso el puerto 4444.

1
2
bandit20@bandit:~$ nc -nlvp 4444
listening on [any] 4444 ...

Entonces, con otro terminal, se conecta con el usuario bandit20 de nuevo y se ejecuta el binario al puerto puesto en escucha con nc anteriormente.

1
bandit20@bandit:~$ ./suconnect 4444

Si todo funciona correctamente, se establecerá una conexión, indicándolo el terminal que se quedó a la escucha con netcat.

1
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 38238

Se lanza la contraseña anterior a través del terminal donde se ejecutó el binario, mostrando un mensaje indicando que coincide la contraseña introducida con la que espera la ejecución del programa.

1
2
Read: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Password matches, sending next password

Si se verifica la consola que tiene el comando netcat a la escucha, se podrá ver la contraseña del nivel 21.

1
2
3
4
5
bandit20@bandit:~$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 38238
GbKksEFF4yrVs6il55v6gwY5aVje5f0j
gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
Esta entrada está licenciada bajo CC BY 4.0 por el autor.