[原创]goahead框架中的asp文件提取 | 宜武汇-ag真人国际厅网站

前言

 

goahead是开源的web框架,由于其高性能,高可用性,在嵌入式系统中广泛使用。传统基于goahead框架开发的服务端会大量使用asp脚本语言编写动态页面,并使用c/c 语言编写功能函数注册到脚本层中供asp脚本调用。为了更全面的进行安全审计,我们不仅要关注功能函数的实现,同时也要分析asp脚本的处理过程。本篇文章以某个工业交换机固件(ecos系统,不带符号表)来作为例子,讲解如何从固件提取asp文件。

 

goahead版本
在分析带有goahead的固件之前,需要先知道该框架的版本,这样除了能知道历史漏洞(cve编号)外,还能对着该版本的源码进行分析,快速定位到关键点。

 

获取版本
简单搜索字符串“goahead”可以非常快地定位到版本号,可以看到下面的版本号为2.1.5。

 

下载源码
由于goahead源码已经不在github上维护了,ag真人国际厅网站官网的历史版本又只对企业用户开放,所以没法从官方渠道获取源码。

不过可以从之前网友共享的资源入手,来获取到这部分源码,最后在csdn上下载了一个相近的版本2.1.8。

 


asp文件
goahead webserver支持类asp的服务器端脚本语言,该脚本的语法和微软的asp active server page)语法基本相同,通过使用asp脚本可以非常高效得开发动态页面。如下就是一个非常典型的asp代码,可以看到asp代码是嵌入” “<%…%>”之间的部分,其中的testasp函数的实现是在c/c 层中。

 

goahead为了更加方便的移植到不同嵌入系统上,其对文件的存储提供了非常灵活的方式,对于linux这类系统,可以选择将文件存放在文件系统中,或者对于ecos这类系统可以将文件直接以数组的形式直接固化到固件中,从而不必增加文件系统这部分模块。源码中的“webs_page_rom”宏就是控制不同的asp文件存放方式。当定义了webs_page_rom意味着将文件以数组的形式存放在固件中。

下面分两种情况来讨论asp文件提取:
1.对于存放到文件系统的asp脚本文件,可以直接用binwalk提取,然后分析其代码逻辑。
2.对于固化到固件中的asp脚本文件,binwalk往往提取不了,或者说提取不完全,这就需要自己手动提取这类文件。
由于目标固件是第二种情况,就需要通过手动的方法来提取asp文件。

 

存放格式
为了了解asp文件的存放格式,首先得知道如何将文件传成数组:

  1. 建立清单文件files.txt,在里面编写需要转换文件路径:
d:/web/css/style.css d:/web/home.asp d:/web/images/button.jpg //略 
  1. 运行如下命令,将文件转换为数组:
webcomp d:/web files.txt >romfiles.c 
  1. 打开romfiles.c可以看到全局变量文件索引表websrompageindex:

    page就是转换后的数组:

    同时可以查看websrompageindextype结构,定义如下,为了提取所有表中的文件,需要定位到固件中websrompageindex的地址,然后编写脚本根据格式进行提取。

定位索引表
一、特征定位
回到goahead源码,为了在目标固件定位websrompageindex全局表,需要找到调用它的地方,websrompagereaddata函数使用了这个表,该函数负责将文件数据拷贝到指定的缓冲区。

继续查看调用websrompagereaddata函数的地方,直到找到特征字符串(用于定位函数),最后找到了一个函数websasprequest,非常适合定位。通过”can’t read %s”字符串可以快速在固件中找到这个函数。

 

二、定位流程
最后简单总结了下定位流程:

 

动手实践
一、固件中定位表
通过字符串”can’t read %s”定位到webspagereaddata函数,如下框起来的就是该函数:

继续进入函数分析,找到websrompageindex全局表:

 

二、编写脚本
通过在上面的分析已经在固件中定位到websrompageindex全局表的位置,根据websrompageindextype结构体的定义编写如下脚本提取文件数据:

#extract files from goahead rom from struct import * import os def get_str(data,index): ret='' i=index while data[i]!='\x00': ret =data[i] i =1 return ret websrompageindex_addr=0x547084 load_base=0x40000 with open('test.bin','rb') as fd: data=fd.read() s_pos=websrompageindex_addr while true: path_addr=unpack('i',data[s_pos:s_pos 4])[0] if path_addr==0x0: break path=get_str(data,path_addr-load_base) print path page_addr=unpack('i',data[s_pos 4:s_pos 4 4])[0] page_size=unpack('i',data[s_pos 8:s_pos 8 4])[0] page_data=data[page_addr-load_base:page_addr-load_base page_size] path='./aspfile/' path outpath,outfilename = os.path.split(path) if not os.path.exists(outpath): os.makedirs(outpath) with open(path,'wb ') as fd: fd.write(page_data) s_pos =16 

提取的文件如下所示:

提取asp文件后,通过查看其源码,就能定位到一些存在于asp脚本中的安全缺陷。在实际审计的过程中,本人发现了该工业交换机web服务端的若干安全问题。

 

总结
本篇主要介绍了提取asp文件的一些思路,可以看到,提取方法虽然谈不上有多少技术含量,但是一些分析的思路和技巧我希望和大家进行分享,希望大家喜欢。

原文链接:https://bbs.kanxue.com/thread-261905.htm

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/原创goahead框架中的asp文件提取/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图