CCCPaste

c44837d6598d6

# stun.py — python3 stun.py 4000
import socket, os, struct, sys
port = int(sys.argv[1]); COOKIE = 0x2112A442
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); s.bind(('', port))
s.sendto(struct.pack('!HHI', 0x0001, 0, COOKIE) + os.urandom(12), ('stun.l.google.com', 19302))
d, _ = s.recvfrom(1024); i = 20
while i < len(d):
t, l = struct.unpack('!HH', d[i:i+4]); v = d[i+4:i+4+l]
if t == 0x0020: # XOR-MAPPED-ADDRESS
p = struct.unpack('!H', v[2:4])[0] ^ (COOKIE >> 16)
ip = '.'.join(str(b ^ m) for b, m in zip(v[4:8], COOKIE.to_bytes(4, 'big')))
print(f'{ip}:{p}')
i += 4 + ((l + 3) & ~3)