专家-双因素身份验证-通过暴力攻击绕过2FA
# 实验室:通过暴力攻击绕过2FA
# 题目
此实验室的双因素身份验证 容易受到暴力破解攻击。你已经获得了有效的用户名和密码,但无法访问用户的 2FA 验证码。要解决实验室问题,请暴力破解 2FA 代码并访问 carlos 的帐户页面。
- 受害者的凭据:
carlos
:montoya
笔记
由于验证码将在你运行攻击时重置,因此你可能需要多次重复此攻击才能成功。这是因为新代码可能是你当前 Intruder 攻击已经尝试过的数字。
提示
您需要将 Burp宏 与 Burp Intruder 结合使用,来完成本次实验。有关宏的更多信息,请参阅BurpSuite文档 (opens new window)。精通 Python 的用户可能更喜欢使用Turbo Intruder (opens new window)扩展,该扩展可从 BApp 商店获得。
- name: 实验室-专家
desc: 通过暴力攻击绕过2FA >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-bypass-using-a-brute-force-attack
bgColor: '#001350'
textColor: '#d112fe'
2
3
4
5
6
# 实操
根据题意,可得实验目标:
- 该实验室存在双因素身份验证,但该验证容易受到 暴力破解攻击。
- 你已经拥有了 carlos 用户的密码,但无法获取他的 电子邮件验证码。
- 以 carlos 用户的身份登录,然后对 邮件验证码 进行暴力破解,最后访问其账户页面。
点击 “Access the lab” 进入实验室。

点击 “My account” 进入登录页面。

# 正常的登录流程
我们先进行一次正常的登录流程,看下会经过哪些操作。
启用浏览器代理,输入用户名和密码carlos
:montoya
,然后进行登录操作。
BurpSuite 不需要启用拦截,起到一个监控作用。

登录之后,目标系统会向 carlos 用户的邮箱中发送验证码,然后跳转到 /login2 页面,让我们输入验证码。
随意输入验证码,例如 0000 ,然后点击 Login 进行提交。
在输错两次验证码之后,会被强制退出,并重定向至 /login 页面,需要重新登录。

接下来看看捕获的数据包。
这是第 1 个请求数据包,进行登录操作,验证用户输入的用户名和密码,登录成功之后会分配一个 Cookie 并跳转至 /login2 页面。
除了用户名和密码 这两个参数之外,还会携带一个随机的 csrf token 参数。

第 2 个请求数据包,携带刚刚登录成功的 Cookie,跳转到 /login2 页面。

第 3 个请求数据包,二次登录操作,验证用户输入的邮箱验证码。
其中还携带了一个随机的 csrf token 参数。

以上就是登录过程中 产生的所有数据包:
- token + 用户名 + 密码 = 登录(获得Cookie)
- 携带 Cookie 跳转至 /login2
- token + 验证码 = 二次登录
第 1 个 csrf token 可以在 /login 页面中找到:

第 2 个 csrf token 可以在 /login2 页面中找到:

# 简单尝试
使用旧的 csrf token 提交邮箱验证码,请求失败,每个 token 只能使用一次。
想要暴破邮箱验证码,首先需要获得 /login2 页面中的 csrf token 参数。

直接请求 /login2 页面,看看是否能获得 csrf token 参数。
请求失败,响应信息 “用户没有登录” 。
想要获得 /login2 的 token ,就必须先登录。

使用旧的 csrf token 进行登录操作,请求失败,每个 token 只能使用一次。
想要登录,需要先获得 /login 页面中的 csrf token 参数。

直接请求 /login 页面,看看是否能获得 csrf token 参数。
请求成功,获得了登录所需要的 token 参数。

那么现在就产生了一个利用步骤:
- GET 请求 /login 页面,获得第一个 csrf token 。
- (token + 用户名 + 密码)POST 请求 /login 页面,进行登录操作,获得 Cookie 。
- (Cookie)GET 请求 /login2 页面,获得第二个 csrf token 。
- (token + 验证码)POST 请求 /login2 页面,进行二次登录操作。
一共四个步骤,如果手工来做的话太繁琐、费时了。
现在需要自动执行前 3 个步骤,以获取第二个 csrf token ,然后在提交验证码的时候,自动更新 csrf 参数。
# 方法1 - 宏(BurpSuite自带功能)
# 创建宏
BurpSuite 中的 “宏” 是一个类似于 “按键精灵” 的东西。可以录制一段数据包,帮用户执行某些操作,例如 自动发送请求、自动更新参数 等。
下面我们创建并使用一个宏。
打开 BurpSuite 窗口,添加一个宏,点击 “Settings --> Sessions --> Macros --> Add”。(注意:我的 BurpSuite 是 2023 版本的,其余版本的界面可能不太一致,有些功能点的位置不一样。)

