信息搜集

本文最后更新于 2024年10月23日 上午

前言:本文不适合完全0基础的师傅学习信息搜集,因为我没有写得很详细,只是提出我的信息搜集的思路或流程、简单给出工具的地址和一些自写的小脚本,但是本文可以作为一个信息搜集的查漏补缺、思路借鉴。以下仅代表我个人的信息搜集思路,没有标准答案。期待师傅们在评论区简单交流你们的信息搜集思路,或者提出问题,我们相互借鉴学习,吸收优秀思路,一起成长吧

思维导图


01-最开始先对此次要打点的目标进行web资产搜集,即搜集主域名,子域名

web资产

主域名

注意:小型企业不用查主域名,因为压根就没有。主域名只针对于大集团目标,其旗下有许多子公司,每一个子公司有自己的官网,这便是主域名,每个子公司的经济不同,安全防御程度也不一样,于是我们可以通过找到薄弱的子公司的主域名作为渗透目标,并且一个集团的子公司的内网往往是相通的,只要拿下一个子公司就有可能进一步拿下整个集团,这样比你直接渗透集团总部要轻松太多了,信息搜集做得好,渗透已经成功一大半啦对吧

子域名

  • FOFA
1
domain="xxxx.com"||cert="xxxx.com"||cert="xxxx目标名"
  • oneforall
1
python oneforall.py --target xxxx.com run

02-经web资产打点,得到大量资产后(一般都是成百上千的资产数量),需要从中筛选出攻击目标,因为其中有大量资产,要么防御牢固,要么没有攻击点来入手,要么压根就不存在漏洞,对此部分的资产进行接下来的信息打点操作的话纯纯浪费时间,于是要先从大量资产中寻找出脆弱的,疑似可渗透的目标,下文称之为攻击目标

web资产整理与攻击目标发现

  1. py脚本格式整理
  2. 合并数据
  3. 去重工具去重
  4. Eeyes整理c段
  5. fscan存活探测
  6. fscan初步扫描
  7. fscanoutput整理格式
  8. 合并资产
  9. Ehole测活
  10. 正则提取数据
  11. Awvs Xray Nuclei自动化扫描
  12. 合并数据
  13. 再次py脚本测活
  14. 手工访问初步确定测试目标

处理FOFA资产格式

因为FOFA得到的url有http的有https的还有无协议的三种形式,格式不统一,不便于之后的自动化扫描测试,于是先处理好格式

我针对这个问题写好了处理的py脚本-domain.py

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
import re  # 引入正则表达式库

# 打开input.txt文件并读取每一行
with open('input.txt', 'r') as file:
lines = file.readlines()

# 准备两个列表来存储不同的输出内容
subdomains = []
urls = []

# 定义一个正则表达式来匹配基于IP的URL
ip_url_pattern = re.compile(r'http[s]?://\d{1,3}(\.\d{1,3}){3}(:\d+)?/?')

# 处理每一行数据
for line in lines:
# 去除两端的空格和换行符
line = line.strip()

# 检查URL是否基于IP地址,如果是则跳过
if ip_url_pattern.match(line):
continue # 如果当前行是基于IP的URL,跳过不处理

# 检查并处理每种情况
if line.startswith('http://'):
subdomains.append(line[7:]) # 从'http://'后面开始截取
urls.append(line) # 保持原样
urls.append('https://' + line[7:]) # 替换为'https://'
elif line.startswith('https://'):
subdomains.append(line[8:]) # 从'https://'后面开始截取
urls.append('http://' + line[8:]) # 替换为'http://'
urls.append(line) # 保持原样
else:
subdomains.append(line) # 没有协议头,直接使用
urls.append('http://' + line) # 添加'http://'
urls.append('https://' + line) # 添加'https://'

# 将处理后的数据写入相应的文件
with open('subdomain.txt', 'w') as file:
for subdomain in subdomains:
file.write(subdomain + '\n')

with open('url.txt', 'w') as file:
for url in urls:
file.write(url + '\n')
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
import re

# 定义IPv4地址的正则表达式,用于匹配端口号并去除
ipv4_pattern = re.compile(r'(\d{1,3}(\.\d{1,3}){3})(:\d+)?')

# 定义IPv6地址的检测正则表达式
ipv6_pattern = re.compile(r'([0-9a-fA-F:]+:+)+[0-9a-fA-F]+')

# 用于存储处理后的IP地址
processed_ips = []

# 读取input.txt文件中的每一行
with open('input.txt', 'r') as file:
lines = file.readlines()

for line in lines:
line = line.strip() # 去除两端空白字符

# 分割可能存在的由逗号分隔的IPv4地址
ipv4_addresses = line.split(',')

for addr in ipv4_addresses:
# 检测IPv6地址,如果是,则跳过这条数据
if ipv6_pattern.match(addr):
continue

