Last active
July 1, 2022 16:26
-
-
Save EspressoCake/257df980ad0c6873da932b7512d48a40 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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