OSCP 1일차: 해시, 평문으로 어떻게 돌릴까?

TryHackMe 선행 학습 - Hashing Basics

Jun Noh

OSCP를 따겠어!! 하고 결심을 한 지 2주 정도가 지났다.

첫 일주일은 깃허브를 이리저리 돌아다니며, 학습 정보나 응시 방법, 합격 수기 등을 정독하면서 보냈는데 그 소감은… “할 수 있을까?” 였다.

시험 난이도도 난이도인데, 내가 도통 이 사람들이 뭐라고 하는 지 알 수가 없었다.

나름 보안 기사를 회사 다니면서 첫 트에 땄다고 자만심이 가득 차 있었는데, 보안 분야 에서의 실전 경험은 거의 0이니… 그럴 수 밖에.

그래서 내가 내린 결론은, 바로 Offensive Security의 응시 코스를 지르는 게 아니라 한 달 정도의 선행학습 기간을 갖는 것이었다.

처음에는 한국 사이트를 좀 뒤적뒤적거렸는데.. 이게 무슨 강의 팔이가 목적인건지, 뭐만 하라고 하면 몇십만원짜리 코스를 구매해라고 협박 아닌 협박을 한다.

시험 자체가 영어기도 하고, 보고서도 영어로 작성해야하니… 일단은 영어 그 자체의 보안 용어들과 좀 친해질 필요가 있다고 생각해서

선행 학습은 TryHackMe 에서 진행하기로 했다.

마침 Pre Scurity 부터 Cyber Security 101을 지나가는 Jr Penetration Tester 코스가 있길래, 4월 한달 안에 이 코스부터 완주하면서 선행 학습 및 실전 보안과 친해지는 시간을 갖기로 했다.

Pre Security는 개발자가 아니더라도 컴퓨터에 관심이 조금 있으면 바로 풀 수 있는 정도의 아주 기초적인 IT 지식이라. 따로 다루지 않겠다.

또한 Cyber Security 101 코스에는 보안 기초 이론부터 윈도우, 리눅스 시스템의 기초와 네트워크, 패킷 기초 등 여러 섹터가 있지만 그건 다 이미 보안 기사를 공부하면서 이론 공부를 빠삭하게 한 섹터라서 그냥 넘기고…

오늘은 Cyber Security 101 코스에서 그나마 내게 좀 생소했던 개념인 Hash 파트를 좀 들여다보려고 한다.

Hash에 대한 이론 공부는 진짜 질리도록 했지만, 직접 알고리즘을 찾아서 사전 파일을 가지고 평문으로 만들어본 건 처음이라.. 신기해서 조금 적어보려고 한다.

개발자에게 해시란?

사실 개발자로 5년 굴러먹으면서 해시를 모를 수는 없다. 당장 DB에 유저 비밀번호 저장할 때 bcrypt로 말아먹거나, Git 커밋 해시 만지작거릴 때 쓰는 게 이거니까.

이론적으로 해시는 단방향 이다. 입력값이 아무리 길어도 고정된 길이의 문자열을 뱉어내고, 아주 미세한 변화에도 결과값이 확 바뀌는 특성을 가진다. 가장 중요한 건 해시값만 보고 원래 문자를 알아내는 건 불가능하다는 거다.

그런데 보안 관점으로 넘어오니까 얘기가 달라진다.

“해독은 불가능하지만, 크랙 은 가능하다.”

처음엔 이게 무슨 말장난인가 싶었다. 사실 암호학적인 복호화 역연산이 불가능할 뿐, 공격자는 무식하게 모든 경우의 수를 다 돌려보거나, 사람들이 자주 쓰는 비밀번호 목록을 왕창 모아놓고 다 해시로 바꿔본 다음 결과값이 일치하는지 ‘대조’하는 방식을 쓴다는 거다.

명쾌했다.

알고리즘은 죄가 없다. password123 같은 걸 쓰는 사람들이 문제지. ㅋㅋ

어떤 해시 알고리즘인지 알아내기

