본문 바로가기

Pwnable/FTZ

[ProjectH4C] [Write-up] 해커스쿨 FTZ Level 8

level8로 들어오자마자 어김없이 ls -al과 find / -group level8 2>/dev/null을 실행해보았다.

ls -al은 별 문제 없어보이고, find의 결과 중에 /etc/rc.d/found.txt라는 것이 보인다.

 

해당 파일의 내용을 보니 아래의 내용이 36번 반복해서 출력되었다.

level9:$1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.:11040:0:99999:7:-1:-1:134549524

어디서 많이 본 형태인데, 바로 /etc/passwd에 사용자들의 정보를 저장하는 형태와 같다. 하지만 /etc/passwd는 7개의 필드가 존재하는데, 위의 내용은 총 9개의 필드로 구성되어 있다. 실제 사용자의 패스워드를 저장하는 /etc/shadow 파일이 총 9개의 필드로 구성되어있는데, 위의 내용은 /etc/shadow에서 가져온 내용인 듯 하다. 9개의 필드는 각각 다음의 의미를 가진다.

  1. 사용자 이름
  2. 패스워드
  3. 패스워드 파일 최종 수정일
  4. 패스워드 변경 최소일
  5. 패스워드 변경 최대일
  6. 패스워드 만료 경고기간
  7. 패스워드 파기 기간
  8. 계정 만료 기간
  9. 예약 필드

그러니까 위의 내용 중 두 번째 필드에 있는 $1$vkY6sSlG$6RyUXtNMEVGsfY7Xf0wps.가 level9의 암호일 것이다. 문제는 패스워드를 무슨 방식으로 암호화 했느냐인데...

패스워드를 암호화 했을 때 위와 같은 형태로 표현되는 것을 해시(Hash)라고 한다. 해시의 형태는 다음과 같다.

$형식$SALT값$암호

형식이 $1이면 MD5, $5이면 SHA256, $6이면 SHA512 방식으로 암호화 된 해시값이라는 의미이다. 같은 방식으로 해시를 설정하면 동일한 암호에 대해서는 항상 같은 해시 값이 나오게 되는데, 이를 방지하기 위해서 랜덤한 값 SALT를 암호와 합쳐서 같은 값이 나오지 않도록 해준다. 그리고 SALT 이후의 값이 해시를 통해 나온 암호가 된다.

암호화 된 해시를 복호화 하기는 사실상 불가능이다. "a" 부터 "zzzzzzzzzzzzzzzz"까지 경우의 수가 너무나 많기 때문인데, "존 더 리퍼"라는 복호화 프로그램을 이용하면 손쉽게 복호화 할 수 있다. 해당 툴의 사용법은 구글링만 하면 나오기 때문에 설명은 생략하고, found.txt의 내용을 존 더 리퍼 툴에 넣어서 실행해보면 다음과 같은 결과가 나온다.

$ ./john ./shadow.txt
Loaded 1 password hash (FreeBSD MD5 [32/64 X2])
apple            (level9)
guesses: 1  time: 0:00:00:00 100% (2)  c/s: 13847  trying: alex - apple

 

level9의 암호가 "apple" 이라고 나왔다.

apple이라는 암호를 저렇게 길게 암호화 해도, 결국엔 뚫릴 수가 있기 때문에, 암호화 되었다고 해서 무조건 안전한 건 아닌 것 같다. 

level 9로 고고~!