基于goahead 的固件程序分析
前言
本文由 本人 首发于 先知安全技术社区: https://xz.aliyun.com/u/5274
最近在分析 dlink
的一个固件时遇到了用 goahead
开发的 web
服务。本文以一个 github
上的 开源项目为例简单介绍下对基于 goahead
的程序的分析。
https://github.com/Grant999/goahead-1
这里用的 goahead
程序的版本为 2.5
正文
编译运行
把源码下载下来,然后使用 make
编译即可。
$ make
................................................
................................................
................................................
gcc -m32 -g -O0 -Wall -DWITH_NONAMESPACES -o webs -Os \
-DWEBS -DOS="LINUX" -DLINUX -DUSER_MANAGEMENT_SUPPORT -DDIGEST_ACCESS_SUPPORT -I. -g -O0 -Wall \
main.o libwebs.a
tempnam' is dangerous, better use `mkstemp'
编译完成后当前目录下会生成一个 webs
的文件, 这个就是 goahead
编译完成生成的二进制文件。
然后运行它,就会在 80
端口起一个 http
服务(监听 80
端口需要权限, 所以用 root
运行程序)。
$ sudo ./webs
webdir: ./www
然后用 浏览器去访问
分析
要测试一个东西,首先需要尽可能的去了解它(信息搜集)。
goahead 开发 api
我们首先了解一下 goahead
的工作机制。
GoAhead
自身实现了一个 web
服务器所需提供的基本功能,此外它提供了多种方法供用户扩展服务器的功能, 其中包括 asp
过程、GoForms
过程 , embedded JavaScript
以及外部 cgi
程序等, 用户可以根据这些接口开发出各种各样的功能。
对于 goahead
本身, 这个项目时间也非常就久了,安全性也得到了检验,所以我们分析的重点不是goahead
本身的代码,而应该是用户自定义的那些代码。
相关的 api
如下
websUrlHandlerDefine
websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);
表示 对 /goform
的请求都交给 websFormHandler
函数处理。函数的参数列表如下
int websFormHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
char_t *url, char_t *path, char_t *query)
其中 wp
这个参数里面包含了用户 请求的相关信息,比如请求头, 请求数据等。开发者通过 wp
这个参数就能获取到 用户请求的信息了。
websAspDefine
websAspDefine(T("aspTest"), aspTest);
当在 asp
文件中调用 aspTest
, 实际调用的是这里 aspTest
这个 c
函数
ps:
调用的 asp
函数的语句需要用 <% %>
包围
websFormDefine
websFormDefine(T("privacy"), FormPrivacy);
和 websUrlHandlerDefine
差不多, 表示往 /goform/privacy
的请求由 FormPrivacy
这个函数进行处理。
漏洞分析
根据上面提到的 api
在源代码里面搜索引用,可以很快的找的注册用户自定义回调函数的位置。
位于 initWebs
函数
向上面4个 websUrlHandlerDefine
是 goahead
自带的,这里不管它。
通过对下面几个注册的函数的简单浏览,在 FormPrivacy
函数内部存在一个栈溢出漏洞。
下面对这个函数做一个简单的分析
首先用
websGetVar(wp, T("Operate"), T(""))
获取 Operate
参数的值, 然后根据值的不同,进行不同的操作。
问题出在了 set
这操作的处理逻辑
首先取出几个参数, 然后使用 sprintf
把参数填到 szParam
这个缓冲区 (缓冲区大小为 20 * 20
), 这里 sprintf
使用的是 %s
不会校验字符串的长度,所以当我们传一个很长的字符串作为 Height
的参数值,就会触发栈溢出。
触发+简单调试
通过搜索关键字,定位到往这里 发请求的应该是 privacy.asp
然后访问他
填些参数然后抓包, 修改 Height
的值为一个很长的字符串
同时在 FormPrivacy
设置一个断点, 发送请求过去,程序会断下来, 我们可以看看参数信息。
可以看到 wp
里面保存了此次请求的相关信息, 继续运行可以触发栈溢出
总结
分析 goahead
等可供开发者扩展的程序,分析的重点应该在那些自定义的代码上。
基于goahead 的固件程序分析的更多相关文章
- 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析
PDF 版本下载:抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析 Author:知道创宇404实验室 Date:2017/03/19 一.漏洞背景 GoAhead作为世界上最 ...
- APM程序分析-AC_WPNav.cpp
APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...
- 【GWAS文献】基于GWAS与群体进化分析挖掘大豆相关基因
Resequencing 302 wild and cultivated accessions identifies genes related to domestication and improv ...
- 我是如何反编译D-Link路由器固件程序并发现它的后门的
OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧. 一时兴起,我下载了D-link无线路由器(型号:DIR-100 revA)的固件程序 v1.13.使用 ...
- (IOS)BaiduFM 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源app BaiduFM的研究心得. 项目地址:https://github.com/belm/BaiduFM-Swift 一.项 ...
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
- 二进制程序分析工具Pin在Windows系统中的安装和使用方法
这篇日志其实很弱智,也是因为换了新电脑,实验环境不全(当然,做这个实验我是在虚拟机里,因为接下来想拿些恶意代码的数据),所以这里记录一下在Windows下怎么安装和使用Pin这个程序分析领域最常用的工 ...
- Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序
Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序).没错,Robocopy的功能是拷贝文件,你也许会觉得无聊并且要翻阅下一篇文章 ...
- 【转】基于DM8168的视频智能分析系统的设计方案
[导读] 为了实现高清视频的智能分析功能,本文介绍了一种以TI公司的DM8168为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...
随机推荐
- 手机端布局,rem布局动态获取根字体大小
手机端布局,rem布局动态获取根字体大小. 以下代码: //rem布局动态获取根字体大小 function remDynamicLayout(){ var $windowWidth = $(windo ...
- activity和Task 有关的 Intent启动方式结合intent.setFlags()
通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序: FLAG_ACTIVITY_NEW_TASK----简而言之,跳转到的activity根据情况,可能压在一个新建 ...
- 有关Hadoop的六大误解
迄今为止,Hadoop和大数据实际上是同义词.然而随着大数据的炒作不断升温,出现了很多对Hadoop如何应用于大数据的误解. Hadoop是一种用于存储和分析大型数据集开源软件框架,可处理分布在多个现 ...
- Ubuntu各版本的历史发行界面
不多说,直接上干货! 总的网址是:http://releases.ubuntu.com/releases/ 比如,选择的是UbuntuKylin,则点击 http://cdimage.ubuntu. ...
- java学习-struts基础(一)
struts发展 struts是Apache软件基金会赞助的一个开源项目,是一个基于Java EE的MVC开源实现. 它为Servlet/JSP技术的应用提供技术框架2001.7--Struts1正式 ...
- C#中的Dictionary类,默认key是区分大小写的
在C#中定义一个Dictionary Dictionary<string,string> dictionary = new Dictionary<string,string>( ...
- Nodejs学习笔记(五)—Express安装入门与模版引擎ejs
前言 前面也学习了一些Node.js的基本入门知道,现在开始进入Web开发的部分: Node.js提供了http模块,这个模块中提供了一些底层接口,可以直接使用,但是直接开发网站那还是太累了,所以ht ...
- unity游戏开发之entitas框架
框架介绍 entitas是一个超快.超轻量的c# Entity-Component-System (ECS)框架,专门为Unity引擎设计.提供内部缓存和高速的组件访问,经过精心设计,可以在垃圾收集环 ...
- [HTML5] Canvas绘制简单图片
获取Image对象,new出来 定义Image对象的src属性,参数:图片路径 定义Image对象的onload方法,调用context对象的drawImage()方法,参数:Image对象,x坐标, ...
- SSH框架中NoSuchMethodError: antlr.collections.AST.getLine()的解决方案
问题: 当配置好SSH框架后,使用Hibernate的Query功能时发生如下异常: NoSuchMethodError: antlr.collections.AST.getLine() 原因: St ...