蚁剑流量特征
初始化代码
PHP 连接类型
抓取测试连接的数据包,默认不编码

可以看到只发起了一个请求

追踪数据流

这里就拿到了初始化的代码部分
1 |
|
环境准备
关闭错误显示以及取消执行时间限制
1 | @ini_set("display_errors", "0"); |
下面函数在 PHP 5.4 以后已废弃
1 | if (!function_exists("get_magic_quotes_gpc")) { |
绕过 open_basedir
open_basedir 是 PHP 的安全限制,约束文件操作只能在指定目录内
比如,在 Nginx/Apache 的 PHP 配置里设置
1 | php_admin_value open_basedir "/var/www/:/tmp/" |
那么该站点下的所有 PHP 脚本就只能读写 /var/www/ 和 /tmp/ 这两个目录
但如果是
1 | php_value open_basedir "/var/www/:/tmp/" |
则可以绕过
绕过思路如下:
获取当前
open_basedir值,并与当前脚本目录、系统临时目录合并为一个数组逐个检查这些目录是否可写
在可写目录下创建隐藏文件夹
.aefa96,进入该目录(例如/var/www/.aefa96)执行
ini_set("open_basedir", "..")将限制改为上级目录通过切
chdir("..")回到上次目录(/var/www)多次重复操作回到根目录
最后直接设置
open_basedir为"/",完全解除限制
输出编码函数
asenc() 直接返回原字符串
asoutput() 将输出包裹在特征字符串 b6f1bd0 和 d6955898 之间
1 | function asenc($out) { return $out; } |

信息收集
1 | // 获取当前脚本所在目录 |
异常处理
若信息收集出错,返回错误信息,但依然会被 asoutput() 包裹
1 | catch (Exception $e) { |
PSWINDOWS 连接类型
1 | powershell -nop -enc "编码" |
解码得到
1 | $TAGS=[System.String]::Concat('248','edb'); # 前缀 248edb |
PHPRAW 连接类型
与普通 PHP 没有区别,但是必须在 “其它设置” 里勾选「Body 设置为 RAW 模式」
1 |
|
数据分隔符
1 | $TAGS=[System.String]::Concat('248','edb'); # 前缀 248edb |
编码函数
1 | function asenc() { |
信息收集函数
1 | function asexec() { |
错误捕获与输出
1 | $RESP=''; |
编码解码器
接下来我们统一使用 Base64 编码去看具体的流量特征

可以发现流量都被 Base64 加密了

Body 为 RAW 模式
勾选这个选项进行测试

没什么区别,但是返回数据为空

分析源码得出以下结论:
RAW 模式发送的为纯 PHP 代码
服务端必须通过
file_get_contents("php://input")等读取原始请求流
1 |
|

使用随机英文单词变量
好像没什么变化
1 | @ini_set("display_errors", "0"); |
但是在会话中可以抓取流量包看到固定参数全部随机化了

增加垃圾数据
勾选选项

可以看到请求 Body 多了垃圾数据

以及在会话中会时不时的去访问随机文件

自定义数据分隔符


RSA 加密
来到 RSA 加密这里

点击生成,然后下面给出的代码就是 WebShell

新疆一个系统自带的 PHP RSA 编码器

编辑数据修改编码器为刚刚创建的,测试连接成功

抓包可以看到流量默认以 ant 开头,这个可以在 WebShell 代码中修改隐藏,但是特征很难改掉

附赠一波基于 PSWINDOWS 免杀的编码器
1 | ; |