群晖的路由器好难分析,最后还是只能复现一下D-LINK的相关漏洞。
DIR-816历史漏洞
- CVE-2018-17066: Command injection. Credit: nabla
- CVE-2018-17068: Command injection. Credit: nabla
- CVE-2018-17064: Command injection. Credit: nabla
- CVE-2018-17063: Command injection. Credit: nabla
- CVE-2018-17067: Stack overflow. Credit: nabla
- CVE-2018-17065: Stack overflow. Credit: nabla
- CVE-2019-10041: Edit System Account Without Authentication. Credit: lbp
- CVE-2019-10039: Edit Web And System Account Without Authentication. Credit: lbp
- CVE-2019-10040: Remote Command Execute. Credit: lbp
- CVE-2019-10042: Reset Router Without Authentication. Credit: lbp
DIR-816管理页面分析
主程序位于 ./bin/goahead
输入账号密码后,将会向goform/formLogin接口发送如下图所示的数据包进行验证。从数据包中可以看到关键的参数有username,password以及tokenid,其中username使用了base64进行编码,password则进行了某种加密
ghidra
中查看函数 FUN_00457a74
的源码
1 | .... |
在更新BSS区的变量load_host后则会检测lan口和wan口的状态并返回对应的登录页面,随后将0写入/etc/RAMConfig/confirmlogin文件中
通过上述的分析,实际上D-Link路由器在认证成功后仅仅记录了成功登录的用户IP地址,随后将是否需要验证登录的Flag文件内容设置为了0。
如下图所示,
在更新BSS区的变量load_host后则会检测lan
口和wan
口的状态并返回对应的登录页面,随后将0写入/etc/RAMConfig/confirmlogin文件中。
相关的handler
对于cgi程序是如何处理路由还不是很熟悉,不过感觉handler
就是一个类似处理路由的函数
根据不同的url路径goahead进程将使用不同的Handler进行处理。看到有两个全局Handler,websSecurityHandler和websDefaultHandler。
websDefaultHandler会调用websValidateUrl函数对请求的url地址进行检测,主要的功能是对转义符号进行处理并避免’../‘路径穿越的问题。
相关代码如下:
1 | while (__s_01 != (char *)0x0) { |
form越权漏洞利用
通过对main函数分析,可以找到相关的form
函数
重点关注sub_458D7C
这个函数
可以执行任意命令了
写的比较仓促,路由器的模拟也没有成功,还是需要用qemu单独调试