免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
学习网络安全的过程中,绕不开fofa搜索,我的需求是使用fofa获取互联网所有某OA特定版本的网站,但是搜索了许多人的博客,解决方案都很杂乱,一会base64编码出错,一会接口定义不一致,fofa返回的信息不知道如何处理,加上调试这个事用了我两个小时的时间,于是自己写了一个API类可以很方便调用fofa API。
这个类也参考了一个开源项目,pyfofa,但是这个项目已经无人维护了,连fofa的API地址都没改,所以我自己把核心代码提取出来,成了这个。
类定义如下:
import base64import requestsclass FofaAPI(object):def __init__(self, email, key):self.email = emailself.key = keyself.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_msgdef 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()
例子如下