利用 Python 打造反向 TCP 後門
譯者:shan66
預估稿費:200RMB
投稿方式:發送郵件至linwei#http://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."r" 或 "red" ——紅色
2."g" 或 "green"——綠色
3."b" 或 "blue"——藍色
4."y" 或 "yellow" ——黃色
5."lgray" ——淺灰
6."underline" —— 帶下劃線的文本
7."strike" —— 帶刪除線的文本
腳本編寫:banner函數
雖然這幾個函數都不是必需的,但是可以改善用戶體驗。 我們可以根據自己的喜好進行相應的定製。
注意:這裡,我把「lgray」改成了「gray」。 正如我剛才所說,只要我們喜歡,可以隨意修改。
很明顯,這個函數的作用是將文本返回給調用者。
腳本編寫:主控函數
該函數將會接管伺服器套接字。在上一篇文章中,我們沒有使用任何函數,而是直接使用原始代碼。現在,我們要把這些原始代碼寫成函數,並進行了一些必要的修改。
不要慌,仔細閱讀代碼,你總會弄懂的。讓我們化整為零,分別解釋一下好嗎?
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.如果函數退出,我們將關閉套接字
這實際上並不是很難!所以,讓我們繼續。
腳本編寫:控制台函數
這是最難的一部分,但如果我們能夠搞定這一個函數的話,後面的內容將不在話下。控制台函數的代碼如下所示。
代碼有點長。首先,我們列印了一個字元串,指出已經從遠程主機建立了連接。然後,我們開始接收來自該連接的數據,這個數據是與遠程系統相關的信息(我們將在客戶端進行處理)。然後,我們對數據進行整理,下面給出相應的數據布局:
系統類型
計算機名稱(節點名稱)
發行版本
系統版本
機器體系結構
用戶名
所有這些信息都來自(我們在客戶端使用的)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,它可以接收連接流以及要執行的命令。同時,它還會自動處理數據的發送和接收。
就像您所看到的那樣,我倒真希望讓您來寫代碼。您可以在代碼可以正常運行後對其進行修改。如果在寫作過程中進行修改的話,可能會導致很多問題(相信我)。
腳本編寫:幫助函數
所有內置在這個框架(腳本)中的命令的說明都囊括在這個函數中。
這個函數會按照順序列印help_list,並對其進行格式化。
腳本編寫:數據發送函數
該函數如前所述將會自動發送和接收數據。
現在,讓我們把這一切都整合起來。
調用各個函數
我們知道,函數是不會自行執行的,除非它被調用。
上面這些代碼,只是我們所有工作的一部分而已。下面,讓我們開始看看客戶端腳本需要進行哪些修改。
客戶端代碼
為了與伺服器配合好,客戶端也需要遵守一些規則和命令,例如伺服器腳本中的exec命令。所以,我們將import語句改為:
#!/usr/bin/env pythonnimport socket, subprocess as sp, sys, osn
我們的第一函數將是connect函數。
connect函數
顧名思義,這個函數的作用是連接到指定的地址。建立連接後,它也會發送系統信息。
然後,它會以連接流作為參數調用interactive_session函數。
互動式會話函數
這個函數會運行一個循環語句,然後根據「if」指令來接收和執行命令。
該函數使用另一個函數send_data來發送數據。
數據發送函數
該函數計算數據的長度,並將這個長度與數據一起發送。
這個函數將有助於未來的修改。
調用各個函數
我們必須調用函數,否則它自己是不會執行的。
下面,讓我們執行攻擊方(伺服器)腳本,看看能得到什麼結果
root@Sploit:~/Desktop# python reverseTcp.py 8000 n
客戶端應建立連接,並在命令行上傳遞主機信息。
root@Sploit:~/Desktop# python connect.py 127.0.0.1 8000n
以下是攻擊方的伺服器腳本的屏幕截圖:
我們來瀏覽一下幫助選項
從遠程系統的nmap結果來看,我認為已經在註冊的服務上打開了一個埠。不出所料,客戶端控制台果然沒有顯示任何內容,因為我們沒有列印任何東西。
小結
在本文中,我們向讀者介紹了如何利用Python建立一個反向後門。
不要忘了,更正、修改、更新總是受歡迎的。
推薦閱讀:
※Python從零開始系列連載(13)——Python程序的基本控制流程(上)
※用印象筆記的Python SDK介面開發個自用小工具
※PyQt5系列教程(19):微調框2
※看我如何進行Python對象注入利用