《Python黑帽子》python3代码实现(第二章)

《Python黑帽子》代码实现

本篇笔记全部用python3实现,本人大一在校生第一次写博客,有错误之处希望大家积极指出。
参考大佬博客:
https://www.cnblogs.com/zhangyuxiang666/p/11010581.html
https://blog.csdn.net/qq_39038028/article/details/72860112

第二章 网络基础:

创建Tcp客户端(tcpClient.py):

示例中引用了首先导入socket模块,使用socket()方法来创建套接字并实例化对象,AF_INET表明IPv4地址,SOCK_STREAM表明是关于TCP套接字,然后使用connect()方法连接tcp服务端,使用send()recv()方法来发送和接受数据,这里需要注意的是python3套接字的传输需要将数据转为byte的形式,使数据可视化又需要解码为str,这里是简单的构造了一个http请求。

# 导入socket模块
import socket

target_host = "www.baidu.com"
target_port = 80

# 建立一个socket对象
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(1024)

print(response.decode('utf-8'))

在这里插入图片描述
运行结果是收到了www.baidu.com的响应。

创建UDP客户端(udpClient.py):

这里udp客户端与tcp客户端区别不大,udp是传输数据是不需要建立连接的,我们只需要构建套接字对象,将类型设置为SOCK_DGRAM表明为udp套接字,然后使用sendto()recvfrom()方法来发送与接收数据。

import socket

target_host = "172.18.220.229"
target_port = 10001

# 建立socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 发送数据
client.sendto(b"Hello, Server", (target_host, target_port))

# 接收数据
data, addr = client.recvfrom(4096)

print(data.decode('utf-8'))

这里使用kali中的nc工具监听10001端口,并收到了客户端所发的数据,然后服务端发送数据,客户端也成功收到。
在这里插入图片描述
在这里插入图片描述

创建TCP服务端(tcpServer.py):

创建tcp服务端,首先构建tcp套接字对象,然后使用bind()方法监听指定的端口,listen()方法设置最大连接数,然后使用循环并启用多线程,使用accept()方法来接受客户端连接,当客户端成功建立连接时,会将客户端套接字与客户端信息分别保存到clientaddr变量中。

import socket
import threading

bind_ip = "127.0.0.1"
bind_port = 10001

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind((bind_ip, bind_port))

server.listen(5)

print("[*] Listening on %s:%d" % (bind_ip, bind_port))


# 这是客户端处理线程
def handle_client(client_socket):
    # 打印出客户端发送得到内容
    request = client_socket.recv(1024)

    print("[*] Received: %s" % request.decode('utf-8'))
    # 返还一个数据包
    client_socket.send(b'ACK!')
    client_socket.close()


while True:
    client, addr = server.accept()
    print("[*] Accepted connection from: %s:%d" % (addr[0], addr[1]))

    # 挂起客户端线程,处理传入得数据
    client_thread = threading.Thread(target=handle_client, args=(client, ))
    client_thread.start()

这里验证tcp服务端使用之前所写得程序即可,注意对应ip与端口号!!!
在这里插入图片描述
在这里插入图片描述

取代netcat:

这里需要特别注意编码问题,这里我引入了个第三方库chardet用于解决此类问题,在linux系统中默认编码为utf-8,在windows系统中默认编码为gbk。

import sys
import getopt
import threading
import chardet
import subprocess
import socket

# 定义一些全局变量
listen = False
command = False
execute = ""
upload_destination = ""
target = ""
port = 0


def usage():
    print("BHP Net Tool")
    print("Usage: bhpnet.py -t target_host -p port")
    print("-l --listen    -listen on [host]:[port] for incoming connections")
    print("-e --execute=file_to_run    -execute the given file upon receiving a connection")
    print("-c --command    -initialize a command shell")
    print("-u --upload=destination    -upon receiving connection upload a file and write to [destination]")
    print("Examples:")
    print("bhpnet.py -t 192.168.0.1 -p 5555 -l -c")
    print("bhpnet.py -t 192.168.0.1 -p 5555 -l -u=c:\\target.exe")
    print("bhpnet.py -t 192.168.0.1 -p 5555 -l -e=\"cat /etc/passwd\"")
    print("echo 'ABCDEFGHI' | ./bhpnet.py -t 192.168.11.12 -p 135")
    sys.exit(0)


def main():

    global listen, command, execute, upload_destination, target, port

    if not len(sys.argv[1:]):
        usage()
	# 读取命令行选项
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hle:t:p:cu:", ["help", "listen", "execute=", "target=", "port=", "command", "upload="])
    except getopt.GetoptError as err:
        print(str(err))
        usage()

    for o, a in opts:
        if o in ('-h', "--help"):
            usage()
        elif o in ("-l", "--listen"):
            listen = True
        elif o in ("-e", "--execute"):
            execute = a
        elif o in ("-t", "--target"):
            target = a
        elif o in ("-p", "--port"):
            port = int(a)
        elif o in ("-c", "--command"):
            command = True
        elif o in ("-u", "--upload"):
            upload_destination = a
        else:
            assert False, "Unhandled Option"
	# 我们是进行监听还是仅从标准输入发送数据?
    if not listen and len(target) and port > 0:
    	# 从命令行读取内存数据
    	# 这里将阻塞,所以不在向标准输入发送数据时发送ctrl-D
        buffer = sys.stdin.read()
        # 发送数据
        client_sender(buffer)
	# 我们开始监听并准备上传文件、执行命令
	# 放置一个反弹shell
	# 取决于上面得命令行选项
    if listen:
        server_loop()


def server_loop():
    global target
	# 如果没有定义目标,那么我们监听所有接口
    if not len(target):
        target = "0.0.0.0"

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((target, port))
    server.listen(5)

    while True:
        client_socket, addr = server.accept()
        # 分析一个线程处理新的客户端
        client_thread = threading.Thread(target=client_handler, args=(client_socket, 
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值