mirror of https://github.com/MISP/misp-modules
				
				
				
			
		
			
				
	
	
		
			223 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
| import json
 | |
| 
 | |
| import requests
 | |
| 
 | |
| misperrors = {'error': 'Error'}
 | |
| mispattributes = {
 | |
|     'input': ['domain'],
 | |
|     'output': ['domain', 'dns-soa-email',
 | |
|                'whois-registrant-email', 'whois-registrant-phone',
 | |
|                'whois-registrant-name',
 | |
|                'whois-registrar', 'whois-creation-date', 'domain']
 | |
| }
 | |
| moduleinfo = {'version': '1', 'author': 'WhoisFreaks',
 | |
|               'description': 'Query on whoisfreaks.com',
 | |
|               'module-type': ['expansion', 'hover']}
 | |
| 
 | |
| # config fields that your code expects from the site admin
 | |
| moduleconfig = ['apikey']
 | |
| 
 | |
| 
 | |
| def handler(q=False):
 | |
|     if q:
 | |
| 
 | |
|         request = json.loads(q)
 | |
| 
 | |
|         if 'config' not in request or (not (request['config'].get('apikey') or ('apiKey' in request['config']))):
 | |
|             misperrors['error'] = 'WhoisFreaks authentication is missing' + request
 | |
|             return misperrors
 | |
| 
 | |
|         apiKey = request['config'].get('apikey')
 | |
| 
 | |
|         if request.get('domain'):
 | |
|             domain = request['domain']
 | |
|             return handle_domain(apiKey, domain, misperrors)
 | |
|         else:
 | |
|             misperrors['error'] = "Unsupported attributes types"
 | |
|             return misperrors
 | |
|     else:
 | |
|         return False
 | |
| 
 | |
| 
 | |
| def handle_domain(apiKey, domain, errors):
 | |
|     result_filtered = {"results": []}
 | |
|     r, status_ok = expand_whois(apiKey, domain)
 | |
|     if status_ok:
 | |
|         if r:
 | |
|             result_filtered['results'].extend(r)
 | |
| 
 | |
|     r, status_ok = expand_dns(apiKey, domain)
 | |
|     if status_ok:
 | |
|         if r:
 | |
|             result_filtered['results'].extend(r)
 | |
|             
 | |
|     return result_filtered
 | |
| 
 | |
| 
 | |
| def expand_whois(apiKey, domain):
 | |
|     r = []
 | |
|     ns_servers = []
 | |
|     status_ok = False
 | |
| 
 | |
|     try:
 | |
|         results = get_whois_response(domain, apiKey)
 | |
| 
 | |
|         if results:
 | |
|             status_ok = True
 | |
| 
 | |
|             if 'create_date' in results:
 | |
|                 r.append(
 | |
|                     {
 | |
|                         'types': ['whois-creation-date'],
 | |
|                         'values': [results['create_date']],
 | |
|                         'categories': ['Attribution'],
 | |
|                         'comment': 'Creation Date for %s by whoisFreaks'
 | |
|                                    % domain
 | |
| 
 | |
|                     }
 | |
|                 )
 | |
| 
 | |
|             if 'domain_registrar' in results:
 | |
|                 if 'registrar_name' in results['domain_registrar']:
 | |
|                     r.append(
 | |
|                         {
 | |
|                             'types': ['whois-registrant-name'],
 | |
|                             'values': [results['domain_registrar']['registrar_name']],
 | |
|                             'categories': ['Attribution'],
 | |
|                             'comment': 'Whois information of %s by whoisFreaks'
 | |
|                                        % domain
 | |
|                         }
 | |
|                     )
 | |
|                 if 'email_address' in results['domain_registrar']:
 | |
|                     r.append(
 | |
|                         {
 | |
|                             'types': ['whois-registrant-email'],
 | |
|                             'values': [results['domain_registrar']['email_address']],
 | |
|                             'categories': ['Attribution'],
 | |
|                             'comment': 'Whois information of %s by whoisFreaks'
 | |
|                                        % domain
 | |
|                         }
 | |
|                     )
 | |
| 
 | |
|                 if 'phone_number' in results['domain_registrar']:
 | |
|                     r.append(
 | |
|                         {
 | |
|                             'types': ['whois-registrant-email'],
 | |
|                             'values': [results['domain_registrar']['phone_number']],
 | |
|                             'categories': ['Attribution'],
 | |
|                             'comment': 'Whois information of %s by whoisFreaks'
 | |
|                                        % domain
 | |
|                         }
 | |
|                     )
 | |
| 
 | |
|             if 'name_servers' in results:
 | |
