《Python 黑帽子》学习笔记 - 原书 netcat 代码分析 - Day 7

本文详述了Python实现netcat的功能,包括数据传输、文件上传、命令执行和命令行shell。分析了代码实现逻辑,特别是客户端和服务端的交互,以及在测试过程中遇到的socket.error 10054问题,并提出了处理此类异常的通用方法。同时,提到了原书代码的优化需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单介绍了 netcat 的功能和运用后,开始学习理解该书中实现的 netcat 代码。

功能

  • 从标准输入中读取数据,并通过网络发送数据。
  • 上传文件。
  • 执行命令。
  • 命令行 shell.

实现

  1. 解析命令行选项和参数,根据选项设置相应功能标识及参数变量,如果选项和参数不正确打印帮助信息。
  2. 依据功能标识变量,设计调用功能函数的逻辑流程。主体包括两部分,向外连接和本地监听。
  3. 向外连接部分,自身作为客户端,向服务端发送和接收数据。
  4. 本地监听部分,自身作为服务端,绑定端口监听,对连接进来的客户端,新创建客户端处理线程,处理客户端请求。
  5. 客户端处理线程,根据上传文件、执行命令、命令行 shell 等功能,调用相应功能函数,完成数据发送和接收。
  6. 命令行 shell 功能,创建一个 shell 的子进程,传入客户端发送过来的 shell 命令给子进程,并把执行结果发送给客户端。
  7. 执行命令功能,会创建一个子进程,根据 execute 选项的参数执行相应命令,命令可以为程序或脚本。

原书代码附笔记最后,也可以在下面的地址下载。

https://nostarch.com/blackhatpython

测试

对原书 netcat 的测试,这里选取 “命令行 shell ” 和 “执行命令” 两个功能进行测试。

“命令行 shell ” 功能:

test-shell

“执行命令” 功能:

test-exec-calc

要注意的是,对于 sys.stdin.read(), 需要发送 ctrl + d (Linux) 或 ctrl + z (Windows) 以避免从标准输入中读取数据,程序才能往下继续执行。

原书 netcat 的代码要优化的地方非常多,而且有些代码会让 Python 进程死掉,用了 N 次 taskkill /f /im python.exe 来结束进程,重新测试。搞得自己都没信心再往下跟,举个测试上传文件功能的例子,如图:

test-upload

服务端运行

python bhpnet.py -l -p2222 -u1.txt

等待客户端连接,并接受客户端发送的数据,存为文件。客户端用

nc 127.0.0.1 2222

连接服务端,并发送数据。或者用 echo 和管道直接发送数据。

echo -ne "aaaaaaaasssssssss\r\naaaaa\nss\n" | nc 127.0.0.1 2222

代码为:

# check for upload
    if len(upload_destination):

        # read in all the bytes of the file and write to our destination

        file_buffer = ""

        # keep reading data until none is available
        while True:
            data = client_socket.recv(1024)

            if not data:
                break
            else:
                file_buffer += data

        # now we take these bytes and write them out
        try:
            file_descriptor = open(upload_destination, "wb")
            file_descriptor.write(file_buffer)
            file_descriptor.close()

            # acknowledge that we wrote the file out
            client_socket.send("Successfully saved file to %s/r/n" % upload_destination)
        except:
            client_socket.send("Failed to save file to %s/r/n" % upload_destination)

异常发生在

data = client_socket.recv()

语句,调试的时候,当客户端主动强制断开连接后(Windows 终端下 ctrl+c),socket.recv() 函数产生异常,错误为 [Errno 10054]. 而且这里的 data 不会为空,socket 不管是阻塞还是非阻塞,socket.recv() 的返回值都不会为空字符,所以用 if not data: 作为跳出循环的判断不合适。

D:\myProjects\Black-Hat-Python\venv-p2\
### 关于《Python黑帽子第二版》中的Netcat实现 在网络安全工具中,`netcat`是一个非常重要的网络实用程序。通过使用Python来重新构建这个功能强大的工具,《Python黑帽子第二版》提供了详细的指导以及源码实例。 中提到创建一个简单的TCP客户端和服务端的例子[^1]: #### 创建TCP服务器 ```python import socket def tcp_server(host='localhost', port=9999): """启动一个基本的TCP服务器""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen(5) print(f'[*] Listening on {host}:{port}') while True: client_socket, addr = s.accept() print(f'[+] Accepted connection from {addr[0]}:{addr[1]}') request = client_socket.recv(1024) print(f"[++] Received: {request.decode('utf-8')}") client_socket.send(b"ACK!") client_socket.close() if __name__ == '__main__': tcp_server() ``` 此脚本会监听指定地址上的连接请求,并处理来自客户端的消息。当接收到数据包时,它将打印消息并回复确认信息给发送者。 #### 构建TCP客户端 为了与上述服务端通信,可以编写如下所示的一个简易客户端: ```python import socket def tcp_client(target_host="127.0.0.1", target_port=9999): """向目标主机发起TCP连接""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client: client.connect((target_host, target_port)) client.send(b"GET / HTTP/1.1\r\nHost: google.com\r\n\r\n") response = client.recv(4096) print(response.decode()) if __name__ == "__main__": tcp_client() ``` 这段代码尝试连接到特定的目标机器和端口上,模拟HTTP GET请求的行为并向对方发送一些数据;之后读取响应内容显示出来。 这两个例子展示了如何利用Python快速搭建起基础版本的Netcat工具。当然,在实际应用过程中还需要考虑更多因素如错误处理机制、多线程支持等特性以增强其健壮性和功能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值