{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Investigate Web Application Firewall (WAF) Data
\n", "\n", "**Author:** Vani Asawa
\n", "**Date:** December 2020
\n", "**Notebook Version:** 1.0
\n", "**Python Version:** Python 3.6
\n", "**Required Packages:** msticpy, pandas, kqlmagic
\n", "**Data Sources Required:** WAF data (AzureDiagnostics)
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is the purpose of this Notebook?\n", "\n", "Web Application Firewall (WAF) data records the monitored and blocked HTTP traffic to and from a web service. \n", "Due to the large magnitudes of HTTP requests made to such services in any workspace, the data tends to be incredibly noisy, and hence may prevent an analyst from determining if there are any bad requests made to the servers, which could result in a potentially malicious attack.\n", "\n", "\n", "This notebook analyses the blocked WAF Alerts and aim to surface any unusual HTTP requests made by the client IPs to the servers, using a variety of statistical techniques applied on several features of the WAF data, such as the Rule ID of the triggering event, the HTTP status code returned to the client from the alerts, and the contents of the request URIs themselves\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview\n", "\n", "**[Distribution of WAF logs and blocked alerts over an extended time frame](#DistributionofWAF)**\n", "1. Set an extended time frame to visualise the distribution of the logs/alerts on a bar graph\n", "\n", "**[What is the distribution of WAF blocked alerts over Rule IDs, http-status codes, and client IP entities?](#DistOver_rID_http_ip)**\n", "1. Set a time frame (recommended: time period of interest, after analysing the distribution of alerts in the extended time frame)\n", "2. Pick a host entity to explore in further detail\n", "3. Set x and y axes from the variables above, and view the number of alerts over the designate time frame.\n", "\n", "**[Cluster the request URIs in WAF blocked alerts, based on TFIDF scores](#ClusterURIs)**\n", "\n", "*Term frequency-inverse document frequency (TFIDF)* score is a numerical statistic of how important a variable is to a document. The value of the statistic is directly proportional to the variable's frequency in the document, and inversely proportional to the number of documents that contain the variable. More information about TFIDF can be found [here](https://www.researchgate.net/publication/326425709_Text_Mining_Use_of_TF-IDF_to_Examine_the_Relevance_of_Words_to_Documents)\n", "\n", "In our analysis, the *variable* will be the 'split URIs' and 'rule IDs', while a single *document* is all the blocked alerts for a single client IP in the selected time frame. We will be assessing the relative importance of every single token of the split request URIs and the number of times a ruleID is triggered for our blocked alerts over multiple such 'documents'. We will be using these two sets of scores to cluster the request URIs, and obtain single/grouped sets of interesting (and potentially malicious) request URIs that were blocked by the WAF.\n", "\n", "1. Compute TFIDF scores based on the following 2 approaches:\n", " - Request URIs split on \"/\" against the client IP entities\n", " - Number of blocked alerts for every Rule ID against the client IP entities\n", "2. Visualising the TFIDF scores for both approaches\n", "3. Performing DBScan Clustering + PCA to obtain the clustered and outlier request URIs for both approaches\n", "4. KQL query to further examine the WAF logs and blocked alerts in the time frames with outlier request URIs**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using the Notebook\n", "\n", "**Prerequisites**\n", "\n", "- msticpy - install the latest using pip install --upgrade msticpy\n", "- pandas- install using pip install pandas\n", "- kqlmagic\n", "\n", "**Running the Notebook**\n", "\n", "The best way of using the notebook is as follows:\n", "\n", "1. Individually run all of the cells up to the start of Section 1:\n", " - Initialization and installation of libraries\n", " - Authenticating to the workspace\n", " - Setting notebook parameters\n", " \n", "2. Default paramenters will allow the entire notebook to run from Section I using the 'Run Selected Cell and All Below' option under the Run tab. However, for added value, run the cells sequentially in any given section. \n", " - At the beginning of each section, set the time parameters. It is recommended that the first and third section have a larger timeframe than the second and fourth sections.\n", " - Wait for the cell to finish running, before proceeding\n", " - Select the options from the widget boxes when displayed and proceed." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\r\n", "import os\r\n", "import sys\r\n", "from pathlib import Path\r\n", "from IPython.display import display, HTML\r\n", "\r\n", "REQ_PYTHON_VER=(3, 6)\r\n", "REQ_MSTICPY_VER=(1, 0, 0)\r\n", "REQ_MP_EXTRAS = [\"ml\", \"kql\"]\r\n", "\r\n", "update_nbcheck = (\r\n", " \"

\"\r\n", " \"Warning: we needed to update 'utils/nb_check.py'
\"\r\n", " \"Please restart the kernel and re-run this cell.\"\r\n", " \"

\"\r\n", ")\r\n", "\r\n", "display(HTML(\"

Starting Notebook setup...

\"))\r\n", "if Path(\"./utils/nb_check.py\").is_file():\r\n", " try:\r\n", " from utils.nb_check import check_versions\r\n", " except ImportError as err:\r\n", " %xmode Minimal\r\n", " !curl https://raw.githubusercontent.com/Azure/Azure-Sentinel-Notebooks/master/utils/nb_check.py > ./utils/nb_check.py 2>/dev/null\r\n", " display(HTML(update_nbcheck))\r\n", " if \"check_versions\" not in globals():\r\n", " raise ImportError(\"Old version of nb_check.py detected - see instructions below.\")\r\n", " %xmode Verbose\r\n", " check_versions(REQ_PYTHON_VER, REQ_MSTICPY_VER, REQ_MP_EXTRAS)\r\n", "\r\n", " \r\n", "# If not using Azure Notebooks, install msticpy with\r\n", "# !pip install msticpy\r\n", "from msticpy.nbtools import nbinit\r\n", "nbinit.init_notebook(\r\n", " namespace=globals(),\r\n", " additional_packages=[\"adjustText\", \"plotly\"]\r\n", ");\r\n", "\r\n", "from ipywidgets import widgets\r\n", "import plotly.graph_objects as go\r\n", "import plotly.express as px\r\n", "import re\r\n", "from sklearn.feature_extraction.text import TfidfVectorizer\r\n", "\r\n", "%matplotlib inline\r\n", "\r\n", "from sklearn.cluster import KMeans\r\n", "from sklearn import metrics\r\n", "from sklearn.cluster import DBSCAN\r\n", "from sklearn.decomposition import PCA\r\n", "from adjustText import adjust_text\r\n", "import itertools\r\n", "import ipaddress\r\n", "import traceback\r\n", "\r\n", "pd.set_option('display.max_rows', 100)\r\n", "pd.set_option('display.max_columns', 50)\r\n", "pd.set_option('display.max_colwidth', 40)\r\n", "pd.set_option('display.max_colwidth', None)\r\n", "\r\n", "layout = widgets.Layout(width=\"50%\", height=\"80px\")\r\n", "style = {\"description_width\": \"200px\"}\r\n", "\r\n", "class color:\r\n", " BOLD = '\\033[1m'\r\n", " END = '\\033[0m'" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "63fccc98a51a416099e1a34899300648", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='', description='Enter Tenant ID: ', layout=Layout(height='30px', width='50%'), placeholder='Enter …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "12b9e02ad30140f1b7694f5e337ce42d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='', description='Enter Workspace ID: ', layout=Layout(height='30px', width='50%'), placeholder='Ent…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# See if we have an Azure Sentinel Workspace defined in our config file.\n", "# If not, let the user specify Workspace and Tenant IDs\n", "\n", "ws_config = WorkspaceConfig()\n", "if not ws_config.config_loaded:\n", " ws_config.prompt_for_ws()\n", " \n", "qry_prov = QueryProvider(data_environment=\"AzureSentinel\")\n", "print(\"done\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Authenticate to Azure Sentinel workspace\n", "qry_prov.connect(ws_config)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Querying Function** : Accessing the results of the Kusto query as a pandas dataframe, and removing empty/null columns from the dataframe" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def showQuery(query):\n", " df = qry_prov.exec_query(query)\n", " trimDF(df)\n", " return df\n", "\n", "def trimDF(df):\n", " # Store names of columns with null values for all entries\n", " empty_null_cols = [col for col in df.columns if df[col].isnull().all()]\n", " \n", " # Store names of columns with empty string '' values for all entries\n", " empty_str_cols = []\n", " for col in df.columns:\n", " try:\n", " if ''.join(df[col].map(str)) == '':\n", " empty_str_cols = empty_str_cols + [col]\n", " except:\n", " continue\n", " \n", " df.drop(empty_null_cols + empty_str_cols, axis=1, inplace=True)\n", "\n", "binIntervals = ['1m', '5m', '10m', '15m', '30m', '1h', '12h', '1d', '5d', '10d']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Selecting a Host**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def queryHost(startTime, endTime):\n", " query = '''\n", " AzureDiagnostics\n", " | where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\n", " | where Category == \"ApplicationGatewayFirewallLog\"\n", " | where action_s == 'Blocked' or isempty(action_s)\n", " | summarize AlertCountPerHost = count() by hostname_s, bin(timeStamp_t, {binInterval})\n", " | render timechart\n", " '''.format(startTime = startTime, endTime = endTime, binInterval = '1h')\n", " return(query)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Auto determine masking bits for clubbing IPs**" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def maskBitsVal(uniqueIPLen):\n", " if uniqueIPLen > 150:\n", " return '/8'\n", " elif uniqueIPLen > 40:\n", " return '/16'\n", " elif uniqueIPLen > 15:\n", " return '/24'\n", " return '/32'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section I: Distribution of WAF logs and blocked alerts over an extended time frame \n", "\n", "Select an extended time frame to view the distribution of WAF logs and blocked alerts over all hosts." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "426477f005ae4eed88d9c63bf04b86d4", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HTML(value='

Set query time boundaries

')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f5a5edba3cb44e4e87cc9b0020934f8c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(DatePicker(value=datetime.date(2020, 12, 4), description='Origin Date'), Text(value='10:31:59.0…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "47bbfe58b9224650a8e1b2ed613e0f51", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(IntRangeSlider(value=(-15, 1), description='Time Range (day):', layout=Layout(width='80%'), max…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query_times_1 = nbwidgets.QueryTime(units='day', max_before=30, before=-15, max_after=-1)\n", "query_times_1.display()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "322d48b8b2eb4eda81da0bf6ef795a9c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Select(description='Choose logs/alerts: ', layout=Layout(height='80px', width='50%'), op…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "categories = ['ApplicationGatewayAccessLog', 'ApplicationGatewayFirewallLog']\r\n", "\r\n", "def viewLogs(category):\r\n", " log_alert_query = '''\r\n", " AzureDiagnostics\r\n", " | where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\r\n", " | where Category == \"{category}\"\r\n", " | where action_s == 'Blocked' or isempty(action_s)\r\n", " | summarize NoOfAlerts= count() by bin(timeStamp_t, {binInterval})\r\n", " | render timechart '''.format(startTime = query_times_1.start, endTime = query_times_1.end, category = category, binInterval = '1h')\r\n", "\r\n", " %kql -query log_alert_query\r\n", " \r\n", " rawDataQuery = \"\"\"\r\n", " AzureDiagnostics\r\n", " | where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\r\n", " | where Category == '{category}'\r\n", " | where action_s == 'Blocked' or isempty(action_s)\r\n", " | take 15\r\n", " \"\"\".format(startTime = query_times_1.start, endTime = query_times_1.end, category = category)\r\n", "\r\n", " display(showQuery(rawDataQuery).head(5))\r\n", "\r\n", "category = widgets.Select(options = categories, style = style, layout = layout, description = 'Choose logs/alerts: ')\r\n", "display(category) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "viewLogs(category = category.value)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section II: What is the distribution of blocked WAF alerts over Rule IDs, http-status codes, and client IP Entities? \n", "\n", "Select a time frame of interest to view the distribution of WAF blocked alerts over all hosts.\n", "\n", "*Recommended:* Analyse a shorter time frame than Section I for more detail" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9bd778a844094d1f8ebfa717fce038d8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HTML(value='

Set query time boundaries

')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fbc28001a1b9497fa32e839210a9f47b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(DatePicker(value=datetime.date(2020, 12, 4), description='Origin Date'), Text(value='10:32:15.6…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1802daf652fc4b358322321abc0c1e43", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(IntRangeSlider(value=(-10, 1), description='Time Range (day):', layout=Layout(width='80%'), max…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query_times_2 = nbwidgets.QueryTime(units='day', max_before=30, before=-10, max_after=-1)\n", "query_times_2.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Select a host entity\n", "\n", "The following host entity will be used for the remainder of this section" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", "

 * 8ecf8077-cf51-4820-aadd-14040956f35d@loganalytics

\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "line": { "color": "rgb(31, 118, 179)", "width": 1 }, "name": ":AlertCountPerHost", "opacity": 0.8, "type": "scatter", "x": [ "2020-11-04T11:00:00+00:00", "2020-11-04T12:00:00+00:00", "2020-11-04T13:00:00+00:00", "2020-11-04T17:00:00+00:00", "2020-11-04T18:00:00+00:00", "2020-11-04T22:00:00+00:00", "2020-11-05T02:00:00+00:00", "2020-11-05T08:00:00+00:00", "2020-11-05T10:00:00+00:00", "2020-11-05T11:00:00+00:00", "2020-11-05T14:00:00+00:00", "2020-11-05T21:00:00+00:00", "2020-11-06T01:00:00+00:00", "2020-11-06T03:00:00+00:00", "2020-11-06T05:00:00+00:00", "2020-11-06T06:00:00+00:00", "2020-11-06T09:00:00+00:00", "2020-11-06T11:00:00+00:00", "2020-11-06T12:00:00+00:00", "2020-11-06T13:00:00+00:00", "2020-11-06T21:00:00+00:00", "2020-11-06T22:00:00+00:00", "2020-11-06T23:00:00+00:00", "2020-11-07T05:00:00+00:00", "2020-11-07T06:00:00+00:00", "2020-11-07T07:00:00+00:00", "2020-11-07T11:00:00+00:00", "2020-11-07T12:00:00+00:00", "2020-11-07T15:00:00+00:00", "2020-11-07T20:00:00+00:00", "2020-11-07T21:00:00+00:00", "2020-11-07T23:00:00+00:00", "2020-11-08T01:00:00+00:00", "2020-11-08T02:00:00+00:00", "2020-11-08T03:00:00+00:00", "2020-11-08T06:00:00+00:00", "2020-11-08T07:00:00+00:00", "2020-11-08T11:00:00+00:00", "2020-11-08T12:00:00+00:00", "2020-11-08T13:00:00+00:00", "2020-11-08T14:00:00+00:00", "2020-11-08T17:00:00+00:00", "2020-11-08T21:00:00+00:00", "2020-11-09T01:00:00+00:00", "2020-11-09T03:00:00+00:00", "2020-11-09T05:00:00+00:00", "2020-11-09T06:00:00+00:00", "2020-11-09T08:00:00+00:00" ], "y": [ 2, null, null, null, null, null, null, null, null, 2, null, null, null, null, null, null, 2, 2, null, null, null, 2, null, null, null, null, 2, null, null, null, null, null, null, null, null, null, 2, 2, null, null, null, null, null, null, null, 2, null, null ] }, { "line": { "color": "rgb(254, 127, 14)", "width": 1 }, "name": "13.89.108.163:AlertCountPerHost", "opacity": 0.8, "type": "scatter", "x": [ "2020-11-04T11:00:00+00:00", "2020-11-04T12:00:00+00:00", "2020-11-04T13:00:00+00:00", "2020-11-04T17:00:00+00:00", "2020-11-04T18:00:00+00:00", "2020-11-04T22:00:00+00:00", "2020-11-05T02:00:00+00:00", "2020-11-05T08:00:00+00:00", "2020-11-05T10:00:00+00:00", "2020-11-05T11:00:00+00:00", "2020-11-05T14:00:00+00:00", "2020-11-05T21:00:00+00:00", "2020-11-06T01:00:00+00:00", "2020-11-06T03:00:00+00:00", "2020-11-06T05:00:00+00:00", "2020-11-06T06:00:00+00:00", "2020-11-06T09:00:00+00:00", "2020-11-06T11:00:00+00:00", "2020-11-06T12:00:00+00:00", "2020-11-06T13:00:00+00:00", "2020-11-06T21:00:00+00:00", "2020-11-06T22:00:00+00:00", "2020-11-06T23:00:00+00:00", "2020-11-07T05:00:00+00:00", "2020-11-07T06:00:00+00:00", "2020-11-07T07:00:00+00:00", "2020-11-07T11:00:00+00:00", "2020-11-07T12:00:00+00:00", "2020-11-07T15:00:00+00:00", "2020-11-07T20:00:00+00:00", "2020-11-07T21:00:00+00:00", "2020-11-07T23:00:00+00:00", "2020-11-08T01:00:00+00:00", "2020-11-08T02:00:00+00:00", "2020-11-08T03:00:00+00:00", "2020-11-08T06:00:00+00:00", "2020-11-08T07:00:00+00:00", "2020-11-08T11:00:00+00:00", "2020-11-08T12:00:00+00:00", "2020-11-08T13:00:00+00:00", "2020-11-08T14:00:00+00:00", "2020-11-08T17:00:00+00:00", "2020-11-08T21:00:00+00:00", "2020-11-09T01:00:00+00:00", "2020-11-09T03:00:00+00:00", "2020-11-09T05:00:00+00:00", "2020-11-09T06:00:00+00:00", "2020-11-09T08:00:00+00:00" ], "y": [ null, 4, 4, null, 4, null, 2, 4, 3, null, 4, 4, 8, 8, 4, 2, 2, 2, null, 4, 6, null, 1, 4, null, 6, null, 8, null, null, 4, 2, 2, null, 2, 4, 4, null, 1, 4, 1, null, 4, null, null, null, 4, 4 ] }, { "line": { "color": "rgb(44, 160, 44)", "width": 1 }, "name": "13.89.108.163:80:AlertCountPerHost", "opacity": 0.8, "type": "scatter", "x": [ "2020-11-04T11:00:00+00:00", "2020-11-04T12:00:00+00:00", "2020-11-04T13:00:00+00:00", "2020-11-04T17:00:00+00:00", "2020-11-04T18:00:00+00:00", "2020-11-04T22:00:00+00:00", "2020-11-05T02:00:00+00:00", "2020-11-05T08:00:00+00:00", "2020-11-05T10:00:00+00:00", "2020-11-05T11:00:00+00:00", "2020-11-05T14:00:00+00:00", "2020-11-05T21:00:00+00:00", "2020-11-06T01:00:00+00:00", "2020-11-06T03:00:00+00:00", "2020-11-06T05:00:00+00:00", "2020-11-06T06:00:00+00:00", "2020-11-06T09:00:00+00:00", "2020-11-06T11:00:00+00:00", "2020-11-06T12:00:00+00:00", "2020-11-06T13:00:00+00:00", "2020-11-06T21:00:00+00:00", "2020-11-06T22:00:00+00:00", "2020-11-06T23:00:00+00:00", "2020-11-07T05:00:00+00:00", "2020-11-07T06:00:00+00:00", "2020-11-07T07:00:00+00:00", "2020-11-07T11:00:00+00:00", "2020-11-07T12:00:00+00:00", "2020-11-07T15:00:00+00:00", "2020-11-07T20:00:00+00:00", "2020-11-07T21:00:00+00:00", "2020-11-07T23:00:00+00:00", "2020-11-08T01:00:00+00:00", "2020-11-08T02:00:00+00:00", "2020-11-08T03:00:00+00:00", "2020-11-08T06:00:00+00:00", "2020-11-08T07:00:00+00:00", "2020-11-08T11:00:00+00:00", "2020-11-08T12:00:00+00:00", "2020-11-08T13:00:00+00:00", "2020-11-08T14:00:00+00:00", "2020-11-08T17:00:00+00:00", "2020-11-08T21:00:00+00:00", "2020-11-09T01:00:00+00:00", "2020-11-09T03:00:00+00:00", "2020-11-09T05:00:00+00:00", "2020-11-09T06:00:00+00:00", "2020-11-09T08:00:00+00:00" ], "y": [ null, null, null, 8, null, 2, null, null, 8, null, 8, null, 1, 1, null, null, null, null, 8, null, null, null, null, null, 11, null, null, 1, 8, null, null, null, null, 10, null, null, null, 1, null, null, null, 8, null, null, 8, null, null, null ] }, { "line": { "color": "rgb(214, 39, 39)", "width": 1 }, "name": ":AlertCountPerHost", "opacity": 0.8, "type": "scatter", "x": [ "2020-11-04T11:00:00+00:00", "2020-11-04T12:00:00+00:00", "2020-11-04T13:00:00+00:00", "2020-11-04T17:00:00+00:00", "2020-11-04T18:00:00+00:00", "2020-11-04T22:00:00+00:00", "2020-11-05T02:00:00+00:00", "2020-11-05T08:00:00+00:00", "2020-11-05T10:00:00+00:00", "2020-11-05T11:00:00+00:00", "2020-11-05T14:00:00+00:00", "2020-11-05T21:00:00+00:00", "2020-11-06T01:00:00+00:00", "2020-11-06T03:00:00+00:00", "2020-11-06T05:00:00+00:00", "2020-11-06T06:00:00+00:00", "2020-11-06T09:00:00+00:00", "2020-11-06T11:00:00+00:00", "2020-11-06T12:00:00+00:00", "2020-11-06T13:00:00+00:00", "2020-11-06T21:00:00+00:00", "2020-11-06T22:00:00+00:00", "2020-11-06T23:00:00+00:00", "2020-11-07T05:00:00+00:00", "2020-11-07T06:00:00+00:00", "2020-11-07T07:00:00+00:00", "2020-11-07T11:00:00+00:00", "2020-11-07T12:00:00+00:00", "2020-11-07T15:00:00+00:00", "2020-11-07T20:00:00+00:00", "2020-11-07T21:00:00+00:00", "2020-11-07T23:00:00+00:00", "2020-11-08T01:00:00+00:00", "2020-11-08T02:00:00+00:00", "2020-11-08T03:00:00+00:00", "2020-11-08T06:00:00+00:00", "2020-11-08T07:00:00+00:00", "2020-11-08T11:00:00+00:00", "2020-11-08T12:00:00+00:00", "2020-11-08T13:00:00+00:00", "2020-11-08T14:00:00+00:00", "2020-11-08T17:00:00+00:00", "2020-11-08T21:00:00+00:00", "2020-11-09T01:00:00+00:00", "2020-11-09T03:00:00+00:00", "2020-11-09T05:00:00+00:00", "2020-11-09T06:00:00+00:00", "2020-11-09T08:00:00+00:00" ], "y": [ null, null, null, null, 1, null, null, null, null, null, null, null, 1, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1, null, null, null, null, null, null, null, null, null, null, 1, null, null, null, null ] }, { "line": { "color": "rgb(147, 102, 189)", "width": 1 }, "name": "127.0.0.1:AlertCountPerHost", "opacity": 0.8, "type": "scatter", "x": [ "2020-11-04T11:00:00+00:00", "2020-11-04T12:00:00+00:00", "2020-11-04T13:00:00+00:00", "2020-11-04T17:00:00+00:00", "2020-11-04T18:00:00+00:00", "2020-11-04T22:00:00+00:00", "2020-11-05T02:00:00+00:00", "2020-11-05T08:00:00+00:00", "2020-11-05T10:00:00+00:00", "2020-11-05T11:00:00+00:00", "2020-11-05T14:00:00+00:00", "2020-11-05T21:00:00+00:00", "2020-11-06T01:00:00+00:00", "2020-11-06T03:00:00+00:00", "2020-11-06T05:00:00+00:00", "2020-11-06T06:00:00+00:00", "2020-11-06T09:00:00+00:00", "2020-11-06T11:00:00+00:00", "2020-11-06T12:00:00+00:00", "2020-11-06T13:00:00+00:00", "2020-11-06T21:00:00+00:00", "2020-11-06T22:00:00+00:00", "2020-11-06T23:00:00+00:00", "2020-11-07T05:00:00+00:00", "2020-11-07T06:00:00+00:00", "2020-11-07T07:00:00+00:00", "2020-11-07T11:00:00+00:00", "2020-11-07T12:00:00+00:00", "2020-11-07T15:00:00+00:00", "2020-11-07T20:00:00+00:00", "2020-11-07T21:00:00+00:00", "2020-11-07T23:00:00+00:00", "2020-11-08T01:00:00+00:00", "2020-11-08T02:00:00+00:00", "2020-11-08T03:00:00+00:00", "2020-11-08T06:00:00+00:00", "2020-11-08T07:00:00+00:00", "2020-11-08T11:00:00+00:00", "2020-11-08T12:00:00+00:00", "2020-11-08T13:00:00+00:00", "2020-11-08T14:00:00+00:00", "2020-11-08T17:00:00+00:00", "2020-11-08T21:00:00+00:00", "2020-11-09T01:00:00+00:00", "2020-11-09T03:00:00+00:00", "2020-11-09T05:00:00+00:00", "2020-11-09T06:00:00+00:00", "2020-11-09T08:00:00+00:00" ], "y": [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ] } ], "layout": { "autosize": true, "showlegend": true, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "timechart" }, "xaxis": { "autorange": true, "range": [ "2020-11-04 11:00", "2020-11-09 08:00" ], "title": { "text": "timeStamp_t" }, "type": "date" }, "yaxis": { "autorange": true, "range": [ 0.4444444444444444, 11.555555555555555 ], "ticksuffix": "", "title": { "text": "AlertCountPerHost" }, "type": "linear" } } }, "image/png": "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+tHPc06fXhYAq2B40bV3yqVfOkNUkKvndcqHJ5euC4bJUd/5q2veds0CmXjceG/x+nNx3vlbzSoHrWQKCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCFgTIPy1Rl9eOPguXh2SZhH+qsr6BPC69RvKJvKV+XNk5rQppc+FXee/Jmr4qwYMrlGFz1MmHSsLO5aVvQe40ph6UpWsctJKpoEAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIICAFQHCXyvsFEUAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQTSFSD8TdeT0RBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAErAoS/VtgpigACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCKQrQPibriejIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAlYECH+tsFMUAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQSFeA8DddT0ZDAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEErAgQ/lphpygCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQrgDhb7qejIYAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAghYESD8tcJOUQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCBdAcLfdD0ZDQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEELAiQPhrhZ2iCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQLoChL/pejIaAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggYEWA8NcKO0URQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBdAUIf9P1ZDQEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEDAigDhrxV2iiKAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALpChD+puvJaAgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggIAVAcJfK+wURQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAAB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KUgDAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEegoI/vYEdDoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSWQUDwdxlKQRoIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQU0Dwtyeg0wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILAMAoK/y1AK0kCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGeAoK/PQGdToAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWUQEPxdhlKQBgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPQUEPztCeh0AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQILIOA4O8ylII0ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoKeA4G9PQKcTIECAAAECBAgQINAs8PNfPFldv/+D1d637a5e8bKXjA++594vV8c+f391+6Ebq3POPmtQxnCvmw8f3XKPiy+8YHzvr3/zW9WRjxybS1pmldFJrrO6vusQIECAAAECBAgQIECAAAECqycg+Lt6ZSbFBAgQIECAAAECBFZKYNFByiMfO1Z9/RvfOi2wG35/ySsvGgWkBX9XqkpJLAECBAgQIECAAAECBAgQIDBBQPBX1SBAgAABAgQIECBAYDCBp576bfXuD3yiOn7fifE94orbL33lwerEA49U733nVaPPwnHhs4cefWx8/J4rdlVvef2rRyuHw+/Dz/v27akuv+ySLWkOgdyjdx8f/W77uduqjx5+R3X+C7ZXMfC8+7WXnnZOvMB3v3+yunbfrdXJx0+Nrxnuu/ea3VW+Yji9djg4Bo2vfP2rq73v+fCW+z/4yGPj1cbpKuNwULhuyPtrdr6qum7/kdF5+TFNhdLkOvQq6sEqiwsTIECAAAECBAgQIECAAAECvQUEf3sTugABAgQIECBAgAABAk0CTds+58Hfbzz87+PAbQzKhmvHYG743YFDH68O7n/rKLgbfkLgN/yEYG34CQHZAwfvHJ2z/dxnj4LKz3vutvHndWmdtPI3BGmff95zxttV51tVh/OuvOFQFYPFMT0hEJ3/Lk1jDCrnx/zox6dGwfAzznh6sVItekV1MYEOIECAAAECBAgQIECAAAECBOYuIPg7d3I3JECAAAECBAgQILBZAl2Cvzte/tLxCt24urXpdyEY/P47PlMdvOnq8XuD8/NigDaq162wbbvtc8jLgVvurN513RtGwee689r8Lq78TQO9dYHtppoi+LtZf0dyS4AAAQIECBAgQIAAAQIE2ggI/rZRcgwBAgQIECBAgAABAlMLDBn8zQO7aSLz7aHzrZLTLZybgr/pltLx+nfdtn/iu4KnDf52DeZ2PX7qAnQiAQIECBAgQIAAAQIECBAgsDICgr8rU1QSSoAAAQIECBAgQGA1BYYO/h75yLHq9kM3jlf+tlGKgeC4HXRdwDamO2z7HFfo5nlpE+gN6cmPq1v52zWY2/X4Ni6OIUCAAAECBAgQIECAAAECBFZbQPB3tctP6gkQIECAAAECBAgsvUAMtO5+7aXjd+eGRKcB0PD/8G7eabZ9zt8BnIKEAOnDj/5H9Sc7Lj7NKX1XcN320XW/GzL423Xb50muS18hJJAAAQIECBAgQIAAAQIECBAYTEDwdzBaFyZAgAABAgQIECBAIAjkq2yjyiyCv/HaP/jhT7as/g3XDit2X/TC86rr939w9O/0/bpxu+i4fXMIvF6779bq4IGrxwHqut/FLaBnve3zJKOmGjTNOWokAQIECBAgQIAAAQIECBAgsN4Cgr/rXb5yR4AAAQIECBAgQGApBGIg9eTjp6qLL7xgFKj90lcerE488MgoKBt+pln5GzOXv5c33uOcs8+q4mrdhx59bGyRvu83/jIEjG8+fHT03z1X7Kr2XrN7tF3zlTccGp935D1vr+767BeqvW/b3fudv/Fe8eLxnl0KrM415NkPAQIECBAgQIAAAQIECBAgsJkCgr+bWe5yTYAAAQIECBAgQIDAAgXq3vm7wOS4NQECBAgQIECAAAECBAgQILAmAoK/a1KQskGAAAECBAgQIECAwOoINAV/09W8k3K0a+eOLdtYr07OpZQAAQIECBAgQIAAAQIECBAYUkDwd0hd1yZAgAABAgQIECBAgECNgJW/qgUBAgQIECBAgAABAgQIECAwhIDg7xCqrkmAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE5Cwj+zhnc7QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCEgODvEKquSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTkLCP7OGdztCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMISA4O8Qqq5JgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBOQsI/s4Z3O0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwhIDg7xCqrkmAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE5Cwj+zhnc7QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCEgODvEKquSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTkLCP7OGdztCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMISA4O8Qqq5JgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBOQsI/s4Z3O0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwhIDg7xCqrkmAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE5Cwj+zhnc7QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCEgODvEKquSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTkLCP7OGdztCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMISA4O8Qqq5JgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBOQsI/s4Z3O0IECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAwhIDg7xCqrkmAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIE5Cwj+zhnc7QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDCEgODvEKquSYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTkL/B+SCZgruyGJDwAAAABJRU5ErkJggg==", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", "

