Censys Information Collection

B{MQ8V1JU3T1)9}MIJX~{(M
Censys 是一款用以搜索联网设备信息的新型搜索引擎,安全专家可以使用它来评估他们实现方案的安全性,而黑客则可以使用它作为前期侦查攻击目标、收集目标信息的强大利器 。最近的工作主要是围绕着信息收集来做的,突然发现以前我们搞站,做测试的时候最不重视的就是信息收集,然而现在看来有一个好的信息收集方法可以大大的提高工作效率以及exp的命中率。而这些网络空间搜索引擎是最好用的批量自动化收集工具!所以像shadan,zoomeye等等都提供了一些供用户使用的api,但是这两者会收取一定的费用,而censys是免费的。

在censys官方提供的API页面,我们看到,Censys提供了search、view、report、query、export以及data六种API接口。在提供的API方法中,我们使用最多的应该就是search了,所以,我大体介绍了一下search的使用方法。search接口的请求地址是https://www.censys.io/api/v1/search/?,其中?的地方可以是ipv4、websites或者certificates,分别代表搜索ipv4主机、网站和证书。我们的POST请求应该是一组包含query、page、fields的json数据,其中query指的是相应的搜索语句;page代表返回的页码,Censys总是返回一页的数据,即如果你page设置的5,那么其返回的并不是前5页的数据,而是第5页的数据。

官方的两种api利用方式
第一种就像我上篇文章zoomeye的一样,利用requests模块访问api接口,然后抓取返回的json数据,进行筛选,提取。

   
        import sys
	import json
	import requests

	API_URL = "https://www.censys.io/api/v1"
	UID = "8f616be1-d33b-4d88-85e0-9970d2becac0"
	SECRET = "hYjY15Y7d2AefRkIKSLRSNKn7lBRcBW4"

	res = requests.get(API_URL + "/data", auth=(UID, SECRET))
	if res.status_code != 200:
	    print "error occurred: %s" % res.json()["error"]
	    sys.exit(1)
	for name, series in res.json()["raw_series"].iteritems():
	    print series["name"], "was last updated at", series["latest_result"]["timestamp"]

第二种是直接利用censys提供的第三方censys模块。

     import censys.certificates
     UID = "8f616be1-d33b-4d88-85e0-9970d2becac0"
     SECRET = "hYjY15Y7d2AefRkIKSLRSNKn7lBRcBW4"
     certificates = censys.certificates.CensysCertificates(UID, SECRET)
     fields = ["parsed.subject_dn", "parsed.fingerprint_sha256", "parsed.fingerprint_sha1"]
     for c in certificates.search("current_valid_nss: true"):
         print c["parsed.subject_dn"]

两种方式都不难实现,但第一种方式个人觉得对最后所需数据的提取更方便,因为censys模块的介绍比较少,其返回的数据结构好像和第一种方式不同。具体实现代码:

def ip(query, page):
    start_time = time.strftime('%H:%M:%S', time.localtime(time.time()))
    day_time = time.strftime('%Y%m%d', time.localtime(time.time()))
    f = open ('%s.txt' % day_time, "a+")
    print '\033[1;32;40mstarting at [%s]\033[0m' % start_time
    data = {
        "query": query,
        "page": page,
        "fields": ["ip", "protocols", "location.country"]
    }
    try:
        res = requests.post(API_URL + "/search/ipv4", data=json.dumps(data), auth=(API_ID, API_SECRET))
    except:
        pass
    else:
        try:
            results = res.json()
            str =  'total_nums: %s   backend_time: %ss' % (results["metadata"]["count"], results["metadata"]["backend_time"])
            f.write(str + '\n')
            str1 = '\033[1;33;40m%s\033[0m' % str
            print str
        except:
            pass
        else:
            if res.status_code != 200:
                print "error occurred: %s" % results["error"]
                sys.exit(1)
            for result in results["results"]:
                print "%s in %s" % (result["ip"], result["location.country"][0])
                for p in result["protocols"]:
                    print p
                    rr = '%s:%s in %s\n' % (result["ip"],p,result["location.country"][0])
                    f.write(rr)
    f.close()

运行效果:

1

3

最后附上利用censys第三方模块实现ipv4搜索的代码:

        reslist = []
        API_ID = api_id
        API_SECRET = api_secret
        try:
            api = censys.ipv4.CensysIPv4(api_id=API_ID, api_secret=API_SECRET)
            res = api.search(self.querystr)
            matches = res['metadata']['count']
            pageNum = matches / 100
            maxPageNum = pageNum
            if matches % 100 != 0:
                pageNum = pageNum + 1
            pageNum = self.MAX_PAGE if pageNum > self.MAX_PAGE else pageNum
            count = 1
            while count <= pageNum:
                if START_PAGE > maxPageNum:
                    break
                results = api.search(self.querystr, page=self.START_PAGE)
                count = count + 1
                START_PAGE = START_PAGE + 1
                for result in results.get('results'):
                    #rr = "{0}:{1}".format(result.get("ip"), result.get('protocols')[0].split('/')[0])
                    rr = "{0}".format(result.get("ip"))
                    reslist.append(str(rr))
            return reslist
            # print  reslist
        except Exception, e:
            print str(e)

参考连接:http://www.freebuf.com/vuls/90886.html

Censys Information Collection》有1个想法

发表评论

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