在進行滲透測試時,我們有時候會碰到搭建的測試環境、產品服務器、DMZ或者其他類似的機器群的情況,這時我們完全可以把它們看作跳板。這些系統被設計成對外交互的接口,這時候我們考慮對其他域里的用戶進行SSH會話劫持是個不錯的選擇。
那么如果你擁有了某一個跳板的控制權限,想要通過另一個域的用戶對遠程域進行訪問會怎么辦呢?當然,這時候你是沒有密碼、密鑰的,你不能拋棄二進制手段,而且SSH登錄使用的是雙因子認證。這下怎么辦?讓我們擼起袖子,練練命令行的功夫吧。
這篇文章涵蓋了SSH會話劫持的兩個方法。我們不需要認證,就可以直接實現動態端口轉發。當我們需要劫持會話時,需要完成以下兩個條件:
1.創建會話
2.存在一個活躍的SSH會話
我們的最終目標是通過另一個用戶的活躍會話,創建一個通道來獲取遠程SSH主機的訪問權限。
建立SSH會話劫持
為了劫持一個新近創建的會話,我們可以利用一項叫SSH復用的技術。黑客可以利用它在某用戶的原始socket里創建自己的會話,不用再次進行認證。這個名為ControlMaster的技術在OpenSSH4里面提出過,著名黑客H D Moore和Val Smith的文章里也曾提到。我本人在某次交流會中,也談到過這種攻擊手法–The Poor Man’s Rootkit。這篇文章里我講展示兩種強制建立master socket的方法,然后會演示如何將端口轉發給它們,第一個方法與ControlMaster有關:
SSH客戶端上的ControlMaster配置:
打開ControlMaster之后,一個ssh連接在后臺運行,創建一個本地套接字(controlpath就是這個套接字的名字),以后本地再有
ssh需要連接到遠端同樣的主機的時候,直接使用這個已經創建好的socket文件進行連接,不用再創建連接了,同理,也不需要再進行用戶身份驗證。
最常見的對ControlMaster的socket的利用方式,就是對計算機里SSH客戶端的配置做特殊的調整。
這些配置能讓所有新的會話建立持久性的中間人master socket。我在控制socket的命令中,使用了%h代表目標主機,%h可以是任何字符串。
連接socket:
這個socket可以被用來在以后創建會話。即使原主人退出了會話,我們再次創建會話時也不需要認證。
增加一個動態通道:
你得知道,我們的最終目標是到達其他域。下面的命令能讓我們在現有的master socket之上,建立一個動態的通道。
結束后移除socket:
如果我們只是簡單地退出復用的會話,是不會關閉master socket的。想要真正地關閉它,你需要發送一個退出請求。
利用SHELL指令使用SSH ControlMaster
另一個利用這類劫持技術的方法,我以前并沒有公布過:master socket可以通過SSH客戶端選項的flag進行創建。因為這個原因,我們可以使用shell指令截獲某用戶的通過SSH客戶端發出的指令,從而注入我們自己的ControlMaster參數。
ssh ()
{
/usr/bin/ssh -o "ControlMaster=auto" -o "ControlPath=/tmp/%r@%h:%p" -o "ControlPersist=yes" "$@";
}
這個截獲函數會創建相應的socket,與使用ssh_config創建的效果類似。
本次攻擊流程圖:
利用SSH ControlMaster的socket和相應的socket選項,我們可以劫持SSH會話,注入實現端口轉發。這些都不需要任何認證,現在讓我們繼續看另一個方法:
劫持活躍SSH會話
普通用戶可以創建screen會話,使用screen非常簡易.只需在SHELL鍵入screen命令,便可打開一個screen session。然而隨便這樣創建出來的screen會話,用來控制通往其他有權限的機器的SSH連接,這是不太符合安全邏輯的。大多數用戶沒有意識到這些會話可能會被劫持,然后被用于端口轉發。
找出screen會話的方法:
尋找screen會話的方法,當然要在/var/run/screen目錄下翻找。當然,你也可以使用不完整的screen -r命令進行枚舉,猜出某個用戶來。
繞過screen pts/tty的限制:
取得另一個域用戶的screen會話權限沒有看起來那么簡單,不是su命令就行了,許多黑客就困在這里。我們使用su切換到與screen會話對應的用戶,可能會發現屏幕上出現以下的錯誤信息:
“Cannot open your terminal '/dev/pts/#' - please check.”
“Must be connected to a terminal.”
其中一個繞過該限制的方法,即用script的二進制流繞過su過的用戶會話。
增加一個通道:
SSH中有個很少被使用的特性,即轉義sub-shell。如果你正在使用其他手段來控制通往跳板的權限,你可以利用轉碼序列向其他用戶建立的會話中增加端口轉發。按下ctrl+c回退到SSH的sub-shell,然后輸入-D:<port>會增加一個動態端口轉發。想要移除這個端口轉發,可以在輸入-KD:<port>后,再按下ctrl+c。
如果你正在使用的是原始shell里的SSH,上面給的建議不會對你有用。這是因為你的SSH客戶端在初始就會捕獲轉義字符。但是別擔心,我會教你如何繞過它。
使用screen填充創建通道:
screen有一個特性,它允許你向輸入隊列里填充一個緩沖區的內容。這里填充的文本會被認為是screen內部輸入的。所以我們可以通過它繞過外部SSH會話,輸入轉義字符。
在你小心進行填充的需要注意的是,填充的文本在screen會話回退時是可見的,但你可以通過改變回退的長度來阻止它出現。只要你把回退值改為0行,就可以清空screen,將其設置回原:
screen -S 18323.my_ssh_session -X scrollback 0
screen -S 18323.my_ssh_session -p 0 -X stuff $'~C'
screen -S 18323.my_ssh_session -p 0 -X stuff $'-D:9090\nclear\n'
screen -S 18323.my_ssh_session -X scrollback 15000
下面是一個screen會話劫持攻擊的流程圖:
解決了SSH轉義問題并利用screen的填充特性,我們才能劫持建立好的會話,并且注入產生新的通道!
通往遠程域的通道:
最后一步是綁定一個本地端口,用來連接我們在hop_1注入的通道?,F在我們就完全掌控了一個動態的通道,通往遠程域不需要認證喔。
[參考來源0xthem,由FreeBuf小編dawner翻譯整理,轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)]
原創文章,作者:stanley,如若轉載,請注明出處:http://www.www58058.com/1362