
Introduction
Mango HackTheBoxta 30 puanlık “Orta” kategorisinde bir makine. Makine üzerinde mongodb injection atağına karşı zafiyetli bir uygulama çalışıyor. Bir saldırgan login sayfasını atlatmak yerine veritabanından veri sızdırması gerekiyor. Veritabanından şifreler sızdırıldıktan sonra, saldırgan makine üzerinde ilk erişimi sağlayabiliyor. Makinede jjs adında bir program yüklü. Bu programın suid biti etkin ve yetkilerin yükseltilmesine sebep oluyor.
İlk inceleme
Her zamanki gibi nmap ile başlıyoruz
1 | λ ~/Desktop/htb/machines/mango nmap -sVSC -vv 10.10.10.162 -oA nmap/initial |
Nmap bize web portlarından ve sshtan başka dişe dokunur bir şey vermedi
Port 80

Port 443

Biraz daha inceledikten sonra bu portlar üzerinde her hangi dişe dokunur bir şey bulamadım ve başka şeylere bakmaya başladım
Ssl sertifikasına bir göz attım ve o da bana başka bir subdomain verdi

Bu subdomaini /etc/hosts
dosyama ekledim10.10.10.162 mango.htb staging-order.mango.htb
İçerik keşfi
Bu subdomain üzerinde de giriş sayfasından da başka pek bir şey bulamadım

Zafiyetin tespiti
Mango ismi mongodbye bir ipucuydu. Bir kaç basit analizden sonra bu uygulamanın mongodb injectiona karşı zafiyetli olduğunu gördüm
Aşağıdaki link mongodb injectionı çok güzel bir şekilde anlatıyor inceleyebilirsiniz.
https://nullsweep.com/a-nosql-injection-primer-with-mongo/

Basit bir bypass methodu çalıştı

Ama ne yazıki bypass ettiğimiz panel henüz yapım aşamasındaydı

Bu aşamada mongodb injectionu kullanarak veritabanın veri çıkarmam gerektiğini anlamıştım
Zafiyetin sömürülmesi
Basit olarak 2 aşamamız olacak. 1. aşamada şifrenin uzunluğunu tespit etmemiz gerekiyorki yanlış verileri eleyebilelim veya herhangi bir veri kaçırmayalım. 2. aşamada ise veriyi çıkaracağız.
- Tabiki ilk aşamada kullanıcıları da sızdırmamız gerekiyor fakat her şey bayağı bir ortada ve tahmin edilebilir olduğundan dolayı bunu yapmayacağım. Kullanıcılar
mango ve admin
Şifre uzunluğunun bulunması
Eğer sunucu bize 200 döndürmeye başlarsa şifre uzunluğunu aştığımızı anlamalıyız. Şifre uzunluğunu aşmadığımız her anda sunucu bize 302 döndürecektir.
Aşağıdaki gibi bir model izleyebilirsiniz
1 | username=admin&password[$regex]=.{1}&login=login |


Gördüğünüz gibi şifre uzunluğu < 13 olan desenler için hep 302 aldık ve bu deseni aştığımızda 200 almaya başladık. Bu aşamada şifrenin 12 karakter uzunluğunda olduğunu söyleyebiliriz.
Veriyi sızdırmak
Şifreyi çok basit bir şekilde aşağıdaki desen ile fuzz edebiliriz (Türkçesini bulamadım bilen varsa söylesin :D)
Aşağıda gördüğünüz gibi t ile başlayan bir desen denediğimizde bize 302 verdi(bypass etti) diğer desenlerde ise 200 verdi(bypass etmedi). Bu yüzden şifrenin t ile başladığını söyleyip başına t koyarak diğer harfleri denemeye geçebiliriz




Örnek desen:
1 | username=admin&password[$regex]=^FUZZ.*&login=login |
Script
1 | import requests |

admin
: t9KcS3>!0B#2
mango
: h3mXK8RhU~f{]f5H
İlk erişim
Yukardaki şifreleri kullandım
ssh mango@mango.htb
su admin

Ve user.txtyi alabildik
Zafiyetli kod
Erişimi sağladıktan sonra sömürdüğümüz zafiyetli kodu bir incelemek istedim

Gördüğünüz gibi hiç bir girdi sanitizasyonu yok ve istediğimiz deseni array içine enjekte edip kontrol ettirebiliyorduk
Roota yükseliş
uid=4000000000(admin) gid=1001(admin) groups=1001(admin)
CVE-2018–19788 bizim durumumuza gerçekten çok güzel bir şekilde uyuyordu ve bayağı bir süre roota giden yolun bu olduğunu düşündüm (çünkü makine yayınlandığında bu açığın türevleri ortalıkta çok fazla dolaşıyordu) ama malesef ucu olmayan bir yoldu :(
Ama neyseki, linpeas scripti bayağı basit bir şekilde roota giden yolu gösterdi
/usr/lib/jvm/java-11-openjdk-amd64/bin/jjs
programı üzerinde suid biti etkinleştirilmişti
Program üzerinde yapılan küçük bir araştırma bu programı sömürerek yetkilerimizi yükseltebileceğimizi gösteriyordu.
https://gtfobins.github.io/gtfobins/jjs/

Jjs
Gtfobins sitesindeki suid bit bölümündeki payload ile interaktif bir kabuk almak çok düzgün çalışmıyordu, bir komut sonrasında hemen ölüyordu. Bu yüzden başka yöntemler aramaya devam ettim
Bu programı yetkili dosya yazmak için de kullanabiliyorduk ve root kullanıcısının altındaki authorized_keys dosyasına kendi ssh public anahtarımı yazmaya bir şans vermek istedim, ve çalıştı
1 | echo 'var FileWriter = Java.type("java.io.FileWriter"); |


Ve, root olduk !
mr3boot‘a bu güzel makine için teşekkürler !