Ipwhois Infomation Collect Tool

0x00.前言

为什么要写这个工具呢,因为以前在挖一些src的c段漏洞时,很多时候不知道这个c段的一些ip是否属于这个厂商,在只有ip的情况下,我们可以通过web服务识别外,但如果没有web服务,或者web服务并不是那么清晰的展示出该ip属于哪个厂商时,这时ipwhois信息就很好用了。同样我在分析自己服务器日志时,一些恶意请求的来源ip也可以通过ipwhois信息进行一些溯源和信息收集。

0x01.大概思路

要获取ip的whois信息方法挺多的,我介绍下我常用的几种。

1.curl

很多站点都提供了用户查询的api,比如ip.cn,ipinfo.io等等,我们可以直接用curl发个get请求,就可以获取ipwhois信息了。

第一个乱码是由于我在windows下中文字符编码问题,第二个就是正常结果,但是可以看到信息不是很多,这时我们就可以选择一些信息比较全的网站,像站长工具啊这些。

2.利用一些站点的api自己造一个信息完善的好用的工具。

这里我先分享一个很好用的网站。我写的这个工具就是基于该站点,信息相比之下比站长工具的要全一点,这个站点官方也提供了多种方式的api,但我看了下api返回的数据不是很全,没有将站点上查询的所有结果保存下来,只有选择性的保存了一些重要信息。但是其实它查询url就已经算是一个api了:

https://www.boip.net/ipv4/123.207.246.182

直接一个get请求,没有任何验证。那么我们就可以利用python去请求,去把想要的数据从返回的html源码里用正则提取出来,这样就能返回跟站点查询一样的数据,也可以根据自己的需要筛选出自己想要的和不需要的。于是也就有了下面这个工具。整体思路很简单:一个get请求+正则获取想要的内容就完了,具体实现看源码吧:

#coding:utf-8
import re
import ssl
import httplib
import urlparse

ssl._create_default_https_context = ssl._create_unverified_context
red = u'\033[01;31m'
end = u'\033[0m'

# remove the null from the list
def strip_list(list):
    list.remove('国家')
    return list

# get the response from the ip
def curl_ssl(ip):
    try:
        url = 'https://www.boip.net/ipv4/%s' % ip
        # print url
        ret = urlparse.urlparse(url)
        conn = httplib.HTTPSConnection(ret.netloc)
        # print ret.path
        conn.request(method='GET', url=ret.path, headers={'User-agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1'})
        return conn.getresponse().read()
        conn.close()
    except Exception,e:
        print "Exception:",e

# collarting the infomations
def get_ipinfo(res):
    try:
        # print res
        result = re.findall(r'<div class="r">(.*?)</div>',res)
        result1 = strip_list(re.findall(r'<div class="l">(.*?):</div>',res))
        info = dict(zip(result1,result))
        print '\033[1;31;40m'
        for k in info:
            if k == '纯真数据':
                info[k] = re.search(r'(.*?)', info[k]).group(1)
                print '[%s]: %s' % (k.decode('utf-8').encode('gbk'), info[k].decode('utf-8').encode('gbk'))
            elif k == 'IPv4地址':
                info[k] = re.search(r'<a href="http:///ipv4/(.*?)" target="_blank">', info[k]).group(1)
                print '[%s]: %s' % (k.decode('utf-8').encode('gbk'), info[k].decode('utf-8').encode('gbk'))
            elif k == 'ASN编号':
                info[k] = re.search(r'</a><a href="http:///asn/(.*?)" target="_blank">', info[k]).group(1)
                print '[%s]: %s' % (k.decode('utf-8').encode('gbk'), info[k].decode('utf-8').encode('gbk'))
            else:
                print '[%s]: %s' % (k.decode('utf-8').encode('gbk'), info[k].decode('utf-8').encode('gbk'))
        print '\033[0m'
    except Exception,e:
        print "Fail to get the info with the exception:",e

def whois(ip):
    # print ip
    res = curl_ssl(ip)
    get_ipinfo(res)

if __name__ == '__main__':
    whois('46.164.221.101')

运行截图:

0x02.结语

这个小脚本已经作为一个插件加入了我自己的扫描器套餐,这样以后挖洞的时候辨认c段ip厂商的时候也方便了许多。

Ipwhois Infomation Collect Tool》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注