某网络设备解密的两种思路

新发布解密固件
2026-07-06 06:18
4235

0x1

这是环境搭建好的页面,无法进入到底层的shell界面
image.png

使用vmware将搭建好的系统盘挂载到另外一个虚拟机上

Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 7C0CDB37-340D-4226-A8F1-FC9EBAC6D294

Device       Start       End   Sectors  Size Type
/dev/sda1     2048      4095      2048    1M BIOS boot
/dev/sda2     4096   1054719   1050624  513M EFI System
/dev/sda3  1054720 209713151 208658432 99.5G Linux filesystem


Disk /dev/mapper/groupZ-home: 6.72 GiB, 7218397184 bytes, 14098432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/groupA-home: 4.87 GiB, 5226102784 bytes, 10207232 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/groupA-runtime: 19.46 GiB, 20891828224 bytes, 40804352 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

这里是挂载出来的所有的磁盘内容,这里直接创建三个目录挂载出来,发现了加密文件就是这三个,只需要对这三个文件进行解密即可

root@eve:~# mount /dev/mapper/groupZ-home /tmp/sda2
mount: /tmp/sda2: unknown filesystem type 'crypto_LUKS'.

root@eve:~# mount /dev/mapper/groupA-home /tmp/sda2
mount: /tmp/sda2: unknown filesystem type 'crypto_LUKS'.

root@eve:~# mount /dev/mapper/groupA-runtime /tmp/sda2
mount: /tmp/sda2: unknown filesystem type 'crypto_LUKS'.

内核启动的时有调用crypto进行加密,其中也有调用api进行解密,那么这个加密与解密的过程就在虚拟机的内存当中,现在只需要对虚拟机的内存文件进行扫描密码即可

   1.boot loader把内核以及initrd文件加载到内存的特定位置。

   2.内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。

   3.内核将initrd的内容保存在rootfs下的/initrd.image文件中。

   4.内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。

   5.接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。

   6..如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。

   7.执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。

   8./linuxrc执行完毕,常规根文件系统被挂载

   9.如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。

   10.在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

这里将sda1sda2sda3分别挂载出来其中有grub.cfg,在grub.cfg中进入Current会进入到系统A分区,这里的内容已经告诉我们需要对GroupA组当中的磁盘进行解密,因为GroupZ是恢复工厂设置

....
menuentry "Current" {

set root=(hd0,2) //将GRUB的根文件系统设置为第一块的第二个分区

linux /kernel system=A rootdelay=5 console=ttyS0,115200n8 console=tty0 vm_hv_type=VMware
//采用了A/Z双分区

initrd /coreboot.img //初始内存盘的文件路径
}

menuentry "Factory Reset" {

set root=(hd0,1)

linux /kernel system=Z noconfirm rootdelay=5 console=ttyS0,115200n8 console=tty0 vm_hv_type=VMware

initrd /coreboot.img

}

使用findaes工具对内存文件扫描获取的密钥,这里的密钥就是从系统A分区的内存中得到的

PS C:\Users\admin\Documents\Virtual Machines\ivanti> findaes.exe .\ivanti-ce6dee15.vmem
Searching .\ivanti-ce6dee15.vmem
Found AES-256 key schedule at offset 0xa511916c:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f

...

Found AES-256 key schedule at offset 0xf4586070:
f1 a8 aa 2b cc 4f d4 66 53 73 eb 56 81 d7 b7 9e 65 ec 1b 8e bf b9 2f 7d 71 c7 da 8e 80 95 91 72
Found AES-128 key schedule at offset 0xf4c6a040:
e1 fc 5e b7 d8 41 58 da ba d8 eb bc f6 cd 2a 18

构造一个python脚本来对密码进行匹配

import re
import subprocess
import binascii
import os

TARGET_DEVICES = [
    "/dev/mapper/groupA-home",
    "/dev/mapper/groupA-runtime",
    "/dev/mapper/groupZ-home"
]

def parse_keys_from_log(filepath):
    """从 findaes 日志中提取并清洗出有效的唯一 AES 密钥"""
    valid_keys = set()
    hex_pattern = re.compile(r'^([0-9a-f]{2}(?: [0-9a-f]{2})+)$', re.IGNORECASE)
    
    if not os.path.exists(filepath):
        print(f"[-] 找不到密钥文件: {filepath}")
        return []

    with open(filepath, 'r') as f:
        for line in f:
            line = line.strip()
            if hex_pattern.match(line):
                if '00 01 02 03' not in line:
                    clean_hex = line.replace(' ', '')
                    valid_keys.add(clean_hex)
                    
    return list(valid_keys)

def test_device(device, keys):
    """针对单个设备测试所有密钥"""
    if not os.path.exists(device):
        print(f"[-] 警告: 目标设备 {device} 不存在,跳过。")
     

试读结束,发布七天后转为公开

公开时间:2026年7月13日 06:18:19

提前解锁全文,需花费 50 积分

登录解锁全文
分享到

参与评论

0 / 200

全部评论 0

暂无人评论
投稿
签到
联系我们
关于我们