#!/usr/bin/env python3
import re, sys
from collections import defaultdict, Counter
FAIL_PAT = re.compile(r'Failed password for (\S+) from ([\d.]+)')
SUCC_PAT = re.compile(r'Accepted \w+ for (\S+) from ([\d.]+)')
fail_by_ip = Counter(); fail_by_user = Counter()
success = []; brute_then_success = []
# --- 로그 파싱 ---
with open(sys.argv[1] if len(sys.argv)>1 else '/var/log/auth.log') as f:
for line in f:
m = FAIL_PAT.search(line)
if m: fail_by_ip[m.group(2)] += 1; fail_by_user[m.group(1)] += 1
m = SUCC_PAT.search(line)
if m: success.append((m.group(2), m.group(1), line[:15]))
# --- 이상 탐지 ---
for ip, cnt in fail_by_ip.items():
if cnt >= 10: # 임계값
for s_ip, s_user, s_time in success:
if s_ip == ip:
brute_then_success.append((ip, cnt, s_user, s_time))
# --- 리포트 출력 ---
print(f"=== 브루트포스 후 성공: {len(brute_then_success)}건 ===")
for ip, cnt, user, ts in sorted(brute_then_success, key=lambda x:-x[1]):
print(f" 🔴 {ip}: {cnt}회 실패 → {user} 로그인 성공 ({ts})")