高匿ip代理自动化信息搜集框架介绍

高匿ip代理这次实习期间完成了一套信息搜集流水线,踩了大大小小的坑。本文将介绍常见的信息搜集手段,并对流水线进行一个大致介绍~

前言

在渗透测试初期,信息搜集是很重要的一环。从现有的渗透测试流程来看,一些较为基础的信息搜集环节都是大同小异,比如 whois 、子域名枚举、端口扫描等,当然一些具体到项目的信息搜集比如下载 App 进入到内部搜集信息不属于这个范畴。这些基础的信息依靠手动搜集往往会耗费搜集人员高匿ip代理大量的时间,因此,一个自动化的信息搜集框架,可以为渗透人员节省大量的时间,并将精力投入到一些更有价值的工作中。本文将会在关于信息搜集手段介绍的基础上,进一步提出自动化信息搜集框架。

模块介绍

 Whois 

whois 模块负责 whois 的信息查询和备案查询,并可以根据查询出来的结果进一步进行邮箱、电话和联系人的反查,这块使用站长之家提供的 API查询就可以完成。

SubdomainEmu

子域名枚举是指一个或多个域名查找子域名的过程,它是安全评估和渗透测试前期侦查中信息收集的重要手段。一些组织可能只会在主要的域名中严防死守,但是却在被遗忘的子域名中残留了高匿ip代理一些存在漏洞的服务,而攻击方正是利用这些存在漏洞的服务来扩大攻击面。

子域名枚举的常用技术手段搜索引擎

一些搜索引擎会支持高级查询语法,如图,借助百度搜索引擎来查询mozilla.org的子域名。

当然谷歌,必应等搜索引擎都是支持这样的搜索引擎语法的。

暴力枚举

暴力枚举就是使用字典来爆破子域名,对每个子域名进行 DNS 查询,若存在相应解析记录则证明该子域名存在。爆破的效果更多的依靠字典的覆盖程度。

第三方聚合应用

像 VirusTotal 这类的网站应用汇聚了大量 DNS 信息,可以使用这类网站高匿ip代理查询到一些子域名信息。

SSL 证书透明度

Google 透明度报告中的证书透明度项目用于解决 HTTPS 证书系统的结构性缺陷,它能够让所有人查询各个网站的 HTTPS 证书信息,从而能发现签发了证书的子域名。这方面也有一些搜索引擎可以查找公开的 CT(certificate transparency),比如crt.sh。

模块介绍

该模块主要集成以下工具

sublist3r:一个快速的子域名枚举器,它可以通过各种主流搜索引擎和第三方聚合应用来查找子域名,兼具爆破功能。

dnsbrute:一个 go 语言写的子域名爆破工具,速度很快。

crt.sh 查询脚本,用于远程连接 crt.sh 数据库并查询子域名。

其他的子域名枚举工具高匿ip代理其实还有很多,但是考虑到集成的难易程度就选择了这三种。本流水线中使用 subprocess模块来调用工具,并读取输出加以解析合并。

Reallp

查找真实 ip 对于测试来说非常关键,能不能查找到真实 ip,直接关系到旁站发现,端口扫描等环节的正确性。但是在真实场景中,很多时候目标主机都会部署 CDN,也叫做内容分发器。什么是 CDN 呢?简单来说就是多个地点,不同的网络上摆放的服务器节点。这些节点之间会动态的互相传输内容,对用户的下载行为最优化 ,减少带宽成本。这种情况下直接访问过去解析出来的 ip 只是 CDN 服务器的 ip 高匿ip代理而不是网站服务器的真实 ip ,那么该如何有效发现网站的真实 ip 呢?

发现真实ip常用手段nslookup

在网站没有使用 CDN 的情况下,nslookup 命令可以直接查询出目标主机的ip地址,如图:

但是如果是有 CDN 的情况会怎么样呢?以 thinkphp.cn 为例, 可以看到返回了多个地址,这种情况就多半是使用了 CDN 了。

ping

另一种检测真实 ip 的方法是直接使用 ping 命令,在多个地点同时 ping 目标站点,在没有 CDN 的情况下会直接得到真实 ip ,如果多个地点同时 ping 出来的结果不同,很可能就应用了 CDN。而如果网站应用了 CDN 但是CDN 设置了只对国内访问进行加速因而导致从国内高匿ip代理访问时会访问CDN,而从国外访问会直接访问服务器的情况下,可以通过挂代理使用 ping 命令来获取真实 ip。

