ZIP 파일 비밀번호 무차별 대입공격
오래된 zip 파일 중에 비밀번호를 분실한 파일이 있었다.
대부분 내가 사용하는 비밀번호의 특징을 비슷하기 때문에 만들게 됐다.
먼저, 비밀번호를 크랙할 파일의 경로를 입력해준다.
2아는 자리는 입력으로 채우고, 모르는 자리는 [spacebar]를 통해서 자리를 채워준다.
그 다음 chars에 무차별로 대입 될 문자들을 한글자씩 적어준다.
이때 비밀번호 크랙 시간을 줄이기 위해서는 가장 확률이 높은 문자를 앞에 나열하는 것이 중요하다.
실행 후 비밀번호 길이와 입력될 문자 개수에 따라
모든 경우의 수의 대입을 시작된다.
* 어디까지 크랙되고 있는지 실시간으로 확인하고 싶다면 unzipfile 함수의 print 주석을 풀어주자
#-*- coding: utf-8 -*-
from itertools import product
from zipfile import *
def unzipfile(filename, password):
try:
#print(password)
filename.extractall(pwd = password.encode())
print("[*] Find password! : {0}".format(password))
return 1
except:
pass
def main():
i = input('[*] Input : zip file path >> ')
if i.find('.zip') == -1:
print('It is no zip file.')
exit()
filename = ZipFile(i)
static_char = str(input("[*] Input : Guess_password (If you don't know : [spacebar] ) >> "))
static_char_len = len(static_char)
static_true = [] #공백이 아닌 자리의 인덱스를 저장
static_false = [] #공백의 자리의 인덱스를 저장 -> 이 부분만 대입하기 위해
index = 0
while(index < static_char_len):
if static_char[index] == ' ':
static_false.append(index)
else:
static_true.append(index)
index = index+1
static_true_len = len(static_true)
static_false_len = len(static_false)
chars = input('[*] Input : bruteforce chars >> ')
print('[*] Start : bruteforce Attack!')
for length in range(static_false_len,static_false_len+1): # 만들어지는 비밀번호 자리수 == 공백의 수
to_attempt = product(chars, repeat=length)
for attempt in to_attempt:
password_list = []
for char in attempt:
password_list += char
for s_word in static_true: # 공백이 아니었던 자리를 insert를 이용해서 채워준다.
password_list.insert(s_word,static_char[s_word])
password = ''.join(password_list)
ret = unzipfile(filename, password) # 비밀번호 해제 시도
if ret == 1:
exit()
print('[*] Exit : bruteforce Attack is failure.')
if __name__ == '__main__':
main()
- i : 비밀번호를 뚫을 ZIP 파일 경로 지정
- static_char : 알고 있는 고정 문자 값, 모를 경우 'spacebar' 입력 (원하는 길이만큼 입력)
- static_char_len : 입력받은 'static_char' 문자열 길이 저장
- static_ture : 고정 문자가 저장된 index list
- static_false : 공백인 자리 index list
- static_ture_len : 고정 문자 개수
- static_false_len : 공백 문자 개수
- chars : 사전 대입할 문자들 지정
ver 1 - dictionary.py / unlock_zip.py
ver 2 - static_StartEnd_unlock_zip.py
ver 3 - oneclick_unlock_zip.py
'test.zip' : 5자리 비밀번호
수정일 : 2021.06.27.(Sun)
github : https://github.com/exit1100/Python-ZipFile-Password-BruteforceAttack