1
0

Proxy-ssl.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # -*- coding: utf-8 -*-
  2. import socket
  3. import threading
  4. import select
  5. import sys
  6. import time
  7. import itertools
  8. import os
  9. import ssl
  10. # ==============================================================================
  11. # CONFIGURACIÓN MAESTRA
  12. # ==============================================================================
  13. LISTENING_PORT = int(sys.argv[1]) if len(sys.argv) > 1 else 443
  14. SSH_HOST = '127.0.0.1'
  15. SSH_PORT = 22 # Puerto de Dropbear u OpenSSH
  16. CERT_FILE = "/root/cert.pem"
  17. KEY_FILE = "/root/key.pem"
  18. LOG_FILE = "/root/proxy-ssl.log"
  19. # SEGURIDAD
  20. MAX_CONNECTIONS = 150
  21. CONNECTION_COOLDOWN = 0.5
  22. AUTO_BAN_STRIKES = 3
  23. BAN_TIME = 3600 # 1 hora
  24. BUFLEN = 16384
  25. # ESTADO GLOBAL
  26. banned_ips = {}
  27. ip_strikes = {}
  28. active_connections = 0
  29. conn_lock = threading.Lock()
  30. # FAKE WEB (Para evadir detección de ISP/Firewalls)
  31. FAKE_WEB = (b"HTTP/1.1 200 OK\r\nServer: nginx/1.24.0\r\nContent-Type: text/html\r\n"
  32. b"Connection: close\r\n\r\n"
  33. b"<html><head><title>Welcome</title></head><body>"
  34. b"<h1>404 Not Found</h1><hr><address>nginx/1.24.0</address></body></html>")
  35. # MENSAJES ROTATIVOS
  36. MENSAJES = ["🚀 TLS ESTABLECIDO", "🛡️ CIFRADO ACTIVO", "🌐 ACCESO SEGURO"]
  37. mensaje_cycle = itertools.cycle(MENSAJES)
  38. cycle_lock = threading.Lock()
  39. def write_log(msg, addr=None):
  40. try:
  41. ts = time.strftime("%Y-%m-%d %H:%M:%S")
  42. ip = f" [{addr[0]}]" if addr else ""
  43. with open(LOG_FILE, 'a') as f:
  44. f.write(f"[{ts}]{ip} {msg}\n")
  45. except: pass
  46. class TunnelHandler(threading.Thread):
  47. def __init__(self, client, addr):
  48. super().__init__(daemon=True)
  49. self.client = client
  50. self.addr = addr
  51. self.target = None
  52. self.tx = 0
  53. self.rx = 0
  54. def run(self):
  55. global active_connections
  56. client_ip = self.addr[0]
  57. try:
  58. # 1. Verificar si está baneado
  59. if client_ip in banned_ips:
  60. if time.time() < banned_ips[client_ip]: return
  61. else: del banned_ips[client_ip]
  62. # 2. Leer petición inicial
  63. self.client.settimeout(2.5)
  64. try:
  65. payload = self.client.recv(BUFLEN)
  66. except: payload = b""
  67. # 3. Análisis de tráfico
  68. if b"HTTP/" in payload and b"Upgrade" not in payload:
  69. self.client.sendall(FAKE_WEB)
  70. return
  71. # 4. Conectar a SSH
  72. self.target = socket.create_connection((SSH_HOST, SSH_PORT), timeout=5)
  73. if payload:
  74. if payload.startswith(b"SSH-"):
  75. self.target.sendall(payload)
  76. else:
  77. with cycle_lock: msg = next(mensaje_cycle)
  78. resp = f"HTTP/1.1 101 {msg}\r\nServer: nginx\r\nUpgrade: websocket\r\n\r\n"
  79. self.client.sendall(resp.encode())
  80. # 5. Túnel bidireccional
  81. self.client.settimeout(None)
  82. self.target.settimeout(None)
  83. sockets = [self.client, self.target]
  84. while True:
  85. r, _, e = select.select(sockets, [], sockets, 300)
  86. if e or not r: break
  87. for s in r:
  88. data = s.recv(BUFLEN)
  89. if not data: return
  90. if s is self.client:
  91. self.target.sendall(data)
  92. self.tx += len(data)
  93. else:
  94. self.client.sendall(data)
  95. self.rx += len(data)
  96. except: pass
  97. finally:
  98. with conn_lock: active_connections -= 1
  99. self.cleanup()
  100. def cleanup(self):
  101. total = (self.tx + self.rx) / (1024*1024)
  102. if total > 0.1:
  103. write_log(f"Cierre de sesión. Tráfico: {total:.2f} MB", self.addr)
  104. for s in [self.client, self.target]:
  105. if s:
  106. try: s.close()
  107. except: pass
  108. def main():
  109. global active_connections
  110. context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
  111. context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)
  112. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  113. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  114. server.bind(('', LISTENING_PORT))
  115. server.listen(500)
  116. print(f"🔥 Proxy Ultimate v8 Activo en puerto {LISTENING_PORT}")
  117. while True:
  118. try:
  119. raw_c, addr = server.accept()
  120. # Control de inundación (Anti-Flood)
  121. now = time.time()
  122. last_t = ip_strikes.get(addr[0], {}).get('t', 0)
  123. if (now - last_t) < CONNECTION_COOLDOWN:
  124. strikes = ip_strikes.get(addr[0], {}).get('s', 0) + 1
  125. ip_strikes[addr[0]] = {'t': now, 's': strikes}
  126. if strikes >= AUTO_BAN_STRIKES:
  127. banned_ips[addr[0]] = now + BAN_TIME
  128. write_log("IP Baneada por abuso", addr)
  129. raw_c.close()
  130. continue
  131. ip_strikes[addr[0]] = {'t': now, 's': 0}
  132. try:
  133. client = context.wrap_socket(raw_c, server_side=True)
  134. with conn_lock:
  135. if active_connections >= MAX_CONNECTIONS:
  136. client.close()
  137. continue
  138. active_connections += 1
  139. TunnelHandler(client, addr).start()
  140. except:
  141. raw_c.close()
  142. except:
  143. time.sleep(0.05)
  144. if __name__ == "__main__":
  145. main()