文章目录
- 一、ATT&CK
- 二、T1583 获取基础架构
- 2.1 匿名网络
- 2.2 专用设备
- 2.3 渗透测试虚拟机
- 三、T1588.002 C2
- 3.1 开源/商用 C2
- 3.1.1 C2 调研
- Sliver
- Sliver 对比 CS
- 3.1.2 CS Beacon流量分析
- 流量规避
- 免杀上线
- 3.1.3 C2 魔改
- 3.1.4 C2 隐匿
- 3.1.5 C2 准入
- 应用场景
- 安装
- 配置说明
- 工具使用
- CS 配置监听器
- 3.2 自研 C2 Demo
- 3.2.1 实现
- 构造定义gRPC API
- Server端
- Implant端
- Clinet端
- 编码问题
- 流量加密
- 3.2.2 使用
- 编译命令
- 3.3 另类 “C2”
- 四、T1588.002 其他工具
- 4.2 隧道工具
- 4.1.1 FRP
- 特征修改
- 运行后删除配置文件
- 4.3 协同平台
- 4.5 快速部署
红队是一种全范围的多层攻击模拟,旨在衡量公司的人员和网络、应用程序和物理安全控制,用以抵御现实对手的攻击。在红队交战期间,训练有素的安全顾问会制定攻击方案,以揭示潜在的物理、硬件、软件和人为漏洞。红队的参与也为坏的行为者和恶意内部人员提供了机会来破坏公司的系统和网络,或者损坏其数据。
渗透测试中只关注给定目标系统的漏洞,红队测试则完全不一样。红队在测试过程中关注的是如何规划一条攻击路径来达到目的。在整个红队测试过程中不一定要也不一定会发现目标组织的漏洞,只要能达到目的,任何形式的攻击手段都可以使用,包括但不限于web或者操作系统漏洞、社会工程学、物理渗透、攻击上下游合作供应商等。
红队基础设施建设是指在进行红队行动(模拟攻击)前,搭建和配置一系列用于支持模拟攻击的基础设施和工具。红队基础设施建设的目的是模拟真实世界中对抗恶意攻击者的情境,以帮助组织测试其安全防御措施的有效性、检测潜在的安全风险,并提供有针对性的安全培训,在建设过程中应遵循以下原则:
- 1.基础设施的匿名性(redteam服务器和域名等信息资产)
- 2.红队⼯具的匿名性(减少TTP被追踪的可能性)
- 3.⽹络通讯的匿名性(代理,VPN,物联卡等)
- 4.⽹络身份的匿名性(邮箱,社交账号,虚拟身份等)
参考链接:
- 浅谈红队基础设施架构和配置
- Red-Team-Infrastructure-Wiki
- 红队基础建设、你确定不来了解一下?
课题参考ATT&CK框架结构,从网络、主机、工具三个层面进行技术分析
一、ATT&CK
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge)框架是由 MITRE 公司开发的一个用于描述和组织威胁行为的知识库。该框架旨在提供一个共享的、详细的、结构化的关于威胁者行为的资源,使安全专业人员能够更好地理解、检测和应对网络攻击。
ATT&CK框架的主要组成部分包括:
- 战术(Tactics): 描述了攻击者的高层次目标,涵盖了攻击的总体目标和策略。ATT&CK框架定义了多个战术,如初始访问(Initial Access)、执行(Execution)、持久性(Persistence)等
- 技术(Techniques): 描述了攻击者在每个战术下使用的具体技术。每个技术都是攻击者实现目标的具体手段,如使用恶意软件、绕过身份验证等
- 过程(Procedures): 描述了攻击者在执行特定技术时可能采用的具体步骤。这有助于更深入地理解攻击者的操作方式
- 软件(Software): 描述了攻击者可能使用的特定恶意软件和工具,包括恶意代码、后门、漏洞利用工具等
- 持久性(Persistence): 描述了攻击者在目标网络中保持持久存在的方法,包括注册表修改、定时任务、服务安装等
文章参考了 ATT&CK 框架技术结构,主要体现使用
- T583(获取基础架构):攻击者可能会购买、租赁或租用可在定位期间使用的基础设施。存在用于托管和编排对手操作的各种基础结构。基础架构解决方案包括物理或云服务器、域和第三方 Web 服务。此外,僵尸网络可供出租或购买
- T1588(获取能力):攻击者可能会购买和/或窃取可在瞄准过程中使用的功能。对手不是在内部开发自己的能力,而是可以购买、免费下载或窃取它们。活动可能包括获取恶意软件、软件(包括许可证)、漏洞利用、证书以及与漏洞相关的信息。攻击者可以获得在对手生命周期的许多阶段支持其操作的能力
参考链接:
- 基于ATT&CK攻击框架整理的红队工具
- ATT&CK中文
二、T1583 获取基础架构
攻击者可能会购买、租赁或租用可在定位期间使用的基础设施。存在用于托管和编排对手操作的各种基础结构。基础架构解决方案包括物理或云服务器、域和第三方 Web 服务。此外,僵尸网络可供出租或购买
2.1 匿名网络
个人电脑网络
攻击队在使用个人电脑网络时,应遵守以下行为准则:
- 务必每人使用一个匿名物联网流量卡,不使用单位热点及个人热点防止被溯源
- 使用软路由或者代理进行流量转发,防止网络被封禁影响攻击效率
- 提前购买代理池节点或这使用其他手段如:秒拨等手段实现快速 IP 切换,实现在 IP 被对方防火墙拉黑后快速切换,保证渗透测试的连续性
- 匿名上网做到身份隔离,这样踩蜜罐后防守方也无法获取有用信息
- 非本人账号:非本人个人信息的微信号、QQ 号、脉脉账号等社交软件账号
- 银行卡“四件套”(一般是指银行卡、对应绑定的手机卡、身份证和U盾)
相关参考:
- [勉强能用 匿名上网方案](file://192.168.137.1/e/iCloudDrive/_%E5%85%AC%E4%BC%97%E5%8F%B7%E5%A5%BD%E6%96%87/%E5%8B%89%E5%BC%BA%E8%83%BD%E7%94%A8%20%E5%8C%BF%E5%90%8D%E4%B8%8A%E7%BD%91%E6%96%B9%E6%A1%88.html)
- 红队行动之身份隐匿
- 匿名:《红队攻击安全配置》
2.2 专用设备
如果使用专用电脑,最好是完全重装系统之后的,保证没有任何个人信息,包括个人文件,网页浏览记录,软件登录记录等
2.3 渗透测试虚拟机
在没有专用电脑的情况下,可以使用专用虚拟机来完成渗透测试工作,但是需要保证:
- 渗透测试虚拟机内无任何个人文件,所有攻击操作在虚拟机内完成
- 关闭物理机的网络,只保留虚拟机网络,确保渗透测试虚拟机和物理机网络不在同一网段
一般创建 2-3 台虚拟机;三台的话,一台用于扫描探测、一台用于实施渗透、一台用于存储/分析数据。如果是两台的话,扫描和渗透就用同一台
物理机和虚拟机隔离
确保 VMware USB Arbitration Service 是开启的
虚拟机->可移动设备->连接到虚拟机
将所有物理机网卡全部禁用,并将虚拟机设置为与随身 WIFI 网段对应的静态 IP,可以看到物理机处于断网状态,虚拟机正常上网
PC安全基线配置
- 用 VeraCrypt 将虚拟机与物理机的所有盘符(包括C盘)加密
然后再根据安全基线手册,一条条加固,这里举例部分:
- 开机按F12(不同版本的BIOS管理软件快捷键不同,自行查询)进入BIOS,在BIOS中将麦克风,摄像头禁用(Disabled);将某些自动更新的选项禁用,不同的BIOS功能不同,请自行检查
- 安装操作系统时选择合适的时区、语言、地区(不要选ZG时区、中文、ZG)设置;安装界面的隐私设置下,将位置、诊断、相关广告(AD ID)、语音识别、****诊断数据改进体验等选项全部关闭**
- 自定义设置界面,将浏览器保护、连接和错误报告、自动连接到我的联系人共享的网络、向Microsoft发送错误和诊断信息**全部关闭
- 操作系统使用的用户名尽量全部设置为常见的英文名,比如 Tom,Jerry 等等
- 应用软件的安装位置不要和系统盘一起,应用程序的自动随操作系统的启动一般情况下禁止;应用软件从官方网站下载;SHA1 或者 MD5 的 Hash 值校验
- 不要在浏览器留下任何隐私信息、任何账号密码、任何搜索记录
- 尽量不要偷懒,每渗透完一个目标,就将虚拟机全部释放,下次渗透别的目标时再重新安装
- 后面还有很多比如安装后的很多隐私信息,和敏感的服务一条条全部关闭。计划任务、启动项、端口、VMware、等等配置就不细说了,网上很多。做到这一步后即使踩到蜜罐,被蜜罐获取到有效信息也不多了
- 尽量使用不带有个人特色的工具、不常见的工具、未报过通用漏洞的自研工具、和及时将使用完的虚拟机释放、等等值得注意的地方
三、T1588.002 C2
这部分为 ATT&CK 中 T1588.002 工具技术,这里我们特指 C2 工具
攻击者可能会购买、窃取或下载可在瞄准过程中使用的软件工具。工具可以是开源的或闭源的,免费的或商业的。工具可以被对手用于恶意目的,但(与恶意软件不同)不打算用于这些目的(例如:PsExec)。工具获取可能涉及商业软件许可证的采购,包括Cobalt Strike等红队工具的采购。商业软件可以通过购买、窃取许可证(或软件的许可副本)或破解试用版获得
C2 是指攻击者使用的一种架构或系统,用于与已被入侵的目标进行通信和控制。攻击者使用 C2 系统向受感染的计算机发送命令,以执行各种活动,例如数据盗窃、恶意软件传播、系统破坏等。C2 通常包括两个主要组件:
- Command Server(命令服务器): 这是攻击者使用的服务器,用于发布命令和控制被感染的系统。攻击者可以通过命令服务器向受感染的计算机发送指令,例如下载和执行其他恶意软件、窃取敏感信息等。
- Agent or Implant(代理或植入物): 这是在受感染的系统上运行的恶意软件或代码。该代理会连接到命令服务器,接收并执行从服务器发送的命令。这个代理通常隐藏在系统中,以避免被检测和清除。
C2 体系结构是许多先进威胁和网络攻击的核心组成部分。对抗 C2 是网络防御中的一个重要方面,包括检测和阻止与 C2 服务器的通信、清除受感染的系统以及防范未来攻击。在实际网络安全操作中,分析 C2 系统的行为和通信模式对于检测和响应潜在威胁至关重要
注意:所有工具开发及工具使用阶段都应遵循 OPSEC 准则,全称为Operations Security
,即行动安全
3.1 开源/商用 C2
3.1.1 C2 调研
C2 调研的目标是深入了解恶意 C2 网络的运作方式,包括其协议、通信模式、加密手段、使用的工具和技术等。这有助于网络安全专业人员更好地理解和防御与 C2 相关的威胁
- awesome-command-control
- C2Matrix 比较表格
Sliver
Sliver 是一款使用 GO 语言开发的开源 C2(Command and Control)框架,主要用于渗透测试和红队操作。这个框架被设计为轻量级、模块化、易于使用,并提供了许多功能,使渗透测试人员和红队成员能够远程控制受感染的系统
Sliver 主要由四部分构成:
- 服务器控制台 - 服务器控制台是主界面,通过 sliver-server 可执行文件启动,所有操作代码都在客户/服务器控制台之间共享;服务器控制台通过一个gRPC接口与服务器进行通信。
- Sliver C2 服务器 - Sliver C2 服务器是 sliver-server 可执行文件的一部分,管理内部数据库,启动和停止网络监听器。与服务器交互的主要接口是gRPC接口,所有的功能都是通过它实现的。
- 客户端控制台 - 客户端控制台是用于与Sliver C2服务器互动的主要用户界面。
- 植入物 - 植入物是在目标系统上运行的恶意代码(exe、ps1等)
参考文章:
-
威胁行为者Sliver C2框架使用分析(上)
-
红队工具研究篇 - Sliver C2
-
红队工具研究篇 - Sliver C2 通信流量分析
-
红队工具研究篇 - SliverC2 Stager研究(上)
-
红队工具研究篇 - SliverC2 Stager研究(下)
-
https://github.com/BishopFox/sliver-gui
Sliver 对比 CS
- sliver 支持 linux 系统
- beacon 通过指定参数实现沙箱绕过
- 支持多种协议并存通信
- 隐蔽性比 cs 要好
- 红队C2工具Sliver(一)| Sliver和CS及MSF的对比
3.1.2 CS Beacon流量分析
参考文章:
- Cobaltstrike4.0 学习——验证机制学习
- Cobaltstrike4.0 学习——http分阶段stagebeacon上线流量刨根问底
- 反制Cobaltstrike的那些手段
流量规避
- 定制 profile
- Cobalt Strike 的 ExternalC2
- 随机生成 profile,使用项目https://github.com/threatexpress/random_c2_profile
直接使用脚本生成随机的 profile 配置文件
在 CS 的 TeamServer 直接使用配置文件启动
免杀上线
-
shellcode 加载器(实现较为简单,需要学习cs shellcode)
推荐使用项目:https://github.com/Techryptic/Pokemon-Shellcode-Loader
可以对 shellcode 进行编码从而绕过静态检测
-
自写 cs beacon(只实现基础功能较为简单,但是cs功能较多,高级功能实现困难)
- https://github.com/darkr4y/geacon Geacon代码学习&上线指南
- https://github.com/mai1zhi2/SharpBeacon
3.1.3 C2 魔改
c2 的魔改指 c2 进行破解和功能改造,4.7及以上的版本对于防破解做了很多改变,不再是双端共用了,服务端的二进制文件无疑是加大了破解难度,针对 cs 代码的学习可以参考 4.5 版本代码使用双端 java 容易理解
Cobalt Strike系列|从0开始破解
3.1.4 C2 隐匿
参考文章:
- 红队攻防基础建设—神隐之路
- C2 基础设施威胁情报对抗策略
- APT级CS隐藏教程:使用反向代理、C2-Profile和CDN拉满溯源难度
常用的几种方法:
- 更改端口和证书
- 更改 c2 默认配置
- 使用 Profile 与 CDN
接下来演示使用 CDN 域前置隐藏 C2
首先,需要有一个域名去接入 Cloudflare,域名可以去 Godaddy 或 namesilo 购买
-
更改域名 NS Server 到 Cloudflare
配置 DNS 的 A 记录,解析到 VPS 的 IP,后续上线用
-
修改 cs profile 中的值,共有四处:
- https-certificate 块中更改 keystore 和密码
- http-stager、http-get、http-post 块中的 Host Header
-
保存修改,然后准备我们的keystore。因为接入了CDN,所以证书我推荐直接使用Cloudflare提供的证书。CDN的坑会在下面讲。当然要是没有接入CDN的打算,可以使用letsencrypt这样的免费证书。
使用默认配置生成证书和秘钥后,复制粘贴到你的服务器上,这里我选择的文件名是server.pem和server.key。
# 这里cdn.xxx.club是我的域名 openssl pkcs12 -export -in server.pem -inkey server.key -out cdn.xxx.club.p12 -name cdn.xxx.club -passout pass:123456 keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore cdn.xxx.club.store -srckeystore cdn.xxx.club.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias cdn.xxx.club
在生成keystore文件后将该文件放在CS的根目录下,务必确保keystore文件名与密码和https-certificate中设置的一致。
在一切准备就绪后可以使用CS自带的c2lint对profile语法进行检查,没有报错的话说明配置是ok的。
./c2lint jquery-c2.4.3.profile
需要注意的是免费版的Cloudflare对代理的端口有限制。我们只能成如下端口:
- http:80、8080、8880、2052、2082、2086、2095
- https:443、2053、2083、2087、2096、8443
3.1.5 C2 准入
- https://github.com/D00Movenok/BounceBack
- https://mp.weixin.qq.com/s/0oxXMeAnmQ5uMeby01tFxA
- C2 前端流量控制工具 - RedGuard
- 基于Caddy实现的C2前置代理 - RedCaddy
RedGuard,是一款 C2 设施前置流量控制技术的衍生作品,有着更加轻量的设计、高效的流量交互、以及使用 go 语言开发具有的可靠兼容性。它所解决的核心问题也是在面对日益复杂的红蓝攻防演练行动中,给予攻击队更加优秀的 C2 基础设施隐匿方案,赋予 C2 设施的交互流量以流量控制功能,拦截那些“恶意”的分析流量,更好的完成整个攻击任务
RedGuard是一个 C2 设施前置流量控制工具,可以避免 Blue Team,AVS,EDR,Cyberspace Search Engine的检查
应用场景
- 攻防演练中防守方根据态势感知平台针对C2交互流量的分析溯源
- 根据 JA3 指纹库识别防范云沙箱环境下针对木马样本的恶意分析
- 阻止恶意的请求来实施重放攻击,实现混淆上线的效果
- 在明确上线服务器IP的情况下,以白名单的方式限制访问交互流量的请求
- 防范网络空间测绘技术针对 C2 设施的扫描识别,并重定向或拦截扫描探针的流量
- 支持对多个 C2 服务器的前置流量控制,并可实现域前置的效果实现负载均衡上线,达到隐匿的效果
- 能够通过请求IP反查API接口针对根据 IP 地址的归属地进行地域性的主机上线限制
- 在不更改源码的情况下,解决分阶段 checksum8 规则路径解析存在的强特征。
- 通过目标请求的拦截日志分析蓝队溯源行为,可用于跟踪对等连接事件/问题
- 具有自定义对样本合法交互的时间段进行设置,实现仅在工作时间段内进行流量交互的功能
- Malleable C2 Profile 解析器能够严格根据 malleable profile 验证入站 HTTP/S 请求,并在违规情况下丢弃外发数据包(支持Malleable Profiles 4.0+)
- 内置大量与安全厂商相关联的设备、蜜罐、云沙箱的 IPV4 地址黑名单,实现自动拦截重定向请求流量
- 可通过自定义工具与样本交互的 SSL 证书信息、重定向 URL,以规避工具流量的固定特征
安装
可以直接下载并使用已经编译好的版本,也可以远程下载go包进行自主编译执行。
git clone https://github.com/wikiZ/RedGuard.git
cd RedGuard
# 也可以使用upx压缩编译后的文件体积
go build -ldflags "-s -w" -trimpath
# 赋予工具可执行权限,并进行初始化操作
chmod +x ./RedGuard&&./RedGuard
配置说明
初始化,如下图,首先对 RedGuard 赋予可执行权限并进行初始化操作,第一次运行会在当前用户目录下生成配置文件,以实现灵活的功能配置,配置文件名:.RedGuard_CobaltStrike.ini
配置文件
重点关注 3 个配置
- PORT_HTTPS
- PORT_HTTP
- HostTarget
如上图,当前配置的意思是将 Port_http 的 80 端口绑定到本机 127.0.0.1 的 8080 端口,当有请求访问服务器的 80 端口,RedGuard 会对请求特征做判断,当请求不符合规则 (及 host 头不是 360.net,这个可以随意设置),请求会被重定向到 https://360.net,否则请求会被转发到 cs 的监听端口 8080 端口。请求会不会被重定向取决于 DROP 参数,如 DORP 参数设置为 true 将直接丢弃请求包
同理 ,443 端口被绑定到本机 127.0.0.1 的 8443 端口,当请求不符合规则时将请求重定向到 https://360.net,当 host 头为 360.com 时将请求转发到 cs 的 8443 监听端口,主要取决于你 cs 的监听器是 http 还是 https
更多设置,如过滤上线 ip、上线时间、上线省份请参考作者官方文档 RedGuard 文档
当然,这种场景适合将反代和 cs 服务器建在同一台机器上,比较节省资源,配合 iptables 可防止网络空间搜索引擎将你的服务器标记
工具使用
如果直接对反向代理的端口进行访问,则会触发拦截规则,这里通过输出的日志可以看到客户端请求根目录,但是因为其请求过程未带有请求的凭证,也就是正确的 HOST 请求头所以触发了基础拦截的规则,流量被重定向到了https://360.net
CS 配置监听器
以 https 监听器为例:cs 新建监听,c2 端口设置为 RedGaurd 的反代端口,bind 设置为 cs 的监听端口,注意 host header 可以随意设置,但一定要和配置文件里的一致
再配置 IPtables,只允许 127.0.0.1 访问本机的 8443 端口
iptables -I INPUT -p tcp --dport 8443 -j DROP #丢弃所有访问8443端口的包
iptables -I INPUT -p tcp -s 127.0.0.1 --dport 8443 -j ACCEPT #只允许127.0.0.1访问本机的8443端口
3.2 自研 C2 Demo
3.2.1 实现
构建一个简单的远控木马需要编写三个独立的部分:植入程序、服务端程序和管理程序
- 植入程序是运行在目标机器上的远控木马的一部分。植入程序会定期轮询服务器以查找新的命令,然后将命令输出发回给服务器
- 管理程序是运行在用户机器上的客户端,用于发出实际的命令
- 服务端则负责与植入程序和客户端的交互,接收客户端的指令,并在植入程序请求时,将命令发送给植入程序,随后将植入程序发送来的结果传递给客户端
项目结构
构造定义gRPC API
使用 Protobuf 作为数据传输格式,Protobuf 是一种与语言无关、与平台无关,是一种可扩展的用于序列化和结构化数据的方法,常用于用于通信协议,数据存储等
- ProtoBuf 是一种序列化数据结构的协议
- protoc 是一个能把 proto 数据结构转换为各种语言代码的工具
- RPC 是一种 通信协议
- gRPC是一种使用 ProtoBuf 作为接口描述语言的一个 RPC 实现方案
protobuf 可以把结构体序列化成二进制,也可以把对应二进制反序列化回结构体。说白了 pb 单纯就是做编解码。你可以把你程序中的一些对象用 pb 序列化,然后存到本地文件,过一会儿再读取文件,然后恢复出那些对象
Service
在 proto 文件中定义了两个service,分别对应植入程序服务端和管理程序服务端
在植入程序服务中,定义了三个方法FetchCommand、SendOutput和GetSleepTime
FetchCommand:将从服务器检索所有为执行的命令
SendOutput:会将一个Command消息发送服务器
GetSleepTime:从服务端检索sleep时间间隔
在管理程序服务中,定义的两个方法RunCommand和SetSleepTime
RunCommand:接收一个Command消息作为参数,并期望获读回一个Command消息
SetSleepTime:向服务器发送一个SleepTime消息作为时间间隔
Message
最后看到定义的三个message:Command、SleepTime和Empty
Command:消息中的两个参数分别代表了输入的命令和命令对应的结果。都为string类型,要说明的是后面两个数字是代表了消息本身两个字段出现的偏移量,也就是In将首先出现,然后是Out
SleepTime:唯一 一个字段就是用来标明休眠时间间隔的
Empty:用来代替null的空消息 定义这个Empty类型是由于gRPC不显式地允许空值
protobuf 文件如下,其中
syntax = "proto3";
package grpcapi;
option go_package = "./grpcapi";
service Implant {
rpc FetchCommand (Empty) returns (Command);
rpc SendOutput (Command) returns (Empty);
rpc GetSleepTime(Empty) returns (SleepTime);
}
service Admin {
rpc RunCommand (Command) returns (Command);
rpc SetSleepTime(SleepTime) returns (Empty);
}
//Command消息包含两个字段,一个用于维护操作系统的命令;一个用于维护命令执行的输出
message Command {
string In = 1;
string Out = 2;
}
message SleepTime {
int32 time = 1;
}
//Empty 用来代替null的空消息 定义这个Empty类型是由于gRPC不显式地允许空值
message Empty {
}
生成对应的 go 文件
-
Windows 安装 protoc
protoc 下载:[官方下载地址],然后将 bin 路径添加到 path 环境变量下去
-
安装 protoc-gen-go 插件
# 需要 GOOS=linux,可以使用命令 go env -w GOOS=linux,确保生成的是 EXE 可执行文件 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
将生成的 exe 文件放到 $GPATH/bin 目录下,确保可以直接访问执行
-
编译 Proto 文件
对于Golang使用如下命令编译
.proto
文件。会根据你的.proto
文件生成Go文件这个生成的新文件回包含Protobuf模式中创建的服务和消息的结构和结构体定义。后续将利用它构造服务端、植入程序和客户端
protoc --go_out=./ --go-grpc_opt=require_unimplemented_servers=false --go-grpc_out=./ implant.proto
Server端
首先,创建两个结构体adminServer
和implantServer
,它们都包含两个 Command 通道,用于发送和接收命令以及命令的输出。这两个结构体会实现 gRPC API 中定义的服务端接口。并且需要为这两个结构体定义辅助函数NewAdminServer
和NewImplantServer
,用于创建新的实例,可以确保通道正确的初始化
implantServer
对于植入程序服务端,需要实现的方法有FetchCommand()
、SendOutput()
和GetSleepTime()
-
*FetchCommand:*植入程序将调用方法 FetchCommand 作为一种轮询机制,它会询问“有工作给我吗?”。在代码中,将根据select语句,当 work 通道中有数据时会从中读取数据到实例化的 Command 中,并返回。如果没有读取到数据,就会返回一个空的 Command
-
*SendOutput:*将接收一个 Command,其中包含了从植入程序中获取的命令执行的结果。并将这个 Command 推送到 output 通道中,以便管理程序的后续读取
-
GetSleepTime:植入程序在每次sleep之前就会调用此方法,向服务端询问sleep的时间。这个方法将返回从变量sleepTIme中读取到的数据
adminServer
对于管理程序服务端,需要实现的方法有RunCommand
和SetSleepTime
*RunCommand:*该方法接收一个尚未发送到植入程序的 Command,它表示管理程序希望在植入程序上执行的工作。并将工作发送给 work 通道。因为使用无缓冲的通道,该操作将会阻塞程序的执行,但同时又需要从 output 通道中接收数据,因此使用 goroutine 将工作放入 work 通道中
调用这个方法时,会将命令发送给服务端,并等待植入程序执行完后的发送回的结果
*SetSleepTime:*管理程序客户端调用此方法,将从命令行输入的时间发送给服务端后,设置到 sleepTIme 变量中
Implant端
使用 grpc 通道连接 Server 端,每过 sleep 时间轮询 FetchCommand 一次获取要执行的命令,负责具体命令的实现,支持截图、文件上传、文件下载功能
-
截图功能借助于
github.com/kbinani/screenshot
实现植入端获取到截图命令后,会先获取当前屏幕的数量,并根据顺序进行截图,并将图片存放到
[]byte
字节切片中,进行加密编码后发出 -
上传文件,要求输入的格式为
upload 本地文件 目标文件
管理程序会根据输入的本地文件,将本地文件读取到
[]byte
字节切片当中,并进行AES加密和BASE64编码。也就是说最终向服务端传递的数据将变成经过加密、编码后的字符串。这里会将这个字符串存放在Command.Out中。这里可能游戏额难以理解,command.Out不是用来存放执行结果的吗?其实在服务端中,会将管理程序客户端的命令放到work中,然后将植入程序执行完以后会才会将结果封装在command.Out,而在这之前command.Out是空的。这里上传文件实际上是在管理程序客户端时“借用”command.Out的位置,将要上传的数据与上传命令一起发送给植入程序 -
下载文件, 要求输入的格式为
download 目标文件 本地文件
客户端将下载命令发送给服务端。客户端会从
cmd.out
中读取到数据后解密,并根据用户输入的本地文件写入文件
Clinet端
Client 端通过连接 Server 端后发送命令,获取命令执行结果
编码问题
go 的编码是 UTF-8,而 CMD 的活动页是 GBK 编码的,因此使用 GoLang 进行命令执行时,对于命令执行结果返回的中文会产生乱码的现象
虽然在植入程序中会执行命令,但是在通过植入程序再向服务端发送结果时由于包含乱码,植入程序向服务端发送的数据为空。(因此服务端就没有接收这个数据),result 中没有数据,所以植入程序的服务端在向 output 输入数据时会阻塞。由于管理服务端和植入程序服务端共享通道,output 中没有数据,进而引发管理服务端也阻塞(直到 output 中有数据)
中文乱码问题的解决依赖于golang.org/x/text/encoding/simplifiedchinese
当然在解决掉乱码问题后,这一问题也就消失了
流量加密
管理程序客户端获取到用户从命令行键入的命令,将对这个命令进行 base64+aes 加密,再发送给服务端。服务端接收到这个消息后,直接将消息写入通道中
待植入程序客请求服务端时,就会读取到这段密文,进行解密后执行命令,并将执行的结果进行加密发送给服务端。最终管理程序会从结果通道中读取到执行的结果,解密后并进行编码格式的转变,输出到控制台
3.2.2 使用
server:运行在服务端,通过参数iport和aport指定植入程序和客户端对应的端口号
server.exe -iport 1961 -aport 1962
-aport int
Admin server port (default 1962)
-iport int
Implant server port (default 1961)
client
client.exe -session start -IP 127.0.0.1 -port 1962 -sleep 5
-ip string
Server IP (default "127.0.0.1")
-port int
AdminServer Port (default 1962)
-session string
start session
-sleep int
sleep time
截图以png格式保存client.exe运行目录下
上传、下载文件大小限制在10MB内
截图: screenshot
上传: upload 本地文件 目标文件
下载: download 目标文件 本地文件
编译命令
# windows 交叉编译
go env -w CGO_ENABLED=0
go env -w GOOS=linux
go build -ldflags "-s -w" -trimpath -o output.exe
3.3 另类 “C2”
- 云上天然cs远控
- 集权设备既c2
- intel 相关工具:V Pro,Intel AMT
四、T1588.002 其他工具
4.2 隧道工具
4.1.1 FRP
在 frp 使用时开启 tls_enable 参数、use_compression 参数可以视情况而定
-
在开启 use_encryption = true 参数之后,基础特征以及源 ip 地址没有被加密,目的地址和代理的口令被加密了
-
在开启了 tls 加密之后 内容变成加密的了,tls_enable = true,建立链接的时候第一个字节为0x17
特征修改
-
修改连接时的交互信息
注释写的很清楚,当 frpc 即客户端建立连接时,会发送以下信息给服务端
将其任意修改为其它信息即可
源 IP 信息修改
-
修改版本信息 pkg/util/version/version.go
-
修改 tls 首字节
修改 pkg/util/net/tls.go 文件中 FRPTLSHeadByte 参数的值
运行后删除配置文件
frp 原来使用 -c 参数指定 ini 文件来运行,但是 ini 配置文件中直接泄露了我们 vps 的地址,非常的不安全,有以下几种方法实现
1.加上命令行参数
这种查命令其实还是容易被发现,需要再加一层参数加解密
2.远程加载配置文件
这样需要通过域名或者 ip 解析远程加载,也需要花时间隐藏
3.执行后删除 frpc.ini
这种方法比直接在源码中写死更灵活,也能很有效的隐藏
直接使用第三种方法,在 frpc\sub\root.go 文件 init 方法中添加一个参数,false 表示默认不删除,加 -d 参数删除
在 startService 函数下添加删除函数
重新编译
交叉编译设置&&编译
常见的系统、架构:常见系统及架构_123hello123的博客-CSDN博客禁用CGO
set CGO_ENABLED=0
设置目标平台为linux / windows
set GOOS=windows # go env -w GOOS=linux
设置目标处理器架构是amd64
set GOARCH=amd64
编译frps.exe
go build -trimpath -ldflags "-s -w" -buildvcs=false -o bin/frps.exe ./cmd/frps
编译frpc.exe
go build -trimpath -ldflags "-s -w" -buildvcs=false -o bin/frpc.exe ./cmd/frpc
参考文章:
- 【神兵利器】手把手教你魔改frp
- FRP改造计划
- 其他:加壳再改特征
4.3 协同平台
认证方式:401 认证 + 网页登录密码认证
攻防演练过程中团队协同面临以下几点考验
- 部分队员被"隔离",信息同步困难
- 涉及大量企业敏感信息,在互联网平台存储存在安全风险
经过综合对比几款开源的团队协同平台
名称 | 链接 | 优点 | 缺点 |
---|---|---|---|
EtherPad | https://github.com/ether/etherpad-lite | 界面简洁,具备基础功能,插件丰富 | 不能上传文件,聊天功能太过弱化不能上传图片 |
Collaborative-Platform | https://github.com/zach-xing/Collaborative-Platform | 最符合需求 | 没有开源,文档不全,产品化程度低,需要引用阿里云oss存储 |
hedgedoc | https://github.com/hedgedoc/hedgedoc | md文档编辑器 | 没有聊天功能 |
4.5 快速部署
- 红/蓝队环境自动化部署工具
- QAX-A-Team/LuWu 红队基础设施自动化部署工具
有价值的星球:
- 攻击队之家
- 漏洞百出,代码审计,赛博回忆录
- 黑客在思考和他的朋友们
- dot net安全矩阵