# 检测IPv4地址,如果后面跟着端口号,则去除端口号
match = ipv4_pattern.match(addr)
if match:
processed_ips.append(match.group(1)) # 只添加IP部分,去除端口号

# 将处理后的结果写入output.txt文件
with open('output.txt', 'w') as file:
for ip in processed_ips:
file.write(ip + '\n')

现在通过fofa和domain.py得到了三份数据

1
2
3
4
5
subdomain1.txt    没有协议头的子域名数据

url1.txt 有http和https的url数据

ip1.txt ip数据

处理oneforall资产格式

数据格式很统一,不用处理,保存一下就好了

现在通过oneforall得到了三份数据

1
2
3
4
5
subdomain2.txt    没有协议头的子域名数据

url2.txt 有http和https的url数据

ip2.txt ip数据

合并

(把两份数据合并在一起)

合并得到

1
2
3
4
5
subdomain3.txt    没有协议头的子域名数据

url3.txt 有http和https的url数据

ip3.txt ip数据

去重

(因为肯定有重复的,太多重复数据会拖慢后面扫描的时间,所以要对三份数据去重)

去重后得到

1
2
3
4
5
subdomain.txt    没有协议头的子域名数据

url.txt 有http和https的url数据

ip.txt ip数据

使用Eeyes整理c段

(这里就体现了为什么要整理出subdomain.txt了,因为这里整理c段要用)

1
Eeyes.exe -l subdomain.txt

数据不多,手动处理一下得到

1
c.txt //几个c段数据

fscan c段存活探测和综合初步扫描

(这一步使用c.txt对c段存活的主机进行探测和综和扫描)

1
fscan.exe -hf c.txt -o result.txt

使用fscan得到

1
result.txt 存活的c段,以及其他综合信息数据

Fscanoutput整理格式

(因为result.txt中格式混乱不便处理)

1
python  fscanoutput.py result.txt

使用Fscanoutput得到result.xlxs

1
result.xlxs 整理后的存活的c段,以及其他综合信息数据

初步提取可攻击目标

从result.xlxs仔细寻找,其实运气好的话,就以及可以发现一些脆弱的资产或敏感的资产了,可以记录下来,备用

result.xlxs提取

1
target1.txt 可能成为最终的测试目标数据

生成IP型资产

ip.txt的数据处理加上http://和https:// ip.py脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 打开输入文件
with open("input.txt", "r") as input_file:
# 读取文件内容并按行分割
ip_addresses = input_file.read().splitlines()

# 打开输出文件
with open("output.txt", "w") as output_file:
# 遍历每个 IP 地址
for ip in ip_addresses:
# 添加 http:// 前缀
http_ip = "http://" + ip
# 添加 https:// 前缀
https_ip = "https://" + ip
# 将结果写入输出文件
output_file.write(http_ip + "\n")
output_file.write(https_ip + "\n")

使用ip.py得到

1
url-ip.txt ip型url资产数据 

合并

(把result.xlxs其中的url复制下来,加上url-ip.txt,再和之前的url.txt合并,得到web.txt)

1
web.txt 合并后的url数据

测活

(搜集了这么多资产,不一定都是存活的,于是要进行探测活性,不然后面对着一个挂了的网站测试,不是浪费时间吗)

web.txt使用Ehole测试url资产的活性

1
ehole.exe -l web.txt -json export.json

使用Ehole得到

1
export.json 存活的url资产

再把export.json另存一份为target2.txt备用

1
target2.txt 存活的url资产(txt格式)

处理Ehole的数据

export.json使用sublime进行正则提取url资产

1
2
http://[^\"]*
https://[^\"]*

得到

1
test.txt 存活的比较全面url资产

自动化扫描

Nuclei

1
nuclei.exe -list test.txt -o output.txt

AWVS

1
2
#批量添加目标
python awvs.py

Xray

1
2
3
4
5
6
7
8
#批量添加目标
python xray.py -r test.txt

# 爬取单个目标
xray.exe webscan --basic-crawler http://xxxx.com/ --html-output output-a.html

# 监听7777端口,与Brup联动
xray.exe webscan --listen 127.0.0.1:7777 --html-output output-b.html

等扫描器运行完后,逐个访问扫描结果—可能存在漏洞的目标,根据经验判断,手工整理得到

1
target3.txt 可能成为最终的测试目标数据

合并

target1.txt target2.txt target3.txt合并为target.txt得到

1
target.txt 可能成为最终的测试目标数据

再次测活

得到的target.txt其实也还是不一定是存活的,再次测活,用我写的小脚本

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
55
56
import requests  # 导入发起请求的库
from requests.packages.urllib3.exceptions import InsecureRequestWarning

# 禁用SSL证书验证警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

