Starchik1 commited on
Commit
1bda23f
·
verified ·
1 Parent(s): efb9581

Create main.py

Browse files
Files changed (1) hide show
  1. main.py +81 -0
main.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import socket
2
+ import threading
3
+ import select
4
+ import sys
5
+
6
+ # Конфигурация
7
+ PROXY_HOST = '0.0.0.0'
8
+ PROXY_PORT = 8888
9
+ BUFFER_SIZE = 4096
10
+
11
+ def handle_client(client_socket):
12
+ # Получаем первый пакет (заголовки)
13
+ data = client_socket.recv(BUFFER_SIZE)
14
+
15
+ # Анализ запроса (HTTP или HTTPS)
16
+ try:
17
+ if data.startswith(b'CONNECT'):
18
+ # HTTPS CONNECT запрос
19
+ target = data.split(b' ')[1].split(b':')[0].decode()
20
+ port = int(data.split(b':')[2].split(b' ')[0])
21
+ else:
22
+ # HTTP запрос
23
+ target = data.split(b'Host: ')[1].split(b'\r\n')[0].decode()
24
+ port = 80
25
+ except Exception:
26
+ client_socket.close()
27
+ return
28
+
29
+ # Подключаемся к целевому серверу
30
+ try:
31
+ remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
32
+ remote_socket.connect((target, port))
33
+
34
+ # Для HTTPS отправляем подтверждение
35
+ if data.startswith(b'CONNECT'):
36
+ client_socket.send(b'HTTP/1.1 200 Connection Established\r\n\r\n')
37
+ else:
38
+ remote_socket.send(data)
39
+ except Exception as e:
40
+ client_socket.close()
41
+ return
42
+
43
+ # Туннелируем данные в обоих направлениях
44
+ sockets = [client_socket, remote_socket]
45
+ while True:
46
+ try:
47
+ read_sockets, _, _ = select.select(sockets, [], [])
48
+ for sock in read_sockets:
49
+ data = sock.recv(BUFFER_SIZE)
50
+ if not data:
51
+ break
52
+ if sock is client_socket:
53
+ remote_socket.send(data)
54
+ else:
55
+ client_socket.send(data)
56
+ except Exception:
57
+ break
58
+
59
+ client_socket.close()
60
+ remote_socket.close()
61
+
62
+ def start_proxy():
63
+ proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
64
+ proxy_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
65
+ proxy_socket.bind((PROXY_HOST, PROXY_PORT))
66
+ proxy_socket.listen(50)
67
+
68
+ print(f"[*] Прокси запущен на {PROXY_HOST}:{PROXY_PORT}")
69
+
70
+ while True:
71
+ client_socket, addr = proxy_socket.accept()
72
+ print(f"[>] Подключено: {addr[0]}:{addr[1]}")
73
+ proxy_thread = threading.Thread(
74
+ target=handle_client,
75
+ args=(client_socket,)
76
+ )
77
+ proxy_thread.daemon = True
78
+ proxy_thread.start()
79
+
80
+ if __name__ == "__main__":
81
+ start_proxy()