1. 转自个人freebuf专栏:https://www.freebuf.com/articles/web/159172.html

1. 思路

获取代理地址
对获取的代理地址进行验证,提取出真实可用的代理地址
代理指纹的提取与自动化挖掘代理
根据IP的相关信息进行排序:存活时间。存活时间较长的IP一般为固定的IP
数据分析与利用

关于数据分析与利用,相应的思路如下所示:

代理IP的各种作用:爬虫、隐藏真实IP、代理上外网、薅羊毛
情报:IP威胁情报及IP信誉分析
通过真实可用的IP提取分析代理IP的指纹信息,可作为代理IP分析的指纹特征。并且在具体工作中可以落地进行代理IP的查找与分析。
判断改IP的所有者(政府企事业单位、个人用户、IDC等)与存活时间;若为政府企事业单位用户基本上说明该IP被黑客控制时间越长被控制的越久。获取与整理这些IP,可以进行通报预警与应急响应。
周期性探测,对短时间内出现大量的IP进行资产指纹分析,提取共性,可以用于预警通报

2. 数据爬取与指纹提取

2.1 获取代理IP

代理IP的获取可以先利用网上开放的代理IP平台,这里面个人推荐两个:

www.xicidaili.com
cn-proxy.com(需要梯子)

下面以xicidaili.com为例进行分析。该代理网站的代理类型一共分为四类:国内高匿代理、国内普通代理、国内HTTPS代理、国内HTTP代理。
基于代理IP的挖掘与分析 - 图1
下面以国内HTTPS代理为例来爬取网站上的代理IP信息,核心实现python代码如下(Python新手,大牛轻喷):

#coding:utf-8
from requests import *
import re
headers = { "accept":"text/html,application/xhtml+xml,application/xml;",
            "accept-encoding":"gzip",
            "accept-language":"zh-cn,zh;q=0.8",
            "referer":"Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)",
            "connection":"keep-alive",
            "user-agent":"mozilla/5.0(windows NT 6.1;wow64) applewebkit/537.36 (khtml,like gecko)chrome/42.0.2311.90 safari/537.36"
            }
for i in range(1,835):
    url = 'http://www.xicidaili.com'
    url = url + '/wn/'
    url = url + str(i)
    html = get(url,timeout=3,headers=headers)
    html.encoding = html.apparent_encoding
    proxyip = r'(<td>.*</td>)'
    iplist = re.findall(proxyip,html.text)
    i = 1
    for ip in iplist:
        ip = (ip.split('<td>')[1]).split('</td>')[0]
        f =  open('./ip.txt','a')
        print(ip,file=f)
        if i%5==0:
            print('\n',file=f)
        i = i + 1

获取到的代理IP格式经处理后如下所示:
基于代理IP的挖掘与分析 - 图2
可以看出爬取出来的代理IP的格式为:IP、端口、代表类型、存活天数、发现日期及时间。下面将这些信息存入到数据库中,以方便检索与查找。这里面个人选择mysql数据库,将相关的数据导入到mysql中,共29700条https代理,如下所示:
基于代理IP的挖掘与分析 - 图3

2.2 验证可用的代理

验证代理是否可用的方法比较多,在批量验证时可以使用python来实现,这里面验证代理是否可用的方法为直接使用代理访问baidu.com,若返回状态为200,则说明代理可用。反之,则说明不可用。
基于代理IP的挖掘与分析 - 图4
验证基于前面已经采集的HTTPS代理:
提取出HTTPS代理的IP、端口,保存到本地的测试文件中。测试文件格式如下:
基于代理IP的挖掘与分析 - 图5
验证代理是否可用的python代码如下:

#coding:utf-8
from requests import *
import re
for proxy in open("https.txt"):
    proxy = proxy.replace('\n','')
    proxies={"https":proxy}
    headers = {
        "Host": "www.baidu.com",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
        "Accept": "*/*",
        "Accept-Language": "en-US,en;q=0.5",
        "Accept-Encoding": "gzip, deflate",
        "Referer": "https://www.baidu.com/"
        }

    url = 'https://www.baidu.com'
    try:
        html = get(url,timeout=10,headers=headers,proxies=proxies)
        if html.status_code == 200:
            proxy = proxy.split('https://')[1]
        f =  open('./proxyip.txt','a')
        print(proxy,file=f)
    except Exception as e:
        print(e)
        pass

