因为平时做misc的时候遇到量大管饱冰蝎取证总会直接红温,所以就打算写一个工具来实现半自动化,再不济也能帮自己减轻一点工作量
所以最近写了一个处理冰蝎流量的小工具,工具还不是很完善,存在一些杂七杂八的小问题
github的地址:https://github.com/131A3D7/PyBehinderForensics/tree/main
从我的测试来看,大部分情况下导出的东西还是蛮正常的(确信
配合
https://the-x.cn/encodings/Base64.aspx
这个网站进行处理,可以比较快速的完成对冰蝎流量分析题的处理
代码如下:
import base64
import os
import argparse
import re
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import binascii
import json
# 解析命令行参数
parser = argparse.ArgumentParser(description='冰蝎快速解析脚本')
parser.add_argument('-k', '--key', help='冰蝎解密的key, 默认是e45密钥',
required=False, default='e45e329feb5d925b')
parser.add_argument('-f', '--file', help='文件位置', required=True)
parser.add_argument('-d', '--decrypt', help='被加密的冰蝎shell文件', required=False)
parser.add_argument('-l', '--list', help='需要批量解密的目录', required=False)
args = parser.parse_args()
# 定义可能存在的key的正则表达式
maybe_aeskey = re.compile(r'[a-fA-F0-9]{16}')
# 打开文件并读取内容
with open(args.file, 'r', encoding='utf-8') as f:
content = f.read()
# 定义寻找key的函数
def printmaybekey(check_key):
if any(key != args.key for key in check_key):
print('疑似检测到非默认密钥, 可能的key列表如下:')
for i, key in enumerate(check_key, 1):
print(f'{i}. {key}')
print('请选择你想要运用来解密的key:')
choose = int(input())
if choose < 1 or choose > len(check_key):
print('牛魔,参数乱填是吧')
else:
choose = choose - 1
return check_key[choose]
return args.key
# AES解密函数
def aes_decrypt(data, aes_key):
try:
iv = b'\x00' * 16
cipher = AES.new(aes_key.encode('utf-8'), AES.MODE_CBC, iv)
decrypted = cipher.decrypt(base64.b64decode(data))
return decrypted.rstrip(b"\0").decode('utf-8')
except Exception as e:
return '不是,你这key有问题啊'
# 检查是否为JSON
def is_json(decrypted_data):
try:
json.loads(decrypted_data)
return True
except ValueError:
return False
# 找到所有符合16位hex的值
check_key = maybe_aeskey.findall(content)
aes_key = printmaybekey(check_key)
# 遍历目录,解密每个文件
def decrypt_directory(directory, aes_key):
for filename in os.listdir(directory):
if filename.endswith('.php'): # 检查扩展名
filepath = os.path.join(directory, filename)
with open(filepath, 'rb') as f:
encrypted_data = f.read().decode('utf-8')
decrypted_data = aes_decrypt(encrypted_data, aes_key)
new_filename = os.path.splitext(filepath)[0] + '_decrypted.txt'
with open(new_filename, 'w') as f:
f.write(decrypted_data)
# 根据参数处理单个文件或目录
if args.decrypt:
with open(args.decrypt) as f:
encrypt_file = f.read()
decrypted_data = aes_decrypt(encrypt_file, aes_key)
newfilename = 'decrypt_file.txt'
with open(newfilename, 'w') as f:
f.write(decrypted_data)
match = re.search(r'\{.*\}', decrypted_data)
if match:
json_content = match.group(0)
try:
data = json.loads(json_content)
decoded_status = base64.b64decode(data["status"]).decode('utf-8')
decoded_msg = base64.b64decode(data["msg"]).decode('utf-8')
print("Status:", decoded_status)
print("Msg:", decoded_msg)
except json.JSONDecodeError:
print("提取的字符串不是有效的JSON格式。")
else:
print("未找到有效的JSON格式数据。是否直接输出(Y/N)")
a = input()
if a.lower() == 'y':
print(decrypted_data)
elif args.list:
decrypt_directory(args.list, aes_key)
等再优化一些,添加些功能就打包成pip包传pypi上去