我从第一个SQL注入漏洞原理学起,从sql-libas到DVWA,到pikachu再到breach系列、DC系列靶场,再到实战挖洞,发现靶场与实战的区别是极其大的。
我个人觉得在这种Web环境下,难的不是怎么测一个漏洞点,而是怎么找一个漏洞点。靶场与实战最大的区别在于你不知道这个地方到底有没有漏洞,尤其是在复杂的业务数据交互下,数据包、参数、接口将极其复杂。
本文将以DC系列靶场为例子,分析靶场与实战的区别,同时分享实战思路与需要用到的一些工具插件。(本文并不主讲靶场步骤,因为网上已经有很多此类文章了。)
DC-1
探测:使用nmap扫描端口,dirsearch扫描目录,配合插件Wappalyzer识别网站技术栈信息。
火狐Wappalyzer插件下载地址: https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/

打点:识别出Drupal CMS,利用MSF搜索并利用相关漏洞,拿到shell。
找到flag1,根据flag1提示找到配置文件,在配置文件中找到数据库账号密码,连接成功。

在数据库找出admin密码,发现有加密。根据靶场已有脚本修改数据库admin密码,成功登录Web后台。
深入:进入后台后找到flag3,根据提示 cat /etc/passwd。找到flag4,根据flag4提示进行find提权:find / -exec "/bin/bash" -p \; 找到最后的flag。
实战区别分析:
探测阶段:在拿到一个IP后,除了进行基础操作(nmap、dirsearch、指纹识别)外,可能还要查找IP的域名,以及IP对应的公司,并根据公司名再次扩大信息搜集范围。需要到Google、GitHub以及资产搜索引擎上利用相关语法搜集默认密码、账号、邮箱等信息。
并且根据关键字及密码特征制作特定社工字典进行登录框爆破。而且实战中,dirsearch等目录扫描工具可能扫不出什么东西,这时候还要到Google和资产搜索引擎上查找。
靶场一般不会用到资产搜索引擎(例如fofa、鹰图),但它们在实战中确实极其重要。
打点阶段:对于历史漏洞的利用,不要只停留在指纹识别这些特征上,还要从数据包上分析。但如果是登录框没进入后台,哪有什么数据包呢?
如下:我在测试某个系统时,将请求方法GET修改为POST,直接爆出了IIS版本,然后一个中间件nday通杀了两百多个站。而靶场一般是不会出现这种测试方法的:那就是想办法让系统报错!

实战中如果想对密码进行修改,我遇到过的:一种就是未授权调用后台修改密码接口修改,另一种就是忘记密码处的逻辑绕过。当然,忘记密码这个功能可能前端并不会直接给出,需要自己通过js文件等信息拼凑接口。
DC-2
探测:nmap探测IP端口服务,修改本地DNS文件访问靶场IP网站(找到crew字段),通过目录扫描找到后台登录口。
打点:通过cewl对网站进行定向搜集获取密码字典,通过CMS对应的WPscan插件获取用户名,联合爆破进入后台(获取jerry及tom的账号密码)。
翻看后台提示后,放弃利用WordPress历史漏洞,尝试进行ssh连接。
jerry的ssh连接不上,tom连接成功(使用已得到的账号密码)。
深入:直接SSH登录成功,执行命令发现rbash限制:

自然想到rbash逃逸,逃逸成功后拿到flag3。此时用 su 进行用户tom切换可以成功,拿到flag4后根据git字段提示,进行git提权拿到最后的flag。
实战区别分析:
探测阶段:很多IP经过nmap扫描后发现只会开放80端口,且80端口为主站,渗透难度极大,且我用dirsearch等工具扫目录很少能扫出有用的目录。
在寻找脆弱资产时,还需要结合关键字、资产搜索引擎、Google语法等进行搜索。
例如这个站:(浙大某脆弱资产)只能通过Google语法 site:xxx 搜索出来,因为直接访问域名为404界面,路径极其复杂无法爆破,资产搜索引擎没有记录。

打点阶段:登录口的爆破也极有可能遇到次数限制。
此时需要尝试绕过:修改为随机IP、随机UA头、修改Referrer为127.0.0.1等等。
这里推荐一款可以用来伪造IP进行爆破的工具: https://github.com/ianxtianxt/burpsuiefakeip
即使没有次数限制,也可能需要根据公司名称缩写、系统名称缩写,配合admin、administrator等字段及特殊字符,通过工具(如白鹿社工字典)自制密码进行爆破。

因为靶场拿到flag1后根据提示cewl(一个可以搜集账号信息的工具)就知道要爆破进入后台,实战可能还会在忘记密码处耗费时间。
且实战中不会有如下靶场提醒:(无法利用WordPress历史漏洞,需另寻他法)

