用于Python的RDP中间人(mitm)攻击库,能够实时或事后查看连接
PyRDP 是一个使用 Python 编写的远程桌面协议 (RDP) 中间人 (MITM) 工具和库。
它包含以下几个工具:
PyRDP 于 2018 年推出,当时我们演示了能够捕获真实的威胁行为者。该工具的开发同时考虑了渗透测试和恶意软件研究的使用场景。

PyRDP 应适用于 Python 3.7 及以上版本,支持 x86-64、ARM 和 ARM64 平台。
该工具已在 Linux(Ubuntu 20.04、22.04)、Raspberry Pi 和 Windows 上的 Python 3.7 上测试通过。尚未在 macOS 上测试。
推荐两种安装方式:使用 pipx 或使用 Docker 容器。从源码安装或自行构建 Docker 容器的方法在开发文档中有介绍。
首先,确保安装必要的包(以下针对 Ubuntu 22.04 列出,其他发行版可能需要调整)。我们提供两种类型的安装:完整版和精简版。根据您的使用场景安装相应的依赖项。```sh
sudo apt install python3 python3-pip python3-venv
build-essential python3-dev openssl
libegl1 libxcb-cursor0 libxkbcommon-x11-0 libxcb-icccm4 libxcb-keysyms1
libnotify-bin
libavcodec58 libavdevice58
sudo apt install python3 python3-pip python3-venv
build-essential python3-dev git openssl
这将安装运行PyRDP所需的依赖项。如果选择不安装GUI或视频转换依赖项,则将无法使用
`pyrdp-player`(除非使用无头模式 `--headless`)或通过 `pyrdp-convert` 生成视频输出。
请确保已安装 `pipx`。在Ubuntu 22.04上:```sh
python3 -m pip install --user pipx
python3 -m pipx ensurepath
请确保已安装 Python。 在 Windows 11 上,Windows 商店版 Python 对我而言无法正常工作。 我们建议通过 Scoop 安装 Python。```sh scoop install python # if not installed already scoop install pipx pipx ensurepath
注销并重新登录(以更新您的PATH)。
##### 其他操作系统
要在其他操作系统上安装 `pipx`,请参见此处:<https://github.com/pypa/pipx#install-pipx>
#### 安装
为了获得完整的PyRDP体验,包括QT图形界面以及将捕获转换为视频的能力:```sh
pipx install pyrdp-mitm[full]
对于设计在无头环境(服务器、树莓派)中运行的紧凑版本:```sh pipx install pyrdp-mitm
准备好开始吧!请参阅[使用说明](#using-pyrdp)。
### 使用 Docker 镜像
如果已安装并正常使用 Docker,这是最简单的安装方法。```sh
docker pull gosecure/pyrdp:latest
作为替代,我们提供了一个更精简的镜像,不含GUI和ffmpeg依赖项。这是在ARM平台上唯一提供的镜像。```sh docker pull gosecure/pyrdp:latest-slim
您可以在 [gosecure/pyrdp DockerHub 页面](https://hub.docker.com/r/gosecure/pyrdp/tags) 上找到我们所有 Docker 镜像的列表。
`latest` 标签指向最新的发布版本,而 `devel` 标签是根据我们的 `main` 分支构建的 Docker 镜像。
## 使用 PyRDP
### 使用 PyRDP 中间人攻击工具
使用 `pyrdp-mitm <ServerIP>` 或 `pyrdp-mitm <ServerIP>:<ServerPort>` 运行 MITM。
假设您有一个 RDP 服务器运行在 `192.168.1.10`,并在端口 3389 上侦听,您将运行:```sh
pyrdp-mitm 192.168.1.10
首次运行MITM时,会在当前工作目录下创建一个名为 pyrdp_output/ 的目录。
以下是该目录的示例布局:```sh
pyrdp_output/
├── certs
│ ├── WinDev2108Eval.crt
│ └── WinDev2108Eval.pem
├── files
│ ├── e91c6a5eb3ca15df5a5cb4cf4ebb6f33b2d379a3a12d7d6de8c412d4323feb4c
│ ├── b14b26b7d02c85e74ab4f0d847553b2fdfaf8bc616f7c3efcc4771aeddd55700
├── filesystems
│ ├── romantic_kalam_8214773
│ │ └── device1
│ │ └── clipboard
| └── priv-esc.exe -> ../../../files/b14b26b7d02c85e74ab4f0d847553b2fdfaf8bc616f7c3efcc4771aeddd55700
│ └── happy_stonebraker_1992243
│ ├── device1
│ └── device2
| └── Users/User/3D Objects/desktop.ini -> ../../../../../../e91c6a5eb3ca15df5a5cb4cf4ebb6f33b2d379a3a12d7d6de8c412d4323feb4c
├── logs
│ ├── crawl.json
│ ├── crawl.log
│ ├── mitm.json
│ ├── mitm.log
│ ├── mitm.log.2021-08-26
│ ├── ntlmssp.log
│ ├── player.log
│ └── ssl.log
└── replays
├── rdp_replay_20231214_01-20-28_965_happy_stonebraker_1992243.pyrdp
└── rdp_replay_20231214_00-42-24_295_romantic_kalam_8214773.pyrdp
* `certs/` 包含生成的证书,这些证书以证书的 `CN` 作为文件名存储
* `files/` 包含所有捕获的文件,并通过使用内容的 SHA-256 哈希作为文件名进行去重存储
* `filesystems/` 包含按会话 ID 分类的目标文件系统的重建。
为了节省相似会话的空间,文件是指向 `files/` 下实际文件的符号链接
* `logs/` 包含各种日志,大多数以 JSON 和纯文本两种格式存储:
* `crawl`: 文件爬虫日志
* `mitm`: 主 MITM 日志
* `ntlmssp.log`: 捕获的 NetNTLM 哈希
* `player.log`: 播放器日志
* `ssl.log`: 以与 Wireshark 兼容的格式存储的 TLS 主密钥
* `replays/` 包含所有先前记录的 PyRDP 会话,文件名中包含时间戳和会话 ID
#### 指定私钥和证书
如果密钥生成失败,或者您想使用自定义密钥和证书,您可以使用
`-c` 和 `-k` 参数:```sh
pyrdp-mitm 192.168.1.10 -k private_key.pem -c certificate.pem
网络级别身份验证(NLA)是自 Windows Vista 起可用的一项安全功能,它为 RDP 连接增加了安全性。 NLA 依赖于新的安全支持提供程序 CredSSP,有时也以该名称称呼。 强制实施 NLA 的服务器更难受到攻击。 有三种不同的策略可供使用:
如果我们拥有服务器的证书和私钥,即使强制实施了 NLA,我们也能成功地对 RDP 进行中间人攻击(MITM)。 我们在 1.0 版本发布博客文章中记录了此攻击。 提取 RDP 证书和私钥的说明可在我们的 GitHub 上找到。
拥有证书和私钥后,您只需在 pyrdp-mitm 命令行中添加以下内容,将身份验证设置为 ssp:```sh
--auth ssp -c <certificate.pem> -k <private-key.pem>
这将使得拦截启用NLA的连接成为可能。
###### 当服务器强制NLA时的备用主机重定向

当PyRDP连接到目标RDP服务器时(1),如果该服务器强制NLA,则PyRDP(2)会替换连接,转而连接到您选择的另一台主机(3)。
例如,这可用于重定向到一个已知不强制NLA的服务器,甚至重定向到攻击者控制的虚拟机。
要启用此功能,请按如下方式指定备用主机的地址和端口:```sh
--nla-redirection-host 192.168.1.12 --nla-redirection-port 3389
该功能在 PyRDP 1.1.0 中引入。
NetNTLMv2 哈希对攻击者很有用,因为它们相对容易破解,从而使攻击者能够利用合法的 RDP 访问或尝试凭证填充。
从 1.1.0 版本开始,PyRDP 能够通过 NLA (CredSSP) 连接捕获客户端的 NetNTLMv2 哈希,方法是进行协商并捕获 NTLMSSP 认证消息。
在 1.2.0 版本中,该支持得到扩展,即使我们没有服务器的证书和私钥也能工作,这意味着连接无法成功进行中间人攻击 (MITM)。
这与 Responder 对 RDP 所做的类似。
捕获到的 NetNTLMv2 哈希可以在 ntlmssp.log 日志文件中找到,其格式使得 John The Ripper 或 hashcat 等破解工具可以读取它。
该技术已在一篇博客文章中详细描述:捕获 RDP NetNTLMv2 哈希:攻击细节与技术操作指南
此功能与 --auth ssp 兼容,但与 --nla-redirection-host 不兼容。
如果你想通过 PyRDP 播放器查看实时的 RDP 连接,你需要使用 -i 和 -d 参数指定播放器监听的 IP 地址和端口。注意:端口参数是可选的,默认端口为 3000。```sh
pyrdp-mitm 192.168.1.10 -i 127.0.0.1 -d 3000
##### 当MITM在服务器上运行时连接到PyRDP查看器