Skip to content

Instantly share code, notes, and snippets.

@EspressoCake
Last active July 1, 2022 16:26
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EspressoCake/257df980ad0c6873da932b7512d48a40 to your computer and use it in GitHub Desktop.
Save EspressoCake/257df980ad0c6873da932b7512d48a40 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import logging
import socket
import sys
from argparse import ArgumentParser, Namespace
from dns.resolver import Resolver
from os.path import exists
# Example Usage: proxychains -q python3 resolve_hostname_over_SOCKS.py --nameserver 10.10.10.10 --items SOMEWORKSTATION1.CONTOSO.LOCAL SOMEWORKSTATION2.CONTOSO.LOCAL
# Example Usage: proxychains -q python3 resolve_hostname_over_SOCKS.py --nameserver 10.10.10.10 --fileinput --items file_with_hostnames.txt
class DnsResolver:
def __init__(self, options: Namespace):
nameserver = options.nameserver
self.resolver = Resolver()
self.resolver.nameservers = [nameserver]
def resolve(self, hostname: str) -> str:
ip_addr = None
logging.debug(f"Trying to resolve {repr(hostname)} at {repr(self.resolver.nameservers[0])}")
try:
answers = self.resolver.resolve(hostname, tcp=True)
if len(answers) == 0:
raise Exception()
ip_addr = answers[0].to_text()
except Exception:
pass
if ip_addr is None:
try:
ip_addr = socket.gethostbyname(hostname)
except Exception:
ip_addr = None
if ip_addr is None:
logging.warning(f"Failed to resolve: {hostname}")
return hostname
return ip_addr
def validateAllFiles(options: Namespace) -> bool:
for item in options.items:
if not exists(item):
logging.warning(f"File doesn't exist, we're not going to continue. ({item})")
return False
return True
if __name__ == '__main__':
parser = ArgumentParser("DNS Resolution over SOCKS proxy.")
parser.add_argument("--nameserver", type=str, help="Nameserver IP address.", required=True)
parser.add_argument("--fileinput", action="store_true", help="Whether this is expected to be a file input or not.", required=False)
parser.add_argument("--items", nargs="+", help="List of items to use, either filename(s) or individual hosts.", required=True)
parsedArgs = parser.parse_args()
if parsedArgs.fileinput:
if validateAllFiles(parsedArgs):
currentDnsResolver = DnsResolver(parsedArgs)
for file in parsedArgs.items:
for endpoint in [line.strip() for line in open(file, 'r').readlines()]:
result = None
try:
result = currentDnsResolver.resolve(endpoint)
except Exception as e:
pass
finally:
if result is not None:
print(f"{endpoint}\t{result}")
else:
sys.exit(0)
else:
currentDnsResolver = DnsResolver(parsedArgs)
for endpoint in parsedArgs.items:
result = None
try:
result = currentDnsResolver.resolve(endpoint)
except Exception as e:
pass
finally:
if result is not None:
print(f"{endpoint}\t{result}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment