在渗透测试过程中通过源代码审计进行漏洞挖掘

在渗透测试过程中通过源代码审计进行漏洞挖掘


简述

在对抗性测试过程中,攻击队攻击的资产通常被防守方层层防护,明显的漏洞在前期资产排查的时候基本上被修复的七七八八。要想获得不错的战果,必须得出奇招。如果能对防护的站点进行源代码审计,或者对相似的站点进行代码审计,那将进一步扩大战果。之前在某对抗性测试过程中,发现某安全大厂,在测试过程中,通过前期信息收集,全网检索相似站点或者CMS,直接测试对应站点(做好防护)或者下载对应cms源码进行源代码审计,方法很笨,但是很有效。

首先对web站点进行信息收集,获取对应web指纹,使用搜索引擎,fofa,shadon等工具,全网检索,获取相似站点信息,我们重点关注源代码。获取源码来源有很多,可能是cms,也可能是通过github、其他代码脱管平台及网盘泄露出来的源代码,或者通过旁站入侵等方式获取到部署文件等等,总之获取到对应站点源码即可,方法随意,然后迅速进行漏洞挖掘并利用。公司一红蓝对抗师傅形象的称之为现场挖0day,接下来我总结一下在红蓝对抗过程中的一些源代码审计技巧和检验。

web指纹识别方法

包括但不仅限于以下这5中方法,灵活判断,达到目的即可

特定文件hash

一些网站的特定图片文件、js文件、CSS等静态文件,如favicon.ico、css、logo.ico、js等文件一般不会修改,通过爬虫对这些文件进行抓取并比对md5值,如果和规则库中的Md5一致则说明是同一CMS。这种方式速度比较快,误报率相对低一些,但也不排除有些二次开发的CMS会修改这些文件。

正常页面或者错误网页中包含的关键字

先访问首页或特定页面如robots.txt等,通过正则的方式去匹配某些关键字,如Powered by Discuz、dedecms等。或者可以构造错误页面,根据报错信息来判断使用的CMS或者中间件信息,比较常见的如tomcat的报错页面,thinkphp的报错页面。

请求头信息的关键字匹配

根据网站response返回头信息进行关键字匹配,whatweb和Wappalyzer就是通过banner信息来快速识别指纹,之前fofa的web指纹库很多都是使用的这种方法,效率非常高,基本请求一次就可以,但搜集这些规则可能会耗时很长。而且这些banner信息有些很容易被改掉。
根据response header一般有以下几种识别方式:

(1)查看http响应报头的X-Powered-By字段来识别;
(2)根据Cookies来进行判断,比如一些waf会在返回头中包含一些信息,如360wzws、Safedog、yunsuo等;
(3)根据header中的Server信息来判断,如DVRDVS-Webs、yunjiasu-nginx、Mod_Security、nginx-wallarm等;
(4)根据WWW-Authenticate进行判断,一些路由交换设备可能存在这个字段,如NETCORE、huawei、h3c等设备。

部分URL中包含的关键字,比如wp-includes、dede等URL关键特征

通过规则库去探测是否有相应目录,或者根据爬虫结果对链接url进行分析,或者对robots.txt文件中目录进行检测等等方式,通过url地址来判别是否使用了某CMS,比如wordpress默认存在wp-includes和wp-admin目录,织梦默认管理后台为dede目录,solr平台可能使用/solr目录,weblogic可能使用wls-wsat目录等。

开发语言的识别

