用Python實現TCP代理

依舊是Python黑帽子這本書

先附上代碼,我在原書代碼上加了注釋,更好理解

import sys
import socket
import threading#生成可打印字符映射
HEX_FILTER=''.join([(len(repr(chr(i)))==3) and chr(i) or '.' for i in range(256)])#接收bytes或string類型的輸入,并將其轉換為十六進制格式輸出
#數值存儲
def hexdump(src,length=16,show=True):if isinstance(src,bytes):src=src.decode()results=list()for i in range(0,len(src),length):word=str(src[i:i+length])printable=word.translate(HEX_FILTER)hexa=' '.join([f'{ord(c):02X}' for c in word])hexwidth=length*3results.append(f'{i:04x} {hexa:<{hexwidth}} {printable}')if show:for line in results:print(line)else:return results#接收本地或遠程數據
def receive_from(connection):buffer=b""connection.settimeout(5)try:while True:data=connection.recv(4096)if not data:breakbuffer +=dataexcept Exception as e:passreturn buffer#數據處理函數
#預留數據修改的鉤子,可以在這里修改客戶端請求或服務器響應
def request_handler(buffer):return bufferdef response_handler(buffer):return buffer#代理處理,負責處理客戶端與遠程服務器間的通信,是代理的核心
def proxy_handler(client_socket,remote_host,remote_port,receive_first):#創建遠程連接remote_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創建TCP連接remote_socket.connect((remote_host,remote_port))#連接到遠程服務器#接收遠程服務器數據if receive_first:remote_buffer=receive_from(remote_socket)hexdump(remote_buffer)#處理服務器返回數據remote_buffer=response_handler(remote_buffer)if len(remote_buffer):print("[<==] Sending %d bytes to localhost." % len(remote_buffer))client_socket.send(remote_buffer)#循環監聽客戶端與服務器間的通信,直到連接關閉while True:#處理客戶端數據local_buffer=receive_from(client_socket)#讀取數據if len(local_buffer):line= "[==>]Received %d bytes from localhost." % len(local_buffer)print(line)#打印數據hexdump(local_buffer)local_buffer=request_handler(local_buffer)#數據修改remote_socket.send(local_buffer)#轉發給遠程服務器print("[==>]Sent to remote.")#處理遠程服務器返回的數據remote_buffer=receive_from(remote_socket)if len(remote_buffer):print("[<==] Received %d bytes from remote." % len(remote_buffer))hexdump(remote_buffer)remote_buffer=response_handler(remote_buffer)client_socket.send(remote_buffer)print("[<==] Sent to localhost.")#關閉連接if not len(local_buffer) or not len(remote_buffer):client_socket.close()remote_socket.close()print("[*] No more data. Closing connections.")#服務器監聽
def server_loop(local_host, local_port, remote_host, remote_port, receive_first):#創建socket并綁定端口server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:server.bind((local_host, local_port))except Exception as e:print('problem on bind: %r' % e)print("[!!] Failed to listen on %s:%d" % (local_host, local_port))print("[!!] Check for other listening sockets or correct permissions.")sys.exit(0)#監聽并等待客戶端連接print("[*] Listening on %s:%d" % (local_host, local_port))server.listen(5)while True:#處理客戶端連接client_socket, addr = server.accept()#輸出連接信息line = "> Received incomming connection from %s:%d" % (addr[0], addr[1])print(line)#啟動代理線程proxy_thread = threading.Thread(target=proxy_handler,args=(client_socket, remote_host,remote_port, receive_first))proxy_thread.start()def main():if len(sys.argv[1:]) != 5:print("Usage: ./proxy.py [localhost] [localport]", end='')print("[remotehost] [remoteport] [receive_first]")print("Example: ./proxy.py 127.0.0.1 9000 10.12.132.1 9000 True")sys.exit(0)local_host = sys.argv[1]local_port = int(sys.argv[2])remote_host = sys.argv[3]remote_port = int(sys.argv[4])receive_first = sys.argv[5]if "True" in receive_first:receive_first = Trueelse:receive_first = False#啟動服務器server_loop(local_host, local_port, remote_host, remote_port, receive_first)if __name__ == '__main__':main()

windows物理機和kali我都試了,不知道為什么只有kali能用