实战过程中,ssh连接可能也不会如此顺利(靶场直接使用WP登录界面爆破出来的密码登录)。
DC-3
探测:扫描端口,扫描目录,查指纹(识别为Joomla)。
打点:使用joomscan工具进行漏洞扫描,找到版本,用searchsploit找到SQL注入漏洞,脱库拿到账号密码,使用john解密成功。

登录管理员后台成功,找到上传点直接getshell。

无法在虚拟终端反弹shell,于是返回上传点创建反弹shell的php文件,Kali监听成功。

深入:利用searchsploit工具搜索及蚁剑上传提权脚本,进行操作系统提权成功。

实战区别分析:
探测阶段:扫描目录时可能会找到两个登录界面。在实战中,需要将注意力放在并不对外使用的界面,它们属于脆弱资产,例如员工登录入口、管理员登录入口。像对外开放的、可以注册的那些登陆界面,虽然功能点更多,但由于经常有人访问,会经常维护,它们的安全性会更高,不容易出洞。
打点阶段:靶场依旧是利用nday SQL注入脱库拿到账号密码,但实战过程中找到一个SQL注入后去脱库的可能性不大。在SRC中一般只需证明该漏洞存在即可。在渗透过程中要脱库,就一定要先拿到明确的渗透授权。
DC-4
探测:访问IP,出现登录框,以admin为账号,使用BurpSuite默认字典爆破成功。
打点:后台直接执行命令抓包,发现radio参数可执行命令,成功进行shell反弹。

深入:翻找文件,找到账号与密码字典,使用hydra进行ssh爆破成功。继续翻找文件,找到charles账号密码,使用 su 切换用户。根据关键字teehee进行提权找到flag。

实战区别分析:
探测阶段:可以看到靶场并无脚本源码,且功能点少,减少了很多黑盒测试点。而且靶场必定会存在漏洞,这也是与实战的重大区别之一,而且登录框很容易就爆破成功。

打点阶段:本靶场后台功能极其简单只有一个功能点,且一看就是要测试RCE。但实战你遇到的可能是如下界面:

会有很多模块和功能需要测试。对这种后台打点,通常会先尝试文件上传漏洞,因为上传点更容易寻找。而RCE测试点则极为复杂,通常会在例如“系统”、“命令”等字段的模块,但其实所有模块都可能存在RCE,因为模块本身就是前端与后台执行功能的地方。黑盒测试无法从前端界面直接看出究竟哪个模块调用了执行命令的参数。
所以黑盒测试RCE需要将前端功能点转换为数据包,从接口、参数进行测试。在云栈社区的技术文档板块,你也能找到很多关于如何分析复杂接口、参数和进行有效测试的实战思路与总结。
DC-5
探测:nmap扫描端口,dirsearch扫描目录,指纹识别。
打点:在扫描出来的目录中翻阅时,发现存在文件包含漏洞,直接以file参数读取成功。
确定为本地文件包含后,找到靶机日志文件路径,将webshell写入日志,getshell成功。

深入:利用searchsploit对 /bin/screen-4.5.0 进行本地提权成功。
实战区别分析:
打点阶段:靶场文件包含的漏洞特征很明显,但实战中就并不会有这类提示。黑盒测试的思路就是多猜。而且在实战中,想要利用文件包含进行getshell的难点就是找不到正确的路径和权限不够,并不会像靶场这样直接就能爆破出来,并且能直接包含。
实战更多的步骤还是在找漏洞,而并不是测漏洞。
DC-6
探测:nmap扫描端口(22,80),dirsearch扫描目录,whatweb识别指纹。
打点:发现WordPress指纹,使用wpscan扫描,使用提示的命令 cat /usr/share/wordlists/rockyou.txt | grep k01 > password 生成字典并爆破进入后台。
需要修改本地hosts文件(添加域名解析)才能访问靶场。

在后台发现使用了activity monitor插件,使用searchsploit搜索,利用对应脚本getshell。
深入:在网站文件中找到graham账号密码,于是进行ssh登录成功。再次找到可免密码执行的sh脚本,利用该脚本完成提权。
实战区别分析:
打点阶段:本靶场发现RCE有两种方式,一是nday探测二是手测。漏洞点出现在输入IP的字段,也算是RCE的高发点。在实战过程中,像交换机、路由器后台也通常会有类似功能点,可以进行RCE测试。
DC-7
探测:nmap探测端口,发现端口80与22(估计又要ssh爆破),扫描出目录:/user/login。
打点:访问IP看到如下提示:

到GitHub上搜索页面左下角的名称“Dc7User”,拿到账号密码,于是进行ssh连接成功。

翻找文件,找到一个邮箱,根据邮箱内容找到脚本文件(属主为root),发现可执行drush命令。通过drush命令进行Web界面密码修改,并成功登录。
基于Drupal 8特性,安装好插件后上传webshell连接成功。

