| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743 |
- # IRIS Source Code
- # Copyright (C) 2021 - Airbus CyberSecurity (SAS)
- # ir@cyberactionlab.net
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Lesser General Public
- # License as published by the Free Software Foundation; either
- # version 3 of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- # Lesser General Public License for more details.
- #
- # You should have received a copy of the GNU Lesser General Public License
- # along with this program; if not, write to the Free Software Foundation,
- # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- import json
- from pathlib import Path
- import glob
- import os
- import random
- import secrets
- import string
- import socket
- import time
- from alembic import command
- from alembic.config import Config
- from sqlalchemy import create_engine, exc, or_, text
- from sqlalchemy_utils import create_database
- from sqlalchemy_utils import database_exists
- from app import app
- from app import bc
- from app import celery
- from app import db
- from app.datamgmt.iris_engine.modules_db import iris_module_disable_by_id
- from app.datamgmt.manage.manage_groups_db import add_case_access_to_group
- from app.datamgmt.manage.manage_users_db import add_user_to_group
- from app.datamgmt.manage.manage_users_db import add_user_to_organisation
- from app.iris_engine.access_control.utils import ac_add_user_effective_access
- from app.iris_engine.demo_builder import create_demo_cases
- from app.iris_engine.access_control.utils import ac_get_mask_analyst
- from app.datamgmt.manage.manage_groups_db import get_group_by_name
- from app.iris_engine.access_control.utils import ac_get_mask_full_permissions
- from app.iris_engine.module_handler.module_handler import check_module_health
- from app.iris_engine.module_handler.module_handler import instantiate_module_from_name
- from app.iris_engine.module_handler.module_handler import register_module
- from app.models.models import create_safe_limited
- from app.models.alerts import Severity, AlertStatus, AlertResolutionStatus
- from app.models.authorization import CaseAccessLevel
- from app.models.authorization import Group
- from app.models.authorization import Organisation
- from app.models.authorization import User
- from app.models.cases import Cases, CaseState
- from app.models.cases import Client
- from app.models.models import AnalysisStatus, CaseClassification, ReviewStatus, ReviewStatusList, EvidenceTypes
- from app.models.models import AssetsType
- from app.models.models import EventCategory
- from app.models.models import IocType
- from app.models.models import IrisHook
- from app.models.models import IrisModule
- from app.models.models import Languages
- from app.models.models import OsType
- from app.models.models import ReportType
- from app.models.models import ServerSettings
- from app.models.models import TaskStatus
- from app.models.models import Tlp
- from app.models.models import create_safe
- from app.models.models import create_safe_attr
- from app.models.models import get_by_value_or_create
- from app.models.models import get_or_create
- from app.iris_engine.demo_builder import create_demo_users
- log = app.logger
- # Get the database host and port from environment variables
- db_host = app.config.get('PG_SERVER')
- db_port = int(app.config.get('PG_PORT'))
- # Get the retry parameters from environment variables
- retry_count = int(app.config.get('DB_RETRY_COUNT'))
- retry_delay = int(app.config.get('DB_RETRY_DELAY'))
- def connect_to_database(host: str, port: int) -> bool:
- """Attempts to connect to a database at the specified host and port.
- Args:
- host: A string representing the hostname or IP address of the database server.
- port: An integer representing the port number to connect to.
- Returns:
- A boolean value indicating whether the connection was successful.
- """
- # Create a new socket object
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- try:
- # Try to connect to the database
- s.connect((host, port))
- # If the connection was successful, close the socket and return True
- s.close()
- return True
- except socket.error:
- # If the connection failed, close the socket and return False
- s.close()
- return False
- def run_post_init(development=False):
- """Runs post-initiation steps for the IRIS application.
- Args:
- development: A boolean value indicating whether the application is running in development mode.
- """
- # Log the IRIS version and post-initiation steps
- log.info(f'IRIS {app.config.get("IRIS_VERSION")}')
- log.info("Running post initiation steps")
- if os.getenv("IRIS_WORKER") is None:
- create_directories()
- # Attempt to connect to the database with retries
- log.info("Attempting to connect to the database...")
- for i in range(retry_count):
- log.info("Connecting to database, attempt " + str(i+1) + "/" + str(retry_count))
- conn = connect_to_database(db_host, db_port)
- if conn:
- break
- log.info("Retrying in " + str(retry_delay) + "seconds...")
- time.sleep(retry_delay)
- # If the connection is still not established, exit the script
- if not conn:
- log.info("Failed to connect to database after " + str(retry_count) + " attempts.")
- exit(1)
- # Setup database before everything
- #log.info("Adding pgcrypto extension")
- #pg_add_pgcrypto_ext()
- # Setup database before everything
- with app.app_context():
- log.info("Creating all Iris tables")
- db.create_all(bind_key=None)
- db.session.commit()
- log.info("Creating Celery metatasks tables")
- create_safe_db(db_name="iris_tasks")
- db.create_all(bind_key="iris_tasks")
- db.session.commit()
- log.info("Running DB migration")
- alembic_cfg = Config(file_='app/alembic.ini')
- alembic_cfg.set_main_option('sqlalchemy.url', app.config['SQLALCHEMY_DATABASE_URI'])
- command.upgrade(alembic_cfg, 'head')
- # Create base server settings if they don't exist
- srv_settings = ServerSettings.query.first()
- if srv_settings is None:
- log.info("Creating base server settings")
- create_safe_server_settings()
- srv_settings = ServerSettings.query.first()
- prevent_objects = srv_settings.prevent_post_objects_repush
- # Create base languages, OS types, IOC types, attributes, report types, TLP, event categories, assets,
- # analysis status, case classification, task status, severities, alert status, case states, and hooks
- log.info("Creating base languages")
- create_safe_languages()
- log.info("Creating base os types")
- create_safe_os_types()
- if not prevent_objects:
- log.info("Creating base IOC types")
- create_safe_ioctypes()
- log.info("Creating base attributes")
- create_safe_attributes()
- log.info("Creating base report types")
- create_safe_report_types()
- log.info("Creating base TLP")
- create_safe_tlp()
- log.info("Creating base events categories")
- create_safe_events_cats()
- if not prevent_objects:
- log.info("Creating base assets")
- create_safe_assets()
- log.info("Creating base analysis status")
- create_safe_analysis_status()
- if not prevent_objects:
- log.info("Creating base case classification")
- create_safe_classifications()
- log.info("Creating base tasks status")
- create_safe_task_status()
- log.info("Creating base severities")
- create_safe_severities()
- log.info("Creating base alert status")
- create_safe_alert_status()
- log.info("Creating base evidence types")
- create_safe_evidence_types()
- log.info("Creating base alert resolution status")
- create_safe_alert_resolution_status()
- if not prevent_objects:
- log.info("Creating base case states")
- create_safe_case_states()
- log.info("Creating base review status")
- create_safe_review_status()
- log.info("Creating base hooks")
- create_safe_hooks()
- # Create initial authorization model, administrative user, and customer
- log.info("Creating initial authorisation model")
- def_org, gadm, ganalysts = create_safe_auth_model()
- log.info("Creating first administrative user")
- admin, pwd = create_safe_admin(def_org=def_org, gadm=gadm)
- if not srv_settings.prevent_post_mod_repush:
- log.info("Registering default modules")
- register_default_modules()
- log.info("Creating initial customer")
- client = create_safe_client()
- log.info("Creating initial case")
- create_safe_case(
- user=admin,
- client=client,
- groups=[gadm, ganalysts]
- )
- # Setup symlinks for custom_assets
- log.info("Creating symlinks for custom asset icons")
- custom_assets_symlinks()
- # If demo mode is enabled, create demo users and cases
- if app.config.get('DEMO_MODE_ENABLED') == 'True':
- log.warning("============================")
- log.warning("| THIS IS DEMO INSTANCE |")
- log.warning("| DO NOT USE IN PRODUCTION |")
- log.warning("============================")
- users_data = create_demo_users(def_org, gadm, ganalysts,
- int(app.config.get('DEMO_USERS_COUNT', 10)),
- app.config.get('DEMO_USERS_SEED'),
- int(app.config.get('DEMO_ADM_COUNT', 4)),
- app.config.get('DEMO_ADM_SEED'))
- create_demo_cases(users_data=users_data,
- cases_count=int(app.config.get('DEMO_CASES_COUNT', 20)),
- clients_count=int(app.config.get('DEMO_CLIENTS_COUNT', 4)))
- # Log completion message
- log.info("Post-init steps completed")
- log.warning("===============================")
- log.warning(f"| IRIS IS READY on port {os.getenv('INTERFACE_HTTPS_PORT')} |")
- log.warning("===============================")
- # If an administrative user was created, log their credentials
- if pwd is not None:
- log.info(f'You can now login with user {admin.user} and password >>> {pwd} <<< '
- f'on {os.getenv("INTERFACE_HTTPS_PORT")}')
- def create_safe_db(db_name):
- """Creates a new database with the specified name if it does not already exist.
- Args:
- db_name: A string representing the name of the database to create.
- """
- # Create a new engine object for the specified database
- engine = create_engine(app.config["SQALCHEMY_PIGGER_URI"] + db_name)
- # Check if the database already exists
- if not database_exists(engine.url):
- # If the database does not exist, create it
- create_database(engine.url)
- # Dispose of the engine object
- engine.dispose()
- def create_safe_hooks():
- # --- Alert
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_create',
- hook_description='Triggered on alert creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_delete',
- hook_description='Triggered on alert deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_update',
- hook_description='Triggered on alert update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_resolution_update',
- hook_description='Triggered on alert resolution update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_status_update',
- hook_description='Triggered on alert status update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_escalate',
- hook_description='Triggered on alert escalation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_merge',
- hook_description='Triggered on alert merge, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_unmerge',
- hook_description='Triggered on alert unmerge, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_alert',
- hook_description='Triggered upon user action')
- # --- Case
- create_safe(db.session, IrisHook, hook_name='on_preload_case_create',
- hook_description='Triggered on case creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_case_create',
- hook_description='Triggered on case creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_case_delete',
- hook_description='Triggered on case deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_case_delete',
- hook_description='Triggered on case deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_case_update',
- hook_description='Triggered on case update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_case',
- hook_description='Triggered upon user action')
- # --- Assets
- create_safe(db.session, IrisHook, hook_name='on_preload_asset_create',
- hook_description='Triggered on asset creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_asset_create',
- hook_description='Triggered on asset creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_asset_update',
- hook_description='Triggered on asset update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_asset_update',
- hook_description='Triggered on asset update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_asset_delete',
- hook_description='Triggered on asset deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_asset_delete',
- hook_description='Triggered on asset deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_asset',
- hook_description='Triggered upon user action')
- # --- Notes
- create_safe(db.session, IrisHook, hook_name='on_preload_note_create',
- hook_description='Triggered on note creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_note_create',
- hook_description='Triggered on note creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_note_update',
- hook_description='Triggered on note update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_note_update',
- hook_description='Triggered on note update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_note_delete',
- hook_description='Triggered on note deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_note_delete',
- hook_description='Triggered on note deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_note',
- hook_description='Triggered upon user action')
- # --- iocs
- create_safe(db.session, IrisHook, hook_name='on_preload_ioc_create',
- hook_description='Triggered on ioc creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_ioc_create',
- hook_description='Triggered on ioc creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_ioc_update',
- hook_description='Triggered on ioc update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_ioc_update',
- hook_description='Triggered on ioc update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_ioc_delete',
- hook_description='Triggered on ioc deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_ioc_delete',
- hook_description='Triggered on ioc deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_ioc',
- hook_description='Triggered upon user action')
- # --- events
- create_safe(db.session, IrisHook, hook_name='on_preload_event_create',
- hook_description='Triggered on event creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_event_create',
- hook_description='Triggered on event creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_event_duplicate',
- hook_description='Triggered on event duplication, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_event_update',
- hook_description='Triggered on event update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_event_update',
- hook_description='Triggered on event update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_event_delete',
- hook_description='Triggered on event deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_event_delete',
- hook_description='Triggered on event deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_event',
- hook_description='Triggered upon user action')
- # --- evidence
- create_safe(db.session, IrisHook, hook_name='on_preload_evidence_create',
- hook_description='Triggered on evidence creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_evidence_create',
- hook_description='Triggered on evidence creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_evidence_update',
- hook_description='Triggered on evidence update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_evidence_update',
- hook_description='Triggered on evidence update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_evidence_delete',
- hook_description='Triggered on evidence deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_evidence_delete',
- hook_description='Triggered on evidence deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_evidence',
- hook_description='Triggered upon user action')
- # --- tasks
- create_safe(db.session, IrisHook, hook_name='on_preload_task_create',
- hook_description='Triggered on task creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_task_create',
- hook_description='Triggered on task creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_task_update',
- hook_description='Triggered on task update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_task_update',
- hook_description='Triggered on task update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_task_delete',
- hook_description='Triggered on task deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_task_delete',
- hook_description='Triggered on task deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_task',
- hook_description='Triggered upon user action')
- # --- global tasks
- create_safe(db.session, IrisHook, hook_name='on_preload_global_task_create',
- hook_description='Triggered on global task creation, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_global_task_create',
- hook_description='Triggered on global task creation, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_global_task_update',
- hook_description='Triggered on task update, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_global_task_update',
- hook_description='Triggered on global task update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_preload_global_task_delete',
- hook_description='Triggered on task deletion, before commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_global_task_delete',
- hook_description='Triggered on global task deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_manual_trigger_global_task',
- hook_description='Triggered upon user action')
- # --- reports
- create_safe(db.session, IrisHook, hook_name='on_preload_report_create',
- hook_description='Triggered on report creation, before generation in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_report_create',
- hook_description='Triggered on report creation, before download of the document')
- create_safe(db.session, IrisHook, hook_name='on_preload_activities_report_create',
- hook_description='Triggered on activities report creation, before generation in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_activities_report_create',
- hook_description='Triggered on activities report creation, before download of the document')
- # --- comments
- create_safe(db.session, IrisHook, hook_name='on_postload_asset_commented',
- hook_description='Triggered on event commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_asset_comment_update',
- hook_description='Triggered on event comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_asset_comment_delete',
- hook_description='Triggered on event comment deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_evidence_commented',
- hook_description='Triggered on evidence commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_evidence_comment_update',
- hook_description='Triggered on evidence comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_evidence_comment_delete',
- hook_description='Triggered on evidence comment deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_task_commented',
- hook_description='Triggered on task commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_task_comment_update',
- hook_description='Triggered on task comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_task_comment_delete',
- hook_description='Triggered on task comment deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_ioc_commented',
- hook_description='Triggered on IOC commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_ioc_comment_update',
- hook_description='Triggered on IOC comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_ioc_comment_delete',
- hook_description='Triggered on IOC comment deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_event_commented',
- hook_description='Triggered on event commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_event_comment_update',
- hook_description='Triggered on event comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_event_comment_delete',
- hook_description='Triggered on event comment deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_note_commented',
- hook_description='Triggered on note commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_note_comment_update',
- hook_description='Triggered on note comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_note_comment_delete',
- hook_description='Triggered on note comment deletion, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_commented',
- hook_description='Triggered on alert commented, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_comment_update',
- hook_description='Triggered on alert comment update, after commit in DB')
- create_safe(db.session, IrisHook, hook_name='on_postload_alert_comment_delete',
- hook_description='Triggered on alert comment deletion, after commit in DB')
- def pg_add_pgcrypto_ext():
- """Adds the pgcrypto extension to the PostgreSQL database.
- This extension provides cryptographic functions for PostgreSQL.
- """
- # Set the application context
- with app.app_context():
- # Open a connection to the iris_db database
- with db.engine.connect() as con:
- # Execute a SQL command to create the pgcrypto extension if it does not already exist
- con.execute(text('CREATE EXTENSION IF NOT EXISTS pgcrypto CASCADE;'))
- db.session.commit()
- log.info("pgcrypto extension added")
- def create_safe_languages():
- """Creates new Language objects if they do not already exist.
- This function creates new Language objects with the specified name and code
- if they do not already exist in the database.
- """
- # Create new Language objects for each language
- create_safe(db.session, Languages, name="french", code="FR")
- create_safe(db.session, Languages, name="english", code="EN")
- create_safe(db.session, Languages, name="german", code="DE")
- create_safe(db.session, Languages, name="bulgarian", code="BG")
- create_safe(db.session, Languages, name="croatian", code="HR")
- create_safe(db.session, Languages, name="danish", code="DK")
- create_safe(db.session, Languages, name="dutch", code="NL")
- create_safe(db.session, Languages, name="estonian", code="EE")
- create_safe(db.session, Languages, name="finnish", code="FI")
- create_safe(db.session, Languages, name="greek", code="GR")
- create_safe(db.session, Languages, name="hungarian", code="HU")
- create_safe(db.session, Languages, name="irish", code="IE")
- create_safe(db.session, Languages, name="italian", code="IT")
- create_safe(db.session, Languages, name="latvian", code="LV")
- create_safe(db.session, Languages, name="lithuanian", code="LT")
- create_safe(db.session, Languages, name="maltese", code="MT")
- create_safe(db.session, Languages, name="polish", code="PL")
- create_safe(db.session, Languages, name="portuguese", code="PT")
- create_safe(db.session, Languages, name="romanian", code="RO")
- create_safe(db.session, Languages, name="slovak", code="SK")
- create_safe(db.session, Languages, name="slovenian", code="SI")
- create_safe(db.session, Languages, name="spanish", code="ES")
- create_safe(db.session, Languages, name="swedish", code="SE")
- create_safe(db.session, Languages, name="indian", code="IN")
- create_safe(db.session, Languages, name="chinese", code="CN")
- create_safe(db.session, Languages, name="korean", code="KR")
- create_safe(db.session, Languages, name="arabic", code="AR")
- create_safe(db.session, Languages, name="japanese", code="JP")
- create_safe(db.session, Languages, name="turkish", code="TR")
- create_safe(db.session, Languages, name="vietnamese", code="VN")
- create_safe(db.session, Languages, name="thai", code="TH")
- create_safe(db.session, Languages, name="hebrew", code="IL")
- create_safe(db.session, Languages, name="czech", code="CZ")
- create_safe(db.session, Languages, name="norwegian", code="NO")
- create_safe(db.session, Languages, name="brazilian", code="BR")
- create_safe(db.session, Languages, name="ukrainian", code="UA")
- create_safe(db.session, Languages, name="catalan", code="CA")
- create_safe(db.session, Languages, name="serbian", code="RS")
- create_safe(db.session, Languages, name="persian", code="IR")
- create_safe(db.session, Languages, name="afrikaans", code="ZA")
- create_safe(db.session, Languages, name="albanian", code="AL")
- create_safe(db.session, Languages, name="armenian", code="AM")
- def create_safe_events_cats():
- """Creates new EventCategory objects if they do not already exist.
- This function creates new EventCategory objects with the specified name
- if they do not already exist in the database.
- """
- # Create new EventCategory objects for each category
- create_safe(db.session, EventCategory, name="Unspecified")
- create_safe(db.session, EventCategory, name="Legitimate")
- create_safe(db.session, EventCategory, name="Remediation")
- create_safe(db.session, EventCategory, name="Initial Access")
- create_safe(db.session, EventCategory, name="Execution")
- create_safe(db.session, EventCategory, name="Persistence")
- create_safe(db.session, EventCategory, name="Privilege Escalation")
- create_safe(db.session, EventCategory, name="Defense Evasion")
- create_safe(db.session, EventCategory, name="Credential Access")
- create_safe(db.session, EventCategory, name="Discovery")
- create_safe(db.session, EventCategory, name="Lateral Movement")
- create_safe(db.session, EventCategory, name="Collection")
- create_safe(db.session, EventCategory, name="Command and Control")
- create_safe(db.session, EventCategory, name="Exfiltration")
- create_safe(db.session, EventCategory, name="Impact")
- def create_safe_classifications():
- """Creates new CaseClassification objects if they do not already exist.
- This function reads the MISP classification taxonomy from a JSON file and creates
- new CaseClassification objects with the specified name, name_expanded, and description
- if they do not already exist in the database.
- """
- # Read the MISP classification taxonomy from a JSON file
- log.info("Reading MISP classification taxonomy from resources/misp.classification.taxonomy.json")
- with open(Path(__file__).parent / 'resources' / 'misp.classification.taxonomy.json') as data_file:
- data = json.load(data_file)
- # Iterate over each classification in the taxonomy
- for c in data.get('values'):
- predicate = c.get('predicate')
- entries = c.get('entry')
- # Iterate over each entry in the classification
- for entry in entries:
- # Create a new CaseClassification object with the specified name, name_expanded, and description
- create_safe(db.session, CaseClassification,
- name=f"{predicate}:{entry.get('value')}",
- name_expanded=f"{predicate.title()}: {entry.get('expanded')}",
- description=entry['description'])
- def create_safe_analysis_status():
- """Creates new AnalysisStatus objects if they do not already exist.
- This function creates new AnalysisStatus objects with the specified name
- if they do not already exist in the database.
- """
- # Create new AnalysisStatus objects for each status
- create_safe(db.session, AnalysisStatus, name='Unspecified')
- create_safe(db.session, AnalysisStatus, name='To be done')
- create_safe(db.session, AnalysisStatus, name='Started')
- create_safe(db.session, AnalysisStatus, name='Pending')
- create_safe(db.session, AnalysisStatus, name='Canceled')
- create_safe(db.session, AnalysisStatus, name='Done')
- def create_safe_task_status():
- """Creates new TaskStatus objects if they do not already exist.
- This function creates new TaskStatus objects with the specified status name,
- status description, and Bootstrap color if they do not already exist in the database.
- """
- # Create new TaskStatus objects for each status
- create_safe(db.session, TaskStatus, status_name='To do', status_description="", status_bscolor="danger")
- create_safe(db.session, TaskStatus, status_name='In progress', status_description="", status_bscolor="warning")
- create_safe(db.session, TaskStatus, status_name='On hold', status_description="", status_bscolor="muted")
- create_safe(db.session, TaskStatus, status_name='Done', status_description="", status_bscolor="success")
- create_safe(db.session, TaskStatus, status_name='Canceled', status_description="", status_bscolor="muted")
- def create_safe_severities():
- """Creates new Severity objects if they do not already exist.
- This function creates new Severity objects with the specified severity name
- and severity description if they do not already exist in the database.
- """
- # Create new Severity objects for each severity level
- create_safe(db.session, Severity, severity_name='Unspecified', severity_description="Unspecified")
- create_safe(db.session, Severity, severity_name='Informational', severity_description="Informational")
- create_safe(db.session, Severity, severity_name='Low', severity_description="Low")
- create_safe(db.session, Severity, severity_name='Medium', severity_description="Medium")
- create_safe(db.session, Severity, severity_name='High', severity_description="High")
- create_safe(db.session, Severity, severity_name='Critical', severity_description="Critical")
- def create_safe_alert_status():
- """Creates new AlertStatus objects if they do not already exist.
- This function creates new AlertStatus objects with the specified status name
- and status description if they do not already exist in the database.
- """
- # Create new AlertStatus objects for each status
- create_safe(db.session, AlertStatus, status_name='Unspecified', status_description="Unspecified")
- create_safe(db.session, AlertStatus, status_name='New', status_description="Alert is new and unassigned")
- create_safe(db.session, AlertStatus, status_name='Assigned', status_description="Alert is assigned to a user and "
- "pending investigation")
- create_safe(db.session, AlertStatus, status_name='In progress', status_description="Alert is being investigated")
- create_safe(db.session, AlertStatus, status_name='Pending', status_description="Alert is in a pending state")
- create_safe(db.session, AlertStatus, status_name='Closed', status_description="Alert closed, no action taken")
- create_safe(db.session, AlertStatus, status_name='Merged', status_description="Alert merged into an existing case")
- create_safe(db.session, AlertStatus, status_name='Escalated', status_description="Alert converted to a new case")
- def create_safe_evidence_types():
- """Creates new Evidence Types objects if they do not already exist.
- This function creates new Evidence Types objects with the specified type name
- and type description if they do not already exist in the database.
- """
- # Create new EvidenceType objects for each status
- create_safe(db.session, EvidenceTypes, name='Unspecified', description="Unspecified")
- create_safe(db.session, EvidenceTypes, name='HDD image - Generic', description="Generic copy of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - DD - Other', description="DD copy of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - DD - Windows', description="DD copy of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - DD - Unix', description="DD copy of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - DD - MacOS', description="DD copy of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - E01 - Other', description="E01 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - E01 - Windows', description="E01 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - E01 - Unix', description="E01 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - E01 - MacOS', description="E01 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - Other', description="AFF4 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - Windows', description="AFF4 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - Unix', description="AFF4 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='HDD image - AFF4 - MacOS', description="AFF4 acquisition of an hard drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - Generic', description="Generic copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - DD - Other', description="DD copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - DD - Windows', description="DD copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - DD - Unix', description="DD copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - DD - MacOS', description="DD copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - E01 - Other', description="EO1 copy of a solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - E01 - Windows', description="EO1 copy of a solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - E01 - Unix', description="EO1 copy of a solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - E01 - MacOS', description="EO1 copy of MacOS on a solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - Other', description="AFF4 copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - Windows', description="AFF4 copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - Unix', description="AFF4 copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='SSD image - AFF4 - MacOS', description="AFF4 copy of an solid state drive")
- create_safe(db.session, EvidenceTypes, name='VM image - Generic', description="Generic copy of a VM ")
- create_safe(db.session, EvidenceTypes, name='VM image - Linux Server', description="Copy of a Linux Server VM")
- create_safe(db.session, EvidenceTypes, name='VM image - Windows Server', description="Copy of a Windows Server VM")
- create_safe(db.session, EvidenceTypes, name='VM image - Windows Server', description="Copy of a Windows Server VM")
- create_safe(db.session, EvidenceTypes, name='Phone Image - Android', description="Copy of an Android phone")
- create_safe(db.session, EvidenceTypes, name='Phone Image - iPhone', description="Copy of an iPhone")
- create_safe(db.session, EvidenceTypes, name='Phone backup - Android (adb)', description="adb backup of an Android")
- create_safe(db.session, EvidenceTypes, name='Phone backup - iPhone (iTunes)', description="iTunes backup of an iPhone")
- create_safe(db.session, EvidenceTypes, name='Tablet Image - Android', description="Copy of an Android tablet")
- create_safe(db.session, EvidenceTypes, name='Tablet Image - iPad', description="Copy of an iPad tablet")
- create_safe(db.session, EvidenceTypes, name='Tablet backup - Android (adb)', description="adb backup of an Android tablet")
- create_safe(db.session, EvidenceTypes, name='Tablet backup - iPad (iTunes)', description="iTunes backup of an iPad")
- create_safe(db.session, EvidenceTypes, name='Collection - Velociraptor', description="Velociraptor collection")
- create_safe(db.session, EvidenceTypes, name='Collection - ORC', description="ORC collection")
- create_safe(db.session, EvidenceTypes, name='Collection - KAPE', description="KAPE collection")
- create_safe(db.session, EvidenceTypes, name="Memory acquisition - Physical RAM", description="Physical RAM acquisition")
- create_safe(db.session, EvidenceTypes, name="Memory acquisition - VMEM", description="vmem file")
- create_safe(db.session, EvidenceTypes, name="Logs - Linux", description="Standard Linux logs")
- create_safe(db.session, EvidenceTypes, name="Logs - Windows EVTX", description="Standard Windows EVTX logs")
- create_safe(db.session, EvidenceTypes, name="Logs - Windows EVT", description="Standard Windows EVT logs")
- create_safe(db.session, EvidenceTypes, name="Logs - MacOS", description="Standard MacOS logs")
- create_safe(db.session, EvidenceTypes, name="Logs - Generic", description="Generic logs")
- create_safe(db.session, EvidenceTypes, name="Logs - Firewall", description="Firewall logs")
- create_safe(db.session, EvidenceTypes, name="Logs - Proxy", description="Proxy logs")
- create_safe(db.session, EvidenceTypes, name="Logs - DNS", description="DNS logs")
- create_safe(db.session, EvidenceTypes, name="Logs - Email", description="Email logs")
- create_safe(db.session, EvidenceTypes, name="Executable - Windows (PE)", description="Generic Windows executable")
- create_safe(db.session, EvidenceTypes, name="Executable - Linux (ELF)", description="Generic Linux executable")
- create_safe(db.session, EvidenceTypes, name="Executable - MacOS (Mach-O)", description="Generic MacOS executable")
- create_safe(db.session, EvidenceTypes, name="Executable - Generic", description="Generic executable")
- create_safe(db.session, EvidenceTypes, name="Script - Generic", description="Generic script")
- create_safe(db.session, EvidenceTypes, name="Generic - Data blob", description="Generic blob of data")
- def create_safe_alert_resolution_status():
- """Creates new AlertResolutionStatus objects if they do not already exist.
- This function creates new AlertResolutionStatus objects with the specified resolution_status_name
- and resolution_status_description if they do not already exist in the database.
- """
- create_safe(db.session, AlertResolutionStatus, resolution_status_name='False Positive',
- resolution_status_description="The alert was a false positive")
- create_safe(db.session, AlertResolutionStatus, resolution_status_name='True Positive With Impact',
- resolution_status_description="The alert was a true positive and had an impact")
- create_safe(db.session, AlertResolutionStatus, resolution_status_name='True Positive Without Impact',
- resolution_status_description="The alert was a true positive but had no impact")
- create_safe(db.session, AlertResolutionStatus, resolution_status_name='Not Applicable',
- resolution_status_description="The alert is not applicable")
- create_safe(db.session, AlertResolutionStatus, resolution_status_name='Unknown',
- resolution_status_description="Unknown resolution status")
- create_safe(db.session, AlertResolutionStatus, resolution_status_name='Legitimate',
- resolution_status_description="The alert is acceptable and expected")
- def create_safe_case_states():
- """Creates new CaseState objects if they do not already exist.
- This function creates new CaseState objects with the specified state name,
- state description, and protected status if they do not already exist in the database.
- """
- # Create new CaseState objects for each state
- create_safe(db.session, CaseState, state_name='Unspecified', state_description="Unspecified", protected=True)
- create_safe(db.session, CaseState, state_name='In progress', state_description="Case is being investigated")
- create_safe(db.session, CaseState, state_name='Open', state_description="Case is open", protected=True)
- create_safe(db.session, CaseState, state_name='Containment', state_description="Containment is in progress")
- create_safe(db.session, CaseState, state_name='Eradication', state_description="Eradication is in progress")
- create_safe(db.session, CaseState, state_name='Recovery', state_description="Recovery is in progress")
- create_safe(db.session, CaseState, state_name='Post-Incident', state_description="Post-incident phase")
- create_safe(db.session, CaseState, state_name='Reporting', state_description="Reporting is in progress")
- create_safe(db.session, CaseState, state_name='Closed', state_description="Case is closed", protected=True)
- def create_safe_review_status():
- """Creates new ReviewStatus objects if they do not already exist.
- This function creates new ReviewStatus objects with the specified status name
- if they do not already exist in the database.
- """
- create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.no_review_required)
- create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.not_reviewed)
- create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.pending_review)
- create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.review_in_progress)
- create_safe(db.session, ReviewStatus, status_name=ReviewStatusList.reviewed)
- def create_safe_assets():
- """Creates new AssetsType objects if they do not already exist.
- This function creates new AssetsType objects with the specified asset name,
- asset description, and asset icons if they do not already exist in the database.
- """
- # Create new AssetsType objects for each asset type
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Account",
- asset_description="Generic Account", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Firewall", asset_description="Firewall",
- asset_icon_not_compromised="firewall.png", asset_icon_compromised="ioc_firewall.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Linux - Server",
- asset_description="Linux server", asset_icon_not_compromised="server.png",
- asset_icon_compromised="ioc_server.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Linux - Computer",
- asset_description="Linux computer", asset_icon_not_compromised="desktop.png",
- asset_icon_compromised="ioc_desktop.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Linux Account",
- asset_description="Linux Account", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Mac - Computer",
- asset_description="Mac computer", asset_icon_not_compromised="desktop.png",
- asset_icon_compromised="ioc_desktop.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Phone - Android",
- asset_description="Android Phone", asset_icon_not_compromised="phone.png",
- asset_icon_compromised="ioc_phone.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Phone - IOS",
- asset_description="Apple Phone", asset_icon_not_compromised="phone.png",
- asset_icon_compromised="ioc_phone.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows - Computer",
- asset_description="Standard Windows Computer",
- asset_icon_not_compromised="windows_desktop.png",
- asset_icon_compromised="ioc_windows_desktop.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows - Server",
- asset_description="Standard Windows Server", asset_icon_not_compromised="windows_server.png",
- asset_icon_compromised="ioc_windows_server.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows - DC",
- asset_description="Domain Controller", asset_icon_not_compromised="windows_server.png",
- asset_icon_compromised="ioc_windows_server.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Router", asset_description="Router",
- asset_icon_not_compromised="router.png", asset_icon_compromised="ioc_router.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Switch", asset_description="Switch",
- asset_icon_not_compromised="switch.png", asset_icon_compromised="ioc_switch.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="VPN", asset_description="VPN",
- asset_icon_not_compromised="vpn.png", asset_icon_compromised="ioc_vpn.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="WAF", asset_description="WAF",
- asset_icon_not_compromised="firewall.png", asset_icon_compromised="ioc_firewall.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - Local",
- asset_description="Windows Account - Local", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - Local - Admin",
- asset_description="Windows Account - Local - Admin", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD",
- asset_description="Windows Account - AD", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD - Admin",
- asset_description="Windows Account - AD - Admin", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD - krbtgt",
- asset_description="Windows Account - AD - krbtgt", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- get_by_value_or_create(db.session, AssetsType, "asset_name", asset_name="Windows Account - AD - Service",
- asset_description="Windows Account - AD - krbtgt", asset_icon_not_compromised="user.png",
- asset_icon_compromised="ioc_user.png")
- def create_safe_client():
- """Creates a new Client object if it does not already exist.
- This function creates a new Client object with the specified client name
- and client description if it does not already exist in the database.
- """
- # Create a new Client object if it does not already exist
- client = get_or_create(db.session, Client,
- name="IrisInitialClient")
- return client
- def create_safe_auth_model():
- """Creates new Organisation, Group, and User objects if they do not already exist.
- This function creates a new Organisation object with the specified name and description,
- and creates new Group objects with the specified name, description, auto-follow status,
- auto-follow access level, and permissions if they do not already exist in the database.
- It also updates the attributes of the existing Group objects if they have changed.
- """
- # Create new Organisation object
- def_org = get_or_create(db.session, Organisation, org_name="Default Org",
- org_description="Default Organisation")
- # Create new Administrator Group object
- try:
- gadm = get_or_create(db.session, Group, group_name='Administrators', group_description='Administrators',
- group_auto_follow=True, group_auto_follow_access_level=CaseAccessLevel.full_access.value,
- group_permissions=ac_get_mask_full_permissions())
- except exc.IntegrityError:
- db.session.rollback()
- log.warning('Administrator group integrity error. Group permissions were probably changed. Updating.')
- gadm = Group.query.filter(
- Group.group_name == 'Administrators'
- ).first()
- # Update Administrator Group object attributes
- if gadm.group_permissions != ac_get_mask_full_permissions():
- gadm.group_permissions = ac_get_mask_full_permissions()
- if gadm.group_auto_follow_access_level != CaseAccessLevel.full_access.value:
- gadm.group_auto_follow_access_level = CaseAccessLevel.full_access.value
- if gadm.group_auto_follow is not True:
- gadm.group_auto_follow = True
- db.session.commit()
- # Create new Analysts Group object
- try:
- ganalysts = get_or_create(db.session, Group, group_name='Analysts', group_description='Standard Analysts',
- group_auto_follow=False,
- group_auto_follow_access_level=CaseAccessLevel.full_access.value,
- group_permissions=ac_get_mask_analyst())
- except exc.IntegrityError:
- db.session.rollback()
- log.warning('Analysts group integrity error. Group permissions were probably changed. Updating.')
- ganalysts = get_group_by_name('Analysts')
- # Update Analysts Group object attributes
- if ganalysts.group_permissions != ac_get_mask_analyst():
- ganalysts.group_permissions = ac_get_mask_analyst()
- if ganalysts.group_auto_follow is not False:
- ganalysts.group_auto_follow = False
- if ganalysts.group_auto_follow_access_level != CaseAccessLevel.full_access.value:
- ganalysts.group_auto_follow_access_level = CaseAccessLevel.full_access.value
- db.session.commit()
- return def_org, gadm, ganalysts
- def create_safe_admin(def_org, gadm):
- """Creates a new admin user if one does not already exist.
- This function creates a new admin user with the specified username, email, and password
- if one does not already exist in the database. If an admin user already exists, it updates
- the email address of the existing user if it has changed.
- """
- # Get admin username and email from app config
- admin_username = app.config.get('IRIS_ADM_USERNAME')
- if admin_username is None:
- admin_username = 'administrator'
- admin_email = app.config.get('IRIS_ADM_EMAIL')
- if admin_email is None:
- admin_email = 'administrator@localhost'
- # Check if admin user already exists
- user = User.query.filter(or_(
- User.user == admin_username,
- User.email == admin_email
- )).first()
- password = None
- if not user:
- # Generate a new password if one was not provided in the app config
- password = app.config.get('IRIS_ADM_PASSWORD')
- if password is None:
- password = ''.join(random.choices(string.printable[:-6], k=16))
- log.info(f'Creating first admin user with username "{admin_username}"')
- # Create new User object for admin user
- user = User(
- user=admin_username,
- name=admin_username,
- email=admin_email,
- password=bc.generate_password_hash(password.encode('utf8')).decode('utf8'),
- active=True
- )
- # Generate a new API key if one was not provided in the app config
- api_key = app.config.get('IRIS_ADM_API_KEY')
- if api_key is None:
- api_key = secrets.token_urlsafe(nbytes=64)
- user.api_key = api_key
- db.session.add(user)
- db.session.commit()
- # Add admin user to admin group and default organisation
- add_user_to_group(user_id=user.id, group_id=gadm.group_id)
- add_user_to_organisation(user_id=user.id, org_id=def_org.org_id)
- log.warning(f">>> Administrator password: {password}")
- db.session.commit()
- else:
- if not os.environ.get('IRIS_ADM_PASSWORD'):
- # Prevent leak of user set password in logs
- log.warning(">>> Administrator already exists")
- if user.email != admin_email:
- # Update email address of existing admin user if it has changed
- log.warning(f'Email of administrator will be updated via config to {admin_email}')
- user.email = admin_email
- db.session.commit()
- return user, password
- def create_safe_case(user, client, groups):
- """Creates a new case if one does not already exist for the specified client.
- This function creates a new case with the specified name, description, SOC ID, user, and client
- if one does not already exist in the database for the specified client. It also adds the specified
- user and groups to the case with full access level.
- """
- # Check if a case already exists for the client
- case = Cases.query.filter(
- Cases.client_id == client.client_id
- ).first()
- if not case:
- # Create a new case for the client
- case = Cases(
- name="Initial Demo",
- description="This is a demonstration.",
- soc_id="soc_id_demo",
- user=user,
- client_id=client.client_id
- )
- # Validate the case and save it to the database
- case.validate_on_build()
- case.save()
- db.session.commit()
- # Add the specified user and groups to the case with full access level
- for group in groups:
- add_case_access_to_group(group=group,
- cases_list=[case.case_id],
- access_level=CaseAccessLevel.full_access.value)
- ac_add_user_effective_access(users_list=[user.id],
- case_id=1,
- access_level=CaseAccessLevel.full_access.value)
- return case
- def create_safe_report_types():
- """Creates new ReportType objects if they do not already exist.
- This function creates new ReportType objects with the specified names if they do not already
- exist in the database.
- """
- create_safe(db.session, ReportType, name="Investigation")
- create_safe(db.session, ReportType, name="Activities")
- def create_safe_attributes():
- """Creates new Attribute objects if they do not already exist.
- This function creates new Attribute objects with the specified display name, description,
- object type, and content if they do not already exist in the database.
- """
- create_safe_attr(db.session, attribute_display_name='IOC',
- attribute_description='Defines default attributes for IOCs', attribute_for='ioc',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Events',
- attribute_description='Defines default attributes for Events', attribute_for='event',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Assets',
- attribute_description='Defines default attributes for Assets', attribute_for='asset',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Tasks',
- attribute_description='Defines default attributes for Tasks', attribute_for='task',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Notes',
- attribute_description='Defines default attributes for Notes', attribute_for='note',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Evidences',
- attribute_description='Defines default attributes for Evidences', attribute_for='evidence',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Cases',
- attribute_description='Defines default attributes for Cases', attribute_for='case',
- attribute_content={})
- create_safe_attr(db.session, attribute_display_name='Customers',
- attribute_description='Defines default attributes for Customers', attribute_for='client',
- attribute_content={})
- def create_safe_ioctypes():
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="AS",
- type_description="Autonomous system", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="aba-rtn",
- type_description="ABA routing transit number",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="account",
- type_description="Account of any type",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="anonymised",
- type_description="Anonymised value - described with the anonymisation object via a relationship",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="attachment",
- type_description="Attachment with external information",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="authentihash",
- type_description="Authenticode executable signature hash", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters"
- )
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="boolean",
- type_description="Boolean value - to be used in objects",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="btc",
- type_description="Bitcoin Address", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="campaign-id",
- type_description="Associated campaign ID",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="campaign-name",
- type_description="Associated campaign name",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="cdhash",
- type_description="An Apple Code Directory Hash, identifying a code-signed Mach-O executable file",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="chrome-extension-id",
- type_description="Chrome extension id",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="community-id",
- type_description="a community ID flow hashing algorithm to map multiple traffic monitors into common flow id",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="cookie",
- type_description="HTTP cookie as often stored on the user web client. This can include authentication cookie or session cookie.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dash",
- type_description="Dash Address", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="datetime",
- type_description="Datetime in the ISO 8601 format",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dkim",
- type_description="DKIM public key", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dkim-signature",
- type_description="DKIM signature", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="dns-soa-email",
- type_description="RFC1035 mandates that DNS zones should have a SOA (Statement Of Authority) record that contains an email address where a PoC for the domain could be contacted. This can sometimes be used for attribution/linkage between different domains even if protected by whois privacy",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="domain",
- type_description="A domain name used in the malware",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="domain|ip",
- type_description="A domain name and its IP address (as found in DNS lookup) separated by a |",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email",
- type_description="An e-mail address", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-attachment",
- type_description="File name of the email attachment.", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-body",
- type_description="Email body", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-dst",
- type_description="The destination email address. Used to describe the recipient when describing an e-mail.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-dst-display-name",
- type_description="Email destination display name", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-header",
- type_description="Email header", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-message-id",
- type_description="The email message ID",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-mime-boundary",
- type_description="The email mime boundary separating parts in a multipart email",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-reply-to",
- type_description="Email reply to header",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-src",
- type_description="The source email address. Used to describe the sender when describing an e-mail.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-src-display-name",
- type_description="Email source display name",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-subject",
- type_description="The subject of the email",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-thread-index",
- type_description="The email thread index header",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="email-x-mailer",
- type_description="Email x-mailer header",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="favicon-mmh3",
- type_description="favicon-mmh3 is the murmur3 hash of a favicon as used in Shodan.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename",
- type_description="Filename", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename-pattern",
- type_description="A pattern in the name of a file",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|authentihash",
- type_description="A checksum in md5 format",
- type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{64}',
- type_validation_expect="filename|64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|impfuzzy",
- type_description="Import fuzzy hash - a fuzzy hash created based on the imports in the sample.",
- type_taxonomy="", )
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|imphash",
- type_description="Import hash - a hash created based on the imports in the sample.",
- type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{32}',
- type_validation_expect="filename|32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|md5",
- type_description="A filename and an md5 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{32}',
- type_validation_expect="filename|32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|pehash",
- type_description="A filename and a PEhash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{40}',
- type_validation_expect="filename|40 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha1",
- type_description="A filename and an sha1 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{40}',
- type_validation_expect="filename|40 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha224",
- type_description="A filename and a sha-224 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{56}',
- type_validation_expect="filename|56 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha256",
- type_description="A filename and an sha256 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{64}',
- type_validation_expect="filename|64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-224",
- type_description="A filename and an sha3-224 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{56}',
- type_validation_expect="filename|56 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-256",
- type_description="A filename and an sha3-256 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{64}',
- type_validation_expect="filename|64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-384",
- type_description="A filename and an sha3-384 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{96}',
- type_validation_expect="filename|96 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha3-512",
- type_description="A filename and an sha3-512 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{128}',
- type_validation_expect="filename|128 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha384",
- type_description="A filename and a sha-384 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{96}',
- type_validation_expect="filename|96 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha512",
- type_description="A filename and a sha-512 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{128}',
- type_validation_expect="filename|128 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha512/224",
- type_description="A filename and a sha-512/224 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{56}',
- type_validation_expect="filename|56 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|sha512/256",
- type_description="A filename and a sha-512/256 hash separated by a |", type_taxonomy="",
- type_validation_regex=r'.+\|[a-f0-9]{64}',
- type_validation_expect="filename|64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|ssdeep",
- type_description="A checksum in ssdeep format",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|tlsh",
- type_description="A filename and a Trend Micro Locality Sensitive Hash separated by a |",
- type_taxonomy="",
- type_validation_regex=r'.+\|t?[a-f0-9]{35,}',
- type_validation_expect="filename|at least 35 hexadecimal characters, optionally starting with t1 instead of hexadecimal characters"
- )
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="filename|vhash",
- type_description="A filename and a VirusTotal hash separated by a |", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="first-name",
- type_description="First name of a natural person",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="float",
- type_description="A floating point value.", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="full-name",
- type_description="Full name of a natural person",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="gene",
- type_description="GENE - Go Evtx sigNature Engine",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="git-commit-id",
- type_description="A git commit ID.", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="github-organisation",
- type_description="A github organisation",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="github-repository",
- type_description="A github repository",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="github-username",
- type_description="A github user name",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hassh-md5",
- type_description="hassh is a network fingerprinting standard which can be used to identify specific Client SSH implementations. The fingerprints can be easily stored, searched and shared in the form of an MD5 fingerprint.",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hasshserver-md5",
- type_description="hasshServer is a network fingerprinting standard which can be used to identify specific Server SSH implementations. The fingerprints can be easily stored, searched and shared in the form of an MD5 fingerprint.",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hex",
- type_description="A value in hexadecimal format",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hostname",
- type_description="A full host/dnsname of an attacker",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="hostname|port",
- type_description="Hostname and port number separated by a |", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="http-method",
- type_description="HTTP method used by the malware (e.g. POST, GET, …).", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="iban",
- type_description="International Bank Account Number",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="identity-card-number",
- type_description="Identity card number",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="impfuzzy",
- type_description="A fuzzy hash of import table of Portable Executable format", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="imphash",
- type_description="Import hash - a hash created based on the imports in the sample.",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-any",
- type_description="A source or destination IP address of the attacker or C&C server",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-dst",
- type_description="A destination IP address of the attacker or C&C server", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-dst|port",
- type_description="IP destination and port number separated by a |", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-src",
- type_description="A source IP address of the attacker",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ip-src|port",
- type_description="IP source and port number separated by a |", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ja3-fingerprint-md5",
- type_description="JA3 is a method for creating SSL/TLS client fingerprints that should be easy to produce on any platform and can be easily shared for threat intelligence.",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="jabber-id",
- type_description="Jabber ID", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="jarm-fingerprint",
- type_description="JARM is a method for creating SSL/TLS server fingerprints.", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{62}", type_validation_expect="62 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="kusto-query",
- type_description="Kusto query - Kusto from Microsoft Azure is a service for storing and running interactive analytics over Big Data.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="link",
- type_description="Link to an external information",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mac-address",
- type_description="Mac address", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mac-eui-64",
- type_description="Mac EUI-64 address", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="malware-sample",
- type_description="Attachment containing encrypted malware sample", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="malware-type",
- type_description="Malware type", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="md5",
- type_description="A checksum in md5 format", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="middle-name",
- type_description="Middle name of a natural person",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mime-type",
- type_description="A media type (also MIME type and content type) is a two-part identifier for file formats and format contents transmitted on the Internet",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mobile-application-id",
- type_description="The application id of a mobile application", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="mutex",
- type_description="Mutex, use the format \\BaseNamedObjects<Mutex>", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="named pipe",
- type_description="Named pipe, use the format .\\pipe<PipeName>", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="other",
- type_description="Other attribute", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="file-path",
- type_description="Path of file", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pattern-in-file",
- type_description="Pattern in file that identifies the malware", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pattern-in-memory",
- type_description="Pattern in memory dump that identifies the malware", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pattern-in-traffic",
- type_description="Pattern in network traffic that identifies the malware", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pdb",
- type_description="Microsoft Program database (PDB) path information", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pehash",
- type_description="PEhash - a hash calculated based of certain pieces of a PE executable file",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pgp-private-key",
- type_description="A PGP private key",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="pgp-public-key",
- type_description="A PGP public key", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="phone-number",
- type_description="Telephone Number", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="port",
- type_description="Port number", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="process-state",
- type_description="State of a process", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="prtn",
- type_description="Premium-Rate Telephone Number",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="regkey",
- type_description="Registry key or value", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="regkey|value",
- type_description="Registry value + data separated by |",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha1",
- type_description="A checksum in sha1 format", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha224",
- type_description="A checksum in sha-224 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{56}", type_validation_expect="56 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha256",
- type_description="A checksum in sha256 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-224",
- type_description="A checksum in sha3-224 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{56}", type_validation_expect="56 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-256",
- type_description="A checksum in sha3-256 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-384",
- type_description="A checksum in sha3-384 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{96}", type_validation_expect="96 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha3-512",
- type_description="A checksum in sha3-512 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{128}", type_validation_expect="128 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha384",
- type_description="A checksum in sha-384 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{96}", type_validation_expect="96 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha512",
- type_description="A checksum in sha-512 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{128}", type_validation_expect="128 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha512/224",
- type_description="A checksum in the sha-512/224 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{56}", type_validation_expect="56 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sha512/256",
- type_description="A checksum in the sha-512/256 format",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="sigma",
- type_description="Sigma - Generic Signature Format for SIEM Systems", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="size-in-bytes",
- type_description="Size expressed in bytes",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="snort",
- type_description="An IDS rule in Snort rule-format",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ssdeep",
- type_description="A checksum in ssdeep format",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="ssh-fingerprint",
- type_description="A fingerprint of SSH key material",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="stix2-pattern",
- type_description="STIX 2 pattern", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-email",
- type_description="Attack Targets Email(s)",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-external",
- type_description="External Target Organizations Affected by this Attack", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-location",
- type_description="Attack Targets Physical Location(s)", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-machine",
- type_description="Attack Targets Machine Name(s)",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-org",
- type_description="Attack Targets Department or Organization(s)", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="target-user",
- type_description="Attack Targets Username(s)",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="telfhash",
- type_description="telfhash is symbol hash for ELF files, just like imphash is imports hash for PE files.",
- type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{70}", type_validation_expect="70 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="text",
- type_description="Name, ID or a reference", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="threat-actor",
- type_description="A string identifying the threat actor",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="tlsh",
- type_description="A checksum in the Trend Micro Locality Sensitive Hash format",
- type_taxonomy="",
- type_validation_regex=r"^t?[a-f0-9]{35,}",
- type_validation_expect="at least 35 hexadecimal characters, optionally starting with t1 instead of hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="travel-details",
- type_description="Travel details", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="twitter-id",
- type_description="Twitter ID", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="uri",
- type_description="Uniform Resource Identifier", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="url", type_description="url",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="user-agent",
- type_description="The user-agent used by the malware in the HTTP request.", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="vhash",
- type_description="A VirusTotal checksum", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="vulnerability",
- type_description="A reference to the vulnerability used in the exploit", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="weakness",
- type_description="A reference to the weakness used in the exploit", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-creation-date",
- type_description="The date of domain’s creation, obtained from the WHOIS information.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-email",
- type_description="The e-mail of a domain’s registrant, obtained from the WHOIS information.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-name",
- type_description="The name of a domain’s registrant, obtained from the WHOIS information.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-org",
- type_description="The org of a domain’s registrant, obtained from the WHOIS information.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrant-phone",
- type_description="The phone number of a domain’s registrant, obtained from the WHOIS information.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="whois-registrar",
- type_description="The registrar of the domain, obtained from the WHOIS information.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="windows-scheduled-task",
- type_description="A scheduled task in windows",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="windows-service-displayname",
- type_description="A windows service’s displayname, not to be confused with the windows-service-name. This is the name that applications will generally display as the service’s name in applications.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="windows-service-name",
- type_description="A windows service name. This is the name used internally by windows. Not to be confused with the windows-service-displayname.",
- type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="x509-fingerprint-md5",
- type_description="X509 fingerprint in MD5 format", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{32}", type_validation_expect="32 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="x509-fingerprint-sha1",
- type_description="X509 fingerprint in SHA-1 format", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{40}", type_validation_expect="40 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="x509-fingerprint-sha256",
- type_description="X509 fingerprint in SHA-256 format", type_taxonomy="",
- type_validation_regex=r"[a-f0-9]{64}", type_validation_expect="64 hexadecimal characters")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="xmr",
- type_description="Monero Address", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="yara",
- type_description="Yara signature", type_taxonomy="")
- create_safe_limited(db.session, IocType, ["type_name", "type_description"], type_name="zeek",
- type_description="An NIDS rule in the Zeek rule-format",
- type_taxonomy="")
- def create_safe_os_types():
- create_safe(db.session, OsType, type_name="Windows")
- create_safe(db.session, OsType, type_name="Linux")
- create_safe(db.session, OsType, type_name="AIX")
- create_safe(db.session, OsType, type_name="MacOS")
- create_safe(db.session, OsType, type_name="Apple iOS")
- create_safe(db.session, OsType, type_name="Cisco iOS")
- create_safe(db.session, OsType, type_name="Android")
- def create_safe_tlp():
- create_safe(db.session, Tlp, tlp_name="red", tlp_bscolor="danger")
- create_safe(db.session, Tlp, tlp_name="amber", tlp_bscolor="warning")
- create_safe(db.session, Tlp, tlp_name="green", tlp_bscolor="success")
- create_safe(db.session, Tlp, tlp_name="clear", tlp_bscolor="black")
- create_safe(db.session, Tlp, tlp_name="amber+strict", tlp_bscolor="warning")
- def create_safe_server_settings():
- if not ServerSettings.query.count():
- create_safe(db.session, ServerSettings,
- http_proxy="", https_proxy="", prevent_post_mod_repush=False,
- prevent_post_objects_repush=False,
- password_policy_min_length="12", password_policy_upper_case=True,
- password_policy_lower_case=True, password_policy_digit=True,
- password_policy_special_chars="", enforce_mfa=app.config.get("MFA_ENABLED", False))
- def register_modules_pipelines():
- modules = IrisModule.query.with_entities(
- IrisModule.module_name,
- IrisModule.module_config
- ).filter(
- IrisModule.has_pipeline == True
- ).all()
- for module in modules:
- module = module[0]
- inst, _ = instantiate_module_from_name(module)
- if not inst:
- continue
- inst.internal_configure(celery_decorator=celery.task,
- evidence_storage=None,
- mod_web_config=module[1])
- status = inst.get_tasks_for_registration()
- if status.is_failure():
- log.warning("Failed getting tasks for module {}".format(module))
- continue
- tasks = status.get_data()
- for task in tasks:
- celery.register_task(task)
- def register_default_modules():
- modules = ['iris_vt_module', 'iris_misp_module', 'iris_check_module',
- 'iris_webhooks_module', 'iris_intelowl_module']
- for module_name in modules:
- class_, _ = instantiate_module_from_name(module_name)
- is_ready, logs = check_module_health(class_)
- if not is_ready:
- log.info("Attempted to initiate {mod}. Got {err}".format(mod=module_name, err=",".join(logs)))
- return False
- module, logs = register_module(module_name)
- if module is None:
- log.info("Attempted to add {mod}. Got {err}".format(mod=module_name, err=logs))
- else:
- iris_module_disable_by_id(module.id)
- log.info('Successfully registered {mod}'.format(mod=module_name))
- def custom_assets_symlinks():
- try:
- source_paths = glob.glob(os.path.join(app.config['ASSET_STORE_PATH'], "*"))
- for store_fullpath in source_paths:
- filename = store_fullpath.split(os.path.sep)[-1]
- show_fullpath = os.path.join(app.config['APP_PATH'], 'app',
- app.config['ASSET_SHOW_PATH'].strip(os.path.sep), filename)
- if not os.path.islink(show_fullpath):
- os.symlink(store_fullpath, show_fullpath)
- log.info(f"Created assets img symlink {store_fullpath} -> {show_fullpath}")
- except Exception as e:
- log.error(f"Error: {e}")
- def create_directories():
- log.info("Attempting to create data directories")
- for d in ['UPLOADED_PATH', 'TEMPLATES_PATH', 'BACKUP_PATH', 'ASSET_STORE_PATH', 'DATASTORE_PATH']:
- try:
- log.info(f'Creating directory {d}')
- os.makedirs(app.config.get(d), exist_ok=True)
- except OSError as e:
- log.error(f"Failed to create directory {app.config.get(d)}: {e}")
|