Go 免杀与反调试
2022-9-14 09:10:36 Author: 编码安全研究(查看原文) 阅读量:52 收藏

0x00 前言

在前面两篇文章从零开始开发CS beacon(三)和从零开始开发CS BEACON(四)--DNSBEACON实现了改造Geacon高度自定义木马。但是在我们实战中,这还差最重要的一步:杀软对抗,本节会介绍几种常见Go的免杀小技巧。

0x01 Go免杀

1.源码编译

Go语言中使用 go build 命令主要用于编译代码。在包的编译过程中,若有必要,会同时编译与之相关联的包。go build 有很多种编译方法,如无参数编译、文件列表编译、指定包编译等,使用这些方法都可以输出可执行文件。

其运行机制是通过runtime这个库实现与操作内核系统交互的。Go 自己实现了runtime,并封装了syscall,为不同平台上的go user level代码提供封装完成的、统一的go标准库。go为了不依赖第三方库直接可运行,会将依赖库一起编译进二进制文件导致整个文件变大。

为了绕过杀软检测和符合系统版本,通常采用如下编译方式:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-w -s -H windowsgui" -o out.exe

CGO_ENABLED:默认为1,设置为0 后表示使用纯静态编译。

ldflags参数,-w -s通常用在 App 链接阶段和 Go 编译阶段-ldflags指令结合使用 (参见 Go 命令文档)。

-w:在编译的时候会附带很多debug头的部分如下:

30.png

加上此参数的时候会删除.zdebug调试部分,通过对顶部低位(Off 列)地址相减,达到减小二进制文件大小的目的。

-s:此标志与w参数相似,但是此参数不仅删除了调试信息,同时还删除了指定的符号表。

-H windowsgui:此参数为了隐藏CMD窗口。

2.32 位压缩

这里为什么会说32位呢?因为我们在内网渗透中,虽然大多数的主机或服务器都是64位,但有时候就会有32位的系统,以及某些漏洞的RCE只能使用32位的漏洞,所以我们在开发木马的时候,可以编译成32位保证了对系统的兼容性。但是32位二进制程序,内存地址小,容易动态扫描到payload等弊端。go使用32位编译只需要设置GOARCH=386

由于考虑到某些机构/公司电脑老久,系统可能是win2003及xp系统(传统行业超多),那我们还要go支持XP上运行。但是go在某个版本之后就不在支持xp上运行了,当使用新版本编译的程序,在xp上运行会报错。所以需要手动安装go1.10.8版本,大家也可以尝试将现在流行的代理工具,扫描工具,都使用此版本编译:)

尽管32位程序体积会比64位小点,但是依然体积庞大,在我们要通过CS上传的时候,时间会比较久,特别当你是通过dns隧道上线的时候,根据对方dns网络情况,延迟过高,最好不用尝试大文件的上传。常见的二进制压缩UPX,会把程序压缩到很小,其中会带上UPX特征,容易被杀软检测,但是公司正常可能也会使用此压缩工具。我们可以在github或者其他途径找到,压缩32位的方式。比如如下32位压缩项目:

Packer:https://github.com/Eronana/packer

3.Go Path

在go 编译的时候,自带一堆信息,比如路径地址,代码命名等,通过这些信息基本可以还原Go的源码架构。比如在程序运行出错时,会有报错信息,打印时打印了文件名,panic抛出错误的时候堆栈的文件名也抛出了,可以想象Go编译的二进制程序内部肯定有个数据结构存储了这些信息。如下项目,分析了go中编译时带有的路径,调试信息等,以及怎么去除。

Github 项目地址: https://github.com/boy-hack/go-strip

0x02 代码签名

在杀软对抗中,通过对生成的程序进行签名,是非常有效的方法。经过多次实战验证,当你有一个合法的证书签名,杀软就会直接放过我们的软件,比如前段时间的nvidia代码泄露,导致签名算法泄露,最终被人利用其签名恶意软件。

  1. 窃取到合法并且被杀软认可的证书进行签名。

  2. windows 漏洞CVE-2020-0601漏洞位于Window的加密组件CryptoAPI。CryptoAPI是微软提供给开发人员的Windows安全服务应用程序接口,可用于加密的应用程序,实现数据加密、解密、签名及验证等功能。由Crypt32.dll提供的Microsoft Windows CryptoAPI无法以正确验证ECC证书的信任链。攻击者可以利用该漏洞伪造受信任的根证书签发证书。ECC椭圆曲线加密(Elliptic curve cryptography)于1985年由Neal Koblitz和Victor Miller分别独立提出的公钥密码算法。

  3. CarbonCopy:https://github.com/paranoidninja/CarbonCopy

    创建任何在线网站的欺骗证书并签署 AV Evasion 可执行文件的工具。此项目通过获取网站比如baidu的ssl证书,复制其的颁发者,版本等证书信息,创建本地证书后进行签名。在右键查看证书的时候,会看见跟ssl证书一样的信息,但是校验证书肯定是不对的。

  4. Skrull:https://github.com/aaaddress1/Skrull

可防止 AV/EDR 自动提交样本和内核签名扫描。它使用 Process Ghosting技术生成可以在受害者身上运行恶意软件的启动器。此外,启动器完全是反复制的,并且在提交时自然会损坏。主要通过hook代码签名扫描函数,防止扫描。

0x03 总结

从杀软对抗方面,这里只介绍到了静态免杀的部分方式,了解go的编译特性隐藏代码信息,基于xp系统编译32位的系统,然后加入反调试,比如判断当前环境的基础信息是否”正常“,基本都能绕过国内大多数杀软的静态免杀。最后基于数字证书签名的方式,比较通用的免杀方式,除了上面介绍的4个代码签名项目,也从github找到泄露的合法数字证书,但这个大多是个人的数字证书,并没有企业的证书可信好用。

项目地址:https://github.com/Nan3r/checkgo

原文链接:https://www.freebuf.com/sectool/331905.html

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2NDY1MDc2Mg==&mid=2247495539&idx=2&sn=e0fab385c70617dae1c452edabb777ae&chksm=ce64bc16f9133500822640c5e883fe5887f13c9546402aaf0d6f2fa45bc2dae86bab71f90d70#rd
如有侵权请联系:admin#unsafe.sh