해시를 크랙하려면 가장 먼저 해야 할 일이 있다. “이 문자열이 대체 무슨 알고리즘으로 암호화 된 건가?”

MD5, SHA1, SHA256 등등… 형태만 보고 “음, 이건 SHA1이군” 할 수 있는 사람은 진짜 변태거나 터미네이터다. 사실 길이를 보면 대충 짐작은 간다. 예를 들어 MD5는 32글자의 16진수로 이루어져 있으니까.

하지만 실전에서는 일일이 길이를 셀 시간이나 인내심이 없다. 그래서 자동화 툴을 쓴다.

1. 툴 활용: Hash-Identifier / Name-That-Hash

TryHackMe 랩에서는 친절하게 여러 툴을 소개해주는데, 굳이 머리 아프게 찍을 필요 없이 툴에 값을 던져주면 알아서 후보군을 좁혀준다. 보통 칼리 리눅스에 깔려있다.

# 활용 예시
hashid "5d41402abc4b2a76b9719d911017c592"

출력 결과로 MD5 또는 MD4 같은 가능성 높은 알고리즘 목록을 퍼센티지로 뱉어낸다.

2. Hashcat 모드 번호 매칭 (매우 중요)

이후에 크래킹 끝판왕 툴인 Hashcat을 돌리려면 결국 툴이 알아먹는 ‘모드 번호’를 알아야 한다. 이건 Hashcat의 방대한 --help 옵션에서 내가 찾은 알고리즘 번호를 뒤져서 매칭해야 한다. 외우고 다니는 사람은 거의 없다.

  • MD5 -> -m 0
  • SHA1 -> -m 100
  • SHA256 -> -m 1400

크래킹: 되돌리는 게 아니라 때려 맞추기

이제 진짜 공격이다. 해시값 -> 평문 역연산 기계가 있는 게 아니라, 수천만 개의 텍스트가 들어있는 사전 파일 을 무식하게 다 해시로 구워 본 뒤 값이 일치하는 걸 찾아내는 노가다를 지시해야 한다.

이때 등장하는 전설의 아이템이 바로 rockyou.txt다. (실제 과거 해킹 사건에서 유출된 1400만 개의 비밀번호 목록이다. 개발자라면 이거 한 번 열어보고 본인 비번이 있는지 반성해 볼 필요가 있다.)

Hashcat 사용법 예시

GPU를 영혼까지 쥐어짜서 연산 속도를 극대화하는 Hashcat을 돌려보자.

hashcat -m 0 -a 0 target_hash.txt /usr/share/wordlists/rockyou.txt
  • -m 0 : 알고리즘을 MD5로 지정 (0번)
  • -a 0 : 공격 모드를 Dictionary (사전 대입) 모드로 지정 (0번)
  • 파라미터 : 크랙할 해시가 담긴 텍스트 파일과, 사용할 사전 파일 경로.

머신을 할당받고 엔터를 치고 조금만 기다리면, Status: Cracked 라는 문구와 함께 무식하게 때려 맞춰진 평문이 툭 거북하게 튀어나온다.

쾌감이 제법 쩐다. 이게 실전이었으면 타겟 서버의 DB 덤프를 털어서 루트(Root)나 관리자 권한으로 접속하는 시나리오가 성립되는 거니까.

TryHackMe: Hashing Basics (Task별 전체 문제/정답)

방 안에서 과제로 주어졌던 모든 Task의 문제와 삽질의 결과물들이다.

Task 2: Hash Functions

1. What is the SHA256 hash of the passport.jpg file in ~/Hashing-Basics/Task-2?

  • 정답: 77148c6f605a8df855f2b764bcc3be749d7db814f5f79134d2aa539a64b61f02

2. What is the MD5 hash for the phrase TryHackMe?

  • 정답: 27495574c8debcbe85d5fbe9ec279178
  • 팁: 그냥 터미널에서 echo -n 'TryHackMe' | md5sum 치면 나온다. 여기서 핵심은 -n (줄바꿈 제거) 옵션이다. 이거 안 넣으면 터미널 기본 줄바꿈 문자까지 해시로 구워버려서 전혀 엉뚱한 해시값이 나오니까 초반 삽질에 주의하자.

