本帖最后由 tengcai 于 2021-10-25 14:09 编辑
在我的B70上安装了mjpg-streamer,安装方法看帖子:潘多拉Pandorabox 19.02 MT7621(B70极路由)使用-mjpg-streamer-替代-局域网摄像头,首先就想要看下外网访问摄像头的安全情况:
1. 输入http网络地址,mjpg-streamer服务会返回401 http响应头,浏览器立即提示输入密码,401 http响应头如下:
发现mjpg-streamer服务会在Basic realm里明确提示自己是MJPG-Streamer,告诉浏览器是个摄像头,快来访问看看我,有些浏览器会显示这个realm信息(比如小米手机的浏览器),有些不显示(比如firefox);
2. 输入正确密码后,浏览器把用户名密码用BASE64编码存起来,以后每次浏览器请求数据都会给mjpg服务端发送这个BASE64编码,这个编码安全性靠谱吗?我用wire shark截获了这个HTTP数据,发现wire shark直接在下面就写出了Credential:用户名和密码,似乎BASE64解出用户名和密码就不叫事儿,关键是每个请求都会发出这个BASE64编码,就怕其他人看不到一样:
3. 这已经让我捏把汗的时候,忽然给了我一个安慰,别把资本家想得太坏好不,用UC浏览器输入网址访问摄像头,输入密码连接成功后,在服务器日志记录里可以看到,UC浏览器的加速功能会使用自己的服务器地址去连接这个摄像头的视频流,mjpg服务器回复了401请求输入密码,可是UC浏览器居然不会输入密码(或者说使用BASE64编码),说明用户名密码凭据,UC浏览器不会存到自己的服务器来使用,如果要验证的就不连了,这是个好消息不是?看下面的记录:
4. 好了,基本说明了外网用http去访问openwrt插件的mjpg-streamer的安全问题,用专业装b术语来说是mjpg-streamer内部自带的http auth basic的验证就是个防君子不防小人的东东;
5. 还有个纠缠我很久的东西,就是小米浏览器只要输入了1次用户名密码,就终生不用再输入了(指手机的终生哈哈),它会一直记得,我以为这个难不倒我,我满怀成就感的进入小米浏览器内的“设置”-“清除数据”-“全部清除”,然后再次输入mjpg摄像头地址,结果不用输入密码就进去了,于是开启了我的战斗模式,关闭浏览器再开,关机再开,发现我还是太天真,too naive,对资本家太信任了,马克思说过的话怎么能忘记呢?
6. 经过一星期的战斗,拜读了百度能给我的各种文章,我承认小米浏览器就是会记得,由于mjpg使用的是Authorization是auth basic,用户名密码是永远不动的,浏览器只要记住了,服务器也没有任何办法,除非服务器端使用auth digest做验证,里面有个nounce的东东,服务器只要改动下nounce,浏览器就必须提示客户重新输入用户名密码,而客户自己的用户名和密码是不变的,这才是打击浏览器的利器;
7. 好吧,确定了,只能从浏览器这边想办法了,我知道唯一的办法也就是给mjpg-streamer的网页做一个“登出”LogOut的按钮,如果不想浏览器继续记得,就点“Logout”按钮,而且在重新弹出用户名密码输入框时,用户名随便输入错,点“登陆”按钮,小米浏览器就遗忘密码了,这也是小米浏览器独特的本领,firefox浏览器点了"Logout" ,弹出输入框,点下取消就遗忘了,小米浏览器还得输个错的;
8. 最后还是要https出场去解决mjpg的安全问题,使用https SSL加密传输后,UC浏览器根本不会嗅探到有视频地址,无法使用加速服务器去连接,用wire shark抓到的401包也什么都看不到:
Data都是加密的,这下才算安全了。我使用https的办法也就是安装nginx做个反代服务器就可以,对潘多拉MT7621的nginx安装办法看下面的链接帖子: 潘多拉Pandorabox 19.02编译出MT7621(B70极路由)的uwsgi-cgi(nginx替代uhttpd)发帖只为纪念下自己的折腾,没有攻击哪个软件好哪个软件不好的意思,反正都得用,知道细节更能用好。
|