在渗透测试的初始阶段,Shodan、Censys等在线资源可以作为一个起点来识别目标机构的技术痕迹。本文中就以二者提供的Python API为例,举例介绍如何使用它们进行渗透测试初期的信息侦查。

Shodan和Censys简介

有关Shodan的详细介绍,可以查看Freebuf站内相关报道(报道1报道2)。

前段时间,网上发布了一个新的资源,那就是Censys.io(Freebuf相关报道)。通过每天对IPv4地址空间进行ZMap和ZGrab扫描,它能够收集互联网上的网站和系统的数据。这些网络资源可以结合使用,或者以不同的搜索参数(例如TLD、CIDR等)单独使用来查询可用的数据库,以此来帮助我们识别暴露在互联网上的任何信息和服务。

这些资源主要使用了下面的四种方式:

1、查询CIDR来枚举系统和服务(注意所枚举的任何额外域名)
2、查询顶级域名(TLD)来枚举系统和服务(注意所枚举的任何额外的CIDR范围)
3、查询单目标系统
4、查询搜索字符串(例如:Apache等。)

通常来说,向一个客户显示外部主机和公开服务是很有用的,并且这个过程通常会导致范围被扩大,以至于包含之前“未知的”主机或服务。虽然Shodan和Censys.io都通过一个API提供了对数据的直接访问功能,但是二者同时都提供了一个GUI与数据进行交互。由于Shodan和Censys结果之间的差别,所以二者的结合使用能够更全面地捕获外部服务。这些资源可以被快速地访问,并能够用来作为侦查目标机构的一个起点。

Shodan例子

对于枚举外部服务来说,Shodan是一个很出色的资源,且它同时支持IPv4和IPv6的数据查询。Shodan同时提供付费版本和免费版本的API接口和扩展GUI访问,以及一个Python模块来简化数据提取。下面是Python中与Shodan的免费API访问交互的一个例子:

~$ python
>>>
>>> import shodan
>>> SHODAN_API_KEY = '[INSERT_API_KEY]'
>>> api = shodan.Shodan(SHODAN_API_KEY)
>>> results = api.host("8.8.8.8")
>>>
>>> results.keys()
[u'data', u'city', u'region_code', u'ip', u'isp', u'area_code', u'dma_code', u'last_update', u'country_code3', u'latitude', u'hostnames', u'postal_code', u'longitude', u'country_code', u'org', u'country_name', u'ip_str', u'os', u'asn', u'ports']
>>> results['ip_str']
u'8.8.8.8'
>>> results['ports']
[53]
>>> results['hostnames']
[u'google-public-dns-a.google.com']
>>>

通过使用付费的Shodan API接口,你可以在执行查询时实现搜索过滤器,从而当你搜索数据时,它能够大大提升功能和细节粒度。一个展示Shodan脚本(需要使用付费的API接口)更高级的例子如下所示。下面例子中,输出内容被省略了,但是你可以看到,它可以返回对外部服务、网络范围、TLDs等的一次快速的快照,而这一点可用于驱动你的侦查,并能够使处理过程更深入。

