前言


本文由 本人 首发于 先知安全技术社区: 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个 websUrlHandlerDefinegoahead 自带的,这里不管它。

通过对下面几个注册的函数的简单浏览,在 FormPrivacy 函数内部存在一个栈溢出漏洞。

下面对这个函数做一个简单的分析

首先用

websGetVar(wp, T("Operate"), T(""))

获取 Operate 参数的值, 然后根据值的不同,进行不同的操作。

问题出在了 set 这操作的处理逻辑

首先取出几个参数, 然后使用 sprintf 把参数填到 szParam 这个缓冲区 (缓冲区大小为 20 * 20), 这里 sprintf 使用的是 %s 不会校验字符串的长度,所以当我们传一个很长的字符串作为 Height 的参数值,就会触发栈溢出。

触发+简单调试

通过搜索关键字,定位到往这里 发请求的应该是 privacy.asp

然后访问他

填些参数然后抓包, 修改 Height 的值为一个很长的字符串

同时在 FormPrivacy 设置一个断点, 发送请求过去,程序会断下来, 我们可以看看参数信息。

可以看到 wp 里面保存了此次请求的相关信息, 继续运行可以触发栈溢出

总结

分析 goahead 等可供开发者扩展的程序,分析的重点应该在那些自定义的代码上。

基于goahead 的固件程序分析的更多相关文章

  1. 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析

    PDF 版本下载:抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析 Author:知道创宇404实验室 Date:2017/03/19 一.漏洞背景 GoAhead作为世界上最 ...

  2. APM程序分析-AC_WPNav.cpp

    APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...

  3. 【GWAS文献】基于GWAS与群体进化分析挖掘大豆相关基因

    Resequencing 302 wild and cultivated accessions identifies genes related to domestication and improv ...

  4. 我是如何反编译D-Link路由器固件程序并发现它的后门的

    OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧. 一时兴起,我下载了D-link无线路由器(型号:DIR-100 revA)的固件程序 v1.13.使用 ...

  5. (IOS)BaiduFM 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源app BaiduFM的研究心得. 项目地址:https://github.com/belm/BaiduFM-Swift 一.项 ...

  6. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  7. 二进制程序分析工具Pin在Windows系统中的安装和使用方法

    这篇日志其实很弱智,也是因为换了新电脑,实验环境不全(当然,做这个实验我是在虚拟机里,因为接下来想拿些恶意代码的数据),所以这里记录一下在Windows下怎么安装和使用Pin这个程序分析领域最常用的工 ...

  8. Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序

    Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序).没错,Robocopy的功能是拷贝文件,你也许会觉得无聊并且要翻阅下一篇文章 ...

  9. 【转】基于DM8168的视频智能分析系统的设计方案

        [导读] 为了实现高清视频的智能分析功能,本文介绍了一种以TI公司的DM8168为核心的高清视频智能分析系统的设计方案,该方案从硬件设计和软件设计两个方面介绍了硬件组成.工作流程.软件架构,并 ...

随机推荐

  1. 关于component-scan中base-package包含通配符的问题探究

    http://blog.csdn.net/u012325167/article/details/75388990 今天在配置Spring的component-scan时,发现了一个有趣的问题.就是在指 ...

  2. Java之集合(二十五)ConcurrentHashMap

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7520808.html 1.前言 本章介绍使用的最频繁的并发集合类之一ConcurrentHashMap,之前介绍 ...

  3. python中del函数的垃圾回收

    今天学习面向对象里的类被del函数的垃圾回收过程搞的晕头转向,经过了老师的讲解还是是懂非懂,然后看了很多博客慢慢的心里才有了个大概的了解. 刚刚看到一篇博客,觉得讲的很好,转载过来以供参考.以下转自笨 ...

  4. Centos调整时间时区

    一台VPS的时间出错,使用常规手段修改均失败.提示hwclock failed : ntpdate stdtime.sinica.edu.tw 如果你的 VPS 提示没有 ntpdate 这个命令,可 ...

  5. numpy.linalg.norm(求范数)

    1.linalg=linear(线性)+algebra(代数),norm则表示范数. 2.函数参数 x_norm=np.linalg.norm(x, ord=None, axis=None, keep ...

  6. Spanner:谷歌新一代全球部署的列式数据库

    Spanner 是一个可扩展的.全球分布式的数据库,提供分布式ACID. 架构 universe:一个部署的实例成为universe,目前谷歌有3个,分别为开发/测试/线上 Zone:一个数据中心,相 ...

  7. .Net Actor 服务端开发框架,Newbe.Claptrap 项目周报 1 - 还没轮影,先用轮跑

    Newbe.Claptrap 项目周报 1,第一周代码写了一点.但主要还是考虑理论可行性. 第一次接触本框架的读者,可以先点击此处阅读本框架相关的基础理论和工作原理. 周报是啥? 成功的开源作品,离不 ...

  8. activiti 临时笔记mark

    public class TenMinuteTutorial { public static void main(String[] args) { // Create Activiti process ...

  9. Node.js数据流Stream之Readable流和Writable流

    一.前传 Stream在很多语言都会有,当然Node.js也不例外.数据流是可读.可写.或即可读又可写的内存结构.Node.js中主要包括Readable.Writable.Duplex(双工)和Tr ...

  10. 用Shell编写项目发布脚本

    1.首先在github上创建一个测试用的仓库 2.本地编写一个可以运行的测试项目,上传至github 3.链接服务器,编写脚本如下:注意:编写前需要在服务器上安装git和maven 执行build_c ...