目录
案例一:Python-红队项目-Xray调用推送微信
案例二:Python-红队项目-Awvs 调用自动添加
案例三: Python-红队项目-SQLMAP 调用自动添加
案例一:Python-红队项目-Xray调用推送微信
首先本地测试调用api发送信息给微信
api网站地址:(可以免费使用7天啊!)Server酱·Turbo版 | 一个请求通过API将消息推送到个人微信、企业微信、手机客户端和钉钉群、飞书群
api调用方式,直接访问就可以,desp后面跟的是你要发送的数据,最好以post方式请求,get数据会比较少,xxx替换为你的key
https://sctapi.ftqq.com/xxxx.send?title=messagetitle&desp=messagecontent
这里我直接尝试访问,查看输出结果
利用python请求
import requestsurl = "https://sctapi.ftqq.com/xxx.send?title= test!!!"content="""ip = "127.0.0.1",whoami = "admin",work = "say hello"
"""
data={'desp':content
}
print(data)
requests.post(url,data=data)
在本地搭建一个Flask模块搭建起来的微型网站,其中里面的request对象有很多用法
在Flask中,
request
对象是一个非常重要的全局对象,它封装了客户端发送给服务器的HTTP请求信息。通过request
对象,你可以访问请求中的数据,比如查询字符串(query string)、表单数据(form data)、JSON数据、文件上传、头部信息(headers)、cookies等。
下面这个案例中搭建了一个微型的flask网站,当GET访问/x时就会触发test方法,接收请求中的headers信息
from flask import Flask,requestapp = Flask(__name__)@app.route('/x',methods=["GET"])
def test():x = request.headersprint(x)if __name__ == "__main__":app.run()
xray -webhook-output参数介绍
在Xray中,使用
--webhook-output
参数来指定Webhook的URL地址。例如:xray webscan --url http://example.com --webhook-output http://your-webhook-server.com/webhook
这个命令会启动Xray的web扫描模式,对指定的URL进行扫描,并将扫描结果发送到
http://your-webhook-server.com/webhook
这个地址。Xray发送到Webhook的响应格式是JSON,包含了扫描结果的详细信息。响应的JSON结构大致如下:
{"type": "xxx","data": {} }
利用这个参数把前面两个案例进行结合,把扫描出来的数据发送给自己搭建的建议网站,然后调用api接口,发送给微信
整合代码
from flask import Flask,request
import requestsapp = Flask(__name__)@app.route('/webhook',methods=["POST"])
def test():try:x = request.json#print(x['data']['target']['url'])url = "https://sctapi.ftqq.com/SCT257938Tua9PZKvryRYtsKHbNfgWacLg.send?title= vuln"content="""url : {url}插件: {plugin}vlun类型: {type}""".format(url=x['data']['target']['url'],plugin=x['data']['plugin'],type=x['type'])data={'desp':content}print(data)requests.post(url,data=data)except Exception as e:passif __name__ == "__main__":app.run()
把xray返回过来的这三段数据发送给wx
程序启动后,xray扫描漏洞网页
xray_windows_amd64.exe webscan --url http://testphp.vulnweb.com/artists.php?artist=1 --webhook-output http://127.0.0.1:5000/webhook
收到消息了
查看结果
每一条都会发送结果
案例二:Python-红队项目-Awvs 调用自动添加
参考文章:AWVS13批量脚本_awvs自定义脚本-CSDN博客
获取awvs的api-key
# 发送代码如下
api_add_url = "https://x/api/v1/targets"
headers = {'X-Auth': 'x','Content-type': 'application/json'
}data = '{"address":"http://vulnweb.com/","description":"create_by_reaper","criticality":"10"}'r = requests.post(url=api_add_url, headers=headers, data=data,verify=False).json()
print(r)
新增扫描任务
Method:POST
URL: /api/v1/targets
代码
import requests
# 发送代码如下
api_add_url = "https://x/api/v1/targets"
headers = {'X-Auth': 'x','Content-type': 'application/json'
}data = '{"address":"http://vulnweb.com/","description":"create_by_reaper","criticality":"10"}'r = requests.post(url=api_add_url, headers=headers, data=data,verify=False).json()
print(r)
尝试运行创建
添加成功
创建成功后会有一个target-id号,以此来判断创建是否成功,包括后续也需要用到这个id来进行启动
开启扫描
Method:POST
URL: /api/v1/scans
代码
import requests
id = xxxxxxxx
data = '{"profile_id":"11111111-1111-1111-1111-111111111111","schedule":{"disable":false,"start_date":null,"time_sensitive":false},"target_id":"%s"}'% id
api_run_url="https://192.168.172.130:3443/api/v1/scans"
headers = {'X-Auth': '1986ad8c0a5b3df4d7028d5f3c06e936c4d6110fabd7542828c3deca8e7fee4f9','Content-type': 'application/json'
}
r = requests.post(url=api_run_url, headers=headers, data=data, verify=False).json()
print(r)
创建失败的返回码
创建成功的返回码,同样可以根据id号来判断
成功开启扫描
把这两个脚本结合一下,写一个把url写进文件夹,一键创建任务并且启动
import requests
# 发送代码如下
def touch_work(key,url):api_add_url = "https://127.0.0.1:3443/api/v1/targets"headers = {'X-Auth': key,'Content-type': 'application/json'}data = '{"address":"%s","description":"create_by_reaper","criticality":"10"}'% urlr = requests.post(url=api_add_url, headers=headers, data=data,verify=False).json()id = r['target_id']if id is not False:print("任务创建成功,id号为: %s"%id)return id# 核心代码
def run_work(key,id):data = '{"profile_id":"11111111-1111-1111-1111-111111111111","schedule":{"disable":false,"start_date":null,"time_sensitive":false},"target_id":"%s"}'% idapi_run_url="https://127.0.0.1:3443/api/v1/scans"headers = {'X-Auth': key,'Content-type': 'application/json'}r = requests.post(url=api_run_url, headers=headers, data=data, verify=False).json()id = r["target_id"]if id is not False:print("启动扫描成功")if __name__ == "__main__":key = input("please input your api-key:")with open("url.txt","r") as urls:for url in urls:url = url.replace("\n","")print("扫描url:"+url)id = touch_work(key,url)run_work(key,id)print("==================================")
成功启动
案例三: Python-红队项目-SQLMAP 调用自动添加
参考文章:深入了解SQLMAP API - FreeBuf网络安全行业门户
sqlmap安装完成以后,同一个目录下会有sqlmapapi.py,可以利用这个文件调用sqlmap的api接口
sqlmap的api参数
# 0.启用sqlmap-API服务 python sqlmapapi.py -s
# 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")
python sqlmapapi.py -s 会启动一个本地端口,可以通过这个端口调用api
创建记录任务
设置扫描信息,数据必须使用json格式进行传输,因此需要利用json.dumps,将字典转化成为json格式,ua头中文本类型也必须是json格式
requests.post("http://127.0.0.1:8775/option/76a4c6fd0750fd10/set",data=json.dumps({'url':'http://testphp.vulnweb.com/artists.php?artist=1'}),headers={'Content-Type':'application/json'}).json()
如果返回true代表创建成功啊
开始扫描竟然也需要把目标url再次带入进去,我觉得有些繁琐,不应该通过id判断已经写入了嘛
requests.post("http://127.0.0.1:8775/scan/0b03a4d6d1560beb/start",data=json.dumps({'url':'http://testphp.vulnweb.com/artists.php?artist=1'}),headers={'Content-Type':'application/json'}).json()
返回true代表成功
读取扫描状态,这个读取结果,不用再次写入目标url,用过sqlmap的应该都知道sqlmap会有一段时间来反应
requests.get("http://127.0.0.1:8775/scan/b0717c18d0731951/status",headers={'Content-Type':'application/json'}).json()
如果状态时terminated证明成功了,如果是running就是还在跑
查看输出结果
requests.get("http://127.0.0.1:8775/scan/b0717c18d0731951/data",headers={'Content-Type':'application/json'}).json()
可以从中取出自己想要的数据,然后通过server酱酱把数据返回给微信
代码进行整合,优化
import requests,json
def create_task():header = {'Content-Type':'application/json'}r = requests.get("http://127.0.0.1:8775/task/new",headers=header).json()if r['success'] == True:return r['taskid']def set_task(id,scanurl):url = "http://127.0.0.1:8775/option/%s/set"%idheaders = {'Content-type': 'application/json'}data= {'url':scanurl}r = requests.post(url,data=json.dumps(data),headers=headers).json()if r['success'] == True:print("设置扫描信息完成,id为:"+id)def start_task(id,scanurl):url="http://127.0.0.1:8775/scan/%s/start"%idheaders = {'Content-type': 'application/json'}data= {'url':scanurl}r = requests.post(url,data=json.dumps(data),headers=headers).json()if r['success'] == True:print("开始扫描任务,id为:"+id)def status_task(id):url="http://127.0.0.1:8775/scan/%s/status"%idheaders = {'Content-type': 'application/json'}print("扫描还在进行中")while True:r = requests.get(url,headers=headers).json()if r['status'] == 'running':passif r['status'] == 'terminated':print("扫描已经结束,id为"+id)breakdef cat_data(id,scanurl):url="http://127.0.0.1:8775/scan/%s/data"%idheaders = {'Content-type': 'application/json'}r = requests.get(url,headers=headers).json()if r['data'][0]['status'] == 1:print("存在sql注入漏洞")for key in range(1,6):key = str(key)try:print("sql注入类型为:"+r['data'][1]['value'][0]['data'][key]['title'])print("sql注入payload为:"+r['data'][1]['value'][0]['data'][key]['payload'])print("\n")url1 = "https://sctapi.ftqq.com/SCT257938Tua9PZKvryRYtsKHbNfgWacLg.send?title= There is an SQL injection vulnerability!!!"content="""url : {url1}sql注入漏洞类型: {type}sql注入漏洞payload: {payload}""".format(url1=scanurl,type=r['data'][1]['value'][0]['data'][key]['title'],payload=r['data'][1]['value'][0]['data'][key]['payload'])data={'desp':content}requests.post(url1,data=data)except Exception as e:passprint("=================================python sqlmapapi by xiaodisec======================================")
if __name__ == "__main__":#print(id)#scanurl = "http://testasp.vulnweb.com/showthread.asp?id=0"with open("url.txt","r") as urls:for url in urls:scanurl = url.replace("\n","")print("正在扫描的url是:"+url)id = create_task()scanurl = scanurl.replace("\n","")set_task(id,scanurl)start_task(id,scanurl)status_task(id)cat_data(id,scanurl)
运行结果,这里我从结果里面设置了循环,因为同一个sql注入漏洞中可能,不同种类的sql注入类型都能够适用,需要都进行打印
并且设置了微信推送
感觉还是可以进行优化,可以把同一个url注入的信息同一次发送