基于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为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...
随机推荐
- 二叉排序树的理解和实现(Java)
二叉排序树的定义和性质 二叉排序树又称二叉排序树.它或者是一个空树,或者是一个具有下列性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值 若它的右子树不空,则右子树上所有结点 ...
- POJ 1183
#include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("a ...
- SQL Server 数据库存储过程实例
USE [UFDATA_999_2014] GO /****** Object: StoredProcedure [dbo].[p_XMonPerNums] Script Date: 06/12/20 ...
- jQuery中的100个技巧(译)
1.当document文档就绪时执行JavaScript代码. 我们为什么使用jQuery库呢?原因之一就在于我们可以使jQuery代码在各种不同的浏览器和存在bug的浏览器上完美运行. <sc ...
- notepad++上搭建gtk+2.0/3.x开发环境
前言 老师布置了一道题需要用到图形界面,于是开始找图形库.最后选择了gtk+图形库,然后折腾了大概一天. 这里记录自己新学到的知识,同时也给后来者一些便利. 准备 下载以下内容 notepad++(由 ...
- 小程序之底部tabBar
用法简介: 1.app.json中配置下tabBar即可,注意tabBar至少需要两个最多五个Item选项 这里简单列举一些属性值:对于tabBar整体属性设置: 对于tabBar中每个Item属性设 ...
- 程序员为什么要写if else,为什么要和别人不一样
程序员为什么要写if else,为什么要和别人不一样 前言 无聊,睡不着!本文只是随便写写而已!感叹一下程序员的生活! 刚看到一个八级程序员的分级,所以就写了这个随笔,分级如下: 第八级 ...
- tcpdump一个命令的剖析
简单介绍:用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据 ...
- python分布式爬虫打造搜索引擎--------scrapy实现
最近在网上学习一门关于scrapy爬虫的课程,觉得还不错,以下是目录还在更新中,我觉得有必要好好的做下笔记,研究研究. 第1章 课程介绍 1-1 python分布式爬虫打造搜索引擎简介 07:23 第 ...
- sqlserver数据导入导出问题
sqlserver,如果用结果另存为,导出txt数据,然后在导入数据库,有时候会出问题,很难解决. 但是全选,右击,复制到自己创建的txt里面,在导入数据,就不会有问题的. 神奇,不知道为什么,但是能 ...