斐讯K2P通过配置文件开启telnet的原理分析

看过几篇教程之后我已经知道怎么备份固件了。但是现在有一个问题,我的本意是把K2P原机带的固件备份出来,用教程上的方法进行开启telnet、备份固件等操作是否会改变固件呢?下面我们来验证这个问题。

OpenWrt的文件系统

K2P使用的是OpenWrt系统,我们先来看一下K2P的Flash Layout(图片来自恩山)

图片上的 firmware 就是我要的固件,它分成 Kernel 和 rootfs 两部分。其中 rootfs 使用SquashFS和JFFS2实现了一个可读写的文件系统,但实际上SquashFS是只读的压缩包,所有的文件修改都是记录在JFFS2,也就是rootfs_data上的。

感兴趣的话可以看看:

https://wiki.openwrt.org/doc/techref/filesystems

https://blog.csdn.net/lee244868149/article/details/57076615

路由器重置的原理

我们知道所有的文件修改都是记录在 rootfs_data 上的,系统重置实际上就是将这部分数据抹掉,我们来验证一下。

我之前下了一个网友备份的固件,地址

打开 "/usr/lib/lua/luci/controller/admin/backuprestore.lua" 文件,查看第136~141行。

136     elseif reset_avail and luci.http.formvalue("reset") then
137         luci.template.render("backuprestore", {
138             reset_process = 1
139         })
140         fork_exec("sleep 3; killall dropbear lighttpd miniupnpd; sleep 3; mtd -r erase rootfs_data")
141     else

mtd -r erase rootfs_data 这一句就是抹掉 rootfs_data 的数据。

通过配置文件开启telnet的原理

我们来看一下恢复配置文件是怎么实现的。

还是 "/usr/lib/lua/luci/controller/admin/backuprestore.lua" 这个文件,查看第81~136行。

 81     elseif luci.http.formvalue("restore") then
 82         local fs = require("luci.fs")
 83         luci.http.formvalue("filename")
 84         --校验配置文件
 85         luci.util.exec("encryconfig decrypt /tmp/backupFile_encode /tmp/backupFile")
 86         nixio.fs.unlink("/tmp/backupFile_encode")
 87         local fd = io.open("/tmp/backupFile", r)
 88         local restore_error_message
 89         if fd ~= nil then
 90             local line = fd:read()
 91             fd:close()
 92             if line ~= nil then
 93                 if not checkfwversion() then
 94                     nixio.fs.unlink("/tmp/backupFile")
 95                     restore_error_fwversion = {"restore_error"}
 96                     luci.template.render("backuprestore", {
 97                         restore_error_fwversion = restore_error_fwversion
 98                     })
 99                 else
100                     luci.util.exec("sed 1,10d /tmp/backupFile >/tmp/restore_rm_header")
101                     luci.util.exec("tar -xzC/ -f /tmp/restore_rm_header")
102                     nixio.fs.unlink("/tmp/restore_rm_header")
103                     local cur_lan_mac = luci.util.exec("uci get network.lan.macaddr")
104                     local cur_wan_mac = luci.util.exec("uci get network.wan.macaddr")
105                     local flash_lan_mac = luci.util.exec("eth_mac r lan")
106                     local flash_wan_mac = luci.util.exec("eth_mac r wan")
107                     if cur_lan_mac ~= flash_lan_mac then
108                         luci.util.exec("uci set network.lan.macaddr=%s" % flash_lan_mac)
109                     end
110                     if cur_wan_mac ~= flash_wan_mac then
111                         luci.util.exec("uci set network.wan.macaddr=%s" % flash_wan_mac)
112                     end
113                     luci.util.exec("uci commit")
114                     local upload = luci.http.formvalue("restore")
115                     if upload and #upload > 0 then
116                         luci.template.render("backuprestore", {
117                             restore_avail = 1
118                         })
119                         fork_exec("sleep 3; reboot")
120                     end
121                 end
122             else
123                 restore_error_message = {"restore_error"}
124                 nixio.fs.unlink("/tmp/backupFile")
125                 luci.template.render("backuprestore", {
126                     restore_error_message = restore_error_message
127                 })
128             end
129         else
130             nixio.fs.unlink("/tmp/backupFile")
131             restore_error_message = {"restore_error"}
132             luci.template.render("backuprestore", {
133                 restore_error_message = restore_error_message
134             })
135         end
136     elseif reset_avail and luci.http.formvalue("reset") then

第101行,tar -xzC/ -f /tmp/restore_rm_header,这条命令把配置文件解压缩到根目录下覆盖现在用的文件。

利用这个特性我们可以向系统写入我们想要的数据,比如自启动脚本。

/etc/rc.local

