为什么要利用合法服务
C2是攻击者在网络中控制受感染主机的技术,通过C2服务端(控制端)对感染了木马的设备进行远程控制,执行各种恶意操作。主流的C2框架包括Metasploit、CobaltStrike、SLiver和BRC4等。图中显示了攻击者自建服务器与合法消息服务平台之间的交互,以及它们如何控制受害主机。
常见的C2检测机制包括端点检测和流量检测。端点检测涉及内存特征(如shellcode、C2配置、外联特征等)、API函数调用特征以及联动威胁情报。流量检测则关注已知C2流量特征(如默认证书、指纹、请求头等)、C2固定通信格式(如请求体中包含特定加密字符串)以及异常流量模式(如周期性心跳包通信、DNS查询中有大量编码数据、非正常DNS查询频率等)。
主流C2框架开发工作量较少,但易被封禁和标黑,需要考虑隐藏真实C2与防封禁;流量隐蔽需对抗流量特征检测,端点检测进程和内存特征基本已被监控,难以绕过上线;功能定制与扩展方面,服务端多种配置可调整,插件化可扩展。
纯自研C2开发工作量较多,自行开发服务端与团队作战功能;易被封禁和标黑,需考虑隐藏真实C2与防封禁方法;需自行设计通信格式和加密方式;无已知特征,抗检测性较强;服务端可随时扩展开发新功能。
基于合法服务的C2开发工作量较少,无需自行开发服务端,天然的团队作战机制;合法域名/IP,威胁情报不会标黑,部分企业不会直接封禁服务;纯合法API交互,服务提供加密协议,隐蔽在正常流量中很难发现;纯合法API交互,上线初期不存在被检测和拦截的恶意特征;功能有限,尤其是服务端功能无法扩展。
SaaiwC组织和APT29组织分别利用Telegram和Zulip平台作为数据接收平台和payload下发平台。具体示例包括通过Telegram API进行数据传输,以及使用Zulip API接口进行数据交互。这些操作涉及复杂的代码实现,例如通过特定的API请求发送和接收数据,以实现隐蔽的数据传输和控制功能。
对slack服务的利用
C2服务端:Slack平台/服务(API的提供者),作为基础的服务平台。
C2控制台:Slack工作区及其中的频道,作为操作平台,用于管理和控制。
C2木马:待开发程序,通过使用API与服务交互,实现远程控制功能。
攻击团队:工作区中的所有成员,负责执行具体的攻击任务和操作。
这种架构利用了Slack的合法服务,通过API进行隐蔽的数据传输和控制,从而实现对受害主机的远程操控。
木马功能设计与开发(C#实现)
常规思路:循环读取频道中的最后一条消息记录,若为有效指令,则执行对应的动作并回传结果。
缺点:无法做到像CS一样的任务队列,若心跳间隔较长,在频道中发送的多个指令只能执行最后一个。
例如通过conversations.history获取频道中的历史对话消息,以及通过chat.postMessage向频道中发送消息。
在初始动作中,获取上线消息的时间戳作为初始时间戳,并在主循环中每次拉取消息时,都获取时间戳之后的所有消息进行解析。有效指令被放入任务队列,同时刷新时间戳为最后一条消息的时间戳。任务处理函数从任务队列中拉取任务并提交给任务执行线程,执行完成后将结果回传。整个过程通过Slack频道进行消息交互,确保指令和结果的准确传递。
这张图展示了木马功能设计与开发中的任务请求与执行部分。代码示例使用了BlockingCollection集合,适用于生产者-消费者模型。当任务队列为空时,消费者线程(执行任务线程)会被阻塞,直到队列中有元素可用。
具体实现中,通过BlockingCollection创建任务队列,并在主循环中拉取所有新消息,将有效指令依次加入任务队列,同时更新时间戳为最后一条消息的时间戳。任务处理函数从任务队列中拉取任务并提交给任务执行线程,执行完成后将结果回传。
木马功能设计与开发中的基础命令执行部分具体包括使用conversations.history和chat.postMessage等API方法,以及通过cmdShell、psCommand、executeFile、ls、pwd、ifconfig、whoami等命令来执行各种操作。
示例中展示了如何通过Slack频道发送命令(如execute notepad.exe C:\cxm\test.txt)并将其加入任务队列,然后执行该命令并返回结果。
木马功能设计与开发中的文件上传下载部分具体包括使用files.getUploadURLExternal接口发送要上传的文件名和文件大小信息,以获取专属文件上传URL和唯一文件ID。通过返回的文件上传URL上传文件数据,可将文件上传到Slack文件存储服务器。之后,使用files.completeUploadExternal接口发送文件ID和频道ID,Slack将文件从文件存储服务发送到频道。
示例中展示了如何通过Slack频道发送截图命令,并将其加入任务队列。截图文件首先临时保存在本地,随后上传至Slack文件存储服务器,上传完毕后删除临时文件。
下图展示了木马功能设计与开发中的文件上传下载部分,特别是如何下发文件到目标机器。具体步骤包括:
使用files.info接口发送已存储在Slack服务上的文件ID,以获取文件的外部下载链接。
将要下发的文件上传到频道中,并发送下发文件的指令和文件ID。
木马程序调用files.info接口获取文件下载URL,然后下载文件。
示例中展示了通过Slack频道发送文件下发命令(如sendfile F0837GV70SE C:\cxm\zzz.exe),并将其加入任务队列。文件下发成功后,文件路径为C:\cxm\zzz.exe。此外,还提供了使用合法第三方文件托管平台接口的建议,以应对服务没有提供文件传输相关API的情况。
每个机器上线时生成一个唯一ID,后续每次下发指令都需要带上此ID,以标识指令生效的目标机器。木马客户端通过指令携带的ID决定是否解析和执行该指令。
具体流程包括:受害机器1上线后生成ID并发送上线消息到Slack频道,同时接收有效指令并执行任务。受害机器2同样上线并生成ID,但非有效指令不会被执行。这种机制确保了指令的准确性和针对性,避免了不必要的资源浪费。
服务支持通过API创建频道和邀请用户进入频道,木马程序每次运行时,调用API创建一个新的频道并将攻击者用户拉入频道,实现一频道一机器的操作。
具体流程包括:受害机器1上线后,通过API创建Slack频道1,并将攻击者用户拉入该频道。受害机器2同样上线后,通过API创建Slack频道2,并将攻击者用户拉入该频道。每个频道中包含成员信息、上线消息、指令消息和任务结果消息。受害机器通过发送和接收这些消息来执行相应的指令和任务。这种机制确保了每个受害机器都有独立的通信通道,提高了管理和控制的灵活性。
通过conversations.create接口创建公共或私人频道对话,以及通过conversations.invite接口邀请用户进入频道。
具体示例中,展示了一个名为#channel-c2c9d5498051477b的频道创建过程。频道创建后,管理员和用户陈小明被邀请加入该频道。频道信息包括上线消息、指令消息和任务结果消息等,确保每个受害机器都有独立的通信通道,提高了管理和控制的灵活性。
木马功能设计与开发中的辅助功能模块化设计部分具体包括将辅助功能开发为.NET程序集DLL,并通过频道下发执行。木马通过反射将程序集加载到一个AppDomain中,调用完程序集中的方法后卸载AppDomain。
示例代码中,通过LoadAndInvokeWithAppDomainAsync方法解析程序集文件ID、类名、方法名和方法参数等信息,获取文件下载URL,并在新的AppDomain中加载和执行相关方法。这种方法提高了模块的灵活性和可维护性,确保了每个功能模块的独立性和安全性。
木马功能设计与开发中的辅助功能模块化设计部分,具体包括将辅助功能开发为.NET程序集DLL,并通过频道下发执行。示例代码中,通过sendLsassDumpAsync方法发送授权信息和频道信息,获取Lsass dump文件并等待上传。
此外,还展示了具体的交互过程,包括通过Slack频道发送命令(如loadassembly -f F083VH22CUV -c getCredentials.LsassDump)并将其加入任务队列,然后执行该命令并返回结果。整个过程涉及API Token和当前频道ID的使用,确保了命令的安全性和准确性。
木马加载与使用
木马程序可以直接编译为EXE文件进行包装和使用,其中包含C2配置信息,如API Token、Attack UserID、SleepTime和UserAgent等。
具体实现中,木马生成后需要通过合法的数据托管平台(如Pastebin)存储C2配置信息,并在运行时从这些平台下载加密的配置内容并解密。示例代码中展示了如何下载加密的C2配置并解密,然后解析解密后的配置信息。整个过程确保了配置信息的安全性和灵活性,同时通过字符串混淆和深度代码混淆保护了C2配置。
这张图展示了木马加载与使用的另一种方法,即作为程序集动态加载并支持外部传参。具体包括:
利用反射技术在运行时动态加载程序集,创建类的实例并调用其中的方法,支持给方法传参。示例代码中展示了如何通过Assembly.Load方法加载程序集,并使用Activator.CreateInstance和InvokeMember方法创建类实例并调用方法。
使用PowerShell和Msbuild等工具进行动态加载。
DotnettoJS技术,可以从JavaScript和VbScript脚本中加载并执行.NET二进制文件。
CLR Hosting(donut)技术,提供更灵活的加载和执行方式。
整个过程确保了木马程序的灵活性和隐蔽性,通过动态加载和外部传参实现了更复杂的操作和控制。
木马加载与使用中减少开发量的利用思路,具体包括两种:
作为冲锋马,仅开发基础的命令执行、文件传输等功能,并通过获取权限(如诱导高权限执行或BypassUAC)、削弱杀软(上传工具关闭/致盲安全设备)和上传新木马(上传功能完备的主流C2木马后渗透)等步骤实现目标。
作为窃密木马,仅开发窃密和文件传输功能,服务平台作为敏感数据外发平台,类似于SaaiwC攻击组织的做法。具体步骤包括获取数据(如敏感文档、浏览器存储凭据、运维工具存储凭据等),并通过内网代理(上传内网穿透工具,将目标机器作为内网代理据点)和内网渗透(利用获取的数据在外部对内网进行渗透)等手段进一步扩展控制范围。
整个过程通过简化功能模块和利用现有工具,提高了木马的隐蔽性和灵活性,确保了攻击的有效性和持续性。
合法服务的利用条件通常包括提供文字内容读取与发送功能的API接口(适用于群组、频道、看板等),支持文件存储和通过API上传下载文件,以及具备团队协同能力并通过API进行群组、频道、看板等管理。示例中展示了如何在Trello中上传文件,并通过飞书、微信、QQ等平台进行简单的指令下发和数据接收,同时提及了Slack、Telegram、Trello和Dropbox等平台的团队作战C2操作。