利用Python 第三方模块Shodan实现信息收集

  本代码主要运用到了Python shodan第三方模块,使用该模块需要先在shodan.io网站注册并得到相应的api key才能使用。

  本代码主要的麻烦的地方在于shodan模块返回的数据是一个庞杂的字典,很难理清头绪,即使运用一些json在线网站解析,提示数据里面有格式的问题,无法对数据进行解析。所以为了搞清楚该数据的结构,在调试的时候,可以先利用字典的keys()方法得到字典里有哪些键,然后选择所关心的键(Key)进行数据的提取。

 1 import shodan
 2 import optparse
 3 import requests
 4 import sys
 5 
 6 class ShodanSearch:
 7     def __init__(self) -> None:
 8         self.domain = self.get_params()
 9         # print(self.domain)
10         self.shodan_url = 'https://api.shodan.io/dns/resolve'
11         self.shodan_api ='XXXXXXXXXXXXXXXXXXXXXXXXXXXXx'
12 
13     def get_params(self):
14         parser = optparse.OptionParser("Usage: <Program> -d domain name")
15         parser.add_option('-d', '--domain', dest='domain', type='string', help='Specify domain name to search')
16         options, args = parser.parse_args()
17         if options.domain is None:
18             print(parser.usage)
19             sys.exit(0)
20         return options.domain
21     
22 
23     def get_ip(self):
24         try:
25             headers = {
26                 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0'
27             }
28             params = {
29                 'hostnames': self.domain,
30                 'key': self.shodan_api
31             }
32            
33             response = requests.get(url=self.shodan_url, params=params).json()
34             return response[self.domain]
35         except Exception as e:
36             print(e)
37             sys.exit()
38         
39     def host_info(self):
40         try:
41             api = shodan.Shodan(self.shodan_api)
42             res = api.host(self.get_ip())
43             print('\tInformation for target: %s\t' % self.domain)
44             print('\tCountry: %s\t' % res['country_name'])
45             print('\tCity: %s\t' % res['city'])
46             print('\tip address: %s\t' % res['ip_str'])
47             print('\tisp: %s\t' % res['isp'])
48             open_ports = ','.join(list(map(str,res['ports'])))    # 哈哈,res['ports']是一个列表,虽然也可以打印显示出来,我这里还是将其完全转换成字符串,然后列表里的数据类型是整数,因此需要进行转换,这里用到了map方法。      
49 
50             print("\tOpen ports: %s\t" % open_ports)
51             print('\tOperating system: %s\t' % str(res['os']))
52         except Exception as e:
53             print(e)
54             sys.exit()
55 
56 
57 if __name__ == "__main__":
58     shodanobj = ShodanSearch()
59     shodanobj.host_info()

 

posted @ 2022-05-28 10:12  Jason_huawen  阅读(260)  评论(0编辑  收藏  举报