1.python黑帽子-基础的网络编程工具

python黑帽子:黑客与渗透测试编程之道(第二版)

1.基础的网络编程工具

TCP客户端

import socket

target_host="127.0.0.1"
target_port=8701

#创建socket对象
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#建立socket链接
client.connect((target_host,target_port))

print("--------")
data="GET / HTTP/1.1\r \n Host: fjdh.com\r\n\r\n"

print(data)
print(b"GET / HTTP/1.1\r \n Host: bilibili.com\r\n\r\n")
#发送数据
client.send("hello")

#接收数据
response=client.recv(4096)


print(response.decode)
print(response)

#关闭链接
client.close()

代码分析: tcp服务端代码由以几个步骤组成:
1.创建socket对象
2.建立socket链接,需要目标对象的ip地址以及端口,这一步就成功的建立好了链接了
3.发送数据
4接收数据
5.关闭连接

TCP服务端

import  socket

import threading

ip='0.0.0.0'

port=8701

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,addr=server.accept()
        print(f"[*] Accepted connection from {addr[0]}:{addr[1]}")
        client_handle=threading.Thread(target=handle_client,args=(client,))
        client_handle.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()

tcp服务器代码分析,主要由以下步骤组成:
1.创建socket对象
2.绑定需要主机ip,以及对外开发(监听)的端口
3.不间断监听
4.监听成功,建立会话,得到socket对象,以及发送请求的ip
5.接收数据
6.发送数据

运行结果如下:
运行代码效果图片

udp客户端代码

import socket

target_host="127.0.0.1"
target_port=9997

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服务器,文章中没有udp服务的代码

编写netcat工具代码,利用自己的工具实现netcat的功能

import argparse
import  socket
import shlex
import subprocess
import sys
import textwrap
import threading

class NetCat:
    def __init__(self,args,buffer=None):
        self.args=args
        self.buffer=buffer
        self.socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)


    def run(self):
        if self.args.listen:
            self.listen()
        else:
            self.send()


    def send(self):
        self.socket.connect((self.args.target,self.args.port))
        if self.buffer:
            self.socket.send(self.buffer)

        try:
            while True:
                recv_len=1
                response=''
                while recv_len:
                    data=self.socket.recv(4096)
                    recv_len=len(data)
                    response+=data.decode()
                    if recv_len<4096:
                        break

                if response:
                    print(response)
                    buffer=input('> ')
                    buffer+='\n'
                    self.socket.send(buffer.encode())
        except KeyboardInterrupt:
            print('User terminated.')
            self.socket.close()
            sys.exit()


    def listen(self):
       self.socket.bind((self.args.target,self.args.port))
       self.socket.listen(5)

       while True:
           client_socket,_ =self.socket.accept()
           client_thread=threading.Thread(
               target=self.handle,args=(client_socket,)
           )

           client_thread.start()


    def handle(self,client_socket):
        if self.args.execute:
            output=execute(self.args.execute)
            client_socket.send(output.encode())

        elif self.args.upload:
            file_bffer=b""
            while True:
                data=client_socket.recv(4096)
                if data:
                    file_bffer+=data
                else:
                    break
            with open(self.args.upload,'wb') as f:
                f.write(file_bffer)

            message=f"Save file {self.args.upload}"

            client_socket.send(message.encode())

        elif self.args.command:
            cmd_buffer=b" "
            while True:
                try:
                    client_socket.send(b"BHP :#> ")
                    while '\n' not in cmd_buffer.decode():
                        cmd_buffer++client_socket.recv(64)

                    response=execute(cmd_buffer.decode())
                    if response:
                        client_socket.send(response.encode())
                    cmd_buffer=b" "

                except Exception as e:
                    print(f"server killed {e}")
                    self.socket.close()
                    sys.exit()




def execute(cmd):
    cmd=cmd.strip()
    if not cmd:
        return


    output=subprocess.check_output(shlex.split(cmd),stderr=subprocess.STDOUT)

    return output.decode()


if __name__=='__main__':
    parser=argparse.ArgumentParser(
        description='BHP Net tool',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=textwrap.dedent("""Example:
        natcat.py -t 192.168.1.108 -p 5555 -l -c  #command shell
        netcat.py -t 192.168.1.108 -p 5555 -l -u=mytest.txt #upload to file
        netcat.py -t 192.168.1.108 -p 5555 -l -e=\"cat /etc/passwd\" #execute command
        echo 'ABC'| ./netcat.py -t 192.168.1.108  -p 135 #echo text to server port 135
        netcat.py -t 192.168.1.108 -p 5555 $connect to server
        
        """))

    parser.add_argument('-c','--command',action='store_true',help='command shell')
    parser.add_argument('-e','--execute',help='execute specified command')
    parser.add_argument('-l','--listen',action='store_true',help='listen')
    parser.add_argument('-p','--port',type=int,default='5555',help='specified port')
    parser.add_argument('-t','--target',default='192.168.1.203',help='speciified IP')
    parser.add_argument('-u','--upload',help='upload file')
    args=parser.parse_args()

    if args.listen:

        buffer=b''

    else:
        buffer=sys.stdin.read()

    nc=NetCat(args,buffer.encode())
    nc.run()

代码分析:
1.首先看main函数,使用标准库里的argparse库创建了一个带命令行界面的程序
2.然后就是检查参数,是否存在监听
3.创建NetCat类,并实例化
4.运行该实例化的run函数
5.NetCat类中主要由run(),listen(),handle()三个数据组成 run()函数依据是否存在listen参数,判断是监听,还是发送数据

备注:这里再敲代码的过程中有一处代码笔误,然后去找很多文章复现代码,没有发现自己的问题,然后利用chatgpt解决了。

在这里插入图片描述
代码运行效果:
后续补充

总结:

按照python黑帽子:黑客与渗透测试编程之道(第二版),利用python语言实现了tcp客户端,tcp服务端,udp客户端,以及复现netcat工具。

假如有两台主机,分布为主机1,主机2。主机1创建监听,主机2对主机1发送信息,其中主机2发送的信息为操作系统命令例如whoami,ls. 当主机1和主机2建立完socket连接后,主机2发送的信息,由主机1接收并运行,并将运行的结果发送给主机2.由此完成了通信。

参考资料:

1.python黑帽子:黑客与渗透测试编程之道
2.如何实现反弹shell

3.python实现tcp通信
4.多进程与多线程
5.netcat使用
6.python黑帽子代码实现
7.python黑帽子代码实现
8.python黑帽子代码实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值