利用 Python 打造反向 TCP 後門

譯者:shan66

預估稿費:200RMB

投稿方式:發送郵件至linwei#360.cn,或登陸網頁版在線投稿

Python的反向TCP後門

在Linux中,我們需要在一個安全的環境中進行黑客攻擊(滲透測試)。通常情況下,我們做的第一件事就是安裝虛擬化軟體,同時安裝能找到的所有操作系統發行版。在黑客攻擊的階段,為了拿下目標機器,我們需要藉助某種程序來感染系統。這種做法的缺點是:防病毒產品對於那些廣為人知的Metasploit文件都了如指掌,因此,為了攻陷受害者機器,我們需要禁用這些產品——但這種做法不太現實。因此,這就迫使我們開發自己的攻擊程序。當然,這方面的程序(即Payload)有很多種類型,而今天要講的,則是反向TCP程序。

反向TCP:在正常轉發連接中,客戶端是通過伺服器的開放埠連接到伺服器的,但在反向連接的情況下,客戶端會主動打開伺服器上將要連接的埠。反向連接最常見的用途就是繞過防火牆和路由器的安全限制。

例如,在阻止入站連接的防火牆後面的電腦上運行的後門,可以輕鬆建立出站連接,通過Internet與遠程主機進行通信。一旦建立了連接,遠程主機就可以向後門發送命令。這種通信方式對攻擊者來說很有幫助,因為在受害者機器上啟動本地Shell是非常容易的。

在這個文章系列中,我們將利用Python開發一個反向TCP程序。那麼,我們為什麼要分成多個部分呢?這是因為,在每個部分中,我們都會為Shell引入一個新的函數、命令或代碼,這樣能夠使其更加靈活。我們要從頭開始,打造一款真正屬於自己的、令人敬畏的、奇幻無比的、難以置信的……(我覺得這些形容詞已經差不多夠了)Shell。

在這篇文章中,我們會把Shell鍛造得稍微漂亮一些。下面,讓我們先從伺服器(攻擊方)腳本開始。

腳本編寫:IMPORT語句

下面是我們新寫的import語句

#!/usr/bin/env pythonnimport socket, sys, osn

不錯! !

腳本編寫:腳本的彩色顯示函數

這個函數能夠讓我們的Shell變得異彩紛呈。

圖1

這個函數能夠將傳遞給它的文本賦予指定的顏色。它可以接受的參數:

1."r" 或 "red" ——紅色

2."g" 或 "green"——綠色

3."b" 或 "blue"——藍色

4."y" 或 "yellow" ——黃色

5."lgray" ——淺灰

6."underline" —— 帶下劃線的文本

7."strike" —— 帶刪除線的文本

腳本編寫:banner函數

雖然這幾個函數都不是必需的,但是可以改善用戶體驗。 我們可以根據自己的喜好進行相應的定製。

圖2

注意:這裡,我把「lgray」改成了「gray」。 正如我剛才所說,只要我們喜歡,可以隨意修改。

很明顯,這個函數的作用是將文本返回給調用者。

腳本編寫:主控函數

該函數將會接管伺服器套接字。在上一篇文章中,我們沒有使用任何函數,而是直接使用原始代碼。現在,我們要把這些原始代碼寫成函數,並進行了一些必要的修改。

圖3

不要慌,仔細閱讀代碼,你總會弄懂的。讓我們化整為零,分別解釋一下好嗎?

1.我們接收套接字信息並將其傳遞給相應的變數host和port

2.如果沒有出錯的話,我們將通過script_color函數輸出「Framework Started Success」。

3.接下來是向屏幕輸出標語的banner()函數。

4.然後,設置套接字,綁定並開始監聽。

5.通常情況下,我們將 host 作為空字元串進行傳遞。如果是這樣的話,我們在設置套接字後將主機字元串改為「localhost」

6.我們接著列印「Listening on host address:port number ...」

7.我們開始接收連接。

8.如果一切順利,並且客戶端發起連接的話,我們將進入console函數,並將連接流和主機地址作為參數傳遞給該函數。

9.如果函數退出,我們將關閉套接字

這實際上並不是很難!所以,讓我們繼續。

腳本編寫:控制台函數

這是最難的一部分,但如果我們能夠搞定這一個函數的話,後面的內容將不在話下。控制台函數的代碼如下所示。

