*本文原创作者:Aderduo,本文属FreeBuf原创奖励计划,未经许可禁止转载
混迹在各大SRC平台的白帽子手里都握着很多法宝,或私藏或公开。而给大家介绍下基于cms的漏洞扫描,如何挖漏洞。
一、绪论
1.1首先获取补天厂商名单,这里保存在d:/butian.txt。你也可以放入各大src的域名
1.2本cms是基于知道创宇的pocbuite二次开发。漏洞扫描器主要是扫描平台的整体框架设计,而真正需要耗时和长期维护的便是poc的编写与扩充。这里,重点在于poc的编写与扩充。
1.3编写poc并批量扫描网站,将存在漏洞网站提交漏洞给相应厂商
二、系统设计2.1系统体系结构设计
图2-1系统运行流程图
2.2详细功能模块设计
2.2.1基础扫描框架功能设计
本系统采用pocsuite作为poc开发框架,在此基础上修改代码使更适合本系统设计目标,并编写漏洞payload文件使增加丰富系统漏洞扫描,即可执行命令启动程序运行。这边对他进行改动如下:
(1)payload文件格式,增加漏洞修复、漏洞描述、漏洞等级等内容。
(2)漏洞结果生成。这边改动为,生成随机文件夹里面每个url每个payload文件生成一个doc文件,文件名格式[网站域名].doc,文件内容使用python的库docx来生成doc格式的文件。
2.2.2漏洞类型功能设计
CMS漏洞类型较多,常见的有:命令执行,SQL注入,XSS攻击,逻辑漏洞,越权操作,文件上传,文件读取等等。这些漏洞类型又可以继续往下细分。在实际编写时,要根据具体情况,编写payload文件,不是每种漏洞都可以编写payload文件进行批量扫描。需要在CMS漏洞类型的确认上下功夫,接下来会拿SQL注入和XSS来做分析。
1.SQL注入漏洞
图3-2编写SQL注入POC流程图
2.XSS攻击
如果网站仅仅能弹出框,并不能在页面源码上造成可识别的影响,我们在编写利用脚本的时候无法准确判断是否存在漏洞。除非对网页造成影响,通过一些唯一特定,可以确定就是这种CMS类型。比如DEDECMS5.7的/images/swfupload/swfupload.swf文件中的参数movieName没有经过有效过滤,且影响的是swf文件,导致跨站脚本漏洞。我们在利用时候只能弹出框,尚不能编写出具有唯一标识的payload。payload编写为/images/swfupload/swfupload.swfmovieName=%22]%29}catch%28e%29{if%28!window.x%29{window.x=1;alert%28%22xss%22%29}}//。页面未造成影响不能继续深入,只好作罢。
综上,实际操作时候要像计划靠拢,由于场景不同导致可能与计划有一定偏差。
2.2.3系统运行设计
图2-2-3系统运行流程图
三、系统实现3.1系统整体模块实现
工具需要最基本核心的是基本框架的实现,只需要把重心放在基本框架上对于多线程的写入提高了系统运行效率,其他就是源源不断的整合CMS漏洞,写出的payload只需要按照一定格式写进入就可以使整个工具跑起来,不需要把精力放在如何跑起来这种重复的工作上。程序运行起来的过程是:启动入口文件pocbase.py,调用pocbase/pocbase_cli.py里main(),接着调用pcsInit()将程序启动起来。目录结构如表3-1所示:
表3-1目录结构表,其中pocbase文件夹里面是让程序运行起来的文件函数以及第三方库,目录结构如下:
├──docs#说明文档
├──pocsuite#pocsuite主程序
│├──data#基础数据
│├──lib
││├──controller
││├──core#核心组件
││├──parse#参数处理封装
││├──request#网络请求封装
││└──utils#常用工具包
│├──modules
││└──tmp#临时目录
│├──pcs-attack.py#攻击程序
│├──pcs-console.py#控制台程序
│├──pcs-verify.py#验证程序
│├──pocsuite.py#pocsuite主入口程序
│├──tests#测试poc目录
│└──thirdparty#第三方库
└──README.md
haha文件夹内容根据漏洞类型化为为不同的文件夹存储。由上而下分别是:代码执行漏洞,设计漏洞,文件下载漏洞,文件读取漏洞,文件上传漏洞,信息泄露,OpenSSL,解析漏洞,SQL注入漏洞,URL重定向漏洞,XSS攻击漏洞。
haha文件夹如图3-1-1所示:
图3-1-1haha文件夹目录结构图
这些文件夹里面是关于所有相同漏洞类型可以是不同CMS的payload文件。拿SQL_Inject来说里面包含的CMS类型有:
AspCMS,DedeCMS,eYou,FangWei,OhHu,PHPCMS,QiboCMS,searun,ShopBuilder,Siteserver,V5shop,Vallery,YongYou,YuCheng,ZhengFang,ZuiTu等。如图3-1-2所示:
图3-1-2SQL_Inject文件夹目录结构图
3.2基础扫描框架模块
扫描结束生成报告文件,我这边设计的是生成doc文件,利用Python库docx里面的Document来制定通用doc生成规则。Kb.results里面存放的是验证结果的数据部分,对它进行循环取各部分值插入到doc文件相应位置。
3.3Payload文件编写模块
3.3.1编撰payload文件通用规则
本模块实现了在批量的同时,有一些站为了防机器人,需要看你有没有HTTP请求头的,比如有一些WAF会检测请求中是否有User-Agent,所以PoC中需要Cookie。
代码整体结构:
其中,pocbase/lib/poc_base.py文件是写一些编写payload文件常用到的函数。
3.3.2编撰payload文件
由于编写payload文件流程都一样,这里拿asp来举例。通常还会有jsp,php,java等不同脚本语言写的cms。比如漏洞:KesionCMS最新版本可下载数据库直接破密码,kesioncms是asp写的cms。漏洞原因可直接访问/KS_Data/KesionCMS9.mdb路径,下载数据库文件到本地。把文件用EasyAccess打开,表结构及KS_Admin中数据如图3-3-2-1所示:
图3-3-2-1数据库表结构图
图3-3-2-2MD5解密图
接下来,尝试编写payload然后找环境来测试编写的payload是否成功。先本地搭建asp运行环境,下载小旋风AspWeb服务器,安装之后开启软件,尝试下载KesionCMS漏洞相应版本到本地,经过测试是v9.5的版本,本地测试漏洞恰好存在。访问链接/KS_Data/KesionCMS9.mdb如图3-3-2-3所示:
图3-3-2-3访问链接图
这里点击保存把文件下载下来,这边用text文件下载下来会发现mdb文件里面都有StandardJetDB,所以编写payload时候可以模拟请求获取下载文件读取文件然后查找是否有关键字StandardJetDB。这就是漏洞编写的原理。
编写完之后进行运行是否成功。如图3-3-2-4所示:
图3-3-2-5运行测试图
这样证明我们的payload文件编写正确了。还需要批量扫描50个网站,查看扫描结果,对验证成功的网站人工验证是否成功,修正并反复这一过程,来提高payload的准确率。
3.4HTTP请求
Payload的原理是通过工具模拟发送HTTP请求,包括GET请求,POST请求,PUT请求来获取网页源代码,匹配特定字符,来验证漏洞。
HTTP是计算机与网络通信的协议,会给服务器一种浏览器访问的错觉,也就是在请求时候,模拟浏览器请求机制,加上浏览器的请求头[14]。如图3-4-1所示:
图3-4-1HTTP请求流程图
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:请求方法URI协议/版本,请求头(RequestHeader),请求正文。以下程序为验证漏洞是否存在,模拟请求:
3.5多线程
图3-5-1多线程流程图
下面是使用多线程的实例:
四、系统测试与运行4.1测试环境
环境要求:Python2.7.8
Python依赖包:
pocsuite==1.2.6
python-docx==0.7.4
python-memcached==1.57
redis==2.10.5
requests==2.8.1
chardet==2.3.0
如图4-1所示:
图4-1测试环境图
4.2工具运行参数
sage:pocbase[options]
optionalarguments:
-h,--helpShowhelpmessageandexit
--versionShowprogram'sversionnumberandexit
target:
-fURLFILE,--fileURLFILEScanmultipletargetsgiveninatextualfile
-rPOCFILELoadPOCfromafile(e.g."_0001_cms_sql_inj.py")ordirectory(e.g."modules/")
mode:
--verifyRunpocwithverifymode
--attackRunpocwithattackmode
request:
--timeoutTIMEOUTSecondstowaitbeforetimeoutconnection(default30)
--delayDELAYDelaybetweentworequestofonethread
params:
--extra-argumentsEXTRA_ARGUMENTSExtraarguments(e.g."{username:'***',password:'***'}")
optimization:
--threadsTHREADSMaxnumberofconcurrentHTTP(s)requests(default1)
4.3功能测试
4.3.1多CMS漏洞对应多网站扫描
启动脚本,入口文件pocbase.py,参数r指向要扫描的文件夹路径,参数f为本次扫描的url文件路径,参数threads为本次扫描开启的线程数。如图4-3-1-1所示:
图4-3-1-1启动脚本扫描图
图4-3-1-2实际扫描结果图
本次扫描2419次存在漏洞23个黄色的是漏洞结果生成文件地址
验证成功的SQL注入,如图4-3-1-3所示:
图4-3-1-3验证漏洞结果图
其中,编写的payload中,是ader_duo经过ascii码转换之后的字符,在获取源代码的匹配ader_duo关键字。匹配成功率为100%。因为payload里访问连接中并不存在,CHAR%2897%29%20%2b%20CHAR%28100%29%20%2b%20CHAR%28101%29%20%2b%20CHAR%28114%29%20%2b%20CHAR%2895%29%20%2b%20CHAR%28100%29%20%2b%20CHAR%28117%29%20%2b%20CHAR%28111%29%20%2b%20CHAR%2899%29。
4.3.2多CMS漏洞对应一网站扫描
启动脚本如图4-3-2-1所示:
图4-3-2-1启动脚本扫描图
图4-3-2-2启动脚本扫描图
本次扫描66次存在漏洞1个黄色的是漏洞结果生成文件地址
本次验证成功的,data构造时候需要经过base64加密,可直接显示出authkey。如图4-3-2-3所示:
图4-3-2-3漏洞结果图
4.3.3一CMS漏洞对应多网站扫描
启动脚本如图4-3-3-1所示:
图4-3-3-1启动脚本扫描图
本次扫描只扫描IIS解析漏洞扫描url文件11.txt本次线程数150。如图4-3-3-2所示:
图4-3-3-2实际扫描结果图
本次扫描5次存在漏洞4个黄色的是漏洞结果生成文件地址
4.3.4一CMS漏洞对应一网站扫描
启动脚本如图4-3-4-1所示:
图4-3-4-1启动脚本扫描图
本次线程数未选择默认为1如图5-3-4-2所示:
图4-3-4-2实际扫描结果图
本次扫描1次存在漏洞1个黄色的是漏洞结果生成文件地址
本次验证成功的,访问连接证明漏洞存在。如图4-3-4-3所示:
图4-3-4-3漏洞扫描结果图
4.3.5漏洞生成日志
扫描结束生成日志,显示日志文件地址在命令行里以黄色字体展示
日志内容如下(xxx.xxxxx.gov.cn存在SQL注入漏洞为例):
文件名为:[xxx.xxxxx.gov.cn].doc
文件内容如图4-3-5-1所示:
图4-3-5-1漏洞生成日志图
五、测试总结
能够实现工具扫描的完整流程,从扫描开启,灵活的扫描方式到多线程加快扫描速度,最后显示总扫描数量和存在漏洞的数量,将扫描结果写入日志文件,并输出日志文件地址结束整个扫描过程。该扫描工具能成功运行,并且延展性是比较强,编写CMS漏洞payload文件有一定规则,整合新的漏洞进去对整个工具的运行不会造成影响。