FFM 是一个黑客工具包,可在红队演练的后渗透阶段使用。该工具的设计理念源自 @thegrugq 在 2007 年的一次会议 上的演讲。
它曾在 SSTIC 2018 上进行展示(视频),配套的幻灯片可通过 此链接 获取。如果你不熟悉这类工具,强烈建议你先了解它们,以理解黑客工具包的作用。所有评论都包含在幻灯片中。
本项目根据 GPL v3 许可证 的条款分发。
主要文档存放在本 README 以及 commands/ 目录下的命令模块中。上述 SSTIC 演讲链接仍然是了解工具包使用方式的最佳高级背景资料。更多演练材料可在以下地址获取:
ice-wzl 在项目历史中贡献了命令、文档和重构。docker 运行此工具。Dockerfile 可以大幅减少可能遇到的错误。Dockergit clone https://github.com/JusticeRage/FFM.git
cd /FFM
docker build Docker_Install/ -t ffm:ffm
docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/ffm ffm fb6dd17e3b91 9 minutes ago 614 MB
docker.io/library/ubuntu 22.04 3b418d7b466a 2 weeks ago 80.3 MB
# 运行新容器并进入 root 用户的 /bin/bash 提示符
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
root 和 neo 的 passwdsu neo 然后你就可以开始了 git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
黑客工具包的目标是作为一个助手,自动化后渗透阶段的常见任务,同时保护用户免受可能犯的错误。
它是 shell 的工具化。运行 ./ffm.py 激活它,你就可以立即开始工作。命令分布在 commands/ 下的小模块中,其中 commands/command_manager.py 负责发现和注册。主要分组包括枚举、帮助、隐蔽、传输和执行。
你需要了解两个命令:
!list 显示工具包提供的所有命令。!list tags 查看命令可被归类的不同标签!list tags
可用命令列表:
enumeration
execution
help
stealth
transfer
!list enumeration(或其他标签之一)来查看属于该类别的命令。!list enumeration
可用命令列表:
!backup-hunter: 搜索备份文件
!info: 返回当前机器的 CPU、架构、内存和内核版本。
!log: 切换将工具包的输入和输出记录到文件。
!mtime: 返回最近 X 分钟内修改过的文件
!os: 打印当前机器的发行版信息。
!db-hunter: 搜索 .sqlite、.sqlite3 和 .db 文件
!sshkeys: 搜索当前机器上的私钥和公钥 SSH 密钥。
!suid: 查找当前机器上的 SUID、SGID 二进制文件。
--snip--
SHIFT+TAB 可对本地机器进行 Tab 补全。如果你通过 SSH 登录到远程计算机但需要引用本地机器上的文件时,这可能会很有用。此黑客工具包提供了一些功能,如下所述。在描述的过程中,也会介绍工具的设计哲学。不期望 FFM 中实现的所有命令都适合你。每个人都有自己做事的方式,根据你的具体需求调整工具包可能需要对某些代码进行修改和/或编写一些插件。我们付出了大量努力确保这是一项轻松的任务。
!os 是一个非常简单的命令,它仅运行 cat /etc/*release* 来显示当前机器正在运行的操作系统。它最重要的价值可能在于演示:在黑客工具包的上下文中,你可以定义跨机器边界工作的别名。SSH 到任何计算机,输入 !os 命令即可运行。枚举命令位于 commands/enumeration_commands.py 中,帮助命令位于 commands/help_commands.py 中,与隐蔽相关的命令分布在 commands/stealth_commands.py、commands/notty_sudo.py 和 commands/log_control.py 中。!backup-hunter 搜索备份文件!info 返回当前机器的 CPU、架构、内存和内核版本。!log 切换将工具包的输入和输出记录到文件。实现于 commands/log_control.py。!mtime 返回最近 X 分钟内修改过的文件。例如 !mtime 5 将获取本地机器上(你有权限查看的)最近 5 分钟内修改的所有文件。!download [远程文件] [本地路径] 从远程机器获取文件并通过终端复制到本地。这个命令稍微复杂一些,因为需要进行更严格的错误检查,但它是另一个你可以轻松阅读以便入门的命令。它位于 commands/download_file.py 中。请注意,它需要远程机器上的 xxd 或 od 才能正常运行。!download-dir [远程目录] [本地目标] 通过终端流式传输远程目录的 tar 归档,并在本地提取而不接触远程文件系统。它位于 commands/download_directory.py 中。它需要远程机器上的 tar 和 base64,并在可用时使用 gzip。!upload [本地文件] [远程路径] 的工作原理与前一个命令完全相同,只是将本地文件放入远程机器。它位于 commands/upload_file.py 中。!sh [本地脚本] 在内存中运行来自本地机器的 shell 脚本。它位于 commands/remote_script.py 中。!py [本地脚本] 在远程机器上执行本地 Python 脚本,并且完全在内存中执行。它位于 commands/remote_script.py 中。请查看我的另一个仓库 以获取你可能想使用的脚本。此命令使用 << 的多行语法,这意味着不支持该语法的伪 shell(Weevely 就是一个很好的例子)会严重破坏此命令。!py3 [本地脚本] 除了针对使用 python3 的系统外,功能完全相同。它使用相同的模块 commands/remote_script.py。!elf [本地脚本] 使用远程机器上任何兼容的 Python 解释器,在内存中运行来自本地机器的可执行文件。它位于 commands/remote_elf.py 中。!pty 生成一个 TTY,这在大多数情况下是你不想要的,因为它往往会留下取证证据。然而,某些命令(sudo)或漏洞利用需要 TTY 才能运行,因此提供此功能作为便利。生成 TTY 后,会立即传递 UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND,以及 export TERM=xterm。!sudo 在没有 TTY 的情况下调用 sudo。它位于 commands/notty_sudo.py 中。通过编辑 ffm.conf 可以进一步配置插件。
从概念上讲,命令(如上所述)用于生成一些 bash 代码并转发到 shell。它们可以通过捕获 shell 的输出并根据返回结果生成附加指令来执行更复杂的操作。
处理器则稍有不同,它们主要用于重写用户与底层 bash 进程之间流通的数据。虽然任何处理器都可以改写为命令,但将两者分开似乎更清晰。输入处理器作用于用户在按下 ENTER 键后输入的任何内容,输出处理器可以修改 shell 返回的任何内容。
processors/ssh_command_line.py 中找到。它所做的只是在任何它看到的 SSH 命令中添加 -T 选项(如果缺少的话)。如果你有兴趣编写处理器,请务必查看其简单代码。processors/assert_torify.py 包含一个网络命令黑名单(ssh、nc),如果它们似乎没有通过诸如 torify 之类的工具进行代理,则会阻止它们。工具包会尽力只在命令似乎在本地机器上运行时才打扰用户。显然,这不应成为防止泄露你家庭 IP 地址的唯一保障。processors/sample_output_processor.py 是一个非常简单的输出处理器,它会以红色突出显示任何出现的“password”一词。由于它相当无用,因此未在框架中启用,但如果你想要做更复杂的事情,仍然可以将其作为起点。CTRL+R 尚未实现,我们都非常想念它。
更成问题的是,框架偶尔会挂起。在 99% 的情况下,这是因为框架未能检测到它启动的命令已经运行完毕。通常,这意味着无法识别你所登录机器的命令提示符。在这种情况下,你可以尝试改进位于 ffm.py 文件最开头的正则表达式,或者使用 ssh -T 登录到同一台机器,这样就不会再有有问题的提示符了。
默认情况下,FFM 会在 5 分钟后放弃尝试读取命令的输出(某些插件可能实现不同的超时时间);因此如果框架挂起,你需要等待直到看到错误消息(不过如果底层进程仍在运行,你可能仍然无法输入命令)。
我想我已经涵盖了该工具的所有内容。再次强调,它与我通常发布的内容有些不同,因为大多数人可能需要修改它才能使其对自身有价值。
许多插件尚未编写,因此请务必分享你对 FFM 所做的任何改进。如果遇到错误,或者你想做某事但不知道如何做,欢迎提出问题;这样我就能为大家改进文档。
!db-hunter 搜索 .sqlite、.sqlite3 和 .db 文件以及其他数据库文件!sshkeys 搜索当前机器上的私钥和公钥 SSH 密钥。!suid 查找当前机器上的 SUID、SGID 二进制文件。!strange-dirs 从用户指定的路径开始检查主机上的异常目录!sudo-version 检查是否存在易受攻击的 sudo 版本!vm 检查设备是否为虚拟机