如何在受限环境中利用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

攻击执行流程

  1. 将修改后的libopensc.so.6下载到/tmp/
  2. 将修改后的opensc-pkcs11.so下载到目标系统
  3. 在Firefox中将opensc-pkcs11.so添加为安全设备

0x03 技术要点总结

  1. 跨平台性:该技术适用于Linux和Windows系统
  2. 依赖处理:必须确保所有依赖库在目标系统上可用
  3. 执行限制system()调用会阻塞主线程
  4. 替代方案:可考虑使用非阻塞方式执行命令

0x04 防御建议

  1. 禁用不必要的Firefox功能(如PKCS11模块加载)
  2. 限制文件系统访问权限
  3. 使用应用白名单机制
  4. 定期更新浏览器和安全组件

0x05 扩展思考

  1. 替代执行方式:可尝试使用popen()或直接调用exec系列函数
  2. 隐蔽性提升:可考虑延迟执行或条件触发
  3. Windows适配:类似原理可应用于Windows系统的DLL

0x06 参考资料

  1. PKCS11标准文档:https://docs.oracle.com/cd/E19120-01/open.solaris/819-2145/6n4f2qhp8/index.html
  2. OpenSC项目:https://github.com/OpenSC/OpenSC
  3. patchelf工具:https://github.com/NixOS/patchelf
在受限环境中利用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 中): 注意: system() 调用会阻塞Firefox主线程直到命令执行完成 需根据目标系统架构(32位/64位)编译 3. 调整动态依赖 使用 ldd 检查依赖: 使用 patchelf 修改依赖路径: 将库搜索路径改为可写目录(如 /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