从ZoomEye API 到 Weblogic 弱口令扫描
参考资料:
ZoomEye API: https://www.zoomeye.org/api/doc
Weblogic-Weakpassword-Scnner: https://github.com/dc3l1ne/Weblogic-Weakpassword-Scnner
Python 调用 ZoomEye API 批量获取目标网站IP: http://www.cnblogs.com/anka9080/p/ZoomEyeAPI.html
本文参考以上资料,经过部分修改,以便于自己使用,现将其分享出来。为了表示对原作者敬意,特将其工作列在文首。
本文涉及两方面的工作,从ZoomEye API获取到想要的IP列表,再用Weblogic 弱口令扫描器对得到的地址进行扫描。
Github传送: ZoomEye
一、从ZoomEye API获取IP地址列表
"首先要说明的是,使用ZoomEye API需要先注册账号,使用方法是先提交账户,密码获得一个唯一的访问令牌(access_token)" "然后每次调用 API 的时候在 HTTP 的 Headers 里加上格式化后的 access_token 就可以使用了"
使用python脚本从ZoomEye API 获取到的IP地址数量是有限的,但由于其数量巨大,我们可以得到的便利也是巨大的。且ZoomEye 的爬虫是一直在运行的,搜索得到的结果也是变动的,因此我们可以多注册几个账号...
下面是从ZoomEye API 获取IP地址的Demo
# coding: utf-8
# author : evilclay
# datetime: 20160330
# http://www.cnblogs.com/anka9080/p/ZoomEyeAPI.html
# Modified by : starnight_cyber@foxmail.com
# Time : 2016.12.1 import os
import requests
import json
import time access_token = ''
ip_list = [] def login():
"""
输入用户名密码 进行登录操作
:return: 访问口令 access_token
"""
user = raw_input('[-] input : username :')
passwd = raw_input('[-] input : password :')
data = {
'username': user,
'password': passwd
} # dumps 将 python 对象转换成 json 字符串
data_encoded = json.dumps(data)
try:
r = requests.post(url='https://api.zoomeye.org/user/login', data=data_encoded)
# loads() 将 json 字符串转换成 python 对象
r_decoded = json.loads(r.text)
global access_token # 获取到账户的access_token
access_token = r_decoded['access_token']
except Exception, e:
print '[-] info : username or password is wrong, please try again '
exit() def saveStrToFile(file, str):
"""
将access_token写如文件中
:return:
"""
with open(file, 'w') as output:
output.write(str) def saveListToFiles(ip_list):
'''
:param ip_list: 使用ZoomEye接口获得的ip列表
: 会写入到多个文件,保存格式不同,仅ip和 http://ip/console/login/LoginForm.jsp
: 如http://162.105.205.162/console/login/LoginForm.jsp
:return:
''' # 以当前运行脚本的时间创建文件,这样就可以保证脚本运行时创建的文件不会重名
xtime = time.strftime("%Y-%m-%d[%H.%M.%S]")
ip_list_file = open(xtime + 'ip.txt', 'w')
url_list_file = open(xtime + 'url.txt', 'w') # 将list以一定格式写入到文件中
for line in ip_list:
# ip格式
ip_list_file.write(line + '\n') # weblogic 后台登录地址格式
url_list_file.write('http://' + line + '/console/login/LoginForm.jsp' + '\n') # 关闭文件
ip_list_file.close()
url_list_file.close() def apiTest():
"""
进行 api 使用测试
:return:
"""
page = 1 # 表示第几页
num = 1 # 页数
index = 1 # 循环下标
global access_token
with open('access_token.txt', 'r') as input:
access_token = input.read()
# 将 token 格式化并添加到 HTTP Header 中
headers = {
'Authorization': 'JWT ' + access_token,
} # 要搜索的字符串
# query = 'port:80 weblogic country:China'
query = raw_input('[*] please input search string : ') # 设置获取结果的起始页面,对于量比较大的时候比较有用
page = int(raw_input('[*] please input start page : ')) # 设置获取的结果页数
num = int(raw_input('[*] please input number of pages you want to retrieve : ')) while (True):
try:
# 将查询字符串和页数结合在一起构造URL
searchurl = 'https://api.zoomeye.org/host/search?query=' + query + '&page=' + str(page)
r = requests.get(url=searchurl, headers=headers)
print searchurl
r_decoded = json.loads(r.text)
# print r_decoded
# print r_decoded['total']
for x in r_decoded['matches']:
print x['ip']
ip_list.append(x['ip'])
print '[-] info : count ' + str(index * 10) except Exception, e:
# 若搜索请求超过 API 允许的最大条目限制 或者 全部搜索结束,则终止请求
if str(e.message) == 'matches':
print '[-] info : account was break, excceeding the max limitations'
break
else:
print '[-] info : ' + str(e.message)
else:
# 判断页数
if index == num:
break
page += 1 # 用于获取下一页的结果
index += 1
# 输出提示
print 'page : ' + str(page) + ' - ' + 'index : ' + str(index) def main():
# 访问口令文件不存在则进行登录操作
if not os.path.isfile('access_token.txt'):
print '[-] info : access_token file is not exist, please login'
login()
# 保存access_token到文件中
saveStrToFile('access_token.txt', access_token) # 从ZoomEye API 获取IP地址列表
apiTest() # 将结果保存到文件中
saveListToFiles(ip_list) if __name__ == '__main__':
main()
运行:
运行结束后保存了以时间命名的文件
获取到的IP列表
Weblogic 后台登录地址形式:
这样,我们的第一步就完成了,得到了我们想要的IP地址列表。
二、使用Weblogic-Weakpassword-Scnner 扫描weblogic 后台弱口令
得到有效的weblogic后台登录地址:
将第一步得到的url格式的文件,重命名为url.txt, 运行Weblogic-Weakpassword-Scnner 中的spider.py 脚本, 清除无效的url,得到u.txt, 为有效的weblogic 后台登录地址,可以用来暴力破解。
python spider.py
暴力破解:
运行Weblogic-Weakpassword-Scnner 中的main.py 脚本, 进行暴力破解。
python main.py 100
命名为*.txt的文件中,保存了weblogic的后台登录地址,及用户和密码。
得到IP地址后,不仅仅是可以用来扫描Weblogic后台弱口令,接下来...
最后,附上Top5的弱口令:
weblogic
weblogic123
12345678
11111111
weblogic123456
三、ZoomEye Version 2
在处理上做了些小的修改,之前端口处理有点问题,现已修正...
# -*- coding: utf-8 -*-
# author : evilclay
# datetime: 20160330
# http://www.cnblogs.com/anka9080/p/ZoomEyeAPI.html
# Modified by : starnight_cyber@foxmail.com
# Time : 2016.12.8 import os
import requests
import json
import time access_token = ''
ip_list = []
ip_port_list = [] def login():
"""
输入用户名密码 进行登录操作
:return: 访问口令 access_token
"""
user = raw_input('[-] input : username :')
passwd = raw_input('[-] input : password :')
data = {
'username': user,
'password': passwd
} # dumps 将 python 对象转换成 json 字符串
data_encoded = json.dumps(data)
try:
r = requests.post(url='https://api.zoomeye.org/user/login', data=data_encoded)
# loads() 将 json 字符串转换成 python 对象
r_decoded = json.loads(r.text)
global access_token # 获取到账户的access_token
access_token = r_decoded['access_token']
except Exception, e:
print '[-] info : username or password is wrong, please try again '
exit() def saveStrToFile(file, str):
"""
将access_token写如文件中
:return:
"""
with open(file, 'w') as output:
output.write(str) def saveListToFiles(ip_list):
'''
:param ip_list: 使用ZoomEye接口获得的ip列表
: 会写入到多个文件,保存格式不同,仅ip和 http://ip/console/login/LoginForm.jsp
: 如http://162.105.205.162/console/login/LoginForm.jsp
:return:
''' # 以当前运行脚本的时间创建文件,这样就可以保证脚本运行时创建的文件不会重名
xtime = time.strftime("%Y-%m-%d[%H.%M.%S]")
ip_list_file = open(xtime + 'ip.txt', 'w')
ip_port_list_file = open(xtime + 'ip:port.txt', 'w') # 将ip以一定格式写入到文件中
for line in ip_list:
ip_list_file.write(line + '\n') # 将ip,port写入文件中
for line in ip_port_list:
ip_port_list_file.write(line + '\n') # 关闭文件
ip_list_file.close()
ip_port_list_file.close() def apiTest():
"""
进行 api 使用测试
:return:
"""
page = 1 # 表示第几页
num = 1 # 页数
index = 1 # 循环下标
global access_token
with open('access_token.txt', 'r') as input:
access_token = input.read()
# 将 token 格式化并添加到 HTTP Header 中
headers = {
'Authorization': 'JWT ' + access_token,
} # 要搜索的字符串
# query = 'port:80 weblogic country:China'
query = raw_input('[*] please input search string : ') # 设置获取结果的起始页面,对于量比较大的时候比较有用
page = int(raw_input('[*] please input start page : ')) # 设置获取的结果页数
num = int(raw_input('[*] please input number of pages you want to retrieve : ')) while (True):
try:
# 将查询字符串和页数结合在一起构造URL
searchurl = 'https://api.zoomeye.org/host/search?query=' + query + '&page=' + str(page)
r = requests.get(url=searchurl, headers=headers)
print searchurl
r_decoded = json.loads(r.text)
# print r_decoded
# print r_decoded['total']
for x in r_decoded['matches']:
print x['ip'], x['portinfo']['port']
ip_list.append(x['ip'])
ip_port_list.append(x['ip'] + ', ' + str(x['portinfo']['port']))
print '[-] info : count ' + str(index * 10) except Exception, e:
# 若搜索请求超过 API 允许的最大条目限制 或者 全部搜索结束,则终止请求
if str(e.message) == 'matches':
print '[-] info : account was break, excceeding the max limitations'
break
else:
print '[-] info : ' + str(e.message)
finally:
# 判断页数
if index == num:
break
page += 1 # 用于获取下一页的结果
index += 1
# 输出提示
print 'page : ' + str(page) + ' - ' + 'index : ' + str(index) def main():
# 访问口令文件不存在则进行登录操作
if not os.path.isfile('access_token.txt'):
print '[-] info : access_token file is not exist, please login'
login()
# 保存access_token到文件中
saveStrToFile('access_token.txt', access_token) # 从ZoomEye API 获取IP地址列表
apiTest() # 将结果保存到文件中
saveListToFiles(ip_list) if __name__ == '__main__':
main()
三、ZoomEye Version 3 [2018.1.8更新]
直接贴代码吧:
#!/usr/bin/python
# encoding: utf-8
import requests as req
import json
import optparse
import time
import sys
import os class ZoomEye: def __init__(self):
self.initParameter()
username = 'zl15@foxmail.com'
password = 'liu120808'
self.account = {'username': username,'password': password}
self.headers = {'Authorization': 'JWT ' + self.getToken()} def search(self):
self.isFIle(self.options.file)
queryType = self.options.type
queryStr = self.options.query
try:
result = req.get('https://api.zoomeye.org/'+ queryType + '/search?query=' + queryStr + '&page=1', \
headers=self.headers, timeout = 15)
except:
print "Error exit..."
sys.exit()
if result.status_code != 200:
print "error: ",
print result.content
print "exit..."
sys.exit()
resultDict = json.loads(result.content)
# print result.content #获取第一页的所有结果
pages = self.getPageNum(int(resultDict['total']))
print 'There are %d pages to fetch' % pages userAgent = {'user-agent': 'Mozilla/5.0(iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)AppleWebKit/\
531.21.10(KHTML, like Gecko)Mobile/7B405'}
self.headers['user-agent'] = userAgent start = time.time()
starPage = 0
for i in xrange(starPage, pages, 1):
targetList = []
try:
result = req.get('https://api.zoomeye.org/' + queryType +'/search?query='+ queryStr +'&page='+\
str(i+1), headers=self.headers, timeout=15)
# print "Get page " + str(i+1) + " info ..."
now = time.time()
print '[ %d / %d ] ==> time elapse %s s ...' % (i, pages, int(now - start))
except:
print "Page " + str(i) + " , Error exit..."
# sys.exit()
continue
if result.status_code != 200:
print "error: ",
print result.content
print "exit..."
sys.exit()
# print result.content #每页的结果
self.getFileContent(targetList, result.content)
self.writeTofile(self.options.file, targetList)
print "The result in " + self.options.file def getFileContent(self, targetList, result):
result = json.loads(result)
# print result
if self.options.type == 'web':
for eachResult in result['matches']:
# print eachResult
# 获取目标站点
targetList.append(eachResult['site'])
print targetList
return targetList
for eachResult in result['matches']:
# targetList.append(eachResult['ip'] + ':' + str(eachResult['portinfo']['port']))
ip_port = eachResult['ip'] + ':' + str(eachResult['portinfo']['port'])
print ip_port
targetList.append(ip_port)
return targetList def getPageNum(self, total):
if total == 0:
print "No result, exit.."
sys.exit()
page = total/10
if total%10 == 0:
return page
return page + 1 def getToken(self):
token = req.post('https://api.zoomeye.org/user/login',json.dumps(self.account)).content
print token
return json.loads(token)['access_token'] def writeTofile(self, filename, targetList):
with open(filename, 'a') as f:
for eachTarget in targetList:
f.write(eachTarget + "\n")
time.sleep(0.2) def isFIle(self,filename):
if not os.path.isfile(filename):
return
print 'result file is exists, continue ?',
choice = raw_input("(y/n): ")
if choice.lower() == 'n':
print 'Please rename filename, exit ...'
sys.exit()
if choice.lower() == 'y':
return
else:
return self.isFIle(filename) def initParameter(self):
usage = '''
_____ _____
|__ /___ ___ _ __ ___ | ____| _ ___
/ // _ \ / _ \| '_ ` _ \| _|| | | |/ _
/ /| (_) | (_) | | | | | | |__| |_| | __/
/____\___/ \___/|_| |_| |_|_____\__, |\___|
|___/
'''
parser = optparse.OptionParser(usage = usage)
parser.add_option("-t", "--type",
default='web',
help='''Search type like host ,web (e.g. "https://api.zoomeye.org/host/\
search?query=port:21")''') parser.add_option("-q", "--query",
help="What you search is your need") parser.add_option("-f", "--file",
help="The file will save result's IP or domain") (self.options, args) = parser.parse_args()
if self.options.query == None or self.options.file == None:
print parser.print_help()
print "Please Completed parameters, you can show -h to get help"
sys.exit()
else:
print usage if __name__ == '__main__':
ZE = ZoomEye()
try:
ZE.search()
except KeyboardInterrupt:
print "Ctrl + C exit..."
sys.exit()
从ZoomEye API 到 Weblogic 弱口令扫描的更多相关文章
- weblogic系列漏洞整理 -- 2. weblogic弱口令
目录 二. weblogic弱口令 0. 思路 1. python爆破脚本 2. 技巧 一.weblogic安装 http://www.cnblogs.com/0x4D75/p/8916428.htm ...
- 12.Weblogic 弱口令 && 后台getshell漏洞
利用docker环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏洞. 分别通过这两种漏洞,模拟对weblogic场景的渗透. Weblogic版本:10.3. ...
- weblogic弱口令+后台getshell
https://www.cnblogs.com/bmjoker/p/9822886.html利用docker环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏 ...
- [原创]K8Cscan插件之FTP弱口令扫描
[原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...
- X-SCAN扫描器插件(MYSQL弱口令以及Mongodb未授权)
因为在很多时候的内网扫描里面没有授权的WIN的好用的,稍微小点的弱口令扫描器(生成报告,多种服务),编译成了插件,再自己弄了个MONGODB的扫描插件用着. X-SCAN加载以后: MONGODB.p ...
- python实现FTP弱口令扫描器与简单端口扫描器
python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...
- 16.Tomcat弱口令 && 后台getshell漏洞
Tomcat7+ 弱口令 && 后台getshell漏洞 Tomcat版本:8.0 环境说明 Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下.其中, ...
- Linux服务器的弱口令检测及端口扫描
一.弱口令检测--John the Ripper John the Ripper工具可以帮助我们扫描出系统中密码安全性较低的用户,并将扫描后的结果显示出来. 1.安装John the Ripper: ...
- rtx信息泄漏利结合弱口令导致被批量社工思路
腾讯通RTX(Real Time eXchange)是腾讯公司推出的企业级实时通信平台. rtx server 存在暴露用户信息的漏洞,通过web访问 http://RtxServerIp:8012/ ...
随机推荐
- PHP上传文件限制的大小
修改PHP上传文件大小限制的方法 1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止 ...
- 【ABP】Abp的AspNetZero5.0版本无法使用ctrl+f5调式
原文:http://www.cnblogs.com/94pm/p/7942483.html AspNetZero是基于Abp框架开发的商业程序,最近从Abp交流群中得知5.0版本开始加入了防盗版的功能 ...
- BZOJ 1228 E&G(sg函数+找规律)
把一对石子堆看出一个子游戏.打出子游戏的sg表找规律.. 这个规律我是一定找不出来的... 对于i,j,如果 (i-1)%pow(2,k+1) < pow(2,k) (j-1)%pow(2,k+ ...
- Codeforces 786C Till I Collapse
题意: 给出一个长度为n的序列,每个数值在1-n之间且为整数,现在要把这个序列划分为若干段,使得每一段的颜色种数不超过k,求最少的区间数目.对于从1到n的n种k的取值,分别输出这时的最少区间数目. 分 ...
- C 类网络的子网快速划分
CIDR ( Classless Inter-Domain Routing ,无类域间路由选择) 进行子网划分的方法有很多,最适合你的方式就是正确的方式.在 C 类地址中,只有 8 位用于定义主机.注 ...
- HTTP摘要认证原理以及HttpClient4.3实现
基本认证便捷灵活,但极不安全.用户名和密码都是以明文形式传送的,也没有采取任何措施防止对报文的篡改.安全使用基本认证的唯一方式就是将其与 SSL 配合使用. 摘要认证是另一种HTTP认证协议,它试图修 ...
- 笔记-自己看Day20-待续
1. 搭建环境 1)注释掉csrf 2)配置模板路径 'DIRS': [os.path.join(BASE_DIR,'templates')], # BASE_DIR,代指当前目录. 3)配置静态文 ...
- VSS2005清除管理员密码
1.下载工具ultraedit 2.登录到服务器,找到VSS库文件夹,data\um.dat 3.复制到自己桌面,用ultraedit打开,进入 引用内容 00000080h: 55 55 03 29 ...
- 【bzoj3295】动态逆序对
Portal --> bzoj3295 Solution 虽然说这个可能原本是一道愉快的树套树但是 没有强制在线并且是三维限制那就大力cdq分治啊! 看到"按照某个顺序依次删除 ...
- poj 1655 树的重心
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13178 Accepted: 5565 De ...