点击 Add 之后,会自动跳出一个窗口,窗口里面是 BurpSuite 的历史数据包,我们选择其中的三个请求(自己提前抓好数据包):
- GET /login
- POST /login
- GET /login2
默认只能选中一条请求,按住 Ctrl 键可以同时选择多条请求。

选好数据包之后,更改宏的描述信息(标题),方便寻找。
请求顺序很重要,你可以通过旁边的 “Move up” 和 “Move down” 来对请求进行排序。

# 配置第1个请求
接着,选中第 1 个请求,然后点击旁边的 “Configure item” 对其进行配置。
然后点击 “Add” 添加一个自定义参数。

当前请求是 GET /login ,用于获取第一个 csrf token 。
- 参数名称:csrf
- 在下方选中对应的数据
然后点击 “OK” 保存。

# 配置第2个请求
选中第 2 个请求,点击旁边的 “Configure item” 对其进行配置。
当前请求是 POST /login 登录请求,设置其 csrf 参数,选择 “Derive from prior response”(源自先前的响应)。
在发送 POST /login 请求时,csrf 参数会自动更新为上一个请求的配置项。

# 配置第3个请求
选中第 3 个请求,点击旁边的 “Configure item” 对其进行配置。
然后点击 “Add” 添加一个自定义参数。

当前请求是 GET /login2 ,用于获取第二个 csrf token 。
- 参数名称:csrf
- 在下方选中对应的数据
然后点击 “OK” 保存。

# 测试宏
配置好所有的条目之后,你可以点击下方的 “Test macro” 测试一下宏,看看是否有问题。

看到以下 3 个状态码说明没问题,待会再详细说明为什么是这几个状态码。

# 添加处理规则
创建宏之后,宏并不会自动运行。
需要创建一个处理规则,将宏应用到相应的请求当中。
“Sessions --> Session handling rules --> Add”

切换到 “Details” 选项卡,更改规则名称,例如 auto-flush-csrf2 ,方便寻找。
然后选择下方的 “Add --> Run a macro” 添加规则操作,操作类型为 运行宏。

选择我们刚刚创建的宏,然后点击 “OK” 保存。

切换到 “Scope” 选项卡,设置该条规则的执行范围。
工具范围:Repeater 和 Intruder 勾选上(默认已经勾选)。
URL范围:这里选择 “Use custom scope”(自定义范围)。然后点击 “Add” 添加一个 URL,把 /login2 的路径添加进去,如图。
最后点击 “OK” 保存。

# 宏的实际应用
启用规则之前,我们尝试暴破验证码,请求失败,csrf token 错误。

我们切换到 BurpSuite 的 “Logger” 选项卡,将所有日志清除,方便待会的分析。

启用刚刚创建的规则,然后再次发送数据包。
响应状态码为 200 ,响应信息为 “验证码错误” ,请求成功。

切换到 “Logger” 选项卡,看到了四个请求条目。
我们刚刚只发送了 1 个数据包,但是现在出现了 4 个?
因为前 3 个数据包是在 “宏” 里面定义好的,如果当前请求触发了规则,宏就会自动帮我们发送这 3 个数据包,然后更新当前请求中的参数,最后再将当前请求发送出去。
看图:




# 暴破邮箱验证码
使用 “Intruder” 功能,将验证码字段的值添加到选区。

设置攻击载荷:
- 载荷类型:Numbers
- 范围:0000-9999
- 步长:1
- 最大和最小 整数位数:4
- 最大和最小 分数位数:0

一个特别要注意的点,请求当中是带有 csrf token 的。如果请求过快,会导致之前的 csrf token 过期,此时会暴破失败。
所以我们只能使用 “单线程” 来进行暴破(很慢)。
设置 1 个线程,然后点击 “Start attack” 开始攻击。

暴破的过程中,你会看到两种长度的数据包,3259 和 2929 。
- 提示验证码错误,请重新输入。
- 提示验证码错误,然后跳转到 /login ,请重新登录。
所以两个包的响应长度不一样,但都是正常的。
暴破时间很漫长,而且不一定能成功,有时候需要多试几轮。
(建议:如果数字到了 2000 还没暴破成功,就重新开始暴破,因为验证码的数字大多集中在 0000-1999)

对结果进行排序,发现一个异常条目,跳转到了 /my-account 页面,说明登录成功。
选择 “右键数据包 --> Show response in browser”(在浏览器中显示响应)。

然后会弹出一个窗口,点击 “Copy” 复制 URL 。

在浏览器中打开一个新窗口,启用 BurpSuite 代理,然后访问刚刚的 URL 。
(必须有 BurpSuite 代理,因为这个 URL 是通过 BurpSuite 来进行跳转的)

访问之后,成功跳转到账户页面,实验完成。

# 方法2 - 使用Turbo Intruder(扩展)
还没学会,等我学会再说......
(诶诶诶,下手轻dsacnxzkncuwa......)