如何在受限环境中利用Firefox执行系统命令
字数 1372 2025-08-27 12:33:31
在受限环境中利用Firefox执行系统命令的技术分析
0x00 概述
在受限软件环境中,系统通常使用Kiosk应用程序限制用户交互。当Firefox是唯一可用应用程序时,攻击者可以通过加载自定义PKCS11模块来执行系统命令,突破限制。
0x01 环境侦察
文件系统探测
- 使用Firefox的
file:///协议处理程序遍历文件系统 - 关键目录检查:
/etc:系统配置信息(如/etc/os-release)/tmp:全局可写目录,可用于文件释放
系统信息收集
- 通过"关于Firefox"确定进程架构(32位/64位)
- 检查系统版本和可用应用程序
0x02 利用PKCS11模块突破限制
PKCS11模块简介
- Mozilla Firefox的"Security Devices"功能允许加载
.so(Linux)或.dll(Windows)文件 - 主要用于基于智能卡的身份验证
- 需要实现PKCS11标准定义的API函数
技术实现步骤
1. 寻找合适的PKCS11库
推荐使用开源OpenSC中间件:
- GitHub地址:https://github.com/OpenSC/OpenSC
- 必须实现的PKCS11 API函数:
C_Initialize()C_GetInfo()C_GetSlotList()C_GetTokenInfo()C_OpenSession()C_GetMechanismList()
2. 修改并编译PKCS11库
关键修改点(在src/pkcs11/pkcs11-global.c中):
CK_RV C_Initialize(CK_VOID_PTR pInitArgs) {
int res = system("/usr/bin/xterm"); // 执行系统命令
printf("%d", res);
// 原始代码继续...
CK_RV rv;
#if !defined(_WIN32)
pid_t current_pid = getpid();
#endif
// ...
}
注意:
system()调用会阻塞Firefox主线程直到命令执行完成- 需根据目标系统架构(32位/64位)编译
3. 调整动态依赖
使用ldd检查依赖:
ldd opensc-pkcs11.so
使用patchelf修改依赖路径:
patchelf --set-rpath /tmp opensc-pkcs11.so
将库搜索路径改为可写目录(如/tmp)
攻击执行流程
- 将修改后的
libopensc.so.6下载到/tmp/ - 将修改后的
opensc-pkcs11.so下载到目标系统 - 在Firefox中将
opensc-pkcs11.so添加为安全设备
0x03 技术要点总结
- 跨平台性:该技术适用于Linux和Windows系统
- 依赖处理:必须确保所有依赖库在目标系统上可用
- 执行限制:
system()调用会阻塞主线程 - 替代方案:可考虑使用非阻塞方式执行命令
0x04 防御建议
- 禁用不必要的Firefox功能(如PKCS11模块加载)
- 限制文件系统访问权限
- 使用应用白名单机制
- 定期更新浏览器和安全组件
0x05 扩展思考
- 替代执行方式:可尝试使用
popen()或直接调用exec系列函数 - 隐蔽性提升:可考虑延迟执行或条件触发
- Windows适配:类似原理可应用于Windows系统的DLL
0x06 参考资料
- PKCS11标准文档:https://docs.oracle.com/cd/E19120-01/open.solaris/819-2145/6n4f2qhp8/index.html
- OpenSC项目:https://github.com/OpenSC/OpenSC
- patchelf工具:https://github.com/NixOS/patchelf