使用CredSniper窃取红队中的2FA令牌
Mike Felch //
越来越多的组织正在强制推行2FA(双因素认证)注册,用于外部服务如GSuite和OWA的身份验证。虽然这是个好消息,因为它为外部边界增加了安全层,但也迫使红队和渗透测试组织创新技术,以捕获2FA令牌,而不仅仅是获取员工凭据。多年来,出现了多种与获取2FA令牌相关的攻击原语。在某些情况下,攻击者会尝试在手机上欺骗GSM,尝试暴力破解令牌,甚至通过搜索已禁用多因素的遗留门户来完全绕过2FA要求。最近,攻击者开始通过社交工程诱骗受害者通过SMS消息发送其令牌,通过虚假密码重置启动来诈骗用户。虽然某些技术可能偶尔有效,但它们作为可靠攻击路径的可能性相当低。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://<钓鱼站点>/creds/view?api_token=<api令牌>
将凭据标记为已查看 (GET) https://<钓鱼站点>/creds/seen/<凭据_id>?api_token=<api令牌>
更新配置 (POST) https://<钓鱼站点>/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脚本。
$ 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可通过此主机名访问,主机名的DNS必须在运行install.sh之前指向主机名的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虚拟环境:
/$ cd CredSniper/CredSniper$ source bin/activate(CredSniper) ~/CredSniper$ python credsniper.py –help
就这样!
灵活使用
CredSniper具有灵活的能力,可以在多种不同的可配置模式下运行。要访问标志,只需在执行期间传递–help。
用法:credsniper.py [-h] –module MODULE [–twofactor] [–port PORT] [–ssl] [–verbose] –final FINAL –hostname HOSTNAME
可选参数: -h, –help 显示此帮助消息并退出 –module MODULE 钓鱼模块名称 - 例如“gmail” –twofactor 启用双因素钓鱼 –port PORT 监听端口(默认:80/443) –ssl 通过Let’s Encrypt使用SSL –verbose 启用详细输出 –final FINAL 钓鱼完成后用户重定向到的最终URL –hostname HOSTNAME 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这样的站点,有多个页面。考虑认证过程的生命周期:
用户提供电子邮件地址,Google验证账户
如果无效,让用户知道电子邮件无效 如果有效,继续
用户密码由Google请求
如果无效,让用户知道密码无效 如果有效且2FA未激活,重定向到GSuite 如果有效且2FA激活,继续
2FA令牌由Google请求,这由默认用户注册驱动
如果SMS,触发向用户发送代码的短信 如果Authenticator,提示输入OTP代码 如果Yubikey,提示插入并激活U2F设备 如果Touch提示,提示用户触摸手机 如果用户代理反映未知浏览器,提示SMS 🙂 如果有效令牌,重定向到GSuite 如果有效令牌但可疑上下文,提示附加信息
CredSniper处理所有这些的方式很简单:
提示用户输入电子邮件
使用Google的Picaso服务在后台使用电子邮件加载个人资料图像
提示用户输入密码
在后台使用电子邮件和密码进行身份验证,然后识别是否启用了2FA。 如果启用了2FA,捕获附加信息(即SMS的最后几位数字、OTP应用名称(Duo/Authenticator等)、IP地址、地理位置 如果禁用了2FA,重定向到CredSniper中配置的最终目的地URL
提示用户输入2FA令牌
重定向到最终目的地URL 🙂
查看一个示例钓鱼工作流程:
最终想法
CredSniper对我们Black Hills的任务取得了巨大成功,我们收到了用户的大量积极反馈。我想花点时间也提一下另一个伟大的工具evilginx2,由我的朋友Kuba Gretzky开发。Evilginx2将代理目标和钓鱼网站之间的连接,然后通过托管自己的HTTP和DNS服务器拦截凭据和双因素令牌。如果CredSniper不是您想要的,我强烈建议尝试evilginx2。
CredSniper – https://github.com/ustayready/CredSniper Evilginx2 – https://github.com/kgretzky/evilginx2