[시스템 해킹] 패스워드 크래킹
※ 공부 목적으로 작성했습니다. 악용하지 마세요!
1. 패스워드 크래킹의 종류
- 사회공학 기법 (Social Engineering) : 사람들을 속여 정상적인 보안 절차를 우회한다.
- 사전 대입 공격 (dictionary attack) : 패스워드로 사용할 만한 사전 파일을 미리 만들어 놓고 하나씩 대입하여 패스워드 일치 여부를 확인
- 무차별 대입 공격 (brute-force attack) : 가능한 모든 경우의 수를 모두 대입
- 레인보우 테이블 공격 (rainbow table attack) : 패스워드와 해시로 이루어진 체인을 무수히 만들어 테이블에 저장한 다음, 암화화 값을 데이블에서 찾는 방법.
[전수 공격]
조합 가능한 경우의 수 모두를 시도하는 것
암호화된 zip 파일을 해제해보자!
암호로 가능한 4자리 모든 숫자를 조합하면, 0000부터 9999로, 10000개이다.
이 모든 조합을 하나씩 조합을 하면, 비밀번호를 찾을 수 있다.
전수 공격은 모든 경우의 수를 시도하기 때문에 100% 성공하지만,
비밀번호에 숫자뿐만이 아니라 대/소문자, 특수문자가 추가되고, 길이가 또한 길어지게 되면 기하급수적으로 경우의 수가 생기게 되고 시간이 많이 소요되기 때문에 내가 살아 있는 한 해결될 수 없을 수 있다.
아래처럼 4~12자리에, 대/소문자, 순자, 특수문자, 공백 등을 조합하면 경우의 수가 엄청나게 늘고, 시간 또한 계산할 수 없게 된다..
[사전대입 공격]
사전에 있는 단어를 입력해서 암호를 알아내는 방법을 뜻하는데
진짜 사전도 의미하지만 무작위가 아니라 사전이나 사람들이 많이 사용하는 단어나 조합들의 모음을 이용하는 것이다.
joh the ripper 툴 안에 있는 password list 내용...
* john the ripper는 가장 유명한 패스워드 크래킹 도구로, 다양한 종류의 암호 해시를 풀어 준다.
password list를 이용해서 /etc/shadow 안에 있는 계정들의 비번을 풀어보기
test.txt 파일 내용 :
student:$6$d8fUnkm2ocqPw.gj$eXXPbEYXx4B5JJ1gQRCLmSgWwyaOCRUmKSaBWYcOQkV4HyWrkd6FThRcLU/MH9lhJHA1N04UmrbxYOIUnJnOH0:17178:0:99999:7:::
ssh_server:$6$M8pfTrnt$dzcOjQibi11yLF3I2MSuT12K8VH6DOxtvEcKCBj7Bf5TZEsyW6fkecqhTQXNX9FGtML1ZTwvlov5FcS1VLyu00:17402:0:99999:7:::
test3:$6$D2eRyOcB$urjkOkKBkDRWcaN2sMU2bhOrkiqx26GFCG0wpXHyRT9JFcGoj5yUVRk2..BWkuLcH28rqVFR5.y5tWunLVki80:17479:0:99999:7:::
test2:$6$QjANTho2$2EBlMTcYbDOfXSl9DHMWywmYitu5COP2xRRNdy.p8610itRltRHB0XZsZbEhYE9c512JJm8cFnQ7Fa/QXLXe7.:17479:0:99999:7:::
test:$6$cjOnQXXB$aHTDbuBc0HkXjoOr0m1DJgCulHT9TCthUj.0uhvZWc.cTwtfoi/qCiKQItH2dAH4C6DA6SbLcHFi3DtNbh7c.1:19174:0:99999:7:::
hello:$6$pTDvsSEM$QgJP8LYGuPMa6/s156mSckO0F5ZZ.6hjAPHtGV2OXLnVVuKjMXv/B2Z7yZ3Vqal554UN8HEkIxYReDbq0mvZN0:19174:0:99999:7:::
john 명령어 실행
# ./john test.txt --file=password.lst
어렵게 설정한 test 계정 빼고 쉬운 비밀번호들은 다 해제가 되었다.
☞ 쉬운 암호를 설정하거나 사전에 있는 일상 단어를 사용하게 되면, 쉽게 해제될 수 있다.
[레인보우 테이블 공격]
레인보우 테이블은 해시함수로 만들 수 있는 모든 해시 값을 저장한 테이블로,
보통 해시 함수를 이용해 저장된 비밀번호로부터 원래 비밀번호를 추출하기 위해 사용된다.
(해시 함수는 원래 역함수가 존재하지 않은 것을 깨기 위한 것으로, 공격자의 사전공격으로 볼 수 있다.)
'패스워드 + 해시' 형태로 저장이 되며 모든 해시함수를 저장하기에는 공간적으로 부담이 되기 때문에, R(Reduction) 함수를 이용한다.
R함수를 레인보우 테이블의 크기를 줄이기 위해 일정한 패턴이나 유사한 것을 이용해
모든 값을 저장하지 않고, 특정 값만 저장해 패스워드를 역으로 알아내는 방법이다.
임의의 값 12345678이 있을 때 해시함수 테이블을 만들어 보자
패스워드 | 해시 |
12345678 | 25d55ad283aa400af464c76d713c07ad |
25552834 | 49fb0035549c59b3213d2affdf524ef0 |
49003554 | 5a8a25c1490f5b4f48a0dcde7686d028 |
58251490 | 28eb798f0e779a90e53cc9082f2413a6 |
28798077 | 04c78b54af38437cc951adafec4c1da7 |
04785438 | 51f6280b562965db147892f43fef6480 |
임의의 값 > 해시값에서 > R함수에 대입하여 패스워드를 구하는 게 1개의 체인.
위는 5개의 체인으로 구성이 되었고,
마지막에 레인보우 테이블은 첫 번째 값과 마지막 해시값이 저장된다.
[레인보우 테이블]
패스워드 | 해시 |
12345678 | 51f6280b562965db147892f43fef6480 |
즉, 패스워드의 수=체인 * 테이블 수이다.
해시 테이블을 이용해서 패스워드 알아내기
크래킹하고자 하는 패스워드의 해시값 : '28eb798f0e779a90e53cc9082f2413a6' 일 때
[레인보우 테이블] 의 해시값과 일치하지 않습니다.
▶ R함수를 적용하게 된다면, 패스워드가 28798077가 나오고 해시값은 04c78b54af38437cc951adafec4c1da7
하지만, [레인보우 테이블]과 일치하는 않는다.
▶ 다시 R함수를 적용하면, 패스워드로 04785438이 나오고, 해시값은 51f6280b562965db147892f43fef6480이 나온다.
그 결과 12345678 패스워드의 [레인보우 테이블]과 일치하게 된다.
▶ 12345678 패스워드부터 다시 해시값을 찾게 되면,
패스워드 | 해시 |
12345678 | 25d55ad283aa400af464c76d713c07ad |
25552834 | 49fb0035549c59b3213d2affdf524ef0 |
49003554 | 5a8a25c1490f5b4f48a0dcde7686d028 |
58251490 | 28eb798f0e779a90e53cc9082f2413a6 |
28eb798f0e779a90e53cc9082f2413a6의 패스워드는 58251490가 된다.
레인보우 테이블 참고 : https://blog.naver.com/dong5053/220814689883