# 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)