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命令文档
https://golang.org/src/cmd/go/alldocs.go
`-w`:在编译的时候会附带很多debug头的部分如下:加上此参数的时候会删除`.zdebug` 调试部分,通过对顶部低位(Off 列)地址相减,达到减小二进制文件大小的目的。`-s` :此标志与w参数相似,但是此参数不仅删除了调试信息,同时还删除了指定的符号表。`-H windowsgui`:此参数为了隐藏CMD窗口。 这里为什么会说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位压缩项目:https://github.com/Eronana/packer
在go编译的时候,自带一堆信息,比如路径地址,代码命名等,通过这些信息基本可以还原Go的源码架构。 比如在程序运行出错时,会有报错信息,打印时打印了文件名,panic抛出错误的时候堆栈的文件名也抛出了,可以想象Go编译的二进制程序内部肯定有个数据结构存储了这些信息。如下项目,分析了go中编译时带有的路径,调试信息等,以及怎么去除。这里推荐使用项目2的工具,工具源码开源,且去除信息效果更好,更好帮助对原理的理解。https://github.com/boy-hack/go-strip
https://github.com/burrowers/garble
https://www.anquanke.com/post/id/263172
https://www.anquanke.com/post/id/264088
https://go.dev/src/cmd/
https://golang.org/src/cmd/go/alldocs.go
https://github.com/boy-hack/go-strip
https://github.com/burrowers/garble
在杀软对抗中,通过对生成的程序进行签名,是非常有效的方法。经过多次实战验证,当你有一个合法的证书签名,杀软就会直接放过我们的软件,比如前段时间的nvidia代码泄露,导致签名算法泄露,最终被人利用其签名恶意软件。 (2).CryptoAPI是微软提供给开发人员的Windows安全服务应用程序接口,可用于加密的应用程序,实现数据加密、解密、签名及验证等功能。由Crypt32.dll提供的Microsoft Windows CryptoAPI无法以正确验证ECC证书的信任链。攻击者可以利用该漏洞伪造受信任的根证书签发证书。ECC椭圆曲线加密(Elliptic curve cryptography)于1985年由Neal Koblitz和Victor Miller分别独立提出的公钥密码算法。 (3).创建任何在线网站的欺骗证书并签署 AV Evasion 可执行文件的工具。此项目通过获取网站比如baidu的ssl证书,复制其的颁发者,版本等证书信息,创建本地证书后进行签名。在右键查看证书的时候,会看见跟ssl证书一样的信息,但是校验证书肯定是不对的。https://github.com/paranoidninja/CarbonCopy
(4).可防止 AV/EDR 自动提交样本和内核签名扫描。它使用 **Process Ghosting** 技术生成可以在受害者身上运行恶意软件的启动器。此外,启动器完全是反复制的,并且在提交时自然会损坏。主要通过hook代码签名扫描函数,防止扫描。https://github.com/aaaddress1/Skrull
从杀软对抗方面,这里只介绍到了静态免杀的部分方式,了解go的编译特性隐藏代码信息,基于xp系统编译32位的系统,然后加入反调试,比如判断当前环境的基础信息是否”正常“,基本都能绕过国内大多数杀软的静态免杀。最后基于数字证书签名的方式,比较通用的免杀方式,除了上面介绍的4个代码签名项目,也从github找到泄露的合法数字证书,但这个大多是个人的数字证书,没有购买的企业证书可信好用。本人也写了个反沙箱调试的Go项目注:如有侵权请联系删除
文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2NDY1MDc2Mg==&mid=2247499586&idx=1&sn=e8bc7897e9e75f9a0bf40eabbef68065&chksm=ce64ac27f9132531711c7559fdc3bb44a02dd51abd6d57eba8a29b328e16eb11c8015e38ba42#rd
如有侵权请联系:admin#unsafe.sh