이번에는 칼리에서 제공하는 john the ripper를 통해 패스워드 무차별 대입 공격을 해보고 해시 개념을 알아보려고 한다.
패스워드를 보관하는 방법은 두 가지가 있다.
1. 패스워드를 그대로 보관
이 방법의 경우 해당 사이트가 해킹 당하면 한 번에 모든 사용자의 패스워드가 노출되게 된다.
즉 보안적으로 매우 취약한 방법이다.
2. 해쉬함수를 이용한 암호화
가장 대표적인 방법이며 많은 곳에서 사용하는 방식이다.
해쉬 함수란 수학적으로 역함수가 존재하지 않는 함수이다. 이런 경우 y값을 보고 x값을 찾아낼 수가 없다.
해쉬 함수의 특성에 관련된 부분은 information_securty 카테고리에 게시할 예정이다.
이러한 해쉬 함수의 종류는 다양하게 존재하지만 대표적으로 MD5,SHA-1같은게 있다.
리눅스에서는 /etc/shadow에 유저의 비밀번호에 해당하는 해시값을 저장하고 있고 로그인 시 입력받은 패스워드에 해쉬값을 취해
이 파일과 비교하여 같을시에 로그인이 된다.
이런 시스템에서의 패스워드 크래킹을 하기 위해 대표적인 방법이 브루트 포스(=brute force)인 무작위 대입과
또 다른 방법으로는 레인보우 테이블이 있다.
브루트 포스란 말 그대로 무작위로 모든 패스워드를 다 입력해보는 것이다. 이러한 경우 숫자, 소문자, 대문자, 특수문자 등을 포함하여
10글자가 넘어가는 패스워드의 경우의 수를 모두 계산하려면 시간이 매우 오래걸린다.
그 이유는 경우의 수도 매우 많을 뿐더러 해쉬값을 취하여 비교를 하기 때문에 해쉬 연산에 드는 시간도 무시할 수가 없다.
레인보우 테이블이란 것은 모든 해쉬의 쌍을 미리 계산해서 저장해놓은 표이다.
이와 같은 테이블의 형태를 지닌다.
따라서 이를 이용해서 고속으로 검색하여 뚫을 수가 있다.
하지만 데이터의 크기가 매우커지게 되고 테라바이트 단위로 가게 된다.
하지만 3TB정도의 테이블을 구축한다면
- 숫자로 된 패스워드는 12자리까지
- 소문자로 된 패스워드는 10자리까지
- 숫자+소문자 패스워드는 8자리까지
- 숫자 + 소문자 + 대문자 패스워드는 7자리까지
이 난이도 정도는 순식간에 뚫을 수 있다고 한다.
하지만 위의 방법의 해킹을 막기 위해 Salt라는 변칙적인 방법을 사용해 해쉬를 사용하는 경우가 많아졌다.
이 방법은 랜덤한 문자열을 앞이나 뒤, 중간에 덧붙여서 원본의 길이가 길어지게 만드는 것이다.
이는 랜덤한 문자열 + sha1("패스워드"+랜덤 한 문자열)와 같다.
어찌 됬든 이번에는 John the ripper, johnny를 통한 무작위 대입을 해보려고 한다.
이 방법에서도 사전 txt를 이용하여 조금 더 효율적인 방법이 가능하다.
일단 두개의 계정을 만들고 pass를 설정해주었다.
/etc/shadow 파일을 보니 해쉬값으로 비밀번호가 저장돼있음을 알 수가 있다.
이 파일을 보면 $ 값을 기준으로 분리가 되어 있다.
이 구조는 $Hashid$Salt$Hash value라고 보면 된다.
Hash id는 어떤 해쉬 알고리즘을 쓴것인지 알려준다.
그리고 이 shadow파일을 크랙할때 비교하기 위해 따로 저장해둔다.
johnny를 열어 password file을 클릭한다
johnny는 john을 gui버전으로 조금 더 쓰기 편하게 만든 것 같다.
start new attack을 눌러서 공격을 시작한다.
john 을 이용하려면
이런 방식으로 따로 분리를 시켜줘서 진행을 한다.
'Security_lab' 카테고리의 다른 글
gdb를 통한 heap buffer overflow (0) | 2021.07.27 |
---|---|
gdb를 통한 Stack buffer overflow (0) | 2021.07.27 |
레이스 컨디션 실습 (0) | 2021.07.25 |
SetUID (0) | 2021.07.21 |
shell code & assembly analysis (0) | 2021.07.20 |