109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
# coding:utf-8
|
||
from __future__ import print_function
|
||
import requests
|
||
import configparser
|
||
from base64 import b64encode
|
||
import base64
|
||
|
||
import sys
|
||
|
||
from lib.core.log import loglogo,logcritical
|
||
|
||
if sys.version.split()[0].split(".")[0] == 2:
|
||
reload(sys)
|
||
sys.setdefaultencoding("utf-8")
|
||
|
||
def get_ukey(cfg_path):
|
||
cp = configparser.ConfigParser()
|
||
cp.read(cfg_path)
|
||
return [cp["Fofa"]["user"],cp["Fofa"]["key"]]
|
||
|
||
def fofa_login(user,key):
|
||
_login = False
|
||
try:
|
||
# print "https://fofa.so/api/v1/info/my?email={user}&key={key}".format(user = user,key = key)
|
||
req = requests.get("https://fofa.info/api/v1/info/my?email={user}&key={key}".format(user = user,key = key))
|
||
if req and req.status_code == 200 and "username" in req.json():
|
||
_login = True
|
||
else:
|
||
while _login == False:
|
||
err_msg = "登陆失败,请重新确认并在下方输入user和key"
|
||
logcritical(err_msg)
|
||
if sys.version.split()[0].split(".")[0] == 2:
|
||
user = raw_input("Fofa 账号:")
|
||
key = raw_input("Fofa key:")
|
||
else:
|
||
user = input("Fofa 账号:")
|
||
key = input("Fofa key:")
|
||
# print user,key
|
||
_login = fofa_login(user,key)[0]
|
||
except KeyboardInterrupt:
|
||
exit("\nUser exit")
|
||
return [True,user,key]
|
||
|
||
def ukey_save(user,key,save_path):
|
||
cp = configparser.ConfigParser()
|
||
cp.add_section("Fofa")
|
||
cp["Fofa"]["user"] = user
|
||
cp["Fofa"]["key"] = key
|
||
cp.write(open(save_path,"w"))
|
||
|
||
def fofa_search(user,key,dork,save_path):
|
||
# print "in search"
|
||
search_result = list()
|
||
url_list = list()
|
||
resource = 'protocol,ip,port'
|
||
page = 100
|
||
# dork = str(base64.b64decode(dork),encoding = "utf-8")
|
||
for i in range(1,page+1):
|
||
url = "https://fofa.info/api/v1/search/all?email={user}&key={key}&qbase64={dork}&fields={resource}&page={page}".format(
|
||
user=user, key=key, dork=b64encode(dork.encode()).decode(), resource=resource, page=i)
|
||
req = requests.get(url,timeout=80)
|
||
# 返回结果为空
|
||
if "\"results\":[],\"size\":0" in req.text:
|
||
err_msg = "\033[31m"
|
||
err_msg += "搜索语句{dork}无任何返回结果\n请前往fofa web端测试搜索语句的有效性"
|
||
err_msg += "\033[0m"
|
||
exit(err_msg.format(dork=dork,))
|
||
# break
|
||
# 语法错误
|
||
elif "\"errmsg\":\"query statement error\",\"error\":true" in req.text:
|
||
print("[PLUGIN] Fofa:{}".format(req.text))
|
||
err_msg = "\033[31m"
|
||
err_msg += "搜索语句{dork}疑似存在语法错误\n请前往fofa web端测试搜索语句的有效性"
|
||
err_msg += "\033[0m"
|
||
exit(err_msg.format(dork=dork,))
|
||
elif "\"results\":[]," in req.text:
|
||
err_msg = "\n\033[35m"
|
||
err_msg += "已无更多搜索结果\n开始保存文件"
|
||
err_msg += "\033[0m"
|
||
logcritical(err_msg)
|
||
break
|
||
# 正常情况下
|
||
elif req and req.status_code == 200 and "results" in req.json():
|
||
content = req.json()
|
||
# print len(content['results'])
|
||
for match in content['results']:
|
||
search_result.append(match)
|
||
loglogo("第{page}页获取成功".format(page = i))
|
||
else:
|
||
print("[PLUGIN] Fofa:{}".format(req.text))
|
||
continue
|
||
|
||
for i in search_result:
|
||
if i[0] != "":
|
||
url = i[0]+"://"+i[1]+":"+i[2]
|
||
elif "443" in i[2]:
|
||
url = "https://" + i[1] + ":" + i[2]
|
||
else:
|
||
url = "http://" + i[1] + ":" + i[2]
|
||
url_list.append(url)
|
||
# print len(url_list)
|
||
url_list = set(url_list)
|
||
# print len(url_list)
|
||
with open(save_path,"w") as f:
|
||
for i in url_list:
|
||
f.write(i+"\n")
|
||
return len(url_list)
|
||
|