PromleeBlog
sitemap
aboutMe

posting thumbnail
정보보안기사 - 1.9 패스워드 크래킹 기법과 솔팅(Salting)
Password Cracking Techniques and Salting - InfoSec Engineer 1.9

📅

들어가기 전에 🔗

지난 1.8편에서는 시스템을 위협하는 다양한 악성코드에 대해 알아보았습니다.
하지만 아무리 강력한 보안 시스템이라도, 출입문의 열쇠인
패스워드
가 뚫리면 무용지물입니다.

리눅스의 /etc/shadow 파일이나 윈도우의 SAM 파일에는 패스워드가 암호화(해시)되어 저장됩니다.
하지만 해커들은 이 암호화된 문자열을 원래의 비밀번호로 되돌리기 위해 다양한 공격 기법을 사용합니다.
오늘은 해커가 어떻게 패스워드를 알아내는지, 그리고 우리는 어떻게 더 안전하게 패스워드를 저장해야 하는지 알아보겠습니다.

패스워드 공격 유형 🔗

패스워드 크래킹은 암호화된 해시값($6$xyz...)을 보고 원래의 비밀번호(p@ssword)를 찾아내는 과정입니다.
대표적인 4가지 공격 기법이 있습니다.

레인보우 테이블과 해시의 취약점 🔗

일반적인 해시 함수는
동일한 입력값에 대해 항상 동일한 출력값
을 가집니다.
이것이 보안상 큰 취약점이 됩니다.

취약점 예시 🔗

사용자 A와 사용자 B가 똑같이 1234라는 비밀번호를 쓴다고 가정해 봅시다.
해시값 비교
User A (PW: 1234) -> SHA256 -> 03ac674216f3e15c...
User B (PW: 1234) -> SHA256 -> 03ac674216f3e15c...
두 사람의 해시값이 똑같습니다.
해커가 레인보우 테이블에서 03ac674216f3e15c...1234라는 것을 알아내면, A와 B의 계정이 동시에 털리게 됩니다.

방어 기법: 솔팅(Salting)과 키 스트레칭 🔗

레인보우 테이블 공격을 무력화하기 위해 두 가지 핵심 기술을 사용합니다.

1. 솔팅 (Salting) 🔗

솔팅
은 소금(Salt)을 친다는 뜻입니다.
패스워드에
랜덤한 문자열
(Salt)을 앞이나 뒤에 붙여서 해시값을 만듭니다.
이렇게 하면 같은 비밀번호라도 Salt가 다르면 전혀 다른 해시값이 생성됩니다.
Salting Logic Example
// [취약] 단순 해시
hash("1234") -> "03ac..."
 
// [안전] 솔팅 적용
// 사용자마다 고유한 Salt 생성 (랜덤 값)
String salt_A = "R@nd0m_A";
String salt_B = "R@nd0m_B";
 
// 원본 패스워드는 같아도 결과는 다름
hash("1234" + salt_A) -> "e1f2..." 
hash("1234" + salt_B) -> "a9b8..."
이제 해커는 레인보우 테이블을 사용할 수 없습니다.
각 사용자마다 Salt가 다르므로, 모든 Salt 경우의 수에 대해 테이블을 다시 만들어야 하기 때문입니다.

2. 키 스트레칭 (Key Stretching) 🔗

해커의 컴퓨터가 좋아져서 계산 속도가 빨라지면 무차별 대입 공격이 성공할 수 있습니다.
이를 막기 위해 해시 함수를
수천 번에서 수만 번 반복
하여 계산 속도를 의도적으로 늦추는 기법입니다.
Key Stretching Example
String digest = "password";
// 해시 함수를 10,000번 반복 실행
for (int i = 0; i < 10000; i++) {
    digest = hash(digest + salt);
}
일반 사용자는 로그인할 때 0.1초나 0.2초 차이를 못 느끼지만, 1초에 수십억 번 대입해야 하는 해커에게는 치명적인 지연이 됩니다.
대표적인 알고리즘으로
PBKDF2
,
bcrypt
,
scrypt
등이 있습니다.

리눅스 패스워드 크래킹 도구: John the Ripper 🔗

보안 점검을 위해 시스템 관리자는
John the Ripper
같은 도구를 사용하여 취약한 패스워드를 사용하는 계정이 있는지 진단합니다.

사용 원리 🔗

리눅스의 /etc/shadow 파일과 /etc/passwd 파일을 결합(unshadow)하여 크래킹을 시도합니다.
Terminal
 # john-the-ripper 설치 (Ubuntu 기준)
sudo snap install john-the-ripper
 
 # unshadow 명령으로 패스워드 파일 생성
sudo unshadow /etc/passwd /etc/shadow > passwords.txt
 
 # 크래킹 시작 (확장 버전 사용 및 포맷 지정)
john-the-ripper --format=sha512crypt passwords.txt
 
 # 크래킹 결과 확인
john-the-ripper --show passwords.txt
크래킹 결과
크래킹 결과
제가 크래킹한 결과 prome 이라는 계정이 단순한 패스워드를 쓰고 있음을 보여줍니다.
모자이크처리한 부분은 실제 패스워드입니다.

이 도구는 내장된 사전 파일과 규칙을 사용하여 패스워드를 추측합니다.
보안 담당자는 이를 통해 "1234"나 "password" 같은 쉬운 비밀번호를 쓰는 사용자를 찾아내어 변경을 권고해야 합니다.

안전한 패스워드 정책 수립 🔗

기술적인 방어뿐만 아니라 관리적인 정책도 중요합니다.
시스템 보안 가이드라인에서는 다음과 같은 설정을 권고합니다.

결론 🔗

이번 시간에는 패스워드를 노리는 공격과 이를 막는 기술에 대해 알아보았습니다.
다음 시간에는 실무적인 로그 분석으로 넘어갑니다.
1.10 [실기] 리눅스 로그 분석 (wtmp, syslog)
편에서 시스템에 누가 언제 접속했는지, 공격 흔적은 어디에 남는지 상세히 파헤쳐 보겠습니다.

참고 🔗