
이 프로젝트는 최신 OpenSSH가 미묘한 응답 또는 타이밍 차이를 통해 유효한 사용자 이름을 노출하는지 여부를 탐구합니다. Ubuntu 22.04.5 LTS의 통제된 실험실에서 CVE-2016-6210 사용자 열거 조사( Welch의 t-검정, Cohen's d, 탐지 엔지니어링 )를 수행하며, 이러한 시도가 남기는 흔적과 이를 탐지하는 방법도 함께 분석합니다.
널리 알려진 OpenSSH 사용자 이름 열거 취약점을 통계적 분석을 사용하여 재현 가능하게 재조사합니다.
이 프로젝트는 문서화된 OpenSSH 타이밍 사이드 채널인 CVE-2016-6210을 재조사하여, 기본 PAM 구성을 사용하는 최신 Ubuntu Server에서 여전히 관찰 가능한지 확인합니다.
게시된 동작이 여전히 유효하다고 가정하지 않고, 이 프로젝트는 Welch의 t-검정과 Cohen의 d를 사용하여 수동 프로빙, Hydra, Metasploit을 통해 수집된 인증 타이밍 측정값을 평가하여, 측정 노이즈로부터 진정한 타이밍 신호를 구별합니다.
이 연구는 테스트된 기본 구성에서 통계적으로 유의미한 타이밍 차이가 없음을 발견하여, 게시된 보안 주장에 대한 재현 가능한 실험과 증거 기반 검증의 가치를 입증했습니다.
⚠️ 법적 고지
이 프로젝트는 자체 소유의 격리된 실험실 환경에서 완전히 수행되었습니다. 모든 결과는 테스트된 구성에만 적용됩니다. 소유하지 않거나 명시적인 서면 허가를 받지 않은 시스템을 절대 테스트하지 마십시오.
사용자 열거 - 유효한 자격 증명 없이 특정 사용자 이름이 원격 시스템에 존재하는지 확인할 수 있는 능력입니다. 이는 계정 손상으로 이어지는 공격 체인의 첫 번째 중요한 단계입니다.``` Reconnaissance → [User Enumeration] → Password Attack → Access ↑ This project investigates here
If an attacker can distinguish "this user exists" from "this user does not exist" by analysing server responses, they can dramatically reduce the keyspace for subsequent
brute force or credential stuffing attacks.
SSH is a frequent target because it is nearly universally exposed, handles password authentication, and older implementations had measurable timing differences between valid and invalid usernames (CVE-2016-6210).
**This investigation asks two questions:**
1. Does modern OpenSSH on Ubuntu 22.04.5 LTS with default configuration leak username existence
via response messages, timing, or tool-reported signals?
2. If an attacker makes the attempt regardless, what artefacts does it leave? and how
reliably can those be detected?
---
## 🖥️ Lab Setup
All testing was performed in a fully isolated host-only virtual network with no internet
exposure.
| 머신 | OS | 역할 | IP | SSH 버전 |
|----------|---------------------------|-----------------------------------------|------------------|------------------|
| 공격자 | Kali Linux 2024.1 | 공격 도구, 분석 스크립트 | 192.168.56.5 | — |
| 타겟 | Ubuntu Server 22.04.5 LTS | OpenSSH를 **기본** 설정으로 실행 중 | 192.168.56.10 | OpenSSH 8.9p1 |
**타겟 SSH 설정 (`/etc/ssh/sshd_config` 기본값):**```
PasswordAuthentication yes
UsePAM yes # Key setting — normalises timing via dummy hash
PermitRootLogin prohibit-password
MaxAuthTries 6
LogLevel INFO
UsePAM yes는 중요한 강화 설정입니다. 이 설정은 OpenSSH가 존재하지 않는 사용자에 대해 더미 bcrypt 계산을 수행하도록 하여, 실제 비밀번호 확인과 타이밍을 일치시킵니다.
이는 CVE-2016-6210에 대한 대응책으로 특별히 도입되었습니다.
각 공격 방법은 깨끗한 로그 상태에서 독립적인 시험으로 실행되었습니다:```bash
sudo truncate -s 0 /var/log/auth.log
sudo cp /var/log/auth.log ~/evidence/trial-N-auth.log
Evidence collected per trial:
- Tool stdout/stderr (saved verbatim)
- `/var/log/auth.log` from target
- Response timing samples via `time.perf_counter()` in `manual_ssh.py`
- SSH banner grabbed before any auth attempt
### 공격 방법
| 방법 | 도구 | 단어 목록 | 목적 |
|-----------------------|--------------------------------------|-------------------------|-------------------------------------------------|
| 수동 SSH | `ssh` CLI + Paramiko | 50개의 일반적인 사용자 이름 | 기준; 원시 응답 검사 |
| Hydra 무차별 대입 | `hydra` | 동일한 50개 | 자동화; Hydra 내장 열거 모드 활용 |
| Metasploit 모듈 | `auxiliary/scanner/ssh/ssh_enumuser` | 동일한 50개 | 프레임워크 전용 열거 모듈 |
| 배너 지문 수집 | 사용자 정의 `BannerFingerprinter` | N/A | 인증 없는 버전 유출, CVE 확인 |
| 타이밍 분석 | 사용자 정의 `ResponseAnalyzer` | 유효 vs 무효 서브셋 | 통계적 부채널 확인 |
---
## 구축된 내용
이 프로젝트는 단순히 도구를 실행하는 것을 넘어, 각 공격과 모든 탐지 로직을 구조화된 Python 코드베이스로 감싸고, 파이프라인 전체를 처음부터 끝까지 실행하는 오케스트레이터를 제공합니다.
### 공격 도구 (`src/attack_tools/`)
**`ManualSSHEnumerator`** — 각 사용자 이름을 `paramiko`로 N번 테스트하여 정확한 타이밍, 결과 유형 및 SSH 배너를 기록합니다. 사용자 이름별 평균 및 표준편차를 계산합니다. 중요한 점은, 시도 간에 연결을 재사용하지 않으므로 각 샘플이 전체 서버 측 처리 시간을 포착합니다.
**`BannerFingerprinter`** — 원시 TCP 소켓을 통해 SSH 배너를 가져옵니다 (자격 증명 필요 없음). 구현 이름, 버전 문자열 및 OS 힌트를 파싱합니다. 로컬 CVE 레지스트리와 교차 참조합니다. `OpenSSH_8.9p1 Ubuntu-3ubuntu0.6`와 같은 버전은 정확한 서버 소프트웨어를 드러내며, 잠재적으로 인증 시도 전에 알려진 취약점을 식별할 수 있습니다.
**`HydraAutomation`** — Hydra 주변의 서브프로세스 래퍼. stdout을 파싱하여 성공적인 로그인, 오류 메시지 및 Hydra 자체 열거 판정(`does not support user enumeration`)을 추출합니다.
**`MetasploitScanner`** — 임시 리소스 스크립트를 작성하고 서브프로세스를 통해 `msfconsole`을 구동합니다. 강화 탐지 및 발견된 사용자 이름에 대한 출력을 파싱합니다.
### 탐지 도구 (`src/detection_tools/`)
**`LogParser`** — 정규식 기반 auth.log 파서로, 다섯 가지 SSH 이벤트 유형을 지원합니다: `failed_invalid_user`, `failed_valid_user`, `pre_auth_reject`, `accepted`, `disconnected`. 타임스탬프, 이벤트 유형, 사용자 이름, 소스 IP 및 포트가 포함된 구조화된 이벤트 딕셔너리를 반환합니다.
**`ResponseAnalyzer`** — 유효 사용자 이름과 무효 사용자 이름의 타이밍 분포에 대해 Welch의 t-검정을 수행합니다. 타이밍 델타(ms), p-값, Cohen의 d 효과 크기 및 평이한 언어 결론을 계산합니다. 임계값: delta ≥ 5ms AND p < 0.05인 경우 부채널 경고가 트리거됩니다.
**`EnumerationDetector`** — 네 가지 탐지 패턴:
- **빠른 사용자 프로브**: 슬라이딩 윈도우 - 동일한 IP, 60초 이내에 ≥10개의 고유 사용자 이름
- **단어 목록 상관 관계**: 시도된 사용자 이름과 알려진 공격 목록 간의 일치율
- **순차적 타이밍**: 시도 간 간격의 변동 계수 (낮은 CoV → 도구)
- **분산 프로빙**: 여러 IP에서 동일한 사용자 이름 (자격 증명 스터핑 정찰)
**`AlertingSystem`** — 경량 알림 발신기. 타임스탬프가 포함된 JSON 알림을 stdout으로 생성합니다. 필요에 따라 이메일/SIEM/웹훅 통합으로 확장 가능합니다.
### 오케스트레이터
**`run_investigation.py`** — 네 단계를 순차적으로 실행하고 결과를 `data/results/`에 기록하는 CLI 드라이버입니다. 전체 사용법은 `--help`와 함께 실행하세요.```bash
python run_investigation.py \
-target 192.168.xx.xxxx \
-usernames data/wordlists/common-usernames-50.txt \
-log data/sample-logs/auth.log \
-known-valid root ubuntu \
-samples 10
테스트된 가설: OpenSSH가 존재하지 않는 사용자와 존재하는 사용자(잘못된 비밀번호)에 대해 다른 오류 메시지를 반환하는가?```bash
$ ssh [email protected] Permission denied (publickey,password).
$ ssh [email protected] Permission denied (publickey,password).
**결과:** 응답은 바이트 단위로 동일합니다. 프로토콜은 아무것도 유출하지 않습니다.
**이유:** OpenSSH 7.3부터 `UsePAM yes`는 서버가 존재하지 않는 사용자에 대해 더미 `crypt()` 연산을 실행하도록 강제하여, 실제 실패한 인증의 타이밍과 오류 경로를 일치시킵니다. 이 수정은 CVE-2016-6210에 대한 직접적인 대응이었습니다.
---
### 발견 2: 타이밍 부채널 감지되지 않음
**테스트된 가설:** 오류 메시지가 일치하더라도, 유효한 사용자 이름과 유효하지 않은 사용자 이름 사이에 통계적으로 악용될 수 있는 측정 가능한 타이밍 차이가 있는가?
50개의 사용자 이름 각각에 대해 10개의 타이밍 샘플을 수집했습니다. (시스템에서 확인된) 알려진 유효 사용자를 유효하지 않은 사용자 풀과 비교했습니다.
| 측정 지표 | 값 |
|-----------------------------|-------------------------------------|
| 평균 타이밍 — 유효하지 않은 사용자 | ~312 ms |
| 평균 타이밍 — 유효 사용자 | ~311 ms |
| 델타 | **~1 ms** |
| Welch의 t-검정 p-값 | > 0.40 |
| 결론 | **구별 가능한 부채널 없음** |
~1ms 델타는 5ms 노이즈 임계값보다 훨씬 낮으며 통계적으로 유의미하지 않습니다(p >> 0.05). OpenSSH의 더미 해시 계산은 효과적입니다.
---
### 발견 3: Hydra가 열거 지원 없음 보고
Hydra의 SSH 열거 모드는 세 가지 신호 중 하나에 의존합니다: 다른 오류 메시지, 다른 타이밍, 또는 다른 연결 동작. 세 가지 모두 정규화되면서, Hydra는 명시적으로 보고합니다:```
[ERROR] target ssh://192.168.56.10:22/ does not support user enumeration
[STATUS] 50/50 tries completed, 0 valid logins found
관찰된 부작용: 열거에 실패했음에도 불구하고, 50번의 모든 시도가 /var/log/auth.log에 소스 IP, 타임스탬프, 시도된 사용자 이름과 함께 기록됩니다. 공격자의 존재가 완전히 드러납니다.