
RDP монстр-посередине (mitm) и библиотека для Python с возможностью просматривать соединения в реальном времени или после события
PyRDP — это инструмент и библиотека на Python для атак «Monster-in-the-Middle» (MITM) на протокол удалённого рабочего стола (RDP).
Он включает несколько инструментов:
PyRDP был представлен в 2018 году, когда мы продемонстрировали возможность перехвата реальной угрозы. Этот инструмент разрабатывается с учётом сценариев использования как для пентеста, так и для исследования вредоносного ПО.

PyRDP должен работать на Python 3.7 и выше на платформах x86-64, ARM и ARM64.
Инструмент протестирован на Python 3.7 на Linux (Ubuntu 20.04, 22.04), Raspberry Pi и Windows. На 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. Python из Windows Store не работал у меня на Windows 11. Мы рекомендуем установить Python через Scoop.```sh scoop install python # if not installed already scoop install pipx pipx ensurepath
Выйдите из системы и войдите снова (чтобы обновить PATH).
##### Другие ОС
Для установки `pipx` на других операционных системах смотрите здесь: <https://github.com/pypa/pipx#install-pipx>
#### Установка
Для полного опыта PyRDP с QT GUI и возможностью конвертировать захваты в видео:```sh
pipx install pyrdp-mitm[full]
Для компактной версии, предназначенной для работы в безголовых средах (серверы, RaspberryPi):```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
Вы можете найти список всех наших Docker-образов [на странице gosecure/pyrdp на DockerHub](https://hub.docker.com/r/gosecure/pyrdp/tags). Тег `latest` относится к последней выпущенной версии, а тег `devel` — это образ Docker, собранный из ветки `main`.
## Использование PyRDP
### Использование PyRDP Monster-in-the-Middle
Используйте `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/` содержит воссозданную файловую систему целей, классифицированную по идентификаторам сессий.
Для экономии места при похожих сессиях файлы являются символическими ссылками на реальные файлы в `files/`.
* `logs/` содержит все различные журналы, большинство из которых в форматах JSON и plaintext:
* `crawl`: журнал обхода файлов
* `mitm`: основной журнал MITM
* `ntlmssp.log`: захваченные хеши NetNTLM
* `player.log`: журнал проигрывателя
* `ssl.log`: главные секреты TLS, сохраненные в формате, совместимом с Wireshark
* `replays/` содержит все ранее записанные сессии PyRDP с метками времени и идентификаторами сессий в имени файла
#### Указание закрытого ключа и сертификата
Если генерация ключа не сработала или вы хотите использовать собственный ключ и сертификат, вы можете указать их с помощью аргументов `-c` и `-k`:```sh
pyrdp-mitm 192.168.1.10 -k private_key.pem -c certificate.pem
Аутентификация на уровне сети (NLA) — это функция безопасности, доступная начиная с Windows Vista, которая повышает безопасность RDP-соединений. NLA использует новый поставщик поддержки безопасности CredSSP и иногда упоминается под этим именем. Сервер, который требует NLA, сложнее атаковать. Можно использовать три различные стратегии:
Если у нас есть доступ к сертификату и закрытому ключу сервера, мы можем успешно провести MITM-атаку на RDP, даже если NLA включена. Мы описали эту атаку в нашем блоге о выпуске версии 1.0. Инструкции по извлечению сертификата RDP и закрытого ключа доступны на нашем GitHub.
Имея сертификат и закрытый ключ, вам просто нужно установить аутентификацию на ssp, добавив это в командную строку pyrdp-mitm:```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 имеет возможность захватывать хэши NetNTLMv2 клиента через соединение NLA (CredSSP), проводя переговоры и захватывая сообщения аутентификации NTLMSSP.
В версии 1.2.0 эта поддержка была расширена для работы даже при отсутствии сертификата и закрытого ключа сервера, что означает, что соединение не будет успешно подвергнуто MITM-атаке.
Это похоже на то, что Responder делает с RDP.
Захваченный хэш NetNTLMv2 можно найти в файле журнала ntlmssp.log, и он отформатирован так, что инструменты для взлома, такие как John The Ripper или hashcat, могут его обработать.
Эта техника подробно описана в записи блога: Захват хэшей RDP NetNTLMv2: детали атаки и техническое руководство
Эта возможность совместима с --auth ssp, но несовместима с --nla-redirection-host.
Если вы хотите просматривать живые RDP-соединения через проигрыватель PyRDP, вам нужно указать IP-адрес и порт, на котором проигрыватель прослушивает, используя аргументы -i и -d. Примечание: аргумент порта необязателен, порт по умолчанию — 3000.```sh
pyrdp-mitm 192.168.1.10 -i 127.0.0.1 -d 3000
##### Подключение к PyRDP player, когда MITM запущен на сервере
Если вы запускаете MITM на сервере и все еще хотите видеть живые RDP-соединения, вам следует использовать
[SSH-туннелирование с перенаправлением удаленного порта](https://www.booleanworld.com/guide-ssh-port-forwarding-tunnelling/)
для перенаправления порта на вашем сервере на порт player'а на вашей машине. После этого вы передаете `127.0.0.1` и перенаправленный
порт в качестве аргументов MITM. Например, если порт 4000 на сервере перенаправлен на порт player'а на вашей машине,
команда будет выглядеть так:```sh
pyrdp-mitm 192.168.1.10 -i 127.0.0.1 -d 4000
PyRDP поддерживает автоматический запуск консольных команд или полезных нагрузок PowerShell при установлении новых подключений. Из-за особенностей RDP этот процесс несколько хакерский и не всегда на 100% надёжен. Вот как он работает:
cmd.exe.powershell -enc <PAYLOAD>.Для этого необходимо задать 3 аргумента:
Вы можете использовать один из следующих аргументов, чтобы задать выполняемую полезную нагрузку:
--payload — строка, содержащая консольные команды--payload-powershell — строка, содержащая команды PowerShell--payload-powershell-file — путь к скрипту PowerShellНа данный момент PyRDP не определяет момент входа пользователя в систему.
Необходимо указать время ожидания перед запуском полезной нагрузки.
После истечения этого времени он отправит фальшивые последовательности клавиш и ожидает корректного запуска полезной нагрузки.
Для этого используется аргумент --payload-delay. Задержка указывается в миллисекундах.
Например, если вы ожидаете, что пользователь войдёт в течение первых 5 секунд, вы бы использовали следующие аргументы:```sh
--payload-delay 5000
Это может быть сделано более точным за счёт использования некоторых сообщений, которыми обмениваются во время инициализации RDPDR.
Обратитесь к [этому вопросу](https://github.com/GoSecure/pyrdp/issues/98), если заинтересованы в улучшении этой функциональности.
##### Выбор момента возобновления нормальной активности
Поскольку нет прямого способа узнать, когда консоль завершила работу, вы должны указать PyRDP, как долго вы хотите,
чтобы ввод / вывод клиента был заблокирован. Рекомендуется устанавливать это значение равным максимальному времени, в течение которого, по вашему мнению, консоль, выполняющая вашу полезную нагрузку, будет видна. Другими словами, время, которое, как вы ожидаете, потребуется для завершения вашей полезной нагрузки.
Для установки длительности полезной нагрузки используйте аргумент `--payload-duration` с указанием времени в миллисекундах.
Например, если вы ожидаете, что выполнение полезной нагрузки займёт до 5 секунд, используйте следующий аргумент:```sh
--payload-duration 5000
Это заблокирует ввод/вывод клиента на 5 секунд, чтобы скрыть консоль и предотвратить помехи. Через 5 секунд ввод/вывод восстанавливается до нормального состояния.
Запустите pyrdp-mitm --help для полного списка аргументов.
--no-downgradeЭтот аргумент полезен при использовании PyRDP в сценариях Honeypot для предотвращения сканирования отпечатков. При включении этого переключателя PyRDP не будет понижать неподдерживаемые расширения и будет пропускать трафик прозрачно. Плеер, скорее всего, не сможет успешно воспроизвести видеотрафик, но следующие поддерживаемые каналы должны оставаться доступными:
Эта функция всё ещё в разработке, и некоторые понижения версий в настоящее время неизбежны для установления соединения. Следующее в настоящее время не затрагивается этим переключателем и будет по-прежнему отключено:
ПРИМЕЧАНИЕ: Если возможность в конечном итоге воспроизвести полный сеанс важна, хорошим решением будет запись необработанного RDP-трафика с помощью Wireshark и сохранение главных секретов TLS. Когда PyRDP добавит поддержку дополнительных расширений, станет возможным извлечь из сырой сетевой записи действительный RDP-файл для воспроизведения.
--transparentСообщает PyRDP попытаться подменить исходный IP-адрес клиента, чтобы сервер видел реальный IP-адрес вместо адреса MITM. Эта опция полезна только в определенных сценариях, где MITM физически является шлюзом между клиентами и сервером и видит весь трафик. Конкретные примеры можно найти здесь.
ПРИМЕЧАНИЕ: Для этого требуются права root, работает только в Linux и требует ручной настройки брандмауэра, чтобы трафик маршрутизировался должным образом.
--no-gdi: Отключение ускоренного графического конвейераPyRDP понижает видео до наиболее современного графического конвейера, который он поддерживает. Этот переключатель явно указывает MITM не использовать расширения Ускорение графического интерфейса для потоковой передачи видео. Преимущество этого режима заключается в значительном снижении требуемой пропускной способности для соединений с высоким разрешением.
Обратите внимание, что некоторые команды рисования GDI в настоящее время не реализованы, поскольку они, по-видимому, не используются. Если у вас есть запись, содержащая неподдерживаемую или непроверенную команду, не стесняйтесь поделиться ею с сопровождающими проекта, чтобы поддержка была добавлена по мере необходимости. (Убедитесь, что запись не содержит конфиденциальной информации)
Используйте pyrdp-player для запуска плеера.
Вы можете использовать меню для открытия нового файла записи: File > Open.
Вы также можете открыть файлы записи при запуске плеера:```sh pyrdp-player ...
#### Прослушивание живых соединений
Плеер всегда прослушивает живые соединения. По умолчанию порт прослушивания — 3000, но его можно изменить:```sh
pyrdp-player -p <PORT>
По умолчанию плеер принимает только соединения с локальной машины. Мы не рекомендуем открывать доступ к плееру
для других машин. Если вы всё же хотите изменить адрес прослушивания, это можно сделать с помощью -b:```sh
pyrdp-player -b
#### Прочие аргументы плеера
Запустите `pyrdp-player --help` для получения полного списка аргументов.
### Использование PyRDP Certificate Cloner
ПРИМЕЧАНИЕ: Использование этого инструмента необязательно.
Начиная с версии 1.0 PyRDP генерирует сертификаты на лету точно так же, как это делает данный инструмент.
Клонер сертификатов PyRDP создает совершенно новый сертификат X509, используя значения из сертификата существующего RDP-сервера. Он подключается к RDP-серверу, загружает его сертификат, генерирует новый закрытый ключ и заменяет открытый ключ и подпись сертификата с использованием нового закрытого ключа. Это может быть использовано в пентесте, если, например, вы пытаетесь обмануть легитимного пользователя, заставив его пройти через ваш MITM. Использование сертификата, который выглядит как легитимный, может повысить ваш процент успеха.
#### Клонирование сертификата
Вы можете клонировать сертификат с помощью `pyrdp-clonecert`:```sh
pyrdp-clonecert 192.168.1.10 cert.pem -o key.pem
Параметр -o задает имя пути для создаваемого закрытого ключа.
Если вы хотите использовать свой собственный закрытый ключ вместо генерации нового:```sh pyrdp-clonecert 192.168.1.10 cert.pem -i input_key.pem
#### Другие аргументы клонирования
Выполните `pyrdp-clonecert --help` для получения полного списка аргументов.
### Использование PyRDP Convert
`pyrdp-convert` — это вспомогательный скрипт, который выполняет несколько полезных преобразований из различных входных форматов в различные выходные форматы.
Скрипт с наибольшей вероятностью работает с трафиком, захваченным PyRDP, из-за неподдерживаемых функций протокола RDP, которые могут использоваться в неперехваченном соединении.
Поддерживаются следующие входные данные:
- Захват сети (PCAP) с главными секретами TLS (менее надежен)
- Захват сети (PCAP) в формате экспортированных PDU уровня 7 (более надежен)
- Файл воспроизведения, сгенерированный PyRDP
Поддерживаются следующие выходные данные:
- Видеофайл MP4
- JSON: последовательность низкоуровневых событий, сериализованных в формате JSON
- Файл воспроизведения, совместимый с `pyrdp-player`
Зашифрованные (TLS) захваты сети требуют предоставления главных секретов TLS с помощью `--secrets ssl.log`.```sh
# Export the session coming client 10.2.0.198 to a .pyrdp file.
pyrdp-convert --src 10.2.0.198 --secrets ssl.log -o path/to/output capture.pcap
# Or as an MP4 video
pyrdp-convert --src 10.2.0.198 --secrets ssl.log -o path/to/output -f mp4 capture.pcap
# List the sessions in a network trace, along with the decryptable ones.
pyrdp-convert --list-only capture.pcap
Обратите внимание, что преобразование в MP4 требует libavcodec и ffmpeg, поэтому на Windows могут потребоваться дополнительные действия.
Вручную расшифрованные сетевые трассы можно экспортировать из Wireshark, выбрав File > Export PDUs и указав OSI Layer 7.
Сначала убедитесь, что вы настроили Wireshark на загрузку секретов TLS:

Затем экспортируйте PDU уровня 7 OSI:

И, при необходимости, отфильтруйте трассу, оставив только интересующие сеансы, применив фильтр отображения и нажав File > Export Specified Packets...

Теперь эту трассу можно напрямую использовать в pyrdp-convert.
Большая часть конфигурации PyRDP выполняется через параметры командной строки, но также можно использовать файл конфигурации для некоторых настроек, таких как конфигурация журналирования.
Файлы конфигурации по умолчанию, используемые PyRDP, находятся в mitm.default.ini и player.default.ini. Оба файла подробно документированы и могут служить основой для дальнейшей настройки.
В будущем планируется поддерживать другие аспекты конфигурации PyRDP через эти файлы.
Если вы заинтересованы в экспериментах с RDP и создании собственных инструментов, перейдите в наш раздел документации для получения дополнительной информации.
Компонент MITM PyRDP также реализован как плагин twistd. Это позволяет запускать его в режиме отладки и получать интерактивную отладочную консоль (pdb) при отправке сигнала SIGUSR2 процессу twistd. См. документацию twistd для получения дополнительной информации.
Мы разработали собственный модуль Bettercap, rdp.proxy, для перехвата всех RDP-соединений в локальной сети (атака «Man-in-the-Middle»). Ознакомьтесь с этим документом для получения дополнительной информации.
Поскольку Docker ограничивает взаимодействие с хост-системой (файловая система и сеть), образ Docker PyRDP должен запускаться с некоторыми параметрами в зависимости от вашего сценария использования. В этом разделе описаны эти параметры.
Мы ссылаемся на публично предоставляемый образ Docker, но если вы собрали свой собственный, замените gosecure/pyrdp на имя вашего локально собранного образа.
В большинстве случаев перехвата («Monster-in-the-Middle») вам потребуется пробросить порт вашего хоста в образ Docker. Это достигается с помощью параметров --publish (-p) команды docker run.
Например, чтобы прослушивать порт 3389 (порт RDP по умолчанию) на всех интерфейсах, используйте:```sh docker run -p 3389:3389 gosecure/pyrdp pyrdp-mitm 192.168.1.10
#### Хранение журналов и артефактов
Для постоянного хранения вывода PyRDP (журналы, файлы и т.д.) добавьте опцию `--volume` (`-v`) к предыдущей команде. В этом примере мы сохраняем файлы относительно текущего каталога в `pyrdp_output`:```sh
docker run -v $PWD/pyrdp_output:/home/pyrdp/pyrdp_output -p 3389:3389 gosecure/pyrdp pyrdp-mitm 192.168.1.10
Убедитесь, что ваш целевой каталог принадлежит пользователю с UID 1000, иначе вы получите ошибки отказа в доступе. Если вы единственный не-root пользователь в системе, обычно вашему пользователю назначается UID 1000.
Если вы хотите, чтобы PyRDP записывал IP-адрес хоста в свои логи, вы можете задать переменную окружения HOST_IP при использовании docker run:```sh
docker run -p 3389:3389 -e HOST_IP=192.168.1.9 gosecure/pyrdp pyrdp-mitm 192.168.1.10
#### Использование графического плеера в Docker
Для использования плеера необходимо экспортировать переменную окружения `DISPLAY` из хоста в Docker.
Это перенаправляет графический интерфейс плеера на экран хоста.
Также нужно открыть сеть хоста и запретить Qt использовать расширение разделяемой памяти X11 MIT-SHM.
Для этого добавьте опции `-e` и `--net` в команду run:```sh
docker run -e DISPLAY=$DISPLAY -e QT_X11_NO_MITSHM=1 --net=host gosecure/pyrdp pyrdp-player
Имейте в виду, что открытие сети хоста для docker может нарушить изоляцию между вашим контейнером и хостом. Если вы планируете использовать плеер, то X11 forwarding через SSH-соединение будет более безопасным способом.
Процесс конвертации видео зависит от PyAV, ffmpeg и QT, поэтому вам понадобится обычный образ docker, а не slim.
Вам нужно подключить том (-v) для обмена файлами с контейнером.
Здесь мы сопоставляем нашу локальную директорию с /shared/ в контейнере.```sh
docker run -e QT_QPA_PLATFORM=offscreen -v $PWD/:/shared gosecure/pyrdp pyrdp-convert -f mp4 <filename-relative-to-volume-in-/shared/> -o /shared/
Переменная окружения `QT_QPA_PLATFORM=offscreen` требуется [из-за ошибки, описанной здесь](https://github.com/GoSecure/pyrdp/issues/428). Она сообщает QT, что отсутствие графического окружения является корректным.
## История PyRDP
* [Вводный пост в блоге](https://www.gosecure.net/blog/2018/12/19/rdp-man-in-the-middle-smile-youre-on-camera), в котором мы [продемонстрировали, что можем поймать реального злоумышленника в действии](https://www.youtube.com/watch?v=eB7RC9FmL6Q)
* [Доклад на NorthSec 2019](https://docs.google.com/presentation/d/1avcn8Sh2b3IE7AA0G9l7Cj5F1pxqizUm98IbXUo2cvY/edit#slide=id.g404b70030f_0_581), где были продемонстрированы два демо:
* [Первое демо](https://youtu.be/5JztJzi-m48): логирование учётных данных, кража буфера обмена, просмотр файлов на стороне клиента и перехват сеанса
* [Второе демо](https://youtu.be/bU67tj1RkMA): выполнение полезных нагрузок cmd или powershell при успешной аутентификации клиента
* [Логотип PyRDP](https://github.com/gosecure/pyrdp/blob/HEAD/docs/pyrdp-logo.png) распространяется по лицензии CC-BY-SA 4.0.
* [Слайды BlackHat USA Arsenal 2019](https://docs.google.com/presentation/d/17P_l2n-hgCehQ5eTWilru4IXXHnGIRTj4ftoW4BiX5A/edit?usp=sharing)
* [Слайды DerbyCon 2019](https://docs.google.com/presentation/d/1UAiN2EZwDcmBjLe_t5HXB0LzbNclU3nnigC-XM4neIU/edit?usp=sharing) ([Видео](https://www.youtube.com/watch?v=zgt3N6Nrnss))
* [Блог: PyRDP на автопилоте](https://www.gosecure.net/blog/2020/02/26/pyrdp-on-autopilot-unattended-credential-harvesting-and-client-side-file-stealing/)
* [Блог: PyRDP 1.0](https://www.gosecure.net/blog/2020/10/20/announcing-pyrdp-1-0/)
* [Демо-лаборатории DefCon 2020](https://www.youtube.com/watch?v=1q2Eo3x3u0g)
* [Блог: Захват хэшей RDP NetNTLMv2: детали атаки и техническое руководство](https://www.gosecure.net/blog/2022/01/17/capturing-rdp-netntlmv2-hashes-attack-details-and-a-technical-how-to-guide/)
* [Слайды BlackHat USA Arsenal 2021](https://gosecure.github.io/presentations/2021-08-05_blackhat-usa/BlackHat-USA-21-Arsenal-PyRDP-OlivierBilodeau.pdf)
* [Презентация: Я наблюдал, как вы бросаете кости: непревзойдённый мониторинг RDP раскрывает тактику злоумышленников](http://i.blackhat.com/BH-US-23/Presentations/US-23-Bilodeau-I-Watched-You-Roll-the-Die-Unparalleled-RDP-Monitoring.pdf) на BlackHat USA 2023
## Вклад в PyRDP
См. наши [руководство по внесению вклада](https://github.com/gosecure/pyrdp/blob/HEAD/CONTRIBUTING.md).
## Благодарности
PyRDP использует код из следующего программного обеспечения с открытым исходным кодом:
- [RC4-Python](https://github.com/bozhu/RC4-Python) для реализации RC4.
- [rdesktop](https://github.com/rdesktop/rdesktop) для декомпрессии растровых изображений.
- [rdpy](https://github.com/citronneur/rdpy) для ключей RC4, привязок декомпрессии растровых изображений и базового GUI-кода для плеера PyRDP.
- [FreeRDP](https://github.com/FreeRDP/FreeRDP) для перечисления скан-кодов.