@@ -724,7 +724,7 @@ def export_entity(self, entity_type, entity_id, mode='simple', max_marking_defin
724
724
'threat-actor' : self .opencti .threat_actor .to_stix2 ,
725
725
'intrusion-set' : self .opencti .intrusion_set .to_stix2 ,
726
726
'campaign' : self .opencti .campaign .to_stix2 ,
727
- 'x-opencti- incident' : self .opencti .incident .to_stix2 ,
727
+ 'incident' : self .opencti .incident .to_stix2 ,
728
728
'malware' : self .opencti .malware .to_stix2 ,
729
729
'tool' : self .opencti .tool .to_stix2 ,
730
730
'vulnerability' : self .opencti .vulnerability .to_stix2 ,
@@ -736,11 +736,19 @@ def export_entity(self, entity_type, entity_id, mode='simple', max_marking_defin
736
736
entity_type ,
737
737
lambda ** kwargs : self .unknown_type ({'type' : entity_type })
738
738
)
739
- bundle [ ' objects' ] = do_export (
739
+ objects = do_export (
740
740
id = entity_id ,
741
741
mode = mode ,
742
742
max_marking_definition_entity = max_marking_definition_entity
743
743
)
744
+ for object in objects :
745
+ object ['id' ] = object ['id' ].replace ('observable' , 'indicator' )
746
+ if 'source_ref' in object :
747
+ object ['source_ref' ] = object ['source_ref' ].replace ('observable' , 'indicator' )
748
+ if 'target_ref' in object :
749
+ object ['target_ref' ] = object ['target_ref' ].replace ('observable' , 'indicator' )
750
+ bundle ['objects' ].append (object )
751
+
744
752
return bundle
745
753
746
754
def export_bundle (self , types = []):
@@ -972,7 +980,7 @@ def prepare_export(self, entity, stix_object, mode='simple', max_marking_definit
972
980
'threat-actor' : self .opencti .threat_actor .to_stix2 ,
973
981
'intrusion-set' : self .opencti .intrusion_set .to_stix2 ,
974
982
'campaign' : self .opencti .campaign .to_stix2 ,
975
- 'x-opencti- incident' : self .opencti .incident .to_stix2 ,
983
+ 'incident' : self .opencti .incident .to_stix2 ,
976
984
'malware' : self .opencti .malware .to_stix2 ,
977
985
'tool' : self .opencti .tool .to_stix2 ,
978
986
'vulnerability' : self .opencti .vulnerability .to_stix2 ,
@@ -992,13 +1000,12 @@ def prepare_export(self, entity, stix_object, mode='simple', max_marking_definit
992
1000
result = result + entity_object_bundle
993
1001
for observable_object in observables_to_get :
994
1002
observable_object_data = self .export_stix_observable (
995
- self .opencti .process_multiple_fields (
996
- self .opencti .get_stix_observable_by_id (observable_object ['id' ])
997
- )
1003
+ self .opencti .stix_observable .read (id = observable_object ['id' ])
998
1004
)
999
- observable_object_bundle = self .filter_objects (uuids , observable_object_data )
1000
- uuids = uuids + [x ['id' ] for x in observable_object_bundle ]
1001
- result = result + observable_object_bundle
1005
+ if observable_object_data is not None :
1006
+ observable_object_bundle = self .filter_objects (uuids , observable_object_data )
1007
+ uuids = uuids + [x ['id' ] for x in observable_object_bundle ]
1008
+ result = result + observable_object_bundle
1002
1009
for relation_object in relations_to_get :
1003
1010
relation_object_data = self .opencti .stix_relation .to_stix2 (id = relation_object ['id' ])
1004
1011
relation_object_bundle = self .filter_objects (uuids , relation_object_data )
@@ -1234,7 +1241,10 @@ def export_stix_observable(self, entity):
1234
1241
first_seen = relation_first_seen
1235
1242
stix_observable ['valid_from' ] = self .format_date (first_seen )
1236
1243
final_stix_observable = self .prepare_observable (entity , stix_observable )
1237
- return self .prepare_export (entity , final_stix_observable )
1244
+ if final_stix_observable is not None :
1245
+ return self .prepare_export (entity , final_stix_observable )
1246
+ else :
1247
+ return None
1238
1248
1239
1249
def create_indicator (self , stix_object , update = False ):
1240
1250
indicator_type = None
@@ -1327,16 +1337,31 @@ def prepare_observable(self, entity, stix_observable):
1327
1337
else :
1328
1338
observable_type = entity ['entity_type' ]
1329
1339
1330
- if observable_type == 'file' :
1331
- lhs = ObjectPath (observable_type , ['hashes' , entity ['entity_type' ].split ('-' )[1 ].upper ()])
1332
- ece = ObservationExpression (EqualityComparisonExpression (lhs , HashConstant (entity ['observable_value' ],
1333
- entity ['entity_type' ].split ('-' )[
1334
- 1 ].upper ())))
1335
- if observable_type == 'ipv4-addr' or observable_type == 'ipv6-addr' or observable_type == 'domain_name' or observable_type == 'url' :
1336
- lhs = ObjectPath (observable_type , ["value" ])
1337
- ece = ObservationExpression (EqualityComparisonExpression (lhs , entity ['observable_value' ]))
1338
- stix_observable ['pattern' ] = str (ece )
1339
- return stix_observable
1340
+ try :
1341
+ if observable_type == 'file' :
1342
+ lhs = ObjectPath (observable_type , ['hashes' , entity ['entity_type' ].split ('-' )[1 ].upper ()])
1343
+ ece = ObservationExpression (
1344
+ EqualityComparisonExpression (
1345
+ lhs ,
1346
+ HashConstant (
1347
+ entity ['observable_value' ],
1348
+ entity ['entity_type' ].split ('-' )[1 ].upper ())
1349
+ )
1350
+ )
1351
+ else :
1352
+ lhs = ObjectPath (observable_type , ["value" ])
1353
+ ece = ObservationExpression (
1354
+ EqualityComparisonExpression (
1355
+ lhs ,
1356
+ entity ['observable_value' ])
1357
+ )
1358
+ except :
1359
+ ece = None
1360
+ if ece is not None :
1361
+ stix_observable ['pattern' ] = str (ece )
1362
+ return stix_observable
1363
+ else :
1364
+ return None
1340
1365
1341
1366
def get_author (self , name ):
1342
1367
if name in self .mapping_cache :
0 commit comments