Socket的TCP、UDP连接学习以及实现远程shell反弹

2024-05-04 21:38

本文主要是介绍Socket的TCP、UDP连接学习以及实现远程shell反弹,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Socket

学习的视频:https://www.bilibili.com/video/BV1UJ411M7tx?p=2

TCP连接:可靠的、收发数据前 需要建立连接,三次握手。
UDP:不可靠的,不需要建立连接

创建套接字

socket.socket(family[,type[,port])

family 可使用AF_UNIX 或者AF_INET

  • AF_INET 使用IPV4 协议
    AF_INET6 使用ipv6协议

type 类型,可以是面向连接还是非连接的

  • . SOCK_STREAM (tcp连接)
  • . SOCK_DGRAM (UDP连接)

大体步骤:

	创建套接字实现功能,发送数据关闭套接字
套接字对象方法描述
服务器端套接字
s.bin()绑定地址(主机、端口)到套接字绑定地址(host,port)到套接字, 在 AF_INET下,以元组(host,port)的形式表示地址。
s.listen()开始tcp监听开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了
s.accept()*被动接受TCP客户端连接,等待连接到来,返回的是两个值,a,ip=s.accept() a是套接字信息和远程ip 本地ip信息
客户端套接字函数客户端套接字函数
s.connetc()主动初始化TCP服务器连接,一般addr格式为(host,port)元组
s.connetc_ex()Connect函数的扩展版本,出错时返回错误代码,而不是抛出异常
公用套接数字函数
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字数量,该数量可能小于string的字节大小,使用时候得加密 encode 或者decode,py2不需要
s.sendall()完整发送TCP数据
s.recvfrom()接受UDP数据,返回值是数组,i【0】是接受的数据,i【1】是ip和port
s.sendto()发送UDP数据,内容为元组sendto( data.encode(‘gbk’),(ip,port))
s.getpeemame()连接当前套接字的远端地址
s.getsockname()当前套接字的地址
s.close()关闭套接字

UDP数据发送实例:

import socket#
#最简单的UDP发送数据 
udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip=('127.0.0.1',8080)   #ip和port都是源组类型
data=input('please input data:')  #将输入内容发送
udp.sendto(data.encode('utf-8'),ip)  #sendto是udp传输数据函数 
udp.close() #关闭传输-----这个是加深印象改的------
import socket
while True:udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)ip=('127.0.0.1',8080)   #ip和port都是源组类型# data=input('please input data:')  #将输入内容发送data='hello'udp.sendto(data.encode('gbk'),ip)  #sendto是udp传输数据函数re=udp.recvfrom(1024)  #sed是建立连接发送,recv是接受发送的数据print(re,'6666'+str((ip)))
udp.close()
发送、接收数据实例:
import socketudp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip=('127.0.0.1',8080)
data=input('please input data:')
udp.sendto(data.encode('utf-8'),ip)# 接收对方的数据
recv_data = udp.recvfrom(1024*1024) #接受的最大数1024*1024=1M 字节
#显示对方发送的数据  内容为元组 第一个元素为发送的数据,第二个为对方的IP 和 PORT
print(recv_data[0].decode('gbk'))
print(recv_data[1])
udp.close()

udp实例2:

from socket import  *def send_msg(udp_socket):msg=input('请输入你要发送的内容:')ip = input('请输入对方的IP地址')port=int(input('请输入对方的端口号'))udp_socket.sendto(msg.encode('utf-8'),(ip,port))print('发送成功!')
def recv_msg(udp_socket):recv_data=udp_socket.recvfrom(1024)ip=recv_data[1]content=recv_data[0].decode('GBK')print(">>>%s:%s"%(str(ip),content))def main():#1.创建udp_socket= socket(AF_INET,SOCK_DGRAM)#2.绑定端口udp_socket.bind(("",8081))#判断输入内容来选择 接收还是发送while True:options_num=input('请输入序号:')if options_num=='1':   # 先判断是等于1 时候执行的send_msg(udp_socket)#开始写发送内容的方法if options_num=='2':recv_msg(udp_socket)else:print('输入有误,请重新输入!')
if __name__ == '__main__':main()

