中兴加密备份配置文件

逆向工程 linux 加密
2021-06-11 04:20:25

我在中兴通讯 Speedport Entry 2i(CPE 主要用于德国、斯洛伐克等,可能是为德国电信定制的)中闲逛。可以从 UI 下载配置备份。

我发现它与其他中兴配置备份不同。通常它是 zlib 压缩的 XML。我怀疑这个上面有一层伪加密。


00000000  99 99 99 99 44 44 44 44  55 55 55 55 aa aa aa aa  |....DDDDUUUU....|
00000010  00 00 00 00 00 00 00 00  00 00 00 04 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 40  |...............@|
00000040  00 02 00 00 00 00 00 80  00 00 57 c6 00 00 00 00  |..........W.....|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000080  04 03 02 01 00 00 00 00  00 00 00 12 53 70 65 65  |............Spee|
00000090  64 70 6f 72 74 20 45 6e  74 72 79 20 32 69 01 02  |dport Entry 2i..|
000000a0  03 04 00 00 00 02 00 00  00 00 00 00 57 a8 00 01  |............W...|
000000b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000d0  00 00 00 00 00 00 00 00  00 00 00 00 57 60 00 00  |............W`..|
000000e0  57 60 00 00 00 00 be d3  f7 b3 fe 9e 99 a4 35 75  |W`............5u|
000000f0  ce db 7f c2 99 17 43 7f  1e e2 54 7a 63 72 6f c8  |......C...Tzcro.|
00000100  b7 2d cc e8 cb 32 6c 3a  f0 fd 55 19 10 ac ea d5  |.-...2l:..U.....|
00000110  e9 18 01 01 71 7c 20 68  ca 66 d0 d9 f9 12 03 3d  |....q| h.f.....=|
00000120  ee bd ad 2a 00 e2 c1 96  73 12 bd 5a 94 3e 6d 1a  |...*....s..Z.>m.|
00000130  a8 7f c8 a8 8b 3d b6 1e  d8 ae 9b 43 63 6a e3 ea  |.....=.....Ccj..|
00000140  94 33 55 57 dc 81 b2 22  c5 e7 39 fd 75 b9 ba 5b  |.3UW..."..9.u..[|
00000150  00 ca a1 29 9b e2 9f bd  8e 1f 00 98 30 62 8b d7  |...)........0b..|
00000160  c6 12 ae ef 27 55 30 2a  4c f8 de 7c e5 2a 33 b9  |....'U0*L..|.*3.|
00000170  8b 32 4a d2 2c da 2a 18  ff 72 cf 1c 42 d8 41 6b  |.2J.,.*..r..B.Ak|

这个配置的其他例子可以在这里找到:RE Compressed backup file,router linux based so it is compressed with zlib?

有没有办法弄清楚如何提取此配置的内容?有没有办法检测是否存在某种简单的 XOR 加密?

我无法获得设备的固件,它是 CPE,所以它非常锁定。设备本身看起来正在使用类似于中兴 E5502(相同的基于 lua 的 Web UI)E5502 固件的精简版本

你可以在这里下载配置。配置文件

编辑:

在阅读了关于压缩和熵之间差异的一些内容后,我得出结论,该文件可能是加密的,而不仅仅是用 XOR 之类的东西进行了混淆(因为这不会改变熵)

我从另一台 ZTE 设备(带有 zlib 压缩的设备)获得了配置文件

$ binwalk -E -N config_f660.bin

DECIMAL       HEXADECIMAL     ENTROPY
--------------------------------------------------------------------------------
1024          0x400           Rising entropy edge (0.973932)
10240         0x2800          Rising entropy edge (0.958898)
14336         0x3800          Rising entropy edge (0.966971)
17408         0x4400          Rising entropy edge (0.968328)

$ binwalk -E -N config_encrypted.bin

DECIMAL       HEXADECIMAL     ENTROPY
--------------------------------------------------------------------------------
1024          0x400           Rising entropy edge (0.974513)
22528         0x5800          Falling entropy edge (0.737589)

据我所知,这个数据的第一个上升沿是两个配置中未加密的标头。在压缩配置中,其他上升沿应该代表压缩的 zlib 块。如果您实际使用 binwalk 绘制图形,您可以看到熵中仍有一些上升沿,但小得多的线几乎是平坦的。(由于声誉低,不能包括图表)。我现在确信这是由对那些压缩的 zlib 块应用加密引起的。