在 "/etc/rc.local" 脚本中加入命令开启telnet服务是一个不错的选择。

修改后的文件如下:

 1 # Put your custom commands here that should be executed once
 2 # the system init finished. By default this file does nothing.
 3
 4 case `cat /proc/cpuinfo | grep MT76` in
 5   *7621*)
 6     CONFIG_RALINK_MT7621=y
 7     ;;
 8   *7623*)
 9     CONFIG_ARCH_MT7623=y
10     ;;
11 esac
12 if [ "$CONFIG_RALINK_MT7621" = "y" ]; then
13 echo 2048 > /proc/sys/vm/min_free_kbytes
14 #echo 2 > /proc/sys/vm/overcommit_memory
15 #echo 50 >  /proc/sys/vm/overcommit_ratio
16 fi
17 block mount
18
19 # add nat rule manually
20
21 smp.sh wifi
22 hwnat-enable.sh
23 brctl addif br-lan ra0
24 brctl addif br-lan rax0
25 /usr/sbin/telnetd -l /bin/login.sh
26 exit 0

第25行 /usr/sbin/telnetd -l /bin/login.sh 就是开启服务的命令。注意,在这个命令中要写完整路径名。

打包配置文件

生成配置文件的代码在 "/sbin/sysupgrade" 脚本里,第131~174行。

 1 do_save_conffiles() {
 2     local conf_tar="${1:-$CONF_TAR}"
 3
 4 if [ -z "$CONF_BACKUP" ]; then
 5     platform_config_prepare
 6 fi
 7
 8     [ -z "$(rootfs_type)" ] && {
 9         echo "Cannot save config while running from ramdisk."
10         ask_bool 0 "Abort" && exit
11         return 0
12     }
13     run_hooks "$CONFFILES" $sysupgrade_init_conffiles
14     ask_bool 0 "Edit config file list" && vi "$CONFFILES"
15
16 #    v "Saving config files..."
17     [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
18     tar c${TAR_V}zf "$conf_tar" -T "$CONFFILES"
19
20 if [ -n "$CONF_BACKUP" ]; then
21     #fix project name must be first line
22     #phic_fac -g product > /tmp/backup_add_header
23     #fix project hardware info must be second line
24     #phic_fac -g hw_ver  >> /tmp/backup_add_header
25     #fix project software version must be third line
26     #phic_fac -g fw_ver >> /tmp/backup_add_header
27     #we leave here 7 blank lines,so we have total 10 lines include above 3 lines at the top of /tmp/backup_2
28     echo "product=`uci get system.system.hostname`" >> /tmp/backupFile
29     echo "hw_ver=`uci get system.system.hw_ver`" >> /tmp/backupFile
30     echo "fw_ver=`uci get system.system.fw_ver`" >> /tmp/backupFile
31     for i in 4 5 6 7 8 9 10
32     do
33         echo "" >> /tmp/backupFile
34     done
35     cat $conf_tar >> /tmp/backupFile
36     encryconfig encrypt /tmp/backupFile /tmp/backupFile_encode
37     #cat /tmp/backup_add_header_encry 2>/dev/null
38
39     #rm -f "/tmp/backup_add_header"
40     #rm -f "/tmp/backup_add_header_encry"
41     rm -f "$conf_tar"
42 fi
43     rm -f "$CONFFILES"
44 }

配置文件由文件头和一个tar包组成。文件头是10行文本,这个可以在备份出的文件中截取。在tar包里放我们想写入的文件,与文件头合并成在一起。最后用openssl加密就可以了。

原文地址:https://www.cnblogs.com/LikeVirgo/p/8884716.html

时间: 2024-11-02 22:07:28

斐讯K2P通过配置文件开启telnet的原理分析的相关文章

斐讯k2路由器v22.4.6.3版本刷breed刷华硕固件方法

v22.4.6.3版本配置文件要与路由器MAC对应,不能用导入未经修改的文件来刷了. 刷机步骤: 一.下载breed web控制台助手刷breed 1.开启Telnet服务 设置:控制面板→程序→打开或者关闭window功能<WIN10查找方法是设置→应用功能→收索(打开或者关闭window功能↓ 程序和功能→打开或者关闭window功能>→勾上(Telnet客户端)→确定 2.安装WinPcap 使用助手需要先安装WinPcap包 WinPcap下载地址:http://www.winpcap

[无线路由] “免费”斐讯K2路由器刷OpenWRT(实战MWAN多宽带网速叠加)

(阿财首发于什么值得买)斐讯K2可以算是一个非常另类的跨界数码产品,其产品完全的醉翁之意不在酒.最多值99元的 MT7260硬件架构和用料,售价399元,金额激活K码后自动转入合作理财P2P平台,等待一个月可以全额返还路由器金额的"免费"模式,让阿财的小 伙伴们在群里讨论差不多大半个月. 心痒痒又怕上了贼船,因为阿财的家中实际上有2条宽带 --线路一.联通20M双绞线PPPoE宽带入户:线路二.广西广电网络8M广电宽带,由数字电视机顶盒接出.两条宽带原来没有支持DualWAN的路由 器

【MT7620A】斐讯路由器K1/K2刷机说明

斐讯路由器自开展活动以来,销售量剧增,特别是斐讯K1/K2系列. 京东或者某宝上都可以参与0元购路由的活动,其中,经测试,价格为99元的FIR302系列可刷空间不大.另外价格为199以及399元的k1/k2存在技术漏洞,使得刷机这一操作成为可能.下面以斐讯K2为例,介绍一下斐讯路由的特性. 1.mt7620a固件是应用比较广泛的一种芯片,许多网络解决方案公司或企业研发的设备都使用此芯片.因此,斐讯K2路由器可刷空间非常大,目前网络上已经有许多版本不同,功能不同的固件可供选择. 2.K2内存为64

linux怎么开启telnet服务

1>编辑telent的配置文件/etc/xinetd.d/telnet 如下: (设置disable = no,也就是开启telnet服务) service telnet { disable = no socket_type = stream server = /usr/sbin/in.telnetd # server_args = protocol = tcp user = root wait = no } 2> 配置文件改好后重启服务即可: service xinetd restart l

无需任何软件!斐讯K2 V22.x.xx.xx版本刷机教程(2016年11月更新)

斐讯 斐讯K2 V22.X.X.X 新版固件 刷机教程 (开telnet,安装SSH,adbyby,刷breed,华硕Padavan) 基本属于无脑操作,点击恢复就可以自动刷好breed,浏览上传新固件就完成刷机,理论上能认识字就会刷. 支持的版本:V22.3.15.128V22.3.15.232V22.3.17.148V22.4.2.8V22.4.2.9 V22.4.5.39(需降级) 2016年11月11日目前最新版本是 V22.4.5.39. 将来更高的版本支持不支持取决于斐讯的封堵速度.

斐讯 FIR151M 频繁掉线(OpenWRT解决方案)

0. 现象与前言 在使用斐讯 FIR151M 路由器连接网络时,传输数据时频繁掉线. 官方固件刷了两个版本,问题未解决. 建议高级用户看本教程,要做好不能使用 Web 管理界面的心理准备. 1. 准备 没有打开telnet和ssh服务,因此考虑直接在硬件上下手,在板子上找到了串口. 上排针.电烙铁.焊锡,引出了四个点,方便使用模块进行通讯,见下图. 之后拿PL2303模块连上计算机,使用超级终端通讯.(PuTTY也是可以串口通讯的) 2. 初步探究 a. 启动 打开超级终端,连上了串口,重开路由

极路由 斐讯K2 Newifi 华硕固件 实现ipv6穿透方法

摘要:校园网带ipv6协议,可以用来登六维,玩PT.传统路由器只能实现ipv4的路由功能,不能实现ipv6路由功能.我这边的校园网是ipv4需要登陆账号,ipv6原生免费.传统方法需要使用桥接模式,但是每连一台设备都需要登陆一个ipv4账号.那么如何实现路由器只能一个账号,既能使用ipv6又能使用ipv4成为一个可以研究的问题. 设备:极路由 斐讯K2 Newifi等等,要求刷华硕固件 方法: 方法一(转载地址:http://webcache.googleusercontent.com/sear

雄迈摄像头远程开启telnet研究

年前买了个雄迈摄像头,对家里进行安防监控, 该摄像头其实就是个安装了linux系统的嵌入式设备,到手后,对于其未默认开启telnet服务感到很是不爽,所以打算hack之 最简单的办法其实是ttl连上去后开启,其次就是下载固件后直接更改固件,在启动脚本里增加启动telnetd的语句后刷进去,但是因为是新买的,不想失去保修,而且也想趁机多研究学习下,所以只考虑有没有远程开启的办法 从固件开始下手,先去官网下载该摄像头的最新固件 下载完后本地解压,查看了下busybox的定义列表,确实有telnetd

centos6 开启telnet服务

今天要做实验要用到telnet,发现用Centos6可以用telnet连接Centos7,但是Centos7不能连接Centos6, 分享一下解决方案. Centos6中的telnet服务是非独立式服务,在centos6中有些服务使用很少,关掉又不合适,这些服务依赖于xinetd -- 超级守护进程. 当服务托管于xinetd时,当有人访问该服务时,xinetd会把该服务唤醒.让该服务工作. 配置文件: /etc/xinetd.conf. /etc/xinetd.d/<service> 首先要