前言
上一篇我们讲述了目前较为主流的几款网络探测系统,简单介绍了页面的使用方法。
链接如下,点击跳转:网络空间测绘引擎集合:Zoomeye、fofa、360、shodan、censys、鹰图
然而当我们需要针对单个引擎进行二次开发时,页面就不能满足我们的需求了,这就需要参考API文档进行简单的数据处理,接下来,给大家介绍一下Python调用fofa的api接口并写入csv文件中的方法。
一.功能目的
1.使用python调fofa的api接口,实现查询单个靶机(ip+port)的信息,并拿取返回数据。
2.将拿取的数据中的重要字段写到csv文档中。
二.功能调研
我们需要参考官方api文档:点击此处跳转至fofa官方api文档
根据浏览官方文档,我们可以提取到以下信息:
1.示例里面的总体请求是
https://fofa.info/api/v1/search/all?&key=your_key&qbase64=dGl0bGU9ImJpbmci
2.我们要用的url是
https://fofa.info/api/v1/search/all
3.qbase64是经过base64编码后的查询内容
原始查询条件:ip="186.101.10.30" && port="80" 加密后的查询条件:aXA9IjE4Ni4xMDEuMTAuMzAiICYmIHBvcnQ9IjgwIg==
4.key值要拿取到
注册登录后,点击主页的头像-点击个人中心,就可以复制key值
5.可以根据fields=ip,host,port来筛选返回的结果
了解到这些,我们便可以开始用python来完成这一请求了。
三.编写代码
1.引入库
代码如下(示例):
import urllib3
import base64
import requests
import csv
引入数据库说明:
base64 提供了 b64encode() 和 b64decode() 等方法,用于对数据进行 Base64 编码和解码。
urllib3 是 Python 的一个HTTP 客户端库,用于发送 HTTP 请求并处理响应。
requests 是 Python 的一个简洁、用户友好的 HTTP 库,用于发送 HTTP 请求并处理响应。
csv提供了 reader 和 writer 等类,用于读取和写入 CSV 文件
2.读取数据
代码如下(示例):
import urllib3
import base64
import requests
import csv
class GetResult:
def get_fofa_result(self):
"""开始发送 fofa 扫描请求"""
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
data = {
"key": "",
"qbase64": base64.b64encode('ip="186.101.10.30" && port="80"'.encode("UTF-8")),
"fields": 'ip,port,host,title,product,product_category',
}
req = requests.get(url='https://fofa.info/api/v1/search/all', verify=True, params=data, timeout=10)
if req.status_code != 200:
print('fofa 请求失败,请检查配置')
return False
data = req.json()
if data.get("error", True) is not False:
print('fofa 请求失败,请检查配置')
return False
print(data)
return True
INS = GetResult()
INS.get_fofa_result()
利用requests.get(url=url,params=data)的结构来发送请求
结果展示:
3.写入csv文件中
上面讲述的是我们通过简单处理把数据拿到,后面我将把数据放到csv里面进行统计
import urllib3
import base64
import requests
import csv
class GetResult:
def get_fofa_result(self):
"""开始发送 fofa 扫描请求"""
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
data = {
"key": "",
"qbase64": base64.b64encode('ip="186.101.10.30" && port="80"'.encode("UTF-8")),
"fields": 'ip,port,host,title,product,product_category',
}
req = requests.get(url='https://fofa.info/api/v1/search/all', verify=True, params=data, timeout=10)
if req.status_code != 200:
print('fofa 请求失败,请检查配置')
return False
data = req.json()
if data.get("error", True) is not False:
print('fofa 请求失败,请检查配置')
return False
print(data)
# 将结果存储到 CSV 文件
with open("fofa_results.csv", "w", newline="", encoding="utf-8") as csvfile:
fieldnames = ["ip", "port", "host", "title", "product", "product_category"]
writer = csv.writer(csvfile)
writer.writerow(fieldnames) # 写入标题行
# 循环写入结果
for result in data['results']:
writer.writerow(result)
print("FOFA 搜索结果已保存到 fofa_results.csv 文件中。")
return True
INS = GetResult()
INS.get_fofa_result()
结果展示:
总结
本文主要讲了使用python调fofa的api接口,实现查询单个靶机(ip+port)的信息,拿取返回数据,并将数据中的重要字段写到csv文档中的功能,后续会持续补充,欢迎关注!