bookmark_border【开坑】入侵自己家的监控摄像头 (一)

养猫之后,家里架起了两台监控摄像头,以供我上下班无缝赏猫。

摄像头本身有ddns功能,但想想看自家的监控摄像头可以被整个网络直接访问到,纵使有密码保护,心里还是觉得很恶心的。所以我在公司都是用vpn连回家里,在家庭内网环境中访问摄像头。

事实上两台摄像头中有一台是几年前买来看家用的,另一台是为了看猫最近新买的高分辨率版。两台摄像头并不是同一厂家出品,外形也很不相同,但神奇的是网页端管理界面竟然迷之相似,我一度以为这是同一集团不同分公司的产品。

ipcam

后来经过我反复调查,发现这应该是某种现成的套件,各家厂商都在用罢了。

这个网页版管理界面做的可以说非常之 low。不说他杂乱的前端源代码,充满学生气息的界面设计,就连最重要的功能上都是严重缺失的。一个监控摄像头,竟然只有在IE下下载安装插件才能观看有声的实时直播,用 chrome 和手机浏览器都只能接收一张张的截图拼成一个幻灯片来看,声音更是甭想了。

我知道由于浏览器功能或者说 HTML 规则的限制,仅靠前端无法实现接收和播放 rtsp 直播流,但问题是服务器端也是你自家的啊,你做个 flv 直播流,做个 hls 直播流,怎么样都好,现成的库那么多,想让浏览器看个视频直播有什么难的= =

chrome 也真是讨厌,推翻 npapi 插件,又放弃了自家的 nacl 插件,跑去投奔一个不支持 socket 的 webassembly,导致我想自己写一个接收摄像头 rtsp 直播流的 chrome 插件都做不到了。虽然我也可以先写一个代理服务器,把 rtsp 流翻译成 flv 流或 hls 流,再用浏览器插件播放,可那很花功夫啊!我虽然喜欢写代码,但也会嫌麻烦的!

 

吐槽先放一放,说回到标题来。

从买到监控摄像头的第一天起,我就一直在担心摄像头被黑的问题。虽然我已经层层设防了,但每次进入摄像头的拍摄范围时还是时刻小心。没办法,我就是防人之心很重的人= =

想摄像头不被黑,先得知道摄像头会怎么被黑,然后才有办法防御嘛。再加上网络入侵本来就是一件对小青年很有吸引力的事,所以我开始好奇能不能入侵自己的网络摄像头。

参考这篇文章,我nmap了一下我的两台摄像头,发现并没有像作者遇到的情况那样简单的暴露出telnet端口或其他可疑端口。虽然证明我的摄像头更安全更不容易被人拿去搞ddos,但也让我更难入侵了…

直接登录不成,就从暴露出来的 http 服务器上找找线索吧。于是继续回来研究这个网页版后台。

大概看了一下,发现可能有多个服务器端程序在服务 http 请求:

看 response header 可知,服务器端的静态文件和 asp 脚本是跑在一个 http/1.0 服务器上的,返回的 server header 是厂商自定义的 “IPCamera-Web”。

另一方面,请求服务器上的 cgi 脚本或当请求返回 404 时,返回的 response 表明他的服务器使用 http/1.1 协议,此时返回的 server header 依然是厂商自定义的 “IPCamera-Web”。这个 1.1 的服务器的 200 response 总是会返回 “connection: close” header, 可见人家真的是 http/1.1 的服务器端呢。最后,当服务器请求失败返回 404 或 500 时,response 中不会携带 “connection: close” header,加上没有 content-length,也没有 chunked transfer encoding,仅从传输内容上已经无法判断这个 response 应该从何处结束了。不过从浏览器能正常访问后台页面这一点来看,1.1 的服务器端可能是发送 response 后直接断开了 connection,帮助客户端判断出了 response 的结束。不管怎么说,这最后一点使这个 1.1 服务器的实现显得很业余。业余好啊,说明代码中可能存在的安全隐患多,有助于我入侵系统。

bookmark_border【突发奇想】关于代码美化,关于大神

记录一个突发奇想。一个有趣但逻辑还不完善的思考方法论。

———-

代码就像人的容貌。
没过脑子优化就直接写出来的代码是素颜照,写好之后反复打磨过的代码是浓妆照。
为了把项目开源,在公开前先狠狠整理一遍代码,就相当于去正式场合之前精心打扮,盛装出场。
在为了验证想法,为了个人使用之类不公开的场合随手写出来的代码,就像回到家里不用上妆的和家人平平淡淡打打闹闹。不求出风头长脸,只求自己舒服。

当一个人上妆后会被人称赞时,说明她知道美的方向,并能够朝使自己更美丽的方向努力了。(比如注意保养?)
当一个人素颜也会被人称赞时,说明她是真的美了。这种美不浮夸(可能不会有完备的文档和注释),但足以服众。

———-

ookami_1024_768

图文无关

 

我在工作中有幸遇到过一位”裸妆也很美”的大神,那是我的程序水平达到”知道自己很强”以来,第一次因为和别人的技术实力差距而感到震撼。
我可以做到模仿他的代码设计和注释厚度,但恐怕不会像他一样在项目等待他快速完成,而他也明知道这段底层代码今后除他以外几乎不可能有人碰的情况下,依然保持了如同开源项目一般高质量的代码结构设计和充足必要的注释。
在做截止日期比较近的任务时,我依然可以坚持给每一个函数和变量一个合理的命名,并尽可能避免同一段代码出现在多个地方,或者过长的函数体等等代码坏味道,除非是历史遗留原因。这些坚持在我看来根本不值一提,也没什么太大价值,但给10年前的我来看的话,这个水平”素颜颜值”也足以被称为”大神”。
“大神”不是一个绝对的评价,它只是说明我们之间有着遥远的距离。现在的我已经成为了10年前的我眼中的”大神”,希望接下来,5年后的我能成为现在的我眼中的”大神”。
但如果只是这样一说,我还是很难具体了解我5年后到底要做到什么程度才算达成目标,所以参考那位震撼了我的大神,再加上一些我个人在技术方向上的追求,列出我对”5年后的我”的期望:

1. 平时习惯性写注释,认真起来能写出商业工程级别的严谨注释。

2. 写1w行左右规模的单一功能模块时,有自己熟悉到伸手就来的框架设计。为此,希望能写至少5个1w行以上规模的模块的经验。

3. 有从头到尾一个人完成简单的网站前后端开发和底线级别商业网站页面排版布局的能力,尤其需要自动化测试、项目收尾和上线运营部分的经验。
不是徒手简单搭起来就行,要的是商业级的完成度。至少包括:
要有开发人员增加以后立刻就能扩充为一个团队开发项目的清晰功能划分。
新人加入时能快速搭建环境的自动化构建,辅以简单的构建指导文档。
后端要能够自动化测试,在代码规模膨胀之后,依然能够依靠便利的回归测试,进行各种影响范围巨大的代码变更。
有成熟的log管理方式。

4. 有至少两个自己主导程序开发的小型游戏项目上线。
不管是 app store / google play, 还是steam, 甚至 comike 都可以。

嗯,说实在的,就算现在有一个人向我展示了上述全部能力,我可能也不会觉得这个人是大神,至少不会被震撼。
震撼这个感觉,还需要一点偶然性。
如果是一个人不经意间流露出高超的程序能力被我察觉到,之后我搜索这个人的履历,自己发现了这个人的各项能力的话,才会更震撼一些。反正是有点主观要素在里面的。
不管怎样,为了尽快成为一个能震撼到2017年的我的人,努力的脚步不能停。而且要加速,更要有计划!