首页 > 编程语言 >Python黑客编程之类nc工具

Python黑客编程之类nc工具

时间:2023-02-05 11:56:00浏览次数:45  
标签:args socket Python self nc client buffer 黑客 file

目的

  • 用python socket编写一款类似NetCat的工具,可以在服务器上远程执行命令,从服务器上下载文件

代码

  • 服务端和客户端用同一套代码,用-l参数进行区分
import argparse
import shlex
import socket
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)

        if self.args.file:
            file_buffer = b''
            while True:
                data = self.socket.recv(4096)
                data_len = len(data)
                file_buffer += data
                if data_len < 4096:
                    break
            with open(self.args.file, 'wb') as fp:
                fp.write(file_buffer)
            message = "Successfully send file {} to {}".format(self.args.file, socket.gethostbyname(socket.gethostname()))
            self.socket.send(message.encode())
            print("Successfully received file {}".format(self.args.file))

        if not self.args.command:
            return

        try:
            while True:
                print("<NetCat: #>", end="")
                buffer = input()
                buffer += '\n'
                self.socket.send(buffer.encode())
                data_len = 1
                content = ''
                while data_len:
                    data = self.socket.recv(4096)
                    data_len = len(data)
                    content += data.decode()
                    if data_len < 4096:
                        break
                if content:
                    print(content, end="")

        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_client, args=(client_socket,))
            client_thread.start()

    def handle_client(self, client_socket):
        if self.args.file:
            with open(self.args.file, 'rb') as fp:
                client_socket.send(fp.read())
            recv_buffer = client_socket.recv(64)
            print(recv_buffer.decode())

        if self.args.execute:
            result = self.execute(self.args.execute)
            client_socket.send(result.encode())

        if not self.args.command:
            return

        if self.args.command:
            cmd_buffer = b''
            while True:
                try:
                    while '\n' not in cmd_buffer.decode():
                        cmd_buffer += client_socket.recv(64)
                    result = self.execute(cmd_buffer.decode())
                    if result:
                        client_socket.send(result.encode())
                    cmd_buffer = b''
                except Exception as e:
                    print("Server killed {}".format(e))
                    client_socket.close()
                    sys.exit()

    def execute(self, cmd):
        cmd = cmd.strip()
        if not cmd:
            return
        result = subprocess.check_output(shlex.split(cmd), stderr=subprocess.STDOUT)
        return result.decode()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Python Netcat Tool',
                                     formatter_class=argparse.RawDescriptionHelpFormatter,
                                     epilog=textwrap.dedent('''
                                     Example:
                                         netcat.py -t 192.168.1.1 -p 2222 -l -c #command shell
                                         netcat.py -t 192.168.1.1 -p 2222 -l -u=test.txt #upload file
                                         netcat.py -t 192.168.1.1 -p 2222 #connect to server
                                     '''))
    parser.add_argument('-c', '--command', action='store_true', help='open a command shell')
    parser.add_argument('-e', '--execute', help='execute specified command')
    parser.add_argument('-l', '--listen', action='store_true', help='open listening for server')
    parser.add_argument('-p', '--port', type=int, default=8080, help='input port')
    parser.add_argument('-t', '--target', default='127.0.0.1', help='input IP')
    parser.add_argument('-f', '--file', help='upload file')
    args = parser.parse_args()
    if args.listen:
        buffer = ''
    else:
        buffer = sys.stdin.read()

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

遇到的问题

  • 如何结束stdin.read:有时候用ctrl+d,有时候用ctrl+z加回车
  • 建立socket连接前要注意关闭防火墙
  • 对于windows环境下用subprocess开启子进程执行命令,需要指明powershell或者cmd,否则部分命令执行不了
  • 书里是远端发来shell提示符,会导致回显对不上,我改成了本地print提示符,才对上了

效果

  • 传文件-客户端
  • 传文件-服务端
  • 执行命令-客户端
  • 执行命令-服务端

不足之处

  • 这只是一个小demo,功能很单一
  • 没有使用select,recv和send收发都是阻塞式的,同步通信,回合制游戏...

标签:args,socket,Python,self,nc,client,buffer,黑客,file
From: https://www.cnblogs.com/z5onk0/p/17093111.html

相关文章

  • 20天零基础自学Python | Day5 8大数据类型
    大家好,我是宁一。这节课我们来讲讲python的8大数据类型,已经这些数据类型的区别。1、什么是数据类型上节课说过,后面我们不管是做网站,还是做数据分析,都要处理各种各样的数据,比......
  • 20天零基础自学Python | Day4 变量
    大家好,我是宁一。后面我们不管是做网站,还是做数据分析,都要处理各种各样的数据,比如姓名、生日、分数等。变量,就是我们给这些数据起的名字。1、定义变量比如我们用变量定义一......
  • 20天零基础自学Python | Day6 运算符大全
    大家好,我是宁一。运算符是编程语言中最基本的知识点,是必须要掌握的,不仅适用于Python,其他编程语言也都能用到。1、算术运算符(1)加减乘除跟我们上学时学的都是一样的,注意乘法和......
  • 20天零基础自学Python | Day7 Number(数字)
    大家好,我是宁一。Python数字数据类型是用来存储数值的。是我们从小学就开始接触的老朋友了,也是python中最基础的数据类型。1、Number数据类型python3的Number数据类型包......
  • 20天零基础自学Python | Day8 String字符串
    大家好,我是宁一。字符串是以英文引号括起来的任意文本。不管是单引号还是双引号,只要成对出现的就行。比如:'abc'、"宁一"、"hello"、'123'1、获取字符串如果我们需要获取字符......
  • 20天零基础自学Python | Day9 List列表用法大全
    大家好,我是宁一。今天我们来讲讲Python列表。列表就是用来保存一组数据的,使用中括号[]将数据包起来,数据之间用英文逗号,隔开。比如:[1,2,3,4,5]1、列表特点前面课程给大家举......
  • 恢复truncate后的表
    文档课题:恢复truncate后的表.数据库:oracle11.2.0.41、模拟异常1.1、建测试表[oracle@leo-oel150trace]$sqlplus/assysdbaSQL*Plus:Release11.2.0.4.0Productionon......
  • 用conda创建python虚拟环境
    1.conda常用的命令conda-V#查看版本condalist#查看安装了哪些包。condaenvlist或condainfo-e#查看当前存在哪些虚拟环境condaupdateconda#检查......
  • python3 pip3换源
    命令换源pip3configsetglobal.index-url+源地址例如换阿里云源pip3configsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/查看已配置源pip3co......
  • Python-shp转wkt
    将shpfile文件转为wkt文本形式。可获取字段名称及几何坐标#shp转wktfromosgeoimportogrshapefile=r"D:\test.shp"driver=ogr.GetDriverByName("ESRIShap......