我的假设是正确的还是我遗漏了什么?有没有一种方法可以在没有固件映像的情况下尝试破解或至少猜测加密类型?

3个回答

2020 年 8 月更新:

据我所知,以下信息是准确的。在撰写本文时,它已被用于config.bin2 个不同的路由器上解密

配置文件的混淆部分是一系列 ZLIB 压缩部分,这些部分已使用16 字节密钥在 ECB 模式下使用 AES加密

有一个cspd在路由器上命名的应用程序可以做很多不同的事情。其中之一是加密/解密配置文件。

一些中兴路由器将 AES 密钥硬编码到cspd二进制文件中;其中一些没有。不幸的是,你的是一个没有。

cspdnamed 中有一个函数PdtDBSetAESEncryKey(代码由 Ghidra 提供)用于设置密钥:

undefined4 PdtDBSetAESEncryKey(char *param_1,int param_2)

{
  byte bVar1;
  char cVar2;
  undefined4 uVar3;
  int iVar4;
  size_t sVar5;
  undefined4 *puVar6;
  undefined4 *puVar7;
  byte bVar8;
  undefined4 local_48;
  undefined4 local_44;
  undefined4 local_40;
  undefined4 local_3c;
  undefined4 local_38;
  undefined local_18;

  local_48 = 0;
  local_44 = 0;
  local_40 = 0;
  local_3c = 0;
  memset(&local_38,0,0x21);
  uVar3 = 0xffffffff;
  if ((param_1 != (char *)0x0) && (param_2 != 0)) {
    iVar4 = _getTagparamMD5(&local_48);
    if (iVar4 != 0) {
      ProcUserLog("dbc_mgr_pdt_encry.c",0x9c,"PdtDBSetAESEncryKey",5,0,0,
                  "_getTagparamMD5 failed! Use default");
      sVar5 = strlen("Hello! world,");
      CspGetMD5("Hello! world,",sVar5,&local_48);
    }
    puVar7 = &local_48;
    puVar6 = &local_38;
    do {
      bVar1 = *(byte *)puVar7 >> 4;
      if (bVar1 < 10) {
        cVar2 = '0';
      }
      else {
        cVar2 = 'W';
      }
      bVar8 = *(byte *)puVar7 & 0xf;
      *(byte *)puVar6 = bVar1 + cVar2;
      if (bVar8 < 10) {
        bVar8 = bVar8 + 0x30;
      }
      else {
        bVar8 = bVar8 + 0x57;
      }
      puVar7 = (undefined4 *)((int)puVar7 + 1);
      *(byte *)((int)puVar6 + 1) = bVar8;
      puVar6 = (undefined4 *)((int)puVar6 + 2);
    } while (puVar7 != &local_38);
    local_18 = 0;
    strncpy(param_1,(char *)&local_38,param_2 - 1);
    uVar3 = 0;
  }
  return uVar3;
}

哪个:

  1. 读取命名的文件tagparam_m并生成其内容的 MD5;_getTagparamMD5()
  2. 如果此功能失败,'Hello! world,'则使用的 MD5代替;iVar4 != 0
  3. 将 MD5 转换为(小写)十六进制摘要;(做循环)

这个密钥被馈送到设置密钥函数AES_set_decrypt_key,来自libcrypto,第二个参数('bits')设置为 128(即 16 字节 KEY_LENGTH)。

tagparam_m文件位于/var路由器启动时并在其中创建。

我看过这个文件的两个例子。每个数据条目前面都有一个迷你报头前导码,包括:

  • 2 字节标识符
  • 2 字节长度和
  • 2 字节填充。

示例 1:

