免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
学习网络安全的过程中,绕不开fofa搜索,我的需求是使用fofa获取互联网所有某OA特定版本的网站,但是搜索了许多人的博客,解决方案都很杂乱,一会base64编码出错,一会接口定义不一致,fofa返回的信息不知道如何处理,加上调试这个事用了我两个小时的时间,于是自己写了一个API类可以很方便调用fofa API。
这个类也参考了一个开源项目,pyfofa,但是这个项目已经无人维护了,连fofa的API地址都没改,所以我自己把核心代码提取出来,成了这个。
类定义如下:
import base64
import requests
class FofaAPI(object):
def __init__(self, email, key):
self.email = email
self.key = key
self.base_url = 'https://fofa.info'
self.search_api_url = '/api/v1/search/all'
self.login_api_url = '/api/v1/info/my'
self.get_userinfo()
def get_userinfo(self):
try:
url = '{url}{api}'.format(url=self.base_url, api=self.login_api_url)
data = {"email": self.email, 'key': self.key}
req = requests.get(url, params=data)
return req.json()
except requests.exceptions.ConnectionError:
error_msg = {"error": True, "errmsg": "Connect error"}
return error_msg
def get_data(self, query_str='', size=1000, page=1, fields='protocol,host,ip,port,title'):
try:
url = '{url}{api}'.format(url=self.base_url, api=self.search_api_url)
query_str = bytes(query_str, 'utf-8')
data = {'qbase64': base64.b64encode(query_str), 'email': self.email, 'key': self.key, 'page': page,
'size': size,
'fields': fields}
req = requests.get(url, params=data, timeout=10)
return req.json()
except requests.exceptions.ConnectionError:
error_msg = {"error": True, "errmsg": "Connect error"}
return error_msg
使用示例:
fofa = FofaAPI(email, api_key) # 这里的email和apikey都要自己在fofa网站中找到。
query = u"title=\"OA\"" # 这里只是一个示例,要自己改成需要查询的语句,u代表utf-8编码
response = fofa.get_data(query_str=query)
response就是fofa返回的值,其中results字段就是所有网站的信息。例子如下:
如果需要自定义返回的结果,可以直接使用fields这个参数,fields就是results中的内容,其中的顺序按照fields里面的字段排列,其他可以定义的参数见FofaAPI类源代码(也可以自己根据这个类自定义功能)。比如:
r = fofa.get_data(query_str=query, fields="ip,host,port,title")
在使用之前,建议调用这句话,看看用户信息对不对。
u=fofa.get_userinfo()
例子如下