• python渗透测试入门——基础的网络编程工具


    《Python黑帽子——黑客与渗透测试编程之道学习》这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来。

    1.基础的网络编程工具。

    实验环境:vscode+kali虚拟机

    (1)TCP客户端

    复制代码
    from ctypes.wintypes import tagRECT
    from http import client
    from pydoc import cli
    import socket
    from urllib import response 
    
    target_host = "www.baidu.com"
    target_port = 80
    
    
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    client.connect((target_host,target_port))
    
    client.send(b"GET / HTTP/1.1\r\nHost:baidu.com\r\n\r\n")
    
    response =client.recv(4096)
    
    print(response.decode())
    
    client.close()
    复制代码

     首先创建一个带有AF_INET和SOCK_STREAM参数的socket对象。AF_INET参数表示我们将使用标准的IPv4地址或主机名,SOCK_STREAM表示这是一个TCP客户端。然后,我们将该客户端连接到服务器,并发送一些bytes类型的数据。最后一步,接收返回的数据并将其打印到屏幕上,再关闭socket。以下是运行结果。

    (2) UDP客户端

    复制代码
    from http import client
    import socket
    
    target_host = "127.0.0.1"
    target_port = 80
    
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    client.sendto(b"AAABBBCCC",(target_host,target_port))
    
    data, addr = client.recvfrom(4096)
    
    print(data.decode())
    
    client.close()
    复制代码

    UDP客户端和TCP客户端相差不大,并且作用也相去不远,在创建socket对象时,需要将socket类型改成SOCK_DGRAM,之后调用sendto()函数即可。UDP是一个无连接协议,所以不需要connect()函数建立连接。recvfrom()函数不仅返回接收到的数据,还会返回详细的数据来源信息(主机名和端口号)。。

    (3)TCP服务端(多线程)

    复制代码
    from http import client, server
    import socket
    import threading
    from urllib import request
    
    IP = '0.0.0.0'
    PORT = 9998
    
    def main():
        server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        server.bind((IP,PORT))
        server.listen(5)
        print(f'[*] Listening on {IP}:{PORT}')
    
        while True:
            client, address = server.accept()
            print(f'[*] Accepted connection from {address[0]}:{address[1]}')
            client_handler = threading.Thread(target=handle_client, args=(client,))
            client_handler.start()
    
    def handle_client(client_socket):
        with client_socket as sock:
            request = sock.recv(1024)
            print(f'[*] Received: {request.decode("utf-8")}')
            sock.send(b'ACK')
    
    if __name__ == '__main__':
        main()
    复制代码

    我们先指定服务器应该监听哪个IP地址和端口。接着,让服务器开始监听,并把最大连接数设为5。下一步,让服务器进入主循环中,并在该循环中等待外来连接。当一个客户端成功建立连接的时候,将接收到的客户端socket对象保存到client变量中,将远程连接的详细信息保存到address变量中。然后,创建一个新的线程,让它指向handle_client函数,并传入client变量。创建好后,我们启动这个线程来处理刚才收到的连接,与此同时服务端的主循环也已经准备好处理下一个外来连接。而handle_client函数会调用recv()接收数据,并给客户端发送一段简单的回复。那么我们用前面写好的TCP客户端给服务端发送几个测试包。

    首先开启服务端:

     

     在客户端发送测试包,即可看到:

     

     这次的分享先到这里,下一次将扩充这次这几个实验的功能。

  • 相关阅读:
    张高兴的 MicroPython 入门指南:(一)环境配置、Blink、部署
    QT--线程
    计算机毕业设计选什么题目好?springboot 幼儿园管理系统
    java基于Springboot+vue的好口味水果果蔬销售商城网站
    外发文件怎么保存
    python 办公自动化(Excel)
    Python机器学习零基础理解线性回归分析
    Hadoop3:MapReduce中的Reduce Join和Map Join
    java中的BigDecimal使用
    Go语言开发环境搭建
  • 原文地址:https://www.cnblogs.com/yaolingyu/p/16821362.html