print("""

/\
/ \__
( @\___ domaindomain
/ O domain
/ (_____/ domain
/_____/ u domaindomain
______ ________
| __ \ | _____|
| | | | | |_____
| | | | | _____|
| |__| | | |_____
|______/ |_______|

-- Domain Exploration 子域名探活小脚本(很基础的垃圾脚本罢了,很适合我这种垃圾写)
-- By X1ly?S
"""
)

print("开始子域名探活......")
print("存活的子域名:")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0"} # 设置UA头,伪装成浏览器

# 读取target.txt文件中的待探测的子域名
with open('target.txt', 'r') as file:
domains = [domain.strip() for domain in file.readlines()]

count = 0
processed_domains = set()
for domain in domains:
if domain in processed_domains:
continue
processed_domains.add(domain)
url = "" + domain # 使用http协议拼接完整的URL
try:
response = requests.get(url, headers=headers, timeout=7,verify=False)
if response.status_code == 200 and len(response.text) > 0:
count += 1
print(url)
except requests.exceptions.RequestException as e:
print("\n")
print("出错了!")
print(f"url: {url}")
print(f"详细信息:")
print(f"{e}")
print("\n")
print("\n")
print(f"探活结束,一共探测出{count}个存活的子域名")

手工进一步筛选目标

target.txt中寻找比较特殊的资产,脆弱的资产,简单手工测试一下,同时挂上XRay与Brup联动,在手工访问的同时,还可以主动扫描漏洞

1
xray.exe webscan --listen 127.0.0.1:7777 --html-output output-b.html

找出最终进一步测试的目标得到

1
目标名.txt //最终进一步测试的目标数据

03-经资产整理与攻击目标发现,大致得到一些可能可攻击的目标,然后再对这些目标进行架构信息搜集,为什么把架构搜集放在最前面呢,因为假设目标使用了CDN,反向代理,负载均衡,那我们在没搞清楚架构的情况下,就去渗透测试,端口扫描,内网渗透,那将是毫无意义的或者收效甚微的

架构信息

反向代理

  • 介绍

反向代是将内部网络中的服务通过端口映射等方式暴露到公网,使外部用户只能通过反向代理服务器进行访问

  • 识别

使用Wappalyzer浏览器插件识别

负载均衡

  • 介绍

为了防止访问拥塞,减少主服务器的负担,多个负载均衡服务器监听公共网络接口,接收来自客户端的请求,然后将这些请求转发到内网的多个后端服务器端口

  • 识别

使用lbd工具(kali自带)

站库分离

  • 介绍

可以减少攻击者获取敏感数据的可能性。即使攻击者成功入侵了网站服务器,也无法直接访问数据库中的主要数据,因为数据库服务器是独立的

CDN

  • 介绍

为了提升访问体验,在多个地方部署CDN服务器,自动将用户的请求路由到最近的服务器节点,就近地为用户提供服务

  • 识别

多地ping

绕过

WAF

04-经架构信息打点后,可能要进行适当的绕过,比如CDN,WAF,反向代理,然后就可以进一步地愉快地进行网站基本信息的搜集了吗,我认为不是的,应该先搜集源码信息,因为如果网站使用了CMS,或者源码泄露,那么此次渗透就直接上升成了白盒测试,或者直接使用Nday攻击,省略了大部分的打点步骤,岂不美哉?

源码信息

CMS

闭源售卖

  • 黑源码网站
  • google
  • 正规源码网站

泄露

05-经源码信息打点,如果没有收获,那么只能老老实实继续进一步搜集网站基本信息

网站基本信息

语言

  • Wappalyzer

数据库

  • Wappalyzer
  • fofa

web容器

  • Wappalyzer
  • fofa

操作系统

  • 大小写法
  • ping TTL值

06-经网站基本信息打点后,了解了网站基本构成,然后就可以进行深度的挖掘信息了,进入网站具体信息打点

网站具体信息

目录

快照

插件信息

  • Wappalyzer

第三方接口信息

  • Wappalyzer

旁站

端口服务

  • nmap(kali自带)

07-经网站具体信息打点后,基本上已经掌握了大部分信息了,运气好的话已经出货了,但如果还是一无所获的话,还可以考虑社工信息(机会不大)

社工信息

就需要人工去找了

  • 域名服务商
  • 服务器供应商
  • 网站管理员
  • 网站开发人员

08-到此,对于WEB资产的信息打点就基本结束了,你以为就完了吗?哈哈当然不是啦,还可以对目标旗下的小程序,APP进行信息搜集,小程序往往比较容易一些……

小程序信息

  • 安卓模拟器+brup抓包 分析出web资产,重复上述web资产的信息打点

APP信息

外在

  • 安卓模拟器+brup抓包 分析出web资产,重复上述web资产的信息打点

内在

自动化搜集工具