1. 前言
CVE-ID:CVE-2020-1313
类型:本地提权
POC: https://github.com/irsl/CVE-2020-1313
原理:利用Windows Update Orchestrator Service (是一个DCOM服务9C695035-48D2-4229-8B73-4C70E756E519) 暴露的API方法无需认证来进行计划任务的设置,计划任务以SYSTEM权限执行,导致权限提升。
影响版本:
Windows 10 Version 1903 for 32-bit Systems
Windows 10 Version 1903 for ARM64-based Systems
Windows 10 Version 1903 for x64-based Systems
Windows 10 Version 1909 for 32-bit Systems
Windows 10 Version 1909 for ARM64-based Systems
Windows 10 Version 1909 for x64-based Systems
Windows 10 Version 2004 for 32-bit Systems
Windows 10 Version 2004 for ARM64-based Systems
Windows 10 Version 2004 for x64-based Systems
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)
2. 编译复现
拉取poc后直接编译成Debug版本后,在虚拟机中cmd执行发现没有反应,双击执行后报错(物理机正常执行,考虑是虚拟机中运行环境的原因):
搜索缺少的DLL后,看到文章(https://blog.csdn.net/so_geili/article/details/53009680 和 https://www.cnblogs.com/xzabg/p/5875296.html),说是编译的原因,然后vs进行设置如下:
在项目属性-C/C++-代码生成-运行库中将其设置为静态编译 /MTd ,编译成功后文件为849kb:
随后放到虚拟机里执行成功,可以看到注册表中新增了一项,命令在之后的一段时间内会自动触发。
接下来试试将选项设置为 release,生成后大小13kb:
执行成功:
然后一段时间后会在C盘生成个命令执行的txt,实际利用可以用powershell等来执行其他反弹shell的操作~
3. 其他
在编译过程中,遇到运行库的问题,将网上看到的在这里记录一下。
1.运行库设置
多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd),带D的是Debug模式,单线程运行时库选项/ML和/MLd在VS2003以后就取消了。
/MT 、 /MTd:
/MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Address specified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。/MD、/MDd:
/MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。
2.调试信息的隐藏
编译为可执行文件后,用16进制查看发现存在一些路径信息、printf的信息:
解决方法:
在属性链接器-调试中关闭调试信息:
然后捏,还可以用UPX 压缩一下文件 upx -9 xx.exe,从13kb压缩到9kb了。