利用CredSniper在红队中窃取2FA令牌:技术解析与实战指南

本文详细介绍了CredSniper工具如何通过克隆认证门户和HTTPS伪装,有效窃取双因素认证令牌,包括模块化设计、API集成及安装配置步骤,适用于红队和渗透测试场景。

利用CredSniper在红队中窃取2FA令牌

Mike Felch //

越来越多的组织强制要求员工启用双因素认证(2FA)来访问外部服务(如GSuite和OWA)。这虽然增强了外部边界的安全性,但也迫使红队和渗透测试组织创新技术,从仅获取员工凭证转向捕获2FA令牌。多年来,出现了多种获取2FA令牌的攻击方法,例如欺骗手机GSM信号、暴力破解令牌,或通过寻找已禁用多因素的旧门户来绕过2FA要求。最近,攻击者开始通过社交工程,诱骗受害者通过短信发送令牌,例如伪造账户密码重置请求。尽管这些方法偶尔有效,但作为可靠攻击路径的可能性较低。CredSniper最初源于红队任务中的需求,现已发展为一种可靠方法,甚至能从技术娴熟的高级员工那里成功获取凭证和2FA令牌。

介绍CredSniper

网络钓鱼凭证已存在多年,大多数组织开始在入职流程中推出意识培训。常见问题是,组织培训员工识别电子邮件中的危险信号,而非灌输健康的互联网行为,无论通信平台如何。如果我能诱使毫无戒心的受害者访问他们熟悉认证门户的精确克隆版本,大多数人会在被要求时交出凭证和2FA令牌。这正是CredSniper的亮点所在!

HTTPS是强制性的

除了保护目标避免在非HTTPS站点输入凭证外,确保克隆认证门户的质量不暴露组织培训识别的危险信号同样重要。克隆GSuite门户时,这一点至关重要,因为Google Chrome浏览器会警告目标站点看起来恶意。切换到HTTPS后,此问题自行解决,因为Google不会拦截访问者和服务器之间的请求和响应负载。安装期间,CredSniper会从Let’s Encrypt为您提供的主机请求新SSL证书。唯一前提是计划使用的主机名指向托管克隆门户的服务器的IP地址。

模块化认证门户

CredSniper随附GSuite模块,但可以以最小开销创建新模块。未来这将更加简化,但目前用户可在5-10分钟内创建新门户模块。模块定义了模板和路由之间的映射。例如,如果有人访问/login,模块将知道加载认证过程该阶段的正确模板。CredSniper的设计理念是,可以编写功能在后台与真实门户认证,并在与目标交互期间进行。通过与真实站点认证,2FA SMS令牌将发送给目标,CredSniper可提示用户输入它。 模板是真实门户的HTML副本,但包含必要的模板标签。CredSniper使用名为Jinja2的模板语言,提供无缝方式用用户提供的数据个性化钓鱼页面。例如,某些认证门户(如GSuite)首先要求用户输入电子邮件地址,然后发送到密码页面,再到2FA页面。在密码页面中,GSuite在电子邮件地址旁边显示用户个人资料图像。由于CredSniper在钓鱼第一阶段捕获了电子邮件地址,在后续页面中使用它就像在HTML模板中放置标签{{ username }}一样简单。Jinja2在渲染模板时自动用值替换标签。模块中可以配置任意数量的路由,以适应所有不同认证过程的变体。

API集成

CredSniper还附带轻量级API,用户可以在其他应用程序中集成收集的凭证。由于2FA令牌过期相当快,API提供快速使用凭证的方式,以在为时已晚之前自动化认证任务。运行CredSniper时,屏幕上将显示API令牌,提供使用端点查看凭证、标记为已查看和更新配置的能力。

  • 查看凭证 (GET)
    https://<phish site>/creds/view?api_token=<api token>
  • 标记凭证为已查看 (GET)
    https://<phish site>/creds/seen/<cred_id>?api_token=<api token>
  • 更新配置 (POST)
    https://<phish site>/config
    请求体示例:
    { 'enable_2fa': true, 'module': 'gmail', 'api_token': 'some-random-string' }

