From a4cb36c94dee501792e0b275d96354ad1491704d Mon Sep 17 00:00:00 2001 From: mrigankanand Date: Wed, 27 Jul 2022 23:26:13 +0530 Subject: [PATCH 1/4] API for getting details of all running containers --- api/server.py | 43 ++++++++++++++++++++++++++++++++++++++++++- api/utility.py | 24 +++++++++++++++++++++++- core/get_modules.py | 27 +++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/api/server.py b/api/server.py index ecc81963..ce78a537 100644 --- a/api/server.py +++ b/api/server.py @@ -25,7 +25,7 @@ fix_skip, fix_filter_query, msg_structure, - root_dir) + root_dir, get_running_modules_details) from config import ( api_configuration, user_configuration) @@ -647,6 +647,47 @@ def all_module_names(): abort(500) +@app.route("/api/core/running/modules", methods=["GET"]) +def all_running_module_details(): + """ + Get the list of details of all running module details + --- + responses: + '200': + description: Ok + examples: + application/json: + [ + { + "Command":"\"/bin/sh -c 'service\u2026\"", + "CreatedAt":"2022-07-27 21:49:43 +0530 IST", + "ID":"b5760a5cc113", + "Image":"ohp_ftpserver_weak_password", + "LocalVolumes":"0", + "Mounts":"/host_mnt/User\u2026", + "Names":"ohp_ftpserver_weak_password", + "Networks":"ohp_internet", + "Ports":"0.0.0.0:21->21/tcp", + "RunningFor":"About an hour ago", + "Size":"3B (virtual 293MB)", + "State":"running", + "Status":"Up About an hour" + } + ] + '500': + description: Internal Server Error + examples: + application/json: { "msg": "file/path not found!", "status": "error" } + """ + try: + return jsonify( + get_running_modules_details() + ), 200 + except Exception as e: + print(e) + abort(500) + + @app.route("/docs-configuration") def spec(): """ diff --git a/api/utility.py b/api/utility.py index 68106431..752126d6 100644 --- a/api/utility.py +++ b/api/utility.py @@ -1,8 +1,10 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - +import json import os +from core.get_modules import load_all_modules_docker_names + def msg_structure(status="", msg=""): """ @@ -232,3 +234,23 @@ def aggregate_function(data_connection, agr_query): allowDiskUse=True ) ) + + +def get_running_modules_details(): + """ + Get all running modules details + Returns: + list of details of running modules + + """ + module_details = [] + delimiter = "}" + data = os.popen("docker ps --format '{{json .}}'").read().replace("\n", "").split(delimiter) + if len(data) > 1 and data[-1] == "": + data = data[:-1] + for str_module_data in data: + module_data = json.loads(str_module_data + delimiter) + if module_data["Names"] in load_all_modules_docker_names(): + module_details.append(module_data) + + return module_details diff --git a/core/get_modules.py b/core/get_modules.py index 83cc9922..08e5023a 100644 --- a/core/get_modules.py +++ b/core/get_modules.py @@ -77,3 +77,30 @@ def load_all_modules(): else: warn(messages["module_not_available"].format(module_name)) return module_names + + +def load_all_modules_docker_names(): + """ + load all available modules names + + Returns: + an array of all module names used while creating docker containers + """ + module_names = [] + module_basepath = os.path.dirname(inspect.getfile(modules)) + path_pattern = module_basepath + '/*/*/__init__.py' + + for module in glob(path_pattern): + + module_dir = os.path.split(module)[0] + sub_module_name = os.path.split(module_dir)[1] + category_name = os.path.split(os.path.split(module_dir)[0])[1] + module_name = category_name + '/' + sub_module_name + dockerfile_path = os.path.join(module_dir, "Dockerfile") + + if os.path.exists(dockerfile_path): + if module_name not in module_names: + module_names.append('ohp_' + category_name + 'server_' + sub_module_name) + else: + warn(messages["module_not_available"].format(module_name)) + return module_names From a2ec02d969aa1c75b698b8cba5239eb587db4c25 Mon Sep 17 00:00:00 2001 From: mrigankanand Date: Mon, 8 Aug 2022 15:43:28 +0530 Subject: [PATCH 2/4] UI for running modules --- api/server.py | 3 +- api/utility.py | 2 ++ core/compatible.py | 3 +- lib/messages/de_DE.yaml | 6 +++- lib/messages/en_US.yaml | 4 +++ lib/messages/es_ES.yaml | 6 +++- lib/messages/fr_FR.yaml | 6 +++- lib/messages/ru_RU.yaml | 6 +++- web/static/css/style.css | 9 +++++- web/static/index.html | 12 ++++++++ web/static/js/explore.js | 12 ++++++++ web/static/js/modules.js | 63 ++++++++++++++++++++++++++++++++++++++++ 12 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 web/static/js/modules.js diff --git a/api/server.py b/api/server.py index ce78a537..5381102e 100644 --- a/api/server.py +++ b/api/server.py @@ -683,8 +683,7 @@ def all_running_module_details(): return jsonify( get_running_modules_details() ), 200 - except Exception as e: - print(e) + except Exception: abort(500) diff --git a/api/utility.py b/api/utility.py index 752126d6..a57438d8 100644 --- a/api/utility.py +++ b/api/utility.py @@ -248,6 +248,8 @@ def get_running_modules_details(): data = os.popen("docker ps --format '{{json .}}'").read().replace("\n", "").split(delimiter) if len(data) > 1 and data[-1] == "": data = data[:-1] + else: + data = [] for str_module_data in data: module_data = json.loads(str_module_data + delimiter) if module_data["Names"] in load_all_modules_docker_names(): diff --git a/core/compatible.py b/core/compatible.py index 91602e95..ee0cd0e1 100644 --- a/core/compatible.py +++ b/core/compatible.py @@ -70,7 +70,8 @@ def check_for_requirements(start_api_server): http_auth=api_config["api_database_http_auth"] ) connection.indices.get_alias("*") - except Exception: + except Exception as e: + print(e) exit_failure(messages["elasticsearch_not_found"]) # check if its honeypot server not api server if not start_api_server: diff --git a/lib/messages/de_DE.yaml b/lib/messages/de_DE.yaml index 998c61c5..e990785a 100644 --- a/lib/messages/de_DE.yaml +++ b/lib/messages/de_DE.yaml @@ -82,4 +82,8 @@ received_network_event: 'Empfangenes Netzwerkereignis, ip_dest:{0}, port_dest:{1 received_honeypot_credential_event: 'Empfangenes Honeypot-Anmeldedatenereignis, ip_dest:{0}, username:{1}, password:{2}, module_name:{3}, machine_name:{4}' received_honeypot_file_change_event: 'Empfangenes Honeypot-Dateiänderungsereignis, file_path:{0}, status:{1}, module_name:{2}, module_name:{3}, machine_name:{3}' received_honeypot_data_event: 'Empfangenes Honeypot-Datenereignis, ip_dest:{0}, module_name:{1}, machine_name:{2}, data:{3}' -received_network_traffic_file: 'Empfangene Netzwerkdatenverkehrsdatei:{0}, Datum:{1}. Einfügen in das Dateiarchiv' \ No newline at end of file +received_network_traffic_file: 'Empfangene Netzwerkdatenverkehrsdatei:{0}, Datum:{1}. Einfügen in das Dateiarchiv' +running_module: Laufende Module +running_modules_message: Details zu laufenden Modulen (Netzwerkerfassungsprozess) +no_modules_running_message: Derzeit laufen keine Module +modules_api_error_message: Beim Laden laufender Module ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut. \ No newline at end of file diff --git a/lib/messages/en_US.yaml b/lib/messages/en_US.yaml index 1a8ef44e..52dd1e02 100644 --- a/lib/messages/en_US.yaml +++ b/lib/messages/en_US.yaml @@ -83,3 +83,7 @@ received_honeypot_credential_event: 'Received honeypot credential event, ip_dest received_honeypot_file_change_event: 'Received honeypot file change event, file_path:{0}, status:{1}, module_name:{2}, module_name:{3}, machine_name:{3}' received_honeypot_data_event: 'Received honeypot data event, ip_dest:{0}, module_name:{1}, machine_name:{2}, data:{3}' received_network_traffic_file: 'Received network traffic file:{0}, date:{1}. Inserting it in the File Archive' +running_module: Running Modules +running_modules_message: Details of Running Modules (Network Capture Process) +no_modules_running_message: No modules are running currently +modules_api_error_message: There is some error while loading running modules. Please try again later. \ No newline at end of file diff --git a/lib/messages/es_ES.yaml b/lib/messages/es_ES.yaml index 5b6e6a47..eb0eee88 100644 --- a/lib/messages/es_ES.yaml +++ b/lib/messages/es_ES.yaml @@ -82,4 +82,8 @@ received_network_event: 'Evento de red recibido, ip_dest: {0}, port_dest: {1}, i received_honeypot_credential_event: 'Recibido evento de credencial de honeypot, ip_dest:{0}, username:{1}, password:{2}, module_name:{3}, machine_name:{4}' received_honeypot_file_change_event: 'Recibido evento de cambio de archivo honeypot, file_path:{0}, status:{1}, module_name:{2}, module_name:{3}, machine_name:{3}' received_honeypot_data_event: 'Recibido evento de datos de honeypot, ip_dest:{0}, module_name:{1}, machine_name:{2}, data:{3}' -received_network_traffic_file: 'Archivo de tráfico de red recibido: {0}, fecha: {1}. Insertarlo en el archivo de archivos' \ No newline at end of file +received_network_traffic_file: 'Archivo de tráfico de red recibido: {0}, fecha: {1}. Insertarlo en el archivo de archivos' +running_module: Módulos en ejecución +running_modules_message: Detalles de los módulos en ejecución (proceso de captura de red) +no_modules_running_message: No hay módulos en ejecución actualmente +modules_api_error_message: Hay algún error al cargar módulos en ejecución. Por favor, inténtelo de nuevo más tarde. \ No newline at end of file diff --git a/lib/messages/fr_FR.yaml b/lib/messages/fr_FR.yaml index f553ed77..939edf50 100644 --- a/lib/messages/fr_FR.yaml +++ b/lib/messages/fr_FR.yaml @@ -82,4 +82,8 @@ received_network_event: 'Événement réseau reçu, ip_dest:{0}, port_dest:{1}, received_honeypot_credential_event: "Événement d'identification Honeypot reçu, ip_dest:{0}, username:{1}, password:{2}, module_name:{3}, machine_name:{4}" received_honeypot_file_change_event: 'Événement de changement de fichier Honeypot reçu, file_path:{0}, status:{1}, module_name:{2}, module_name:{3}, machine_name:{3}' received_honeypot_data_event: 'Événement de données de pot de miel reçu, ip_dest:{0}, module_name:{1}, machine_name:{2}, data:{3}' -received_network_traffic_file: "Fichier de trafic réseau reçu :{0}, date :{1}. L'insérer dans l'archive de fichiers" \ No newline at end of file +received_network_traffic_file: "Fichier de trafic réseau reçu :{0}, date :{1}. L'insérer dans l'archive de fichiers" +running_module: Modules en cours d'exécution +running_modules_message: Détails des modules en cours d'exécution (processus de capture réseau) +no_modules_running_message: Aucun module n'est en cours d'exécution actuellement +modules_api_error_message: Il y a une erreur lors du chargement des modules en cours d'exécution. Veuillez réessayer plus tard. \ No newline at end of file diff --git a/lib/messages/ru_RU.yaml b/lib/messages/ru_RU.yaml index 23646d1b..240ac43e 100644 --- a/lib/messages/ru_RU.yaml +++ b/lib/messages/ru_RU.yaml @@ -82,4 +82,8 @@ received_network_event: 'Получено сетевое событие, ip_dest received_honeypot_credential_event: 'Получено событие учетных данных Honeypot, ip_dest:{0}, username:{1}, password:{2}, module_name:{3}, machine_name:{4}' received_honeypot_file_change_event: 'Получено событие изменения файла Honeypot, file_path:{0}, status:{1}, module_name:{2}, module_name:{3}, machine_name:{3}' received_honeypot_data_event: 'Получено событие данных HoneyPot, ip_dest:{0}, module_name:{1}, machine_name:{2}, data:{3}' -received_network_traffic_file: 'Получен файл сетевого трафика: {0}, дата: {1}. Вставка в файловый архив' \ No newline at end of file +received_network_traffic_file: 'Получен файл сетевого трафика: {0}, дата: {1}. Вставка в файловый архив' +running_module: Запуск модулей +running_modules_message: Сведения о запущенных модулях (процесс захвата сети) +no_modules_running_message: В настоящее время ни один модуль не запущен +modules_api_error_message: Произошла ошибка при загрузке запущенных модулей. Пожалуйста, попробуйте позже. \ No newline at end of file diff --git a/web/static/css/style.css b/web/static/css/style.css index a334004c..d3b9fef9 100644 --- a/web/static/css/style.css +++ b/web/static/css/style.css @@ -37,7 +37,7 @@ body { float: center; } -#error-message-element{ +#error-message-element, #error-message-element-modules { text-align: center; max-width: 80%; margin: 0 auto; @@ -201,4 +201,11 @@ blink { .button:hover { transform: scale(1.05); +} + +table, +th, +td { + border: 1px solid black; + border-collapse: collapse; } \ No newline at end of file diff --git a/web/static/index.html b/web/static/index.html index 63c16b2f..9f9c1f95 100644 --- a/web/static/index.html +++ b/web/static/index.html @@ -25,6 +25,7 @@ + @@ -44,6 +45,10 @@ + @@ -161,6 +166,13 @@ + +

