├── LICENSE ├── README.md ├── log-analysis-official.ipynb ├── log_model-testing.h5 ├── outliers.txt └── webLog.csv /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Zachery Pettry 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AI: Autoencoder for HTTP Log Anomaly Detection 2 | ======================================= 3 | 4 | Model Overview 5 | ----------- 6 | 7 | ![Reconstruction error vs. data](https://www.zpettry.com/assets/reconstruction_error_graph.JPG) 8 | ![Reconstruction error statistics](https://www.zpettry.com/assets/reconstruction_error_stat.JPG) 9 | 10 | Web site and documentation 11 | -------------------------- 12 | 13 | Blog and additional information about this project is available at the web site: 14 | 15 | https://www.zpettry.com/ai+cybersecurity/ai-autoencoder-anomaly-detection/ 16 | 17 | License 18 | ------- 19 | 20 | This code is licensed under the terms of the MIT License (see the file 21 | LICENSE). 22 | -------------------------------------------------------------------------------- /log-analysis-official.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "colab": {}, 8 | "colab_type": "code", 9 | "id": "YB4mPqgWtPpa" 10 | }, 11 | "outputs": [], 12 | "source": [ 13 | "!pip install -q keras\n", 14 | "!pip install -q pandas\n", 15 | "!pip install -q numpy\n", 16 | "!pip install -q hyperopt\n", 17 | "!pip install -q hyperas" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 3, 23 | "metadata": { 24 | "colab": { 25 | "base_uri": "https://localhost:8080/", 26 | "height": 219 27 | }, 28 | "colab_type": "code", 29 | "id": "aYUZUhDjteXM", 30 | "outputId": "0a9ff9ce-904d-413e-87b4-4c55a3bd81b7" 31 | }, 32 | "outputs": [ 33 | { 34 | "name": "stdout", 35 | "output_type": "stream", 36 | "text": [ 37 | "__pycache__ log_model-testing.h5 webLog.csv\r\n" 38 | ] 39 | } 40 | ], 41 | "source": [ 42 | "!ls \"/storage/log-analysis/\"\n", 43 | "import os\n", 44 | "os.chdir(\"/storage/log-analysis/\")" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 32, 50 | "metadata": {}, 51 | "outputs": [ 52 | { 53 | "name": "stdout", 54 | "output_type": "stream", 55 | "text": [ 56 | "Found 271 unique tokens.\n", 57 | "_________________________________________________________________\n", 58 | "Layer (type) Output Shape Param # \n", 59 | "=================================================================\n", 60 | "input_4 (InputLayer) (None, 3) 0 \n", 61 | "_________________________________________________________________\n", 62 | "dense_13 (Dense) (None, 2) 8 \n", 63 | "_________________________________________________________________\n", 64 | "dense_14 (Dense) (None, 1) 3 \n", 65 | "_________________________________________________________________\n", 66 | "dense_15 (Dense) (None, 2) 4 \n", 67 | "_________________________________________________________________\n", 68 | "dense_16 (Dense) (None, 3) 9 \n", 69 | "=================================================================\n", 70 | "Total params: 24\n", 71 | "Trainable params: 24\n", 72 | "Non-trainable params: 0\n", 73 | "_________________________________________________________________\n", 74 | "Train on 8630 samples, validate on 2157 samples\n", 75 | "Epoch 1/50\n", 76 | "8630/8630 [==============================] - 1s 77us/step - loss: 544.2785 - acc: 0.3645 - val_loss: 250.2417 - val_acc: 0.0000e+00\n", 77 | "Epoch 2/50\n", 78 | "8630/8630 [==============================] - 1s 58us/step - loss: 542.9074 - acc: 0.8287 - val_loss: 249.4843 - val_acc: 0.0000e+00\n", 79 | "Epoch 3/50\n", 80 | "8630/8630 [==============================] - 0s 56us/step - loss: 541.6439 - acc: 0.1955 - val_loss: 248.8086 - val_acc: 0.0000e+00\n", 81 | "Epoch 4/50\n", 82 | "8630/8630 [==============================] - 0s 56us/step - loss: 540.5283 - acc: 0.5802 - val_loss: 248.2224 - val_acc: 0.0000e+00\n", 83 | "Epoch 5/50\n", 84 | "8630/8630 [==============================] - 0s 57us/step - loss: 539.5738 - acc: 0.9196 - val_loss: 247.7275 - val_acc: 0.9986\n", 85 | "Epoch 6/50\n", 86 | "8630/8630 [==============================] - 0s 58us/step - loss: 538.7705 - acc: 0.9461 - val_loss: 247.3153 - val_acc: 0.9986\n", 87 | "Epoch 7/50\n", 88 | "8630/8630 [==============================] - 0s 56us/step - loss: 538.1015 - acc: 0.9461 - val_loss: 246.9732 - val_acc: 0.9986\n", 89 | "Epoch 8/50\n", 90 | "8630/8630 [==============================] - 0s 57us/step - loss: 537.5472 - acc: 0.9461 - val_loss: 246.6904 - val_acc: 0.9986\n", 91 | "Epoch 9/50\n", 92 | "8630/8630 [==============================] - 0s 57us/step - loss: 537.0872 - acc: 0.9461 - val_loss: 246.4559 - val_acc: 0.9986\n", 93 | "Epoch 10/50\n", 94 | "8630/8630 [==============================] - 0s 58us/step - loss: 536.7047 - acc: 0.9461 - val_loss: 246.2599 - val_acc: 0.9986\n", 95 | "Epoch 11/50\n", 96 | "8630/8630 [==============================] - 0s 57us/step - loss: 536.3847 - acc: 0.9461 - val_loss: 246.0962 - val_acc: 0.9986\n", 97 | "Epoch 12/50\n", 98 | "8630/8630 [==============================] - 0s 56us/step - loss: 536.1157 - acc: 0.9461 - val_loss: 245.9580 - val_acc: 0.9986\n", 99 | "Epoch 13/50\n", 100 | "8630/8630 [==============================] - 0s 58us/step - loss: 535.8883 - acc: 0.9461 - val_loss: 245.8410 - val_acc: 0.9986\n", 101 | "Epoch 14/50\n", 102 | "8630/8630 [==============================] - 0s 55us/step - loss: 535.6953 - acc: 0.9461 - val_loss: 245.7415 - val_acc: 0.9986\n", 103 | "Epoch 15/50\n", 104 | "8630/8630 [==============================] - 1s 59us/step - loss: 535.5306 - acc: 0.9461 - val_loss: 245.6563 - val_acc: 0.9986\n", 105 | "Epoch 16/50\n", 106 | "8630/8630 [==============================] - 0s 56us/step - loss: 535.3893 - acc: 0.9461 - val_loss: 245.5830 - val_acc: 0.9986\n", 107 | "Epoch 17/50\n", 108 | "8630/8630 [==============================] - 0s 56us/step - loss: 535.2677 - acc: 0.9461 - val_loss: 245.5199 - val_acc: 0.9986\n", 109 | "Epoch 18/50\n", 110 | "8630/8630 [==============================] - 0s 57us/step - loss: 535.1625 - acc: 0.9461 - val_loss: 245.4651 - val_acc: 0.9986\n", 111 | "Epoch 19/50\n", 112 | "8630/8630 [==============================] - 0s 56us/step - loss: 535.0711 - acc: 0.9461 - val_loss: 245.4176 - val_acc: 0.9986\n", 113 | "Epoch 20/50\n", 114 | "8630/8630 [==============================] - 0s 55us/step - loss: 534.9916 - acc: 0.9461 - val_loss: 245.3761 - val_acc: 0.9986\n", 115 | "Epoch 21/50\n", 116 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.9221 - acc: 0.9461 - val_loss: 245.3398 - val_acc: 0.9986\n", 117 | "Epoch 22/50\n", 118 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.8613 - acc: 0.9461 - val_loss: 245.3079 - val_acc: 0.9986\n", 119 | "Epoch 23/50\n", 120 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.8079 - acc: 0.9461 - val_loss: 245.2800 - val_acc: 0.9986\n", 121 | "Epoch 24/50\n", 122 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.7610 - acc: 0.9461 - val_loss: 245.2553 - val_acc: 0.9986\n", 123 | "Epoch 25/50\n", 124 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.7196 - acc: 0.9461 - val_loss: 245.2337 - val_acc: 0.9986\n", 125 | "Epoch 26/50\n", 126 | "8630/8630 [==============================] - 0s 55us/step - loss: 534.6831 - acc: 0.9461 - val_loss: 245.2144 - val_acc: 0.9986\n", 127 | "Epoch 27/50\n", 128 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.6508 - acc: 0.9461 - val_loss: 245.1974 - val_acc: 0.9986\n", 129 | "Epoch 28/50\n", 130 | "8630/8630 [==============================] - 1s 58us/step - loss: 534.6222 - acc: 0.9461 - val_loss: 245.1824 - val_acc: 0.9986\n", 131 | "Epoch 29/50\n", 132 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.5968 - acc: 0.9461 - val_loss: 245.1690 - val_acc: 0.9986\n", 133 | "Epoch 30/50\n", 134 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.5743 - acc: 0.9461 - val_loss: 245.1572 - val_acc: 0.9986\n", 135 | "Epoch 31/50\n", 136 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.5544 - acc: 0.9461 - val_loss: 245.1467 - val_acc: 0.9986\n", 137 | "Epoch 32/50\n", 138 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.5366 - acc: 0.9461 - val_loss: 245.1373 - val_acc: 0.9986\n", 139 | "Epoch 33/50\n", 140 | "8630/8630 [==============================] - 0s 58us/step - loss: 534.5208 - acc: 0.9461 - val_loss: 245.1290 - val_acc: 0.9986\n", 141 | "Epoch 34/50\n", 142 | "8630/8630 [==============================] - 1s 60us/step - loss: 534.5068 - acc: 0.9461 - val_loss: 245.1216 - val_acc: 0.9986\n", 143 | "Epoch 35/50\n", 144 | "8630/8630 [==============================] - 0s 58us/step - loss: 534.4943 - acc: 0.9461 - val_loss: 245.1149 - val_acc: 0.9986\n", 145 | "Epoch 36/50\n", 146 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4831 - acc: 0.9461 - val_loss: 245.1091 - val_acc: 0.9986\n", 147 | "Epoch 37/50\n", 148 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4732 - acc: 0.9461 - val_loss: 245.1038 - val_acc: 0.9986\n", 149 | "Epoch 38/50\n", 150 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4643 - acc: 0.9461 - val_loss: 245.0991 - val_acc: 0.9986\n", 151 | "Epoch 39/50\n", 152 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4564 - acc: 0.9461 - val_loss: 245.0949 - val_acc: 0.9986\n", 153 | "Epoch 40/50\n", 154 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4494 - acc: 0.9461 - val_loss: 245.0912 - val_acc: 0.9986\n", 155 | "Epoch 41/50\n", 156 | "8630/8630 [==============================] - 1s 58us/step - loss: 534.4431 - acc: 0.9461 - val_loss: 245.0879 - val_acc: 0.9986\n", 157 | "Epoch 42/50\n", 158 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4375 - acc: 0.9461 - val_loss: 245.0849 - val_acc: 0.9986\n", 159 | "Epoch 43/50\n", 160 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4324 - acc: 0.9461 - val_loss: 245.0822 - val_acc: 0.9986\n", 161 | "Epoch 44/50\n", 162 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4279 - acc: 0.9461 - val_loss: 245.0799 - val_acc: 0.9986\n", 163 | "Epoch 45/50\n", 164 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4239 - acc: 0.9461 - val_loss: 245.0778 - val_acc: 0.9986\n", 165 | "Epoch 46/50\n", 166 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4204 - acc: 0.9461 - val_loss: 245.0758 - val_acc: 0.9986\n", 167 | "Epoch 47/50\n", 168 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4172 - acc: 0.9461 - val_loss: 245.0742 - val_acc: 0.9986\n", 169 | "Epoch 48/50\n", 170 | "8630/8630 [==============================] - 0s 57us/step - loss: 534.4143 - acc: 0.9461 - val_loss: 245.0727 - val_acc: 0.9986\n", 171 | "Epoch 49/50\n", 172 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4117 - acc: 0.9461 - val_loss: 245.0713 - val_acc: 0.9986\n", 173 | "Epoch 50/50\n", 174 | "8630/8630 [==============================] - 0s 56us/step - loss: 534.4094 - acc: 0.9461 - val_loss: 245.0701 - val_acc: 0.9986\n" 175 | ] 176 | } 177 | ], 178 | "source": [ 179 | "#!/usr/bin/env python\n", 180 | "\"\"\"\n", 181 | "This file is for training on the webLog data.\n", 182 | "\"\"\"\n", 183 | "\n", 184 | "from __future__ import print_function\n", 185 | "import keras\n", 186 | "from keras.preprocessing.text import Tokenizer\n", 187 | "from keras.preprocessing.sequence import pad_sequences\n", 188 | "from keras.models import load_model\n", 189 | "from keras.models import Model\n", 190 | "from keras.layers import Dense, Input\n", 191 | "import numpy as np\n", 192 | "import pandas as pd\n", 193 | "\n", 194 | "# Preprocess webLog.csv and get rid of the Time column.\n", 195 | "log = '/storage/log-analysis/webLog.csv'\n", 196 | "log = pd.read_csv(log)\n", 197 | "log = log.drop(['Time'], axis=1)\n", 198 | "\n", 199 | "samples = []\n", 200 | "for row in log.iterrows():\n", 201 | " index, data = row\n", 202 | " samples.append(data.tolist())\n", 203 | "\n", 204 | "max_words = 20000\n", 205 | "maxlen = 3\n", 206 | "\n", 207 | "# Tokenize values.\n", 208 | "tokenizer = Tokenizer(num_words=max_words, lower=False)\n", 209 | "tokenizer.fit_on_texts(samples)\n", 210 | "sequences = tokenizer.texts_to_sequences(samples)\n", 211 | "word_index = tokenizer.word_index\n", 212 | "print('Found %s unique tokens.' % len(word_index))\n", 213 | "data = pad_sequences(sequences, maxlen=maxlen)\n", 214 | "\n", 215 | "# Split data into training and test set. \n", 216 | "training_samples = int(len(samples) * 0.80)\n", 217 | "test_samples = int(len(samples) * 0.20)\n", 218 | "\n", 219 | "x = data[:training_samples]\n", 220 | "x_test = data[training_samples: training_samples + test_samples]\n", 221 | "\n", 222 | "callbacks_list = [\n", 223 | " keras.callbacks.ModelCheckpoint(\n", 224 | " filepath='log_model-testing.h5',\n", 225 | " monitor='val_loss',\n", 226 | " save_best_only=True\n", 227 | " )\n", 228 | "]\n", 229 | "\n", 230 | "# Create model.\n", 231 | "input_dim = x.shape[1]\n", 232 | "input = Input(shape=(input_dim, ))\n", 233 | "encode = Dense(2, activation='relu')(input)\n", 234 | "encode = Dense(1, activation='relu')(encode)\n", 235 | "\n", 236 | "decode = Dense(2, activation='relu')(encode)\n", 237 | "decode = Dense(3, activation='sigmoid')(decode)\n", 238 | "\n", 239 | "autoencoder = Model(input, decode)\n", 240 | "\n", 241 | "autoencoder.summary()\n", 242 | "\n", 243 | "autoencoder.compile(optimizer='adam',\n", 244 | " loss='mean_squared_error',\n", 245 | " metrics=['accuracy'])\n", 246 | "\n", 247 | "# Train model.\n", 248 | "history = autoencoder.fit(x, x,\n", 249 | " epochs=50,\n", 250 | " batch_size=32,\n", 251 | " callbacks=callbacks_list,\n", 252 | " validation_data=(x_test, x_test),\n", 253 | " shuffle=True\n", 254 | " )" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 33, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "data": { 264 | "text/html": [ 265 | "
\n", 266 | "\n", 279 | "\n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | "
reconstruction_error
count10787.000000
mean476.551456
std1854.293671
min8.670145
25%32.675488
50%85.676503
75%246.017369
max24300.489973
\n", 321 | "
" 322 | ], 323 | "text/plain": [ 324 | " reconstruction_error\n", 325 | "count 10787.000000\n", 326 | "mean 476.551456\n", 327 | "std 1854.293671\n", 328 | "min 8.670145\n", 329 | "25% 32.675488\n", 330 | "50% 85.676503\n", 331 | "75% 246.017369\n", 332 | "max 24300.489973" 333 | ] 334 | }, 335 | "execution_count": 33, 336 | "metadata": {}, 337 | "output_type": "execute_result" 338 | } 339 | ], 340 | "source": [ 341 | "import pandas as pd\n", 342 | "from numpy import vstack\n", 343 | "\n", 344 | "# Combined x and x_test.\n", 345 | "new_x = vstack([x, x_test])\n", 346 | "\n", 347 | "predictions = autoencoder.predict(new_x)\n", 348 | "\n", 349 | "# Calculated MSE.\n", 350 | "mse = np.mean(np.power(new_x - predictions, 2), axis=1)\n", 351 | "error_df = pd.DataFrame({'reconstruction_error': mse})\n", 352 | "\n", 353 | "# Set threshold at the 99th quartile.\n", 354 | "threshold = error_df.quantile(0.99)\n", 355 | "\n", 356 | "error_df.describe()" 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": 34, 362 | "metadata": {}, 363 | "outputs": [ 364 | { 365 | "data": { 366 | "text/plain": [ 367 | "(array([10491., 135., 64., 30., 24., 21., 22.]),\n", 368 | " array([8.67014518e+00, 3.47893012e+03, 6.94919010e+03, 1.04194501e+04,\n", 369 | " 1.38897100e+04, 1.73599700e+04, 2.08302300e+04, 2.43004900e+04]),\n", 370 | " )" 371 | ] 372 | }, 373 | "execution_count": 34, 374 | "metadata": {}, 375 | "output_type": "execute_result" 376 | }, 377 | { 378 | "data": { 379 | "image/png": "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\n", 380 | "text/plain": [ 381 | "" 382 | ] 383 | }, 384 | "metadata": {}, 385 | "output_type": "display_data" 386 | } 387 | ], 388 | "source": [ 389 | "%matplotlib inline\n", 390 | "import matplotlib.pyplot as plt\n", 391 | "\n", 392 | "# Reconstruction error binned and plotted.\n", 393 | "fig = plt.figure()\n", 394 | "ax = fig.add_subplot(111)\n", 395 | "ax.hist(error_df.reconstruction_error.values, bins=7)" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 35, 401 | "metadata": {}, 402 | "outputs": [ 403 | { 404 | "data": { 405 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEWCAYAAACufwpNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsnXmck9W5+L9PMhsw7JvKIggKKsoqqyKFgtTbui+1atVrtV6tXbQW23t/rddqay2itdcriiLautStdr1QXCgyLJVNcRmQ1ZlhHxiYAWZJcn5/vG/Cm+RN8mYmmfX5fj75THLe5ZxkkvOc86xijEFRFEVRMoGvqQegKIqitB5UqCiKoigZQ4WKoiiKkjFUqCiKoigZQ4WKoiiKkjFUqCiKoigZQ4WKorRAROQTEZnS1ONQlFhUqCjNEhHZLiLHRKRKRHaLyAIRKWzqcbkhIveJyO+zeP8FIvKAs80Yc6YxZkm2+lSU+qJCRWnOfM0YUwiMAEYCP27i8dQLsWh1vzURyfHSlu49lJZNq/uiK60PY8xuYBGWcAFARPJFZLaIfCEie0Rkroi0cxy/WETWi8hhEdkiIjPt9pNE5M8ickBENovILY5r7hORV0XkBRGptFVMYxzHZ4lImX1so4hMs+/7E+Bqe1f1oX3uEhF5UESKgKPAKfbu68sx/f3e8fpcEVkuIhUiUiIiN4rIrcC1wI/s+//FPjdyL/uzeExEdtqPx0Qk3z42RURKReRuEdkrIrtE5KZEn7WIdBaRZ+3zykTkARHx28duFJEiEXlURMqB+xK0+UTkv0Rkh93nCyLS2b7HABExInKziHwBvJvm10Fp5qhQUZo9ItIX+Aqw2dH8EHAalqAZDPQBfmqfPxZ4AbgH6AJMBrbb170ClAInAVcAvxCRqY77XmSf0wX4M/A/9j2HAN8BzjHGdAQuALYbYxYCvwD+YIwpNMYMd9zreuBWoCOwI8V7PBn4P+C3QE/7fa03xjwNvAg8bN//ay6X/ycw3r5mODAW+C/H8ROAzvZndDPwhIh0TTCUBUAA6zMdCcwAvuU4Pg7YCvQGHkzQdqP9+BJwClCI/Tk6OB84HetzVFoTxhh96KPZPbCEQBVQCRjgHaCLfUyAI8Agx/kTgG3286eAR13u2Q8IAh0dbb8EFtjP7wPedhw7AzhmPx8M7AW+DOTG3Pc+4PcxbUuA+13e05fdrsNS7f0xwWexAHgg0b2ALcCFjmNhgQcwBTgG5DiO7wXGu/TTG6gB2jnargHes5/fCHwRc41b2zvA7Y7XQ4A6IAcYYP8/T2nq75g+svPQnYrSnLnEWLuCKcBQoIfd3hNoD6yxVUUVwEK7HSzhscXlficBB4wxlY62HVgr+DC7Hc+PAgUikmOM2Qx8H0sQ7BWRV0TkpBTjL0lx3EmiMXvhJKJ3QjvstjDlxpiA4/VRrN1DLCcDucAux+f6FNDLcY7be4ptcxtPDpbQSnYfpRWgQkVp9hhj/om1Wp9tN+3HWn2faYzpYj86G8uoD9aENcjlVjuBbiLS0dHWHyjzOI6XjDHnYk2+BvhV+FCiS2JeH8EShmFOcDxPNOZk9w+z0x5TmP52W7qUYO1Uejg+107GmDNTjCW2zW08AWBPivsorQAVKkpL4TFguogMN8aEgHnAoyLSC0BE+ohIWD//LHCTbUj32ceGGmNKgOXAL0WkQETOxrIxpHQHFpEhIjLVNoBXYwm1kH14DzDAg4fXeuDrIpJrOwBc4Tj2IvBlEblKRHJEpLuIhB0T9mDZJhLxMvBfItJTRHpg2ZbSdnE2xuwC/gE8IiKd7M9ukIicn+atXgZ+ICIDxXIDD9ucAimuU1oBKlSUFoExZh+W8f2ndtMsLMP9ShE5DLyNpbvHGPMv4CbgUeAQ8E+Or5yvwdLr7wT+CPzMGPO2hyHkYzkH7MdSkfXiuIvza/bfchFZm+Qe/w9rN3IQ+G/gJcf7+wK4ELgbOIAlgMJG/2eBM2yV1Fsu930AWA18BGwA1tpt9eGbQB7wqT3O14ET07zHfOB3wFJgG5YQvrOe41FaGGKM7kIVRVGUzKA7FUVRFCVjqFBRFEVRMoYKFUVRFCVjqFBRFEVRMkabS+bWo0cPM2DAgKYehqIoSouhR48eLFq0aJExZmaqc7MmVESkH5YLaG+sQKenjTG/EZH7gFuAffapPzHG/N2+5sdYcQNB4LvGmEV2+0zgN4AfeMYY85DdPhArT1N3YA1wvTGmNtm4BgwYwOrVqzP5VhVFUVo9dgxUSrKp/goAdxtjzsBKdneHiJxhH3vUGDPCfoQFyhnA14EzgZnA/4qI386Q+gRWQsEzgGsc9/mVfa/BWD71N2fx/SiKoigpyJpQMcbsMsastZ9XAp8RnWMplouBV4wxNcaYbViBbWPtx2ZjzFZ7F/IKcLGICDAVKzgL4Hngkuy8G0VRFMULjWKoF5EBWGm0V9lN3xGRj0RkviMFdx+ik8yV2m2J2rsDFY7UD+F2RVEUpYnIulCxc/+8AXzfGHMYeBIrVcUIYBfwSCOM4VYRWS0iq/ft25f6AkVRFKVeZFWoiEgulkB50RjzJoAxZo8xJuhICjjWPr0MK/13mL52W6L2cqCLHC9HGm6PwxjztDFmjDFmTM+ePd1OURRFUTJA1oSKbfN4FvjMGDPH0e5MTncp8LH9/M9YGVzzba+uU4F/AR8Ap9oZT/OwjPl/NlbSsvc4nun1BuBP2Xo/iqIoSmqyGacyCauc6gYRWW+3/QTLe2sElpvxduDbAMaYT0TkVazsqAHgDmNMEEBEvoNVo9wPzDfGfGLfbxbwiog8AKzDEmKKoihpEwiGmLN4E8u3lDNxUHfumn4aOX6ND0+XNpeleMyYMUbjVBRFieXhhcXML9pGdV2IglwfN08ayD0zhzb1sJoNIrLGGDMm1XkqhhVFafMEgiFeX1NKdZ1Vd626LkTRlvImHlXLRIWKoihtntmLNrKvsiby2u8TJg3q3oQjarmoUFEUpc3z5roynIaA/BwfP5h+WpONpyWjQkVRlDZPrG25MD9HjfT1RD81RVHaPH26FCR9rXinzaW+VxRFCRN2I95QdjiqvfTgsSYaUctHdyqKorRZ5izexPyibQRjIius2G2lPuhORVGUNkNsgGPR5v0RN+Iwfh9cPlJz09YXFSqKorQJAsEQV81dwbrSCoyB4t2HOeOEThTk+qiuC+H3QfcO+Vw5uq96fjUAFSqKorQJ5izexLqSiojrcHVdiKAx3DxpIEVbypk0qDs/0NQsDUaFiqIorZ5wxLzTdCLAuYN7cM/ModzTVANrhahIVhSl1RMbMQ8wsn8XVXNlARUqiqK0emIj5tvn+Xn12xNU1ZUF9BNVFKVVEwiGqKyui2rTiPnsoTYVRVGaLZmocTJn8SZqHG7DgroMZxMVKoqiNDmJhEc4OLG6LkTx7sMIpF3jZPmWcpyRKD075nP3BUMyOn7lOLr/UxSlyQkLj/UlFcwv2sajizcBlkBoaI2TiYO6U5BrTXUFuT6uHN1XVV9ZRHcqWUTLkyqKN5yR7dV1IZZt3s89WAKhePfhSDXG+tQ4uWv6aQhExaIo2UOFShbJxNZdUVorzkXX7kPVUcf8Piv3ViYEQo7fp7EojYgKlSzitnXXL7aiWDgXXbEEQ5YDsAqElofqYrJIrC5Xy5MqirVDeXhhMQuWb48SKOG8wAW5Ps4d3KNpBqc0GN2pZBHV5SptgXRth247lPwc4cyTOhMy6G+lhaNCJYvo1l1pC8xetJFnlm0jEDJsKDuEMYZZXzk94flOtTBY0e03TRygyRxbCfofVBSlQby5royAbQMJhgxvrC1Len6sWvimiQO4Z+ZQFSitBN2pKIrSIIwxqU9yoGrh1o0KFUVRGkSfLgXsq6qNep0MVQu3bnS/qShKgyiriI4xKT14rIlGojQHVKgoitIgqmoCUa+P1AabaCRKc0CFiqIo9SYQDMXZVDrk+ZtoNEpzQIWKoij1ZvaijVQHjgsVAa4Y1bfpBqQ0OSpUFEWpN2+ui3Yfbpfn17TybRwVKoqi1JvYioqAxpu0cbL23xeRfiLynoh8KiKfiMj37PZuIrJYRD63/3a120VEHheRzSLykYiMctzrBvv8z0XkBkf7aBHZYF/zuIhI/EgURckWsfYTtaco2VxSBIC7jTFnAOOBO0TkDOBe4B1jzKnAO/ZrgK8Ap9qPW4EnwRJCwM+AccBY4GdhQWSfc4vjuplZfD+K0ioJJ3i85IkiHl5YTCAYnzU4Ef26to963bdru0wPT2lhZC340RizC9hlP68Ukc+APsDFwBT7tOeBJcAsu/0FY7mSrBSRLiJyon3uYmPMAQARWQzMFJElQCdjzEq7/QXgEuD/svWeFKW1EQiGuGruCtaVVmAMadf9iRU/ofSC65VWSKMoP0VkADASWAX0tgUOwG6gt/28D1DiuKzUbkvWXurS7tb/rSKyWkRW79u3r0HvRVFaE3MWb2JdiSVQIP2SvZMG94jK46Up65Wsp2kRkULgDeD7xpjDTrOHMcaISNbXNsaYp4GnAcaMGaNrKSUpbakMdNHm/Th/EAJp1f3RPF5KLFkVKiKSiyVQXjTGvGk37xGRE40xu2z11l67vQzo57i8r91WxnF1Wbh9id3e1+V8RWkQbakMtD/Gt6VXp/y0BIPm8VJiyab3lwDPAp8ZY+Y4Dv0ZCHtw3QD8ydH+TdsLbDxwyFaTLQJmiEhX20A/A1hkHzssIuPtvr7puJei1JuizfujykAv27y/iUeUPYIx0fAndCpotbsypXHI5k5lEnA9sEFE1tttPwEeAl4VkZuBHcBV9rG/AxcCm4GjwE0AxpgDIvJz4AP7vPvDRnvgdmAB0A7LQK9GeqXBxK7e/b7W66k+aXAPNu6ppLoupDYRJSNk0/trGcfLTscyzeV8A9yR4F7zgfku7auBYQ0YpqLEEQhF+zSl42Lb0lCbiJJptJ6KosQQuzNpzeogtYkomab1/loUpZ7E1gMpOXC0iUaiKC0PFSqK4iAQDHHwaG1Um9YHURTvqFBRFAdzFm8iEGNC0XxWiuIdFSqK4qDIxX1Y64MoindUqCiKTSAYYveh6HrrvTvla30QRUkD9f5S2jzhtCyvryllb2VN1DENBlSU9FChorR5nGlZnAhoMKCipElSoSIifqx09Nc20ngUpVFwJo3cWXHMVaCM7N9FgwEVJU2SChVjTFBEThaRPGNMbbJzFaWlEFtDxC+Q4xMCIYPfB9075HPl6L78oBVnJ1aUbOFF/bUVKBKRPwNHwo0xSSIVpcUwe9FG1pZURF4HDfQqzOOkLu0iqUpUmChK/fAiVLbYDx/QMbvDUZTMkaguypvr4iskXDm6b6tNb68ojUlKoWKM+W+IFNvCGFOV7UEpSibwWhelfZ5fbSeKkiFS7vFFZJiIrAM+AT4RkTUicmb2h6Yo6RMIhnh4YTGXPFHE62tKo+qihMvkXjayD2Htlt8HN4w/WdVdipIhvKi/ngbuMsa8ByAiU4B5wMQsjktRPONUc/mAT3cfprouFGWAL8j1Rcrk/vCCIfh9ouneFSULeBEqHcICBcAYs0REOmRxTIqSFrMXbeSZZdsIhKKrGLoZ4EHTvStKNvHk/SUi/w/4nf36OiyPMEVpFry5rixOoAAU5PrUAK8ojYwXofLvwH8DbwIGeN9uU5RmQWV1XdTrHJ8wrE9nVW0pShPgJaL+P40x322k8ShKWgSCIaxK1Mfp2j6Xt+6Y1EQjUpS2TVKXF2NMEDi3kcaiKGkze9FGqgPHhYqgqeoVpSnxov5aZ0fTv0Z0RP2bWRuVongkNpCxXZ5fU9UrShPiRagUAOXAVEebwbKxKEqj43QhPnCkJu64xpwoStPhxabykTHm0UYaj6IkJTYZZCxa+ldRmhYvNpVrGmksipKSOYs3sa7EXaD4fWpPUZSmxov6q0hE/gf4A9E2lbVZG5WiJKBo835i5cmo/l0IGdSFWFGaAV6Eygj77/2ONkO0jUVRGgWfRL/u3SmfV789Qe0oitJM8JKl+EuNMRBFSUUgGKJ4d2VUWyhkVKAoSjPCS5bi3iLyrIj8n/36DBG5OftDU5RoZi/ayLHYsr8iCc5WFKUp8LLEWwAsAk6yX28Cvp+tASmKM339wwuLCQQtQeJWXOvykX0ae3iKoiTBi02lhzHmVRH5MYAxJiAiwSyPS2nBJKq46JV0imtpoKOiNC+8/NKPiEh3LOM8IjIeOJTVUSktmrBQWF9SwfyibTy6eFNa1y/fUq7FtRSlheJlp3IX8GdgkIgUAT2BK7I6KqXFEgiGXCsuplO7ZOKg7hTbhba0uJaitCy8eH+tFZHzgSFY+fo2GmPqUlyGiMwHvgrsNcYMs9vuA24B9tmn/cQY83f72I+Bm4Eg8F1jzCK7fSbwG8APPGOMechuHwi8AnQH1gDXG2NqPb5vJUvMXrSRfZXHU6f4fRIRCl65a/ppCMQJDy2upSjNH4lNG56xG4tMBqqAF2KESpUxZnbMuWcALwNjsRwC3gbCy9BNwHSgFPgAuMYY86mIvAq8aYx5RUTmAh8aY55MNa4xY8aY1atXZ+ItKjEEgiHO/u9/cLT2uMmtfZ6fj342Q9VUitLCEZE1xpgxqc7L2i/dGLMUOODx9IuBV4wxNcaYbcBmLAEzFthsjNlq70JeAS4Wy490KvC6ff3zwCUZfQOKZ8LeWhMfejdKoAAU5ueoQFGUNkRT/Nq/IyIfich8Eelqt/UBShznlNptidq7AxXGmEBMuysicquIrBaR1fv27Ut0mlJPZi/ayNNLt7K3Mj5jsLr8KkrbwpNQEZE+IjJRRCaHH/Xs70lgEFbql13AI/W8T1oYY542xowxxozp2bNnY3TZZggEQ7ywckdcjXjBysmlLr+K0rZIaagXkV8BVwOfYhnRwXIvXppuZ8aYPY77zgP+ar8sA/o5Tu1rt5GgvRzoIiI59m7Feb7SiMxZvClO5ZXjE749+RR+kGZ8iqIoLR8vLsWXAEOMMfG6jTQRkRONMbvsl5cCH9vP/wy8JCJzsAz1pwL/wlrwnmp7epUBXwe+YYwxIvIelmvzK8ANwJ8aOj4lOW5BjcvtGBInt5w70DVYUVGU1o8XobIVyAXSEioi8jIwBeghIqXAz4ApIjICa6ezHfg2gDHmE9ub61MgANxh13JBRL6DlSbGD8w3xnxidzELeEVEHgDWAc+mMz4lfWYv2sgzy7YRCBk2lB3CGMPEQd35bNchagIGAUaqyktR2jRehMpRYL2IvINDsBhjvpvsImOMW3GvhBO/MeZB4EGX9r8Df3dp34rlHaZkiFTpVd5cVxaxnQRDhjfWlrH83qlxMSWq8lKUtosXofJn+6G0YmLL9CbLueVEAxJbFnV1dZSWllJdXd3UQ1GaKQUFBfTt25fc3Nx6Xe8lov55EcnjeDCip4h6pXmSaDcSKdNrn+eWXuWykX2Yt2wrwZCVe0vdhVsepaWldOzYkQEDBmjZACUOYwzl5eWUlpYycODAet3Di/fXFKzgwu1YhvN+InKDHdyotBDCwuT1NaUcOFJLIGSidiPLt5RHlekViEuvorm3Wj7V1dUqUJSEiAjdu3enIfF8XtRfjwAzjDEb7U5Pw0qpMrrevSpZxW034kwnH8a5G3EzuMcKDVV1tQ5UoCjJaOj3w4tQyQ0LFABjzCYRqZ+yTWkU3Ly0Vmw9ECVQgKgMwG5JHNXgrihKungRKqtF5Bng9/brawHNyNiMcfPSumJ030g6eb8PunfI58rRfTUDsKIoGcXLUvQ/sOJHvms/PrXblGZKZXW0H0VVTYC7pp/GzZMGMqJfF26bPIjl907lnplDdTeitDkWLFjAzp07M3a/xx57jKNHj0ZeX3jhhVRUVGTs/i0NL95fNcAc+6E0Y8K2lNpAtJqrQ55fdyJKvWhoaehkGGMwxuDzNe7CZsGCBQwbNoyTTjop7lgwGMTv96d1v8cee4zrrruO9u3bA/D3v8eF1WWdQCBATk5Owtder8sECf+bdoQ7IrLBzioc9cjoKJSMEM4WHHS4cfl9cMWovk03KKVF09DS0LFs376dIUOG8M1vfpNhw4bxu9/9jgkTJjBq1CiuvPJKqqqqAPjggw+YOHEiw4cPZ+zYsVRWVlJdXc1NN93EWWedxciRI3nvvfcAS0hcdtllzJw5k1NPPZUf/ehHgCUgbrzxRoYNG8ZZZ53Fo48+yuuvv87q1au59tprGTFiBMeOHWPAgAHMmjWLUaNG8dprrzFlyhTCNZf279/PgAEDIvf74Q9/yLBhwzj77LP57W9/y+OPP87OnTv50pe+xJe+9CUABgwYwP79+63Pb84chg0bxrBhw3jssccin8Hpp5/OLbfcwplnnsmMGTM4duxYws9sy5YtzJw5k9GjR3PeeedRXFwMwI033shtt93GuHHj+NGPfsR9993H9ddfz6RJk7j++uuTfl4XXXQRU6dOZdq0aQ36f7qRTER9z/771Yz3qmQFpy0FohM7Kkp9WL6lvEGlod34/PPPef755xk8eDCXXXYZb7/9Nh06dOBXv/oVc+bM4d577+Xqq6/mD3/4A+eccw6HDx+mXbt2/OY3v0FE2LBhA8XFxcyYMYNNmywht379etatW0d+fj5DhgzhzjvvZO/evZSVlfHxx1aKwYqKCrp06cL//M//MHv2bMaMOV5vqnv37qxduxaAuXPnuo776aefZvv27axfv56cnBwOHDhAt27dmDNnDu+99x49evSIOn/NmjU899xzrFq1CmMM48aN4/zzz6dr1658/vnnvPzyy8ybN4+rrrqKN954g+uuu86131tvvZW5c+dy6qmnsmrVKm6//XbeffddwIo7Wr58OX6/n/vuu49PP/2UZcuW0a5dOx555JGEn9fatWv56KOP6NatWwP+k+4kFCqOxI+3G2NmOY/ZmYtnxV+lNAVhFcW+mHomeTk+TeyoNIiJg7pHHDyc3oIN4eSTT2b8+PH89a9/5dNPP2XSpEkA1NbWMmHCBDZu3MiJJ57IOeecA0CnTp0AWLZsGXfeeScAQ4cO5eSTT45MktOmTaNz584AnHHGGezYsYMzzzyTrVu3cuedd/Jv//ZvzJgxI+GYrr766pTjfvvtt7ntttsi6qJUE/KyZcu49NJL6dChAwCXXXYZ77//PhdddBEDBw5kxIgRAIwePZrt27e73qOqqorly5dz5ZVXRtpqao7/zq+88soodd1FF11Eu3btIv0n+rymT5+eFYEC3ry/phMvQL7i0qY0EWEX4tjC0B3y0tMNK0osbq7mDSU8yRpjmD59Oi+//HLU8Q0bNqR9z/z8/Mhzv99PIBCga9eufPjhhyxatIi5c+fy6quvMn/+/KRjAsjJySEUsndnWUpnEzveROqvUChEly5dWL9+vetx57jdXifC63n1IZlN5T9EZAMwNMaesg1I/7+uZIVERbLUlqJkgrCDx1t3TMq4t+D48eMpKipi8+bNABw5coRNmzYxZMgQdu3axQcffABAZWUlgUCA8847jxdffBGATZs28cUXXzBkSOKM2Pv37ycUCnH55ZfzwAMPRNRbHTt2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\n", 406 | "text/plain": [ 407 | "" 408 | ] 409 | }, 410 | "metadata": {}, 411 | "output_type": "display_data" 412 | }, 413 | { 414 | "name": "stdout", 415 | "output_type": "stream", 416 | "text": [ 417 | "200\n", 418 | "GET /madeup.php HTTP/1.1\n", 419 | "10.4.5.2\n", 420 | "----------------------------------\n", 421 | "GET /profile.php?user=bala HTTP/1.1\n", 422 | "10.130.2.1\n", 423 | "200\n", 424 | "----------------------------------\n", 425 | "GET /edit.php?name=bala HTTP/1.1\n", 426 | "10.131.2.1\n", 427 | "200\n", 428 | "----------------------------------\n", 429 | "10.131.2.1\n", 430 | "200\n", 431 | "GET /contestproblem.php?name=Toph%20Contest%202 HTTP/1.1\n", 432 | "----------------------------------\n", 433 | "10.131.2.1\n", 434 | "GET /details.php?id=3 HTTP/1.1\n", 435 | "200\n", 436 | "----------------------------------\n", 437 | "10.131.2.1\n", 438 | "200\n", 439 | "GET /contestsubmission.php?id=4 HTTP/1.1\n", 440 | "----------------------------------\n", 441 | "10.131.2.1\n", 442 | "200\n", 443 | "GET /edit.php?name=ksrsingh HTTP/1.1\n", 444 | "----------------------------------\n", 445 | "200\n", 446 | "GET /showcode.php?id=285&nm=ksrsingh HTTP/1.1\n", 447 | "10.131.0.1\n", 448 | "----------------------------------\n", 449 | "GET /allsubmission.php?name=shawon HTTP/1.1\n", 450 | "200\n", 451 | "10.128.2.1\n", 452 | "----------------------------------\n", 453 | "200\n", 454 | "10.129.2.1\n", 455 | "GET /login.php HTTP/1.0\n", 456 | "----------------------------------\n", 457 | "10.131.2.1\n", 458 | "302\n", 459 | "GET / HTTP/1.0\n", 460 | "----------------------------------\n", 461 | "GET /profile.php?user=moshiur_cse15 HTTP/1.1\n", 462 | "200\n", 463 | "10.131.0.1\n", 464 | "----------------------------------\n", 465 | "GET /allsubmission.php?name=moshiur_cse15 HTTP/1.1\n", 466 | "200\n", 467 | "10.131.0.1\n", 468 | "----------------------------------\n", 469 | "GET /profile.php?user=toph HTTP/1.1\n", 470 | "200\n", 471 | "10.128.2.1\n", 472 | "----------------------------------\n", 473 | "10.131.2.1\n", 474 | "200\n", 475 | "GET /profile.php?user=DevSkill HTTP/1.1\n", 476 | "----------------------------------\n", 477 | "200\n", 478 | "GET /showcode.php?id=286&nm=Rakib_1603065 HTTP/1.1\n", 479 | "10.131.0.1\n", 480 | "----------------------------------\n", 481 | "200\n", 482 | "10.128.2.1\n", 483 | "GET /showcode.php?id=287&nm=Riyal_RUET HTTP/1.1\n", 484 | "----------------------------------\n", 485 | "200\n", 486 | "10.128.2.1\n", 487 | "GET /showcode.php?id=288&nm=Riyal_RUET HTTP/1.1\n", 488 | "----------------------------------\n", 489 | "200\n", 490 | "GET /profile.php?user=Riyal_RUET HTTP/1.1\n", 491 | "10.128.2.1\n", 492 | "----------------------------------\n", 493 | "GET /submit.php?id=58 HTTP/1.1\n", 494 | "10.130.2.1\n", 495 | "200\n", 496 | "----------------------------------\n", 497 | "GET /submit.php?id=63 HTTP/1.1\n", 498 | "10.131.2.1\n", 499 | "200\n", 500 | "----------------------------------\n", 501 | "GET /profile.php?user=Goni HTTP/1.1\n", 502 | "200\n", 503 | "10.128.2.1\n", 504 | "----------------------------------\n", 505 | "GET /showcode.php?id=294&nm=Rakib_1603065 HTTP/1.1\n", 506 | "200\n", 507 | "10.131.0.1\n", 508 | "----------------------------------\n", 509 | "200\n", 510 | "10.128.2.1\n", 511 | "GET /edit.php?name=Tazbinur%20Rahaman HTTP/1.1\n", 512 | "----------------------------------\n", 513 | "GET /details.php?id=9 HTTP/1.1\n", 514 | "10.130.2.1\n", 515 | "200\n", 516 | "----------------------------------\n", 517 | "GET /contestproblem.php?name=RUET%20OJ%20Final%20Test HTTP/1.1\n", 518 | "200\n", 519 | "10.128.2.1\n", 520 | "----------------------------------\n", 521 | "200\n", 522 | "GET /details.php?id=39 HTTP/1.1\n", 523 | "10.128.2.1\n", 524 | "----------------------------------\n", 525 | "200\n", 526 | "GET /contestsubmission.php?id=14&show=bruce HTTP/1.1\n", 527 | "10.128.2.1\n", 528 | "----------------------------------\n", 529 | "GET /edit.php?name=mahadi HTTP/1.1\n", 530 | "200\n", 531 | "10.131.0.1\n", 532 | "----------------------------------\n", 533 | "GET /allsubmission.php?name=mahadi HTTP/1.1\n", 534 | "200\n", 535 | "10.131.0.1\n", 536 | "----------------------------------\n", 537 | "GET /contestsubmit.php?id=44 HTTP/1.1\n", 538 | "10.130.2.1\n", 539 | "200\n", 540 | "----------------------------------\n", 541 | "10.131.2.1\n", 542 | "200\n", 543 | "GET /profile.php?user=abufarhad HTTP/1.1\n", 544 | "----------------------------------\n", 545 | "10.130.2.1\n", 546 | "200\n", 547 | "GET /contestsubmission.php?id=13&show=abufarhad HTTP/1.1\n", 548 | "----------------------------------\n", 549 | "10.131.2.1\n", 550 | "200\n", 551 | "GET /profile.php?user=superman100 HTTP/1.1\n", 552 | "----------------------------------\n", 553 | "200\n", 554 | "GET /edit.php?name=m.r.saurov HTTP/1.1\n", 555 | "10.128.2.1\n", 556 | "----------------------------------\n", 557 | "200\n", 558 | "GET /profile.php?user=utshab_1603022 HTTP/1.1\n", 559 | "10.131.0.1\n", 560 | "----------------------------------\n", 561 | "200\n", 562 | "10.131.0.1\n", 563 | "GET /contestsubmission.php?id=16&show=utshab_1603022 HTTP/1.1\n", 564 | "----------------------------------\n", 565 | "200\n", 566 | "10.131.0.1\n", 567 | "GET /contestsubmission.php?id=16&show=FFIsty_1603011 HTTP/1.1\n", 568 | "----------------------------------\n", 569 | "200\n", 570 | "10.129.2.1\n", 571 | "GET /editcontestproblem.php?id=41 HTTP/1.1\n", 572 | "----------------------------------\n", 573 | "GET /profile.php?user=PKP HTTP/1.1\n", 574 | "10.131.2.1\n", 575 | "200\n", 576 | "----------------------------------\n", 577 | "10.131.2.1\n", 578 | "200\n", 579 | "GET /description.php?name=Matrix%20For%20My%20Valentine HTTP/1.1\n", 580 | "----------------------------------\n", 581 | "GET /home.php HTTP/1.0\n", 582 | "302\n", 583 | "10.131.0.1\n", 584 | "----------------------------------\n", 585 | "GET /standings.php HTTP/1.0\n", 586 | "302\n", 587 | "10.129.2.1\n", 588 | "----------------------------------\n", 589 | "GET /details.php HTTP/1.0\n", 590 | "302\n", 591 | "10.131.0.1\n", 592 | "----------------------------------\n", 593 | "GET /contestsubmission.php HTTP/1.0\n", 594 | "10.130.2.1\n", 595 | "302\n", 596 | "----------------------------------\n", 597 | "10.131.2.1\n", 598 | "302\n", 599 | "GET /profile.php HTTP/1.0\n", 600 | "----------------------------------\n", 601 | "200\n", 602 | "10.128.2.1\n", 603 | "GET /details.php?name=Adjacency%20List&cod=16 HTTP/1.1\n", 604 | "----------------------------------\n", 605 | "10.131.2.1\n", 606 | "302\n", 607 | "GET /archive.php HTTP/1.0\n", 608 | "----------------------------------\n", 609 | "200\n", 610 | "GET /editcontestproblem.php?id=44 HTTP/1.1\n", 611 | "10.131.0.1\n", 612 | "----------------------------------\n", 613 | "10.131.2.1\n", 614 | "302\n", 615 | "GET /submit.php HTTP/1.0\n", 616 | "----------------------------------\n", 617 | "10.131.2.1\n", 618 | "200\n", 619 | "GET /showcode.php?id=296&nm=bruce HTTP/1.1\n", 620 | "----------------------------------\n", 621 | "200\n", 622 | "10.129.2.1\n", 623 | "GET /pcompile.php HTTP/1.1\n", 624 | "----------------------------------\n", 625 | "10.130.2.1\n", 626 | "200\n", 627 | "GET /profile.php?user=wbreturn HTTP/1.1\n", 628 | "----------------------------------\n", 629 | "GET /fonts/fontawesome-webfont.woff2 HTTP/1.0\n", 630 | "200\n", 631 | "10.131.0.1\n", 632 | "----------------------------------\n", 633 | "200\n", 634 | "GET /contestsubmission.php?id=3 HTTP/1.1\n", 635 | "10.128.2.1\n", 636 | "----------------------------------\n", 637 | "10.131.2.1\n", 638 | "200\n", 639 | "GET /standings.php?id=3 HTTP/1.1\n", 640 | "----------------------------------\n", 641 | "200\n", 642 | "10.129.2.1\n", 643 | "GET /edit.php?name=zerocool HTTP/1.1\n", 644 | "----------------------------------\n", 645 | "GET /allsubmission.php?name=zerocool HTTP/1.1\n", 646 | "10.131.2.1\n", 647 | "200\n", 648 | "----------------------------------\n", 649 | "GET /contestsubmission.php?id=13&show=AYSrizon HTTP/1.1\n", 650 | "200\n", 651 | "10.129.2.1\n", 652 | "----------------------------------\n", 653 | "GET /details.php?name=Magic%20Square&cod=13 HTTP/1.1\n", 654 | "200\n", 655 | "10.128.2.1\n", 656 | "----------------------------------\n", 657 | "10.130.2.1\n", 658 | "404\n", 659 | "GET /css/bootstrap.min.css.map HTTP/1.1\n", 660 | "----------------------------------\n", 661 | "10.131.2.1\n", 662 | "200\n", 663 | "GET /contestshowcode.php?id=339&nm=shawon&cn=13 HTTP/1.1\n", 664 | "----------------------------------\n", 665 | "GET /contestshowcode.php?id=338&nm=shawon&cn=13 HTTP/1.1\n", 666 | "200\n", 667 | "10.129.2.1\n", 668 | "----------------------------------\n", 669 | "10.131.2.1\n", 670 | "200\n", 671 | "GET /contestshowcode.php?id=339&nm=shawon&cn=13 HTTP/1.1\n", 672 | "----------------------------------\n", 673 | "GET /contestshowcode.php?id=338&nm=shawon&cn=13 HTTP/1.1\n", 674 | "200\n", 675 | "10.129.2.1\n", 676 | "----------------------------------\n", 677 | "200\n", 678 | "GET /contestproblem.php?name=ROJ%20Testing%20Contest%201 HTTP/1.1\n", 679 | "10.128.2.1\n", 680 | "----------------------------------\n", 681 | "200\n", 682 | "GET /contestsubmission.php?id=11 HTTP/1.1\n", 683 | "10.129.2.1\n", 684 | "----------------------------------\n", 685 | "200\n", 686 | "GET /profile.php?user=st.zuhori HTTP/1.1\n", 687 | "10.129.2.1\n", 688 | "----------------------------------\n", 689 | "10.130.2.1\n", 690 | "200\n", 691 | "GET /profile.php?user=Shawon_ICT HTTP/1.1\n", 692 | "----------------------------------\n", 693 | "200\n", 694 | "GET /description.php?id=75 HTTP/1.1\n", 695 | "10.129.2.1\n", 696 | "----------------------------------\n", 697 | "302\n", 698 | "GET /action.php HTTP/1.0\n", 699 | "10.131.0.1\n", 700 | "----------------------------------\n", 701 | "10.130.2.1\n", 702 | "200\n", 703 | "GET /profile.php?user=sanaul HTTP/1.1\n", 704 | "----------------------------------\n", 705 | "200\n", 706 | "GET /contestsubmission.php?id=11 HTTP/1.1\n", 707 | "10.129.2.1\n", 708 | "----------------------------------\n", 709 | "200\n", 710 | "GET /contestsubmission.php?id=12&page=2 HTTP/1.1\n", 711 | "10.129.2.1\n", 712 | "----------------------------------\n", 713 | "200\n", 714 | "10.129.2.1\n", 715 | "GET /profile.php?user=saif_1603035 HTTP/1.1\n", 716 | "----------------------------------\n", 717 | "10.131.2.1\n", 718 | "200\n", 719 | "GET /standings.php?id=12 HTTP/1.1\n", 720 | "----------------------------------\n", 721 | "GET /profile.php?user=xyz HTTP/1.1\n", 722 | "10.131.2.1\n", 723 | "200\n", 724 | "----------------------------------\n", 725 | "10.131.2.1\n", 726 | "200\n", 727 | "GET /standings.php?id=12 HTTP/1.1\n", 728 | "----------------------------------\n", 729 | "200\n", 730 | "GET /contestsubmission.php?id=13&page=2 HTTP/1.1\n", 731 | "10.129.2.1\n", 732 | "----------------------------------\n", 733 | "200\n", 734 | "10.129.2.1\n", 735 | "GET /profile.php?user=emrul_mu HTTP/1.1\n", 736 | "----------------------------------\n", 737 | "GET /contestsubmission.php?id=13&page=4 HTTP/1.1\n", 738 | "200\n", 739 | "10.129.2.1\n", 740 | "----------------------------------\n", 741 | "10.130.2.1\n", 742 | "200\n", 743 | "GET /showcode.php?id=222&nm=nasif25 HTTP/1.1\n", 744 | "----------------------------------\n", 745 | "200\n", 746 | "GET /showcode.php?id=193&nm=shawon HTTP/1.1\n", 747 | "10.131.0.1\n", 748 | "----------------------------------\n", 749 | "10.131.2.1\n", 750 | "200\n", 751 | "GET /description.php?name=Google%20feeling%20lucky. HTTP/1.1\n", 752 | "----------------------------------\n", 753 | "200\n", 754 | "10.128.2.1\n", 755 | "GET /editcontest.php?name=RUET%20OJ%20Server%20Testing%20Contest HTTP/1.1\n", 756 | "----------------------------------\n", 757 | "GET /countdown.php?name=Another%20Multiplication%20Game HTTP/1.1\n", 758 | "10.131.2.1\n", 759 | "200\n", 760 | "----------------------------------\n", 761 | "200\n", 762 | "GET /description.php?id=75 HTTP/1.1\n", 763 | "10.129.2.1\n", 764 | "----------------------------------\n", 765 | "GET /countdown.php HTTP/1.0\n", 766 | "302\n", 767 | "10.131.0.1\n", 768 | "----------------------------------\n", 769 | "GET /contestproblem.php HTTP/1.0\n", 770 | "302\n", 771 | "10.129.2.1\n", 772 | "----------------------------------\n", 773 | "10.130.2.1\n", 774 | "GET /logout.php HTTP/1.0\n", 775 | "302\n", 776 | "----------------------------------\n", 777 | "10.130.2.1\n", 778 | "200\n", 779 | "GET /profile.php?user=mkarzymat HTTP/1.1\n", 780 | "----------------------------------\n", 781 | "200\n", 782 | "GET /fonts/fontawesome-webfont.eot?v=4.6.3 HTTP/1.1\n", 783 | "10.128.2.1\n", 784 | "----------------------------------\n", 785 | "302\n", 786 | "10.128.2.1\n", 787 | "GET /action.php HTTP/1.0\n", 788 | "----------------------------------\n", 789 | "GET /logout.php HTTP/1.0\n", 790 | "302\n", 791 | "10.131.0.1\n", 792 | "----------------------------------\n", 793 | "10.130.2.1\n", 794 | "200\n", 795 | "GET /fonts/fontawesome-webfont.eot?v=4.6.3 HTTP/1.1\n", 796 | "----------------------------------\n", 797 | "GET /description.php HTTP/1.0\n", 798 | "302\n", 799 | "10.128.2.1\n", 800 | "----------------------------------\n", 801 | "10.130.2.1\n", 802 | "200\n", 803 | "GET /description.php?name=Google%20feeling%20lucky. HTTP/1.1\n", 804 | "----------------------------------\n", 805 | "GET /profile.php?user=Shawon14012 HTTP/1.1\n", 806 | "200\n", 807 | "10.131.0.1\n", 808 | "----------------------------------\n", 809 | "GET /edit.php?name=Shawon14012 HTTP/1.1\n", 810 | "200\n", 811 | "10.131.0.1\n", 812 | "----------------------------------\n", 813 | "200\n", 814 | "GET /showcode.php?id=300&nm=x HTTP/1.1\n", 815 | "10.131.0.1\n", 816 | "----------------------------------\n", 817 | "200\n", 818 | "GET /showcode.php?id=301&nm=Shawon14012 HTTP/1.1\n", 819 | "10.131.0.1\n", 820 | "----------------------------------\n", 821 | "200\n", 822 | "GET /showcode.php?id=301&nm=Shawon14012 HTTP/1.1\n", 823 | "10.131.0.1\n", 824 | "----------------------------------\n", 825 | "GET /profile.php?user=sammm HTTP/1.1\n", 826 | "200\n", 827 | "10.131.0.1\n", 828 | "----------------------------------\n", 829 | "10.130.2.1\n", 830 | "200\n", 831 | "GET /description.php?id=55%27 HTTP/1.1\n", 832 | "----------------------------------\n", 833 | "10.130.2.1\n", 834 | "200\n", 835 | "GET /details.php?id=35 HTTP/1.1\n", 836 | "----------------------------------\n", 837 | "10.130.2.1\n", 838 | "GET /details.php?id=34 HTTP/1.1\n", 839 | "200\n", 840 | "----------------------------------\n", 841 | "GET /details.php?id=36 HTTP/1.1\n", 842 | "200\n", 843 | "10.131.0.1\n", 844 | "----------------------------------\n", 845 | "GET /details.php?id=37 HTTP/1.1\n", 846 | "200\n", 847 | "10.131.0.1\n", 848 | "----------------------------------\n", 849 | "GET /profile.php?user=uva HTTP/1.1\n", 850 | "200\n", 851 | "10.131.0.1\n", 852 | "----------------------------------\n" 853 | ] 854 | } 855 | ], 856 | "source": [ 857 | "threshold = threshold\n", 858 | "\n", 859 | "# Plot reconstruction error vs. the data.\n", 860 | "fig, ax = plt.subplots()\n", 861 | "ax.plot(error_df.index, error_df.reconstruction_error, marker='o', ms=3.5, linestyle='')\n", 862 | "ax.hlines(threshold, ax.get_xlim()[0], ax.get_xlim()[1], colors=\"r\", zorder=100, label='threshold')\n", 863 | "ax.legend(loc=5)\n", 864 | "plt.title(\"Reconstruction error\")\n", 865 | "plt.ylabel(\"Reconstruction error\")\n", 866 | "plt.xlabel(\"Data point index\")\n", 867 | "plt.show();\n", 868 | "\n", 869 | "# Output anomalies.\n", 870 | "index_list = []\n", 871 | "for index, row in error_df.iterrows():\n", 872 | " if row.reconstruction_error > int(threshold):\n", 873 | " index_list.append(index)\n", 874 | "\n", 875 | "output = [] \n", 876 | "for x in index_list:\n", 877 | " output.append(new_x[x])\n", 878 | " \n", 879 | "for x in output:\n", 880 | " for key, value in word_index.items():\n", 881 | " if value == x[2]:\n", 882 | " print(key)\n", 883 | " if value == x[1]:\n", 884 | " print(key)\n", 885 | " if value == x[0]:\n", 886 | " print(key)\n", 887 | " print('----------------------------------')\n" 888 | ] 889 | }, 890 | { 891 | "cell_type": "code", 892 | "execution_count": 36, 893 | "metadata": {}, 894 | "outputs": [ 895 | { 896 | "data": { 897 | "image/png": "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c+dOunTpwuDBg3n//fe57777ABgwYABDhgzhoYceAqIfh9XW1nLqqacyb948du7cCcDf/va3nNc7GzpbBhTuIs0pL98nYZ5u3LhxjB49mlGjRlFSUsLxxx+f821cfvnlfO1rX2P06NH1t379+jUoM2jQIL7+9a8zevRoDjzwQI455pj6ZVVVVVxyySXMnj2b7t27c99993HmmWeyYsUKysrK6NatG5MnT+amm27Ked0z6dxjqN51F1xwAbzyCrTy+g0iHc3atWs59NBDC12NdqGuro66ujp69uzJunXr+NKXvsS6devo2rV97Pc29l5lO4Zq+2hBoWjPXaRT27FjB6eccgp1dXW4O3fccUe7Cfa2CqMVraVwF+nU+vfvz7JlywpdjbzQAVVQuItIcBTuAPEpUiIioVC4d+8eXRBJRCQgnTvVNDi2iARK4a7+dpF9auLEiZ/4QdJtt93GpZde2uzzevfuDcAbb7zB9OnTGy1z0kknkekU69tuu43axMXQTj/9dN59991sqt6hKNwV7iL71IwZM5g/f36DefPnz2fGjBlZPf+ggw7i97//fau3nx7uDz/8MP3792/1+tornQqpcJfO7KqroJFL3LbJ2LEQX2q3MdOnT+e6665j9+7ddO/enQ0bNvDGG29wwgknsGPHDqZOncq2bdvYs2cPN998M1OnTm3w/A0bNnDmmWfy4osvsnPnTi644AJWrFjBqFGj6n/yD3DppZeydOlSdu7cyfTp0/ne977Hz372M9544w0mTpzI4MGDWbx4MaWlpVRXVzN48GBuvfXW+qtKXnTRRVx11VVs2LCB0047jQkTJvDMM88wbNgwHnjggfoLg6U89NBD3HzzzezevZtBgwZRVVXFAQccwI4dO7j88suprq7GzLj++us5++yzefTRR7n22mvZu3cvgwcPZtGiRTl8ExTuCneRfWzgwIGMHz+eRx55hKlTpzJ//nzOOecczIyePXuycOFC+vbtyzvvvMOxxx7LlClTmhxP9Be/+AXFxcWsXbuWlStXMm7cuPplc+bMYeDAgezdu5dTTjmFlStXcsUVV3DrrbeyePFiBg8e3GBdy5Yt48477+S5557D3TnmmGM48cQTGTBgAOvWrePee+/ll7/8Jeeccw733Xcf5513XoPnT5gwgWeffRYz41e/+hU/+tGPuOWWW7jpppvo168f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\n", 898 | "text/plain": [ 899 | "" 900 | ] 901 | }, 902 | "metadata": {}, 903 | "output_type": "display_data" 904 | }, 905 | { 906 | "data": { 907 | "image/png": "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RN57772K/Zc/trj8YWr/9V//VfHFKyNGjGDHjh0N/tlWJ1ufCjCz+vvOd6Cpvzlp+HBIQ7I6vXv3ZtSoUTz55JNMmDCBefPmcc455yCJzp0788gjj3DggQeyZcsWjj/+eM4+++wav07vnnvuoUuXLqxcuZLly5dXeszw9OnT6d27N7t37+bkk09m+fLlXHXVVdx5550sXLiQPn36VNrW0qVLuffee1m8eDERwXHHHceYMWPo1asXq1ev5sEHH+TnP/8555xzDg8//HCtz5e/4IILuOuuuxgzZgw/+MEP+NGPfsTMmTO59dZbeeutt+jUqVNFd9Edd9zB3XffzejRo9m5cyedO3euz0+7Tr6iN7NWkdt9k9ttExHccMMNDBs2jFNOOYX169ezcePGGrezaNGiisAdNmwYw4YNq1g2f/58Ro4cyYgRI3j11VfrfGDZc889x8SJE+natSvdunXja1/7Gn/+858BGDBgAMOHDwdqfxQyJM/H37ZtG2PGjAHgwgsvZNGiRRVtnDJlCnPmzKn4BO7o0aO55pprmDVrFtu2bWvyT+b6it6svavlyrs5TZgwge9+97u8+OKL7Nq1i2OPPRaAuXPnsnnzZpYuXUpBQQHFxcXVPpq4Lm+99RZ33HEHL7zwAr169eKiiy5q0HbKlT/iGJLHHNfVdVOTxx9/nEWLFvH73/+e6dOns2LFCqZNm8YZZ5zBE088wejRo3nqqacYOHBgg9tala/ozaxVdOvWjbFjx/LNb36z0puw27dv53Of+xwFBQUsXLiQdevW1bqdL3/5yzzwwAMAvPLKKyxfvhxIHnHctWtXevTowcaNG3nyyScr1unevXu1/eAnnngiv/vd79i1axcffPABjzzyCCeeeGK9j61Hjx706tWr4tXAb37zG8aMGcOePXt4++23GTt2LLfddhvbt29n586dvPHGGxx99NFcd911fPGLX+T111+v9z5r4yt6M2s15557LhMnTqx0B86UKVM466yzOProoykpKanzyvaKK67g4osvZtCgQQwaNKjilcExxxzDiBEjGDhwIP3796/0iOOpU6cyfvx4Dj30UBYuXFhRPnLkSC666CJGjUo+C3rppZcyYsSIWrtpanLfffdx+eWXs2vXLo444gjuvfdedu/ezfnnn8/27duJCK666ip69uzJ97//fRYuXMh+++3HkCFD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\n", 908 | "text/plain": [ 909 | "" 910 | ] 911 | }, 912 | "metadata": {}, 913 | "output_type": "display_data" 914 | } 915 | ], 916 | "source": [ 917 | "%matplotlib inline\n", 918 | "import matplotlib.pyplot as plt\n", 919 | "\n", 920 | "acc = history.history['acc']\n", 921 | "val_acc = history.history['val_acc']\n", 922 | "loss = history.history['loss']\n", 923 | "val_loss = history.history['val_loss']\n", 924 | "\n", 925 | "epochs = range(1 , len(acc) + 1)\n", 926 | "\n", 927 | "plt.plot(epochs, acc, 'ro', label='Training acc')\n", 928 | "plt.plot(epochs, val_acc, 'r', label='Validation acc')\n", 929 | "plt.title('Training and validation accuracy')\n", 930 | "plt.legend()\n", 931 | "\n", 932 | "plt.figure()\n", 933 | "\n", 934 | "plt.plot(epochs, loss, 'ro', label='Training loss')\n", 935 | "plt.plot(epochs, val_loss, 'r', label='Validation loss')\n", 936 | "plt.title('Training and validation loss')\n", 937 | "plt.legend()\n", 938 | "\n", 939 | "plt.show()" 940 | ] 941 | }, 942 | { 943 | "cell_type": "code", 944 | "execution_count": null, 945 | "metadata": {}, 946 | "outputs": [], 947 | "source": [] 948 | } 949 | ], 950 | "metadata": { 951 | "colab": { 952 | "collapsed_sections": [], 953 | "name": "antiphishing.ipynb", 954 | "provenance": [], 955 | "version": "0.3.2" 956 | }, 957 | "kernelspec": { 958 | "display_name": "Python 3", 959 | "language": "python", 960 | "name": "python3" 961 | }, 962 | "language_info": { 963 | "codemirror_mode": { 964 | "name": "ipython", 965 | "version": 3 966 | }, 967 | "file_extension": ".py", 968 | "mimetype": "text/x-python", 969 | "name": "python", 970 | "nbconvert_exporter": "python", 971 | "pygments_lexer": "ipython3", 972 | "version": "3.5.2" 973 | } 974 | }, 975 | "nbformat": 4, 976 | "nbformat_minor": 1 977 | } 978 | -------------------------------------------------------------------------------- /log_model-testing.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zpettry/AI-Autoencoder-for-HTTP-Log-Anomaly-Detection/50aadaa716fa1bef852bffef13140467b5d57d55/log_model-testing.h5 -------------------------------------------------------------------------------- /outliers.txt: -------------------------------------------------------------------------------- 1 | 200 2 | GET /madeup.php HTTP/1.1 3 | 10.4.5.2 4 | ---------------------------------- 5 | GET /profile.php?user=bala HTTP/1.1 6 | 10.130.2.1 7 | 200 8 | ---------------------------------- 9 | GET /edit.php?name=bala HTTP/1.1 10 | 10.131.2.1 11 | 200 12 | ---------------------------------- 13 | 10.131.2.1 14 | 200 15 | GET /contestproblem.php?name=Toph%20Contest%202 HTTP/1.1 16 | ---------------------------------- 17 | 10.131.2.1 18 | GET /details.php?id=3 HTTP/1.1 19 | 200 20 | ---------------------------------- 21 | 10.131.2.1 22 | 200 23 | GET /contestsubmission.php?id=4 HTTP/1.1 24 | ---------------------------------- 25 | 10.131.2.1 26 | 200 27 | GET /edit.php?name=ksrsingh HTTP/1.1 28 | ---------------------------------- 29 | 200 30 | GET /showcode.php?id=285&nm=ksrsingh HTTP/1.1 31 | 10.131.0.1 32 | ---------------------------------- 33 | GET /allsubmission.php?name=shawon HTTP/1.1 34 | 200 35 | 10.128.2.1 36 | ---------------------------------- 37 | 200 38 | 10.129.2.1 39 | GET /login.php HTTP/1.0 40 | ---------------------------------- 41 | 10.131.2.1 42 | 302 43 | GET / HTTP/1.0 44 | ---------------------------------- 45 | GET /profile.php?user=moshiur_cse15 HTTP/1.1 46 | 200 47 | 10.131.0.1 48 | ---------------------------------- 49 | GET /allsubmission.php?name=moshiur_cse15 HTTP/1.1 50 | 200 51 | 10.131.0.1 52 | ---------------------------------- 53 | GET /profile.php?user=toph HTTP/1.1 54 | 200 55 | 10.128.2.1 56 | ---------------------------------- 57 | 10.131.2.1 58 | 200 59 | GET /profile.php?user=DevSkill HTTP/1.1 60 | ---------------------------------- 61 | 200 62 | GET /showcode.php?id=286&nm=Rakib_1603065 HTTP/1.1 63 | 10.131.0.1 64 | ---------------------------------- 65 | 200 66 | 10.128.2.1 67 | GET /showcode.php?id=287&nm=Riyal_RUET HTTP/1.1 68 | ---------------------------------- 69 | 200 70 | 10.128.2.1 71 | GET /showcode.php?id=288&nm=Riyal_RUET HTTP/1.1 72 | ---------------------------------- 73 | 200 74 | GET /profile.php?user=Riyal_RUET HTTP/1.1 75 | 10.128.2.1 76 | ---------------------------------- 77 | GET /submit.php?id=58 HTTP/1.1 78 | 10.130.2.1 79 | 200 80 | ---------------------------------- 81 | GET /submit.php?id=63 HTTP/1.1 82 | 10.131.2.1 83 | 200 84 | ---------------------------------- 85 | GET /profile.php?user=Goni HTTP/1.1 86 | 200 87 | 10.128.2.1 88 | ---------------------------------- 89 | GET /showcode.php?id=294&nm=Rakib_1603065 HTTP/1.1 90 | 200 91 | 10.131.0.1 92 | ---------------------------------- 93 | 200 94 | 10.128.2.1 95 | GET /edit.php?name=Tazbinur%20Rahaman HTTP/1.1 96 | ---------------------------------- 97 | GET /details.php?id=9 HTTP/1.1 98 | 10.130.2.1 99 | 200 100 | ---------------------------------- 101 | GET /contestproblem.php?name=RUET%20OJ%20Final%20Test HTTP/1.1 102 | 200 103 | 10.128.2.1 104 | ---------------------------------- 105 | 200 106 | GET /details.php?id=39 HTTP/1.1 107 | 10.128.2.1 108 | ---------------------------------- 109 | 200 110 | GET /contestsubmission.php?id=14&show=bruce HTTP/1.1 111 | 10.128.2.1 112 | ---------------------------------- 113 | GET /edit.php?name=mahadi HTTP/1.1 114 | 200 115 | 10.131.0.1 116 | ---------------------------------- 117 | GET /allsubmission.php?name=mahadi HTTP/1.1 118 | 200 119 | 10.131.0.1 120 | ---------------------------------- 121 | GET /contestsubmit.php?id=44 HTTP/1.1 122 | 10.130.2.1 123 | 200 124 | ---------------------------------- 125 | 10.131.2.1 126 | 200 127 | GET /profile.php?user=abufarhad HTTP/1.1 128 | ---------------------------------- 129 | 10.130.2.1 130 | 200 131 | GET /contestsubmission.php?id=13&show=abufarhad HTTP/1.1 132 | ---------------------------------- 133 | 10.131.2.1 134 | 200 135 | GET /profile.php?user=superman100 HTTP/1.1 136 | ---------------------------------- 137 | 200 138 | GET /edit.php?name=m.r.saurov HTTP/1.1 139 | 10.128.2.1 140 | ---------------------------------- 141 | 200 142 | GET /profile.php?user=utshab_1603022 HTTP/1.1 143 | 10.131.0.1 144 | ---------------------------------- 145 | 200 146 | 10.131.0.1 147 | GET /contestsubmission.php?id=16&show=utshab_1603022 HTTP/1.1 148 | ---------------------------------- 149 | 200 150 | 10.131.0.1 151 | GET /contestsubmission.php?id=16&show=FFIsty_1603011 HTTP/1.1 152 | ---------------------------------- 153 | 200 154 | 10.129.2.1 155 | GET /editcontestproblem.php?id=41 HTTP/1.1 156 | ---------------------------------- 157 | GET /profile.php?user=PKP HTTP/1.1 158 | 10.131.2.1 159 | 200 160 | ---------------------------------- 161 | 10.131.2.1 162 | 200 163 | GET /description.php?name=Matrix%20For%20My%20Valentine HTTP/1.1 164 | ---------------------------------- 165 | GET /home.php HTTP/1.0 166 | 302 167 | 10.131.0.1 168 | ---------------------------------- 169 | GET /standings.php HTTP/1.0 170 | 302 171 | 10.129.2.1 172 | ---------------------------------- 173 | GET /details.php HTTP/1.0 174 | 302 175 | 10.131.0.1 176 | ---------------------------------- 177 | GET /contestsubmission.php HTTP/1.0 178 | 10.130.2.1 179 | 302 180 | ---------------------------------- 181 | 10.131.2.1 182 | 302 183 | GET /profile.php HTTP/1.0 184 | ---------------------------------- 185 | 200 186 | 10.128.2.1 187 | GET /details.php?name=Adjacency%20List&cod=16 HTTP/1.1 188 | ---------------------------------- 189 | 10.131.2.1 190 | 302 191 | GET /archive.php HTTP/1.0 192 | ---------------------------------- 193 | 200 194 | GET /editcontestproblem.php?id=44 HTTP/1.1 195 | 10.131.0.1 196 | ---------------------------------- 197 | 10.131.2.1 198 | 302 199 | GET /submit.php HTTP/1.0 200 | ---------------------------------- 201 | 10.131.2.1 202 | 200 203 | GET /showcode.php?id=296&nm=bruce HTTP/1.1 204 | ---------------------------------- 205 | 200 206 | 10.129.2.1 207 | GET /pcompile.php HTTP/1.1 208 | ---------------------------------- 209 | 10.130.2.1 210 | 200 211 | GET /profile.php?user=wbreturn HTTP/1.1 212 | ---------------------------------- 213 | GET /fonts/fontawesome-webfont.woff2 HTTP/1.0 214 | 200 215 | 10.131.0.1 216 | ---------------------------------- 217 | 200 218 | GET /contestsubmission.php?id=3 HTTP/1.1 219 | 10.128.2.1 220 | ---------------------------------- 221 | 10.131.2.1 222 | 200 223 | GET /standings.php?id=3 HTTP/1.1 224 | ---------------------------------- 225 | 200 226 | 10.129.2.1 227 | GET /edit.php?name=zerocool HTTP/1.1 228 | ---------------------------------- 229 | GET /allsubmission.php?name=zerocool HTTP/1.1 230 | 10.131.2.1 231 | 200 232 | ---------------------------------- 233 | GET /contestsubmission.php?id=13&show=AYSrizon HTTP/1.1 234 | 200 235 | 10.129.2.1 236 | ---------------------------------- 237 | GET /details.php?name=Magic%20Square&cod=13 HTTP/1.1 238 | 200 239 | 10.128.2.1 240 | ---------------------------------- 241 | 10.130.2.1 242 | 404 243 | GET /css/bootstrap.min.css.map HTTP/1.1 244 | ---------------------------------- 245 | 10.131.2.1 246 | 200 247 | GET /contestshowcode.php?id=339&nm=shawon&cn=13 HTTP/1.1 248 | ---------------------------------- 249 | GET /contestshowcode.php?id=338&nm=shawon&cn=13 HTTP/1.1 250 | 200 251 | 10.129.2.1 252 | ---------------------------------- 253 | 10.131.2.1 254 | 200 255 | GET /contestshowcode.php?id=339&nm=shawon&cn=13 HTTP/1.1 256 | ---------------------------------- 257 | GET /contestshowcode.php?id=338&nm=shawon&cn=13 HTTP/1.1 258 | 200 259 | 10.129.2.1 260 | ---------------------------------- 261 | 200 262 | GET /contestproblem.php?name=ROJ%20Testing%20Contest%201 HTTP/1.1 263 | 10.128.2.1 264 | ---------------------------------- 265 | 200 266 | GET /contestsubmission.php?id=11 HTTP/1.1 267 | 10.129.2.1 268 | ---------------------------------- 269 | 200 270 | GET /profile.php?user=st.zuhori HTTP/1.1 271 | 10.129.2.1 272 | ---------------------------------- 273 | 10.130.2.1 274 | 200 275 | GET /profile.php?user=Shawon_ICT HTTP/1.1 276 | ---------------------------------- 277 | 200 278 | GET /description.php?id=75 HTTP/1.1 279 | 10.129.2.1 280 | ---------------------------------- 281 | 302 282 | GET /action.php HTTP/1.0 283 | 10.131.0.1 284 | ---------------------------------- 285 | 10.130.2.1 286 | 200 287 | GET /profile.php?user=sanaul HTTP/1.1 288 | ---------------------------------- 289 | 200 290 | GET /contestsubmission.php?id=11 HTTP/1.1 291 | 10.129.2.1 292 | ---------------------------------- 293 | 200 294 | GET /contestsubmission.php?id=12&page=2 HTTP/1.1 295 | 10.129.2.1 296 | ---------------------------------- 297 | 200 298 | 10.129.2.1 299 | GET /profile.php?user=saif_1603035 HTTP/1.1 300 | ---------------------------------- 301 | 10.131.2.1 302 | 200 303 | GET /standings.php?id=12 HTTP/1.1 304 | ---------------------------------- 305 | GET /profile.php?user=xyz HTTP/1.1 306 | 10.131.2.1 307 | 200 308 | ---------------------------------- 309 | 10.131.2.1 310 | 200 311 | GET /standings.php?id=12 HTTP/1.1 312 | ---------------------------------- 313 | 200 314 | GET /contestsubmission.php?id=13&page=2 HTTP/1.1 315 | 10.129.2.1 316 | ---------------------------------- 317 | 200 318 | 10.129.2.1 319 | GET /profile.php?user=emrul_mu HTTP/1.1 320 | ---------------------------------- 321 | GET /contestsubmission.php?id=13&page=4 HTTP/1.1 322 | 200 323 | 10.129.2.1 324 | ---------------------------------- 325 | 10.130.2.1 326 | 200 327 | GET /showcode.php?id=222&nm=nasif25 HTTP/1.1 328 | ---------------------------------- 329 | 200 330 | GET /showcode.php?id=193&nm=shawon HTTP/1.1 331 | 10.131.0.1 332 | ---------------------------------- 333 | 10.131.2.1 334 | 200 335 | GET /description.php?name=Google%20feeling%20lucky. HTTP/1.1 336 | ---------------------------------- 337 | 200 338 | 10.128.2.1 339 | GET /editcontest.php?name=RUET%20OJ%20Server%20Testing%20Contest HTTP/1.1 340 | ---------------------------------- 341 | GET /countdown.php?name=Another%20Multiplication%20Game HTTP/1.1 342 | 10.131.2.1 343 | 200 344 | ---------------------------------- 345 | 200 346 | GET /description.php?id=75 HTTP/1.1 347 | 10.129.2.1 348 | ---------------------------------- 349 | GET /countdown.php HTTP/1.0 350 | 302 351 | 10.131.0.1 352 | ---------------------------------- 353 | GET /contestproblem.php HTTP/1.0 354 | 302 355 | 10.129.2.1 356 | ---------------------------------- 357 | 10.130.2.1 358 | GET /logout.php HTTP/1.0 359 | 302 360 | ---------------------------------- 361 | 10.130.2.1 362 | 200 363 | GET /profile.php?user=mkarzymat HTTP/1.1 364 | ---------------------------------- 365 | 200 366 | GET /fonts/fontawesome-webfont.eot?v=4.6.3 HTTP/1.1 367 | 10.128.2.1 368 | ---------------------------------- 369 | 302 370 | 10.128.2.1 371 | GET /action.php HTTP/1.0 372 | ---------------------------------- 373 | GET /logout.php HTTP/1.0 374 | 302 375 | 10.131.0.1 376 | ---------------------------------- 377 | 10.130.2.1 378 | 200 379 | GET /fonts/fontawesome-webfont.eot?v=4.6.3 HTTP/1.1 380 | ---------------------------------- 381 | GET /description.php HTTP/1.0 382 | 302 383 | 10.128.2.1 384 | ---------------------------------- 385 | 10.130.2.1 386 | 200 387 | GET /description.php?name=Google%20feeling%20lucky. HTTP/1.1 388 | ---------------------------------- 389 | GET /profile.php?user=Shawon14012 HTTP/1.1 390 | 200 391 | 10.131.0.1 392 | ---------------------------------- 393 | GET /edit.php?name=Shawon14012 HTTP/1.1 394 | 200 395 | 10.131.0.1 396 | ---------------------------------- 397 | 200 398 | GET /showcode.php?id=300&nm=x HTTP/1.1 399 | 10.131.0.1 400 | ---------------------------------- 401 | 200 402 | GET /showcode.php?id=301&nm=Shawon14012 HTTP/1.1 403 | 10.131.0.1 404 | ---------------------------------- 405 | 200 406 | GET /showcode.php?id=301&nm=Shawon14012 HTTP/1.1 407 | 10.131.0.1 408 | ---------------------------------- 409 | GET /profile.php?user=sammm HTTP/1.1 410 | 200 411 | 10.131.0.1 412 | ---------------------------------- 413 | 10.130.2.1 414 | 200 415 | GET /description.php?id=55%27 HTTP/1.1 416 | ---------------------------------- 417 | 10.130.2.1 418 | 200 419 | GET /details.php?id=35 HTTP/1.1 420 | ---------------------------------- 421 | 10.130.2.1 422 | GET /details.php?id=34 HTTP/1.1 423 | 200 424 | ---------------------------------- 425 | GET /details.php?id=36 HTTP/1.1 426 | 200 427 | 10.131.0.1 428 | ---------------------------------- 429 | GET /details.php?id=37 HTTP/1.1 430 | 200 431 | 10.131.0.1 432 | ---------------------------------- 433 | GET /profile.php?user=uva HTTP/1.1 434 | 200 435 | 10.131.0.1 436 | ---------------------------------- --------------------------------------------------------------------------------