前言


本文由 本人 首发于 先知安全技术社区: 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. js的事件学习笔记

    目录 0.参考 1.事件流 冒泡传播 事件捕获 2.事件绑定--onclick接口 onclick类的接口,只能注册一个同类事件 onclick类的接口,使用button.onclick = null ...

  2. 手淘适配-flexible

    目标 拿一个双11的Mobile页面来做案例,比如你实现一个类似下图的一个H5页面: 目标很清晰,就是做一个这样的H5页面. 痛点 虽然H5的页面与PC的Web页面相比简单了不少,但让我们头痛的事情是 ...

  3. Phoenix 4.8

    From v4.8.0 onwards, user can enable to map it’s schema to the namespace so that any table created w ...

  4. Centos下Kubernetes+Flannel部署(新)

    一.准备工作 1) 三台centos主机 k8s master: 10.11.151.97  tc-151-97 k8s node1: 10.11.151.100  tc-151-100 k8s no ...

  5. redis-java中的callback回掉机制

    springboot整合redis后, 会提供StringRedisTEmplate和 RedisTemplate 两个模板类供食用, 有时候这并不能满足我们的需求, 需要使用 connect 处理, ...

  6. Linux-文件和目录属性

    文件系统的是用来组织和排列文件存取的,所以它是可见的,在Linux中,我们可以通过ls等工具来查看其结构,在Linux系统中,见到的都是树形结构:比如操作系统安装在一个文件系统中,他表现为由/ 起始的 ...

  7. Mahout实战---评估推荐程序

    推荐程序的一般评测标准有MAE(平均绝对误差),Precision(查准率),recall(查全率) 针对Mahout实战---运行第一个推荐引擎 的推荐程序,将使用上面三个标准分别测量 MAE(平均 ...

  8. C++中内联函数

    目录 什么是内联函数 如何使函数内联 为什么要使用内联函数 inline函数的优缺点分析 什么时候该使用内联函数 正文 在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么 ...

  9. Koa2实用入门

    koa2已发布了一段时间,可以考虑入手,参见Node.js最新Web技术栈(2016年4月) 本文主要是koa 2的文档解读和runkoa介绍,让大家对koa 2有一个更简单直接的理解 一.依赖Nod ...

  10. 破局人工智能:构建AI,与腾讯云一起探索语音应用场景

    本文来自腾讯云技术沙龙,本次沙龙主题为AI平台及智能语音应用解析 近年来,人工智能技术快速发展,与其他行业的结合也成为业界不断探索的方向.在人工智能基础和工具方面,AI平台已成为降低人工智能门槛的关键 ...