提取出验证成功的代理IP地址和端口号,如下所示:
基于代理IP的挖掘与分析 - 图6
选择验证成功的进行测试,成功正常使用。
基于代理IP的挖掘与分析 - 图7基于代理IP的挖掘与分析 - 图8

2.3 代理指纹提取

既然网上这么多多的代理IP,这些代理IP和端口绝大多数是批量扫描得到的,因此,如果掌握了这些代理的指纹信息,就可以批量扫描代理的IP和端口了。选择其中部分代理的IP进行分析,通过nmap与抓包形式分析其指纹数据。这里随意选择一个代理IP地址:58.252.6.165,其代理端口为9000。对其进行数据分析,通过nmap探测到其9000端口对应的服务为MikroTik http proxy,这些数据应该可以作为代理的指纹。
基于代理IP的挖掘与分析 - 图9
基于Nmap扫描而来的代理指纹
基于代理IP的挖掘与分析 - 图10
基于HTTP响应提取的代理指纹
指纹提取思路:
本人的思路是直接提取HTTP响应头部信息,得到的是这样的:
基于代理IP的挖掘与分析 - 图11
看了一下,数据量有点大,一般情况下web服务类型是通过HTTP响应头部的server字段来返回的,因此代码优化了一下,直接提取出server字段,代码如下:

#coding:utf-8
from requests import *
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
    "Accept": "*/*",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate",
    }
for url in open("proxytest.txt"):
    url = url.split('\n')[0]
    try:
        html = get(url,timeout=3,headers=headers)
        html = html.headers['server']
    except Exception as e:
        pass
    f =  open('./proxyanalysis.txt','a')
    print(url,html,file=f)

爬取了一段时间,共采集到14000个左右的有效响应,得到如下数据:
基于代理IP的挖掘与分析 - 图12
对数据进行提取、分析整理出如下代理的指纹信息(HTTP响应头部的server字段):
基于代理IP的挖掘与分析 - 图13
上述代理指纹数据个人感觉有些不太适合,如Microsoft-IIS、PCSERVER、Apache。这些代理指纹可能需要结合其他指纹信息。
另外,在网上也找了一些代理服务器,有兴趣的同学可以收集一下以下代理服务器的指纹信息:
MicrosoftProxy,Microsoft ISA,WinProxy、WinGate、winRoute、SyGate、CCProxy、SuperProxy

2.4 指纹实战

既然基于Nmap和基于HTTP响应报文头部的MikrotikHttpProxy可以作为代理IP的指纹,那么我们来进行代理指纹的搜索实战。互联网上有很多比较不错的黑客搜索引擎,如shodan、fofa、zoomeye等。本文以Fofa使用为例子介绍如果通过搜索引擎找到代理的IP。
Fofa是白帽汇公司推出的一款基于网络爬虫而生成的黑客搜索引擎,上文已经收集整理了很多代理的指纹信息,通过fofa搜索代理IP,其搜索可以使用以下方法:
server:”MikrotikHttpProxy”,探测到44439条结果。
基于代理IP的挖掘与分析 - 图14
基于fofa搜索的代理IP
搜索44439条结果,本来想全部爬取下来,奈何fofa的API需要会员,并且非会员只能看到前5页。所以只爬取第一页相关代理IP,爬取后数据如下:
基于代理IP的挖掘与分析 - 图15
上面是使用Fofa搜索到的代理IP信息,有兴趣的同学可以自己使用代码来实现,下面使用部分代理指纹来搜索代理设备:

#coding:utf-8
from requests import *
import re
for url in open("urllist.txt"):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
        "Accept": "*/*",
        "Accept-Language": "en-US,en;q=0.5",
        "Accept-Encoding": "gzip, deflate",
        }
    html = get(url,headers=headers)
    if 'Mikrotik HttpProxy' or 'squid' or 'App-webs' or 'Tengine' or 'Proxy' in html.headers['Server']:
        url = url.split('/')[-1]
        print(url)

3. 数据分析与利用

3.1 端口号分布

通过对爬取的代理IP和端口来看,其代理端口出现频率较高的基本上相对比较固定,因此可以对这些代理端口进行分析。这样的话,后期基于Nmap或开发相应的自动探测产品可以有针对性的探测,不需要所有的端口都探测。当然也可以所有端口都探测,但是这样效率相对较低,好处就是漏报相对较少。大家在实战的时候根据自己的情况来选择。对29700个HTTPS的代理端口进行进行,除去频率低于100次的,其端口分布情况如下所示:
基于代理IP的挖掘与分析 - 图16基于代理IP的挖掘与分析 - 图17
代理端口分布情况
基于代理IP的挖掘与分析 - 图18
在搜索代理IP时可以重点搜索以上出现频率比较高的端口。

