프로그램

John the ripper; 암호 해제하기

naudhizb 2022. 5. 5. 00:48
반응형

오래된 대학 수업자료의 비밀번호를 잊어먹어 해제하고자 John the ripper에 대해서 알아보고 사용해보았다.

John the ripper

John the ripper는 무료 암호 해독 소프트웨어로, 다양한 파일 포맷에 대한 암호 해제를 지원한다.
대표적으로 지원하는 포맷은 pdf, zip, rar등이 있으며 워드리스트, 브루트포스, 마스크 기반 등의 암호 해독 방식을 지원한다.
브루트포스 기반의 공격이므로 사실 상 8자 이상의 비밀번호에 대해서는 거의 뚫기가 불가능하나 그 이하의 암호에 대해서는 꽤나 효율적으로 동작 가능하다.

John the ripper 간단한 사용법

John the ripper의 사용방법을 요약하면 다음과 같다.

  1. 암호걸린 파일에서 해시를 추출
  2. 추출한 해시를 이용하여 암호 해독
  3. 해독한 암호를 보고 암호 걸린 파일 해제

암호걸린 파일에서 해시를 추출하기 위해서 XXX2john 파일을 지원하며 종류에 따라 perl, python, 실행파일 등의 여러 포맷으로 구성되어 있다.

암호 해독시에는 john 실행 파일을 이용하여 해독을 수행하며 성공한 암호 해시는 john.pot에 저장되어 중복된 암호 해독을 수행하지 않도록 만든다.

해독된 암호를 보기 위해서는 john --show 를 이용하여 해독된 암호를 볼 수 있다.

예를 들어 zip파일의 암호를 해독하고자 할 때는 아래와 같은 방식으로 해독할 수 있다.

./zip2john ./encrypted.zip > ./zip.hash
./john ./zip.hash
./john ./zip.hash --show

mask, wordlist 사용방법

john 사용 시 해독 시간을 줄이기 위해서는 조건을 정하여 해독 시도하고자 하는 조합을 줄여야 한다.
이때 조합을 나타내는 mask와 조합리스트가 저장된 wordlist를 사용하여 특정 조합에 한정하여 암호 해독을 시도할 수 있다.

mask사용은 대략 아래와 같이 수행한다.

./john --mask=?l?l?d?d?d?d ./zip.hash

mask로 지정할 수 있는 내용은 아래와 같다.

Static letters.
Ranges in [aouei] or [a-z] syntax. Or both, [0-9abcdef] is the same as [0-9a-f].
Placeholders that are just a short form for ranges, like ?l which is 100% equivalent to [a-z].
?l lower-case ASCII letters
?u upper-case ASCII letters
?d digits
?s specials (all printable ASCII characters not in ?l, ?u or ?d)
?a full 'printable' ASCII. Note that for formats that don't recognize case (eg. LM), this only includes lower-case characters which is a tremendous reduction of keyspace for the win.
?B all 8-bit (0x80-0xff)
?b all (0x01-0xff) (the NULL character is currently not supported by core).
?h lower-case HEX digits (0-9, a-f)
?H upper-case HEX digits (0-9, A-F)
?L lower-case non-ASCII letters
?U upper-case non-ASCII letters
?D non-ASCII "digits"
?S non-ASCII "specials"
?A all valid characters in the current code page (including ASCII). Note that for formats that don't recognize case (eg. LM), this only includes lower-case characters which is a tremendous reduction of keyspace.
Placeholders that are custom defined, so we can e.g. define ?1 to mean [?u?l]
?1 .. ?9 user-defined place-holder 1 .. 9
Placeholders for Hybrid Mask mode:
?w is a placeholder for the original word produced by the parent mode in Hybrid Mask mode.
?W is just like ?w except the original word is case toggled (so PassWord becomes pASSwORD).

*Reference: https://miloserdov.org/?p=5031

길이를 조절하기 위해서는 -min-len과 -max-len을 사용 가능하며 길이와 mask 지정 시 더 긴 자릿수로 자동 생성되는 리스트의 경우 mask의 가장 끝 조건을 따라간다

예를 들어 ?l?d 로 2자부터 6자 까지 마스크를 생성하면 a0 부터 z99999 까지 딕셔너리를 생성할 것이다.
John의 특성 상 생성되는 마스크는 정렬되어있지 않기 때문에 후술한 fcrackzip을 사용하기 위해서는 별도의 프로그램으로 딕셔너리를 정리해주어야한다.

wordlist는 아래와 같이 지정할 수 있다.

./john -wordlist=./dict.txt ./zip.hash

또한 mask를 이용하여 아래와같이 wordlist를 생성할 수도 있다.

./john --mask='?d?d?d?d' --stdout > 4d.txt

포워딩을 >로 하면 파일 생성, >>로 하면 파일 추가이므로 여러 조합도 추가가 가능하다.

./john --mask=?l?l?d?d?d?d --stdout > dict.txt
./john --mask=?l?l?l?d?d?d?d --stdout >> dict.txt

위와 같이 딕셔너리를 생성하면 aa0000부터 zzz9999까지 대입하는 딕셔너리를 생성한다.

john에서 워드리스트를 사용하여 암호를 대입하는 경우 제공한 워드리스트에 대해서만 해시 대입을 시도한다.

zip2john 이 안되는 경우

파일 종류에 따라 zip2john이 정상적으로 동작하지 않는 경우도 있다.

이 경우에는 우분투에서 fcrackzip을 사용할 수도 있다.

딕셔너리를 이용한 대입이 효과적이며 이 때 딕셔너리 데이터는 정렬되어있어야한다.

사용법은 대략 아래와 같다.

fcrackzip encrypted.zip -D -p sorted_dict.txt -u

(참조) AIT 자료의 암호

74.04 da2010
74.06 pi2015, pm2015
74.08 es2010, mp2015(zip)
81.14 es2010
81.15 ea2011
81.16 rts2010
81.xx pim2020 dlc2019

반응형