web开发语言一般常见的有PHP、jsp、aspx、asp等,常见的识别方式有:
(1)通过爬虫获取动态链接进行直接判断是比较简便的方法。
asp判别规则如下<a[^>]?href=(‘|”)[^http][^>]?.asp(?|#|\1),其他语言可替换相应asp即可。
(2)通过X-Powered-By进行识别
比较常见的有X-Powered-By: ASP.NET或者X-Powered-By: PHP/7.1.8
(3)通过Set-Cookie进行识别
这种方法比较常见也很快捷,比如Set-Cookie中包含PHPSSIONID说明是php、包含JSESSIONID说明是java、包含ASP.NET_SessionId说明是aspx等。

web指纹识别工具

web指纹识别工具有很多,我推荐几款我常用的。

whatweb

Whatweb 是一个开源的网站指纹识别软件,拥有超过1700+个插件,它能识别的指纹包括 cms 类型、博客平台、网站流量分析软件、javascript 库、网站服务器,还可以识别版本号、邮箱地址、账户 id、web 框架模块等。kali里面集成了,其他发行版本自行安装。

w11scan

w11scan是一款分布式的WEB指纹识别系统(包括CMS识别、js框架、组件容器、代码语言、WAF等等),管理员可以在WEB端新增/修改指纹,建立批量的扫描任务,并且支持多种搜索语法。
安装和下载可参考:https://github.com/w-digital-scanner/w11scan
手工安装稍微复杂,不过作者提供了docker部署,方便很多,使用了Mongodb,内置了1800多条常见的指纹,可以识别多达538种常见CMS,当然也可以手工添加指纹。

ehole

EHole是一款对资产中重点系统指纹识别的工具,在红队作战中,信息收集是必不可少的环节,如何才能从大量的资产中提取有用的系统(如OA、VPN、Weblogic…)。EHole旨在帮助红队人员在信息收集期间能够快速从C段、大量杂乱的资产中精准定位到易被攻击的系统,从而实施进一步攻击。

代码反编译

如果能成功获取到源代码,可以直接略过此条目。这里主要是获取到部署文件,war包,jar包,或者直接打包的class文件,通过反编译,进行源代码审计。以下是个人常用的几种工具,个人比较推荐使用IDEA,直接调用IDEA的java-decompiler组件进行反编译,也方便进行调试分析。萝卜青菜,各有所爱,各位依据自身情况选择工具。

IDEA java-decompiler.jar

1、直接使用IDEA打开我们需要分析的war包工程,IDEA会自动帮助我们将class进行反编译并展示出来,节约了我们好多工作。
20210408-03
对于jar包,将jar所在的目录设置成library
20210408-04
20210408-05
jar包可以直接打开,方便进行分析。
20210408-06
也可以在项目结构(Project Structure)中配置Libraray.

2、直接调用IDEA java-decompiler.jar进行反编译
java-decompiler.jar默认是安装的,位于IDEA安装目录\plugins\java-decompiler\lib\,博主本人java-decompiler.jar目录为:D:\Program\IntelliJ IDEA 2018.1.6\plugins\java-decompiler\lib ,主要是接下来会用到。
20210408-07
创建一个目录,用来存储反编译后的文件,如test文件夹。我这里拿FrontDemoController.class来举例:

1
java -cp "D:\Program\IntelliJ IDEA 2018.1.6\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true .\FrontDemoController.class .\test\

20210408-08
这样可以将FrontDemoController.class直接反编译成FrontDemoController.java。对于jar包,反编译结果也打包成jar包,这点儿需要注意,你直接使用压缩工具解压即可。这里拿dom4j这个jar来举例,以下截图是反编译以后使用压缩工具解压jar的结果,可以明显看出jar包中的class文件均被反编译成java。
20210408-09

java-decompiler.jar底层是使用fernflower实现的:
https://github.com/fesh0r/fernflower 有兴趣的朋友,可以到github上查看查阅源码

jad

JAD 是一款老牌的、经典的、使用起来简单的 Java 反编译工具,可以通过命令行把Java的class文件反编译成源代码。
下载地址:http://www.varaneckas.com/jad
20210408-01
使用方法:
1、反编译一个class文件:jad.exe -sjava example.class,会生成example.java,用文本编辑器打开就是java源代码
2、把源代码文件输出到指定的目录:jad -dnewdir -sjava example.class,在newdir目录下生成example.java
3、把packages目录下的class文件全部反编译:jad -sjava packages/.class
4、把packages目录以及子目录下的文件全部反编译:jad -sjava packages/**/
.class,不过你仍然会发现所有的源代码文件被放到了同一个文件中,没有按照class文件的包路径建立起路径
5、把packages目录以及子目录下的文件全部反编译并建立和java包一致的文件夹路径,可以使用-r命令:jad -r -sjava packages/**/*.class

常用的也就是第5条,各位根据自己需求进行操作,一些特殊的需求详见参考中的jad命令总结链接。
20210408-02
注意:jad不支持中文,如果反编译结果中出现部分unicode乱码,请自行解码分析。jad不能直接反编译jar包,直接解压了再反编译。

jd-gui

jd-gui是一款反编译软件,JD分为JD-GUI、JD-Eclipse两种运行方式,JD-GUI是以单独的程序的方式运行,JD-Eclipse则是以一个Eclipse插件的方式运行。该工具不做过多评论,反编译效果不错,操作傻瓜化,各位看官自行挑选即可。
下载地址:https://github.com/java-decompiler/jd-gui/releases

快速漏洞挖掘

方法论

1、通过web指纹匹配,采用社工,渗透等方式从其他脆弱目标获取当前资产的部分源代码
2、使用工具和人工审计的方式进行漏洞挖掘
3、尝试快速搭建漏洞验证环境进行验证,构建payload

源代码评估工具

fortify sca , checkmarx

快速源代码漏洞挖掘技巧

注入漏洞

sql注入
命令注入

文件上传/下载

反序列化

其他

1、web系统被打包成jar包,反编译发现配置信息和现有环境相悖
攻击队的同学想扩大战果,通过分析前场同学提供的web程序,网站部署程序文件被打包成jar包,从jar包中获取application.yml进行分析,提取出数据库的地址,用户名,密码,直接访问发现连接失败,这就需要
攻击队的同学注意了,spring程序可能从外部加载配置文件,jar中的配置文件可能是研发人员的测试环境配置文件。Spring程序会按优先级从下面这些路径来加载application.properties配置文件

* 当前目录下的/config目录
* 当前目录
* classpath里的/config目录
* classpath 跟目录

因此,在进一步测试的过程中,需要关注在jar所在目录是否存在config文件夹,或者jar目录下是否存在application.yml配置文件

参考