关键词:1Panel、Webmin、Usermin、aaPanel、面板识别、端口指纹、配置目录
难度:进阶
前置知识:Linux 目录结构、Web 服务器基本概念、HTTP 状态码、进程与端口排查
一、概述
宝塔之外,Linux 服务器上还有大量其他管理面板。
它们的共性是:一个 Web 口令 = 一次 root 级操作。取证逻辑与宝塔完全一致——查「谁在什么时候用过面板」,再查「面板替谁保管了哪些凭据」。
但不同面板的差异极大,混用路径会直接导致结论错误。最常见的取证错误是「认错面板」:在 1Panel 的机器上去找 /www/server/panel,当然什么都找不到,然后错误地下结论「该服务器没有装面板」。
这类误判的代价不是漏检,而是把「存在但路径不同」写成了「不存在」。
本篇因此把目标定在两件事上:一张能快速认面板的对照表(目录、数据库、日志、默认端口),以及一套不依赖面板类型的通用识别方法——即使遇到没见过的面板,也能从端口、HTTP 响应、报错信息、文件系统残留里认出它来。
第二部分才是本篇最有迁移价值的部分。
在取证流程中的位置:本篇属于识别层,位于「服务器上到底装了什么」这个问题之前或之中。它与 宝塔面板取证 不是替代关系——宝塔是国内最主流的,值得单独一篇;本篇负责剩下的一切,并给出通用方法。上游依赖 Linux 服务器取证工件地图 的路径全景;下游是针对识别出的面板做具体分析(配置、日志、凭据),以及与站点侧的衔接。
涉及的证据形态(面板对照表,用「存在性测试」逐项过一遍,命中哪项就是哪个面板):
| 面板 |
主目录 |
配置/数据库 |
主要日志 |
默认端口 |
| 宝塔 BT Panel |
/www/server/panel/ |
data/default.db(旧)/ data/db/*.db(新) |
logs/request.log |
8888(旧版 888) |
| 1Panel |
/opt/1panel/ |
db/1Panel.db(SQLite) |
log/、logs/(随版本变化) |
10086 |
| Webmin |
/etc/webmin/、/usr/share/webmin/ |
users.pl、webmin.config(Perl 序列化) |
/var/log/webmin/ |
10000 |
| Usermin |
/etc/usermin/ |
users.pl |
/var/log/usermin/ |
20000 |
| aaPanel |
/www/server/panel/ |
与宝塔同源(英文版分支) |
logs/request.log |
8888 |
| cPanel / WHM |
/usr/local/cpanel/ |
main.db(SQLite)、vars/ |
/var/log/cpanel/ |
2082/2083 |
| DirectAdmin |
/usr/local/directadmin/ |
admin.conf |
/var/log/directadmin/ |
2222 |
| Plesk |
/usr/local/psa/ |
plesk.db |
/var/log/plesk/ |
8443/8880 |
| Cockpit |
/etc/cockpit/ |
cockpit.conf |
journald |
9090 |
⚠️ 版本差异必须现场确认。 1Panel 的日志目录尤其不稳定:不同版本出现过 log/、logs/、甚至只输出到容器日志的情况。判定时以「目录是否存在」为准,不要只按表里的名字 ls 一次就断定没装。
两类特殊结构必须单独讲:
- 1Panel 是容器化的——面板本体是一个容器,Web 应用也是独立容器。日志可能不在宿主机文件系统上;离线镜像上通常只能看到宿主机层,容器数据在
/var/lib/docker/volumes/ 里。取证时必须区分「宿主机」与「容器」两层(见 Docker 取证工件地图)。
- Webmin 用 Perl 序列化配置——
users.pl 不是文本也不是 SQLite,用文本编辑器打开是乱码。不能把「打开是乱码」当成「文件已加密」。
通用识别方法(本篇最有迁移价值的部分),四类线索:
HTTP 响应特征(最可靠,404 页面里出现面板自己的产品名是最直接的确认方式)。
报错信息(高,实际办案中一条错误信息直接暴露面板类型)。
端口指纹(线索而非证据——端口可改、可反代、必须交叉验证)。
文件系统存在性(离线镜像可靠,但单一目录存在只能说明「装过」,不能说明「当前在用」)。
多条线索同时命中同一面板时,才能做出认定。 建议按 3.1 第 1 步 普查后再用 3.2 第 2 步 区分状态。
能回答什么:这台服务器上装的是哪个面板(或装了哪几个)、版本与架构大致如何、面板的配置与凭据存在哪、面板当前是否在运行、日志在哪。
不能回答什么:面板里具体发生过什么操作(要读它的日志,格式随版本与面板类型变化);「装过」不等于「在用」(面板可能已卸载但残留目录);某个面板的完整加密机制(宝塔新版见 宝塔新版加密数据解密,其他面板各不相同);配置打不开时不能一律写「已加密」——可能是格式没认对。
内容边界:本文用于已获得合法授权的取证场景。面板配置中含真实凭据,提取分析须在受控环境内完成,报告中脱敏。识别面板时只做存在性测试与被动观察,不触发面板的漏洞利用,不尝试绕过认证。
读者前提:需要 Linux 服务器取证工件地图 的路径全景与面板基础概念、宝塔面板取证 的取证逻辑(本篇的多处判读标准以宝塔篇为对照),以及基本的 HTTP 与端口知识。建议先做 3.1 第 1 步 的普查,再决定按哪个面板展开。
二、核心原理
2.1 面板对比表
**这张表是本篇最实用的部分。**拿到一台服务器,先用「存在性测试」逐项过一遍,命中哪项就是哪个面板:
| 面板 |
主目录 |
配置/数据库 |
主要日志 |
默认端口 |
技术栈 |
| 宝塔 BT Panel |
/www/server/panel/ |
data/default.db(旧)data/db/*.db(新) |
logs/request.log |
8888(旧版 888) |
Python |
| 1Panel |
/opt/1panel/ |
db/1Panel.db(SQLite) |
log/、logs/(随版本变化) |
10086(可自定义) |
Go |
| Webmin |
/etc/webmin/(配置)/usr/share/webmin/(程序) |
users.pl、webmin.config(Perl 序列化) |
/var/log/webmin/ |
10000 |
Perl |
| Usermin |
/etc/usermin/ |
users.pl |
/var/log/usermin/ |
20000(可自定义) |
Perl |
| aaPanel |
/www/server/panel/ |
与宝塔同源(英文版分支) |
logs/request.log |
8888 |
Python |
| cPanel / WHM |
/usr/local/cpanel/ |
main.db(SQLite)、vars/ |
/var/log/cpanel/ |
2082/2083(2087/2088 强制 SSL) |
Perl |
| DirectAdmin |
/usr/local/directadmin/ |
admin.conf |
/var/log/directadmin/ |
2222 |
C |
| Plesk |
/usr/local/psa/ |
plesk.db |
/var/log/plesk/ |
8443/8880 |
PHP |
| Cockpit |
/etc/cockpit/ |
cockpit.conf |
journald(systemd-journald) |
9090 |
C/Python |
| 小皮面板(Windows 为主) |
Linux 版少见 |
— |
— |
888(Windows 环境) |
— |
⚠️ 版本差异必须现场确认。上表中 1Panel 的日志目录尤其不稳定:不同版本出现过 log/、logs/、甚至只输出到容器日志的情况。判定时以「目录是否存在」为准,不要只按表里的名字 ls 一次就断定没装。
2.2 1Panel 的特殊性:容器化
1Panel 与其他面板最大的结构差异是它以 Docker 容器为核心:面板本体是一个容器,Web 应用(OpenResty、MySQL、Redis 等)也是独立容器。
这带来两个取证影响。
其一,日志可能不在宿主机文件系统上。
docker ps -a --format 'table {{.Names}}\ {{.Image}}\ {{.Status}}'
docker logs 1panel 2>&1 | tail -100 # V1 容器名
docker logs 1panel-v2 2>&1 | tail -100 # V2 容器名
ls -l /opt/1panel/log/ /opt/1panel/logs/ 2>/dev/null
**其二,取证时必须区分「宿主机」与「容器」两层。**在离线镜像上通常只能看到宿主机层,容器数据在 /var/lib/docker/volumes/ 里(若使用命名卷):
| 位置 |
内容 |
/opt/1panel/db/1Panel.db |
面板主数据库(SQLite),含账号、设置、数据库信息 |
/opt/1panel/conf/ |
各应用的配置(Nginx、PHP、数据库等) |
/opt/1panel/apps/ |
通过面板安装的应用(OpenResty 等)及其配置 |
/opt/1panel/log/ 或 logs/ |
面板自身日志(版本相关) |
/var/lib/docker/volumes/ |
容器命名卷(应用数据可能在此) |
2.3 Webmin 的特殊性:Perl 序列化配置
Webmin 不使用 SQLite,而使用 Perl 的 Storable/Data::Dumper 序列化格式。
这意味着不能直接用文本编辑器或 SQLite 工具读,必须用 Perl 解析:
# 直接 cat 会看到 $VAR1 = {...}; 这类内容
perldump /mnt/df/etc/webmin/users.pl
/etc/webmin/ 下的关键文件:
| 文件 |
内容 |
取证价值 |
miniserv.conf |
主配置:端口、监听地址、allow/deny IP 白名单、TLS 设置 |
★★★★★ |
users.pl |
Webmin 用户到 Unix 账户的映射与权限 |
★★★★★ |
webmin.config |
全局配置(Perl 序列化) |
★★★★ |
ssl/ |
证书与私钥(取证的敏感目标) |
★★★★★ |
/ 下各模块配置 |
各模块的独立配置目录 |
★★★ |
/usr/share/webmin/ |
程序本体(判断是否被篡改的比对基线) |
★★★ |
miniserv.conf 的取证价值最高,因为 allow= 行直接回答「谁被允许访问面板」:
port=10000
listen=0.0.0.0
ssl=1
allow=203.0.113.0/24 ← 只有这个网段被允许
若 allow 为空或为 0.0.0.0/0,说明未设置访问限制,是重要风险项。
日志位置(不同安装方式略有差异):
ls -l /var/log/webmin/ 2>/dev/null
# miniserv.log ← 服务端访问日志
# auth.log ← 认证日志(登录成败)
# webmin.log ← 操作日志(需在 Webmin 配置里开启"记录每个操作的文件改动")
关键陷阱:webmin.log(操作日志)默认不开启。未开启时不存在「没有操作记录」的结论——而是「从未记录过」。这两个说法的证据价值完全不同。
2.4 aaPanel 与国产面板概览
aaPanel 是宝塔的国际版分支,代码同源,因此目录结构、数据库位置、日志位置、默认端口全部相同。
差异在于界面语言、安装包来源,以及部分模块的默认配置。取证时按宝塔处理即可,但要注意区分「装了 aaPanel」和「装了宝塔中文版」——可通过面板文件中的语言包目录或安装记录判断。
| 面板 |
平台 |
特点与取证注意 |
| 宝麒麟 |
Linux |
国产面板,取证参照宝塔思路,路径以实际安装为准 |
| 悬镜 |
Linux |
偏向安全加固的运维平台,配置目录随版本变化 |
| 小皮面板 |
Windows 为主 |
国内常见的 Windows 建站面板;Linux 版本极少,遇到 Linux 服务器时不应优先假设 |
| AMH |
Linux |
开源面板,PHP 实现,目录与数据库路径随版本变化 |
| 定制开发面板 |
视情况 |
无通用路径,只能靠实际样本逐一识别 |
诚实说明:国产面板(尤其定制版)没有稳定的取证路径资料。上表只列识别思路,具体路径必须以实际样本验证。遇到未知面板时,用 2.5 节的通用方法。
2.5 通用识别方法(不依赖已知面板)
这是本篇最有迁移价值的部分。即使遇到没听过的面板,也能从以下四类线索认出它。
方法一:端口指纹
| 端口线索 |
指向 |
| 8888 / 888 |
宝塔 / aaPanel / 小皮 |
| 10086 |
1Panel(较常见) |
| 10000 |
Webmin(默认) |
| 20000 |
Usermin(默认) |
| 9090 |
Cockpit |
| 2222 |
DirectAdmin |
| 2082/2083/2087/2088 |
cPanel / WHM |
| 8443 / 8880 |
Plesk |
注意:端口是线索不是证据。端口可改、可反代、可能与其他服务冲突。必须与目录/响应头/进程名交叉验证。
方法二:HTTP 响应特征(最可靠)
如果目标还在运行,直接访问可疑端口看响应(curl -skI https://127.0.0.1:8888 | head -20):
| 响应特征 |
指向 |
响应头带 X-Powered-By: BT-Panel 一类标识 |
宝塔 |
Set-Cookie 名为 1panel_session 一类 |
1Panel |
页面标题/页脚含 Webmin |
Webmin |
| 404 页面里出现面板自己的版权/产品名 |
最直接的确认方式 |
方法三:一条报错信息往往就够
实际办案中,经常是一条错误信息直接暴露了面板类型:
| 报错/线索 |
判断 |
| 404 页面脚注「Powered by 1Panel」 |
1Panel |
500 错误堆栈里出现 webmin_ajax / miniserv.pl |
Webmin |
日志路径 /www/server/panel/logs/error.log 出现在报错里 |
宝塔/aaPanel |
| 提示「请访问 http://<IP>:8888/xxx 安全入口」 |
宝塔(安全入口机制独有) |
方法四:文件系统存在性(离线镜像的可靠方式)——见 3.1。
**多条线索同时命中同一面板时,才能做出认定。**单一目录存在只能说明「装过」,不能说明「当前在用」——面板可能已卸载但残留目录。
本篇只覆盖面板这一类工件。服务器上还有哪些日志、站点目录与系统痕迹需要一并固定,见第 01 篇。
三、操作步骤
3.1 第 1 步:面板存在性普查
for d in /www/server/panel /opt/1panel /etc/webmin /etc/usermin \
/usr/local/cpanel /usr/local/directadmin /usr/local/psa \
/etc/cockpit /opt/cockpit; do
[ -d "/mnt/df$d" ] && echo "命中 $d"
done
ls /mnt/df/etc/systemd/system/ 2>/dev/null | grep -iE 'panel|webmin|1panel|cockpit'
ss -tulpn | grep LISTEN # 在线时的端口
3.2 第 2 步:判定"装过"还是"在用"
这是本篇强调的一个关键区分,很多案件在这里出错的根源:
# 1) 配置文件是否完整且近期被修改
ls -l --time-style=long-iso /mnt/df/etc/webmin/miniserv.conf 2>/dev/null
# 2) 数据库是否近期被写入(应用层活动痕迹)
ls -l --time-style=long-iso /mnt/df/opt/1panel/db/1Panel.db 2>/dev/null
# 3) 日志的最后一条记录时间
tail -3 /mnt/df/var/log/webmin/miniserv.log 2>/dev/null
# 4) 面板程序本体是否完整(可能被删了程序留了配置)
ls /mnt/df/www/server/panel/class/ 2>/dev/null | head
| 观察 |
结论 |
| 目录 + 程序 + 近期日志 |
在用(按在用取证) |
| 目录 + 程序存在,但日志早已停止 |
装过但已停用(仍可能被攻击者重新启用) |
| 只有配置和数据库,程序目录为空 |
被卸载但数据残留——数据本身仍是高价值证据 |
| 目录完全不存在 |
未安装(注意区分「从未装过」与「装完即删」) |
3.3 第 3 步:1Panel 取证
先完整复制并固定哈希,再只读打开 SQLite(不要用 sqlite3 直接写镜像路径):