用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Visual C++

WIN2000漏洞(1) ―― 绿色兵团的文章,简直爽呆了

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:34:49

WIN2000漏洞(1)
加入时间:01-1-7 上午 11:40:01


在Windows 2000远程服务器上的cpu过载
发送一连串的二进制中的0字符,到达Windows 2000中的任意一个端口,都可能引起CPU的利用率达到100%。这样的端口包
括了TCP中端口号为7,9,21,23,7778和UDP中端口号为53,67,68,135,500,1812,1813,2535,3456的这些端口。
在Windows 2000远程服务器上的DOS操作系统的漏洞
以Windows 2000作为操作平台的服务器作为远程控制台对远程访问进行控制。一个远程的攻击者向该服务器发了一连串的
攻击性代码,使服务器工作出现故障。在此之后,如果系统通过自动重启后继续工作,那么很多 的攻击造成了远程服务器
不断的重新启动,直到重启的频度超出了系统的承受能力,系统崩溃。

另外:

1.
如果你有普通用户帐号,有个一个很简单的方法获取NT Administrator帐号:

先把c:winntsystem32下的logon.scr改名为logon.old备份

然后把usrmgr.exe改名为logon.scr

然后重新启动

logon.scr是启动时加载的程序,重新启动后,不会出现以往的登陆密码输入界面,而是用户管理器

这时他就有权限把自己加到Administrator组

不要忘记把文件名改回来啊!

2.
下面的技术适用于不重视NT网络安全的网站,

一些http的技术也可以供较高级的人员参考

进入Win2K网络可以采取下面的步骤:

因为NT的IIS server的ftp一般都是允许anonymous匿名帐号进入的,有些anonymous的帐号还有upload权限,我们就要攻击这
类站点。因为如果不允许匿名帐号,就可能造成明文密码在网上传输。用tcpspy的工具可以截获这 些密码。现在不谈这些
比较高级的技术。

正因为允许匿名帐号ftp登陆的设定,也给我们带来了突破NT server的机会。我们用ftp登陆一个NT server,比
如:xxx.xxx.xxx.xxx(示例名):

ftp xxx.xxx.xxx.xxx

Connected to xxx.xxx.xxx.xxx

220 2000svr Microsoft FTP Service (Version 5.0).

2000svr这个东西暴露了其NETbios名,那么在IIS的背景下,必然会有一个IUSER_2000svr的用户帐号,属于Domain user组,
这个帐号我们以后要用来获取Administrator的权限

User (xxx.xxx.xxx.xxx none)):anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password: 输入 guest@ 或者guest
对于缺乏网络安全知识的管理员来说,很多人没有将guest帐号禁止,或者没有设置密码。那么guest帐号就是一个可用的正
确的用户帐号,虽然只属于Domain guest组

在这种情况下我们就可以进NT server的ftp了。

现在,开始查找cgi-bin目录(或者scripts目录),进去以后,

把winnt下的cmd.execopy到cgi-bin,把getadmin和gasys.dll传上去到cgi-bin

然后输入:http://www.xxx.com/cgi-bin/getadmin.exe?IUSR_SATURN

大约十多秒后屏幕显示:

CGI Error

这时有90%的可能是:你已经把IUSER_2000svr升级为Administrator,也就是任何访问该web站的人都是管理员

Windows 2000缓冲区溢出入门

  我在互联网上阅读过许多关于缓冲区溢出的文章。其中的绝大多数都是基于*NIX操作系统平台的。后来有幸拜读了
ipxodi所著的《Windows系统下的堆栈溢出》(已刊登在绿盟网络安全月刊2000年第三?谥校?,又碰巧看到了Jason先生的
《Windows NT Buffer Overflow’s From Start to Finish》,得益匪浅。在翻译Jason先生的文章时,由于我的机器安装
了Windows 2000 Server,在调试原文程序时发现细节略有出入。因此本文提供的有关源程序、动态链接库、偏移量等是以
我在自己机器上调试为准。(对不同版本的动态链接库,都需要编程者自己调试。)

  这篇文章应该属入门级。虽然比较简单,但对于Windows系统下的缓冲区溢出具有一定的通用性。例如,堆栈溢出地址
的确定,跳转指令的查找和使用,溢出执行代码的编写,等等。只要发现Windows系统下存在缓冲区溢出漏洞的程序,基本
上都可通过这些步骤进行攻击测试。但正如ipxodi所指出的,由于Windows下动态链接库的版本更新较快,一定要根据编程
者的实际平台进行调试。在发布此类安全漏?垂?告或溢出攻击程序时,源代码、系统平台和动态链接库的版本号都应该尽?
苛星宄?。否则别人调试起来可能会头疼得很厉害。;??P>--[ 调试、测试环境

Microsoft Visual C++ 6.0
Microsoft Windows 2000 Server (中文版,内部版本号:2195)

--[ 调试、测试过程

首先,写一个存在缓冲区溢出漏洞的应用程序。该程序可读取文件的内容,这样我们就能通过修改被读取文件的内容来使
程序溢出。;-) 在Visual C++开发环境中创建一个新的控制台应用程序,选择”An Application that supports MFC”并
单击”Finish”。(注:其实并不一定非是MFC应用程序不可,只不过是我自己的习惯而已。;-)))向这个应用程序中添
加一些必要的代码,如下:

