Sin descripción

case_graphs_routes.py 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # IRIS Source Code
  2. # Copyright (C) 2024 - DFIR-IRIS
  3. # contact@dfir-iris.org
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU Lesser General Public
  7. # License as published by the Free Software Foundation; either
  8. # version 3 of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. # Lesser General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Lesser General Public License
  16. # along with this program; if not, write to the Free Software Foundation,
  17. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. import itertools
  19. from datetime import datetime
  20. from flask_login import current_user
  21. from flask import Blueprint
  22. from app.datamgmt.case.case_events_db import get_case_events_assets_graph
  23. from app.datamgmt.case.case_events_db import get_case_events_ioc_graph
  24. from app.models.authorization import CaseAccessLevel
  25. from app.blueprints.access_controls import ac_requires_case_identifier
  26. from app.blueprints.access_controls import ac_api_requires
  27. from app.blueprints.responses import response_success
  28. case_graph_rest_blueprint = Blueprint('case_graph_rest', __name__)
  29. @case_graph_rest_blueprint.route('/case/graph/getdata', methods=['GET'])
  30. @ac_requires_case_identifier(CaseAccessLevel.read_only, CaseAccessLevel.full_access)
  31. @ac_api_requires()
  32. def case_graph_get_data(caseid):
  33. events = get_case_events_assets_graph(caseid)
  34. events.extend(get_case_events_ioc_graph(caseid))
  35. nodes = []
  36. edges = []
  37. dates = {
  38. "human": [],
  39. "machine": []
  40. }
  41. tmp = {}
  42. for event in events:
  43. if hasattr(event, 'asset_compromise_status_id'):
  44. if event.asset_compromise_status_id == 1:
  45. img = event.asset_icon_compromised
  46. else:
  47. img = event.asset_icon_not_compromised
  48. if event.asset_ip:
  49. title = "{} -{}".format(event.asset_ip, event.asset_description)
  50. else:
  51. title = "{}".format(event.asset_description)
  52. label = event.asset_name
  53. idx = f'a{event.asset_id}'
  54. node_type = 'asset'
  55. else:
  56. img = 'virus-covid-solid.png'
  57. label = event.ioc_value
  58. title = event.ioc_description
  59. idx = f'b{event.ioc_id}'
  60. node_type = 'ioc'
  61. try:
  62. date = "{}-{}-{}".format(event.event_date.day, event.event_date.month, event.event_date.year)
  63. except:
  64. date = '15-05-2021'
  65. if date not in dates:
  66. dates['human'].append(date)
  67. dates['machine'].append(datetime.timestamp(event.event_date))
  68. new_node = {
  69. 'id': idx,
  70. 'label': label,
  71. 'image': '/static/assets/img/graph/' + img,
  72. 'shape': 'image',
  73. 'title': title,
  74. 'value': 1
  75. }
  76. if current_user.in_dark_mode:
  77. new_node['font'] = "12px verdana white"
  78. if not any(node['id'] == idx for node in nodes):
  79. nodes.append(new_node)
  80. ak = {
  81. 'node_id': idx,
  82. 'node_title': "{} - {}".format(event.event_date, event.event_title),
  83. 'node_name': label,
  84. 'node_type': node_type
  85. }
  86. if tmp.get(event.event_id):
  87. tmp[event.event_id]['list'].append(ak)
  88. else:
  89. tmp[event.event_id] = {
  90. 'master_node': [],
  91. 'list': [ak]
  92. }
  93. for event_id in tmp:
  94. for subset in itertools.combinations(tmp[event_id]['list'], 2):
  95. if subset[0]['node_type'] == 'ioc' and subset[1]['node_type'] == 'ioc' and len(tmp[event_id]['list']) != 2:
  96. continue
  97. edge = {
  98. 'from': subset[0]['node_id'],
  99. 'to': subset[1]['node_id'],
  100. 'title': subset[0]['node_title'],
  101. 'dashes': subset[0]['node_type'] == 'ioc' or subset[1]['node_type'] == 'ioc'
  102. }
  103. edges.append(edge)
  104. resp = {
  105. 'nodes': nodes,
  106. 'edges': edges,
  107. 'dates': dates
  108. }
  109. return response_success("", data=resp)