3.2 数据分析

3.2.1 存活较长的IP
通过代理数据库可以发现里面有很多代理IP存活天数较长,比较长的有一年左右的,这种存活天数较长的IP一般都为固定的IP,因此需要过滤出这些IP和端口信息。
这里面我们把代理库中存活天数大于100天的过滤出来,过滤后存在881条。

select * from httpsproxy where LiveDayslike '%天' and LiveDays > 100 order by LiveDays desc;

基于代理IP的挖掘与分析 - 图19
3.2.2 安全分析
这些代理都是存活100天以上的,这些IP基本上都是固定的IP,要么是公司、企业的,因此对这些IP分析,探测可能是政企单位用户。这里分析的思路是探测该IP上面是否有跑相应的网站,若存在网站的话再进行分析网站属性,若为政府企事业单位。若发现政府企事业单位有IP对外开放代理,一般情况政府企事业单位不会开放代理,这种情况基本上配置问题或者被恶意开放。因些需要提取出这些IP和所属用户情况。这些可以作为代理数据分析后的输出的安全情报。
云悉作为面向互联网开放的指纹与资产平台,其有相应的IP下开放的域名查询的功能。使用方法为http://yunsee_info.vuln.cn/?type=webip&url=ip,如查询1.2.3.4下有哪些域名,查询方法为:
http://yunsee_info.vuln.cn/?type=webip&url=1.2.3.4
返回的是json格式的数据,返回数据格式如下:
基于代理IP的挖掘与分析 - 图20
这里面把开放代理超过100天的IP直接导入,使用python进行批量查询。

#coding:utf-8
from requests import *
import re
for ip in open('livedays.txt'):
    url = 'http://yunsee_info.vuln.cn/?type=webip&url='
    url = url + ip
    html = get(url)
    html = html.text
    if '404' not in html:
        f =  open('./ipipip.txt','a')
        print(ip,html,file=f)

查询后对其数据进行分析,得到以下数据:
基于代理IP的挖掘与分析 - 图21
基于代理IP的挖掘与分析 - 图22
以上这些IP都是在IP代理网站中爬取下来,并且经验证其上面都有网站跑在上面,并且有的还是政府的站点。并且其存活时间都是100天以上,有的还有3年之久的。选择其中一个比较有意思的代理站点分享一下:
基于代理IP的挖掘与分析 - 图23基于代理IP的挖掘与分析 - 图24
基于代理IP的挖掘与分析 - 图25
代理以后,打开任何网站都会跳转到其网站上,这个应该是配置不合理导致的。
以上对代理IP的分析只是抛砖引玉,其实还有很多好的挖掘点,如这些代理IP的区域分布、IP上是否有业务以及业务组件的指纹信息、IP是否为路由器等。

3.3 IP情报

既然这些IP都是代理的IP,那么黑客或羊毛党也可以利用这些代理IP来进行攻击或薅羊毛,因此这些IP可以作为IP情报/信誉度之一。安全厂商或者情报厂商可以定期将爬取互联网上的代理IP,将其加入IP情报库,并定期的更新与维护。做安全对抗在单纯网络层防护肯定比应用层防护容易的多,因此代理IP/恶意IP在安全方面个人感觉意义重大。

4. 总结

4.1 我的安全观

IP是安全里面很小的分支、而代理IP又是IP里的分支。单纯恶意IP/代理IP可以作为安全里面的情报之一。未来安全的领域肯定分出现更多细分的领域,在某一个细分的领域精工细作也可以有很好的机遇与发展。
另外,安全是一个多维度、动态的。有的时候不一定非要使用太高大上的东西,真正接地气、可落地的方法与理念可能比高大上的东西更具有实战意义。能在网络层防护就不需要到传输层,能在传输层防护就不需要到应用层防护,能使用简单脚本实现的东西就不一定需要机器学习这些高大上的东西。

4.2 致敬freebuf及原创作者

Freebuf是一个比较开放的互联网安全平台,上面有很多比较好的原创作者。很多作者以前分享很多较好的议题,因为喷子无情,很多都没有更新了。在写原创文章的同时,我的综合能力也在不断的提升,回头看看那些喷子还在到处喷。所以,提升的是自己。希望大家也抱着开放、共享的精神,多多贡献优质的文章。
在这里,也祝大家2018新年快乐!