Go免杀与反调试
2022-8-25 08:47:28 Author: 哆啦安全(查看原文) 阅读量:50 收藏

Android APP防作弊SDK解决方案

Web安全攻防实战零基础速成培训班

零基础培训课程+技术指导服务(技术交流社群)

零基础学编程/零基础学安全/零基础学逆向实战速成培训班

kali渗透测试环境搭建

Web安全|docker环境搭建(2)

干货|多种SQL注入方式原理介绍(SQL注入基础)

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命令文档https://golang.org/src/cmd/go/alldocs.go

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

加上此参数的时候会删除`.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位压缩项目:

https://github.com/Eronana/packer

    (3).Go Path

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

https://github.com/boy-hack/go-striphttps://github.com/burrowers/garble

https://www.anquanke.com/post/id/263172https://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-striphttps://github.com/burrowers/garble

0x02 代码签名

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

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

    (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

0x03 总结

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

https://github.com/Nan3r/checkgo

推荐阅读

SQL注入基础知识点

MySQL注入-Bypass

Web漏洞之SQL注入

SQL注入从入门到精通

SQL注入语句和方法总结

sqlmap检测sql注入漏洞

发现注入和判断数据库(SQL注入)

利用Sql注入漏洞之获取服务器Root权限

APP渗透|从SQL注入到人脸识别登录绕过

干货|多种SQL注入方式原理介绍(SQL注入基础)

如何选择手机

强烈推荐Google系列Android机型(Android逆向的最佳机型)


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2NzUzNzk1Mw==&mid=2247493809&idx=1&sn=3497ba9179e4f9499fe98a4607679722&chksm=ceb8adfff9cf24e961b3b0b2c66ccd3afec4482f1a1a618c4def8be143c74f4697ca9e38c218#rd
如有侵权请联系:admin#unsafe.sh