利用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()
STRIVE FOR PROGRESS,NOT FOR PERFECTION