本文包括背景介绍,Web渗透测试方法构想,Web渗透测试实例三个章节,其中背景介绍解读了漏洞挖掘和渗透测试两个概念,Web渗透测试方法构想描述了结合OWASP测试方法论和PTES把渗透测试落地的理论部分,Web渗透测试实例则是用实际案例来演示第二章的构想。背景介绍 本章主要介绍我对渗透测试和漏洞挖掘这两个概念的理解。 笔者因为工作原因,能接触到一些国内外乙方安全公司的渗透测试报告。 在看过多份不同乙方公司提供的渗透测试报告后,简单的说大概会有这么几类 1。只提供一份测试报告,报告主体内容是漏洞列表,漏洞详情 2。提供简单的checklist,一般是以附录的形式写在测试报告中 3。提供来测试计划,以及测试报告 对于不是很懂渗透测试的甲方来说,渗透测试的目标是发现漏洞,上述三类报告似乎并无太大差别。 实际上并不是这样的,一个有组织的渗透测试,报告的内容可以非常丰富。漏洞挖掘 漏洞挖掘是以漏洞为导向,每年大量的CVE就是漏洞挖掘的结果,比如打CTF也是漏洞挖掘及利用的过程。毫无疑问漏洞挖掘能力能表现安全人员的技能水平。 举个例子来说,假设某天xxxSRC发布一个公告,中低危漏洞不再收录,只收高危及以上。你作为一个白帽子,像用户名暴破这样的漏洞看都不看就跳过,但是如果你是在做渗透测试,就不能这么轻易的忽略这些漏洞。 那种只提供漏洞列表和详情的测试报告,可以猜测就是采用漏洞挖掘模式,这种模式对于乙方来说会稍微轻松一点,毕竟只要报告中有漏洞就可以交差了。渗透测试 根据PTES,渗透测试包含了两个阶段,一个是漏洞分析,一个是漏洞利用 我们平时都是把Vulnerability翻译为漏洞,实际上,我认为这个词翻译为脆弱点会更合适些。 渗透测试更侧重过程及方法,测试结果只是过程的产物。总体而言,渗透测试的目标是通过结构化的方法,定位系统存在的所有脆弱点(Vulnerability),并尝试去利用这些脆弱点,最终评估这些脆弱点对系统可能造成的风险。 如果是漏洞评估找到脆弱点就结束了。但如果是渗透测试还需要对这些脆弱点进行进一步利用,甚至是留后门,清除痕迹等。也就是PTES里说的Exploitation和PostExploitation这两个过程。 所以任何的脆弱点在测试范围之内都不能被漏掉的,小到敏感信息明文传输,用户名暴破,路径信息泄漏,大到SQL注入,认证绕过,越权等等。 测试报告如果只报告XSS可以弹窗这样的漏洞,只能算是漏洞评估的结果,如果没有利用XSS进行实际利用,都不能称作渗透测试。什么是利用,比如利用xss攻击窃取Cookie,再利用Cookie登录系统。个人看法 我个人认为渗透测试和漏洞挖掘的关系互相不是充分条件。就是说一个人很懂渗透测试工程方法,不一定很会挖漏洞。一个很会挖漏洞的人也不一定能做好渗透测试。 但总体而言,漏洞挖掘的门槛比渗透测试方法会更高。一个优秀的CTFer,应该可以很快掌握渗透测试的精髓,反之一个人精通渗透测试方法论,不一定能快速掌握漏洞挖掘技巧。 引用PTES里对渗透测试的概括 Remember,apenetrationtestshouldnotbeconfrontational。Itshouldnotbeanactivitytoseeifthetestercanhackyou。Itshouldbeaboutidentifyingthebusinessriskassociatedwithandattack。 顺便讲个有趣的事情,笔者有个朋友之前一直在wooyun挖漏洞,后来还想成立一个乙方渗透团队去接渗透测试的活。后来说是和甲方就酬劳问题达不成共识而作罢。 其实我在想乙方团队可以以两种模式和甲方谈判。 模式一漏洞挖掘模式以漏洞计价,严重,高危,中危,低危分别多少钱 模式二渗透测试模式制定渗透测试计划,输出checklist,漏洞报告,威胁建模报告等 在我看来模式一对乙方团队来说,多劳多得,压力也会小些。模式二更花时间精力,资费应该更贵。 结果也很明显,业界更倾向于模式一,要么自己建立SRC,收漏洞,根据漏洞危害等级付相应酬劳。要么和大的白帽平台合作,在这些平台上发起众测。 模式二真正的问题是甲方怎么样才能信任乙方团队,一方面乙方团队有没有这个能力来接渗透测试的任务。另一方面如何保证乙方团队不泄露甲方数据。 我个人觉得模式二对乙方更有价值,很多小型公司没有足够资金预算投入人力做安全。可以雇佣安全团队做风险评估渗透测试等。PTaaS(PenTestasaService)理论上还是蛮好的。类似于CA证书模式,一个中立的非营利PT(Penetration)机构,对乙方团队进行认证。甲方信任PT机构,所以信任拥有该机构颁发的PT证书的乙方团队。Web渗透测试方法构想 本章以PTES见参考文献〔1〕和OWASP测试指南见参考文献〔2〕为基础,构建我的Web渗透测试落地方法 PTES简介 可能有些读者不了解PTES,这里我做非常简单的介绍 PTES全称是penetrationtestingexecutionstandard,也就是渗透测试执行标准。该标准定义来渗透测试的流程及内容,分为七个部分 1。PreengagementInteractions前期交互 2。IntelligenceGathering信息收集 3。ThreatModeling威胁建模 4。VulnerabilityAnalysis漏洞分析 5。Exploitation渗透利用 6。PostExploitation后渗透 7。Reporting报告 这七个部分覆盖了渗透测试从开始到结束的完整流程。可以说这是渗透测试从业者不得不看的一套渗透测试方法。有兴趣的读者请查阅参考文献〔1〕 WebPTES 我适当调整了PTES,让这个标准结合OWASP测试指南,落地在渗透测试过程 1。PreengagementInteractions前期交互 2。IntelligenceGathering信息收集 3。VulnerabilityModeling漏洞建模 4。VulnerabilityAnalysis漏洞分析 5。Exploitation渗透利用 6。Reporting报告 威胁建模可以利用STRIDE模型,攻击树,攻击库建模,这些对于一个敏捷的渗透测试来说过于抽象了些。所以我把它改为漏洞建模。 前期交互 前期交互的核心是范围和目标。范围是指测试覆盖的范围,涉及到的资产服务器,域名ip,数据库等等。 目标的话,PTES也给来很清晰的介绍 Everypenetrationtestshouldbegoaloriented。Thisistosaythatthepurposeofthetestistoidentifyspecificvulnerabilitiesthatleadtoacompromiseofthebusinessormissionobjectivesofthecustomer。Itisnotaboutfindingunpatchedsystems。Itisaboutidentifyingriskthatwilladverselyimpacttheorganization。 比如甲方的诉求是要确保数据库不会被拖库,或者要求xxx域名的web服务不会受拒绝服务攻击影响,等等。就像老师常说的,带着问题去看书。这里是带着目标去测试。 输出件根据测试范围,测试目标,测试时间进程安排等整理出测试计划文档 信息收集 信息收集覆盖渗透测试的所有环节,收集的信息越丰富,渗透测试相对而言就会越顺利。相关内容网络上非常多,在此不再赘述。 漏洞建模 把每一个唯一的HTTP路径认为是一个接口 比如 GETmainasdf POSTsubprocfdsa {xxxxyz} PUTuploadtmpfile filefakecontent 漏洞建模也是以Web路径为一个维度,以Web漏洞类型为另一个维度,建立一个二维矩阵 那么有个疑问是,我没开始测之前,我怎么知道要不要打,比如Bufferoverflow我怎么知道哪些接口要打,哪些接口不要。 我的建议是,如果你不确定要不要打,就默认打,等你对系统更加了解之后,也许凭借你的经验,可以快速定位哪里需要打 最终把二级建模的所有打的项目整理出来,输出漏洞Checklist 输出件:漏洞Checklist 漏洞分析 利用各种奇技淫巧的思路,去分析上一步输出的漏洞Checklist是否真实存在漏洞。 这个过程区别于漏洞建模的是需要确定测试用例,比如POSTsubprocdosth可能存在SQLinj漏洞,测试人员要手工自动化工具去检测是否真实存在漏洞,整理出测试用例 比如 POSTsubprocdosth {xxxxyz} 测试人员输出测试用例如下 输出件:漏洞列表,测试用例 渗透利用 输出漏洞列表,漏洞分析环节就结束了,一般在甲方也就点到为止,不再继续做利用。这也是可以理解的,甲方只需要有SQL注入就够了。 而如果要继续进行利用,可能会是SQL注入获取系统shell执行,或者利用SQL注入写文件,获取Webshell,或者爬取数据库,能发现敏感的特权账户,进而利用特权账户登陆系统等等。 那岂不是漏洞分析就完全够了吗,为什么还要利用呢 这要看具体的场景,如果甲方在产品中有部署防火墙,WAF等,甲方想知道在这种环境下,即使有SQL注入漏洞,能造成什么危害。是不是WAF能识别所有攻击行为。虽然有漏洞也是安全的。还是说可能有多个漏洞串联造成大危害。这些都是漏洞分析不会去做的。所以这也是为什么渗透测试的价格会比漏洞分析更贵的本质原因。 测试报告 输出只包含漏洞列表的渗透测试报告是非常不负责任的。 一方面这可能根本谈不上渗透测试,最多只能说是漏洞分析报告 另一方面甲方很难根据只有漏洞列表的报告得到产品安全或者不安全的结论 完整的渗透测试应该输出以下交付件 输出件:测试计划文档一份,漏洞Checklist一份,与checklist及测试范围匹配的测试用例一份,包含漏洞详情的测试报告一份Web渗透测试实例 上面谈了这么多理论上的思路。本章我想利用一个案例来展示上述流程中的漏洞建模,漏洞分析以及漏洞利用 以HackerOne的CTF第89题为目标,对目标进行渗透测试。见参考文献〔3〕 HackerOne是一个国外非常流行的众测平台,而如果想在这个众测平台挖漏洞赚钱,得先去CTF演练场答题挣积分,积累26积分才能有一个邀请码。 本次以89题Ticketastic:DemoInstanceTicketastic:LiveInstance为测试目标,演示如果利用上述的WebPTES进行渗透测试。 前期交互 测试范围:http:35。190。155。168b9b2ddf96c 测试目标:用户数据库 信息收集 接口:newTicket,login,admin,ticket,newUser 漏洞建模 根据经验,在认证,会话管理,授权,输入检测几个方向最可能出问题,所以本次仅针对这些方向进行测试 漏洞分析 对漏洞Checklist进行逐个漏洞分析排查,排查过程中,整理测试用例 经过上述的测试用例执行之后,输出漏洞列表 渗透利用 执行漏洞分析过程之后,掌握多个漏洞之后,就要利用这些漏洞,可能是单个漏洞的利用,也可能是组合利用 为来达成测试目标用户数据库,构建以下攻击思路 以管理员凭证登陆系统,并利用SQL注入漏洞拖库,SQL注入点已找到,关键在于怎么获取管理员凭证 思路1:破解session 思路2:通过xss窃取cookie 思路3:通过CSRF添加账户 思路4:暴力破解密码 经过session的base64解码,session的前一部分是{user:admin},但后一部分乱码,无思路。 暴力破解也是下下策,毕竟如果用top10000的字典跑不出来,不是这个解题方向。 通过xss窃取cookie和CSRF添加账户均可行。可因为hackerOneCTF环境限制,xss窃取cookie无法成功。最后可以试试CSRF 通过漏洞1newTicket存储型XSS注入imgsrca2020imgdataimg。jpgdatasrcnewUser?usernamepterpasswordadmin123password2admin123这样当admin访问ticket页面时,会触发CSRF,添加一个新用户pter,密码为admin123 我尝试了 payload1 POSTb9b2ddf96cnewTicketHTTP1。1 Host:35。190。155。168 。。。 titlexximgsrca2020imgdataimg。jpgdatasrcimg03。bs178。comcbyibf126ec24a89c0b3。jpgbodyxximgsrca2020imgdataimg。jpgdatasrcimg03。bs178。comcbyibf126ec24a89c0b3。jpg paylod2 POSTb9b2ddf96cnewTicketHTTP1。1 Host:35。190。155。168 。。。 titlexxusernamepter126passwordadmin12326password2admin123bodyxxusernamepter126passwordadmin12326password2admin123 都没有成功,所以本题我也没解出来,导致两个FLAG都拿不到。 网上查了些Writeup,发现以下payload可行 POSTb9b2ddf96cnewTicketHTTP1。1 Host:35。190。155。168 。。。 titlexximgsrca2020imgdataimg。jpgdatasrchttp:localhostimg03。bs178。comcbyibf126ec24a89c0b3。jpgbodyxximgsrca2020imgdataimg。jpgdatasrchttp:localhostimg03。bs178。comcbyibf126ec24a89c0b3。jpg 其实这个localhost也是有线索的,就是在demo环境,利用payload1,admin登陆后,源代码里会显示。CTF经验还是不够。 报告 走到这一步是不是叹了一口气,完整做下来,工作量还是非常多的。从漏洞建模,到漏洞分析,漏洞利用,这些过程都要投入大量时间,对甲方来说,这些过程输出的中间件都是非常宝贵的资料。 交付件分别有 1。测试计划文档 2。漏洞建模表,及漏洞Checklist 3。测试用例,漏洞列表 4。测试报告也可以把上述表格用例整合到测试报告中。但是测试计划建议单独一份文档 上面这些过程中,每个过程都和操作者强相关。不同的人,在漏洞建模环节会输出不同的漏洞checklist,会写出不同的用例,会得到不同的漏洞列表。所以这套渗透测试落地方法只是描述了渗透测试可以怎么做,但是没有描述怎么才能把它做好。