本稿では、RDPセッション中にメッセージを送信するハイジャックされたキーストロークを実演することで、SSLベースのRDP接続に対する証明書の警告を無視するユーザーが、なぜ中間者攻撃につながる可能性があるのかを説明し、そのような攻撃の犠牲者にならないようにするためのいくつかの提案で締めくくります。
RDP接続の種類
はじめに、この記事では3種類のRDP接続について説明します:
- RDPセキュリティ・レイヤー
- SSL(TLS 1.0)
- CredSSP (SSL with NLA)この記事では、真ん中のタイプであるSSL(TLS 1.0)について説明します。ターミナルサーバーでは、SSLは通常次のように設定されます:
RDP使用時の設定
サーバが "Negotiate "に設定されている場合、そのセキュリティ層がSSLを使用している可能性があるため、一部の接続に脆弱性が含まれている可能性があります。
SSL証明書に関する警告
もし、接続のたびに次のような警告が表示されるのに、注意を払わないユーザーがいるとしたら、この記事はそのようなユーザーに向けたものです:
常習的に無視されがちなSSL警告
攻撃プロフィール
より高いレベルでは、この攻撃は他のSSL中間者攻撃と似ています:
1.被害者を、接続先のRDPサーバーではなく、システム上のPoCツールに接続させる方法を見つけます。
2.このツールはRDPプロトコルを使用し、SSLを使用するようにネゴシエートされます。
3.SSLを使用して接続がネゴシエートされると、ツールは独自のSSL証明書を使用してRDPクライアントとSSL接続をネゴシエートします。これにより、なりすましツールはRDPクライアントが送信するメッセージの平文にアクセスできるようになります。
4.このツールは、RDPクライアントからそのサーバにデータを送信するために、通常のRDPサーバへのSSL接続を作成する必要もあります。
この攻撃の唯一の欠点は、必要なSSL接続を作成する際に、なりすましツールがRDPプロトコルを介してクライアントと短時間やりとりしなければならないことです。
1.被害者をここに接続させます
実際の攻撃では、RDP クライアントを標的サーバではなくシステムに接続させる必要があります。この記事では、被害者のRDPクライアントを攻撃者のシステムに接続させるためのスプーフィングに成功したとして、これらの詳細については説明しません。
攻撃側のシステムでPoCツールを起動し、通常のRDPサーバー192.168.2.96に接続するように指示します:
$ ./rdp-ssl-mitm.py -r192.:3389
[+] Listening forconnections on 0.0.0.0:8339RDPクライアントに攻撃システムのIPアドレスを入力するだけです:
攻撃者のIPを直接入力し、ARPスプーフィングステップをスキップします。
2、SSLを使用したRDPクライアントとの対話
SSLネゴシエーションは、RDPプロトコルの中では非常に短いものです:
Message #1: Client >MiTM > Server
03 00 00 13 0e e0 00 00 00 00 00 01 00 0800 *03*
00 00 00このメッセージは静的で変更されず、スプーフィングツールは変更せずに直接サーバに渡します。03*は、クライアントがRDPセキュリティレイヤ、CredSSP付きSSLをサポートしていることを示します。
Message #2: Server >MiTM > Client
03 00 00 13 0e d0 00 00 12 34 00 02 00 0800 *01*
00 00 00次のメッセージはサーバが使用するプロトコルを示し、*01*はサーバがSSLを使用することを選択したことを示します(*02*はCredSSPを示します)。このメッセージもそのままクライアントに渡されます。
サーバが CredSSP (*02*) を選択している場合、このデモは失敗します。
3、RDPクライアントでSSL接続を作成します。
Message #3: Client >MiTM3番目のメッセージはSSL接続を開始するために使われます。ここでは、SSL クライアントメッセージは *16 0301* で始まります。
*16 03 01* 00 5a 01 00 00 56 03 01 52 21 acbe 63
20 ce de 4b a5 90 18 f0 66 97 ee 9d 54 14e3 1c
... snip ...なりすましツールは、このデータをサーバーに直接送信する代わりに、クライアントとのSSL接続を完了する間に、サーバーに直接接続を作成するリクエストを送信します。
ここで使用されているSSL証明書はRDPクライアントによって不正とみなされ、mstscでSSL警告がユーザーに表示されます:
PoCツールで使用される証明書によるセキュリティ警告
ユーザーが注意深く調べれば、ここで使われているSSL証明書と通常の証明書には違いがあることがわかるでしょう。攻撃の質を向上させるために、証明書は本物の証明書に限りなく近づけるように常に改良される必要がありますが、通常の証明書と同じ署名を得ることはないので、常に多少の違いがあります。
4.RDPサーバーとのSSL接続の作成
同時に、このツールはRDPサーバにCreate Connectionメッセージを送信し、2つ目のSSL接続を作成します。
キー情報の表示
この時点で、なりすましツールは、RDPクライアントからサーバーに送信されたすべてのキーストロークを明示的に表示できます。どのようなメッセージが送信されたかを判断するのは簡単で、次の2つの4バイトメッセージは、「p」キーが押されたときに送信されたものです。
第3バイトはキーの方向を示します。4バイト目はキーのスキャンコードで、クエリによって0×19が文字 "p "のキーに対応することがわかります。
多くの場合、文字に対応するスキャンコードは使用するキーボードに依存します。私が使用しているPoCツールでは、QWERTYキーボードへのマッピングが実装されているため、リーダーがUK/USキーボードを使用している場合、ツールはほとんどのスキャンコードを対応する文字に直接変換することができます。文字が大文字か小文字かを知る方法はないので、CAPSLockキーとSHIFTキーの状態によって判断する必要があることに注意してください。
さて、さっそく例を見てみましょう。記録されたキーストロークと、ログインしているユーザー名AdministratorとパスワードPasswordを示すPoCツールの出力です:
$ ./rdp-ssl-mitm.py -r 192.:3389
[+] Listening for connections on0.0.0.0:3389
[+] Incoming connection from192.168.190.1:60370
[+] New outgoing request to192.:3389 (SSL: 0)
[+] Connected
[+] Detected incoming SSL connection.Turning self into SSL socket
[+] Incoming connection from192.168.190.1:60374
[+] New outgoing request to192.:3389 (SSL: 0)
[+] Connected
[+] Detected incoming SSL connection.Turning self into SSL socket
<LShift-down>A<LShift-up>DMINISTRATOR<Tab><LShift-down>P<LShift-up>ASSWORD<Enter>概要
RDP 接続で SSL 認証の警告を無視する習慣は、HTTPS サイトで証明書を無視するのと同じ結果を招きます。このような攻撃は、ユーザ名、パスワード、キー入力などの機密情報を傍受する可能性があります。
RDPクライアントによって信頼され、認証局によって署名されたSSL証明書の使用は、通常、警告プロンプトが表示されません。
この攻撃は、サーバーがNLAを許可した場合にも失敗するので、NLAも強く推奨されます。
しかし、これはRDPクライアントやサーバソフトウェアの脆弱性ではなく、この悪用方法も新たに発見されたものではないことを知っておくことが重要です。これは、ユーザーがセキュリティ警告を無視した場合に発生する可能性のある、RDP使用の脆弱な機能に過ぎず、技術的なレベルでは、一般的なSSL中間者攻撃に過ぎません。
[ポートカリス経由]