简单安装

要开始安装,CredSniper要求为您计划使用的主机名配置DNS。如前所述,Let’s Encrypt需要在颁发SSL证书前验证主机名,因此主机名必须分配给托管CredSniper的主机的IP地址。有报告称安装脚本在Ubuntu 16.04以外的发行版上会抛出错误。虽然可以在其他Linux版本或发行版上安装和运行所有内容,但强烈建议使用Ubuntu 16.04以避免可能需要故障排除的问题。 首先克隆GitHub仓库,这将获取所有必要文件,并提供升级的简便方式,因为新代码会被推送。克隆后,切换目录并运行install.sh脚本。

1
2
3
$ git clone https://github.com/ustayready/CredSniper
$ cd CredSniper
~/CredSniper$ ./install.sh

安装脚本将请求信息以配置所需参数并启动CredSniper的初始运行。这些参数可以在将来运行CredSniper时作为标志传递。

  • 要部署的模块(例如:gmail):要运行的CredSniper模块。查看modules/目录获取列表。
  • 最终重定向URL:钓鱼后目标浏览器的最终目的地URL。这应与您的借口一致,以消除目标的怀疑。
  • 启用SSL?[Y/n]:是否使用SSL进行钓鱼。由于浏览器标记可疑站点的方式,未来版本可能需要此选项。
  • 启用双因素钓鱼?[Y/n]:此选项控制双因素钓鱼,无需更改模块路由。有时双因素未启用,能够从命令行禁用它很方便。
  • 输入证书的主机名(例如:app.example.com):Let’s Encrypt将使用此主机名检索CredSniper的SSL证书。为使CredSniper可通过此主机名访问,运行install.sh前,主机名的DNS必须指向主机的IP地址。
  • 要监听的端口(默认:80/443):CredSniper仅以HTTP或HTTPS模式运行,而非两者。有时克隆的门户运行在备用端口上,为看起来合法,CredSniper可配置为运行在备用端口上。默认情况下,如果CredSniper以HTTP模式运行,则分配端口80;如果以HTTPS模式运行,则分配端口443。 如果尚未安装,还将安装一些先决条件:
  • Let’s Encrypt Apt仓库
  • Python3
  • VirtualEnv
  • GnuPG
  • CertBot
  • Python3模块:Flask、mechanicalsoup、pyopenssl

使用Python3将创建虚拟环境并安装必要的Python3模块。接下来,将启用Python的端口绑定,以便可以从用户空间监听端口80/443。最后,SSL证书的证书和私钥将被复制到certs/文件夹中。 成功安装所有内容后,CredSniper将运行!install.sh脚本在将来执行CredSniper时不需要。要执行CredSniper,只需运行Python脚本:python credsniper.py --help 如果您碰巧注销主机并希望稍后运行CredSniper,请确保在运行credsniper.py之前首先激活Python虚拟环境:

1
2
3
~/$ cd CredSniper
~/CredSniper$ source bin/activate
(CredSniper) ~/CredSniper$ python credsniper.py --help

就这样!

灵活使用

CredSniper具有灵活的能力,可在多种可配置模式下运行。要访问标志,只需在执行期间传递--help

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
usage: credsniper.py [-h] --module MODULE [--twofactor] [--port PORT] [--ssl] [--verbose] --final FINAL --hostname HOSTNAME

optional arguments:
  -h, --help            show this help message and exit
  --module MODULE       phishing module name - for example, "gmail"
  --twofactor           enable two-factor phishing
  --port PORT           listening port (default: 80/443)
  --ssl                 use SSL via Let's Encrypt
  --verbose             enable verbose output
  --final FINAL         final url the user is redirected to after phishing is done
  --hostname HOSTNAME   hostname for SSL

