以下のサイトの記事を参考にさせて頂きました。
Get_pasword.py
import itertools
import string
import zipfile
import pyzipper
from pypdf import PdfReader
def extract_zip(file_path, password):
""" ZIPファイルの解凍 (ZIPCrypto & AES-256対応) """
password_bytes = password.encode("utf-8") # バイト列に変換
try:
with zipfile.ZipFile(file_path) as zf:
zf.extractall(pwd=password_bytes)
print(f"[+] ZIP のパスワード発見: {password}")
return True
except (RuntimeError, NotImplementedError):
pass
try:
with pyzipper.AESZipFile(file_path) as zf:
zf.setpassword(password_bytes)
zf.extractall()
print(f"[+] PDF のパスワード発見: {password}")
return True
except Exception as e:
return False
def try_password(file_path, file_type, password):
""" ZIP または PDF のパスワードを試す """
try:
if file_type == "zip":
return extract_zip(file_path, password)
elif file_type == "pdf":
reader = PdfReader(file_path)
if reader.decrypt(password) == 0:
raise ValueError("Incorrect password")
print(f"[+] PDF のパスワード発見: {password}")
return True
except Exception:
return False
def password_cracker(file_path, mode="brute", password_list=None, max_length=4):
""" ZIP/PDFファイルのパスワードを解析 """
if file_path.endswith(".zip"):
file_type = "zip"
elif file_path.endswith(".pdf"):
file_type = "pdf"
else:
print("[-] サポートされていないファイル形式です")
return
print(f"[*] {file_path} のパスワード解析開始 (モード: {mode})")
count = 0
# **辞書攻撃**
if mode == "dictionary" and password_list:
with open(password_list, "r", encoding="utf-8") as file:
for password in file:
count += 1
if try_password(file_path, file_type, password.strip()):
print(f"[+] 試行回数: {count}")
return
# **総当たり攻撃**
elif mode == "brute":
characters = string.ascii_lowercase + string.digits + string.punctuation # "abcdefghijklmnopqrstuvwxyz0123456789"
print(characters)
for length in range(1, max_length + 1):
for password in itertools.product(characters, repeat=length):
count += 1
if try_password(file_path, file_type, "".join(password)):
print(f"[+] 総当たり攻撃試行回数: {count}")
return
print("[-] パスワードが見つかりませんでした")
password_cracker("a.zip", mode="brute", max_length=3)