Done (00:02.647): 60 records

\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Num_blocked_alerts
hostname_s
4
127.0.0.12
13.89.108.163120
13.89.108.163:8083
<undefined>18
\n", "
" ], "text/plain": [ " Num_blocked_alerts\n", "hostname_s \n", " 4\n", "127.0.0.1 2\n", "13.89.108.163 120\n", "13.89.108.163:80 83\n", " 18" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ff2504111c0743048ac34b02fc9893d8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Select(description='Select Host: ', index=4, layout=Layout(height='80px', width='50%'), options=('', '127.0.0.…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query = queryHost(query_times_2.start, query_times_2.end)\n", "%kql -query query\n", "\n", "try:\n", " df_host = showQuery(query)\n", " list_hosts = set([x for x in df_host['hostname_s']])\n", " df = df_host.groupby(['hostname_s']).agg({'AlertCountPerHost': sum}).rename(columns = {'AlertCountPerHost': 'Num_blocked_alerts'})\n", " hosts = widgets.Select(options=list_hosts, style = style, layout = layout, value=df['Num_blocked_alerts'].idxmax(), description = 'Select Host: ')\n", " display(df)\n", " display(hosts)\n", "except Exception as e:\n", " print('Error: ' + e)\n", " traceback.print_exc()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Render visualisations of the distribution of blocked alerts for the selected host\n", "\n", "We will be using balloon plots to visualise the number of WAF alerts over rule IDs, http-status codes, and client IP entities, for the selected host entity." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query_distribution = '''\n", "AzureDiagnostics\n", "| where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\n", "| where Category == \"ApplicationGatewayFirewallLog\"\n", "| where hostname_s == \"{host}\"\n", "| where action_s == 'Blocked' or isempty(action_s)\n", "| join kind=leftouter ( AzureDiagnostics\n", "| where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\n", "| where Category == \"ApplicationGatewayAccessLog\"\n", "| summarize by requestUri_s, httpStatus_d\n", ") on requestUri_s \n", "| summarize NoOfAlerts = count(), make_set(requestUri_s), DistinctURIs = dcount(requestUri_s) by clientIp_s, ruleId_s, httpStatus_d1\n", "'''.format(startTime = query_times_2.start, endTime = query_times_2.end, host = hosts.value)\n", "\n", "try:\n", " df_distribution = showQuery(query_distribution)\n", " df_distribution.rename(columns = {'clientIp_s':'Ip Address', 'ruleId_s':'Rule ID', 'set_requestUri_s': 'Request Uris'}, inplace = True)\n", "\n", " if 'httpStatus_d1' in df_distribution.columns:\n", " df_distribution = df_distribution.sort_values(by=['httpStatus_d1'], ascending = True).reset_index(drop = True)\n", " df_distribution.rename(columns = {'httpStatus_d1':'Http status'}, inplace = True) \n", " df_distribution['Http status'] = 'h: ' + df_distribution['Http status'].astype(str)\n", " \n", " maskBits = maskBitsVal(len(df_distribution['Ip Address'].unique()))\n", " df_distribution['Ip Address'] = df_distribution['Ip Address'].apply(lambda x: ipaddress.IPv4Network(x + maskBits, strict = False))\n", " \n", " df_distribution['Ip Address'], df_distribution['Rule ID'] = 'Ip ' + df_distribution['Ip Address'].astype(str), 'rID ' + df_distribution['Rule ID'].astype(str)\n", "except Exception as e:\n", " print('Error: ' + e)\n", " traceback.print_exc()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f4c2af97e438486589f06399bde71a4d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Select(description='Select x-axis: ', layout=Layout(height='80px', width='50%'), options…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options = ['Ip Address', 'Rule ID']\r\n", "if 'Http status' in df_distribution.columns:\r\n", " options += ['Http status']\r\n", "\r\n", "def viewBalloonPlot(x_axis, y_axis, display_rawResult):\r\n", " try: \r\n", " df_balloon_plot = (df_distribution\r\n", " .groupby([x_axis, y_axis], as_index=False)\r\n", " .agg({'NoOfAlerts': sum, 'DistinctURIs': sum, 'Request Uris': list})\r\n", " .reset_index(drop = True))\r\n", " fig = px.scatter(df_balloon_plot, x=df_balloon_plot[x_axis], y = df_balloon_plot[y_axis], \r\n", " size= np.log(1 + df_balloon_plot['NoOfAlerts'] ), color = 'NoOfAlerts',\r\n", " hover_data=['NoOfAlerts', 'DistinctURIs']) \r\n", "\r\n", " fig.update_layout(height = max(300, 30 * len(set(df_balloon_plot[y_axis]))), title_text='Alert Distribution for host ID '+ str(hosts.value))\r\n", "\r\n", " fig.show()\r\n", " if display_rawResult == 'Yes':\r\n", " print('Top 5 raw results with the highest number of alerts: \\n')\r\n", " df_balloon_plot['Request Uris'] = [np.unique(list(itertools.chain(*row['Request Uris']))) for index, row in df_balloon_plot.iterrows() ]\r\n", " df_balloon_plot['DistinctURIs'] = df_balloon_plot['Request Uris'].str.len()\r\n", " display(df_balloon_plot[[y_axis, x_axis, 'NoOfAlerts','Request Uris', 'DistinctURIs']].sort_values(by='NoOfAlerts', ascending = False).head(5))\r\n", " except ValueError:\r\n", " print('ValueError: Choose distinct x and y axes')\r\n", " except Exception as e:\r\n", " print('Error: ' + e)\r\n", " traceback.print_exc()\r\n", " \r\n", "\r\n", "x_axis = widgets.Select(options = options, style = style, layout = layout, description = 'Select x-axis: ')\r\n", "y_axis = widgets.Select(options = options, style = style, layout = layout, description = 'Select y-axis: ')\r\n", "display_rawResult = widgets.Select(options = ['Yes', 'No'], description = 'Display raw results: ')\r\n", "\r\n", "md(\"Select graph properties:\", \"bold\")\r\n", "display(x_axis)\r\n", "display(y_axis)\r\n", "display(display_rawResult)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "viewBalloonPlot, x_axis = x_axis.value, \r\n", " y_axis = y_axis.value, display_rawResult = display_rawResult.value)\r\n", "\r\n", "display(w)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Section III: Cluster the request URIs in blocked WAF Alerts, based on TFIDF scores \n", "\n", "Select the timeframe and host entity for this section of the notebook. \n", "\n", "*Recommended*: Set a timeframe of >20 days" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "240c8fd8dcc04798a556c911fe0fbabd", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HTML(value='

Set query time boundaries

')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "aed6e6a6719f4170a03d160ca7618b9a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(DatePicker(value=datetime.date(2020, 12, 4), description='Origin Date'), Text(value='10:32:42.8…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5c08089058604c4e9621bdd999e625a2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(IntRangeSlider(value=(-10, 1), description='Time Range (day):', layout=Layout(width='80%'), max…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query_times_3 = nbwidgets.QueryTime(units='day', max_before=30, before=10, max_after=-1)\n", "query_times_3.display()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Num_blocked_alerts
hostname_s
20
112.124.42.80:634351
123.125.114.1441
127.0.0.17
127.0.0.1:8011
13.89.108.16337341
13.89.108.163:80317
<undefined>86
\n", "
" ], "text/plain": [ " Num_blocked_alerts\n", "hostname_s \n", " 20\n", "112.124.42.80:63435 1\n", "123.125.114.144 1\n", "127.0.0.1 7\n", "127.0.0.1:80 11\n", "13.89.108.163 37341\n", "13.89.108.163:80 317\n", " 86" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7413032cfc1f4db69ccac877fbb6fd23", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Select(description='Select Host: ', index=6, options=('', '127.0.0.1', '13.89.108.163:80', '112.124.42.80:6343…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_host_2 = showQuery(queryHost(query_times_3.start, query_times_3.end))\n", "df = df_host_2.groupby(['hostname_s']).agg({'AlertCountPerHost': sum}).rename(columns = {'AlertCountPerHost': 'Num_blocked_alerts'})\n", "hosts_2 = widgets.Select(options=set([x for x in df_host_2['hostname_s']]), value=df['Num_blocked_alerts'].idxmax(), description = 'Select Host: ')\n", "display(df)\n", "display(hosts_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Enter min_df and max_df value parameters**\n", "\n", "*min_df*: The min_df variable is used to eliminate terms that do not appear very frequently in our data. A min_df value of 0.01 implies eliminating terms that apear in less than 1% of the data.\n", "\n", "*max_df*: The max_df variable eliminates terms that appear very frequently in our data. A max_df value of 0.9 implies eliminating terms that appear in more than 90% of the data.\n", "\n", "For more information about these parameters in the TFIDF vectorizer, please see [here](https://stackoverflow.com/questions/27697766/understanding-min-df-and-max-df-in-scikit-countvectorizer)\n", "\n", "\n", "**Note:** In the case of errors running the code below for the two approaches (Request URIs split on \"/\" against the client IP entities OR Number of blocked alerts for every Rule ID against the client IPs), run the TFIDF vectoriser for ALL the data \n", "\n", "If you would like to view the TFIDF scores for all the data, change the following code in the `tfidfScores` function:\n", "\n", "`vectorizer = TfidfVectorizer(tokenizer=identity_tokenizer, lowercase=False, min_df = min_df_value, max_df = max_df_value) `\n", "\n", "to\n", "\n", "`vectorizer = TfidfVectorizer(tokenizer=identity_tokenizer, lowercase=False) ` " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7d0ead1e93854831a2cb7e6eb8cc853b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='0.01', description='Enter min_df: ', layout=Layout(height='30px', width='50%'), placeholder='% or …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1854c018ece04802beb37f2fd8120fd0", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='0.9', description='Enter max_df: ', layout=Layout(height='30px', width='50%'), placeholder='% or I…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "min_df_widget = widgets.Text(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description = 'Enter min_df: ', placeholder = '% or Integer or None', value = '0.01')\n", "max_df_widget = widgets.Text(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description = 'Enter max_df: ', placeholder = '% or Integer or None', value = '0.9')\n", "\n", "display(min_df_widget)\n", "display(max_df_widget)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "try:\n", " min_df_value = float(min_df_widget.value)\n", " max_df_value = float(max_df_widget.value)\n", "except Exception as e:\n", " print('Error: ' + str(e))\n", " traceback.print_exc()\n", " \n", "def tfidfScores(df, tokenList = None):\n", " def identity_tokenizer(text):\n", " return text\n", " \n", " vectorizer = TfidfVectorizer(tokenizer=identity_tokenizer, lowercase=False, min_df = min_df_value, max_df = max_df_value) \n", " vectors = vectorizer.fit_transform(tokenList)\n", " feature_names = vectorizer.get_feature_names()\n", " dense = vectors.todense()\n", " denselist = dense.tolist()\n", " df_scores = pd.DataFrame(denselist, columns = feature_names)\n", " multicol1 = pd.MultiIndex.from_tuples([('weight', str(j)) for j in df_scores.columns])\n", " df_multiIndex = pd.DataFrame([list(df_scores.iloc[i]) for i in range(0, len(df_scores))], index=[df['Ip Address']], columns=multicol1)\n", " return df_multiIndex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Approach I: Compute TFIDF scores for split request URIs in the blocked WAF Alerts against client IP entities" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
weight
!.php$DefaultNav${@die(md5(HelloThinkPHP))}%62%61%73%65%68%74%6D%6C%6F%66%66%69%63%65%73%65%72%76%6C%65%74%69%6D%69%73%70%69%72%69%74%70%6F%73%74%2E%70%68%70%72%65%67%69%73%74%65%72?%65%6c%65%6d%65%6e%74%5f%70%61%72%65%6e%74%73=%74%69%6d%65%7a%6f%6e%65%2f%74%69%6d%65%7a%6f%6e%65%2f%23%76%61%6c%75%65\\u0026%61%6a%61%78%5f%66%6f%72%6d=1\\u0026%5f%77%72%61%70%70%65%72%5f%66%6f%72%6d%61%74=%64%72%75%70%61%6c%5f%61%6a%61%78%73%65%65%79%6F%6E%75%70%6C%6F%61%64%2E%70%68%70%75%73%65%72%75%73%65%72%2e%70%68%70-.bzr.bzrignore.config.php.env.git.git.php.gitignore.hg.hgignore.htaccess.htaccess.svn-base...zencartzhk.phpzhui.phpzikulazipzipfileszmp.phpzp-corezshmindex.phpzuo.phpzuoindex.phpzuos.phpzuoshou.phpzuoshss.phpzuoss.phpzxc.phpzxc0.phpzxc1.phpzxc2.phpzxy.phpzyc.phpzz.phpzza.phpzzk.phpzzz.php
Ip Address
20.51.0.0/160.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
45.249.0.0/160.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
20.57.0.0/160.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
20.51.0.0/160.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
91.241.0.0/160.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
\n", "

5 rows × 2737 columns

\n", "
" ], "text/plain": [ " weight \\\n", " !.php $DefaultNav ${@die(md5(HelloThinkPHP))} %62%61%73%65 \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 0.0 \n", "\n", " \\\n", " %68%74%6D%6C%6F%66%66%69%63%65%73%65%72%76%6C%65%74 %69%6D \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 \n", "\n", " \\\n", " %69%73%70%69%72%69%74 %70%6F%73%74%2E%70%68%70 \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 \n", "\n", " \\\n", " %72%65%67%69%73%74%65%72?%65%6c%65%6d%65%6e%74%5f%70%61%72%65%6e%74%73=%74%69%6d%65%7a%6f%6e%65%2f%74%69%6d%65%7a%6f%6e%65%2f%23%76%61%6c%75%65\\u0026%61%6a%61%78%5f%66%6f%72%6d=1\\u0026%5f%77%72%61%70%70%65%72%5f%66%6f%72%6d%61%74=%64%72%75%70%61%6c%5f%61%6a%61%78 \n", "Ip Address \n", "20.51.0.0/16 0.0 \n", "45.249.0.0/16 0.0 \n", "20.57.0.0/16 0.0 \n", "20.51.0.0/16 0.0 \n", "91.241.0.0/16 0.0 \n", "\n", " \\\n", " %73%65%65%79%6F%6E %75%70%6C%6F%61%64%2E%70%68%70 %75%73%65%72 \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 \n", "\n", " \\\n", " %75%73%65%72%2e%70%68%70 - .bzr .bzrignore .config.php .env \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", " \\\n", " .git .git.php .gitignore .hg .hgignore .htaccess \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", " ... \\\n", " .htaccess.svn-base ... zencart zhk.php zhui.php zikula zip \n", "Ip Address ... \n", "20.51.0.0/16 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n", "\n", " \\\n", " zipfiles zmp.php zp-core zshmindex.php zuo.php zuoindex.php \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", " \\\n", " zuos.php zuoshou.php zuoshss.php zuoss.php zxc.php zxc0.php \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", " \n", " zxc1.php zxc2.php zxy.php zyc.php zz.php zza.php zzk.php zzz.php \n", "Ip Address \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "45.249.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.57.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "20.51.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "91.241.0.0/16 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", "[5 rows x 2737 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query_URIs = '''\n", "AzureDiagnostics\n", "| where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\n", "| where Category == \"ApplicationGatewayFirewallLog\"\n", "| where hostname_s startswith \"{host}\"\n", "| where action_s == 'Blocked' or isempty(action_s)\n", "| distinct clientIp_s, requestUri_s\n", "| summarize make_list(requestUri_s) by clientIp_s\n", "'''.format(startTime = query_times_3.start, endTime = query_times_3.end, host = hosts_2.value)\n", "\n", "try:\n", " df_URIs = showQuery(query_URIs)\n", " df_URIs.rename(columns = {'clientIp_s':'Ip Address', 'list_requestUri_s': 'RequestUris'}, inplace = True) \n", "\n", " viewData_splitUri = df_URIs.copy()\n", " maskBits = maskBitsVal(len(viewData_splitUri['Ip Address'].unique()))\n", " viewData_splitUri['Ip Address'] = viewData_splitUri['Ip Address'].apply(lambda x: ipaddress.IPv4Network(x + maskBits, strict = False))\n", " viewData_splitUri.groupby([\"Ip Address\"], as_index=False).agg({'RequestUris': list})\n", "\n", " tokenList = []\n", " for index, row in viewData_splitUri.iterrows():\n", " splitUris = re.split('/', ''.join(row['RequestUris']))\n", " tokenList = tokenList + [splitUris] \n", "\n", " df_splitUri_tfidf = tfidfScores(viewData_splitUri, tokenList)\n", "except Exception as e:\n", " print('Error: ' + str(e))\n", " traceback.print_exc()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Approach II: Computer TFIDF scores for volume of blocked WAF alerts for Rule Ids against the client IP entities" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
weight
949110980130BlockGeoLocationChinaBlockInternetExplorer11
Ip Address
3.16.0.0/160.7071070.7071070.00.0
3.236.0.0/160.7071070.7071070.00.0
13.65.0.0/160.7071070.7071070.00.0
13.68.0.0/160.7071070.7071070.00.0
13.84.0.0/160.7071070.7071070.00.0
\n", "
" ], "text/plain": [ " weight \n", " 949110 980130 BlockGeoLocationChina BlockInternetExplorer11\n", "Ip Address \n", "3.16.0.0/16 0.707107 0.707107 0.0 0.0\n", "3.236.0.0/16 0.707107 0.707107 0.0 0.0\n", "13.65.0.0/16 0.707107 0.707107 0.0 0.0\n", "13.68.0.0/16 0.707107 0.707107 0.0 0.0\n", "13.84.0.0/16 0.707107 0.707107 0.0 0.0" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "query_RuleIds = '''\n", "AzureDiagnostics\n", "| where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\n", "| where Category == \"ApplicationGatewayFirewallLog\"\n", "| where hostname_s startswith \"{host}\"\n", "| where action_s == 'Blocked'\n", "| summarize alertCount = count(), make_set(requestUri_s) by clientIp_s, ruleId_s\n", "'''.format(startTime = query_times_3.start, endTime = query_times_3.end, host = hosts_2.value)\n", "\n", "try:\n", " dfPrac = showQuery(query_RuleIds)\n", " df_RuleIds = showQuery(query_RuleIds)\n", " df_RuleIds.rename(columns = {'clientIp_s':'Ip Address', 'ruleId_s':'RuleId', 'set_requestUri_s': 'RequestUris'}, inplace = True) \n", " \n", " maskBits = maskBitsVal(len(df_RuleIds['Ip Address'].unique()))\n", " df_RuleIds['Ip Address'] = df_RuleIds['Ip Address'].apply(lambda x: ipaddress.IPv4Network(x + maskBits, strict = False))\n", "\n", " viewData_ruleId = df_RuleIds.groupby([\"Ip Address\"], as_index=False).agg({'RuleId': list, 'alertCount': list, 'RequestUris': list})\n", " tokenList = [sum([[s] * n for s, n in zip(viewData_ruleId['RuleId'][x], viewData_ruleId['alertCount'][x])], []) for x in range(0, len(viewData_ruleId))]\n", "\n", " df_ruleId_tfidf = tfidfScores(viewData_ruleId, tokenList)\n", "except Exception as e:\n", " print('Error: ' + e)\n", " traceback.print_exc()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualisation of the TFIDF scores for both approaches\n", "\n", "We will be using balloon plots to view the TFIDF scores for the two approaches" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "857bed850716444cbd1b3236f9576abe", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Select(description='TFIDF approach: ', layout=Layout(height='80px', width='50%'), option…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options = ['RuleId', 'SplitUris']\r\n", "\r\n", "def visualiseTFIDF(TfidfCategory):\r\n", " try:\r\n", " max_category = 30\r\n", " df = pd.DataFrame()\r\n", " if TfidfCategory == 'RuleId': df = df_ruleId_tfidf.copy()\r\n", " else: \r\n", " df = df_splitUri_tfidf.copy()\r\n", "\r\n", " df_tfidf = df.iloc[:, : max_category].stack().reset_index(drop = False).rename(columns = {'level_1':TfidfCategory, 'weight':'tfidf'})\r\n", " df_tfidf['Ip Address'] = 'Ip ' + df_tfidf['Ip Address'].astype(str)\r\n", " if 'RuleId' == TfidfCategory: \r\n", " df_tfidf['RuleId'] = 'rID ' + df_tfidf['RuleId'].astype(str)\r\n", " else:\r\n", " df_tfidf['SplitUris'] = df_tfidf['SplitUris'].apply(lambda x: (x[0:20]+ '...') if len(x)> 20 else x)\r\n", " \r\n", " fig = px.scatter(df_tfidf, x = df_tfidf[TfidfCategory], y = df_tfidf['Ip Address'],\r\n", " size= np.log(1 + df_tfidf['tfidf']), color = df_tfidf['tfidf'],\r\n", " hover_data=[df_tfidf['tfidf']]) \r\n", " fig.update_layout(height = max(800, 20 * len(set(df_tfidf[TfidfCategory]))), title_text= 'TFIDF distribution of ' + TfidfCategory + ' against client IPs', width = 1700)\r\n", " fig.show()\r\n", " except Exception as e:\r\n", " print('Error: ' + e)\r\n", " traceback.print_exc()\r\n", "TfidfCategory = widgets.Select(options = options, style = style, layout = layout, description = 'TFIDF approach: ')\r\n", "display(TfidfCategory)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "visualiseTFIDF(TfidfCategory = TfidfCategory.value)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DBSCAN Clustering and PCA of the request URIs for both approaches\n", "\n", "\n", "DBSCAN is a non-parametric density-based spatial clustering algorithm, which groups together points that are \"closely packed\" together. Points which lie in low density regions are marked as outliers. For more information, please see [here](https://www.aaai.org/Papers/KDD/1996/KDD96-037.pdf). We use DBScan on our data in order to aggregate request URIs which are similar to each other, and surface unusual request URIs as outliers. The clustering uses the Tfidf scores data obtained for the rule ID and split URIs approaches respectively. \n", "\n", "Select the eps and min_samples value for DBScan and n_components value for PCA below. More information about these parameters can be found [here](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.dbscan.html) and [here](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html).\n", "\n", "**DBScan:**\n", "\n", "*eps value:* Eps value is a measure of the distance below which two points are considered neighbors.\n", "\n", "*min_samples:* The minimum number of neighbors that a point should have in order to be classified as a core point. The core point is included in the min_samples count.\n", "\n", "**PCA:** PCA is a dimensionality reduction technique that compresses the multivariate data into principal components, which describe most of the variation in the original dataset. In our case, we are able to better visualise the clubbing of similar and outlier request URIs by visualising the first two Principal components.\n", "\n", "*n_components:* Number of principal components" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8aed9bf4295548b680680fb5c2332b1e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='0.4', description='DBSCAN : Enter eps value', layout=Layout(height='30px', width='50%'), style=Des…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4e02f9bbb3b142e3945642ae42d8475e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "IntSlider(value=5, description='DBSCAN : Enter min samples', layout=Layout(height='30px', width='50%'), style=…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4aa3d9cbcc7844f8ab0b988cfa00e561", "version_major": 2, "version_minor": 0 }, "text/plain": [ "IntSlider(value=2, description='PCA : Enter n_components', layout=Layout(height='30px', width='50%'), style=Sl…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "eps_widget = widgets.Text(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description = 'DBSCAN - Enter eps value', value = '0.4')\n", "min_samples_widget = widgets.IntSlider(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description='DBSCAN - Enter min samples', start=1, end=15, step=1, value=5)\n", "n_components_widget = widgets.IntSlider(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description='PCA - Enter n_components', start=1, end=15, step=1, value=2)\n", "\n", "display(eps_widget)\n", "display(min_samples_widget)\n", "display(n_components_widget)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def db_scan_clustering(data, eps = float(eps_widget.value)):\n", " dbscan = DBSCAN(eps=eps, min_samples = int(min_samples.value))\n", " dbscan.fit(data)\n", " return dbscan.labels_\n", " \n", "def principal_component_analysis(data, eps = float(eps_widget.value)):\n", " while True: \n", " try: \n", " pca = PCA(n_components=int(n_components_widget.value))\n", " pca.fit(data)\n", " x_pca = pca.transform(data)\n", " break \n", " except: \n", " continue\n", " clusters = db_scan_clustering(data.values, eps)\n", " \n", " label = list(range(0, len(data), 1))\n", " plt.figure(figsize=(20,15))\n", " scatter = plt.scatter(x_pca[:,0],x_pca[:,1],c = clusters,cmap='rainbow')\n", " handles, labels = scatter.legend_elements(prop=\"colors\", alpha=0.6)\n", " plt.legend(handles, labels, loc=\"upper right\", title=\"Clusters\")\n", " n = list(range(0, len(x_pca[:,0]), 1))\n", " texts = []\n", " for i, txt in enumerate(n):\n", " texts.append(plt.text(x_pca[:,0][i], x_pca[:,1][i], txt))\n", " adjust_text(texts)\n", "\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1mPrincipal Component Analysis \n", "\u001b[0m\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "420eb9856d1d483695aa7c14ff62cfd3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Select(description='TFIDF approach: ', layout=Layout(height='80px', width='50%'), option…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options1 = ['RuleId', 'SplitUris']\r\n", "\r\n", "def viewPCA(tfidfCategory):\r\n", " df = df_splitUri_tfidf.copy()\r\n", " viewData = viewData_splitUri.copy()\r\n", " if tfidfCategory == 'RuleId': \r\n", " df = df_ruleId_tfidf.copy()\r\n", " viewData = viewData_ruleId.copy()\r\n", "\r\n", " print(tfidfCategory + ' approach (Outliers + Clustered request URI data): \\n')\r\n", " while True:\r\n", " try:\r\n", " principal_component_analysis(df)\r\n", " break\r\n", " except:\r\n", " continue\r\n", " \r\n", "print(color.BOLD + 'Principal Component Analysis \\n' + color.END)\r\n", "tfidfCategory = widgets.Select(options = options1, style = style, layout = layout, description = 'TFIDF approach: ')\r\n", "display(tfidfCategory)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "viewPCA(tfidfCategory = tfidfCategory.value)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1mDBScan Clustering of the Request URIs \n", "\u001b[0m\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "718fb765f4894a35924b8eb1752fcf17", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(Select(description='TFIDF approach: ', layout=Layout(height='80px', width='50%'), option…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "options1 = ['RuleId', 'SplitUris']\r\n", "options2 = ['Outlier', 'Clustered']\r\n", "\r\n", "def viewClusters(tfidfCategory, requestURIs):\r\n", " try:\r\n", " df = df_splitUri_tfidf.copy()\r\n", " viewData = viewData_splitUri.copy()\r\n", " if tfidfCategory == 'RuleId': \r\n", " df = df_ruleId_tfidf.copy()\r\n", " viewData = viewData_ruleId.copy()\r\n", "\r\n", " clusters = db_scan_clustering(df.values)\r\n", " print(requestURIs + ' URIs for ' + tfidfCategory+ ': \\n')\r\n", "\r\n", " clusterList = list(set(clusters))\r\n", " try:\r\n", " clusterList.remove(-1)\r\n", " except:\r\n", " print()\r\n", "\r\n", " if requestURIs == 'Outlier':\r\n", " clusterList = [-1]\r\n", "\r\n", " if clusterList:\r\n", " for k in clusterList:\r\n", " print('Cluster ' + str(k))\r\n", " display(viewData[viewData['Ip Address'].isin(df.index.get_level_values(0)[clusters == k])])\r\n", " else:\r\n", " print('No Data')\r\n", " except Exception as e:\r\n", " print('Error: ' + e)\r\n", " traceback.print_exc()\r\n", "\r\n", "print(color.BOLD + 'DBScan Clustering of the Request URIs \\n' + color.END)\r\n", "tfidfCategory = widgets.Select(options = options1, style = style, layout = layout, description = 'TFIDF approach: ')\r\n", "requestURIs = widgets.Select(options = options2, style = style, layout = layout, description = 'Request URIs: ')\r\n", "display(tfidfCategory)\r\n", "display(requestURIs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "viewClusters, tfidfCategory = widgets.Select(options = options1, style = style, layout = layout, description = 'TFIDF approach: '), requestURIs = widgets.Select(options = options2, style = style, layout = layout, description = 'Request URIs: ') ))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Kusto query to further examine the WAF logs and blocked alerts in the time frames with outlier request URIs" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\n", "Start time: \u001b[0m2020-11-04 10:32:42.885697\n", "\n", "\u001b[1mEnd time: \u001b[0m2020-11-26 10:32:42.885697\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "df7b1fa8e6624b74ade7091c3b3492b0", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='', description='IP address: ', layout=Layout(height='30px', width='50%'), placeholder='Enter maske…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f3595ee81cd542b199f8d11993f23288", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Text(value='', description='Request URI: ', layout=Layout(height='30px', width='50%'), placeholder='Enter requ…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ipAddress = widgets.Text(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description = 'IP address: ', placeholder = 'Enter masked IP address from the results above. Include masking bits.')\n", "requestURI = widgets.Text(style = style, layout = widgets.Layout(width=\"50%\", height=\"30px\"), description = 'Request URI: ', placeholder = 'Enter request URI from the results above')\n", "\n", "print(color.BOLD + '\\nStart time: ' + color.END + str(query_times_3.start) + '\\n')\n", "print(color.BOLD + 'End time: ' + color.END + str(query_times_3.end) + '\\n')\n", "\n", "display(ipAddress)\n", "display(requestURI)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\n", "Start time: \u001b[0m2020-11-04 10:32:42.885697\n", "\n", "\u001b[1mEnd time: \u001b[0m2020-11-26 10:32:42.885697\n", "\n", "\u001b[1mIp Address entered: \u001b[0m108.4.0.0/16\n", "\n", "\u001b[1mRequest Uri entered: \u001b[0m\\\\xcc\\\\xb2\\\\xcc\\\\x85]-1572603645543.jpg\n", "\n" ] }, { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "ApplicationGatewayAccessLog (Raw) Data- \n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: []" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "try {IPython.notebook.kernel.execute(\"NOTEBOOK_URL = '\" + window.location + \"'\");} catch(err) {;}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "ApplicationGatewayFirewallLog (Alert) Data- \n", "\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TenantIdTimeGeneratedResourceIdCategoryResourceGroupSubscriptionIdResourceProviderResourceResourceTypeOperationNamerequestUri_sMessageinstanceId_sSourceSystemruleSetType_sruleSetVersion_sruleId_saction_ssite_sdetails_message_sdetails_file_sdetails_line_shostname_stransactionId_gpolicyId_spolicyScope_spolicyScopeName_stimeStamp_tclientIp_sType_ResourceId
08ecf8077-cf51-4820-aadd-14040956f35d2020-11-10 16:17:16.533000+00:00/SUBSCRIPTIONS/D1D8779D-38D7-4F06-91DB-9CBC8DE0176F/RESOURCEGROUPS/SOC-NS/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/SOC-NS-AG-WAFV2ApplicationGatewayFirewallLogSOC-NSd1d8779d-38d7-4f06-91db-9cbc8de0176fMICROSOFT.NETWORKSOC-NS-AG-WAFV2APPLICATIONGATEWAYSApplicationGatewayFirewall/assets/public/images/uploads/my-rare-collectors-item!-[\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85(\\\\xcc\\\\xb2\\\\xcc\\\\x85-\\\\xcd\\\\xa1\\\\xc2\\\\xb0-\\\\xcd\\\\x9c\\\\xca\\\\x96-\\\\xcd\\\\xa1\\\\xc2\\\\xb0\\\\xcc\\\\xb2\\\\xcc\\\\x85)\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85]-1572603645543.jpgMandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 5)appgw_1AzureOWASP_CRS3.1.0949110BlockedGlobalAccess denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score.rules/REQUEST-949-BLOCKING-EVALUATION.conf9313.89.108.163ecdc12b7-045a-1063-0485-9ca508f6fd2bdefaultGlobalGlobal2020-11-10 16:16:00+00:00108.4.232.173AzureDiagnostics/subscriptions/d1d8779d-38d7-4f06-91db-9cbc8de0176f/resourcegroups/soc-ns/providers/microsoft.network/applicationgateways/soc-ns-ag-wafv2
18ecf8077-cf51-4820-aadd-14040956f35d2020-11-10 16:17:16.533000+00:00/SUBSCRIPTIONS/D1D8779D-38D7-4F06-91DB-9CBC8DE0176F/RESOURCEGROUPS/SOC-NS/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/SOC-NS-AG-WAFV2ApplicationGatewayFirewallLogSOC-NSd1d8779d-38d7-4f06-91db-9cbc8de0176fMICROSOFT.NETWORKSOC-NS-AG-WAFV2APPLICATIONGATEWAYSApplicationGatewayFirewall/assets/public/images/uploads/my-rare-collectors-item!-[\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85(\\\\xcc\\\\xb2\\\\xcc\\\\x85-\\\\xcd\\\\xa1\\\\xc2\\\\xb0-\\\\xcd\\\\x9c\\\\xca\\\\x96-\\\\xcd\\\\xa1\\\\xc2\\\\xb0\\\\xcc\\\\xb2\\\\xcc\\\\x85)\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85]-1572603645543.jpgMandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=5,HTTP=0,SESS=0): PHP Injection Attack: Variable Function Call Found; individual paranoia level scores: 5, 0, 0, 0appgw_1AzureOWASP_CRS3.1.0980130BlockedGlobalWarning. Operator GE matched 5 at TX:inbound_anomaly_score.rules/RESPONSE-980-CORRELATION.conf8613.89.108.163ecdc12b7-045a-1063-0485-9ca508f6fd2bdefaultGlobalGlobal2020-11-10 16:16:00+00:00108.4.232.173AzureDiagnostics/subscriptions/d1d8779d-38d7-4f06-91db-9cbc8de0176f/resourcegroups/soc-ns/providers/microsoft.network/applicationgateways/soc-ns-ag-wafv2
\n", "
" ], "text/plain": [ " TenantId TimeGenerated \\\n", "0 8ecf8077-cf51-4820-aadd-14040956f35d 2020-11-10 16:17:16.533000+00:00 \n", "1 8ecf8077-cf51-4820-aadd-14040956f35d 2020-11-10 16:17:16.533000+00:00 \n", "\n", " ResourceId \\\n", "0 /SUBSCRIPTIONS/D1D8779D-38D7-4F06-91DB-9CBC8DE0176F/RESOURCEGROUPS/SOC-NS/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/SOC-NS-AG-WAFV2 \n", "1 /SUBSCRIPTIONS/D1D8779D-38D7-4F06-91DB-9CBC8DE0176F/RESOURCEGROUPS/SOC-NS/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/SOC-NS-AG-WAFV2 \n", "\n", " Category ResourceGroup \\\n", "0 ApplicationGatewayFirewallLog SOC-NS \n", "1 ApplicationGatewayFirewallLog SOC-NS \n", "\n", " SubscriptionId ResourceProvider Resource \\\n", "0 d1d8779d-38d7-4f06-91db-9cbc8de0176f MICROSOFT.NETWORK SOC-NS-AG-WAFV2 \n", "1 d1d8779d-38d7-4f06-91db-9cbc8de0176f MICROSOFT.NETWORK SOC-NS-AG-WAFV2 \n", "\n", " ResourceType OperationName \\\n", "0 APPLICATIONGATEWAYS ApplicationGatewayFirewall \n", "1 APPLICATIONGATEWAYS ApplicationGatewayFirewall \n", "\n", " requestUri_s \\\n", "0 /assets/public/images/uploads/my-rare-collectors-item!-[\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85(\\\\xcc\\\\xb2\\\\xcc\\\\x85-\\\\xcd\\\\xa1\\\\xc2\\\\xb0-\\\\xcd\\\\x9c\\\\xca\\\\x96-\\\\xcd\\\\xa1\\\\xc2\\\\xb0\\\\xcc\\\\xb2\\\\xcc\\\\x85)\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85]-1572603645543.jpg \n", "1 /assets/public/images/uploads/my-rare-collectors-item!-[\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85(\\\\xcc\\\\xb2\\\\xcc\\\\x85-\\\\xcd\\\\xa1\\\\xc2\\\\xb0-\\\\xcd\\\\x9c\\\\xca\\\\x96-\\\\xcd\\\\xa1\\\\xc2\\\\xb0\\\\xcc\\\\xb2\\\\xcc\\\\x85)\\\\xcc\\\\xb2\\\\xcc\\\\x85$\\\\xcc\\\\xb2\\\\xcc\\\\x85]-1572603645543.jpg \n", "\n", " Message \\\n", "0 Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Score: 5) \n", "1 Mandatory rule. Cannot be disabled. Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=5,HTTP=0,SESS=0): PHP Injection Attack: Variable Function Call Found; individual paranoia level scores: 5, 0, 0, 0 \n", "\n", " instanceId_s SourceSystem ruleSetType_s ruleSetVersion_s ruleId_s action_s \\\n", "0 appgw_1 Azure OWASP_CRS 3.1.0 949110 Blocked \n", "1 appgw_1 Azure OWASP_CRS 3.1.0 980130 Blocked \n", "\n", " site_s \\\n", "0 Global \n", "1 Global \n", "\n", " details_message_s \\\n", "0 Access denied with code 403 (phase 2). Operator GE matched 5 at TX:anomaly_score. \n", "1 Warning. Operator GE matched 5 at TX:inbound_anomaly_score. \n", "\n", " details_file_s details_line_s hostname_s \\\n", "0 rules/REQUEST-949-BLOCKING-EVALUATION.conf 93 13.89.108.163 \n", "1 rules/RESPONSE-980-CORRELATION.conf 86 13.89.108.163 \n", "\n", " transactionId_g policyId_s policyScope_s \\\n", "0 ecdc12b7-045a-1063-0485-9ca508f6fd2b default Global \n", "1 ecdc12b7-045a-1063-0485-9ca508f6fd2b default Global \n", "\n", " policyScopeName_s timeStamp_t clientIp_s \\\n", "0 Global 2020-11-10 16:16:00+00:00 108.4.232.173 \n", "1 Global 2020-11-10 16:16:00+00:00 108.4.232.173 \n", "\n", " Type \\\n", "0 AzureDiagnostics \n", "1 AzureDiagnostics \n", "\n", " _ResourceId \n", "0 /subscriptions/d1d8779d-38d7-4f06-91db-9cbc8de0176f/resourcegroups/soc-ns/providers/microsoft.network/applicationgateways/soc-ns-ag-wafv2 \n", "1 /subscriptions/d1d8779d-38d7-4f06-91db-9cbc8de0176f/resourcegroups/soc-ns/providers/microsoft.network/applicationgateways/soc-ns-ag-wafv2 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "try:\n", " pd.set_option('display.max_colwidth', 20)\n", " kql_query = '''\n", " AzureDiagnostics\n", " | where TimeGenerated between (datetime({startTime}).. datetime({endTime}))\n", " | where Category == \"{category}\"\n", " | where {hostname} startswith \"{host}\" \n", " | where action_s == 'Blocked' or isempty(action_s)\n", " | where {ip} startswith \"{ipaddress}\"\n", " | extend originalRequestUriWithArgs_s = column_ifexists(\"originalRequestUriWithArgs_s\", \"\")\n", " | where requestUri_s contains {uri} or originalRequestUriWithArgs_s contains {uri}\n", " | take 10\n", " '''\n", " cutOff = [1, 2, 3, 4]\n", " intlist = [8, 16, 24, 32]\n", " \n", " if ipAddress.value != '':\n", " ipaddress = str(ipAddress.value).strip().split('/')[0]\n", " maskBits = int(str(ipAddress.value).strip().split('/')[1])\n", " ipaddress = '.'.join(ipaddress.split('.')[0:cutOff[intlist.index(maskBits)]])\n", " else:\n", " ipaddress = ''\n", " \n", " print(color.BOLD + '\\nStart time: ' + color.END + str(query_times_3.start) + '\\n')\n", " print(color.BOLD + 'End time: '+ color.END + str(query_times_3.end) + '\\n')\n", " \n", " print(color.BOLD + 'Ip Address entered: ' + color.END + str(ipAddress.value) + '\\n')\n", " print(color.BOLD + 'Request Uri entered: ' + color.END + str((requestURI.value).strip()) + '\\n' )\n", " \n", " category = 'ApplicationGatewayAccessLog'\n", " ip_var = 'clientIP_s'\n", " host_var = 'host_s'\n", " uri = '\\'' + (requestURI.value).strip() + '\\''\n", " kql_accessLogs = kql_query.format(hostname = host_var, startTime = query_times_3.start, endTime = query_times_3.end, host = hosts_2.value, category = category, ip = ip_var, ipaddress = ipaddress, uri = uri)\n", " df_rawAccessKustoQuery = showQuery(kql_accessLogs)\n", " print(category + ' (Raw) Data- \\n')\n", " display(df_rawAccessKustoQuery.head(10))\n", " \n", " category = 'ApplicationGatewayFirewallLog'\n", " ip_var = 'clientIp_s'\n", " host_var = 'hostname_s'\n", " uri = '@' + '\\'' + (requestURI.value).strip() + '\\''\n", " kql_firewallLogs = kql_query.format(hostname = host_var, startTime = query_times_3.start, endTime = query_times_3.end, host = hosts_2.value, category = category, ip = ip_var, ipaddress = ipaddress, uri = uri,)\n", " df_rawFirewallKustoQuery = showQuery(kql_firewallLogs)\n", " print(category + ' (Alert) Data- \\n')\n", " display(df_rawFirewallKustoQuery.head(10))\n", " pd.reset_option('max_colwidth')\n", " \n", "except Exception as e:\n", " print('Error: ' + str(e))\n", " traceback.print_exc()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8 - AzureML", "language": "python", "name": "python38-azureml" }, "language_info": { "name": "python", "version": "" } }, "nbformat": 4, "nbformat_minor": 4 }