CVE-2019-19470:TinyWall防火墙本地提权漏洞分析

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29

经研究证明,该属性来自于PEB(Process Environment Block)结构,而进程所有者可以完全控制该区块。PEB在用户模式下可写,我们可以使用NtQueryInformationProcess,第一时间获得进程PEB的句柄。_PEB结构由多个元素所构成,如PRTL_USER_PROCESS_PARAMETERS ProcessParameters以及双向链表PPEB_LDR_DATA Ldr等。这两者都可以用来覆盖内存中相关的Unicode字符串。第一个结构可以用来伪造ImagePathName及CommandLine,但对我们而言更有趣的是双向链表,其中包含FullDllName以及BaseDllName。这些PEB元素正是TinyWall中MainModule.FileName代码所提取的元素。此外,Phrack在2007年的一篇文章中也详细解释了相关的底层数据结构。
幸运的是,Ruben Boonen(@FuzzySec)已经在这方面做了一些研究,发布了多个PowerShell脚本。其中有个Masquerade-PEB脚本,可以操控正在运行进程的PEB,在内存中伪造前面提到的属性值。稍微修改该脚本后(该练习同样留给大家来完成),我们可以成功伪造MainModule.FileName值。
即使我们可以将PowerShell代码移植成C#代码,但我们还是偷了个懒,在C#版的Exploit.exe中直接导入System.Management.Automation.dll。我们创建了一个PowerShell实例,读取经过修改的Masquerade-PEB.ps1,然后调用相应代码,希望能够成功伪造Exploit.exe的PEB元素。

使用Sysinternals Process Explorer之类的工具检查试验结果,我们可以验证这个猜想,为了后续利用奠定基础,在不需要调试器配合的情况下弹出计算器。
 
0x06 弹出计算器
现在距离完整利用代码只差一步之遥,前面我们在Exploit.exe刚开始运行时调用James Forshaw的TypeConfuseDelegate代码以及Ruben Boonen的PowerShell脚本,现在我们可以进一步连接到TinyWallController命名管道。更具体一些,我们需要将System.IO.Pipes.NamedPipeClientStream变量pipeClient与弹出计算器的gadget一起传入BinaryFormatter.Serialize()。

感谢Ruben Boonen之前的研究成果,同时在Markus Wulftange小伙伴的帮助下,我很快就实现了完整版利用代码。

 
0x07 漏洞披露
我们于2019年11月27日向TinyWall开发者反馈了漏洞细节,官方在2.1.13版(2019年12月31日发布)中修复了该漏洞。
 

上一页  [1] [2]