Golang 的字符编码与 regexp
最近在使用 Golang 的 regexp 对网络流量做正则匹配时,发现有些情况无法正确进行匹配,找到资料发现 regexp 内部以 UTF-8 编码的方式来处理正则表达式,而网络流量是字节序列,由其中的非 UTF-8 字符造成的问题。
我们这里从 Golang 的字符编码和 regexp 处理机制开始学习和分析问题,并寻找一个有效且比较通用的解决方法,本文对此进行记录。
最近在使用 Golang 的 regexp 对网络流量做正则匹配时,发现有些情况无法正确进行匹配,找到资料发现 regexp 内部以 UTF-8 编码的方式来处理正则表达式,而网络流量是字节序列,由其中的非 UTF-8 字符造成的问题。
我们这里从 Golang 的字符编码和 regexp 处理机制开始学习和分析问题,并寻找一个有效且比较通用的解决方法,本文对此进行记录。
构建高效平台型C2的经验总结
在红队演习中,C2(指挥与控制,Command & Control)系统作为关键的基础设施,对行动的成功起着至关重要的作用。随着攻防技术的不断进化,一些C2工具因其卓越性能和适应性而获得了广泛的认可。然而,面对日益先进的防御机制,红队成员通常需要对这些工具进行定制化开发和优化,以满足特定任务的需求。
本文将深入探讨一种基于在线平台的C2架构设计,该架构旨在通过实践构建一个具有更强隐蔽性和持久性的自研C2系统。我们将介绍如何利用在线服务的特点,来创建一个既能在复杂网络环境中保持低调运行,又能有效支持红队操作的指挥控制系统。
常见C2架构介绍
在国内,商用化的C2(指挥与控制,Command & Control)解决方案相对稀缺,因此红队和安全研究人员更多依赖于开源的C2框架,如Havoc、Sliver、Mythic等,或是对商业化的C2工具(例如Cobalt Strike、BRC4、Nighthawk C2等)进行破解或二次开发。这些工具虽然来源不同,但它们在通信原理上却有着相似之处,普遍采用HTTP、HTTPS、DNS等标准互联网协议来实现攻击者与受控目标之间的通信。
典型的C2操作流程包括:首先,在一台VPS(虚拟专用服务器)上部署TeamServer作为中央控制节点;然后,攻击者通过本地客户端连接到该TeamServer;最后,生成并部署恶意软件,使其回连至TeamServer,从而建立命令与控制通道。这种架构允许攻击者远程执行命令、管理植入物,并接收从受控系统中提取的数据。
我们来分析implant(植入体)在整个过程中到底做了什么
Implant首先需要与部署在VPS上的TeamServer建立一个安全、可靠的通信通道。这通常通过HTTP、HTTPS或DNS等标准协议实现,以确保数据传输的隐蔽性和稳定性。
Implant启动后,会立即收集目标主机的基础信息,如操作系统版本、网络配置、用户名等,这些信息统称为元数据(Metadata)。收集完成后,Implant会将这些元数据发送回TeamServer,标志着该主机已成功上线,可供进一步操作。
为了减少被检测的风险,Implant通常会在完成初始通信后进入休眠状态。这种设计使得Implant在非活跃状态下几乎不产生任何网络流量,从而降低了被发现的可能性。
命令控制的方式一般分为会话模式(Session Mode)和信标模式(Beacon Mode),在会话模式下,Implant与TeamServer之间保持持续的连接,允许攻击者即时下发指令并接收响应。这种方式虽然提供了无延迟的交互体验,但由于其持续的网络活动,更容易被防御系统识别。信标模式是更为隐蔽且常用的方式。Implant在休眠一段时间后,定期向TeamServer发起请求,检查是否有新的命令。信标模式通过间歇性的通信减少了连续的网络流量,显著降低了被检测的风险。
implant在休眠结束后,需要从TeamServer接收到命令(例如,shell whoami),它会解析并执行该命令(这里实际上不是接收命令,而是去请求获取命令,implant的所有操作和执行结果都是通过请求的方式进行单向访问)。执行完毕后,Implant会将结果封装并通过相同的通信通道发送回TeamServer。随后,再次进入休眠状态,等待下一次唤醒周期的到来。
这一过程是循环进行的,Implant根据设定的时间间隔或特定条件不断重复上述步骤,确保能够及时响应来自TeamServer的新指令,并将执行结果反馈给攻击者。
深入了解植入体的工作流程后,我们可以认识到它在C2架构中占据着至关重要的位置。因此,在进行C2系统的武器开发时,必须将更多资源和精力投入到植入体的设计与优化中。开发过程中,应尽量避免使用第三方库和直接调用Windows API,转而采用自研代码和内置功能,以减少攻击面并提高隐蔽性。同时,持续优化植入体的核心逻辑,确保其轻量化、高效运行,从而在复杂的网络环境中具备更强的对抗能力。这种策略不仅提升了植入体的稳定性和隐蔽性,还增强了整个C2系统的实战效能。
在红队演习中,C2(指挥与控制,Command & Control)系统作为关键的基础设施,对行动的成功起着至关重要的作用。随着攻防技术的不断进化,一些C2工具因其卓越性能和适应性而获得了广泛的认可。然而,面对日益先进的防御机制,红队成员通常需要对这些工具进行定制化开发和优化,以满足特定任务的需求。
本文将深入探讨一种基于在线平台的C2架构设计,该架构旨在通过实践构建一个具有更强隐蔽性和持久性的自研C2系统。我们将介绍如何利用在线服务的特点,来创建一个既能在复杂网络环境中保持低调运行,又能有效支持红队操作的指挥控制系统。
常见C2架构介绍
在国内,商用化的C2(指挥与控制,Command & Control)解决方案相对稀缺,因此红队和安全研究人员更多依赖于开源的C2框架,如Havoc、Sliver、Mythic等,或是对商业化的C2工具(例如Cobalt Strike、BRC4、Nighthawk C2等)进行破解或二次开发。这些工具虽然来源不同,但它们在通信原理上却有着相似之处,普遍采用HTTP、HTTPS、DNS等标准互联网协议来实现攻击者与受控目标之间的通信。
典型的C2操作流程包括:首先,在一台VPS(虚拟专用服务器)上部署TeamServer作为中央控制节点;然后,攻击者通过本地客户端连接到该TeamServer;最后,生成并部署恶意软件,使其回连至TeamServer,从而建立命令与控制通道。这种架构允许攻击者远程执行命令、管理植入物,并接收从受控系统中提取的数据。
我们来分析implant(植入体)在整个过程中到底做了什么
Implant首先需要与部署在VPS上的TeamServer建立一个安全、可靠的通信通道。这通常通过HTTP、HTTPS或DNS等标准协议实现,以确保数据传输的隐蔽性和稳定性。
Implant启动后,会立即收集目标主机的基础信息,如操作系统版本、网络配置、用户名等,这些信息统称为元数据(Metadata)。收集完成后,Implant会将这些元数据发送回TeamServer,标志着该主机已成功上线,可供进一步操作。
为了减少被检测的风险,Implant通常会在完成初始通信后进入休眠状态。这种设计使得Implant在非活跃状态下几乎不产生任何网络流量,从而降低了被发现的可能性。
命令控制的方式一般分为会话模式(Session Mode)和信标模式(Beacon Mode),在会话模式下,Implant与TeamServer之间保持持续的连接,允许攻击者即时下发指令并接收响应。这种方式虽然提供了无延迟的交互体验,但由于其持续的网络活动,更容易被防御系统识别。信标模式是更为隐蔽且常用的方式。Implant在休眠一段时间后,定期向TeamServer发起请求,检查是否有新的命令。信标模式通过间歇性的通信减少了连续的网络流量,显著降低了被检测的风险。
implant在休眠结束后,需要从TeamServer接收到命令(例如,shell whoami),它会解析并执行该命令(这里实际上不是接收命令,而是去请求获取命令,implant的所有操作和执行结果都是通过请求的方式进行单向访问)。执行完毕后,Implant会将结果封装并通过相同的通信通道发送回TeamServer。随后,再次进入休眠状态,等待下一次唤醒周期的到来。
这一过程是循环进行的,Implant根据设定的时间间隔或特定条件不断重复上述步骤,确保能够及时响应来自TeamServer的新指令,并将执行结果反馈给攻击者。
深入了解植入体的工作流程后,我们可以认识到它在C2架构中占据着至关重要的位置。因此,在进行C2系统的武器开发时,必须将更多资源和精力投入到植入体的设计与优化中。开发过程中,应尽量避免使用第三方库和直接调用Windows API,转而采用自研代码和内置功能,以减少攻击面并提高隐蔽性。同时,持续优化植入体的核心逻辑,确保其轻量化、高效运行,从而在复杂的网络环境中具备更强的对抗能力。这种策略不仅提升了植入体的稳定性和隐蔽性,还增强了整个C2系统的实战效能。
PyPI 中潜在的远程代码执行
PyPI 存储库的 GitHub Actions 中存在一个漏洞,该漏洞允许恶意拉取请求执行任意命令。
这允许攻击者获取存储库的写入权限,从而导致在 pypi.org 上执行任意代码。
PyPI 是 Python 的包管理器 ( ) 使用的包注册表pip,在运行 等命令时会引用它pip install [package name]。
许多项目(包括Flask和TensorFlow)都在间接使用 PyPI。
从上面的代码片段可以看出,它使用list_objects_v2带有prefix参数的函数来获取要删除的对象。
并将用户拥有的项目的名称传递到prefix参数中。
这意味着如果有人删除了名为 的项目中的遗留文档examp,它将删除名称以 开头的项目的文档examp(example例如exampleasdf)
PyPI 存储库的 GitHub Actions 中存在一个漏洞,该漏洞允许恶意拉取请求执行任意命令。
这允许攻击者获取存储库的写入权限,从而导致在 pypi.org 上执行任意代码。
PyPI 是 Python 的包管理器 ( ) 使用的包注册表pip,在运行 等命令时会引用它pip install [package name]。
许多项目(包括Flask和TensorFlow)都在间接使用 PyPI。
从上面的代码片段可以看出,它使用list_objects_v2带有prefix参数的函数来获取要删除的对象。
并将用户拥有的项目的名称传递到prefix参数中。
这意味着如果有人删除了名为 的项目中的遗留文档examp,它将删除名称以 开头的项目的文档examp(example例如exampleasdf)
Cloudflare 的 cdnjs 中存在远程代码执行
cdnjs是 Cloudflare 旗下的一个 JavaScript/CSS 库 CDN,截至 2021 年 7 月 15 日,互联网上 12.7% 的网站都在使用它。这是继 12.8% 2的Google Hosted Libraries
之后使用范围第二广的库 CDN ,考虑到目前的使用率,它将在不久的将来成为使用最广泛的 JavaScript 库 CDN。
自动更新功能通过下载用户管理的 Git 存储库 / npm 包并从中复制目标文件来更新库。
并且 npm 注册表将库压缩到 中.tgz以使其可下载。
由于这个自动更新工具是用 Go 编写的,我猜测它可能使用 Go 的compress/gzip和archive/tar来提取存档文件。Go
的archive/tar返回存档中包含的文件名而不进行清理3,因此如果根据从 返回的文件名将存档提取到磁盘中archive/tar,则包含类似文件名的存档../../../../../../../tmp/test可能会覆盖系统上的任意文件。4从cdnjs/bot-ansible
中的信息,我知道有些脚本在定期运行,并且运行命令的用户对它们具有写权限,所以我专注于通过路径遍历覆盖文件。
cdnjs是 Cloudflare 旗下的一个 JavaScript/CSS 库 CDN,截至 2021 年 7 月 15 日,互联网上 12.7% 的网站都在使用它。这是继 12.8% 2的Google Hosted Libraries
之后使用范围第二广的库 CDN ,考虑到目前的使用率,它将在不久的将来成为使用最广泛的 JavaScript 库 CDN。
自动更新功能通过下载用户管理的 Git 存储库 / npm 包并从中复制目标文件来更新库。
并且 npm 注册表将库压缩到 中.tgz以使其可下载。
由于这个自动更新工具是用 Go 编写的,我猜测它可能使用 Go 的compress/gzip和archive/tar来提取存档文件。Go
的archive/tar返回存档中包含的文件名而不进行清理3,因此如果根据从 返回的文件名将存档提取到磁盘中archive/tar,则包含类似文件名的存档../../../../../../../tmp/test可能会覆盖系统上的任意文件。4从cdnjs/bot-ansible
中的信息,我知道有些脚本在定期运行,并且运行命令的用户对它们具有写权限,所以我专注于通过路径遍历覆盖文件。
mimikatz sekurlsa::pth底层原理
大家应该对NTLM SSP认证的Challenge / Response机制很熟悉,简单复习一下
NTLM的type3会有以下几种response:
•LM Response
•LMv2 Response
•NTLMv1 Response
•NTLMv2 Response
•NTLMv2 Session Response (NEGOTIATE_EXTENDED_SESSION_SECURITY )
这几种响应的计算都仅需要challenge和hash (v2会有额外的nonce)作为入参,于是就有了pass the hash这种攻击方式,LSASS和SAM中都存储着hash,攻击者拿到hash便可完成NTLM认证过程
大家应该对NTLM SSP认证的Challenge / Response机制很熟悉,简单复习一下
NTLM的type3会有以下几种response:
•LM Response
•LMv2 Response
•NTLMv1 Response
•NTLMv2 Response
•NTLMv2 Session Response (NEGOTIATE_EXTENDED_SESSION_SECURITY )
这几种响应的计算都仅需要challenge和hash (v2会有额外的nonce)作为入参,于是就有了pass the hash这种攻击方式,LSASS和SAM中都存储着hash,攻击者拿到hash便可完成NTLM认证过程
一开始通过此处上传doc文档的功能,发现了一枚XXE注入,提交后厂商进行修复,但复测后发现其修复的结果就是黑名单SYSTEM关键词,没办法通过带外通道读取敏感数据了~
抱着试一试的心态将Billion Laughs的Payload放入到doc文档中(这里与XXE doc文档制作方式一样修改[Content_Types].xml文件,重新打包即可)
抱着试一试的心态将Billion Laughs的Payload放入到doc文档中(这里与XXE doc文档制作方式一样修改[Content_Types].xml文件,重新打包即可)
HVV行动之某OA流量应急
写在前面
朋友在2021年HVV中作为防守方抓到了一段流量,刚开始没有太过于在意,随后在t00ls论坛中也发现了这段流量,随即觉得事情并不简单。
触发点
根据流量可以得知路由为/services%20/WorkflowServiceXml,我随即查看了该OA的web.xml。
发现了相关类为weaver.workflow.webservices.WorkflowServiceXml、weaver.workflow.webservices.WorkflowServiceImplXml。
关于类的东西先放到一旁,毕竟路由是否真实存在、%20有什么意义才是重点。我开始验证路由的存在。这里我测试了两个版本。
写在前面
朋友在2021年HVV中作为防守方抓到了一段流量,刚开始没有太过于在意,随后在t00ls论坛中也发现了这段流量,随即觉得事情并不简单。
触发点
根据流量可以得知路由为/services%20/WorkflowServiceXml,我随即查看了该OA的web.xml。
发现了相关类为weaver.workflow.webservices.WorkflowServiceXml、weaver.workflow.webservices.WorkflowServiceImplXml。
关于类的东西先放到一旁,毕竟路由是否真实存在、%20有什么意义才是重点。我开始验证路由的存在。这里我测试了两个版本。
接下来就是寻找gadget了。
由于并没有完整源码,只有部分github源码,不能确定gadget,先使用URLDNS试试。
组合我们的模板试试。
这里涉及到实体编码问题,作为懒人直接选择整体编码算了。
随后dnslog成功收到请求。
由于并没有完整源码,只有部分github源码,不能确定gadget,先使用URLDNS试试。
组合我们的模板试试。
这里涉及到实体编码问题,作为懒人直接选择整体编码算了。
随后dnslog成功收到请求。