
RDPモンスターインザミドル(MITM)およびPython用ライブラリで、接続をライブまたは事後的に監視する機能を備えています。
PyRDP は、Python で書かれた Remote Desktop Protocol (RDP) Monster-in-the-Middle (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 コンテナを使用する方法の 2 つです。
ソースからのインストールや Docker コンテナの自作については、開発ドキュメント を参照してください。
まず、必要なパッケージをインストールしてください (以下は Ubuntu 22.04 用のリストです。他のディストリビューションでは調整が必要かもしれません)。フルインストールとスリムインストールの 2 種類を提供しています。ユースケースに応じて依存関係をインストールしてください。```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 StoreのPythonは私の環境では動作しませんでした。 Scoop 経由でPythonをインストールすることをお勧めします。```sh scoop install python # if not installed already scoop install pipx pipx ensurepath
ログアウトしてから再度ログインしてください(PATHを更新するため)。
##### その他のOS
他のオペレーティングシステムに `pipx` をインストールするには、こちらを参照してください: <https://github.com/pypa/pipx#install-pipx>
#### インストール
QT GUI とキャプチャを動画に変換する機能を備えた PyRDP のフルエクスペリエンスを得るには:```sh
pipx install pyrdp-mitm[full]
ヘッドレス環境(サーバー、RaspberryPi)で実行することを目的としたコンパクト版の場合:```sh pipx install pyrdp-mitm
準備完了ですを参照してください。
### 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`タグは`main`ブランチからビルドされたDockerイメージです。
## 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
When running the MITM for the first time a directory called pyrdp_output/
will be created relative to the current working directory.
Here is an example layout of that directory:```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`: TLSマスターシークレット(Wireshark互換の形式で保存)
* `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 を強制するサーバーは攻撃がより困難です。 使用できる戦略は3つあります。
サーバーの証明書と秘密鍵にアクセスできる場合、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を適用しないことがわかっているサーバーにリダイレクトするために使用でき、攻撃者の制御下にあるVMにリダイレクトすることも可能です。
この機能を有効にするには、代替ホストのアドレスとポートを次のように指定します:```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 などのクラッキングツールが読み取れる形式になっています。
このテクニックはブログ記事で詳しく説明されています: Capturing RDP NetNTLMv2 Hashes: Attack details and a Technical How-To Guide
この機能は --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プレイヤーに接続する
サーバー上でMITMを実行していて、それでもライブのRDP接続を確認したい場合は、
[SSHリモートポートフォワーディング](https://www.booleanworld.com/guide-ssh-port-forwarding-tunnelling/)
を使用して、サーバー上のポートを自分のマシンのプレイヤーポートに転送してください。これが完了したら、転送されたポートと`127.0.0.1`をMITMに引数として渡します。例えば、サーバーのポート4000が自分のマシンのプレイヤーポートに転送されている場合、使用するコマンドは次のようになります:
cd pyrdp-mitm pyrdp-mitm.py 127.0.0.1 4000
pyrdp-mitm 192.168.1.10 -i 127.0.0.1 -d 4000
```
#### 新しい接続でのペイロードの実行
PyRDPは、新しい接続が行われたときにコンソールコマンドやPowerShellペイロードを自動的に実行する機能をサポートしています。
RDPの性質上、このプロセスはややハック的であり、常に100%信頼できるわけではありません。仕組みは次のとおりです:
1. ユーザーが認証されるのを待ちます。
2. ペイロードを隠し、干渉を防ぐためにクライアントの入出力をブロックします。
3. 偽のWindows+Rキーシーケンスを送信し、`cmd.exe`を実行します。
4. ペイロードをコンソールコマンドとして実行し、コンソールを終了します。PowerShellペイロードが設定されている場合は、`powershell -enc <PAYLOAD>`で実行されます。
5. ペイロードが完了するまで少し待ちます。
6. クライアントの入出力を復元します。
これを機能させるには、3つの引数を設定する必要があります:
- ペイロード
- ペイロード開始前の遅延
- ペイロードの持続時間
##### ペイロードの設定
ペイロードを設定するには、次の引数のいずれかを使用できます:
- `--payload`:コンソールコマンドを含む文字列
- `--payload-powershell`:PowerShellコマンドを含む文字列
- `--payload-powershell-file`:PowerShellスクリプトへのパス
##### ペイロードの開始タイミングの選択
現時点では、PyRDPはユーザーがログオンしたタイミングを検出しません。
ペイロードを実行する前に待機する時間を指定する必要があります。
この時間が経過すると、偽のキーシーケンスを送信し、ペイロードが正しく実行されることを期待します。
これを行うには、`--payload-delay`引数を使用します。遅延はミリ秒単位です。
例えば、ユーザーが最初の5秒以内にログインすると予想される場合、次の引数を使用します:```sh
--payload-delay 5000
```
RDPDRの初期化中に交換される一部のメッセージを活用することで、これをより正確にすることができます。
これをより良く動作させることに興味があれば、[こちらのIssue](https://github.com/GoSecure/pyrdp/issues/98)を参照してください。
##### 通常活動を再開するタイミングの選択
コンソールの実行がいつ停止したかを直接知る方法がないため、クライアントの入出力をブロックする時間をPyRDPに指定する必要があります。ペイロードを実行しているコンソールが表示されていると予想される最大時間に設定することを推奨します。言い換えれば、ペイロードの完了にかかると予想される時間です。
ペイロードの持続時間を設定するには、`--payload-duration` 引数にミリ秒単位の時間を指定します。
例えば、ペイロードの完了に最大5秒かかると予想される場合、次の引数を使用します。```sh
--payload-duration 5000
```
これにより、クライアントの入出力が5秒間ブロックされ、コンソールが隠されて干渉が防止されます。
5秒後、入出力は通常に復元されます。
#### その他のMITM引数
引数の完全なリストは `pyrdp-mitm --help` を実行してください。
##### `--no-downgrade`
この引数は、ハニーポットシナリオでPyRDPを実行する際にスキャナーのフィンガープリントを回避するのに役立ちます。
スイッチが有効になると、PyRDPはサポートされていない拡張機能をダウングレードせず、トラフィックを透過的に通過させます。
プレイヤーはおそらくビデオトラフィックを正常にリプレイできなくなりますが、以下のサポートされているチャネルには引き続きアクセスできます。
- キーストローク記録
- マウス位置の更新
- クリップボードアクセス(受動的)
- ドライブアクセス(受動的)
この機能はまだ開発中であり、接続を確立するために一部のダウングレードは現在避けられません。以下は現在このスイッチの影響を受けず、引き続き無効になります。
- FIPS暗号化
- 非TLS暗号化プロトコル
- ClientInfo圧縮
- 仮想チャネル圧縮
**注記**: 最終的に完全なセッションをリプレイできることが重要な場合、良い解決策はWiresharkを使用して生のRDPトラフィックを記録し、TLSマスターシークレットを保持することです。PyRDPが追加の拡張機能のサポートを追加するたびに、生のネットワークキャプチャから有効なRDPリプレイファイルを抽出することが可能になります。
##### `--transparent`
PyRDPにクライアントの送信元IPアドレスを偽装するよう指示し、サーバーがMITMのIPアドレスではなく実際のIPアドレスを認識するようにします。このオプションは、MITMが物理的にクライアントとサーバー間のゲートウェイであり、すべてのトラフィックを監視する特定のシナリオでのみ役立ちます。
[具体的な例はこちらにあります。](https://github.com/gosecure/pyrdp/blob/HEAD/docs/transparent-proxy.md)
**注記**: これにはroot権限が必要で、Linuxでのみ動作し、トラフィックが適切にルーティングされるように手動でファイアウォールを設定する必要があります。
##### `--no-gdi`: Disable Accelerated Graphics Pipeline
PyRDPはビデオを、サポートする最新のグラフィックスパイプラインにダウングレードします。このスイッチは、MITMに対して[Graphics Device Interface Acceleration][gdi]拡張機能を使用してビデオをストリーミングしないように明示的に指示します。このモードの利点は、高解像度接続のための必要な帯域幅が大幅に削減されることです。
一部のGDI描画オーダーは現在未実装であることに注意してください。これらは使用されていないようです。未サポートまたは未テストのオーダーを含むリプレイがある場合は、プロジェクトメンテナに遠慮なく共有してください。必要に応じてサポートが追加されます。(トレースに機密情報が含まれていないことを確認してください)
[gdi]: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpegdi/745f2eee-d110-464c-8aca-06fc1814f6ad
### PyRDPプレイヤーの使用
プレイヤーを実行するには `pyrdp-player` を使用します。
#### リプレイファイルの再生
メニューを使用して新しいリプレイファイルを開くことができます: ファイル > 開く。
プレイヤー起動時にリプレイファイルを開くこともできます。```sh
pyrdp-player <FILE1> <FILE2> ...
```
#### ライブ接続の待ち受け
プレイヤーは常にライブ接続を待ち受けます。デフォルトの待ち受けポートは3000ですが、変更可能です。```sh
pyrdp-player -p <PORT>
```
#### リスニングアドレスの変更
デフォルトでは、プレイヤーはローカルマシンからの接続のみをリッスンします。プレイヤーを他のマシンに公開することは推奨しません。それでもリスニングアドレスを変更したい場合は、`-b` を使用して行えます。```sh
pyrdp-player -b <ADDRESS>
```
#### その他のプレイヤー引数
すべての引数の一覧は `pyrdp-player --help` を実行してください。
### PyRDP証明書クローンツールの使用
注意: このツールの使用は任意です。
バージョン1.0以降、PyRDPはこのツールが行うのとまったく同様にその場で証明書を生成します。
PyRDP証明書クローンツールは、既存のRDPサーバーの証明書の値を使用して、真新しいX509証明書を作成します。RDPサーバーに接続し、その証明書をダウンロードし、新しい秘密鍵を生成し、その新しい秘密鍵を使用して証明書の公開鍵と署名を置き換えます。これは、例えば、正規のユーザーをあなたのMITM経由で通過させるように騙そうとするペネトレーションテストで使用できます。正規の証明書のように見える証明書を使用することで、成功率を高めることができます。
#### 証明書のクローン作成
`pyrdmp-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 プロトコル機能によるものです。
以下の入力形式がサポートされています:
- TLS マスターシークレットを含むネットワークキャプチャ (PCAP) (信頼性が低い)
- エクスポートされた PDU レイヤー7 形式のネットワークキャプチャ (PCAP) (信頼性が高い)
- PyRDP によって生成されたリプレイファイル
以下の出力形式がサポートされています:
- MP4 ビデオファイル
- JSON: JSON 形式でシリアライズされた低レベルイベントのシーケンス
- `pyrdp-player` 互換のリプレイファイル
暗号化 (TLS) ネットワークキャプチャでは、`--secrets ssl.log` を使用して TLS マスターシークレットを提供する必要があります。```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シークレットを読み込むように設定していることを確認してください。

次に、OSIレイヤー7のPDUをエクスポートします:

また、オプションとして、表示フィルターを適用して`File > Export Specified Packets...`をクリックすることで、目的の会話のみを含むようにトレースをフィルタリングできます。

これで、このトレースは`pyrdp-convert`で直接使用できます。
### PyRDPの設定
PyRDPの設定のほとんどはコマンドラインスイッチで行われますが、ログ設定などの特定の設定については設定ファイルを使用することもできます。
PyRDPで使用されるデフォルトの設定ファイルは、[mitm.default.ini](https://github.com/gosecure/pyrdp/blob/HEAD/pyrdp/mitm/mitm.default.ini)と[player.default.ini](https://github.com/gosecure/pyrdp/blob/HEAD/pyrdp/player/player.default.ini)にあります。両方のファイルは詳細に文書化されており、さらなる設定の基礎として使用できます。
将来的には、それらの設定ファイルを通じてPyRDP設定の他の側面をサポートする計画があります。
### 高度な使用法
#### PyRDPをライブラリとして使用する
もしRDPを試してみたり、独自のツールを作ったりすることに興味があれば、詳細については当社の[ドキュメントセクション](https://github.com/gosecure/pyrdp/blob/HEAD/docs/README.md)を参照してください。
#### twistdと一緒にPyRDPを使用する
PyRDP MITMコンポーネントは、twistdプラグインとしても実装されています。これにより、デバッグモードで実行でき、twistdプロセスに`SIGUSR2`を送信すると、インタラクティブなデバッグREPL(pdb)を取得できます。詳細については、[twistdドキュメント](https://github.com/gosecure/pyrdp/blob/HEAD/docs/twistd.md)を参照してください。
#### Bettercapと一緒にPyRDPを使用する
私たちは、特定のLAN上のすべてのRDP接続を中間者攻撃するために、独自のBettercapモジュール`rdp.proxy`を開発しました。詳細については、[このドキュメント](https://github.com/gosecure/pyrdp/blob/HEAD/docs/bettercap-rdp-mitm.md)を参照してください。
### Docker固有の使用手順
Dockerはホストシステム(ファイルシステムとネットワーク)とのやり取りを制限するため、PyRDP Dockerイメージは使用事例に応じていくつかのパラメータを指定して実行する必要があります。このセクションでは、それらのパラメータについて説明します。
公開されているDockerイメージを参照していますが、[自分でビルドした場合](https://github.com/gosecure/pyrdp/blob/HEAD/docs/devel.adoc)は、`gosecure/pyrdp`をローカルでビルドしたイメージ名に置き換えてください。
#### リスニングポートのマッピング
ほとんどの中間者攻撃のケースでは、ホストのポートをDockerイメージにマッピングする必要があります。これは、`docker run`に適用される`--publish`(`-p`)パラメータによって実現されます。
例えば、すべてのインターフェースで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が割り当てられます。
#### ホストIPアドレスのログ記録
PyRDPがログにホストIPアドレスを記録するようにしたい場合は、`docker run`を使用するときに`HOST_IP`環境変数を設定できます:```sh
docker run -p 3389:3389 -e HOST_IP=192.168.1.9 gosecure/pyrdp pyrdp-mitm 192.168.1.10
```
#### Docker内のGUIプレイヤーの使用
プレイヤーを使用するには、ホストからDockerに`DISPLAY`環境変数をエクスポートする必要があります。
これにより、プレイヤーのGUIがホスト画面にリダイレクトされます。
また、ホストのネットワークを公開し、QtがMIT-SHM X11共有メモリ拡張機能を使用しないようにする必要があります。
これを行うには、実行コマンドに`-e`オプションと`--net`オプションを追加します。```sh
docker run -e DISPLAY=$DISPLAY -e QT_X11_NO_MITSHM=1 --net=host gosecure/pyrdp pyrdp-player
```
Dockerでホストのネットワークを公開すると、コンテナとホストの間の分離が損なわれる可能性があることに注意してください。
プレイヤーを使用する予定がある場合は、SSH接続を介したX11転送の方がより安全な方法です。
#### Docker内で動画を変換する
動画変換プロセスはPyAV、ffmpeg、QTに依存しているため、通常のDockerイメージ(スリムではない方)が必要です。
コンテナとファイルを共有するには、ボリュームマウント(`-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) では、2つのデモが行われました:
* [最初のデモ](https://youtu.be/5JztJzi-m48): 資格情報のログ、クリップボードの窃取、クライアント側のファイルブラウジング、セッションの乗っ取り
* [2番目のデモ](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 Slides](https://docs.google.com/presentation/d/17P_l2n-hgCehQ5eTWilru4IXXHnGIRTj4ftoW4BiX5A/edit?usp=sharing)
* [DerbyCon 2019 Slides](https://docs.google.com/presentation/d/1UAiN2EZwDcmBjLe_t5HXB0LzbNclU3nnigC-XM4neIU/edit?usp=sharing) ([Video](https://www.youtube.com/watch?v=zgt3N6Nrnss))
* [Blog: PyRDP on Autopilot](https://www.gosecure.net/blog/2020/02/26/pyrdp-on-autopilot-unattended-credential-harvesting-and-client-side-file-stealing/)
* [Blog: PyRDP 1.0](https://www.gosecure.net/blog/2020/10/20/announcing-pyrdp-1-0/)
* [DefCon 2020 Demo Labs](https://www.youtube.com/watch?v=1q2Eo3x3u0g)
* [Blog: Capturing RDP NetNTLMv2 Hashes: Attack details and a Technical How-To Guide](https://www.gosecure.net/blog/2022/01/17/capturing-rdp-netntlmv2-hashes-attack-details-and-a-technical-how-to-guide/)
* [BlackHat USA Arsenal 2021 Slides](https://gosecure.github.io/presentations/2021-08-05_blackhat-usa/BlackHat-USA-21-Arsenal-PyRDP-OlivierBilodeau.pdf)
* [Presentation: I Watched You Roll the Die: Unparalleled RDP Monitoring Reveal Attackers' Tradecraft](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 キー、ビットマップ伸張バインディング、および PyRDP プレイヤーのベース GUI コードのため
- [FreeRDP](https://github.com/FreeRDP/FreeRDP) スキャンコード列挙のため