# Windows更新+中间人=远程命令执行
0x00 Windows Server Update Services
===================================
* * *
WSUS是Windows Server Update Services的简称。利用这个windows服务,管理员只需要保证局域网中的一台主机能够连接到MicroSoftUpdate服务器,就能实现内网中所所有主机快速地进行windows更新。
简而言之,内网中的WSUS服务器就是windows官方更新服务器的代理。WSUS服务器通过互联网取得官方的windows update,并且缓存到本地。管理员只需要在wsus上选择哪些补丁需要更新,就能通过**HTTP**/HTTPS协议快速地将各种ms-2015-***|||*部署到内网中的其他服务器中去,这样即使是由于种种原因不能暴露在英特网中的内网主机(比如oracle数据库服务器)也能通过WSUS及时下载补丁,大大增加了内网的安全性,实现了细粒化管理。所以很多中大型网络都会部署wsus服务器来实现内网安全加固。
由于wsus是基于c/s模式的,所以server和client我们都需要进行配置。 client机器上在注册表中存储了wsus服务器的地址
“`
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\W UServer
“`
比如存储的内容可能是这样的`http://wsus01:8530`. Port 8530 是wsus部署的默认端口。
0x01 WSUS 协议分析
==============
* * *
wsus利用SOAP XML实现c/s之间的通信,当client主机首次连入wsus-server的时候,会有一个这样的注册过程。
![](http://drops.javaweb.org/uploads/images/c47a549122ed8004297e033cc548b1d7b1e0afa7.jpg)
一旦完成了这样的注册流程,client主机就能进行定时更新检查了。(只要上述的cookies不过期)
![](http://drops.javaweb.org/uploads/images/2fa17e48ca3c89d6c60c2b6017d9b16d26e119ce.jpg)
这里我们详细分析一下每一个请求
“`
SOAP Call 请求 响应
SyncUpdates (硬件驱动) 本机硬件列表 可更新的驱动列表
SyncUpdates (软件) 已经安装的更新的id列表 新可用更新列表以及metadata
GetExtendedUpdateInfo 具体地update id 对应此id的详尽的metadata,包括下载地址,hash..
“`
可以看到wsus服务其实非常好理解:
一个SyncUpdates到wsus服务器获取可更新的id以及id对应的一些解释数据,本机通过这些解释数据决定安装哪个(些)补丁,并且发送GetExtendedUpdateInfo,获得详细的信息进行安装。
下面是一个SyncUpdates响应的例子
Example of wsus-server to cilent
——————————–
“`
“`
那么一旦client决定了要装哪些更新就会再发一个GetExtenedUpdateInfo到wsus-server
Example of client to wsus-server(GetExtendedUpdateInfo request)
—————————————————————
“`
“`
wsus接着给出响应
Example of GetExtendedUpdateInfo response
—————————————–
“`
…
“`
需要说明的是,每一个update标签就是一个更新线程,然而最为重要的metadada标签在MSDN文档中却并没有详细解释。我们自己来分析一个看看
“`
“`
其中`
1. Cbs (Cab file)
2. WindowsDriver
3. WindowsInstaller
4. WindowsPatch
5. InfBasedInstallation
6. CommandLineInstallation
其中CommandLineInstallation这个handler允许单个可执行文件加任意参数被运行。适合我们的目的
所以,这里我们关注这个handler进行讨论
handler分析
———
二话不说先给出一个`
“`
“`
其中具体的安装过程就在`
0x02 Http有毒
===========
* * *
将整个wsus流程分析清楚了。我们再来考虑一下基于wsus的安全问题,不知道大家是否注意到,前文曾经提到过
管理员只需要在wsus上选择哪些补丁需要更新,就能通过**HTTP**/HTTPS协议快速地将各种ms-2015-***|||*部署到内网中的其他服务器中去
而http协议在内网中简直就是毒药。 最令人遗憾的是,截止到最新的版本,wsus依然使用http作为默认的同学协议,只是在安装完毕的wizard界面向管理员建议部署ssl通信(谁会去看那个?)
![](http://drops.javaweb.org/uploads/images/1f42ad9a447a2b86397251aff544d9e392db0863.jpg)
所以我们完全有能力在内网中通过中间人篡改metadata实现攻击(以system权限)。而且**攻击一定会奏效**,因为wsus部署好之后,client的update check是定期的,所以肯定能够伪造一个新更新,迫使用户安装。
0x03 windows签名验证的绕过到中间人远程命令执行
=============================
* * *
可惜如果你们觉得通过中间人篡改metadata就能装个驱动马到主机上,那就too young了。
MSDN上面有这么一段话
> All update packages that are downloaded by Windows Update are signed with a Microsoft signature.(所有更新包必须带有微软签名才能被下载并安装)
所以现在有两种办法来解决问题
1. 给你的木马加一个微软的签
2. 另辟蹊径
恩。。我们直接想第二种办法。 windows Update会验证每个更新是否被微软公司签名,然而,签名证书并不需要指明是用来“windows update” 这就是说,任何被微软签名的可执行程序都能被作为更新包被安装并运行。
想象一下,假如我们能够伪造一个cmd.exe的更新呢,加上前面又提到,在xml标签里面是可以指定运行参数的,那我们就能够通过中间人执行任意命令了!
冷静冷静,我们的微软并没有给cmd.exe签名。
但是psExec确乎是被微软签名了,psexec的作用这里不解释,大家都懂
所以我们完全有能力将psexec运行在NT AUTHORITY\SYSTEM下。所以,pwned~
0x04 Pwn
========
* * *
这是一个没有经过篡改的SyncUpdate 响应(用来告诉client现在有哪些更新可用)
“`
“`
而我们的通过在上面为空的NewUpdates标签中插入内容,就能伪造更新
通过大量测试我们发现一个windows update需要两个`
“`
“`
于是乎,client会就刚刚两个id发出GetExtendedUpdateInfo请求,要求wsus服务器返回详细的安装消息
“`
“`
中间人这时再次将请求包中的两个id剔除,以免wusu服务器因为不存在的更新报错。当wsus服务器响应之后,我们再将响应内容篡改,这次我们加入四个更新标签
“`
“`
一旦client机收到这个响应,就会根据更新类型自动或提醒用户安装。比如在上例中,就能启动一个带参运行的Psexec。
0x05 Source
===========
* * *
* [http://www.contextis.com/documents/161/CTX_WSUSpect_White_Paper.pdf](http://www.contextis.com/documents/161/CTX_WSUSpect_White_Paper.pdf)
* pocket:[https://github.com/ctxis/wsuspect-proxy](https://github.com/ctxis/wsuspect-proxy)
请登录后查看评论内容