基于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为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...
随机推荐
- Linux CentOS7系统中ssh的用法
大家都知道,公司买上服务器,不可能实时在线操作虚拟机,也没有那个时间和精力登录到公司的云服务商官网进行操作,一来不安全,二来也效率不高. 如果是购买的虚拟主机,你可以使用ftp进行本地程序文件传输和从 ...
- VSTO学习(五)——创建Word解决方案
一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个专题中,我将为大家介绍如何用VSTO来创建Word项目,对于Word的VSTO开发和Excel的开发很类似,你同样也 ...
- XmlDocument 避免XXE
string xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\&quo ...
- yum安装报错:Failure when receiving data from the peer
系统:Centos6.9 操作:yum install -y *.rpm 报错信息: Transaction Summary ===================================== ...
- linux一键安装php环境
1.下载一键安装包: http://pan.baidu.com/s/1o6lWyeu 2.unzip -x sh.zip chmod -R 755 sh ./install.sh 等待半小时左右 3. ...
- 初始JAVA中浅拷贝和深拷贝
1. 简单变量的复制 public static void main(String[] args) { int a = 5; int b = a; System.out.println(a); Sys ...
- WPF中定义TabItem的可选区域(特别是当使用Label来呈现Header时)
1. 如上图,所示,此时当鼠标移入蓝色框内除文字部分,整个TabItem是没反应的 经过查看代码可以看到: 将图标中的VerticalAlignment="Center"和Hori ...
- 入坑python 自己写的小工具,纪念一下
这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...
- ibatis(sqlmap)中 #与$的使用区别
在sqlmap文件中不使用“#VALUE#”来原样(参数对应什么类型,就当什么类型,比如拼凑的内容为string则自动加上了‘’)读取,而是$VALUE$方式来读取,即不加任何的东西,比如单引号啥的, ...
- redis实战笔记(7)-第7章 基于搜索的应用程序
本章主要内容 使用Redis进行搜索 对搜索结果进行排序 实现广告定向 实现职位搜索