iot学习感悟
关于加密
前期接触iot我们遇到固件基本都是binwalk一把梭,但有时候会遇到固件信息混乱,或者分析出来一堆zlma的文件,没有发现有rtos或者文件系统的标志。
这时候会考虑到是否加密,上网查会发现有用 binwalk 的 -E 参数来判断。
那么这个判断的原理是啥?
原理是信息熵。
熵:泛指某些物质系统状态的一种量度,某些物质系统状态可能出现的程度。
初高中应该都学过,熵值越大,说明系统越混乱。
信息熵:1948年C.E.Shannon(香农)从热力学中借用过来提出的概念,解决了对信息的量化度量问题
信息中,重复的内容越多,系统越稳定,能获得的信息越多。
对于没有加密的二进制文件来说,某些指令出现的频率通常很高(如序言、nop序列等),并且数据结构几乎没有随机性。重复概率很高
所以,对于未加密的数据来说熵值一般会比较低。
对于经过加密的文件来说,都会想尽办法隐藏自己的信息,而导致很少有重复的内容,也就导致重复概率低
所以,加密的熵值一般都会高。
上面就是通过信息熵来判断是否加密,binwalk使用相关算法来整理信息熵
关于web服务
嵌入式的web服务通常是cgi+http 或 lua+http
cgi是叫公共网关接口,是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
常见的嵌入式设备使用的web服务多为以下几款
boa
单一任务型的http服务器,只会对CGI请求进行fork
进程,没有访问控制功能,身份认证都是厂商后边开发的。
通过translate_uri
函数解析请求路径I判断是否为CGI请求,调用init_cgi
来execve
执行相关CGI程序
translate_uri
函数中的init_script_alias
函数,负责解析ScriptAlias
请求,设置请求cgi类型,查看文件是否存在以及具有相关权限
通过ScriptAlias
在boa.conf
配置文件中,该指令设置CGI执行的真实目录
不止是boa,nginx的设置中也存在alias,小米路由器就曾因为这个设置导致路径穿越
uhttpd
openwrt的默认http服务器,主要是为了和LucI Web接口方便OpenWrt设备管理。
支持与cgi,lua,UBUS来完成请求。
uhttpd使用LuCI框架编写lua处理脚本,安全审计偏向于Web安全中的代码审计。
但也有一些存放的lua脚本是编译过的,需要逆向。
uhttp下dispatch_find
函数根据请求的url找到合适的dispatch_handler
。
请求的url通过check_cgi_path
函数校验,则会调用cgi_handle_request
函数回调cgi_main
函数execl
执行对应的CGI程序
最终调用的/www/cgi-bin/luci
即Luci,luci是MVC设计思想的web后端框架。
简单了解下,后面一款小米路由器分析思路会详细介绍
Goahead
在route.txt
定义的路由规则,根据匹配的URI来执行不同的handler:有action handler直接在GoAhead进程中执行C函数,CGI handler执行新的CGI程序,也有默认的file handler处理文件请求,还可以自定义新的handler
详细请看官方文档:https://www.embedthis.com/goahead/doc/
调用websUrlHandlerRequest
函数找到匹配URL前缀的处理函数,可以借助websFormDefine
函数定义与formName
相关联的C处理函数
由上面几个可以看出来,都是通过URL来选择执行CGI/lua或是内部程序
并且根据PATH_INFO
选择执行程序内最终的handler函数。
这里属于个人复述,这个文章比较详细:https://github.com/Larryxi/Larryxi.github.io/blob/master/_posts/2020-02-03-iot-web-server-cgi-handler-analysis.md
分析的一些思路
分析的话根据上面的东西来看
一定要有个设备,或者去模拟这些设备。
保证正常的web访问,方便查看功能调用的url/接口。
一定不要去公网站直接用人家的设备,要做个守法的好孩子!!!
根据上面的知识来获取相关功能的具体实现位置。
然后分析危险函数,以及是否可控。
或者
从危险函数向外分析功能点。