0100 0006 0000                     // 0100: MAC 0, 0006: 6 bytes, 0000: padding
aabb ccdd eef2                     // MAC Address 0 (raw hex)
0101 0006 0000                     // 0101: MAC 1, 0006: 6 bytes, 0000: padding
aabb ccdd eef3                     // MAC address 1 (raw hex)
0102 0006 0000                     // .. etc
aabb ccdd eef4
0103 0006 0000
aabb ccdd eef5
0104 0006 0000
aabb ccdd eef6
0105 0006 0000
aabb ccdd eef7
0106 0006 0000
aabb ccdd eef8
0107 0006 0000
aabb ccdd eef9
0108 0006 0000 
aabb ccdd eefa
0109 0006 0000
aabb ccdd eefb
0200 000f 0000                     // 0200: Serial No, 000f: 15 bytes, 0000: padding
4142434445464748494a4b4c4d4e4f     // Serial Number (ASCII)
0400 000e 0000                     // 0400: BSSID, 000e: 14 bytes, 0000: padding
4142434445464748494a4b4c4d4e       // BSSID (ASCII)
0510 0010 0000                     // 0501: BSSID Password, 0010: 16 bytes, 0000: padding
4142434445464748494a4b4c4d4e4f50   // BSSID Password (ASCII)
0601 0005 0000                     // 0601: Admin Username, 0005: 5 bytes, 0000: padding
4142434445                         // Username (ASCII)
0701 0008 0000                     // 0701: Admin Password, 0008: 8 bytes, 0000: padding
4142434445464748                   // Password (ASCII)
0300 0006 0000                     // 0300: Manufacturer MAC, 0006: 6 bytes, 0000: padding
414243444546                       // Manufacturer MAC (ASCII)
0806 0006 0000                     // 0806: Hardware revision
5631 2e30 2e30                     // Hardware revision (ASCII)
0807 0001 0000                     // 0807: Trailer?
30                                 // "0" ASCII

示例 2:

0100 0006 0000                     // 0100: MAC 0, 6 bytes
5078 b3aa bbc0                     // 50:78:b3:aa:bb:c0
0101 0006 0000                     // 0101: MAC 1, 6 bytes
5078 b3aa bbc1                     // 50:78:b3:aa:bb:c1
0102 0006 0000                     // 0102: MAC 2, 6 bytes
5078 b3aa bbc2                     // 50:78:b3:aa:bb:c2
0103 0006 0000                     // 0103: MAC 3, 6 bytes
5078 b3aa bbc3                     // 50:78:b3:aa:bb:c3
0200 000f 0000                     // 0200: Serial Number, 15 bytes
323638454142434445464748494a4b     // 268EABCDEFGHIJK
0400 000b 0000                     // 0400: BSSID, 11 bytes
4142434445464748494a4b             // ABCDEFGHIJK
0510 0010 0000                     // 0510: BSSID Password, 16 bytes
4142434445464748494a4b4c4d4e4f50   // ABCDEFGHIJKLMNOP
0701 0008 0000                     // 0701: Admin Password, 8 bytes
4142434445464748                   // ABCDEFGH
0300 0006 0000                     // 0300: Manufacturer MAC, 6 bytes
353037384233                       // 5078B3
0806 0006 0000                     // 0806: Hardware Revision, 6 bytes
56312e302e31                       // V1.0.1
0807 0001 0000                     // 0807: Trailer?
30                                 // "0" ASCII

注意:我为 MAC/BSSID/密码等使用了虚拟值!

如果您可以找到该文件并对其执行 MD5(例如md5sum /var/tagparam_m),则十六进制摘要的前 16 个字符就是您的密钥。

对于一个好的密钥,解密块的前 8 个字节应该看起来像0x0102030400000000ZLIB 部分的头的开始。

有关此文件格式的更多信息,您可以查看我编写zcu模块。

笔记:

第二个tagparam_m文件被字节交换,但在文件被字节交换并00截断随后,密钥是 MD5

如果有人想给我发送他们tagparam_m文件的副本,我会更新这篇文章!

学分:

  • Dimitris 找出他的tagparam_m文件的 MD5是关键!
  • @Vido 用于第二个示例tagparam_m文件

遇到这些钥匙和分享

已知的 AES 密钥:

  zxhn h118n ert5                      - 'MIK@0STzKpB%qJZe'
  zxhn h118n V2.1.3_ROSCNT?            - 'MIK@0STzKpB%qJZf'
  zxhn h168n v3                        - '402c38de39bed665'
  zxhn h298n hv17_fv116_mts?t1         - 'Wj' (due to bug, orig. is 'Wj%2$CjM')
  zxhn h298a hw1.1.20_fw1.1.20_ros_t1? - 'm8@96&ZG3Nm7N&Iz'
  zxhn h108n hw1.2_fw2.5.4_eg1t8_ted,
  zxhn h108n hv11_fv2_5_4_*            - 'GrWM2Hz&LTvz&f^5'
  zxhn h168n hv10_fv310t3_belt         - 'GrWM3Hz&LTvz&f^9'
  zxhn h208n hv10_fv1010_belt16t1      - 'Renjx%2$CjM'
  zxhn h267n hv10_fv100t3_belt         - 'tHG@Ti&GVh@ql3XN'

为了获得密钥,您需要检查CSPDBGetFileEncryKey功能