3. What is the output size in bytes of the MD5 hash function?

  • 정답: 16

4. If you have an 8-bit hash output, how many possible hash values are there?

  • 정답: 256

Task 3: Insecure Password Storage

1. What is the 20th password in rockyou.txt?

  • 정답: qwerty
  • 팁: head -n 20 rockyou.txt | tail -n 1 명령어 하나면 바로 뽑아먹을 수 있다. 리눅스 파이프 명령어의 강력함이다.

Task 4: Using Hashing for Secure Password Storage

1. Manually check the hash “4c5923b6a6fac7b7355f53bfe2b8f8c1” using the rainbow table above.

  • 정답: inS3CyourP4$$

2. Crack the hash “5b31f93c09ad1d065c0491b764d04933” using an online tool.

  • 정답: tryhackme

3. Should you encrypt passwords in password-verification systems? Yea/Nay

  • 정답: Nay
  • 팁: 암호계의 가장 기본인 질문이다. 복호화가 아예 안 되는 단방향 해시 알고리즘을 써야지 역연산이 가능한 암호화를 쓰면 DB가 털렸을 때 평문이 싹 다 유출되는 대참사가 난다.

Task 5: Recognising Password Hashes

1. What is the hash size in yescrypt?

  • 정답: 256

2. According to Hashcat, what is the hash mode (number) for MD5?

  • 정답: 0

3. According to Hashcat, what is the hash mode (number) for SHA256?

  • 정답: 1400

4. What’s the Hash-Mode listed for Cisco-ASA MD5?

  • 정답: 2410

5. What hashing algorithm is used in Cisco-IOS if it starts with $9$?

  • 정답: scrypt

Task 6: Password Cracking (Hashcat)

1. Crack the following hash (MD5): 5d41402abc4b2a76b9719d911017c592

  • 정답: hello
  • 팁: 해시값을 파일에 넣고 hashcat -m 0 -a 0 hash.txt rockyou.txt 로 돌리면 0.1초 컷이다.

2. Crack the following hash (SHA256): 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae

  • 정답: foo
  • 팁: 모드 번호만 바꿔서 hashcat -m 1400 -a 0 hash.txt rockyou.txt 로 돌리면 해결.

3. Use hashcat to crack the hash $2a$06$7yoU3Ng8dHTXphAg913cyO6Bjs3K5lBnwq5FJyA6d01pMSrddr1ZG, saved in hash1.txt.

  • 정답: 85208520
  • 팁: 앞에 붙은 $2a$ 형태만 봐도 bcrypt 해시라는 걸 알 수 있다. bcrypt 모드(-m 3200)로 맞춰서 돌리면 된다.

4. Use hashcat to crack the SHA2-256 hash 9eb7ee7f551d2f0ac684981bd1f1e2fa4a37590199636753efe614d4db30e8e1, saved in hash2.txt.

  • 정답: halloween

5. Use hashcat to crack the hash $6$GQXVvW4EuM$ehD6jWiMsfNorxy5SINsgdlxmAEl3.yif0/c3NqzGLa0P.S7KRDYjycw5bnYkF5ZtB8wQy8KnskuWQS3Yr1wQ0, saved in hash3.txt.

  • 정답: Yr1wQ0

6. Crack the hash, b6b0d451bbf6fed658659a9e7e5598fe, saved in hash4.txt.

  • 정답: spaceman

마치며

“보안은 수학이 아니라 노가다와 꼼수의 예술이다.”

오늘 해시 크래킹 랩을 하면서 든 생각이다. 서버 단에서 아무리 최신 SHA 알고리즘에 Salting을 친다고 해도 결국 근본적인 방어는 약한 패스워드를 쓰지 못하게 ‘강제’하는 정책 운영에 달려있다는 걸 뼈저리게 느꼈다.

OSCP는 이런 식으로 내가 개발자로서 쌓아온 상식들을 본격적인 공격자 마인드로 한 번 비틀게 만들어준다.

마침.

다른 글 보기