BF Forked & Threaded Stack Canaries
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Eğer bir canary ve PIE (Position Independent Executable) ile korunmuş bir ikili dosya ile karşılaşıyorsanız, muhtemelen bunları aşmanın bir yolunu bulmanız gerekecek.
checksec
'in bir ikili dosyanın canary ile korunduğunu bulamayabileceğini unutmayın, eğer bu statik olarak derlenmişse ve fonksiyonu tanımlama yeteneğine sahip değilse.
Ancak, bir fonksiyon çağrısının başında bir değerin yığıtta saklandığını ve bu değerin çıkmadan önce kontrol edildiğini bulursanız, bunu manuel olarak fark edebilirsiniz.
Basit bir canary'yi aşmanın en iyi yolu, ikili dosyanın her yeni bağlantı kurduğunuzda çocuk süreçleri fork eden bir program olmasıdır (ağ servisi), çünkü her bağlandığınızda aynı canary kullanılacaktır.
Bu durumda, canary'yi aşmanın en iyi yolu sadece karakter karakter brute-force yapmak ve tahmin edilen canary baytının doğru olup olmadığını, programın çöküp çökmediğini veya normal akışına devam edip etmediğini kontrol ederek anlamaktır. Bu örnekte fonksiyon 8 Baytlık bir canary'yi (x64) brute-force yapar ve doğru tahmin edilen bir bayt ile kötü bir bayt arasında sadece kontrol ederek ayırt eder; eğer sunucu tarafından bir yanıt geri gönderiliyorsa (başka bir durumda try/except kullanmak da bir yol olabilir):
Bu örnek 64 bit için uygulanmıştır ancak 32 bit için de kolayca uygulanabilir.
Bu 32 bit için uygulanmıştır, ancak bu kolayca 64 bite değiştirilebilir. Ayrıca bu örnek için programın önce girişin boyutunu belirtmek için bir byte beklediğini ve yükü.
Aynı işlemin thread'leri de aynı canary token'ını paylaşacaktır, bu nedenle bir saldırı gerçekleştiğinde ikili dosya her seferinde yeni bir thread oluşturuyorsa bir canary'yi brute-force etmek mümkün olacaktır.
Ayrıca, canary ile korunan bir threaded function'da bir buffer overflow kullanılarak TLS'de saklanan master canary'yi değiştirmek mümkün olabilir. Bunun nedeni, bir thread'in stack'inde bir bof aracılığıyla TLS'nin saklandığı bellek konumuna (ve dolayısıyla canary'ye) ulaşmanın mümkün olabilmesidir. Sonuç olarak, bu önlem işe yaramaz çünkü kontrol, aynı (değiştirilmiş) iki canary ile kullanılır. Bu saldırı, yazıda gerçekleştirilmiştir: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Ayrıca, genellikle TLS'nin mmap
ile saklandığını ve bir thread'in stack'i oluşturulduğunda bunun da mmap
ile oluşturulduğunu belirten https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 sunumunu kontrol edin; bu, önceki yazıda gösterildiği gibi overflow'a izin verebilir.
64 bit, no PIE, nx, BF canary, bazı bellek alanlarına execve
çağırmak için bir ROP yazın ve oraya atlayın.