Ataki malware'u na przeglądarki nieświadomych internautów stają się coraz powszechniejsze. Wciąż powstają nowe techniki pozwalające obejść filtry stosowane przez producentów oprogramowania zabezpieczającego. Z kolei filtry są coraz lepsze, powstają też nowe narzędzia - walka trwa. Na prezentacji dowiecie się, jak włamywacze usiłują utrudnić pracę analizatorom ich kodu i jak reverserzy sobie z tym radzą. Nacisk zostanie położony na słabości narzędzi automatycznych - będziemy usiłowali uniknąć wykrycia przez jsunpack i Capture-HPC, oszukamy też popularny unpacker Deana Edwardsa.
1 of 41
More Related Content
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
5. Zaciemnianie kodu
Nie jest możliwe "zaciemnienie absolutne"
[cs.princeton.edu]
Analiza jako debugging
Debugging is twice as hard as
writing a program in the first
place. So if you're as clever as
you can be when you write it,
how will you ever debug it?
Brian Kernighan, The Elements of Programming Style
OWASP 5
6. Metody zaciemniania
for while + if
Iteracja rekursja
Skomplikowane wyrażenia logiczne
Martwe gałęzie kodu (dummy code)
Quasitautologie [blog.didierstevens.com]
Enigmatyczne nazwy
OWASP 6
7. Metody zaciemniania cd.
JavaScript to język dynamiczny i funkcyjny
Kod tworzony dynamicznie – eval
String.fromCharCode, unescape
Wyrażenia regularne - String.replace
Packery, np.
[dean.edwards.name]
[developer.yahoo.com]
[malwareguru.org]
[closure-compiler.appspot.com]
Inne - np. WhiteSpace Obfuscation [ktcorpsecurity.com]
OWASP 7
8. Aktywna obrona przed analizą
Function.toString /
arguments.callee.toString [isc.sans.org]
autoszyfrowanie [isc.sans.org]
wykrywanie przeglądarki
DOM
window, navigator
timingi
cookies
pozycja myszki, rozdzielczość ekranu
Kod tylko raz dla IP [research.zscaler.com]
OWASP 8
9. Obrona przed analizą – specyfika języka
function is_even(n) {
var parameter_is_even =
(n % 2) == 0 ? true : false;
return
parameter_is_even;
}
alert(is_even(16));
OWASP 9
11. Jak analizować JavaScript?
Poznaj JavaScript!
Obserwuj efekty działania kodu w
kontrolowanym środowisku
Przeładuj funkcje
eval
String.fromCharCode
Stopniowo odciemniaj
Miej cierpliwość, bądź pomysłowy
OWASP 11
12. Analiza JavaScript ...
Bardziej heurystyka niż algorytm
Proces bardziej ręczny niż automatyczny
Człowiek jest niezbędny
Narzędzia pomagają, ale zawodzą!
OWASP 12
14. jsunpack
Uruchamia JS wewnątrz środowiska
SpiderMonkey [mozilla.org]
Na podstawie URL, PCAP, pliku JS/HTML…
SM jest wzbogacony o:
emulację DOM
emulację obiektów przeglądarki
uruchomienie zdarzeń onload()
monitoruje m.in. eval(), setTimeout()
skanuje używając sygnatur
OWASP 14
15. jsunpack - słabe punkty
Emuluje środowisko przeglądarki
Kod, który się nie wykona jest
sprawdzany wyłącznie sygnaturami
OWASP 15
16. Ominięcie zabezpieczeń
if (fake_browser) {
do_no_harm();
} else {
redirect_to_malicious_website();
// or obfuscate an exploit
}
Musimy wykryć, że kod działa w jsunpack
OWASP 16
17. Jak wykryć jsunpack?
Na wiele sposobów:
Zła implementacja window.location
window.location.host = ścieżka do pliku
fake_browser = window.location.host.match('/');
Dodaje swoje zmienne globalne
fake_browser = (typeof my_location != "undefined");
// my_navigator, my_activex, my_element,
// the_activex, app, ...
OWASP 17
18. Jak wykryć jsunpack cd.
Podmienia/dodaje niektóre funkcje
fake_browser = (window.open.toString().match(/print/));
fake_browser = (alert.toString().match(/{s*}/));
Niepełna emulacja obiektów
fake_browser = (typeof
PluginArray.prototype.refresh == "undefined");
fake_browser = (document.title == 'My Title');
OWASP 18
19. Jsunpack - bonus
jsunpack wykonuje nie tylko JavaScript
<script type="text/dummy">
// good enough for jsunpack
</script>
Kod wykona się w jsunpack, ale nie w
przeglądarkach
OWASP 19
21. jsunpack - podsumowanie
Można łatwo wykryć, że JavaScript działa
w sandboxie jsunpack
Można to wykorzystać to
niepodejmowania złośliwych działań
Jeśli złośliwy kod jest zaciemniony,
ominie sygnatury
Automatyczna analiza jsunpack nie
wykryje niczego
OWASP 21
22. Dean Edwards' Unpacker
A JavaScript Decompressor [dean.edwards.name]
Odwraca działanie packera tego samego autora
Zasada działania packera:
eval(function(p,a,c,k,e,r){/*kod*/}(para,
metry))
var packer = function(p,a,c,k,e,r) {};
var s = packer(para,metry);
eval(s);
OWASP 22
23. Dekompresja - krok 1
Zastąp eval() przypisaniem do zmiennej
znakowej
// spakowany kod w zmiennej input
var input="eval(function(p,a,c,k....";
eval("var value=String" +
input.slice(4)); // obcinamy "eval"
// w efekcie wykonany kod:
var value=String(function(p,a,c,k..);
W value jest zdekompresowany kod
OWASP 23
24. Dekompresja - krok 1
Zastąp eval() przypisaniem do zmiennej
znakowej
// spakowany kod w zmiennej input
var input="eval(function(p,a,c,k....";
eval("var value=String" +
input.slice(4)); // obcinamy "eval"
// w efekcie wykonany kod:
var value=String(function(p,a,c,k..);
W value jest zdekompresowany kod
Wykonanie sklejonego kodu! OWASP 24
25. Dekompresja - krok 2
Użyj Function.toString(), żeby wyświetlić
kod
eval(
"var unpacked = function() {"
+ value + "}"
);
alert(unpacked.toString());
Rozpakowany kod NIE WYKONUJE SIĘ
Disclaimer - rzeczywisty kod jest trochę inny, tutaj upraszczam
OWASP 25
26. Dean Edwards Unpacker - słabe punkty
Sklejanie zmiennych znakowych i wykonywanie
sklejonego kodu (injection, anyone?)
Użycie stałej - obcinamy na ślepo 4 pierwsze
znaki
eval() bez walidacji parametru
Polega na Function.toString()
OWASP 26
27. Dean Edwards Unpacker - rozbrajanie
eval() używa jednego parametru
String() używa jednego parametru
...ale możemy podać więcej :)
eval("code");
eval("code", "ignored");
eval("code", malicious());
String("code", malicious());
Arbitrary code execution bez zmieniania funkcji
p,a,c,k,e,r!
OWASP 27
28. Dean Edwards Unpacker - rozbrajanie cd.
eval(function(p,a,c,k,e,r){...}(para,metr
y),malicious());
var
value=String(function(p,a,c,k,e,r){...}(p
ara,metry),malicious());
malicious() wykona się w spakowanym
kodzie, jak i w dekompresorze
OWASP 28
29. Dean Edwards Unpacker - rozbrajanie cd.
Jak to wykorzystać?
Unpacker wykorzystuje
Function.toString()
Podmieńmy ją!
malicious() to np. zaciemniony:
Function.prototype.toString = function()
{
return 'harmless code';
}
OWASP 29
32. Honeypoty wysoko interaktywne
Na przykładzie Capture-HPC [projects.honeynet.org]
Kod wykonuje się w rzeczywistej przeglądarce na
maszynie wirtualnej
Serwer dostarcza listę adresów URL
Klient uruchamia przeglądarki i czeka…
Monitorowane są efekty działania kodu
System plików
Rejestr
Procesy
Jeśli dzieje się coś podejrzanego, URL klasyfikowany
jako złośliwy
OWASP 32
33. Honeypoty wysoko interaktywne cd.
Środowisko uruchomieniowe jest
takie samo
Nie ma żadnej emulacji
Czy da się wykryć, że jesteśmy śledzeni?
OWASP 33
39. Honeypoty wysoko inter. - podsumowanie
Nie ma warstwy emulacji – nie można
wykryć różnic
Kod wykonuje się w rzeczywistym
środowisku
Najsłabszym punktem brak „czynnika
ludzkiego”
Uruchomienie złośliwego kodu po
interakcji ze stroną
OWASP 39
40. Podsumowanie
Zaciemnianie tylko spowalnia analizę
Kod może aktywnie "bronić się"
Do kompletnej analizy niezbędny jest człowiek
Analiza wymaga dużych umiejętności
Narzędzia automatyczne można oszukać
niedoskonałość emulacji
błędy
niepełna interakcja ze stroną
OWASP 40