前言


本文由 本人 首发于 先知安全技术社区: 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. Linux CentOS7系统中ssh的用法

    大家都知道,公司买上服务器,不可能实时在线操作虚拟机,也没有那个时间和精力登录到公司的云服务商官网进行操作,一来不安全,二来也效率不高. 如果是购买的虚拟主机,你可以使用ftp进行本地程序文件传输和从 ...

  2. VSTO学习(五)——创建Word解决方案

    一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个专题中,我将为大家介绍如何用VSTO来创建Word项目,对于Word的VSTO开发和Excel的开发很类似,你同样也 ...

  3. XmlDocument 避免XXE

    string xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\&quo ...

  4. yum安装报错:Failure when receiving data from the peer

    系统:Centos6.9 操作:yum install -y *.rpm 报错信息: Transaction Summary ===================================== ...

  5. linux一键安装php环境

    1.下载一键安装包: http://pan.baidu.com/s/1o6lWyeu 2.unzip -x sh.zip chmod -R 755 sh ./install.sh 等待半小时左右 3. ...

  6. 初始JAVA中浅拷贝和深拷贝

    1. 简单变量的复制 public static void main(String[] args) { int a = 5; int b = a; System.out.println(a); Sys ...

  7. WPF中定义TabItem的可选区域(特别是当使用Label来呈现Header时)

    1. 如上图,所示,此时当鼠标移入蓝色框内除文字部分,整个TabItem是没反应的 经过查看代码可以看到: 将图标中的VerticalAlignment="Center"和Hori ...

  8. 入坑python 自己写的小工具,纪念一下

    这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...

  9. ibatis(sqlmap)中 #与$的使用区别

    在sqlmap文件中不使用“#VALUE#”来原样(参数对应什么类型,就当什么类型,比如拼凑的内容为string则自动加上了‘’)读取,而是$VALUE$方式来读取,即不加任何的东西,比如单引号啥的, ...

  10. redis实战笔记(7)-第7章 基于搜索的应用程序

    本章主要内容   使用Redis进行搜索 对搜索结果进行排序 实现广告定向 实现职位搜索