CWinApp theApp;

using namespace std;

void overflow(char* buff);

void overflow(char* buff)
{
CFile file;
CFileException er;
if(!file.Open(_T("overflow.txt"),CFile::modeRead,&er))
{
er.ReportError();
return;
}

int x = file.GetLength();
file.Read(buff,x);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
char buff[10];
overflow(buff);
}
return nRetCode;
}

  现在先来分析一下上面这段C++代码,找一找哪里有漏洞。这是一个MFC控制台应用程序,”main”函数与其它程序
会有些不同,但工作机制基本一致。我们主要分析该函数中”else”那段代码。首先 是第一行”char buff[10]”,定义
了一个10字符长的本地变量。我们都知道,本地变量的内存空间是在堆栈里分配的。(如果你连这个都不知道,建议不要
继续往下看了。:))然后是将buff变量作为参数调用overflow函 数。好了,现在让我们分析overflow函数。首先是一个
Cfile对象,然后是一个CfileException对象。接下来会试图以读权限打开当前目录下的文件”overflow.txt”。如果打开
成功,则将该文件中的所有?谌荻寥〉?buff数组变量中。发现了问题没有?buff变量只有10字符长。如果读取的文件内容
长度是100时会发生什么问题呢?对了,“缓冲区溢出”!而且是在堆栈中发生的缓冲区溢出。在后面的测试中就 能看
到,我们利用这个漏洞能做些什么!;)现在让我们创建文本文件”overflow.txt”,并将它放到这个应用程序的project
目录下。

在进行下一步前,先让我们探讨一下关于Windows NT/2000的内存结构。NT/2000的每一个进程都在启动时分配了4GB
(0xFFFFFFFF)的虚拟内存。其中的某些部份实际上是由所有进程共享的,例如核心和设备驱动程序区域。但它们都会被
映射到每个进程的?槟獾刂房占淅铩J导噬厦挥薪?程分配??GB的物理内存,而是仅当需要时才分配物理内存。因此每一个
进程都有各自的4GB虚拟内存,编址范围从0x00000000到0xFFFFFFFF。其中,0x00000000-0x0000FFFF?俏?NULL指针分配而
保留的。访问该区域内存将导致“非法访问”错误。0x00010000-0x7FFEFFFF是用户进程空间。EXE文件的映像被加载到其
中(起始地址0x00400000),DLL(动态链接库)也被加载到这?糠菘占洹H绻?DLL或EXE的代码被装入到该范围的某些地
址,就能够被执行。访问该区域中没有代码装入的地址将导致“非法访问”错误。0x7FFF0000-0x7FFFFFFF是保留区域,
对此区域的任何访问都将导?隆胺欠ǚ梦省贝砦蟆?x80000000-0xFFFFFFFF仅供操作系统使用。用于加载设备驱动程序和其
它核心级代码。从用户级应用程序(ring 3)访问此区域将导致“非法访问”错误。

现在回到”overflow.txt”文件。现在我们将向这个文本文件中不断添加字符,直到弹出应用程序非法访问的系统对话
框。在这里,填充什么字符是很重要的(原因待会就知道了)。我选择小写字母”a”?刺畛湮谋疚募?。我们已经知道缓?
迩?只??0字符长,那么先填充11个字符。(注意:以debug方式编译应用程序,否则结果可能会有所不同。)咦?没反应。
我们继续填充字符……直到填充了18个字符应用 程序才崩溃。但这个崩溃对我们的用处还不大。继续填充!当字符串长度
为24时,运行程序并观察弹出的对话框信息:“”0x61616161”指令引用的”0x61616161”内存。该内存不能为”
written”。”我?氪蠹叶加Ω弥?道??x61”所代表的ASCII码是什么吧?;)如果你的机器安装了Visual C++,单击“取
消”按钮就能够调试该应用程序。进入调试环境后,选择”view”菜单?D?D”debug windows”?D?D”registers”,可打
开寄存器窗口。如果你对汇编一窍不通,建议先フ冶净惚嗟氖榭纯础T诩拇嫫鞔翱诶锘峥吹?EAX、EBS和EIP等寄存器的内
容。EIP当然是最重要的了。EIP的内容就是程?蛳乱徊剿?要执行指令的地址。我们注意到ESP寄存器的值未被破坏,而且似
乎离我们的buff变量不远。下一步我们需要找出ESP的值是如何处理得到的。

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:3,062.50000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号