HW红队攻击方案

HW红队攻击方案

转载请注明出处:https://youngrichog.github.io/**

描述

HW行动近些年关注度持续提升,站在攻击方的角度,我们应该如何完成HW任务。对标真实战争的红方和蓝方,指挥部都会有对应的作战手册,例如:美国海军陆战队。那么回到HW中的红队,我们也应该有相应的作战手册,一个完整的作战手册可以让队伍有序战斗,可以有效提高队伍的攻击效率。因此作战手册尤为重要。

HW防守方目标众多,如何对目标进行快速的信息搜集?根据以往的渗透来说,前期的信息搜集是一个非常耗时间的工作,需要人工参与的场景比较多,那么我们就需要思考如果缩短时间,提高效率。

基础设施建设+作战手册·····

作战手册

0x01 信息搜集

前期的信息搜集涉猎点:

  1. 目标的母公司是什么?目标的子公司是什么?目标的对外投资有什么?
  2. 目标的资产有什么?网段资产/根域名/子域名是什么?
    • 网段资产:网段有哪些?分别开放了什么端口/服务?目标范围是什么?哪些是Web资产?
    • 根域名资产:根域名有哪些?如何快速搜集目标根域名?
    • 子域名资产:子域名有哪些?子域名是否有其他端口映射(http://www.example.com:6000)?

这里可以生成对应关系:

母公司->根域名->子域名->网段资产/根域名资产/子域名资产

子公司->根域名->子域名->网段资产/根域名资产/子域名资产

目前我们已经清楚了任务,那么下一步就是思考快速完成任务,提高效率。

:bulb:子母投(母公司/子公司/对外投资)的信息搜集,我们可以借助天眼查API快速完成,这里需要关注几个点。

以下公司仅为视图案例,请勿对号入座 :-)

  1. 为保证信息搜集数据的准确,仅拉取对外投资比例=100%,以投资角度来看,这样拉取是不合适的,但在后面会以其他方式补充该数据。

    1

:bulb:在拥有子母投信息后,我们需要搜集子母投的根域名,这里我们同样可以借助天眼查API以及WhoisSubdomain快速完成,这里关注以下几个点。

  1. 企业介绍

    1

  2. 网站备案/历史网站备案

    1

  3. 知识产权模糊查询,天眼查没有对应API接口,不过该点尤为重要。通过知识产权模糊查询,可以关联到很多与目标相关的根域名,至于如何精确,可以遍历子母投公司名称,此外公司都有简称,如北京百度网讯科技有限公司,我们可以取百度网讯科技/百度网讯作为关键字。

    1

  4. WhoisSubdomain为此而生,通过注册联系人反查、注册邮箱反查、注册联系人邮箱反查、ICP备案号反查拉出目标根域名,并补充子母投(母公司/子公司/对外投资)信息搜集阶段可能遗漏的目标。

    1

:bulb: 在拥有根域名信息后,我们需要搜集其所有根域名的子域名,这里就不多做介绍了,不过想给自己留几个坑,子域名搜集依靠穷举和第三方API,当然还有很多new school的方式,例如:爬js对其分析,域名相似(如example.com,那么example-app.com会不会是目标)等,域名相似也补充之前根域名搜集的不足。另外借助目标网段资产的端口/服务数据,我们可以通过SSL证书快速确定目标范围,哪些ip是目标的。

在观察中发现其实轮子早已有人造好,但是多数人都把时间浪费在重复造轮。接下来就是子域名是否有其他端口映射,很多时候我们仅关注IP的开放情况,通过naabu我们可以快速进行对应的信息搜集。

1
cat 子域名 | ./naabu -ports full -o output.txt -v -retries 3  -rate 10

1

:bulb: 在拥有子域名信息后,我们需要搜集其网段,我们对所有子域名进行解析,这里需要进行一定方式的清洗,如使用WAF、CDN情况,这里简单举例一些方式,如通过CNAME判定,通过搜集WAF、CDN厂商IP段进行判定,通过header头中的字段进行判定,还有更多的方式后续慢慢写进来。

通过上述action后,我们拥有目标的网段资产,那么如何判定目标范围?这里简单举例:通过网段资产的端口扫描+SSL证书提取,可以从SSL证书维度确定一些目标IP,对目标IP进行大小排序,可以确定最大值和最小值从而生成目标范围。接下来就是探测开放端口/服务情况,这里提供一个之前写的Masscan+Nmap例子,在简单分布式Masscan+Nmap中也有一个例子。其中需要注意几个点:Masscan和Nmap的特征需要剔除,对于ip开启端口超过50进行剔除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#! /usr/bin/env python3
#! -*- coding: utf-8 -*-