|                 ns_servers = results['name_servers']
 | |
|                 r.append(
 | |
|                     {
 | |
|                         'types': ['domain'],
 | |
|                         'values': ns_servers,
 | |
|                         'categories': ['Attribution'],
 | |
|                         'comment': 'Name server for %s by whoisFreaks'
 | |
|                                    % domain
 | |
| 
 | |
|                     }
 | |
|                 )
 | |
| 
 | |
|     except Exception:
 | |
|         misperrors['error'] = "Error while processing Whois Data"
 | |
|         return [], False
 | |
| 
 | |
|     return r, status_ok
 | |
| 
 | |
| 
 | |
| def expand_dns(apiKey, domain):
 | |
|     r = []
 | |
|     status_ok = False
 | |
|     list_ipv4 = []
 | |
|     list_ipv6 = []
 | |
|     servers_mx = []
 | |
|     soa_hostnames = []
 | |
| 
 | |
|     try:
 | |
|         results = get_dns_response(domain, apiKey)
 | |
| 
 | |
|         if results:
 | |
|             status_ok = True
 | |
| 
 | |
|             if 'dnsRecords' in results:
 | |
|                 dns_records = results['dnsRecords']
 | |
| 
 | |
|             for record in dns_records:
 | |
|                 if record['dnsType'] == 'A':
 | |
|                     list_ipv4.append(record['address'])
 | |
|                 elif record['dnsType'] == 'AAAA':
 | |
|                     list_ipv6.append(record['address'])
 | |
|                 elif record['dnsType'] == 'MX':
 | |
|                     servers_mx.append(record['target'])
 | |
|                 elif record['dnsType'] == 'SOA':
 | |
|                     soa_hostnames.append(record['host'])
 | |
|                     
 | |
|             if list_ipv4:
 | |
|                 r.append({'types': ['domain|ip'],
 | |
|                           'values': ['%s|%s' % (domain, ipv4) for ipv4 in
 | |
|                                     list_ipv4],
 | |
|                           'categories': ['Network activity'],
 | |
|                                   'comment': 'ipv4 of %s ' %
 | |
|                                     domain
 | |
|                                   })
 | |
|             if list_ipv6:
 | |
|                 r.append({'types': ['domain|ip'],
 | |
|                           'values': ['%s|%s' % (domain, ipv6) for ipv6 in
 | |
|                                     list_ipv6],
 | |
|                           'categories': ['Network activity'],
 | |
|                           'comment': 'ipv6 of %s' %
 | |
|                                     domain
 | |
|                           })
 | |
| 
 | |
|             if servers_mx:
 | |
|                 r.append({'types': ['domain'],
 | |
|                           'values': servers_mx,
 | |
|                           'categories': ['Network activity'],
 | |
|                           'comment': 'mx of %s' %
 | |
|                                     domain
 | |
|                           })
 | |
|             if soa_hostnames:
 | |
|                 r.append({'types': ['domain'],
 | |
|                           'values': soa_hostnames,
 | |
|                           'categories': ['Network activity'],
 | |
|                           'comment': 'soa hostname of %s' %
 | |
|                                     domain
 | |
|                           })
 | |
| 
 | |
| 
 | |
|     except Exception:
 | |
|         misperrors['error'] = "Error while processing Whois Data"
 | |
|         return [], False
 | |
| 
 | |
|     return r, status_ok
 | |
| 
 | |
| 
 | |
| def get_whois_response(domain, apiKey):
 | |
|     query = requests.get(
 | |
|         f"https://api.whoisfreaks.com/v1.0/whois?apiKey={apiKey}&whois=live&domainName={domain}"
 | |
|     )
 | |
|     if query.status_code != 200 and query.status_code != 206:
 | |
|         return {'error': f'Error while querying whoisfreaks.com - {query.status_code}: {query.reason}'}
 | |
|     return query.json()
 | |
| 
 | |
| 
 | |
| def get_dns_response(domain, apiKey):
 | |
|     query = requests.get(
 | |
|         f"https://api.whoisfreaks.com/v1.0/dns/live?apiKey={apiKey}&domainName={domain}&type=SOA,AAAA,A,MX"
 | |
|     )
 | |
|     if query.status_code != 200 and query.status_code != 206:
 | |
|         return {'error': f'Error while querying whoisfreaks.com - {query.status_code}: {query.reason}'}
 | |
|     return query.json()
 | |
| 
 | |
| def introspection():
 | |
|     return mispattributes
 | |
| 
 | |
| def version():
 | |
|     moduleinfo['config'] = moduleconfig
 | |
|     return moduleinfo
 |