本文最后更新于 2024年10月23日 上午
前言:本文不适合完全0基础的师傅学习信息搜集,因为我没有写得很详细,只是提出我的信息搜集的思路或流程、简单给出工具的地址和一些自写的小脚本,但是本文可以作为一个信息搜集的查漏补缺、思路借鉴。以下仅代表我个人的信息搜集思路,没有标准答案。期待师傅们在评论区简单交流你们的信息搜集思路,或者提出问题,我们相互借鉴学习,吸收优秀思路,一起成长吧
思维导图
01-最开始先对此次要打点的目标进行web资产搜集,即搜集主域名,子域名
web资产
主域名
注意:小型企业不用查主域名,因为压根就没有。主域名只针对于大集团目标,其旗下有许多子公司,每一个子公司有自己的官网,这便是主域名,每个子公司的经济不同,安全防御程度也不一样,于是我们可以通过找到薄弱的子公司的主域名作为渗透目标,并且一个集团的子公司的内网往往是相通的,只要拿下一个子公司就有可能进一步拿下整个集团,这样比你直接渗透集团总部要轻松太多了,信息搜集做得好,渗透已经成功一大半啦对吧
子域名
1
| domain="xxxx.com"||cert="xxxx.com"||cert="xxxx目标名"
|
1
| python oneforall.py --target xxxx.com run
|
02-经web资产打点,得到大量资产后(一般都是成百上千的资产数量),需要从中筛选出攻击目标,因为其中有大量资产,要么防御牢固,要么没有攻击点来入手,要么压根就不存在漏洞,对此部分的资产进行接下来的信息打点操作的话纯纯浪费时间,于是要先从大量资产中寻找出脆弱的,疑似可渗透的目标,下文称之为攻击目标
web资产整理与攻击目标发现
- py脚本格式整理
- 合并数据
- 去重工具去重
- Eeyes整理c段
- fscan存活探测
- fscan初步扫描
- fscanoutput整理格式
- 合并资产
- Ehole测活
- 正则提取数据
- Awvs Xray Nuclei自动化扫描
- 合并数据
- 再次py脚本测活
- 手工访问初步确定测试目标
处理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
with open('input.txt', 'r') as file: lines = file.readlines()
subdomains = [] urls = []
ip_url_pattern = re.compile(r'http[s]?://\d{1,3}(\.\d{1,3}){3}(:\d+)?/?')
for line in lines: line = line.strip()
if ip_url_pattern.match(line): continue
if line.startswith('http://'): subdomains.append(line[7:]) urls.append(line) urls.append('https://' + line[7:]) elif line.startswith('https://'): subdomains.append(line[8:]) urls.append('http://' + line[8:]) urls.append(line) else: subdomains.append(line) urls.append('http://' + line) urls.append('https://' + line)
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_pattern = re.compile(r'(\d{1,3}(\.\d{1,3}){3})(:\d+)?')
ipv6_pattern = re.compile(r'([0-9a-fA-F:]+:+)+[0-9a-fA-F]+')
processed_ips = []
with open('input.txt', 'r') as file: lines = file.readlines()
for line in lines: line = line.strip()
ipv4_addresses = line.split(',')
for addr in ipv4_addresses: if ipv6_pattern.match(addr): continue
match = ipv4_pattern.match(addr) if match: processed_ips.append(match.group(1))
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数据
|
(这里就体现了为什么要整理出subdomain.txt了,因为这里整理c段要用)
1
| Eeyes.exe -l subdomain.txt
|
数据不多,手动处理一下得到
fscan c段存活探测和综合初步扫描
(这一步使用c.txt对c段存活的主机进行探测和综和扫描)
1
| fscan.exe -hf c.txt -o result.txt
|
使用fscan得到
1
| result.txt 存活的c段,以及其他综合信息数据
|
(因为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: for ip in ip_addresses: http_ip = "http://" + ip https_ip = "https://" + ip output_file.write(http_ip + "\n") output_file.write(https_ip + "\n")
|
使用ip.py得到
合并
(把result.xlxs其中的url复制下来,加上url-ip.txt,再和之前的url.txt合并,得到web.txt)
测活
(搜集了这么多资产,不一定都是存活的,于是要进行探测活性,不然后面对着一个挂了的网站测试,不是浪费时间吗)
对web.txt使用Ehole测试url资产的活性
1
| ehole.exe -l web.txt -json export.json
|
使用Ehole得到
再把export.json另存一份为target2.txt备用
1
| target2.txt 存活的url资产(txt格式)
|
处理Ehole的数据
对export.json使用sublime进行正则提取url资产
1 2
| http://[^\"]* https://[^\"]*
|
得到
自动化扫描
Nuclei
1
| nuclei.exe -list test.txt -o output.txt
|
AWVS
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
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
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"}
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 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
|
找出最终进一步测试的目标得到
03-经资产整理与攻击目标发现,大致得到一些可能可攻击的目标,然后再对这些目标进行架构信息搜集,为什么把架构搜集放在最前面呢,因为假设目标使用了CDN,反向代理,负载均衡,那我们在没搞清楚架构的情况下,就去渗透测试,端口扫描,内网渗透,那将是毫无意义的或者收效甚微的
架构信息
反向代理
反向代是将内部网络中的服务通过端口映射等方式暴露到公网,使外部用户只能通过反向代理服务器进行访问
使用Wappalyzer浏览器插件识别
负载均衡
为了防止访问拥塞,减少主服务器的负担,多个负载均衡服务器监听公共网络接口,接收来自客户端的请求,然后将这些请求转发到内网的多个后端服务器端口
使用lbd工具(kali自带)
站库分离
可以减少攻击者获取敏感数据的可能性。即使攻击者成功入侵了网站服务器,也无法直接访问数据库中的主要数据,因为数据库服务器是独立的
CDN
为了提升访问体验,在多个地方部署CDN服务器,自动将用户的请求路由到最近的服务器节点,就近地为用户提供服务
多地ping
绕过
WAF
04-经架构信息打点后,可能要进行适当的绕过,比如CDN,WAF,反向代理,然后就可以进一步地愉快地进行网站基本信息的搜集了吗,我认为不是的,应该先搜集源码信息,因为如果网站使用了CMS,或者源码泄露,那么此次渗透就直接上升成了白盒测试,或者直接使用Nday攻击,省略了大部分的打点步骤,岂不美哉?
源码信息
CMS
闭源售卖
泄露
05-经源码信息打点,如果没有收获,那么只能老老实实继续进一步搜集网站基本信息
网站基本信息
语言
数据库
web容器
操作系统
06-经网站基本信息打点后,了解了网站基本构成,然后就可以进行深度的挖掘信息了,进入网站具体信息打点
网站具体信息
目录
快照
插件信息
第三方接口信息
旁站
端口服务
07-经网站具体信息打点后,基本上已经掌握了大部分信息了,运气好的话已经出货了,但如果还是一无所获的话,还可以考虑社工信息(机会不大)
社工信息
就需要人工去找了
- 域名服务商
- 服务器供应商
- 网站管理员
- 网站开发人员
08-到此,对于WEB资产的信息打点就基本结束了,你以为就完了吗?哈哈当然不是啦,还可以对目标旗下的小程序,APP进行信息搜集,小程序往往比较容易一些……
小程序信息
- 安卓模拟器+brup抓包 分析出web资产,重复上述web资产的信息打点
APP信息
外在
- 安卓模拟器+brup抓包 分析出web资产,重复上述web资产的信息打点
内在
自动化搜集工具