这里有一个国外的多地 ping 网站:https://asm.ca.com/en/ping.php

DNS历史记录

在 DNS 的解析记录中,也许会出现这个域名使用 CDN 之前的 ip 也就是真实 ip,我们可以通过一些网站查询,比如 viewdns 和 virustotal 。如图是查询uber.com的DNS历史记录。

通过子域名来查询

出于经济原因或人为疏漏,一些组织在部署服务的时候往往会在主站或者部分域名上部署 CDN 服务而忽略了其他的子域名,这种情况下就可以绕过 CDN,直接通过 ping 子域名查找对应 ip ,查到的结果往往和目标主机在一个 C 高匿ip代理段上或者就是同一台主机。

网络空间引擎查询

一些公开的网络空间搜索引擎中会保存网站的历史快照, 常用的有 fofa 、shodan 、zoomeye 等。在查询过程中,既可以通过域名也可以通过 title 等其他特征值来搜索。

APP内查询

如果目标站有 APP,可以利用 fiddler 或 burpsuite 抓包 App 请求,从中获取 ip。

利用邮件

有些目标网站内置了发送邮件的功能,我们可以查看邮件的源代码来找到其中的 ip 信息,至于是不是真实 ip 就要分以下三种情况讨论了:

邮箱服务器和目标网站在共用同一个 ip 的情况下,ip 信息就是真实 ip

邮箱服务器和目标网站不共用一个 ip 但是高匿ip代理处在同一个 C 段下,这个时候扫描整个 C 段可能获取到 ip

如果是从第三方服务器或者是公共服务器发送来的邮件,那么 ip 信息对找到真实 ip 并没有什么用处

查询https证书

如果目标主机的 ip 暴露了 443 端口,那么直接访问这个 ip 就有可能获取 SSL 的有效证书并发现主机信息, 但是这样的查询需要以全网扫描作为前提,刚好 censys 就满足这个需求,查询语法如下:

443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:xxxx.com

模块介绍

考虑到实际查询效果,将以下手段集成到流水线中:

ping && nslookup,使用 subprocess 调用,并对输出结果进行分析,使用正则表达式来判断是否有 cname或者 CDN,若没有就记录ip。

使用 fofa 搜索高匿ip代理子域名和二级域名, 用 beautifulsoup 解析, 并用二级域名作为关键词来去匹配筛选可能的 ip

使用viewdns提供的 api 来查询域名的 DNS 历史记录,会对结果进行一个简单筛选,比如发现是归属于Cloudflare 的 ip 就不会记录它。

PortScan

查询到真实 ip 后,我们就可以开始进行端口扫描了,找到开放端口、发现存在漏洞的应用服务有利于拓宽攻击面。

常用手段

nmap等工具

使用一些在线网站比如。

模块介绍

先使用 subprocess 调用 tscan 进行全端口的扫描。

将输出的情况通过正则匹配得到端口列表,并将其作为 nmap 的参数进行二次扫描以检查存活情况。

SlideSite

旁站,是和目标网站共高匿ip代理用一台服务器的网站,在主站无法攻陷的情况下,便可以考虑将旁站作为攻击入口。旁站查询的正确性需要建立在真实 ip 的正确性上。

常用手段

这块内容可以交给一些在线网站比如 站长之家,还有一些网站提供了方便查询的API比如virustotal。

模块介绍

依次使用 virutotal,chinz,ipip,webscan,tscan 四个网站来查找旁站,这块内容主要使用 selenium 爬虫和API 查询来完成。

FingerPrint

网站的指纹,包括操作系统、中间件、脚本语言、数据库、服务器、web容器、前端框架和CMS类型等等,这些信息一般会通过网站的一些特征值暴露出来,比如路由不存在时候的页面、404错误页面和高匿ip代理数据响应包等等。比如下面这个网站,通过输入不存在的路由,在报错信息中回显出了CMS版本信息:

常用手段

在线网站查询

云悉 :http://www.yunsee.cn/

bugscaner :http://whatweb.bugscaner.com/look/