$ shodan_searcher -s hostname:google.com
[+] Query: hostname:google.com Total_Results: 44510
[-] 8.8.8.8 (google-public-dns-a.google.com) 53  
[-] 178.35.137.68 (cache.google.com) 80  
[-] 82.223.249.194 (www.google.com) 3306 Server: MySQL
[-] 208.117.228.231 (cache.google.com) 80 Server: Google httpd
[-] 80.228.66.209 (ewe-hb-GGC-Node3-209.cache.google.com) 80  
[-] 179.49.8.116 (cache.google.com) 80  
[-] 37.98.225.196 (cache.google.com) 80  
…..
[+] Found Results in CIDRs: 208.117.244.0/24, 186.208.224.0/21, 85.118.96.0/19, 210.245.8.0/21, 86.120.0.0/13, 173.237.96.0/19, 114.31.0.0/20, 201.218.92.0/24, 213.153.32.0/19, 193.95.0.0/17, 177.155.141.0/24, 212.2.96.0/19, 212.113.48.0/20, 219.88.188.0/22, 83.174.192.0/18, 103.10.20.0/22, 202.163.106.0/24, 217.64.139.0/24,
…..
202.69.184.0/22, 192.232.16.0/20, 95.180.0.0/17, 189.28.163.0/24, 177.91.191.0/24, 206.80.240.0/20, 180.150.0.0/17, 217.175.200.0/24, 8.8.4.0/24, 176.126.56.0/22, 37.98.225.0/24, 77.120.60.0/22, 212.10.0.0/16, 109.110.32.0/23, 203.2.228.0/24, 77.50.0.0/17, 27.109.0.0/24, 95.181.0.0/17, 209.91.128.0/18
[+] Found the following TLDs: google.com

Censys例子

Censys.io是一个新型的免费在线资源,它由密歇根大学的研究人员创建。这个项目提供了一个Web服务API,以及一个Python模块来提高API交互。一旦你创建了一个免费账户,那么就可以通过它使用Censys.io API。为了执行API查询,你需要API ID和与你的帐户关联的密钥值。这两个唯一的键值可以在“我的帐户”区域中找到。下面是一个在Python中与Censys.io API交互的简单例子:

$ python
>>>
>>> import censys
>>> from censys import *
>>>
>>> api = censys.ipv4.CensysIPv4(api_id="[INSERT_KEY]", api_secret="[INSERT_KEY]")
>>> res = api.search("ip:8.8.8.8")
>>> res
{u'status': u'ok', u'results': [{u'ip': u'8.8.8.8', u'protocols': [u'53/dns']}], u'metadata': {u'count': 1, u'query': u'ip:8.8.8.8', u'backend_time': 34, u'page': 1, u'pages': 1}}
 
