在powershell中編寫反向socks5代理程式。第1部分

一個關於研發的故事分為三個部分。 第 3 部分是探索性的。
這裡有很多山毛櫸樹——甚至還有更多好處。

制定問題

在滲透測試和 RedTeam 活動期間,並非總是可以使用客戶的標準工具,例如 VPN、RDP、Citrix 等。 作為進入內網的錨點。 在某些地方,標準VPN 使用MFA 工作,並使用硬體令牌作為第二個因素,在其他地方,它受到殘酷的監控,我們的VPN 登入立即變得可見,正如他們所說,以及它所需要的一切,但在其他地方,根本就沒有這樣的手段。

在這種情況下,我們經常必須建立所謂的「反向隧道」——從內部網路到外部資源或我們控制的伺服器的連線。 在這樣的隧道內,我們已經可以利用客戶的內部資源。

這些返回隧道有多種類型。 其中最著名的當然是Meterpreter。 具有反向連接埠轉送功能的 SSH 隧道在駭客群組中也有很大的需求。 實現反向隧道的方法有很多,其中許多方法都得到了很好的研究和描述。
當然,就安全解決方案的開發人員而言,他們不會袖手旁觀並主動偵測此類行為。
例如,MSF 會話可以被 Cisco 或 Positive Tech 的現代 IPS 成功偵測到,而反向 SSH 隧道幾乎可以被所有普通防火牆偵測到。

因此,為了在紅隊戰役中不被察覺,我們需要使用非標準手段來建構反向隧道,並盡可能貼近網路的真實運作模式。

讓我們嘗試尋找或發明類似的東西。

在發明任何東西之前,我們需要了解我們想要達到什麼結果,我們的開發應該執行什麼功能。 為了讓我們能夠在最大隱密模式下工作,對隧道有什麼要求?

顯然,對於每種情況,這些要求可能會有很大差異,但根據工作經驗,可以確定主要要求:

  • 在 Windows-7-10 作業系統上工作。 由於大多數企業網路使用Windows;
  • 客戶端透過 SSL 連接到伺服器,以避免使用 ips 進行愚蠢的監聽;
  • 連接時,客戶端必須支援透過授權的代理伺服器進行工作,因為在許多公司中,透過代理商存取互聯網。 事實上,客戶端機器甚至可能對此一無所知,而代理程式是以透明模式使用的。 但我們必須提供這樣的功能;
  • 客戶端部分應簡潔、便攜;
    很明顯,要在客戶的網路中工作,您可以在客戶端電腦上安裝 OpenVPN 並建立到伺服器的成熟隧道(幸運的是,openvpn 用戶端可以透過代理程式工作)。 但是,首先,這並不總是有效,因為我們可能不是那裡的本地管理員,其次,它會產生很大的噪音,以至於像樣的 SIEM 或 HIPS 會立即「告密」我們。 理想情況下,我們的客戶端應該是所謂的內聯命令,例如,許多 bash shell 都是透過命令列實現和啟動的,例如,當從單字巨集執行命令時。
  • 我們的隧道必須是多執行緒的並且同時支援多個連線;
  • 客戶端-伺服器連線必須具有某種授權,以便僅為我們的客戶端建立隧道,而不是為透過指定位址和連接埠存取我們伺服器的每個人建立隧道。 理想情況下,應向「第三方使用者」開啟包含與原始網域相關的貓或專業主題的登陸頁面。
    例如,如果客戶是醫療組織,則資訊安全管理員決定檢查診所員工訪問的資源、藥品頁面、包含診斷描述的維基百科或 Komarovsky 博士的博客等.應該打開。

現有工具分析

在重新發明自己的自行車之前,您需要對現有自行車進行分析,以了解我們是否真的需要它,並且可能我們不是唯一考慮過需要這種功能性自行車的人。

在網路上谷歌搜尋(我們似乎通常用谷歌搜尋),以及在 Github 上使用關鍵字「reverseocks」進行搜尋並沒有給出很多結果。 基本上,這一切都歸結為建立具有反向連接埠轉送的 ssh 隧道以及與之相關的所有內容。 除了SSH隧道之外,還有以下解決方案:

github.com/klsecservices/rpivot
卡巴斯基實驗室的人員長期實施反向隧道。 從名稱就可以清楚看出該腳本的用途。 該隧道在 Python 2.7 中實現,以明文模式運行(正如現在流行的說法 - 你好 RKN)

github.com/tonyseek/rsocks
Python 中的另一個實現,也是明文形式,但具有更多可能性。 它被編寫為模組,並具有用於將解決方案整合到您的專案中的 API。

github.com/llkat/rsockstun
github.com/mis-team/rsockstun
第一個連結是Golang中反向sox實作的原始版本(開發者不支援)。
第二個連結是我們的修訂版,帶有附加功能,也在 Golang 中。 在我們的版本中,我們實作了 SSL、透過具有 NTLM 授權的代理程式、用戶端授權、密碼錯誤時的登陸頁面(或更確切地說,重新導向到登陸頁面)、多執行緒模式(即幾個人可以與隧道同時工作),這是一種對客戶端進行ping 操作以確定其是否還活著的系統。