报错:
https://blog.csdn.net/wx1458451310/article/details/78593994

TCP连接实例:

#客户机

import  socket
#客户机
ip=('127.0.0.1',2222)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect(ip)
# data='wecom'
while True:data=input('plase input ')a=s.send(data.encode('gbk'))print(a)  # 返回的是字符串大小s.close()

服务器端

#服务器
from  socket import *## 填写ip信息
ip=('',2222)
s=socket(AF_INET,SOCK_STREAM)  # 开启套接字
s.bind((ip)) #绑定ip
s.listen(5)        # 开始监听while True:client,addr=s.accept()   # 被动等待连接print(client,addr)  # 这里返回两个值,一个是套接字信息,一个是地址while True:data=client.recv(1024)print(data.decode('gbk'))# a=s.recv(1024)# print(a)

排错:
本来是想将服务器接收到的内容,加个服务器时间点 然后再将原内容返回给客户端。
但是奈何提示的是数据类型错误:
TypeError: a bytes-like object is required, not 'str
原来是TCP server收到的是加密的,因为再客户端已经send().encode()了 。
所以说服务端收到了bytes类型的数据。

想要实现这个效果 就只能将接收到的数据先解密decode()了 然后再将 发送的内容拼接起来。 然后最后再一起send 过去。才可以实现
(再py2可以直接用 3不可以)

下面这是原来的代码:

from  socket import *
from time import ctime
host=''
port=2222
bufsize=1024
addr=(host,port)server = socket(AF_INET,SOCK_STREAM)
server.bind(addr)
server.listen(5)while True:print('等待连接....')tcpClient,addr=server.accept()print('主机'+str(addr)+'连接')while True:data=tcpClient.recv(bufsize)if not data:breakprint(data.decode('gbk'))tcpCliemt.semd('asd %s:%s'%(data.decode('gbk'),ctime()))#看视频的学习的连接 :https://www.bilibili.com/video/BV1jt411J7nM?p=7tcpClient.close()server.close()报错错误提示:Traceback (most recent call last):File "D:/python object/socket2.py", line 22, in <module>tcpClient.send('asd %s:%s'%(data.decode('gbk'),ctime()))
TypeError: a bytes-like object is required, not 'str'

改进的代码:

from  socket import *
from time import ctime
from subprocess import  PIPE,Popen
host=''
port=2222
bufsize=1024*1024
addr=(host,port)server = socket(AF_INET,SOCK_STREAM)
server.bind(addr)
server.listen(5)while True:print('等待连接....')tcpClient,addr=server.accept()# print('主机'+str(addr)+'连接')time =ctime() # 读取服务器当前时间while True:data=tcpClient.recv(bufsize)if not data:break# print(data.decode('gbk'))# tcpClient.send(('a').encode('gbk'))data1='【服务器的时间:'+str(time)+'】你发送到服务器的内容:'+str(data.decode('gbk'))  #服务器时间和接受数据拼接#将需要发送给客户机的信息进行拼接,然后加密发送print('[接收到的内容: ',data.decode('gbk'),']\n')#tcpClient.send(data1.encode('gbk')) #发送data1
tcpClient.close()
server.close()

#上面的tcpClient.send(data1.encode(‘gbk’))
这句下面加入下面这些代码,就成了一个远程Shell窗口了。

 # print(data.decode('gbk')) #由于发送过来的是加密的 所以得解密看看明文是否正确
cmd= Popen(data.decode('gbk'),shell=True,stdin=PIPE,stdout=PIPE,stderr=PIPE)
cmd_data=cmd.stdout.read()
cmd_error=cmd.stderr.read()
# tcpClient.send(data1.encode('gbk'))
if  len(cmd_error)==0:  #判断,如果错误结果字段=0 那就是无报错,将正常内容发送。tcpClient.send(cmd_data)  # 这个cmd返回值本身就是byte类型,所以不用加密
else:tcpClient.send(cmd_error) #将错误内容发送

这篇关于Socket的TCP、UDP连接学习以及实现远程shell反弹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960142

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文