TP-Link 加密备份文件 TX-VG1530

逆向工程 linux 加密 嵌入式
2021-07-06 03:37:36

我一直在努力解决这些问题,所以请耐心等待。

我有一个 Tp-Link TX-VG1530。您可以从 gui 下载配置文件,但该文件已加密,我在下面包含了 conf.bin 文件的一部分

q=4‡|&YFË#Tùð¶¿Ä/1Þl^àh[Ú‹³lÙ€ÍÁ.©-&ÚdŠDT•°ôy®jò3R7B®5#B5m¨)½=Q›Î\òï-ÏÇëÄ+®‡h•Y‡Í@Ý úò%×ýÛâçó›Ð0&rŸØë÷vj[ñÛx¹Úm‡z†äí}Ös•qêQRsÆðèÍŽ’|Û˜’²³€¬#ìŸ4œä³½nÛÿl„¯~‚,•RÁgÏ;öÏËÀw‡§„,W‰×Jî <§x}ôžZñˆgFPdB§êÁ×gˆÑ=‰»uËžÏHžâKE¢¾.â˜/×3 Åæç±WÔ™ŒiõÁÕƒS\%*
Õ^çý­<w±ø”ð’´<ØmÎF1ˆÀqû§‘¥ðÛAÈÎ-ÿ1z”­9]ã7”…b«Yå[ö„*i'{ü'NŒÀç‘4ÑáÐm¹ü´B·U^wª½IÙ‚8û]³#)Lû-Diž

使用固件修改工具包,我可以提取文件系统并查看 conf 文件的上传页面 (/web/main/backNRestore.htm) 我可以看到以下内容

formObj.target = "up_frame";
formObj.action = "/cgi/confup";
formObj.submit();

做一个快速的 grep 我可以看到 /cgi/confup 出现在 /usr/bin/httpd 中。用 IDA pro 看这个

在此处输入图片说明

从以下帖子中,我相信我应该能够检索加密方法,但我似乎看不到与密钥等相关的任何内容

http://teknoraver.net 解密 TP-Link conf 文件

我在此处包含文件的链接

httpd 文件链接

在文件中使用的字符串命令我什么也看不到,涉及到aesdesmd5keydecenc等。

有一些工具,例如tlrecode.sh,它们似乎可以稍微解码文件(此脚本似乎使用了在 teknoraver 帖子中找到的相同密钥),但解密的文件不是 100%

×<?xml version="1.0"?>
<DslCpeConfig>
  <InternetGatewayDevice
  <Summa¯ry val=".:1.1[](Baseli`ne:1, EthVLA`N:1)"

谁能建议下一步要采取的措施

2个回答

似乎他们还在那里添加了压缩。
这个实用程序似乎可以解码它:
https : //www.nirsoft.net/utils/router_password_recovery.html
另外,我刚刚为它编写了自己的解码器和编码器:
https : //encode.su/threads/3005-TP -LINK-router-config-compression

解密:
openssl enc -d -des-ecb -K 478DA50BF9E3D2CF -nopad -in conf.bin -out conf.lztp

解包:

struct lztp_t {
  byte  hash[16];
  uint  size;
};

uint bitbuf, bitnum;

uint getbit( void ) {
  uint r;
  if( bitnum==0 ) {
    bitbuf = byte(get());
    bitbuf|= 256*byte(get());
    bitnum =16;
  }
  r = (bitbuf>>15)&1; bitbuf<<=1; bitnum--;
  return r;
}

uint getvar( void ) {
  uint r = 1; do r = 2*r + getbit(); while( getbit() );
  return r;
}

int decode( void ) {
  uint c,i, winptr, id, l,d;

  enum{ winlog=16, winsize=1<<winlog, winmask=winsize-1 };
  byte win[winsize];

  lztp_t hdr;
  for( i=0; i<sizeof(hdr); i++ ) if( (c=get())==-1 ) break; else ((byte*)&hdr)[i]=c;
  if( c==-1 ) return -1;

  winptr=0; bitbuf=0; bitnum=1;
  while( winptr<hdr.size ) {
    id = getbit();
    if( id==0 ) {
      // literal
      c = byte(get());
      put( win[(winptr++)&winmask]=c );
    } else {
      // match
      l = getvar()-2+4;
      d = (getvar()-2)*256;
      d+= byte(get()) + 1;
      while( l-- ) {
        c = win[(winptr-d)&winmask];
        put( win[(winptr++)&winmask]=c );
      }
    } // if id
  } // while

  return 0;
}

压缩算法类似于 LZSS - 具有交错的位和字节流,而不是像例如这样的单个位流。放气。但与 LZSS 不同的是,它还使用位流/位码作为长度和距离值。

为 linux/gcc 改编的代码 Shelwien

#define uint int
#define byte char
#define put(c) putchar(c)
#define get() getchar()
#include <stdio.h>


struct lztp_t {
  byte  hash[16];
  uint  size;
};

uint bitbuf, bitnum;

uint getbit( void ) {
  uint r;
  if( bitnum==0 ) {
    bitbuf = get();
    bitbuf|= 256*get();
    bitnum =16;
  }
  r = (bitbuf>>15)&1; bitbuf<<=1; bitnum--;
  return r;
}

uint getvar( void ) {
  uint r = 1; do r = 2*r + getbit(); while( getbit() );
  return r;
}

int main( void ) {
  uint c,i, winptr, id, l,d;

  enum{ winlog=16, winsize=1<<winlog, winmask=winsize-1 };
  byte win[winsize];

  struct lztp_t hdr;
  for( i=0; i<sizeof(hdr); i++ ) if( (c=get())==-1 ) break; else ((byte*)&hdr)[i]=c;
  if( c==-1 ) return -1;

  winptr=0; bitbuf=0; bitnum=1;
  while( winptr<hdr.size ) {
    id = getbit();
    if( id==0 ) {
      // literal
      c = get();
      put( win[(winptr++)&winmask]=c );
    } else {
      // match
      l = getvar()-2+4;
      d = (getvar()-2)*256;
      d+= get() + 1;
      while( l-- ) {
        c = win[(winptr-d)&winmask];
        put( win[(winptr++)&winmask]=c );
      }
    } // if id
  } // while

  return 0;
}