背景
- 需要获取联网状态,设备识别号(IMEI),ICCID,重启设备
- 通过AT可以获取网络状态,SIM的ICCID
- linux下需要修改内核驱动才能出AT口
效果预览
获取信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| { "sysinfo": { "hardware_version": "NZ_SSG_V20", "device_name": "MIFI", "version_num": "NZ_NZ_CP_2.174.000X", "version_date": "Oct 6 2018", "model_name": "LV01", "main_chip_name": "PXA1802", "ssg_version": "LV01MVL01", "ssg_compile_time": "Oct 6 2018 10:38:24", "current_device_mac": "ac:3d:d3:d5:6d:af" }, "wan": { "IMEI": "869300038716XXX" } }
|
突破口
- 设备自带一个网页管理工具
- 该工具需要登录,基于变种的Digest realm登录验证
- 网页是通过ajax访问/xml_action.cgi读取和操作设备
- 必须先完成一次登录,才能通过普通的Digest realm机制访问xml_action
操作流程
1 2 3 4 5 6
| 1. 访问/login.cgi,服务器返回header WWW-Authenticate 2. 解析WWW-Authenticate,得到nonce 3. 先使用uri=/cgi/protected.cgi生成签名,作为url参数. 这点非常重要 4. 再使用uri=/cgi/xml_action.cgi生成普通的Digest realm签名,放入header 5. 使用上两步的参数和签名,访问/login.cgi, 服务器返回200代表登录成功,500代表失败 6. 使用普通Digest realm签名,访问/xml_action.cgi, 可以读取和操作设备
|
Digest realm签名算法简介
https://zh.wikipedia.org/wiki/HTTP%E6%91%98%E8%A6%81%E8%AE%A4%E8%AF%81
1 2 3 4 5 6 7
| HA1 = md5_hex(username:realm:password) HA2 = md5_hex(method:uri) // method是GET/POST/PUT等, uri是/cgi/protected.cgi(仅登录)或/xml_action.cgi // 其中nonce是访问/login.cgi时获取的 // nonceCount是16进制自增数列,login总是1,后续请求逐次+1 // clientNonce是客户端随机字符串,长度12字节,数字+字母就行 // qop总是auth RE = md5_hex(HA1:nonce:nonceCount:clientNonce:qop:HA2)
|
演示代码
基于Java的示例代码,2018-10-06的AT固件验证有效
https://gitee.com/wendal/Air720Master
附上部分可以操作
module总是duster,还没发现例外
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // http://192.168.0.1/xml_action.cgi?method=get&module=duster&file=status1 // 全部状态? status1 // 流量信息 statistics // 上网配置 wan // 局域网配置 lan // PIN/PUK设置 pin_puk // USSD设置 ussd // 联网设备 device_management_all // 设备统计 device_management // 日志 detailed_log // 自定义防火墙 custom_fw // 端口过滤 port_filter // 端口转发 port_forwarding // 电话本 phonebook // 短信 message // 管理员配置 admin // 固件版本 firmware // 重启 reset
|