
Этот проект исследует, раскрывает ли современный OpenSSH действительные имена пользователей через тонкие различия в ответах или времени. Исследование перечисления пользователей CVE-2016-6210 (t-критерий Уэлча, d Коэна и инженерия обнаружения) в контролируемой лаборатории на Ubuntu 22.04.5 LTS, также изучает следы, которые оставляют такие попытки, и как их можно обнаружить.
Воспроизводимое повторное исследование перебора имён пользователей OpenSSH с использованием статистического анализа.
Этот проект заново исследует CVE-2016-6210, документированный побочный канал по времени в OpenSSH, чтобы определить, остаётся ли он наблюдаемым на современном сервере Ubuntu с конфигурацией PAM по умолчанию.
Вместо предположения, что опубликованное поведение всё ещё применимо, проект оценивает временные замеры аутентификации, собранные с помощью ручного зондирования, Hydra и Metasploit, используя t-критерий Уэлча и d Коэна для различения реальных временных сигналов от шума измерений.
Исследование не выявило статистически значимой разницы во времени на тестируемой конфигурации по умолчанию, что демонстрирует ценность воспроизводимых экспериментов и основанной на доказательствах валидации опубликованных утверждений о безопасности.
⚠️ Правовое уведомление
Этот проект был полностью выполнен в собственной изолированной лабораторной среде. Все выводы применимы только к тестируемой конфигурации. Никогда не тестируйте системы, которые вам не принадлежат или на тестирование которых у вас нет явного письменного разрешения.
Перебор имён пользователей — возможность определить, существует ли конкретное имя пользователя на удалённой системе без действительных учётных данных. Это критически важный первый шаг в цепочке атак, ведущей к компрометации учётной записи:``` Reconnaissance → [User Enumeration] → Password Attack → Access ↑ This project investigates here
Если злоумышленник может отличить «пользователь существует» от «пользователь не существует», анализируя ответы сервера, он может значительно сократить пространство ключей для последующих атак перебора или атак с использованием украденных учетных данных.
SSH является частой целью, так как он почти повсеместно открыт, поддерживает аутентификацию по паролю, а в старых реализациях были измеримые временные различия между действительными и недействительными именами пользователей (CVE-2016-6210).
**Это исследование задает два вопроса:**
1. Утекает ли современный OpenSSH на Ubuntu 22.04.5 LTS с конфигурацией по умолчанию информацию о существовании имени пользователя через ответные сообщения, временные задержки или сигналы, сообщаемые инструментами?
2. Если злоумышленник все же предпримет попытку, какие артефакты остаются? и насколько надежно их можно обнаружить?
---
## 🖥️ Лабораторная установка
Все тестирование проводилось в полностью изолированной виртуальной сети host-only без доступа в интернет.
| Машина | ОС | Роль | 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
### Attack Methods
| Method | Tool | Wordlist | Purpose |
|-----------------------|--------------------------------------|-------------------------|-------------------------------------------------|
| Manual SSH | `ssh` CLI + Paramiko | 50 common usernames | Baseline; inspect raw responses |
| Hydra brute force | `hydra` | same 50 | Automated; leverages Hydra's built-in enum mode |
| Metasploit module | `auxiliary/scanner/ssh/ssh_enumuser` | same 50 | Framework's dedicated enumeration module |
| Banner fingerprinting | custom `BannerFingerprinter` | N/A | No-auth version leak, CVE check |
| Timing analysis | custom `ResponseAnalyzer` | valid vs invalid subset | Statistical side-channel check |
---
## What Was Built
This project goes beyond running tools — it wraps each attack and all detection logic in a structured Python codebase and provides an orchestrator that runs the entire pipeline end-to-end.
### Attack Tools (`src/attack_tools/`)
**`ManualSSHEnumerator`** — Tests each username N times with `paramiko`, recording
precise timing, result type, and SSH banner. Computes mean/std per username. Critically,
it does **not** reuse connections between attempts, ensuring each sample captures the
full server-side processing time.
**`BannerFingerprinter`** — Grabs the SSH banner over a raw TCP socket (no credentials
needed). Parses implementation name, version string, and OS hint. Cross-references
against a local CVE registry. A version like `OpenSSH_8.9p1 Ubuntu-3ubuntu0.6` reveals
the exact server software — potentially enough to identify known vulnerabilities before
any authentication is attempted.
**`HydraAutomation`** — Subprocess wrapper around Hydra. Parses stdout to extract
successful logins, error messages, and Hydra's own enumeration verdict
(`does not support user enumeration`).
**`MetasploitScanner`** — Writes a temporary resource script and drives `msfconsole`
via subprocess. Parses output for hardening detection and any found usernames.
### Detection Tools (`src/detection_tools/`)
**`LogParser`** — Regex-based auth.log parser supporting five SSH event types:
`failed_invalid_user`, `failed_valid_user`, `pre_auth_reject`, `accepted`,
`disconnected`. Returns structured event dicts with timestamp, event type, username,
source IP, and port.
**`ResponseAnalyzer`** — Performs Welch's t-test on timing distributions from valid vs
invalid usernames. Computes timing delta (ms), p-value, Cohen's d effect size, and
a plain-language conclusion. Threshold: delta ≥ 5ms AND p < 0.05 triggers a side-channel
warning.
**`EnumerationDetector`** — Four detection patterns:
- **Rapid user probes**: sliding window - same IP, ≥10 distinct usernames within 60s
- **Wordlist correlation**: match rate between attempted usernames and known attack lists
- **Sequential timing**: coefficient of variation on inter-attempt gaps (low CoV → tool)
- **Distributed probing**: same username from multiple IPs (credential stuffing recon)