github.com/jun7th/tsocks
我們「中國朋友」用Python實現的reverse sox。 在那裡,對於懶惰和「不朽」的人來說,有一個現成的二進位檔案(exe),由中國人組裝並可以使用。 在這裡,只有中國上帝知道這個二進位檔案除了主要功能之外還可能包含什麼,所以使用時需要您自擔風險。

github.com/securesocketfunneling/ssf
這是一個相當有趣的 C++ 項目,用於實現反向 sox 等。 除了反向隧道之外,它還可以進行連接埠轉送、建立命令 shell 等。

無國界醫生組織翻譯員
正如他們所說,這裡沒有評論。 所有受過或多或少教育的駭客都非常熟悉這個東西,並且了解它是多麼容易被安全工具偵測到。

上述所有工具都使用類似的技術工作:在網路內部的電腦上啟動預先準備好的可執行二進位模組,該模組與外部伺服器建立連接。 伺服器運行 SOCKS4/5 伺服器,該伺服器接受連接並將其中繼到客戶端。

上述所有工具的缺點是必須在客戶端機器上安裝Python或Golang(您是否經常看到Python安裝在例如公司主管或辦公室職員的機器上?),或預先組裝好的二進位檔案(實際上是Python)必須拖到這台機器上,並將腳本放在一個瓶子裡)並在那裡運行這個二進位檔案。 下載 exe 然後啟動它也是本機防毒軟體或 HIPS 的簽章。

總的來說,結論不言而喻——我們需要一個 powershell 解決方案。 現在番茄會飛向我們——他們說 powershell 已經很陳腐了,它被監控、封鎖等等。 等等。 事實上,並非到處都有。 我們負責任地聲明。 順便說一句,有很多方法可以繞過阻塞(這裡又出現了一個關於 hello RKN 的時髦短語 🙂),從 powershell.exe -> cmdd.exe 的愚蠢重命名開始,到 powerdll 結束等等。

讓我們開始發明吧

很明顯,我們首先會在 Google 上查找,然後…我們不會找到有關此主題的任何內容(如果有人找到了,請在評論中發布連結)。 只有 實作 powershell 上的 Socks5,但這只是一個普通的「直接」sox,它有許多自己的缺點(我們稍後會談到)。 當然,你可以用手輕輕一動,把它變成相反的,但這只是單線襪,這不是我們所需要的。

所以,我們還沒有找到任何現成的東西,所以我們仍然需要重新發明輪子。 我們將以此作為我們自行車的基礎 我們的發展 在 Golang 中反向 sox,我們在 powershell 中為其實作一個客戶端。

RSocksTun
那麼 rsockstun 是如何運作的呢?

RsocksTun(以下簡稱RS)的運作是基於兩個軟體元件-Yamux和Socks5伺服器。 Socks5伺服器是一個普通的本地socks5,它運行在客戶端上。 使用 yamux 提供多路連接(還記得多線程嗎?)另一個多工器)。 該方案允許您啟動多個客戶端socks5伺服器並向它們分發外部連接,透過一個TCP連接(幾乎像在meterpreter中)將它們從客戶端轉發到伺服器,從而實現多線程模式,沒有它我們根本就不會能夠在內部網路中充分工作。

yamux 工作原理的本質是它引入了額外的流網路層,以每個資料包 12 位元組標頭的形式實現它。 (這裡我們刻意使用「流」這個詞而不是線程,以免讀者與程式流「線程」混淆-我們在本文中也將使用這個概念)。 yamux 標頭包含流編號、安裝/終止流的標誌、傳輸的位元組數以及傳輸視窗的大小。

在powershell中編寫反向socks5代理程式。第1部分

除了安裝/終止流之外,yamux 還實作了 keepalive 機制,讓您可以監視已建立的通訊通道的效能。 keeplive 訊息機制的操作是在建立 Yamux 會話時配置的。 實際上,設定中只有兩個參數:啟用/停用和傳送封包的頻率(以秒為單位)。 Keepalive 訊息可以由 yamux 伺服器或 yamux 用戶端發送。 當接收到保活訊息時,遠端方必須透過發送與其接收到的完全相同的訊息標識符(實際上是一個數字)來回應它。 一般來說,keepalive 是相同的 ping,僅適用於 yamux。

多工器的整個操作技術:資料包類型、連接建立和終止標誌以及資料傳輸機制在 規格 到 yamux。

第一部分的結論

因此,在本文的第一部分中,我們熟悉了一些用於組織反向隧道的工具,了解了它們的優點和缺點,研究了Yamux 多工器的操作機制,並描述了新創建的powershell 模組的基本要求。 在下一部分中,我們將從頭開始開發模組本身。 待續。 不要切換:)

來源: www.habr.com

添加評論