{{ data.running_modules_message }}

+ -
- - - - -
- - - SECUREVIEW
- - OWASP Honeypot - - GitHub - -
- - - - - -
- + +

{{ data.export_module_heading }}

+
+ + + + + + +
+ + + + + + + + + + +
+ \ No newline at end of file diff --git a/web/static/js/explore.js b/web/static/js/explore.js index 68be2800..a27f8534 100644 --- a/web/static/js/explore.js +++ b/web/static/js/explore.js @@ -655,6 +655,11 @@ function displayErrorMessage(message) { */ function displayErrorMessageForModules(message, html_element_id) { const errorMessageElement = document.getElementById("error-message-element-modules"); + document.getElementById("download-module-report").hidden = true; + document.getElementById("download-module-report-csv").hidden = true; + document.getElementById("download-module-report-json").hidden = true; + document.getElementById("download-module-report-excel").hidden = true; + document.getElementById("export_module_heading").hidden = true; document.getElementById(html_element_id).hidden = true; errorMessageElement.innerText = message; errorMessageElement.hidden = false; diff --git a/web/static/js/modules.js b/web/static/js/modules.js index d805240a..2df89309 100644 --- a/web/static/js/modules.js +++ b/web/static/js/modules.js @@ -8,7 +8,6 @@ function get_running_modules_details(html_element_id) { type: "GET", url: "/api/core/running/modules", success: function (result, status, xhr) { - console.log(result) let module_data = `\n` + ` S.No\n` + ` Image\n` + @@ -18,7 +17,7 @@ function get_running_modules_details(html_element_id) { ` Size\n` + ` State\n` + ` Status\n` + - ` CreatedAt \n` + + ` CreatedAt \n` + ` `; if (result.length === 0) { displayErrorMessageForModules(translations.no_modules_running_message, html_element_id); @@ -39,6 +38,11 @@ function get_running_modules_details(html_element_id) { document.getElementById("error-message-element-modules").hidden = true; document.getElementById(html_element_id).hidden = false; document.getElementById(html_element_id).innerHTML = module_data; + document.getElementById("download-module-report").hidden = false; + document.getElementById("download-module-report-csv").hidden = false; + document.getElementById("download-module-report-json").hidden = false; + document.getElementById("download-module-report-excel").hidden = false; + document.getElementById("export_module_heading").hidden = false; } }, error: function (jqXHR, textStatus, errorThrown) { @@ -47,6 +51,100 @@ function get_running_modules_details(html_element_id) { }); } +function download_module_report_as_pdf(html_element_id) { + let modules_window = window.open('', 'PRINT', 'height=650,width=900,top=100,left=150'); + + modules_window.document.write(`Running module details`); + modules_window.document.write(``); + modules_window.document.write(''); + modules_window.document.write('
'); + modules_window.document.write(document.getElementById(html_element_id).innerHTML); + modules_window.document.write('
'); + modules_window.document.write(''); + + modules_window.document.close(); + modules_window.focus(); + + modules_window.print(); + modules_window.close(); + +} + +function download_module_report_as_csv() { + let filename = "running_module_details.csv" + let csv = []; + let rows = document.querySelectorAll("table tr"); + + for (let i = 0; i < rows.length; i++) { + let row = [], cols = rows[i].querySelectorAll("td, th"); + + for (let j = 0; j < cols.length; j++) + row.push(cols[j].innerText); + + csv.push(row.join(",")); + } + csv = csv.join("\n") + + let csvFile; + let downloadLink; + csvFile = new Blob([csv], {type: "text/csv"}); + downloadLink = document.createElement("a"); + downloadLink.download = filename; + downloadLink.href = window.URL.createObjectURL(csvFile); + downloadLink.style.display = "none"; + document.body.appendChild(downloadLink); + downloadLink.click(); +} + + +function download_module_report_as_json(html_element_id) { + let data = get_json_from_table(html_element_id); + const filename = "running_module_details.json" + const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(data, undefined, 2)); + const downloadAnchorNode = document.createElement('a'); + downloadAnchorNode.setAttribute("href", dataStr); + downloadAnchorNode.setAttribute("download", filename); + document.body.appendChild(downloadAnchorNode); + downloadAnchorNode.click(); +} + +function download_module_report_as_excel(html_element_id) { + let data = get_json_from_table(html_element_id); + const filename = "running_module_details.xlsx" + let ws = XLSX.utils.json_to_sheet(data); + let wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, "running_module_details"); + XLSX.writeFile(wb, filename); +} + +function get_json_from_table(html_element_id) { + let table = document.getElementById(html_element_id); + let data = []; + let columns = []; + for (let i = 0; i < table.rows.length; i++) { + let tableRow = table.rows[i]; + for (let j = 0; j < tableRow.cells.length; j++) { + columns.push(tableRow.cells[j].innerHTML); + } + } + for (let i = 1; i < table.rows.length; i++) { + let tableRow = table.rows[i]; + let rowData = {}; + for (let j = 0; j < tableRow.cells.length; j++) { + rowData[columns[j]] = (tableRow.cells[j].innerHTML); + } + data.push(rowData); + } + + return data; +} function update_modules() { setTimeout(function () { From ab50e4ffdf170d31adb083dae898cf190a7528ce Mon Sep 17 00:00:00 2001 From: mrigankanand Date: Wed, 10 Aug 2022 10:02:35 +0530 Subject: [PATCH 4/4] fix HTML code --- web/static/index.html | 57 +++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/web/static/index.html b/web/static/index.html index de8c1cf9..8c664aab 100644 --- a/web/static/index.html +++ b/web/static/index.html @@ -165,6 +165,14 @@ + \ No newline at end of file