深入:将反弹shell的命令添加到先前发现的脚本中,因为该脚本属主为root,从而完成权限提升。
实战区别分析:
打点阶段:打点阶段用到的GitHub信息搜集极其重要,在实战中通过泄露的账号密码直接登录ssh、数据库或者Web后台也是存在较大可能的。
在GitHub上也经常能发现公司代码、账号密码、个人信息或客户key等敏感信息。关于如何在GitHub等开源实战平台高效、合规地进行信息搜集,是每个安全从业者都需要掌握的技能。
常用GitHub搜索语法:
in:name admin - 仓库标题搜索含有关键字admin
in:readme test - Readme文件搜索含有关键字
user:admin - 用户名搜索
language:java admin - 在java语言的代码中搜索关键字
GitHub信息搜集工具: https://github.com/FeeiCN/GSIL
本靶场的后台功能点还是很多的,但通过drush命令进入后台感觉还是属于靶场的味道。在实际挖洞过程中,如果账号密码无法爆破,更多可能是分析js文件(从js文件中找更多js,再从js中提取接口),寻找隐藏接口。也就是前端页面并未显示有注册、修改密码等功能,但可以从js中找到接口,实现登录后台的目的!
这里分享一个很适合找敏感接口信息的BP插件HAE: https://github.com/gh0stkey/HaE
DC-8
探测:nmap扫描端口(22,80),whatweb指纹识别。
打点:访问靶场IP点击左方导航栏,出现参数。

加单引号后报错,用sqlmap拿到数据,john解密拿到账号密码,进入后台。

此处插入webshell,配合msf直接getshell成功。

深入:执行 find / -perm -u=s -type f 2>/dev/null,根据找到的exim4相关文件完成提权。
实战区别分析:
打点阶段:靶场依旧是经典的利用SQL注入拿到账号密码再进入后台的思路。但不要觉得SQL注入在实战中很容易挖到(这取决于你挖什么资产)。一般出SQL注入就是一个高危漏洞。而且靶场的SQL注入还是一个前台的GET传参注入,这种很多年前的前台SQL注入在实战中基本很难遇到,但也要去测试。
靶场中的getshell方式(插入Webshell到表单)实战中我很少遇到,这种插入方式感觉更像XSS漏洞的测试点。对于各种安全/渗透/逆向技术在不同场景下的变形与应用,需要持续地学习和积累实战经验。
DC-9
探测:nmap探测端口,发现端口80与22(filtered状态)。
打点:通过dirsearch扫出search.php、manage.php目录,进入后直接找到SQL注入点。

使用sqlmap脱库,对MD5密码进行解密,拿到账号密码登录manage.php后台。
根据“File does not exist”提示进行文件包含利用:?file=../../../../
FUZZ系统文件找到 /etc/knockd.conf,泄露7469、8475、9842端口。通过nc依次“敲开”端口。根据 /etc/passwd 读取到的账号信息,进行ssh爆破。

登录爆破出的账号,翻文件搜集字典,再次进行ssh爆破出新账号。
深入:登录新账号,先执行 sudo -l,找到可用的python脚本,分析并利用该脚本完成提权。
实战区别分析:
打点阶段:靶场SQL注入点较为经典,处于搜索框。且虽然存在SQL注入,但如果只添加单引号并不会出现报错,还需要进一步探测(如添加and 1=1等)才能发现!
这里推荐一款常用工具: https://github.com/synacktiv/HopLa
这是一个BurpSuite辅助payload插件,可以一键插入常用payload,不用额外再找字典等等。

对于SQL注入的黑盒测试不要局限思路,你觉得可能带入数据库的参数都需要测试,尤其是在排序(例如order by、desc等)这种通常不能被预编译的字段。
打点处的文件包含漏洞算是一种实战思路:也就是 ?file=../../../etc/passwd 或者 ?path=../../../etc/passwd 这类payload可以在挖洞过程中随机添加测试,不一定要对应着明确的功能点才去测试。只要存在file、download等敏感字段的接口都可以添加尝试,因为这可能是隐藏功能点。
靶场可能更多的功能是练习单个的知识点,实战中少遇到的知识点。比如一个新手可能挖半年漏洞都无法getshell一次,更别提后渗透等等了。但在打靶的同时也要关注对nday、1day漏洞的黑盒分析,并进行总结。
例如对权限绕过的一个分析总结:
- 大小写替换绕过
/api/home/admin --> /api/home/ADMIN
- 通配符替换字符
/api/user/6 --- 403
/api/user/* --- 200
- 路径穿越
/api/home/user --- 403
/api/MYPATH/../home/user --- 200
/api/home/..;/..;/..;/..;/home/user --- 200
除此之外,还要关注最近的系统或者框架0day(例如SQL注入、RCE等),了解它们的注入参数是哪个,目录特征怎样?这样在实战过程中,“靶场战神”才不至于陨落,并能将靶场中学到的技能有效地应用于真实的安全/渗透/逆向挑战中。