我一直想把这些东西包起来,所以请多包涵。

我有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等相关的任何内容。略微解码文件(此脚本似乎利用了teknoraver帖子中找到的相同密钥),尽管解密的文件不是100%,但

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


下一步要采取的步骤

评论

/ cgi / confup似乎已在0x015744处注册到该函数,该函数似乎在解析文件的POST数据,然后调用rdp_updateFirmware(导入的函数),然后重新启动。我要查找定义了rdp_updateFirmware的库。

@cimarron非常感谢您的提示。我将使用此信息进行更深入的研究。

#1 楼

似乎他们还在那里添加了压缩。
该实用程序似乎可以对其进行解码: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

解压:比单个位流例如deflate。
但与LZSS不同,它还使用位流/位码来表示长度和距离值。

评论


嗨,欢迎来到RE.SE。如果可能的话(请您自己使用工具!),请提供相关的解密算法。基本上,如果该链接的托管服务器出现故障或论坛关闭,您的答案将一文不值。谢谢!

– 0xC0000022L♦
18/09/5在12:43

当然可以,没想到。

–谢尔文
18年9月5日15:43

@Shelwien的出色工作,我已经亲自检查了该工具,并且效果不错。如果您注意到配置文件中包含序列号,则说明了为什么我将文件上传到另一台设备时会更改该设备的序列号。我在本机上使用tr69玩耍,但是当串行更改为配置文件中的一个时,我最终得到了10个设备,所有设备都在相同的串行下报告,这使它变得无用,很好的旧TP-Link。

–谦卑的老鼠
18-09-6在7:34



#2 楼

适应于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;
}


评论


您能举一个如何使用它的例子。我也想在以后重新加密。

–谦卑的老鼠
19年8月27日在12:42