whatweb :http://whatweb.net/

ThreatScan :

本地工具或者浏览器插件

wappalyzer :

御剑

手工

模块介绍

使用 selenium 爬虫抓取 yunsee,whatweb, tscan 三个网站的查询结果,同时使用 subprocess 模块调用本地工具 wappalyzer 来查询网站指纹相关信息。

WebScan

网站路径扫描可以帮助攻击者发现一些泄露的敏感信息,常见的有 .git 文件泄露,.svn 文件泄露,.DB_store 文件泄露,WEB-INF/web.xml 泄露等。扫描效果更多的依靠字典的覆盖广度。

常用手段

使用工具,这方面的工具很多,御剑、dirsearch、DirBuster 等等。

模块介绍

该模块分为两个功能

使用 subprocess 调用 dirsearch 高匿ip代理来进行路径扫描。读取输出结果并记录

使用 selenium 爬虫来抓取网站下的所有有价值的链接并记录,并深入链接继续递归访问

OutPut

将上述模块的 json 数据输出转化成 html 文件输出。

模块组装

划分好模块后就可以怎么将其组装为流水线的问题了。

一开始想着是一个简简单单的单一入口点的流水线程序,流程如下:

输入 -> whois查询 -> 子域名枚举 -> 真实ip查找 -> 端口扫描 -> 旁站查找 -> 指纹查询 -> 路径扫描 -> 输出

但是马上就发现了严重的问题:

假设一个场景:在流水线中间真实 ip 查找环节,输出的 ip 列表可能并不正确(可能高匿ip代理其中包含了无效的 ip,或者没把正确的 ip 包含进去),但这个时候要怎么做呢?单一入口的情况下如果打断就只能重新从流水线开始执行,而且依然查不到正确的 ip ,如果放任不管,势必会导致大量的时间消耗或者压根得不到正确结果。

所以,流水线应该有多个入口点,给信息搜集人员留下手工信息搜集的空间。在发现流水线输出有问题的时候,可以立刻终止,在手工搜集后将正确信息输入后从打断的地方开始继续进行。

最后流水线结构如下

如图,我在三处设置了入口点。 同时也可以看到 webscan 模块高匿ip代理和指纹查找模块是交替执行的, 这是因为指纹查找模块中的部分网站有频率限制, 为了节约时间,在等待的过程中去执行 web 扫描。 除此之外,在主程序中设置了多个参数,允许跳过流水线中第三个入口点后的任何一个环节。

其他要注意的问题

 超时问题  

在扫描过程中经常会遇到主机响应过慢的情况,很有可能是对面故意而为之的,也许就是个蜜罐呢。那么这个时候扫描就显得意义不大了,所以我们在程序中给扫描部分都加上一个超时打断的功能,保证流水线不至于浪费过多的时间。

高匿ip代理两种解决方法,第一种是在Popen的基础上设置一个定时器 Timer 来控制时间,当到达时长的时候就将进程杀死:

kill = lambda process: process.kill()p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)my_timer = Timer(timeout, kill, [p])try: my_timer.start() stdout, stderr = ping.communicate()finally: my_timer.cancel()

第二种是使用subprocess.Run函数,它有内置的参数可以控制进程运行的时间。

try: subprocess.run(cmd, timeout=5)except subprocess.TimeoutExpired:    print(timeout error) 多进程问题 

我曾在端口扫描模块部分写了一个多进程的版本,每一个进程都使用一个 ip 去经过 tscan 和 nmap 的扫描,扫描完成后通过管道符来将结果传递给主程序。但是在完成后每每测试总是不如人意,大多数进程都由于超时被直接杀死了,其原因却相当简单:带宽跟不上,所以后来又改回了单一进程的版本了。

 参数抽离  

最好将各个高匿ip代理模块需要的参数都聚合成一个配置文件,便于使用,这里贴一下我的流水线的配置文件

