pwncat 是一个后期利用平台 原本针对 Linux 目标。它最初是基本绑定和反弹 shell 的包装器,并从此发展壮大。它简化了常见的红队操作,同时从攻击者机器(而非目标)部署代码。
pwncat 以前只支持 Linux,但最近做了大量工作以支持多个平台。目前,对 Windows 目标提供 alpha 支持。有关如何在 Windows 目标上使用 pwncat 的详细信息,请参阅最新的[文档]。
pwncat 拦截与远程 shell 的原始通信,允许用户在远程主机上执行自动化操作,包括枚举、植入安装甚至权限提升。
收到连接后,pwncat 将设置一些用于与远程 shell 工作的公共配置。
which)pwncat 知道如何使用几种不同方法生成 pty,并将这些方法与先前枚举的可执行文件进行交叉引用。生成 pty 后,它会以原始模式设置控制终端,因此您可以像使用 ssh 一样进行交互。
pwncat 还会将远程 pty 设置(例如行数、列数、TERM 环境变量)与本地设置同步,以确保 shell 在与交互式应用程序(如 vim 或 nano)配合使用时行为正确。
John Hammond 和我在 GRIMMCon 上展示了 pwncat。我们的演讲可以在 YouTube 上找到此处。该视频演示了早期版本的 API 和界面。请参考文档以获取最新的使用和 API 文档!
pwncat 的[文档]正在 Read the Docs 上构建。请前往那里获取最新的使用和开发文档!
pwncat 要求 Linux 上安装 Python 3.9+
pwncat 仅依赖于一个运行在 Linux 上的工作 Python 开发环境。为了通过 pip 安装某些所需包,您可能需要您发行版的“Python 开发”包。在基于 Debian 的系统上,这是 python-dev。对于 Arch,开发文件随主 Python 仓库一起提供。对于 Enterprise Linux,包名为 python-devel。
pwncat 已以 pwncat-cs 名称推送到 PyPI,并可通过 pip 安装,如下所示:
pip install pwncat-cs
但建议从虚拟环境中安装 pwncat。
python3 -m venv pwncat-env
source pwncat-env/bin/activate
pip install pwncat-cs
对于开发环境,pwncat 使用 Python Poetry。您可以克隆本地仓库并使用 poetry 设置开发环境。
# 在 poetry 管理的虚拟环境中设置 pwncat
git clone [email protected]:calebstewart/pwncat.git
cd pwncat
poetry install
# 进入虚拟环境
poetry shell
由于与 Cytopia 的 pwncat 存在命名冲突,我决定将包重命名为 pwncat-cs。这包括重命名入口点,以便与 Cytopia 的项目没有直接冲突。如果您从 v0.4.* 升级,命令名称现已更改,pcat 和 pc 变体已被移除。有关详细信息,请参见最新的发布说明。
这一举措的额外好处是,该项目现在已推送到 PyPI,便于将来安装/更新。
pwncat 从 v0.4.0a1 开始支持来自 Windows 目标的连接。Windows 平台利用一个自动加载的基于 .Net 的 C2 库。Windows 目标应使用 cmd.exe 或 powershell.exe shell 连接,pwncat 将处理其余事项。
实现 C2 的库位于 pwncat-windows-c2。C2 的 DLL 将自动从目标发行版中为您下载。如果您在目标机器上没有互联网连接,可以告诉 pwncat 使用 --download-plugins 参数预先放置 DLL。如果您运行的是 pwncat 的发行版,也可以从发行页面下载包含所有内置插件的 tarball。
插件默认存储在 ~/.local/share/pwncat,但可以通过 plugin_path 配置进行设置。如果您从发行页面下载了打包的插件集,应将其解压到 plugin_path 指向的路径。
除了主要的 C2 DLL,其他插件也可能可用。目前,唯一提供的默认插件是 C2 和 BadPotato 的实现。pwncat 可以反射加载 .Net 二进制文件作为 C2 的插件。有关 Windows C2 插件的更多信息,请参见[文档]。
最近,pwncat 框架的架构被重新设计,融入了通用的“模块”结构。所有功能现在都作为模块实现。这包括枚举、持久化和权限提升。与模块的交互与其他大多数后利用平台类似。您可以使用熟悉的 run、search 和 info 命令,并使用 use 命令进入模块上下文。请参考文档了解更多信息。
在 BlackArch 上安装非常简单:
pacman -Syu pwncat-caleb
pwncat 的命令行参数力求灵活,接受多种常见连接语法。具体来说,它会尽量接受常见的 netcat 和 ssh 类型的语法。以下都是有效的:
# 连接到绑定 shell
pwncat-cs connect://10.10.10.10:4444
pwncat-cs 10.10.10.10:4444
pwncat-cs 10.10.10.10 4444
# 监听反弹 shell
pwncat-cs bind://0.0.0.0:4444
pwncat-cs 0.0.0.0:4444
pwncat-cs :4444
pwncat-cs -lp 4444
# 通过 SSH 连接
pwncat-cs ssh://user:[email protected]
pwncat-cs [email protected]
pwncat-cs user:[email protected]
pwncat-cs -i id_rsa [email protected]
# SSH 使用非标准端口
pwncat-cs -p 2222 [email protected]
pwncat-cs [email protected]:2222
# 利用安装的持久化重新连接
# 如果重新连接失败且未指定协议,则回退使用 SSH。
pwncat-cs reconnect://[email protected]
pwncat-cs reconnect://user@c228fc49e515628a0c13bdc4759a12bf
pwncat-cs [email protected]
pwncat-cs c228fc49e515628a0c13bdc4759a12bf
pwncat-cs 10.10.10.10
默认情况下,pwncat 假定目标平台是 Linux。要连接到 Windows 反弹或绑定 shell,您必须传递 --platform/-m 参数:
pwncat-cs -m windows 10.10.10.10 4444
pwncat-cs -m windows -lp 4444
有关语法和参数处理的更多信息,请参阅 pwncat-cs --help 的帮助信息或访问[文档]。
推荐的安装方法是 Python 虚拟环境。这提供了最简单的日常使用 pwncat 方式。不过,也有兴趣通过 docker 镜像使用 pwncat,因此我提供了一个 Dockerfile,其中包含可工作的 pwncat 安装。要构建镜像,请使用:
docker build -t pwncat .
这将构建带有标签 "pwncat" 的 pwncat docker 镜像。容器内的工作目录是 /work。容器的入口点是 pwncat 二进制文件。可以像这样使用它:
# 连接到 10.0.0.1:4444 的绑定 shell
docker run -v "/some/directory":/work -t pwncat 10.0.0.1 4444
在此示例中,只有 /some/directory 中的文件暴露给容器。显然,对于上传/下载,容器只能看到通过任何挂载目录暴露的文件。
pwncat 提供两个主要特性。其核心目标是自动设置远程伪终端(pty),从而允许与远程主机进行类似完整 SSH 会话的交互。在 pty 中操作时,您可以使用远程 shell 的常见功能,如历史记录、行编辑和图形终端应用程序。
pwncat 的另一半是一个框架,利用远程 shell 执行自动枚举、持久化和权限提升任务。本地 pwncat 提示符提供了许多用于标准渗透测试的有用功能,包括:
pwncat 还提供自动还原这些远程“篡改”的能力与远程主机交互的底层框架旨在尽可能抽象底层 shell 和连接方法,使命令和插件能够与远程主机无缝交互。
您可以了解更多关于与 pwncat 交互以及底层框架的信息,请参阅[文档]。如果您有新的权限提升方法或持久化方法的想法,请特别查看 API 文档。欢迎拉取请求!
pwncat 希望成为红队的瑞士军刀。希望很快能添加更多功能。
由于 pwncat 试图以抽象方式与任何 shell 交互,且尽量减少对远程系统依赖的要求,我们发现了一些边缘情况。在发现这些情况时,我们会尽力处理并将它们对用户隐藏。然而,有些情况仍然被遗漏了,并在实际使用中被观察到。当这种情况发生时,pwncat 会尽一切可能保护您的终端,但您可能会遇到一些奇怪的输出或命令失败。
虽然 BSD 是一个基于 Unix 的内核,但它的用户态工具与 Linux 相比明显不同。因此,许多 pwncat 的自动功能在针对 BSD 目标运行时可能会失效或完全失败。我尝试捕捉所有错误或边缘情况,但仍可能存在一些尚未在 BSD 上完全测试的障碍。无论如何,稳定的 shell 应该能在 BSD 环境中运行,但我不提供任何保证。
如果以后有时间,我可能会尝试在 BSD 上稳定 pwncat,但目前我的重点是基于 Linux 的发行版。如果您想帮助改进 pwncat 在 BSD 上的表现,非常欢迎您联系我或直接复刻仓库。一如既往,欢迎拉取请求!