Advertisement
InnovAnon-Inc

cuntry-scan

Aug 6th, 2024
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.61 KB | Source Code | 0 0
  1. #! /usr/bin/env python
  2.  
  3. """
  4. LLM-masscan by country name
  5.  
  6. [source](https://stackoverflow.com/questions/74290268/how-to-get-ip-addresses-from-ip2location-database/78756361#78756361)
  7. [source](https://github.com/SadParad1se/snek-sploit)
  8. [source](https://stackoverflow.com/questions/36249744/interactive-shell-using-docker-compose)
  9. [source](https://blog.king-sabri.net/programming/controlling-metasploit-remotely-using-rpc-api)
  10. """
  11.  
  12. #@trace(logger)
  13. def convert_to_ipv4(ip_string:str)->str:
  14.     ip_number = int(ip_string)
  15.     binary_ip = format(ip_number, '032b')                        # Convert the IP number to binary and pad with zeroes
  16.     segments = [binary_ip[i:i+8] for i in range(0, 32, 8)]       # Split the binary number into segments of 8 digits
  17.     decimal_segments = [int(segment, 2) for segment in segments] # Convert each segment back to decimal
  18.     ipv4_address = '.'.join(map(str, decimal_segments))          # Join the decimal segments using a dot to form the IPv4 address
  19.     #print(f'{ip_number} --> {ipv4_address}')
  20.     return ipv4_address
  21.  
  22. @trace(logger)
  23. def load_ipdb(csv: str = "vendor.D/IP2LOCATION-LITE-DB1.CSV") -> pd.DataFrame:
  24.     data = pd.read_csv(csv, header=None, names=['from', 'to', 'cc', 'name']) # Load the CSV file into a DataFrame
  25.  
  26.     data['from'] = data['from'].apply(convert_to_ipv4) # Convert the 'from' and 'to' columns to standard IPv4 addresses
  27.     data['to'] = data['to'].apply(convert_to_ipv4)
  28.  
  29.     return data
  30.  
  31. #@trace(logger)
  32. def extract_range(index:int, row)->str:
  33.     return '%s-%s' % (row['from'], row['to'],)
  34.  
  35. #@trace(logger)
  36. def extract_ranges(data:pd.DataFrame, name:str)->str:
  37.     #data.set_index(['name'])
  38.     #matches = data.loc[name]
  39.     matches = data.loc[data['name'] == name] # TODO lower() ?
  40.     ranges  = starmap(extract_range, matches.iterrows())
  41.     return ','.join(ranges)
  42.  
  43. if __name__ == '__main__':
  44.     model          :str             =     os.environ.get('MODEL',           '<redacted>')
  45.     embed_model    :str             =     os.environ.get('EMBED_MODEL',     '<redacted>')
  46.     request_timeout:int             = int(os.environ.get('TIMEOUT',     (60 * 60 * 24))) # my systems are SLOW
  47.     base_url       :str             =     os.environ.get('HOST',     'http://<redacted>:11434')
  48.    
  49.     Settings.llm                    = Ollama(
  50.             model                   =model,
  51.             request_timeout         =request_timeout,
  52.             base_url                =base_url,
  53.     )
  54.     Settings.embed_model            = OllamaEmbedding(
  55.             model_name              =embed_model,
  56.             base_url                =base_url,
  57.             ollama_additional_kwargs={"mirostat": 0},
  58.     )
  59.  
  60.     data                      :pd.DataFrame     = load_ipdb() #
  61.     client                    :MetasploitClient = MetasploitClient(
  62.             username='<redacted>',              password='<redacted>',
  63.             host="<redacted>", ssl=True, port=55553)
  64.     #regex                                       = re.compile('Smart Home Manager')
  65.     #XMLReader                                   = download_loader('XMLReader')
  66.     #xml_reader                                  = XMLReader('/tmp/import') # Initialize the reader
  67.     try:
  68.         console               :ConsoleInfo      = client.consoles.create()
  69.         try:
  70.             while True:
  71.  
  72.                 name          :str              = input('country name: ')
  73.                 if (name.lower() in ['quit', 'exit', 'done',]):
  74.                     logger.info('exiting')
  75.                     break
  76.                 ranges        :str              = extract_ranges(data, name)
  77.                 logger.debug('ranges: %s', ranges)
  78.                 if (not ranges):
  79.                     logger.error('no ranges')
  80.                     continue
  81.  
  82.                 with NamedTemporaryFile(mode='r+', dir='/tmp/import/', suffix='.xml') as fout:
  83.                     logger.debug('fout: %s', fout.name)
  84.                     with NamedTemporaryFile(mode='w') as fin:
  85.                         logger.debug('fin: %s', fin.name)
  86.                         logger.debug('writing ranges')
  87.                         fin.write(ranges)
  88.                         fin.seek(0)
  89.                         logger.debug('wrote ranges')
  90.  
  91.                         cmd   :List[str]        = [
  92.                             'sudo',
  93.                             'masscan',
  94.                             '-iL',             fin.name,           # TODO testing
  95.                             #'-iL',             'vendor.D/host.lst', # TODO ^^^^^^^
  96.                             #'--output-format', 'xml',
  97.                             '-oX',             fout.name,
  98.                             '-p',              '80,443',                # TODO parametrize
  99.                             '--banners', '--open-only',
  100.                             '--rate', '0.1',
  101.                             '--ping',
  102.                             #'--retries', '3',
  103.                         ]
  104.                         logger.debug('cmd: %s', cmd)
  105.                         run                     = subprocess.run(
  106.                                 cmd, check=True, capture_output=True, text=True)
  107.                         out    :str             = run.stdout
  108.                         err    :str             = run.stderr
  109.                         logger.info('out: %s', out)
  110.                         logger.error('err: %s', err)
  111.  
  112.                     fout.seek(0)
  113.                     outx       :str             = fout.read()
  114.                     logger.debug('out: %s', outx)
  115.                     fout.seek(0)
  116.                     cmdstr     :str             = str(f'db_import {fout.name}') # TODO escapism
  117.                     logger.debug('cmd: %s', cmdstr)
  118.                     out        :str             = console.execute(cmdstr)       # send to msfrpcd
  119.                     logger.info('out: %s', out)
  120.  
  121.                     #root                        = ET.fromstring(outx) # TODO the xml don't have banners ?
  122.                     ##fout.seek(0)
  123.                     ##xml_doc                     = ET.parse(fout.name)
  124.                     ##root                        = xml_doc.getroot()
  125.                     #elements                    = root.xpath('.//*')
  126.                     #for element in elements:
  127.                     #    logger.debug('element: %s', element)
  128.                     ## TODO filter banners not matching regex
  129.                     ## TODO dump new xml to file
  130.                     #root                        = ET.ElementTree(elements)
  131.                     #xml_doc                     = ET.tostring(root, encoding='unicode')
  132.                     #fout.truncate(0)
  133.                     #fout.write(xml_doc)
  134.  
  135.                     fout.seek(0)
  136.                     xml_reader                  = XMLReader() # Initialize the reader
  137.                     documents                   = xml_reader.load_data(file=fout.name)        # Load and transform XML documents
  138.                     index                       = VectorStoreIndex.from_documents(documents, show_progress=True, use_async=True)
  139.                     engine                      = index.as_query_engine(
  140.                             #use_async=True,
  141.                             verbose=True)
  142.                     while True:
  143.                         query  :str             = input('query: ')
  144.                         if (query.lower() in ['quit', 'exit', 'done',]):
  145.                             logger.info('continuing')
  146.                             break
  147.                         out                     = engine.query(query)
  148.                         logger.info('out: %s', out)
  149.         finally:
  150.             console.destroy()
  151.     finally:
  152.         client.logout()
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement