|
本帖最后由 DevLabs 于 2015-7-5 11:10 编辑
转自知乎: http://www.zhihu.com/question/30358197
小米路由器404错误页面美化功能将用户访问链接提交到服务器已是毫无疑问,那么就请大家回答一下这个问题:
出于什么样的目的,小米路由器404错误页面美化功能将用户访问链接提交到小米服务器? - 小米科技
“404错误页面美化”不仅仅是响应页面被修改,更严重的问题是用户访问链接被发送到了小米的服务器,这就涉及个人隐私泄露问题。我做了一个实验,通过在小米路由器上抓包,获取了页面重定向和美化页面相关的HTTP请求信息。
以PlayBoy官网为例,先在浏览器地址栏输入网址,发现现在PlayBoy主页很素。于是想试探一下,有没有隐藏的内容,于是把首页地址后面加了naked/。(思想不健康)
然而naked目录并不存在,于是出现了小米的“404错误美化页面”。
用wireshark打开tcpdump抓包文件,看到了HTTP请求报文:
在重定向页面请求报文中发现向小米服务器提交的URL中含有刚才访问的链接信息。
这是最终的404错误美化页面请求报文,链接中含有一段BASE64编码的信息,在浏览器地址栏里也能看到这段信息。
通过在线解码网站得到BASE64解码信息,其中包含了用户的路由器设备ID和访问链接。
通过以上实验,我们可以看出:小米路由器向服务器报告了用户访问的链接,并与唯一的设备ID关联。如果用户正在访问了敏感网站,或者链接中含有敏感信息,遇到404错误时,这些信息将被发送到小米服务器,导致个人隐私泄露。这才是小米路由器“404错误页面美化”功能最危险之处。
7月1日补充一个实验:
某网站没有使用https协议,某天网站维护员在升级时出现差错,导致用户登录时出现404错误,我们来看看小米路由器是如何美化网页。
测试的网站是:http://www.weixinto.com/,在登录页面里输入用户名:admin,密码:1234567890,如下图所示。
点击“Login”按钮后出现了小米路由器的404错误美化页面,我们留意到页面链接的域名api.miwifi.com,是小米公司的服务器。完整链接是:http://api.miwifi.com/error-page ... HQ&error_type=1
404错误页面截图如下:
将链接中从data=后到&error_type=1之间的字符串复制,然后贴到在线Base64编码/解码器里解码,得到:device_id=fa69d2c3-2059-4b18-aa8f-a6fc858cd7b6&rom=&hardware=&channel=&error_type=1&sc=404&url=http%3A%2F%2Fwww.weixinto.com%2Flogin%2F%3Fuser%3Dadmin%26pass%3D1234567890&tpl=default
看到了在登录页面中输入的admin和1234567890,还有路由器的设备ID,这些信息已提交到了小米的服务器。
6月29日更新:
上面的实验只是通过抓包了解到小米路由器404错误页面劫持情况,接下来以1T硬盘版小米2.2.9稳定版固件为例,分析其工作原理。
启动脚本 /etc/rc.d/S99http_status_stat 符号链接到 /etc/init.d/http_status_stat,在这个脚本文件的start()中加载几个与404错误页面相关的内核模块(.ko文件)。
start()首先判别http_status_stat.settings.enabled参数是否为1,如果不为1就退出。也就是通过这个参数关闭404错误页面劫持。
start()接着判断nvram参数CountryCode (国家代码)是否为CN,如果不是CN就退出。由此可见,小米不敢在其他国家使用404错误页面劫持。
- start() {
- config_load "http_status_stat"
- local switch
- switch=`uci get http_status_stat.settings.enabled -q`
- if [ $switch -ne "1" ]; then
- return 0
- fi
- local cc=$(nvram get CountryCode)
- cc=${cc:-"CN"}
- if [ $cc != "CN" ]; then
- echo "http_stat: Bad Country!"
- return 0
- fi
- fastpath=`uci get misc.http_proxy.fastpath -q`
- [ -z $fastpath ] && return 0
- if [ $fastpath == "ctf" ]; then
- if [ -f $APP_CTF_MGR ]; then
- $APP_CTF_MGR http_stat http on
- fi
- elif [ $fastpath == "hwnat" ]; then
- echo "http status can work with hw_nat."
- else
- echo "http_status_stat.init: unknown fastpath type! Treat as std!"
- fi
- insmod nf_conn_ext_http >/dev/null 2>&1
- insmod nf_tcp_proxy >/dev/null 2>&1
- #echo "open and set proxy action to kernel"
- echo "ADD 5 $LIP $PROXY_PORT" > $CFG_PATH
- # ensure start switch
- echo "1" > $SWITCH_PATH
- insmod http_status_code_proxy >/dev/null 2>&1
- [ -f $REFERER_PATH ] && echo $REFERER_STR > $REFERER_PATH 2>/dev/null
- return 0
- }
复制代码
下一步要弄清楚三个内核模块在干什么?
- nf_conn_ext_http.ko
- nf_tcp_proxy.ko
- http_status_code_proxy.ko
复制代码
先看看文件里有哪些字符串?
这些字符串含有hijack,请英语达人给翻译一下hijack的中文意思。
tcp_hijack_func
security_hijack
http_response_hijack
http_response_hijack
security_hijack
%s, security hijack successd!
%s, security hijack failed for some reason!
%s, syn ack but can NOT hijack!!
nf_tcp_proxy.ko的大致功能:
向内核的netfilter挂钩子,监视经过路由器的TCP报文。将HTTP报文通知
http_status_code_proxy,http_identify,http_match,http_content_type_mark这些模块。这些模块解析http报文,如果需要劫持,就调用nf_tcp_proxy中的相关函数,让nf_tcp_proxy生成相关TCP报文,然后注入到TCP会话中。由此可见,这就是TCP会话劫持。
下面是在nf_tcp_proxy.ko中发现的一段字符串,这是跳转404错误页面时注入的HTTP响应报文的模板。
- GET /error-page?error_type=1&sc=
- Host: api.miwifi.com
- Connection: keep-alive
- Cache-Control: no-cache
- Accept: */*
- Pragma: no-cache
- User-Agent: HTTP/1.1
- Padding:
复制代码
调用nf_register_hooks函数,注册2个钩子函数:
- NF_IP_PRE_ROUTING ipv4_tcpproxy_pre_hook
- NF_IP_POST_ROUTING ipv4_tcpproxy_post_hook
复制代码
这2个钩子函数位于netfilter的最前和最后,前端用于监视,后端用于注入或重定向。借用一张图来说明钩子函数所处的位置。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|