盗賊の極意

Feed Rss

入侵自己家的监控摄像头 (二)

11.01.2017, 未分类, by , 38 views.

要找出HTTP服务器的漏洞,先要确定这是用的什么服务器软件。
我发现 404 response 的 Reason-Phrase 是“Site or Page Not Found”,而不是最常见的"Not Found"。搜索“Site or Page Not Found”发现这很可能是某个早期版本的 goahead 服务器程序。
搜索可知 goahead 程序在早起有很多bug,甚至包括远程执行任意代码的漏洞。不过直接试用执行远程代码的漏洞失败了...
有一天突发奇想,能不能从固件升级包中找到 goahead 的版本信息呢?于是下载了一个 firmware 的 bin 文件,用 Binwalk 打开后,找到了 goahead 的可执行文件。此时终于可以确定服务器端软件用的就是 goahead 了。
不过开发方也不是拿来就用的,它们似乎注释掉了源代码中关于 goahead 版本信息的代码,这就很恶心了。好消息是这个 goahead 软件是开源的,不过官方 repo 里只有从2.5版至今的代码历史,但根据可执行文件中的内容推测,摄像头中的 goahead 是一个早于 2.5 版的版本。为什么官方不提供更早的版本管理信息呢?看源代码,我才之前是用 svn 管理的代码,后来在迁移到 git 时直接复制进来,放弃了 svn 时代的代码历史。现在官网也不提供更早版本的下载了,无奈之下在 github 上找到了几个包含早期 goahead 版本的 repo,从中提取出了几个离散的早期版本的 goahead。有趣的是,我无论如何也找不到1.x版本的 goahead,我猜这个软件是进入2.x时代开始才改名叫 goahead 的吧。
那么,我是怎么根据可执行文件推测程序版本的呢?说来惭愧,用的是一个很土很低效的方法。
首先,goahead 是一个 c 语言编译出来的程序。c 语言的编译器我不是很了解,但是直觉上来讲,编译后常量字符串应该原样储存在可执行文件体内。搜索发现事实符合我的猜测,而且编译器会就近把同一个原文件中出现的字符串按顺序放在相邻的位置。
根据以上信息,我通过比较代码的变更历史,找到了一些仅出现在特定版本中的字符串和它们的排列顺序,最终确定我的摄像头使用的是2.1.4到2.1.8之间的某个版本的 goahead。
根据这个版本信息,我找到了几个可能可用的 goahead 的漏洞信息,但这些漏洞信息都只说漏洞适用于2.1版本,没有小版本信息,没办法只好根据代码推测漏洞是否依然可用了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>