>>> for i in res.get('results'):
...     print "{} {}".format(i.get("ip"), " ".join(i.get('protocols'))
...
8.8.8.8 53/dns
 
>>>

下面是一个POC脚本,它从API中提取数据。默认情况下,它只抓取结果(100个结果)中的第一页。为了绕过这个限制,我们添加了一些简单的逻辑来解析总量,并进行了适当数量的查询。

#!/usr/bin/env python
 
import sys
import censys
from censys import *
 
api = censys.ipv4.CensysIPv4(api_id="API_ID", api_secret="API_SECRET")
 
res = api.search(sys.argv[1])
matches = res['metadata']['count']
pageNum = matches / 100
if matches % 100 != 0:
    pageNum = pageNum + 1
 
count = 1
while count <= pageNum:
    res = api.search(sys.argv[1], page=count)
    count = count+1
    for i in res.get('results'):
        print "{} {}".format(i.get("ip"), " ".join(i.get('protocols'))

利用Shodan和Censys进行信息侦查的更多相关文章

  1. 利用CMD查看系统硬件信息

    利用CMD查看系统硬件信息对于在windows下查看系统信息大家一定不陌生了,我现在说几个最常用的方法,对命令感兴趣的朋友看看,(给菜鸟看的,老手就不要笑话我了,大家都是从那个时候过来的,^_^).一 ...

  2. 利用plink软件基于LD信息过滤SNP

    最近有需求,对WGS测序获得SNP信息进行筛减,可问题是测序个体少,call rate,maf,hwe,等条件过滤后,snp数量还是千万级别,所以后面利用plink工具根据LD信息来滤除大量SNP标记 ...

  3. 利用BI搭建零售业数据信息平台

    某百货公司是全市规模最大的以零售为主.多元化经营的股份制商业企业.拥有员工数千人,经营国内外品牌2300余种,年商品销售额逾10亿人元. 销售体量如此庞大的企业近几年在IT建设上出现了问题,集团内部的 ...

  4. 利用 __FUNCTION__ 宏打印函数调用信息

    __FUNCTION__ 宏表示当前所在函数名: __FILE__ 宏表示当前所在文件路径: __LING__ 宏表示当前所在行: 利用对象离开函数时调用析构函数销毁的特点,打印出函数执行结束的信息 ...

  5. python重新利用shodan API

    前言: 之前写过一个shodan的API调用 感觉写的不这么好.然后现在重新写一个 shodan介绍: shodan是互联网上最可怕的搜索引擎. CNNMoney的一篇文章写道,虽然目前人们都认为谷歌 ...

  6. 恶意软件正在利用SSLserver窃取用户个人信息!

    安全套接层协议(SSL)及安全传输层协议(TLS)旨在提供一个安全.加密的client和server之间的连接网络.为进一步进行身份验证和加密,server必须提供证书,从而直接有效地证明其身份. 使 ...

  7. JDBC实战案例--利用jdbc实现的宠物信息管理系统

    一.需求: 利用jdbc实现对宠物的信息进行管理的一套系统 宠物信息:宠物ID,宠物类别,宠物名字,宠物性别,宠物年龄,宠物入库日期 系统完成功能:实现对宠物信息的录入,修改,删除,查询. 二.解决方 ...

  8. 利用WMI检测电脑硬件信息,没办法显示cpu的信息

    但你要给某些系统或软件加密时,需要了解到服务器的硬件信息时,系统和软件会利用WMI检测硬件信息, 而有时我们会遇到检测不到CPU的型号信息,如图 此时的解决方法: 1.确定“服务”里启动了WMI 2. ...

  9. C# 利用Powershell获取网络相关信息

    利用Get-NetAdapter获取信息 Get-NetAdapter 参考链接:https://docs.microsoft.com/en-us/powershell/module/netadapt ...

随机推荐

  1. Python-12-MySQL & sqlalchemy ORM

    MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...

  2. ZH奶酪:自然语言处理工具LTP语言云调用方法

    前言 LTP语言云平台 不支持离线调用: 支持分词.词性标注.命名实体识别.依存句法分析.语义角色标注: 不支持自定义词表,但是你可以先用其他支持自定义分词的工具(例如中科院的NLPIR)把文本进行分 ...

  3. npoi批量导入实现及相关技巧

    批量导入功能对于大部分后台系统来说都是不可或缺的一部分,常见的场景-基础数据的录入(部门,用户),用批量导入方便快捷.最近项目需要用到批量导入,决定花点时间写套比较通用的Excel导入功能.经过考虑, ...

  4. Editplus常用快捷键

    EditPlus 快捷键的使用 如果一个来你们公司面试程序员,连Ctrl + C 和Ctrl + V 都不用,而是使用“选中文本”→ 鼠标右键 → [复制],然后再鼠标右键→ [粘贴].你会不会录用他 ...

  5. angularjs + fis +modJS 对于支持amd规范的组建处理(PhotoSwipe 支持,百度webUpload支持)

    这不是很好的处理方式,但是能够解决问题,希望有大神推荐更好的方式. 前端模块使用angularjs + fis +modJS 开发前端应用有两个月了.总结了以下的优点: fis 自动构建,自动发布,功 ...

  6. docfx开源啦

    废话不多说了,直接上地址: 源代码: https://github.com/dotnet/docfx 文档: http://dotnet.github.io/docfx/ clone git clon ...

  7. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  8. iOS真机调试引入第三方库(如友盟等)编译时候,出现错误提示

    用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: MARK:解决方法:在building Setting 中设置bitCode ...

  9. ajax 多个表单值问题,表单序列化加其它表单值

    $.ajax({ type: "post", url: "{:u('cart/totalByCard')}?t="+Math.random(9999), dat ...

  10. 【UOJ#67】新年的毒瘤 Tarjan 割点

    #67. 新年的毒瘤 UOJ直接黏贴会炸...    还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...