FOFA
FOFA 是白帽汇推出的一款网络空间搜索引擎,它通过进行网络空间测绘,能够帮助研究人员或者企业迅速进行网络 资产匹配,例如进行漏洞影响范围分析、应用分布统计、应用流行度排名统计等。
https://fofa.info/ domain="hetianlab.com"
底下附带一个做python作业的爬虫代码,但用多了cookie会被ban....T-T
环境:
Request库:Requests库是一个简单而强大的第三方库,它提供了简洁的API,同时支持HTTP和HTTPS请求的发送。可以自动处理cookies和会话,使得在处理Web服务器时更加方便和安全。Requests库的使用方式与urllib库类似,但更加简单和灵活。
Lxml库:lxml是XML和HTML的解析器,其主要功能是解析和提取XML和HTML中的数据;lxml和正则一样,也是用C语言实现的,是一款高性能的python HTML、XML解析器,也可以利用XPath语法,来定位特定的元素及节点信息。
tqdm库:用于构造直观的运行进度条。
Xlwt库:用于将数据放入excel表格中,便于处理整合
import requests import base64 from lxml import etree import time import concurrent.futures from tqdm import tqdm import xlwt # FOFA 搜索结果页面地址模板 fofaurl = 'https://fofa.info/result?qbase64=' # 搜索关键字 keyword = '"glassfish" && port="4848" && country="CN"' # FOFA目前未登录用户只能查询一页信息(10个),为避免此情况需要cookie作为登陆身份认证信息 headers = { 'cookie': 'refresh_token=1;' 'fofa_token=eyJhbGciOiJIUzUxMiIsImtpZCI6Ik5XWTVZakF4TVRkalltSTJNRFZsWXpRM05EWXdaakF3TURVMlkyWTNZemd3TUdRd1pUTmpZUT09IiwidHlwIjoiSldUIn0.eyJpZCI6MzUxNTA0LCJtaWQiOjEwMDIwMTUyNiwidXNlcm5hbWUiOiLot6_ov4fnmoTljaHovablj7jmnLoiLCJleHAiOjE2OTU4OTkxNjR9.mWdk3izctQkSHQBwU8gySpydLBTgVBrNz2HqLioQ3BcLROj1rrS3dnspVxv3fheHQ5oGh-4vrsquf6MLGeGLug;;' } # 搜索结果页数 pg = 5 def excel(): f = open('ip.txt', 'r', encoding='utf-8') # 打开数据文本文档,注意编码格式的影响 wb = xlwt.Workbook(encoding='utf-8') # 新建一个excel文件 ws1 = wb.add_sheet('ip') # 添加一个新表,名字为ip ws1.write(0,0,'url') row = 1#行 col = 0#列 for lines in f: a = lines ws1.write(row, col, a) # 向Excel文件中写入每一项 row += 1 wb.save("数据表.xls")#保存 def fofa_search(search_data: str, page: int): # 使用 with 语句创建一个最大可并发数为 5 的线程池 with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: ip_set = set() # 创建一个进度条对象 pbar = tqdm(total=page, desc="正在爬取:", unit="页") for yeshu in range(1, page + 1): urls = fofaurl + base64.b64encode(search_data.encode('utf-8')).decode('utf-8') urls += f"&page={yeshu}&page_size=10" # 提交任务到线程池中并更新 IP 集合 future = executor.submit(search, urls, headers) ip_set.update(future.result()) # 更新进度条 pbar.update(1) pbar.close() # 将所有 IP 写入文件 def search( url: str, headers: dict) -> set: # 加密搜索关键字 ipdata_list = [] result = requests.get(url, headers=headers).content soup = etree.HTML(result) # 提取页面中的 IP 地址(查找元素中具备@class=“....”/在a目录下/@href性质的信息) ipdata = soup.xpath('//span[@class="hsxa-host"]/a/@href') ipdata_list.extend(ipdata) with open('ip.txt', 'a+') as f: for ip in ipdata_list: f.write(ip + "\n") return ipdata_list a1 = 0 a2 = 0 a3 = 0 a4 = 0 print('"————————欢迎使用fofa爬取工具————————"') print('"————————+请根据提示进行操作+————————"') print("请输入要查找的域名关键词(无需查找输入0,默认输入1):\n") a1 = input(a1) print("请输入要寻找的端口(无需查找输入0,默认输入1):\n") a2 = input(a2) print("请输入国家(中国CN,美国US,日本JP,无需限制输入0,默认输入1):\n") a3 = input(a3) print("若用户切换主机操作,请重新输入cookie(默认输入1):\n") a4 = input(a4) if (a1 != '0') and (a1 != '1'): keyword = keyword.replace('glassfish',a1) elif a1 == '0': keyword = keyword.replace('"glassfish" &&','') if (a2 != '0') and (a2 != '1'): keyword = keyword.replace('4848',a2) elif a2 == '0': keyword = keyword.replace('port="4848" &&','') if (a3 != '0') and (a3 != '1'): keyword = keyword.replace('CN',a3) elif a3 == '0': keyword = keyword.replace('country="CN"','') if (a4 != '0') and (a4 != '1'): start_time = time.time() fofa_search(keyword,pg) # 计算爬取耗时,并打印爬取结果 times = time.time() - start_time with open('ip.txt') as f: num_lines = len(f.readlines()) print(f"爬取结束,'ip.txt' 文件中共写入 {num_lines} 个 IP,耗时:{times:.2f} 秒。") if __name__ == "__main__": excel() print("表格已构建完成") print(keyword)