import re
import os
import sys
import datetime
import threadpool
import nmap

def nmap_scanner(iplist):
ip = iplist.split(':')[0]
port = iplist.split(':')[1]
print('[*] 开始扫描',ip,port)
nm = nmap.PortScanner()
nm.scan(hosts=ip, arguments='-sV -Pn -T4 --version-all -p{}'.format(port))
with open('res.txt','a+') as f:
f.write(nm.csv())

def massscan():
with open("ip.txt",'r') as f:
for i in f:
i = i.rstrip('\n')
filename = i.replace('/','-') + '.xml'
hello = os.popen('./masscan -sS -Pn {} -p1-65535 --max-rate=10000 -oX {}'.format(i,filename)).read()
masscan_parse(filename)

def masscan_parse(filename):
iplist = []
tmplist = {}
with open(filename,"r") as f:
body = f.read()
# os.remove(filename)
host = re.findall(r'<host(.*?)</host>',body,re.S)
for i in host:
try:
address_re = re.search(r'addr="(.*?)"',i).group(1)
port_re = re.search(r'portid="(\d*?)"',i,re.S).group(1)
tmplist.setdefault(address_re,[]).append(port_re)
# iplist.append(address+':'+port)
except Exception as e:
print('[*] 错误: %s' % e)
for ip,ports in tmplist.items():
if len(ports) < 50:
for port in ports:
iplist.append(ip+':'+port)

pool = threadpool.ThreadPool(20)
requests = threadpool.makeRequests(nmap_scanner, iplist)
[pool.putRequest(req) for req in requests]
pool.wait()

if __name__ == "__main__":
massscan()

通过对网段的端口/服务扫描,我们会得到其目标的IP端口列表,接下来需要快速确定Web资产,借助httpx我们可以快速信息搜集,使用上述代码,网段资产扫描后会生成res.txt,我们加以利用,一条命令快速完成。

之前有子域名其他端口映射情况,也可以直接复用 :-)

1
awk -F ';' '{print $1":"$5}' res.txt  | sed  's/host:port//' | sed '/^\s*$/d' | ./httpx -status-code -title -web-server

1

:bulb: 有些时候我们还会有网站截图的需求,通过网段资产扫描后会生成对应的.xml,借助aquatone可快速导入Masscan/Nmap数据。

1
cat *.xml | aquatone -nmap

:bulb:敏感信息泄漏占比很高,如源码备份/数据库备份/git/svn等,人的错误是无法避免的,那么我们直接使用网段资产数据/子域名数据进行批量,这里借助nuclei,内置了很多插件,方便后续继续拓展。

1

:bulb:后续我们接入分布式的扫描器,这部分不多做介绍 :-)

到此信息搜集阶段作战结束,简单梳理下流程:

网段资产->Masscan+Nmap->httpx->nuclei

子域名资产->naabu->httpx->nuclei

有时间在把完整的流程完善 :-)


不定期更新,本次更新时间:2021年2月6日

这里延伸一个点“发现自域名最大化”,如何尽可能多的发现子域名?对于真正的黑客而言,字典是首选,其次就是第三方公司数据

如何组成字典?字典数据的构成要从那些点出发?要从主动和被动两个方向出发,主动搜集可以从:英文单词字典、工具内嵌字典、结合大数据(例如从github爬取)等,被动搜集可以从日常积累中,例如Domain Hunter就是一个不错的被动搜集,当然还可以这样,手机和电脑的所有应用流量都进行截取,然后从而进行被动搜集,当然还有很多想法,这里就随便举举例子。

搜集完成之后,我们就需要对子域名字典数据进行清洗,那么需要根据域名定义的规则来清洗

1.对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符(当每个标签使用单个字符时,限制为127个级别:127个字符加126个点的总长度为253,127*126个点=253 a.b.c.d.e······example.com不能超过253)

2.域名中不进行大小写的区分

3.-和.符号不能单独出现,不能放在开头和结尾

4.域名中不能使用空格及特殊符号!$&?等,域名由一个或多个标签组成,每个标签由一组ASCII字母,数字和连字符(az,AZ,0-9,-)组成

https://en.wikipedia.org/wiki/Domain_name

原始字典数据:https://github.com/dwyl/english-words https://www.wordfrequency.info/samples.asp

根据域名定义的规则简单造了脚本:https://github.com/YoungRichOG/HVV/blob/main/Subdomains/handle_dict.py

处理后的子域名字典:https://github.com/YoungRichOG/HVV/blob/main/Subdomains/%E5%A4%84%E7%90%86%E5%90%8E%E7%9A%84%E5%AD%90%E5%9F%9F%E5%90%8D%E5%AD%97%E5%85%B8.zip