绿盟科技-每周蓝军技术推送(2022.4.9-4.15)学习

0x00 绿盟科技-每周蓝军技术推送(2022.4.9-4.15)

0x01 修改内存中的 PE 头来注入 DLL 的一种方法

  • 这篇文章主要原理是:windows在装载程序的时候会根据导入表的数据装载所需要的Dll文件,
    这篇文章的原理是通过在程序导出表中添加IID数组,然后在Resume主线程的时候,windows装载器便会加载所需要的dll实现dll注入。

  • 这个办法缺点:

    • 1.是只能注入刚刚启动的进程,
    • 2.还有敏感函数ResumeThead操作。好处就是不需要CreateRemoteThread函数。

0x02 针对Office的DLL劫持研究

  • 这篇文章就讲了一个搜索顺序类型的dll劫持,而且现在微软并不认为这算是一个漏洞,所以短时间内应该是不会进行修复的。关于这种类型的dll劫持的检测思路可以是这样的:

  • 因为Windows安全dll搜索顺序是这样,针对系统程序来说,其使用的dll多位于系统目录,要想目标dll能被劫持,目标dll的释放路径只可能在应用程序目录。

    1、加载应用程序的目录;
    2、系统目录,使用GetSystemDirectory函数获取该目录的路径;
    3、16位系统目录,没有获取该目录路径的函数,但会对该目录进行搜索;
    4、Windows目录,使用GetWindowsDirectory函数获取该目录的路径;
    5、当前目录;
    6、PATH环境变量中列出的目录。
    
  • 所以,我只需要寻找进程所加载dll的路径和进程路径一致的dll程序,并且在其他目录存在相同文件名称的dll,例如%system32%目录和%windows%。即可认为存在此类dll劫持。

0x03 AMSI Bypass 的多种方法整理

  • 结合这篇文章,目前主要的ByPass AMSI的方法有两种,第1种是Patch amsi.dll文件。第2种是使amsi失效的方法。

  • 1.通过patch AmsiScanBuffer函数,主要分为c#语言和ps语言。

ref:https://gist.github.com/FatRodzianko/c8a76537b5a87b850c7d158728717998#file-my-am-bypass-ps1

ref:https://github.com/rasta-mouse/AmsiScanBufferBypass/blob/main/AmsiBypass.cs

  • 2.通过反射Patch AmsiScanBuffer函数地址,为了避免被探测,其首先获取了DllGetClassObject的地址,然后通过暴力搜索特征码的方式获取AmsiScanBuffer进行patch

ref:https://gist.github.com/shantanu561993/6483e524dc225a188de04465c8512909

  • 3.使amsi失效,通过设置System.Management.Automation.AmsiUtils的属性amsiInitFailed或者amsiContext使AMSI失效。

[Ref].Assembly.GetType(‘System.Management.Automation.AmsiUtils’).GetField(‘amsiInitFailed’,’NonPublic,Static’).SetValue($null,$true)

Ref:https://github.com/samratashok/nishang/blob/master/Bypass/Invoke-AmsiBypass.ps1

  • 使amsi失效,该方法会导致异常,而且windows已经针对部分字符串进行检测。但是可以混淆绕过。
1
2
3
$mem = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(9076)
[Ref].Assembly.GetType("System.Management.Automation.AmsiUtils").GetField("amsiSession","NonPublic,Static").SetValue($null, $null);
[Ref].Assembly.GetType("System.Management.Automation.AmsiUtils").GetField("amsiContext","NonPublic,Static").SetValue($null, [IntPtr]$mem)

0x04 Windows特权句柄利用分析

  • 这篇文章所描述的是,通过Hunt系统中的高完整性级别的句柄,来进行ByPass UAC。其原理和之前推得一篇文章很相似。
    那篇原理是通过拉起某些自动提升UAC权限的进程,然后通过dump进程句柄实现的。这篇是寻找高完整性句柄,并以此启动进程进行ByPassUAC。

  • 再讲一下为什么只需要获取高完整性级别的Handle就可以进行ByPass UAC。ByPassUAC原理就是父子进程的完整性级别是继承的,在创建进程之前的CreateProcess函数,会设置一个名为STARTUPINFOEXW结构体。其保存了一些启动信息。当我们创建进程之前,提前设置STARTUPINFOEXW的lpAttributeList元素,就可以是新创建的进程具有使用泄露句柄的进程完整性级别。关于UpdateProcThreadAttribute用法,可以看这篇文章https://blog.csdn.net/linlin003/article/details/108864860

0x05 探索Windows 内核中的系统调用

  • 这篇文章主要讲的是通过syscall绕过EDR产品的原理,因为EDR或者杀毒软件通常会在一些敏感函数下Hook,部分杀软Hook的地方比较偏向应用层,因为内核层搞事情容易蓝屏,而syscall位于ntdll中的Nt*函数,通过直接调用Nt函数,这样就可以绕过部分杀毒软件。

  • 目前来说,我比较看好的项目SysWhisoers2 ,国内有大佬也总结了syscall几个很好的项目。syscall的前世今生

  • 但是,Syscall Bypass这种技术,目前对于普通使用者来说难度较大,因为Nt*更接近于底层,没有暴露的API接口使用,部分结构体甚至没有公布,只能通过Re的方法进行了解。所以,需要自己写一套Stub去调用Nt函数。