sudo python TCP_proxy.py 192.168.65.128 8887 www.baidu.com 80 True

再另起一個終端,輸入:

curl -x 192.168.65.128:8887 www.baidu.com

這時候我們的腳本就會接收到數據,并以hex的形式輸出

本來原書用的是ftp,但是我怎么也復現不出來,只能簡單用這個代替一下的,但是原理也差不了太多

但是我發現這個似乎不太穩定,我也是試了兩次才成功的

還有個問題就是程序沒加入ctrl+c退出的功能,雖然我也懶得加了喵(

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75507.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pyinstaller 打包flask_socketio為exe程序后出現:ValueError: Invalid async_mode specified

Pyinstaller 打包flask_socketio為exe程序后出現&#xff1a;ValueError: Invalid async_mode specified 一、詳細描述問題描述 Traceback (most recent call last): File "app_3.py", line 22, in <module> File "flask_socketio\__init__.py"…

django REST framework(DRF)教程

Django DRF API Django 基本使用Django DRF序列化器Django DRF視圖Django DRF常用功能Django 基本使用 前后端分離開發模式認識RestFulAPI回顧Django開發模式Django REST Framework初探前后端分離開發模式 前后端分離前:前端頁面看到的效果都是由后端控制,即后端渲染HTML頁面…

【Linux】Orin NX + Ubuntu22.04配置國內源

1、獲取源 清華源 arm 系統的源,可以在如下地址獲取到 https://mirror.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 選擇HTTPS,否則可能報錯: 明文簽署文件不可用,結果為‘NOSPLIT’(您的網絡需要認證嗎?)查看Orin NX系統版本 選擇jammy的源 2、更新源 1)備份原配…

【含文檔+PPT+源碼】基于微信小程序的社交攝影約拍平臺的設計與實現

項目介紹 本課程演示的是一款基于微信小程序的社交攝影約拍平臺的設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系…

JDBC常用的接口

一、什么是JDBC JDBC是Java語言連接數據庫的接口規范。 二、JDBC的體系 1、Java官方提供一個操作數據庫的抽象接口 抽象接口有很多的接口和抽象類。 例如&#xff1a;Driver、Connection、Statement。 2、各個數據庫廠商提供各自的Java實現類 需要各自實現具體的細節。 例如&am…

容器適配器-stack棧

C標準庫不只是包含了順序容器&#xff0c;還包含一些為滿足特殊需求而設計的容器&#xff0c;它們提供簡單的接口。 這些容器可被歸類為容器適配器(container adapter)&#xff0c;它們是改造別的標準順序容器&#xff0c;使之滿足特殊需求的新容器。 適配器:也稱配置器,把一…

[250403] HuggingFace 新增檢查模型與電腦兼容性的功能 | Firefox 發布137.0 支持標簽組

目錄 Hugging Face 讓尋找兼容的 AI 模型變得更容易Firefox 137 版本更新摘要 Hugging Face 讓尋找兼容的 AI 模型變得更容易 Hugging Face 是一個流行的在線平臺&#xff0c;用于訪問開源人工智能 (AI) 工具和模型。該平臺推出了一項有用的新功能&#xff0c;允許個人輕松檢查…

.NET 創建MCP使用大模型對話二:調用遠程MCP服務

在上一篇文章.NET 創建MCP使用大模型對話-CSDN博客中&#xff0c;我們簡述了如何使用mcp client使用StdIo模式調用本地mcp server。本次實例將會展示如何使用mcp client模式調用遠程mcp server。 一&#xff1a;創建mcp server 我們創建一個天氣服務。 新建WebApi項目&#x…

Redis 中 Set(例如標簽) 和 ZSet(例如排行榜) 的詳細對比,涵蓋定義、特性、命令、適用場景及總結表格

以下是 Redis 中 Set 和 ZSet 的詳細對比&#xff0c;涵蓋定義、特性、命令、適用場景及總結表格&#xff1a; 1. 核心定義 數據類型SetZSet&#xff08;Sorted Set&#xff09;定義無序的、唯一的字符串集合&#xff0c;元素不重復。有序的、唯一的字符串集合&#xff0c;每個…

解決Spring參數解析異常:Name for argument of type XXX not specified

前言 在開發 Spring Boot 應用時&#xff0c;我們常遇到類似 java.lang.IllegalArgumentException: Name for argument not specified 的報錯。這類問題通常與方法參數名稱的解析機制相關&#xff0c;尤其在使用 RequestParam、PathVariable 等注解時更為常見。 一、問題現象與…

剛剛,OpenAI開源PaperBench,重塑頂級AI Agent評測

今天凌晨1點&#xff0c;OpenAI開源了一個全新的AI Agent評測基準——PaperBench。 這個基準主要考核智能體的搜索、整合、執行等能力&#xff0c;需要對2024年國際機器學習大會上頂尖論文的復現&#xff0c;包括對論文內容的理解、代碼編寫以及實驗執行等方面的能力。 根據O…

Golang封裝Consul 服務發現庫

以下是一個經過生產驗證的 Consul 服務發現封裝庫,支持注冊/注銷、健康檢查、智能發現等核心功能,可直接集成到項目中: package consulimport ("context""fmt""log""math/rand""net""os""sync"&quo…

自適應信號處理任務(過濾,預測,重建,分類)

自適應濾波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000

PyTorch深度學習框架 的基礎知識

目錄 1.pyTorch檢查是否安裝成功 2.PyTorch的張量tensor 基礎創建方式&#xff08;三種&#xff09; 2.2用列表創建tensor 2.2使用元組創建 tensor 2.3使用ndarray創建創建 tensor 2.4 快速創建tensor的常用方法 3.pyTorch中的張量tensor的常用屬性 4. tensor中的基礎數據…

MySQL學習集--DDL

DDL 數據庫操作 查詢所有數據庫 SHOW DATABASES;查詢當前數據庫 SELECT DATABASE();創建 CREATE DATABASE[IF NOT EXISTS]數據庫名[DEFAULT CHARSET 字符集][COLLATE 排序規則];刪除 DROR DATABASE[IF EXISTS]數據庫名;使用 USE 數據庫名;表操作 創建表格 CREATE TABL…

Vue 3 中按照某個字段將數組分成多個數組

方法一&#xff1a;使用 reduce 方法 const originalArray [{ id: 1, category: A, name: Item 1 },{ id: 2, category: B, name: Item 2 },{ id: 3, category: A, name: Item 3 },{ id: 4, category: C, name: Item 4 },{ id: 5, category: B, name: Item 5 }, ];const grou…

LeetCode刷題 -- 48. 旋轉圖像

題目 算法題解&#xff1a;順時針旋轉矩陣&#xff08;90度&#xff09; 1. 算法描述 給定一個 n n 的二維矩陣&#xff0c;請將矩陣順時針旋轉 90 度。 例如&#xff1a; 輸入&#xff1a; [[1,2,3],[4,5,6],[7,8,9] ]輸出&#xff1a; [[7,4,1],[8,5,2],[9,6,3] ]2. 思…

Vulkan進階系列1 - Vulkan應用程序結構(完整代碼)

一: 概述 在前面的20多篇文章中,我們了解了Vulkan的基礎知識,和相關API的使用,接下來我們要從零開始寫一套完整Vulkan應用程序,在這個過程中加深對Vulkan中的各種概念的理解。 Vulkan 應用程序一般遵循 初始化 -> 運行循環 -> 資源清理 的結構,本實例也基本遵循了…

VTK的兩種顯示刷新方式

在類中先聲明vtk的顯示對象 vtkRenderer out_render; vtkVertexGlyphFilter glyphFilter; vtkPolyDataMapper mapper; // 新建制圖器 vtkActor actor; // 新建角色 然后在init中先初始化一下&#xff1a; out_rend…

【CSS3】04-標準流 + 浮動 + flex布局

本文介紹浮動與flex布局。 目錄 1. 標準流 2. 浮動 2.1 基本使用 特點 脫標 2.2 清除浮動 2.2.1 額外標簽法 2.2.2 單偽元素法 2.2.3 雙偽元素法(推薦) 2.2.4 overflow(最簡單) 3. flex布局 3.1 組成 3.2 主軸與側軸對齊方式 3.2.1 主軸 3.2.2 側軸 3.3 修改主…