圖4

代碼有點長。首先,我們列印了一個字元串,指出已經從遠程主機建立了連接。然後,我們開始接收來自該連接的數據,這個數據是與遠程系統相關的信息(我們將在客戶端進行處理)。然後,我們對數據進行整理,下面給出相應的數據布局:

系統類型

計算機名稱(節點名稱)

發行版本

系統版本

機器體系結構

用戶名

所有這些信息都來自(我們在客戶端使用的)os模塊中的uname()和getlogin()函數。

之後,我們使用收到的信息為shell創建一個自定義提示符,例如,root@127.0.0.1。

然後,我們進入命令循環。該循環提供了用於連接的各種命令。這裡將定義我們的自定義命令,因此諸如「ls -l」和其他linux命令將不起作用。

下面是我們的前5條內置命令。

1.exec——接收一個命令作為參數,並在遠程主機上執行該命令。這是我們日常的linux命令可以發揮作用的地方,例如exec ls -l

2.cls——清除終端屏幕。使用默認的linux clear命令

3.help——調用help函數,並列印幫助文本(我們將很快實現該函數)

4.sysinfo——列印收到的遠程系統的信息

5.exit()——向遠程shell發送暫停命令,同時從本地退出

6.任何非指定的命令都不被接受,並且在else語句中列印一條錯誤消息

對於內置的exec命令,不應該向其傳遞任何參數,否則會列印一個錯誤消息。在exec命令中有一個新的函數send_data,它可以接收連接流以及要執行的命令。同時,它還會自動處理數據的發送和接收。

就像您所看到的那樣,我倒真希望讓您來寫代碼。您可以在代碼可以正常運行後對其進行修改。如果在寫作過程中進行修改的話,可能會導致很多問題(相信我)。

腳本編寫:幫助函數

所有內置在這個框架(腳本)中的命令的說明都囊括在這個函數中。

圖5

這個函數會按照順序列印help_list,並對其進行格式化。

腳本編寫:數據發送函數

該函數如前所述將會自動發送和接收數據。

圖6

現在,讓我們把這一切都整合起來。

調用各個函數

我們知道,函數是不會自行執行的,除非它被調用。

圖7

上面這些代碼,只是我們所有工作的一部分而已。下面,讓我們開始看看客戶端腳本需要進行哪些修改。

客戶端代碼

為了與伺服器配合好,客戶端也需要遵守一些規則和命令,例如伺服器腳本中的exec命令。所以,我們將import語句改為:

#!/usr/bin/env pythonnimport socket, subprocess as sp, sys, osn

我們的第一函數將是connect函數。

connect函數

顧名思義,這個函數的作用是連接到指定的地址。建立連接後,它也會發送系統信息。

圖8

圖8

然後,它會以連接流作為參數調用interactive_session函數。

互動式會話函數

這個函數會運行一個循環語句,然後根據「if」指令來接收和執行命令。

圖9

該函數使用另一個函數send_data來發送數據。

數據發送函數

該函數計算數據的長度,並將這個長度與數據一起發送。

圖10

這個函數將有助於未來的修改。

調用各個函數

我們必須調用函數,否則它自己是不會執行的。

圖11

下面,讓我們執行攻擊方(伺服器)腳本,看看能得到什麼結果

root@Sploit:~/Desktop# python reverseTcp.py 8000 n

客戶端應建立連接,並在命令行上傳遞主機信息。

root@Sploit:~/Desktop# python connect.py 127.0.0.1 8000n

以下是攻擊方的伺服器腳本的屏幕截圖:

圖12

我們來瀏覽一下幫助選項

圖13

從遠程系統的nmap結果來看,我認為已經在註冊的服務上打開了一個埠。不出所料,客戶端控制台果然沒有顯示任何內容,因為我們沒有列印任何東西。

小結

在本文中,我們向讀者介紹了如何利用Python建立一個反向後門。

不要忘了,更正、修改、更新總是受歡迎的。


推薦閱讀:

Python從零開始系列連載(13)——Python程序的基本控制流程(上)
用印象筆記的Python SDK介面開發個自用小工具
PyQt5系列教程(19):微調框2
看我如何進行Python對象注入利用

TAG:Python | Python教程 | 软件后门 |