用途:个人学习笔记,有所借鉴,欢迎指正!
目标:
利用Python脚本调用漏洞扫描工具API批量扫描目标url,发现漏洞后有所通知,解放双手。
一、漏洞扫描-API调用-Xray
参考:快速开始 - xray Documentation
应用案例:可通过自动化扫描后将实时结果进行微信推送,也可以应用在其他安全工具上。
使用示例:xray webscan --url http://x.x.x.x --webhook-output http://127.0.0.1:5000/webhook
基本步骤:
1、命令漏扫触发本地URL
2、Flask启动进行监听处理
3、借助Server酱API推送微信
from flask import Flask, request
import requests
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def xray_webhook():
url = 'https://sctapi.ftqq.com/SCT75428T2Fd9hkLOmLXk53uWeFtl17TD.send?title=Xray find vuln!!!'
try:
#接受传递过来的数据转换json格式
vuln=request.json
content = """## xray 发现了新漏洞
url: {url}
插件: {plugin}
漏洞类型: {vuln_class}
请及时查看和处理
""".format(url=vuln['data']['target']['url'], plugin=vuln['data']['plugin'],vuln_class=vuln['type'])
print(content)
data={
'desp':content
}
print(data)
requests.post(url,data=data)
return 'ok'
except Exception as e:
pass
if __name__ == '__main__':
app.run()
二、Python-红队项目-Awvs调用自动添加
漏扫API调用-AWVS
Awvs漏洞扫描工具:https://www.ddosi.org/awvs-5/
API使用参考:AWVS13批量脚本_%targets:website,=%-优快云博客
应用案例:可通过脚本调用AWVS自动添加扫描也可以应用在其他安全工具上。
基本步骤:
1、启动工具&开启API-KEY
2、创建新任务并记录任务ID
3、启动新任务并记录返回ID
三、Python-红队项目-SQLMAP API调用脚本自动添加扫描
漏扫API调用-SQLMAP
参考:https:/www.freebuf.com/articles/web/204875.html
应用案例:前期通过信息收集拿到大量的URL地址,这个时候可以配合SqlmapAPl接口进
行批量的注入检测。
开发当前项目过程:(利用sqlmapAPI接口实现批量URL注入安全检测)
from flask import Flask, request
import requests,time,json
#启用sqlmap-API服务 python sqlmapapi.py -s
#Sqlmap API接口使用:
# 1.创建新任务记录任务ID @get("/task/new")
# 2.设置任务ID扫描信息 @post("/option/<taskid>/set")
# 3.开始扫描对应ID任务 @post("/scan/<taskid>/start")
# 4.读取扫描状态判断结果 @get("/scan/<taskid>/status")
# 5.如果结束删除ID并获取结果 @get("/task/<taskid>/delete")
# 6.扫描结果查看 @get("/scan/<taskid>/data")
def new_id():
headers = {
'Content-Type': 'application/json'
}
url='http://127.0.0.1:8775'+'/task/new'
resp=requests.get(url,headers=headers).json()
taskid=resp['taskid']
if resp['success'] is True:
print('->1、创建任务ID成功,ID:' + taskid)
return taskid
def set_id(id,scanurl):
headers = {
'Content-Type': 'application/json'
}
data={
'url':scanurl
}
url = 'http://127.0.0.1:8775/option/%s/set' % id
resp = requests.post(url, data=json.dumps(data),headers=headers).json()
if resp['success'] is True:
print('->2、设置任务ID成功,ID:' + taskid)
print('->2、设置任务URL成功,URL:' + scanurl)
return taskid
def scan_id(id,scanurl):
headers = {
'Content-Type': 'application/json'
}
data = {
'url': scanurl
}
url = 'http://127.0.0.1:8775/scan/%s/start' % id
resp = requests.post(url, data=json.dumps(data), headers=headers).json()
if resp['success'] is True:
print('->3、启动扫描任务ID成功,ID:%s'%id)
print('->3、启动任务URL成功,URL:%s'%scanurl)
def status_id(id):
url = 'http://127.0.0.1:8775/scan/%s/status'%id
print('->4、扫描任务进行中,请等待结束,ID:%s' %id)
while 1:
resp = requests.get(url).text
if 'running' in resp:
#print(resp)
continue
else:
print('->4、扫描任务ID已完成,ID:%s' %id)
break
def data_id(id,scanurl):
url = 'http://127.0.0.1:8775/scan/%s/data' % id
resp = requests.get(url)
#print(resp.json()['data'][0]['status'])
if resp.json()['data'][0]['status'] == 1:
print('>>>>>>>>>>>>>>>>>>>>>>>>>')
print('存在注入:'+'\n'+scanurl)
print('>>>>>>>>>>>>>>>>>>>>>>>>>')
wx = 'https://sctapi.ftqq.com/SCT75428T2Fd9hkLOmLXk53uWeFtl17TD.send?title=SQLMAP find vuln!!!'
sql_title=resp.json()['data'][1]['value'][0]['data']['5']['title']
sql_payload=resp.json()['data'][1]['value'][0]['data']['5']['payload']
sql_dbms = resp.json()['data'][1]['value'][0]['dbms'][0]
try:
content = """## sqlmap 发现了新漏洞
url: {url}
漏洞标题: {title}
漏洞Payload: {Payload}
漏洞数据库类型:{dbms}
请及时查看和处理
""".format(url=scanurl, title=sql_title, Payload=sql_payload,dbms=sql_dbms)
#print(content)
data = {
'desp': content
}
print(data)
requests.post(wx, data=data)
return 'ok'
except Exception as e:
pass
# with open('result.txt', 'a+') as f:
# f.write(resp.text)
# f.write('\n' + '===========python sqlmapapi by xiaodisec=============' + '\n')
# f.write('-?----------------------------------------------------' + '\n')
# f.close()
print('->5、注入任务ID已完成,请查看结果:result.txt')
def delete_id(id):
url = 'http://127.0.0.1:8775/task/%s/delete' % id
resp = requests.get(url).json()
if resp['success'] is True:
print('->6、删除任务ID:%s成功' % id)
time.sleep(3)
if __name__ == '__main__':
for url in open('url.txt'):
taskid = new_id()
set_id(taskid,url.replace('\n',''))
scan_id(taskid,url.replace('\n',''))
status_id(taskid)
data_id(taskid,url.replace('\n',''))
delete_id(taskid)
print('---------------------------------')