
NT 해시 데이터베이스를 사용하여 MSCHAPv2 챌린지/응답을 빠르게 크랙합니다.
MSCHAPv2/NTLMv1 challenge/response를 NT 해시 데이터베이스를 사용하여 빠르게 크랙합니다
Assless CHAPs는 MSCHAPv2/NTLMv1 교환에서 challenge와 response(예: WiFi EAP WPE 공격)가 있을 때 사용된 NT 해시를 효율적으로 복구하는 방법입니다.
NT 해시 데이터베이스가 필요하며, 기존 목록에서 생성하거나 hashcat을 단어 목록 및 규칙과 함께 사용하여 만드는 방법은 아래에 설명되어 있습니다. SecLists의 샘플 데이터베이스가 포함되어 있습니다. bunzip을 해야 합니다.
MSCHAPv2 교환에서는 일반 텍스트 비밀번호를 "크랙"할 필요가 없으며, 사용된 NThash만 있으면 됩니다.
MSCHAPv2는 NThash를 세 부분으로 나누고, 각 부분을 다른 키로 사용하여 동일한 challenge(피어 및 인증자 challenge에서 파생됨)를 DES 암호화합니다. NThash는 두 개의 7바이트 키와 하나의 2바이트 키로 분할됩니다. 즉, 마지막 키는 필요한 길이의 키를 만들기 위해 NULL로 패딩됩니다. DES 연산의 효율성과 65,535의 키 공간 덕분에 이를 빠르게 무차별 대입할 수 있습니다. 이 두 바이트를 찾으면 데이터베이스에서 해당 두 바이트로 끝나는 모든 NThash를 조회할 수 있습니다. 이렇게 하면 확인할 가능한 해시 집합이 훨씬 작아집니다.
이는 레인보우 테이블과 유사한 공간 대 시간 트레이드오프 형태입니다. 또한 해시 슈킹의 한 형태입니다.
이 내용은 Defcon 29의 RF Hacking Village에서 처음 발표되었습니다. 슬라이드는 이 저장소에 포함되어 있습니다.
세 가지 샘플 challenge/response와 세 가지 다른 단어 목록(작은 개인 목록, rockyou, Have I Been Pwned 목록)에 대한 비교입니다. Macbook Pro 2016에서 수행했습니다. Hashcat은 이 해시 슈킹 커널과 내장 GPU 2개를 사용하며, 순수 커널(최적화 커널은 아직 없음)을 사용합니다. Hash3은 최악의 성능을 시뮬레이션하기 위해 목록에 없습니다. hashcat이 첫 실행 시 사전 캐시를 구축하는 시간은 포함하지 않았습니다.
Hash1
작은 해시 목록:
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
Rockyou 해시 목록:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
HIBP 해시 목록:
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
Hash 2
작은 해시 목록:
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
Rockyou 해시 목록:
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
HIBP 해시 목록:
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
Hash 3
Hash 3은 어떤 해시 목록에도 없어 최악의 조회 성능을 시뮬레이션합니다.
작은 해시 목록:
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
Rockyou 해시 목록:
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
HIBP 해시 목록:
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
Rust 버전은 SQLite 3.6.8 이상이 필요합니다.
Python 버전은 python3, sqlite3, pycryptodome이 필요합니다.
데이터베이스 생성 유틸리티는 python3와 sqlite3 CLI가 필요합니다.
Rust 버전에만 해당됩니다. cargo가 필요합니다.
cargo가 설치된 상태에서 assless-chaps-rs 디렉토리로 이동하여 다음 명령어로 빌드하세요:
cargo build --release
결과 바이너리는 target/release/ 디렉토리에 있습니다.
Assless는 challenge, response 및 NThash 데이터베이스가 필요합니다. 선택적으로 Python 버전은 번들된 최적화된 2바이트 조회 파일을 사용할 수 있습니다. 가장 간단한 사용법은 다음과 같습니다:
./assless-chaps <Challenge> <Response> <hashes.db>
예를 들어:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
출력은 다음과 같아야 합니다:
[-] Two byte lookup file not provided, will brute force instead.
[+] Found in 22636 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
최종 전체 해시 8846f7eaee8fb117ad06bdd830b7586c는 password의 NT 해시입니다.
대규모 비밀번호 코퍼스에서 가장 많이 나타나는 65,535개의 가능한 2바이트 값을 정렬한 목록을 만드는 데 시간을 투자했습니다. 이 파일은 twobytes로 포함되어 있습니다. assless의 네 번째 인수로 전달하면 됩니다.
이렇게 하면 일반적으로 몇 번의 DES 라운드를 절약할 수 있지만 속도 차이는 크지 않습니다. 여러 해시를 처리하는 경우에 도움이 될 수 있습니다.
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
mksqlitedb.py 파일은 CSV 해시 파일을 데이터베이스로 변환하는 데 도움이 됩니다.
python3 mksqlitedb.py <database name> <csv file>
CSV 파일에는 세 개의 열이 필요합니다:
예를 들어 해시 8846f7eaee8fb117ad06bdd830b7586c는 다음과 같이 변환됩니다:
586c,8846f7eaee8fb1,17ad06bdd830b7
이를 위한 정규식 변환 예시는 다음과 같습니다:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
기존 해시 목록(예: Have I Been Pwned 목록)을 사용하거나 hashcat과 원하는 단어 목록/규칙 조합을 사용하여 직접 생성할 수 있습니다.
HIBP 비밀번호 목록은 이미 NT 해시로 다운로드 가능하며, 파일에서 개수만 제거하고 CSV 형식으로 변환하여 데이터베이스에 가져오면 됩니다.
표준 Unix 유틸리티 sed를 사용하여 다음과 같이 수행할 수 있습니다:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
이후 mksqlitedb.py hibp.db hibp.csv를 사용하여 가져올 수 있습니다.
일반 단어 목록을 nthash의 해시 목록으로 변환하려면 대규모 단어 목록을 빠르게 처리할 수 있는 nthasher를 사용할 수 있습니다. 결과 해시는 위에서 설명한 대로 필요한 CSV 형식으로 변환해야 합니다.
필요한 CSV 형식으로 직접 해시를 출력하는 훨씬 느린 nthasher가 이 저장소에 포함되어 있으며, 다음과 같이 간단히 실행할 수 있습니다:
python3 nthash-from-clear.py <wordlist> > hashlist.csv
규칙을 사용하여 단어 목록을 확장하려면 hashcat 사용에 관한 다음 섹션을 참조하세요.
모드 1000 OpenCL 모듈을 약간 수정하여 크랙 후보와 일치하는 해시만 출력하는 대신 모든 해시를 출력하도록 해야 합니다. 기본적으로 필요한 CSV 형식으로 해시를 생성합니다.
OpenCL 디렉토리로 변경: cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvSQLite 데이터베이스는 일반적으로 생성에 사용된 CSV 파일보다 61% 더 큽니다. 또한 파일 크기에 따라 데이터베이스 생성에 시간이 걸릴 수 있습니다. 이에 따라 파일 시스템 요구 사항을 준비하세요.
다음은 rockyou 사전을 사용한 예입니다:
각 해시를 동적으로 변환 및 삽입하여 중간 CSV 파일을 생략하면 공간을 절약할 수 있습니다.
NTLMv1은 SSP를 사용하지 않는 한 정확히 동일한 방식으로 작동합니다. LM 응답이 0으로 끝나는 경우 SSP가 사용 중임을 알 수 있습니다. 포함된 ntlm-ssp.py를 사용하여 assless에 필요한 서버 challenge를 생성할 수 있습니다.
다음과 같이 실행합니다:
python3 ntlm-ssp.py <lm response> <challenge>
예를 들어 hashcat 예제 해시에서 NTLMv1-SSP challenge response 예제를 사용하는 경우:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
다음과 같이 LM과 challenge를 전달합니다:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
그러면 다음과 같은 응답을 얻습니다:
The server challenge is: 724edf24aea0d68b
이후 assless-chaps로 평소와 같이 크랙할 수 있습니다:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db