V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
V2EX  ›  Nyarime  ›  全部回复第 2 页 / 共 7 页
回复总数  127
1  2  3  4  5  6  7  
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@s1oz iKuai 内核 5.10.194 没编译 xt_TPROXY.ko

问题是我没法加内核模块,除非:编译一个匹配 5.10.194 的 xt_TPROXY.ko (需要 iKuai 的内核源码 那几乎不可能
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@Gipserr 除了 ik_rc_client 我们处理了,你说的采集上报连的是 dis.ikuai8.com:1853 ,这个我更新后喊您
今天目标就是把这个处理掉,然后完善 luci
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@lcy630409 我们的版本是做了免格的,不过 ikuaiyun 2 的阻断没做好,实在抱歉
打算在脚本中加 iptables 阻断,看了下二进制是不走 hosts 的也就是硬编码内容在这些服务不生效
ik_rc_client → as1.ikuai8.com:9443
as2.ikuai8.com:9443 (远程控制/云管理,这是主要的云在线连接)
ik_wpa_ppsk → yun.ikuai8.com
脚本:
client.shcoll.ikuai8.com:2016 (数据采集)
wecom.shiapi.ikuai8.com:21422
upgrade.sh → 云自动升级
webman.lua → yun.ikuai8.com/api/v3/router_bind/

等于说,我在测试 htop 兼容性的时候就看到 ik_rc_client ,这个也需要 kill 就是了
你也可以装个 htop 看下是哪个进程在通信,这个 level2 在设计上确实是要阻断的
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@lcy630409 感谢反馈,目前还是存在不少 bug ,待我 debug 后推送新版本
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@beck8 你直接找我 t.me/BaiPiaoZhenXiang 就好,v 站好像没私信功能
@xiaowowo iKuai 没签名、没 dm-verity ,头里只放 md5/sha256/length 只验证完整性
@lxxiil https://www.v2ex.com/t/1206946 看这个帖的 APPEND ,已补充
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@beck8 nyarc 是可以拆 4.0 的
我在修补 v69 后发了一个详版,你可以使用工具自己组装定制自己的爱快
https://forum.naixi.net/thread-11395-1-1.html
4 月 20 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@s1oz 目前在更新 v62 处理掉 vim 、nano 这类安装问题,已推送到 dl 可自行更新(老版本卸载 openwrt 环境时会把整个 libc 都移除导致 ikuai 无法进入,只能到控制台( rc.console )执行 6 恢复,或者使用官方免费版 ISO 引导保留配置升级
# v69 升级包
https://dl.naixi.net/ikuai-naixi/iKuai8_x64_3.7.19_Naixi_v69.bin
# 升级后在 SSH 执行
naixi openwrt uninit # 卸载原先的分包
naixi openwrt init # 获取最新的
注:如果在国内请自行下载 https://dl.naixi.net/ikuai-plugin/naixi-compat-x86_64.tar.gz 然后使用直链
naixi openwrt init <url>
# 案例:安装 nano 、vim
opkg install nano
opkg install vim

尽量迭代(因为 ikuai 的配置分区是保持的,所以不管 rootfs 用哪个版本的都会保留读取
也修复了应用列表里的 naixi list ,如果要装 proxy 类插件可能确实是需要适配一下的
4 月 19 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@lcy630409 已经 hook 掉了,如果你要自己解包组装 bin 可以用下 nyarcPro
# 0. 装工具:xz-utils + e2fsprogs
apt install xz-utils e2fsprogs # Debian/Ubuntu

# 1. 看一眼是啥版本
nyarc --fw-detect iKuai8_x64_3.7.19.bin
nyarc --ikuai-header iKuai8_x64_3.7.19.bin

# 2. 解密 rootfs (自动判断 fixed/dynamic key )
nyarc --ikuai-decrypt iKuai8_x64_3.7.19.bin rootfs.xz

# 3. 解压成 ext2 镜像并挂载
xz -d rootfs.xz # → rootfs (ext2)
mkdir -p /tmp/rootfs
mount -o loop rootfs /tmp/rootfs

# 4. 改你想改的(示例:改 root 密码 / 加开机脚本 / 屏蔽云控)
sed -i 's|^root:[^:]*:|root:$1$naixi233$AgpY4n3TdEDVt/AjLuM/y.:|' /tmp/rootfs/etc/shadow
sed -i 's/59.110.6.135/127.0.0.1/g' /tmp/rootfs/usr/ikuai/script/client.sh

# 5. 改完卸载
umount /tmp/rootfs

# 6. 重新 XZ 压缩(必须 CRC32 !内核不认 CRC64 )
xz -6 --check=crc32 rootfs # → rootfs.xz

# 7. 加密回去
nyarc --ikuai-encrypt rootfs.xz rootfs.enc fixed
# 3.7.22+/4.x 是 dynamic key:
# nyarc --ikuai-encrypt rootfs.xz rootfs.enc dynamic <对应版本 key>

# 8. 整包打回 .bin (自动算 hash + 拼 header )
nyarc --ikuai-repack <unpack-dir> iKuai8_x64_3.7.19_modded.bin
4 月 19 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@imnpc 你得传我做的 bin 上去升级... 官方版的就是 rc.console
4 月 19 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@laminux29 其实免费版和企业版就 5KB 差距,一个 sed 命令就能变企业版:
sed -i 's/FIRMWAREID=10001/FIRMWAREID=10002/' /etc/release
@xiaowowo 对于爱快也就两步而已,这个工具目前固件范围只有嵌入式及路由器和 IoT 设备,还没扩展到 Android 等手机厂商
解包:
nyarc --ikuai-unpack firmware.bin /tmp/ikuai/
→ header.json + vmlinuz + rootfs/ 全自动

构建:
nyarc --ikuai-repack /tmp/ikuai/ output.bin
→ XZ 压缩 + 加密 + Header 更新 全自动
@Cu635 希望对考虑买爱快 OEM 路由器的朋友有点帮助

1 )免费版和企业版的区别
众所周知,爱快官网提供免费版的 ISO 、IMG 安装包和 BIN 升级包,其他版本均需验证发票、返厂才能帮你重装,不会给你提供原包
同版本的免费版和企业版的内核完全一样,rootfs 只差约 5KB 。核心区别就是/etc/release 里多了 ENTERPRISE=Enterprise 一行和 FIRMWAREID 从 10001 改成 10002 ,这也解答了 lucienshui 大佬的 iKuai 历史固件下载 Enterprise 的 BIN 无法直接由免费版升级的问题
一个 sed 命令就能变企业版:
sed -i 's/FIRMWAREID=10001/FIRMWAREID=10002/' /etc/release

2 )固件 rootfs 用自研加密,但密钥通用
iKuai 的系统文件不是标准格式,用了自己写的加密算法。但所有 3.7.16 及以前版本用同一个密钥,3.7.17 以后密钥虽然不同,但密钥就存在文件末尾 20 字节处,也就是说任何人拿到固件都能解密看到全部系统文件,也就有了闲鱼上面贩卖的所谓插件版
网上流传的第三方插件商店会往你路由器的/etc/passwd 里注入一个叫 iksshd 的 root 账户,还会连接非官方服务器 patch[.]ikuai8[.]cn:8085 下载执行代码。

3 )官方留了 SSH 后门
爱快的“远程维护”使用的 sshd 账户,登录后是 iKuai 控制台菜单( rc.console ),但每个固件都有 MD5 隐藏的密码入口,输入特定字符串就能进入 root shell ,在分析 V2EX 上分享的 3.7.14 带 root 版本就发现了
而且这个密码 iKuai 开发者知道,用户不知道,任何知道密码的人都能 SSH 进你路由器拿到 root 权限。密码存在固件里,所有同版本路由器共用一套

