針對linux系統(tǒng)進行滲透時赫舒,我們會在相對安全的環(huán)境下進行攻擊。一般我們會在目標機器上安裝一些虛擬化的軟件唐全,并且針對系統(tǒng)安裝相應的環(huán)境埃跷。為了滲透成功,我們需要在靶機上種植后門邮利,但是現在大部分殺毒軟件都會對MSF產生的后門進行查殺弥雹,所以在實戰(zhàn)中我們需要避免使用msf這種工具產生后門。這就需要我們自己編寫后門程序了延届,這篇文章就是講如何編寫msf中的其中一個payload:reverse_tcp模塊剪勿。
下面簡單的反向tcp連接做一個解釋:
Reverse_tcp:在正向連接中,客戶端通過訪問服務端上開放的端口進行通信方庭;而反向鏈接則是客戶端開放端口厕吉,然后等待服務端進行連接。這一方法常用于繞過服務端的防火墻械念。
舉個例子头朱,處于防火墻防護下的計算機是禁止外來鏈接訪問的,但是后門可以很容易使這臺計算機訪問互聯網上的遠程主機订讼。一旦連接建立,遠程主機就可以在受害計算機中執(zhí)行命令髓窜。這種攻擊方式是非常有效的,如果在受害機器本地起一個shell,即使在沒有用戶控制的情況下都容易被發(fā)現寄纵。
今天的文章中鳖敷,我們會通過python開發(fā)反向tcp后門。接下來幾篇文章中我還會繼續(xù)介紹如何使用python編寫其他模塊的后門程拭。
現在我們將要編寫三個程序塊:連接定踱,發(fā)送指令,接收輸出.讓我們開始吧~
攻擊者的服務端代碼
之前已經敘述過恃鞋,作為攻擊者崖媚,我們不能直接連接受害服務器,這樣可能會觸發(fā)殺毒軟件恤浪,或者我們會被禁止連接畅哑。但是受害機器連接到服務端,然后再發(fā)送指令水由,這樣就可以很大幾率繞過防火墻荠呐。我們第一步先初始化sockets模塊,以及處理反向連接砂客。
這么多代碼看著煩?那我們分解一下吧鞠值?
1. 導入相關數據包
2. 通過sys.argv模塊接收套接字端口信息
3. 設置套接字媚创,綁定套接字,偵聽套接字端口彤恶,等待連接
4. 如果有人訪問钞钙,腳本會輸出一串消息。
5. 腳本一直處于無限循環(huán)當中粤剧,等待發(fā)送命令歇竟,以及接收命令回顯。
6. 如果輸入的命令為空抵恋,那么繼續(xù)下一個循環(huán)
7. 如果命令是exit()焕议,發(fā)送給客戶端,就會同時關閉本地和遠程的連接弧关。
8. 如果上述兩種情況都沒有的話盅安,腳本就會將輸入當成要在受害機器上執(zhí)行的命令,并且接收返回的結果世囊。
9. 我們將消息大小和內容分離出來别瞭。大小命名為total_size,內容命名為:result。
10. 如果發(fā)現輸出的大小和total_size不匹配株憾,那么我們繼續(xù)運行一個while循環(huán)蝙寨,知道全部接收完為止晒衩。
11. 輸出結果,并且去掉最后的換行符
12. 如果有一個步驟存在錯誤墙歪,那么socket通信就會關閉
這并不難吧听系,所以我不會一行一行的解釋我寫的代碼,只需要了解下重要的模塊就好了虹菲,現在我們編寫客戶端的代碼吧~
被攻擊端代碼
客戶端連接到我們的機器并不需要太多代碼~
我還是將它分解一下講解吧~
1. 通過sys.argv模塊在命令行接收要連接的對象:ip和端口
2. 建立套接字對象,連接到指定地址和端口
3. 如果連接成功毕源,我們就會收到來自服務端的信息
4. 如果命令不是exit(),則就會通過sp模塊執(zhí)行命令浪漠。命令執(zhí)行的結果會通過sh進行傳遞。
5. (out,err)是標準化輸出以及標準錯誤流
6. 將輸出流寫入result變量
7. 將長度設置為16字節(jié)是為了服務端更好的識別霎褐。
8. 然后計算長度址愿,將長度寫入到輸出當中。(和服務端的提取長度相結合)
9. 如果收到exit()命令冻璃,就會跳出循環(huán)必盖,關閉連接。
在服務端執(zhí)行腳本:
root@Sploit:~/Desktop# python reverseTcp.py '' 8000
客戶端在運行過程中填寫相關信息:
root@Sploit:~/Desktop# python connect.py 127.0.0.1 8000
下圖是執(zhí)行的命令截圖:
并且,在受害機器上沒有任何輸出塌忽,因為我們沒有在代碼中采用任何輸出代碼