针对IoT固件的openssl加密的提取&暴力破解工具
在对IoT固件进行漏洞挖掘时,厂商会对最新固件进行openssl加密,这样binwalk就无法提取固件里的内容
图中,在对US_AC8V5.0si_V16.03.50.14_cn_TDC01.bin提取时,binwalk提示存在OpenSSL encryption,就无法提取文件,提示详细解释:
DECIMAL:
516: 这是一个十进制数,表示加密部分在文件中的起始位置,从文件开始处数的字节数。换句话说,加密部分从文件的第 516 字节开始。
HEXADECIMAL:
0x204: 这是十六进制表示,与十进制的 516 相同。十六进制表示在某些情况下更常见,尤其是在查看或编辑二进制文件时。
DESCRIPTION:
OpenSSL encryption, salted, salt: 0x3F67045AE470EEE1: 这描述了加密的细节,包括:
OpenSSL encryption: 表明文件的这一部分是使用 OpenSSL 工具加密的。
salted: 表示加密过程中使用了盐值。盐值是用来增强密码强度的一种方法,通过在加密过程中加入随机数据,使得相同的明文和相同的密码每次产生的密文都不同。
salt: 0x3F67045AE470EEE1: 提供了具体的盐值,即 0x3F67045AE470EEE1。这个盐值在解密时需要使用,因为它是生成加密密钥的一部分
现在知道加密数据从文件的第 517 字节开始(之前的 516 字节可能是未加密的头部信息),可以提取516字节后的数据,进行解密,这里自己写了一个工具来更方便的破解openssl
import subprocess
import argparse
def extract_encrypted_section(input_file, output_file, skip):
with open(input_file, 'rb') as infile, open(output_file, 'wb') as outfile:
infile.seek(skip)
while True:
chunk = infile.read(4096)
if not chunk:
break
outfile.write(chunk)
def decrypt_file(password, input_file, output_file, salt):
command = [
'openssl', 'enc', '-d', '-aes-256-cbc',
'-in', input_file, '-out', output_file,
'-salt', '-pbkdf2', '-pass', f'pass:{password}',
'-S', salt
]
result = subprocess.run(command, capture_output=True)
return result.returncode == 0
def main(input_file, decrypted_file, salt, dictionary, skip):
temp_encrypted_file = 'encrypted.bin'
extract_encrypted_section(input_file, temp_encrypted_file, skip)
with open(dictionary, 'r', encoding='utf-8', errors='ignore') as file:
for line in file:
password = line.strip()
if decrypt_file(password, temp_encrypted_file, decrypted_file, salt):
print(f"Password found: {password}")
break
else:
with open('decrypt.log', 'a') as log_file:
log_file.write(f"Attempt with password: {password} failed\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Extract encrypted section and decrypt a file using a dictionary attack.")
parser.add_argument('input_file', help="The input file containing the encrypted data.")
parser.add_argument('decrypted_file', help="The output file for the decrypted data.")
parser.add_argument('salt', help="The salt used in the encryption.")
parser.add_argument('dictionary', help="The dictionary file containing potential passwords.")
parser.add_argument('skip', type=int, help="The number of bytes to skip in the input file before extracting.")
args = parser.parse_args()
main(args.input_file, args.decrypted_file, args.salt, args.dictionary, args.skip)
需要的参数:
python openssl_extract_and_decrypt.py 要破解的文件名 存放破解后的文件名 openssl加密的盐值 爆破的字典 加密开始的字节数
这里就是:
python3 openssl_extract_and_decrypt.py US_AC8V5.0si_V16.03.50.14_cn_TDC01.bin decrypt.bin 3F67045AE470EEE1 /usr/share/wordlists/rockyou.txt 516
实战
固件被openssl加密,开始的字节数是516,openssl盐值是3F67045AE470EEE1
使用脚本:
python3 openssl_extract_and_decrypt.py US_AC8V5.0si_V16.03.50.14_cn_TDC01.bin decrypt.bin 3F67045AE470EEE1 /usr/share/wordlists/rockyou.txt 516
脚本会自动提取加密的数据,并进行暴力破解,还会将密码输出,加密这个固件的密码就是000000
解密后的文件是decrypt.bin,现在用binwalk分析就正常了
本文脚本的github项目地址:
https://github.com/baimao-box/openssl_extract_and_decrypt
2 条评论
可输入 255 字