2016-05-01 12:09:33 +02:00
# -*- coding: utf-8 -*-
import json
2020-07-28 11:47:53 +02:00
from . import check_input_attribute , standard_error_message
2019-01-21 13:31:52 +01:00
from pyipasnhistory import IPASNHistory
2020-01-10 15:02:59 +01:00
from pymisp import MISPAttribute , MISPEvent , MISPObject
2016-05-01 12:09:33 +02:00
misperrors = { ' error ' : ' Error ' }
2024-06-06 09:54:20 +02:00
mispattributes = { ' input ' : [ ' ip-src ' , ' ip-dst ' , ' ip ' ] , ' format ' : ' misp_standard ' }
moduleinfo = { ' version ' : ' 0.3 ' , ' author ' : ' Raphaël Vinot ' , ' description ' : ' Query an IP ASN history service (https://github.com/D4-project/IPASN-History?tab=readme-ov-file) ' , ' module-type ' : [ ' expansion ' , ' hover ' ] }
2016-05-01 12:09:33 +02:00
2020-01-10 15:02:59 +01:00
def parse_result ( attribute , values ) :
event = MISPEvent ( )
initial_attribute = MISPAttribute ( )
initial_attribute . from_dict ( * * attribute )
event . add_attribute ( * * initial_attribute )
mapping = { ' asn ' : ( ' AS ' , ' asn ' ) , ' prefix ' : ( ' ip-src ' , ' subnet-announced ' ) }
for last_seen , response in values [ ' response ' ] . items ( ) :
asn = MISPObject ( ' asn ' )
asn . add_attribute ( ' last-seen ' , * * { ' type ' : ' datetime ' , ' value ' : last_seen } )
for feature , attribute_fields in mapping . items ( ) :
attribute_type , object_relation = attribute_fields
asn . add_attribute ( object_relation , * * { ' type ' : attribute_type , ' value ' : response [ feature ] } )
asn . add_reference ( initial_attribute . uuid , ' related-to ' )
event . add_object ( * * asn )
event = json . loads ( event . to_json ( ) )
return { key : event [ key ] for key in ( ' Attribute ' , ' Object ' ) }
2016-05-01 12:09:33 +02:00
def handler ( q = False ) :
if q is False :
return False
request = json . loads ( q )
2020-07-28 11:47:53 +02:00
if not request . get ( ' attribute ' ) or not check_input_attribute ( request [ ' attribute ' ] ) :
return { ' error ' : f ' { standard_error_message } , which should contain at least a type, a value and an uuid. ' }
if request [ ' attribute ' ] [ ' type ' ] not in mispattributes [ ' input ' ] :
return { ' error ' : ' Unsupported attribute type. ' }
2024-06-06 09:54:20 +02:00
if request [ ' attribute ' ] [ ' type ' ] == ' ip ' :
request [ ' attribute ' ] [ ' type ' ] = ' ip-src '
2020-07-28 11:47:53 +02:00
toquery = request [ ' attribute ' ] [ ' value ' ]
2016-05-01 12:09:33 +02:00
2019-01-21 13:31:52 +01:00
ipasn = IPASNHistory ( )
values = ipasn . query ( toquery )
2016-05-04 12:52:01 +02:00
2016-05-01 12:09:33 +02:00
if not values :
misperrors [ ' error ' ] = ' Unable to find the history of this IP '
return misperrors
2020-01-10 15:02:59 +01:00
return { ' results ' : parse_result ( request [ ' attribute ' ] , values ) }
2016-05-01 12:09:33 +02:00
def introspection ( ) :
return mispattributes
def version ( ) :
return moduleinfo