e_yejun
Jun_ : Pwn
e_yejun
전체 방문자
오늘
어제
  • 분류 전체보기 (240)
    • Profile (1)
    • Pwnable (54)
    • Reversing (14)
    • Network (7)
    • Forensic (10)
    • Embedded (4)
    • Android (2)
    • Web (18)
    • 알고리즘 (42)
    • 프로그래밍 (24)
    • 프로젝트 (6)
    • 1-day (7)
    • CTF (15)
    • 기타 (33)
    • 일기장 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • how2heap
  • dvwa
  • x64
  • rev-basic
  • Heap
  • dreamhack.io
  • X86
  • 1-day
  • BOF
  • wargame

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e_yejun

Jun_ : Pwn

프로젝트

[Python] zip 파일 비밀번호 무차별 대입 공격(brute-force attack)

2020. 11. 4. 01:34

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 : 사전 대입할 문자들 지정



unlock_zip.zip
0.20MB

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

 

 

    '프로젝트' 카테고리의 다른 글
    • Joongsint 프로젝트 데이터 쌓기
    • [Forensic] 파이썬(Python)으로 파일 속 숨겨진 파일 찾기 (스테가노그래피)
    • [Node.js] Socket.io를 이용한 채팅방 만들기
    • [HTML/JavaScript/CSS] jwplayer를 이용한 music player
    e_yejun
    e_yejun
    정리노트 •_•

    티스토리툴바