如果您选择不使用内置API监控钓鱼凭证,应熟悉两个文件:

  • 临时缓存凭证
    .cache:缓存文件提供通过钓鱼用户名和密码阶段的凭证的中间聚合。最初设计用于在启用双因素时临时存储凭证,以防止目标未完成双因素步骤时丢失凭证。
  • 钓鱼凭证
    .sniped:sniped文件提供捕获凭证的平面文件存储,以及其他信息,如双因素信息、IP地址和地理位置信息。在某些情况下,如果您从新位置使用凭证认证到Gmail等站点,它们会提示您提供上次认证的位置。通过获取钓鱼目标的IP地址并快速地理定位它们,您可以提供准确的答案。

克隆页面

虽然唯一公开的内置模块是Gmail,但modules/目录中还有一个示例模块,可帮助您快速创建新模块。要快速克隆页面,我倾向于使用名为“Save Page WE”的FireFox插件,该插件方便地将外部资源内部嵌入单个HTML页面。这很方便,并避免加载由克隆网站托管的嵌入资源,希望移除CredSniper可能意外进行的任何回调。请确保遵循示例模块HTML模板以包含正确的模板参数。请关注未来关于如何为CredSniper克隆页面的博客文章,或查看我们在YouTube上的Tradecraft Security Weekly视频“使用CredSniper钓鱼2FA令牌”。 概念相当简单,对于您尝试克隆的每个页面,您都需要一个新模板。新模板将从您的模块加载并由CredSniper内的路由触发。不深入细节,模块由CredSniper加载,每个路由将自动添加到内置Web服务器。每个路由在模块中分配一个函数,模块负责加载模板。如果您的HTML模板在modules/module/templates/目录中并包含正确的{{template}}语言,CredSniper将自动用正确值替换模板语言。对于像Gmail这样的站点,有多个页面。考虑认证过程的生命周期:

  1. 用户提供电子邮件地址,Google验证账户
    • 如果无效,告知用户电子邮件无效
    • 如果有效,继续
  2. Google请求用户密码
    • 如果无效,告知用户密码无效
    • 如果有效且2FA未激活,重定向到GSuite
    • 如果有效且2FA激活,继续
  3. Google请求2FA令牌,这由默认用户注册驱动
    • 如果SMS,触发向用户发送代码的短信
    • 如果Authenticator,提示输入OTP代码
    • 如果Yubikey,提示插入并激活U2F设备
    • 如果Touch提示,提示用户触摸手机
    • 如果用户代理反映未知浏览器,提示SMS 🙂
    • 如果有效令牌,重定向到GSuite
    • 如果有效令牌但可疑上下文,提示附加信息

CredSniper处理所有这些的方式很简单:

  • 提示用户输入电子邮件
    • 使用Google的Picaso服务在后台加载个人资料图像
  • 提示用户输入密码
    • 在后台使用电子邮件和密码认证,然后识别是否启用2FA。
    • 如果启用2FA,捕获附加信息(例如SMS的最后几位数字、OTP应用名称(Duo/Authenticator等)、IP地址、地理位置
    • 如果禁用2FA,重定向到CredSniper中配置的最终目的地URL
  • 提示用户输入2FA令牌
    • 重定向到最终目的地URL 🙂

查看示例钓鱼工作流程。

最后 thoughts

CredSniper在Black Hills的任务中取得了巨大成功,我们收到了用户的大量积极反馈。我想花点时间介绍另一个伟大工具evilginx2,由朋友Kuba Gretzky开发。Evilginx2将代理目标和钓鱼网站之间的连接,然后通过托管自己的HTTP和DNS服务器拦截凭证和双因素令牌。如果CredSniper不是您想要的,我强烈建议尝试evilginx2。

CredSniper – https://github.com/ustayready/CredSniper
Evilginx2 – https://github.com/kgretzky/evilginx2

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