[whois]# 站长之家的apikey, 每个key使用500次后会失效需要重新申请chinz_api_key           =xxxxxxxxxxxxxxxxxx[subdomainemu][realip]# 向fofa发起请求后的睡眠时间request_sleep           =0# viewdns api keyviewdns_key  =xxxxxxxxxxxxxxxxxxxxxxxx[sidesite]# 使用virustotal查找时候需要用的apikeyvirustotal_api_key      =xxxxxxxxxxxxxxxxxxxxxxxx# selenium等待目标元素加载完成的最大等待时间selenium_wait           =80[portscan]# 等待tscan扫描完成的最大等待时间tscan_timeout           =3600# 等待nmap扫描完成的最大等待时间nmap_timeout            =1800[fingerprint]# 每次完成指纹查询后睡眠的时间sleep_time              =240# 等待元素加载完成的最大等待时间selenium_wait           =60[webscan]# dirsearch 扫描的最长时间dirsearch_timeout       =600# 每次爬虫请求后的延时spider_delay            =0.5# dirsearch 扫描时候每次请求的延时dirsearch_delay         =0.5# 是否跳过链接爬取skip_spider             =False# 是否跳过路径扫描skip_dirsearch          =False selenium  

此处踩的坑主要高匿ip代理是环境问题,在服务器上测试会遇到一些报错,然而在本地运行正常。出现这种情况的时候最好检查一下 selenium、chrome 和 chomedriver 三者的版本是否相协调,如果不协调就会出现一些谜之错误,建议去官方网站上下载对应版本的 chromedriver。

 链接去重  

爬取网站链接要做好去重否则会在链接爬取上浪费大量时间,举个例子,目标网站上有 1000 篇的 post 文章,url 的形式类似于

?p=xxxx

如果全都爬取,势必会消耗大量时间。根据经验,这种类型的链接里头其实包含有价值信息的可能性并不高,所以只需要爬取一次就可以了,其他的类似链接统统高匿ip代理不去访问和记录。那么怎么去重呢?

去掉参数,仅仅保留路径

将路径中的特定字符集比如数字都用特定符号替代,比如问号,由于在上面已经把参数部分去掉了,这里的问号只代表被替换的数字,便于标识

例如对于以下 url 链接

?p=1?p=2?p=3/g/2020-01-20/p/1/g/2020-01-20/p/2/g/2020-01-20/p/3

基于上面的两个方法去重后记录下的链接:

/g/????-??-??/p/?

下次遇到形式相同的 url 链接,就不会再访问和记录了。

效果演示

由于整个流水线的输出太多,这里仅截取每个模块的部分输出情况。

Whois 模块

SubDomainEmu 模块

RealIp 模块

PortScan 模块

SideSite 模块

FingerPrint 模块

WebScan 模块(爬虫部分)

WebScan 模块(dirsearch 部分)

后记

流水线框架在一定程度上节约测高匿ip代理试人员的时间和精力,而且易于扩展集成更多的工具。但是真实场景复杂多变,程序对信息的过滤和筛选十分重要。举例来说,在真实ip查找阶段,如果没有做好过滤条件,就很有可能输出一些错误的 ip ,进而在后面的模块中浪费一些时间。而由于一次流水线作业运行时间较长,测试人员不可能一直盯着流水线运行,更不可能在模块输出的瞬间就去检验输出结果的正确性,更多情况下,只能是在发现明显错误的时候予以打断并检验输出后从中间环节开始继续运行。从这方面来说,流水线设高匿ip代理计本身会非常依赖过滤规则。未来将会对程序内部的过滤规则进行不断完善,同时会根据情况给各个模块集成更多的优质工具。

精彩推荐后渗透之Rootkit及后门程序安全分析平台初探:IR 与应用

渗透测试笔记:从一个 App 开始的渗透测试之路

2020攻防演练 | 公开课程干货来袭

北京星阑科技有限公司(简称星阑科技)是一家以安全技术为核心、AI技术为驱动的网络安全科技公司,致力于提供高级攻防服务和智能化网络安全解决方案,以应对政府、企业所面临的日益严峻的网络安全威胁,让网络空间更加安全与智慧。

目前,星阑科技提供攻防对抗、APT防御、高级渗透等安全服务,为客户全面梳理威胁矩阵、进行安全赋能。产品包括攻击诱捕系统、邮件攻击一体化系统、基于前沿的图神经网络的智能边界防护引擎以及AI自动化漏洞挖掘系统,能全面提升客户的安全防护能力并有效降低安全运维成本。

长按图片识别二维码

关注星阑科技

获取更多安全资讯