4 )云端 WS 长连接远控,可以远程格机
无论免费版或企业版,系统在启动后通过 WebSocket 长连接到 as1[.]ikuai8[.]com:9443 ,使用双向 TLS 认证(所有设备共用同一套客户端证书)
同时连接 genuine[.]ikuai8[.]com 做正版验证。如果服务器返回验证失败,路由器会执行 clean_sn (清除你的激活信息、标记盗版、远程抹掉系统但保留配置分区),可以使用 ISO 安装选择保留原有配置恢复系统
另外__cloud_auto_upgrade 函数可在用户不知情的情况下推送固件更新,包括给你的软路由强制更新爱快版本、云推送 Docker 插件等,Docker 功能需要登录爱快云平台才能启用。实际上是远控客户端从 iKuai 服务器下载的二进制,不装在固件里,每次启动由 pmd 解压 ikp (加密的 tar.gz )文件加载

5 ) IPv6 多线有云控限制
企业版默认只给 3 条 IPv6 线路。这个数字存在/etc/mnt/.ipv6_multi 里,iKuai 会定期检查并重置。如果远控连接断了 24 小时,还会自动关闭多线 IPv6

不过看折腾 HomeLab 的佬都喜欢这系统,除了简单、傻瓜化,感觉不如 RouterOS 。不过 iKuai 自己也写了包管理器 pmd ,理论来说静态编译的 Go 都能打包成插件在上面跑,例如弄个 AdGuard Home 作为 DNS 上游接管这样,别的感觉就没啥好折腾的了(最近也在研究 见隔壁帖 👉 https://www.v2ex.com/t/1206946
4 月 19 日
回复了 Nyarime 创建的主题 OpenWrt 在 iKuai 爱快软路由上原生运行 OpenWrt 软件包
@xiaowowo 1 没收钱 2 资料来自于网上 3 那些闲鱼收钱的官方应该先去找 4 留后门 sm 答毕
@Nyarime 所以 V2EX 是不支持 markdown 格式吗???
@xiaowowo
# NyarcPro iKuai 固件操作教程

## 固件检测

```bash
# 检测固件类型
nyarc --fw-detect iKuai8_x64_3.7.19.bin

# 输出:
# Size: 45.6MB
# Vendor: iKuai
# Format: ikuai_firmware
# Version: 3.7.19
# firmwareid: 10001 (免费版)
```

## 固件解密

```bash
# 解密 rootfs (自动检测 fixed/dynamic key)
nyarc --ikuai-decrypt firmware.bin decrypted.xz

# 输出:
# 🔑 Mode: fixed (key=77b1fa93742cb39d3383553e848a5291)
# ✅ Hash verification: SUCCESS
# ✅ Decrypted: decrypted.xz (34.9MB)
```

### 密钥说明

| 版本 | 密钥模式 | 密钥 |
| ----------- | -------- | ---------------------------------- |
| ≤3.7.16 | Fixed | `77b1fa93742cb39d3383553e848a5291` |
| 3.7.19 | Fixed | 同上(使用旧版 vmlinuz ) |
| 3.7.22 Free | Dynamic | `9be61ec6f06181c3e68de54899c704bb` |
| 3.7.22 Ent | Dynamic | `58c0343a82e1447e89f423e39095a090` |
| 4.0.24 | Dynamic | `ab25f5f19c125f7620d27906de49f256` |

## 解压 rootfs

```bash
# 解密后得到 XZ 压缩的 ext2
xz -d decrypted.xz

# 挂载
mkdir /tmp/rootfs
mount -o loop decrypted /tmp/rootfs

# 浏览
ls /tmp/rootfs/
# bin dev etc lib lib64 mnt proc root sbin sys tmp usr var www
```

## 修改 rootfs

```bash
# SSH 密码
sed -i 's|^root:.*|root:$1$naixi233$AgpY4n3TdEDVt/AjLuM/y.:17857:0:99999:7:::|' /tmp/rootfs/etc/shadow

# 云控阻断
sed -i 's/59.110.6.135/127.0.0.1/g' /tmp/rootfs/usr/ikuai/script/client.sh

# 添加启动脚本
sed -i 's/return$/\/sbin\/naixi_boot.sh \&\n\treturn/' /tmp/rootfs/usr/ikuai/script/plugins.sh
```

## 重打包

```bash
# 卸载
umount /tmp/rootfs

# XZ 压缩 (必须 CRC32!)
xz -6 --check=crc32 decrypted

# 加密 (fixed key)
nyarc --ikuai-encrypt decrypted.xz encrypted.enc fixed

# 加密 (dynamic key, 指定密钥)
nyarc --ikuai-encrypt decrypted.xz encrypted.enc dynamic 9be61ec6f06181c3e68de54899c704bb
```

## 构建固件

### 完整流程

```python
import gzip, struct, json, hashlib, io

# 1. 解析原始固件
with open('original.bin', 'rb') as f:
data = f.read()
hdr_len = struct.unpack('>I', data[:4])[0]

# 2. 解压 header (gzip, 前 10 字节被 strip)
gzip_magic = b'\x1f\x8b\x08\x00\x6f\x9b\x4b\x59\x00\x03'
hdr_json = gzip.decompress(gzip_magic + data[4:4+hdr_len])
hdr = json.loads(hdr_json)

# 3. 解压 ext2 镜像 (完整 gzip, 不 strip)
ext2 = gzip.decompress(data[4+hdr_len:])

# 4. 修改 ext2 (mount→修改→umount→替换 rootfs)

# 5. 重新 gzip ext2 (mtime=0)
buf = io.BytesIO()
with gzip.GzipFile(fileobj=buf, mode='wb', compresslevel=9, mtime=0) as gz:
gz.write(ext2)
gz_full = buf.getvalue()

# 6. 更新 header
hdr['filename'] = 'iKuai8_x64_3.7.19_Naixi.bin'
hdr['length'] = str(len(gz_full)) # = gzip body 大小
hdr['md5'] = hashlib.md5(gz_full).hexdigest()
hdr['sha256'] = hashlib.sha256(gz_full).hexdigest()[:32]

# 7. gzip header (strip 前 10 字节)
hdr_str = json.dumps(hdr, separators=(',', ':'))
hdr_buf = io.BytesIO()
with gzip.GzipFile(fileobj=hdr_buf, mode='wb', compresslevel=9, mtime=0x594b9b6f) as gz:
gz.write(hdr_str.encode())
gz_hdr_body = hdr_buf.getvalue()[10:] # strip!

# 8. 组装
with open('output.bin', 'wb') as f:
f.write(struct.pack('>I', len(gz_hdr_body))) # BE 4 字节
f.write(gz_hdr_body) # header
f.write(gz_full) # ext2 (不 strip)
```

### 关键约束

| 约束 | 说明 |
| ------------------------ | ----------------------------------- |
| XZ 必须 CRC32 | `xz --check=crc32`,内核不支持 CRC64 |
| Hash 算明文 | 加密前计算 hash |
| sbox uint32 溢出 | 不要"修复"成 int64 |
| Header JSON 无空格 | `separators=(',', ':')` |
| Header gzip strip 10 字节 | ext2 gzip 不 strip |
| Header gzip mtime | `0x594b9b6f` |
| ext2 gzip mtime | `0` |
| length 字段 | = gzip(ext2)完整大小 |
| firmwareid | 10001=免费, 10002=企业 |

## 插件管理

### pmd 数据库

```bash
# 解密 pmd 数据库
# 密钥: ikupdat-d~#-
# 格式: Salted__ + AES-256-CBC + EVP_BytesToKey(MD5, count=1)
# 内容: JSON 数组 [{"name","version","secret_key","arch"}]
```

### 已知插件密钥

| 插件 | secret_key |
| ---------- | --------------------------------- |
| docker | `354a738f7b2756a848f3b8de541ec57` |
| docker-bin | `354a738f7b2756a848f3b8de541ec58` |
| shell | `70946f9965a3c140b28e36a82ed148b` |
| ik_host | `jJ9FzkgwUm6bL3dG` |
| pmd | `challstr@holly~` |

## 安全扫描

```bash
# 扫描 rootfs 安全问题
nyarc --scan /tmp/rootfs

# 输出:
# 🛡️ Security Score: 0/100
# 🔴 Critical: 75 🟠 High: 74 🟡 Medium: 417
# 🔴 Hardcoded Password in /etc/shadow
# 🟠 Weak Hash (MD5)
```

## 版本支持

| 版本 | 解密 | 加密 | 重打包 | 状态 |
| ------ | ---- | ---- | ------ | ----------- |
| 3.7.19 | ✅ | ✅ | ✅ | 完整支持 |
| 3.7.22 | ✅ | ✅ | ✅ | Dynamic key |
| 4.0.20 | ✅ | ✅ | ✅ | 验证通过 |
| 4.0.24 | ✅ | ✅ | ✅ | Dynamic key |

---

*Nyarc — Nyarime Advanced Reverse-engineering Console*
@bugtik 今早已经把后门拔了,刚刚补了 musl 环境,原生运行了 htop
![undefined]( https://img.meituan.net/content/ecc7aa97270176d77a60479eb7a83f4f558803.png)
@xiaowowo Nyarc 目前才刚开发好... free 是分析,pro 带了解包、打包,是可以重新打包的固件可以刷入硬件路由器(解决校验就行)
1  2  3  4  5  6  7  
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2631 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 10:20 · PVG 18:20 · LAX 03:20 · JFK 06:20
♥ Do have faith in what you're doing.