├── Procfile ├── README.md ├── URL Classification.ipynb ├── app.py ├── requirements.txt └── templates └── index.html /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn app:app -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Phishing URL Classification 2 | 3 | Malicious Web sites are a cornerstone of Internet criminal activities. 4 | These Web sites contain various unwanted content such as spam-advertised products, phishing sites, dangerous "drive-by" 5 | harness that infect a visitor's system with malware. The most influential approaches to the malicious 6 | URL problem are manually constructed lists in which all malicious web page`s URLs are listed, as 7 | well as users systems that analyze the content or behavior of a Web site as it is visited. 8 | 9 | The disadvantage of _Blacklisting_ approach is that we have to do the tedious task of searching the list for 10 | presence of the entry. And the list can be very large considering the amount of web sites on the Internet. 11 | Also the list cannot be kept upto date because of the evergrowing growth of web link each and every hour. 12 | 13 | In the given System we are using **Machine-Learning** techniques to classify a URL as either **Safe** or **Unsafe** in _Real Time_ without even the need to download the webpage. 14 | 15 | Algorithms we are using in this system are : 16 | 17 | * [Random Forest] (https://en.wikipedia.org/wiki/Random_forest) 18 | * [Logistic Regression] (https://en.wikipedia.org/wiki/Logistic_regression) 19 | * [Decision Trees] (https://en.wikipedia.org/wiki/Decision+Trees) 20 | * [Gradiant Boosting] 21 | 22 | The system is presently working only on **Lexical** features(Simple text features of a URL) which includes: 23 | 24 | * Length of URL 25 | * Domain Length 26 | * Presence of Ip Address in Host Name 27 | * Presence of Security Sensitive Words in URL 28 | 29 | and many more(around 22 total). The Host Based Features like country code in which site is hosted, creation date, updation date etc. are still yet to be added to the system and increase accuracy of the classifier but increase the _Latency time_ in classifying the URL as we have to query **WHOIS** servers in order to come up with the Host Based Features. 30 | For this query purpose the **PyWhois** module has been used. 31 | 32 | ## About Dataset 33 | For this given system we are using two sources to collect our data,namely: 34 | 35 | #### Phishtank.com 36 | For the phishing/malicious URLs we are collecting data from [Phishtank] (https://www.phishtank.com/). 37 | -------------------------------------------------------------------------------- /URL Classification.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "With this analysis, we explored some important features that have proved to be sound and effective in predicting phishing/malicious websites based on lexical characteristics of URL" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "collapsed": false, 15 | "deletable": true, 16 | "editable": true 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "import os\n", 21 | "import sys\n", 22 | "import re\n", 23 | "import matplotlib\n", 24 | "import pandas as pd\n", 25 | "import numpy as np\n", 26 | "from os.path import splitext\n", 27 | "import ipaddress as ip\n", 28 | "import tldextract\n", 29 | "import whois\n", 30 | "import datetime\n", 31 | "from urllib.parse import urlparse" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 2, 37 | "metadata": { 38 | "collapsed": false, 39 | "deletable": true, 40 | "editable": true 41 | }, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "text/html": [ 46 | "
\n", 47 | "\n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | "
URLLable
0http://www.resumescorecard.com/0
1http://www.colorado.edu/MCEN/flowvis/0
2http://www.winestars.com/0
3http://eqworld.ipmnet.ru/0
4http://advods.com/verty/myaccount/webapps/973f61
\n", 83 | "
" 84 | ], 85 | "text/plain": [ 86 | " URL Lable\n", 87 | "0 http://www.resumescorecard.com/ 0\n", 88 | "1 http://www.colorado.edu/MCEN/flowvis/ 0\n", 89 | "2 http://www.winestars.com/ 0\n", 90 | "3 http://eqworld.ipmnet.ru/ 0\n", 91 | "4 http://advods.com/verty/myaccount/webapps/973f6 1" 92 | ] 93 | }, 94 | "execution_count": 2, 95 | "metadata": {}, 96 | "output_type": "execute_result" 97 | } 98 | ], 99 | "source": [ 100 | "df = pd.read_csv(\"/home/surajr/Dropbox/Projects/Xtras/dataset/dataset.csv\")\n", 101 | "#df=df.sample(frac=1)\n", 102 | "df = df.sample(frac=1).reset_index(drop=True)\n", 103 | "df.head()" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 3, 109 | "metadata": { 110 | "collapsed": false, 111 | "deletable": true, 112 | "editable": true 113 | }, 114 | "outputs": [ 115 | { 116 | "data": { 117 | "text/plain": [ 118 | "7030" 119 | ] 120 | }, 121 | "execution_count": 3, 122 | "metadata": {}, 123 | "output_type": "execute_result" 124 | } 125 | ], 126 | "source": [ 127 | "len(df) #displaying 5 records" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 4, 133 | "metadata": { 134 | "collapsed": true, 135 | "deletable": true, 136 | "editable": true 137 | }, 138 | "outputs": [], 139 | "source": [ 140 | "#2016's top most suspicious TLD and words\n", 141 | "Suspicious_TLD=['zip','cricket','link','work','party','gq','kim','country','science','tk']\n", 142 | "Suspicious_Domain=['luckytime.co.kr','mattfoll.eu.interia.pl','trafficholder.com','dl.baixaki.com.br','bembed.redtube.comr','tags.expo9.exponential.com','deepspacer.com','funad.co.kr','trafficconverter.biz']\n", 143 | "#trend micro's top malicious domains " 144 | ] 145 | }, 146 | { 147 | "cell_type": "markdown", 148 | "metadata": {}, 149 | "source": [ 150 | "Hackers can use long URL to hide the doubtful part in the address bar. For example: \n", 151 | "http://federmacedoadv.com.br/3f/aze/ab51e2e319e51502f416dbe46b773a5e/?cmd=_home&dispatch=11004d58f5b74f8dc1e7c2e8dd4105e811004d58f5b74f8dc1e7c2e8dd4105e8@phishing.website.html\n", 152 | "\n" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 5, 158 | "metadata": { 159 | "collapsed": false, 160 | "deletable": true, 161 | "editable": true 162 | }, 163 | "outputs": [], 164 | "source": [ 165 | "# Method to count number of dots\n", 166 | "def countdots(url): \n", 167 | " return url.count('.')" 168 | ] 169 | }, 170 | { 171 | "cell_type": "code", 172 | "execution_count": 6, 173 | "metadata": { 174 | "collapsed": false, 175 | "deletable": true, 176 | "editable": true 177 | }, 178 | "outputs": [], 179 | "source": [ 180 | "# Method to count number of delimeters\n", 181 | "def countdelim(url):\n", 182 | " count = 0\n", 183 | " delim=[';','_','?','=','&']\n", 184 | " for each in url:\n", 185 | " if each in delim:\n", 186 | " count = count + 1\n", 187 | " \n", 188 | " return count" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "If an IP address is used as an alternative of the domain name in the URL, such as “http://125.98.3.123/fake.html”, users can be sure that someone is trying to steal their personal information. Sometimes, the IP address is even transformed into hexadecimal code as shown in the following link “http://0x58.0xCC.0xCA.0x62/2/paypal.ca/index.html”. " 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 7, 201 | "metadata": { 202 | "collapsed": false, 203 | "deletable": true, 204 | "editable": true 205 | }, 206 | "outputs": [], 207 | "source": [ 208 | "# Is IP addr present as th hostname, let's validate\n", 209 | "\n", 210 | "import ipaddress as ip #works only in python 3\n", 211 | "\n", 212 | "def isip(uri):\n", 213 | " try:\n", 214 | " if ip.ip_address(uri):\n", 215 | " return 1\n", 216 | " except:\n", 217 | " return 0" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 8, 223 | "metadata": { 224 | "collapsed": false, 225 | "deletable": true, 226 | "editable": true 227 | }, 228 | "outputs": [], 229 | "source": [ 230 | "#method to check the presence of hyphens\n", 231 | "\n", 232 | "def isPresentHyphen(url):\n", 233 | " return url.count('-')\n", 234 | " " 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "Using “@” symbol in the URL leads the browser to ignore everything preceding the “@” symbol and the real address often follows the “@” symbol. " 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 9, 247 | "metadata": { 248 | "collapsed": true, 249 | "deletable": true, 250 | "editable": true 251 | }, 252 | "outputs": [], 253 | "source": [ 254 | "#method to check the presence of @\n", 255 | "\n", 256 | "def isPresentAt(url):\n", 257 | " return url.count('@')" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "The existence of “//” within the URL path means that the user will be redirected to another website. An example of such URL’s is: “http://www.legitimate.com//http://www.phishing.com”. We examine the presence of “//”" 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": 10, 270 | "metadata": { 271 | "collapsed": true, 272 | "deletable": true, 273 | "editable": true 274 | }, 275 | "outputs": [], 276 | "source": [ 277 | "def isPresentDSlash(url):\n", 278 | " return url.count('//')" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 11, 284 | "metadata": { 285 | "collapsed": true, 286 | "deletable": true, 287 | "editable": true 288 | }, 289 | "outputs": [], 290 | "source": [ 291 | "def countSubDir(url):\n", 292 | " return url.count('/')" 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "execution_count": 12, 298 | "metadata": { 299 | "collapsed": false, 300 | "deletable": true, 301 | "editable": true 302 | }, 303 | "outputs": [], 304 | "source": [ 305 | "def get_ext(url):\n", 306 | " \"\"\"Return the filename extension from url, or ''.\"\"\"\n", 307 | " \n", 308 | " root, ext = splitext(url)\n", 309 | " return ext" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 13, 315 | "metadata": { 316 | "collapsed": false, 317 | "deletable": true, 318 | "editable": true 319 | }, 320 | "outputs": [], 321 | "source": [ 322 | "def countSubDomain(subdomain):\n", 323 | " if not subdomain:\n", 324 | " return 0\n", 325 | " else:\n", 326 | " return len(subdomain.split('.'))" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": 14, 332 | "metadata": { 333 | "collapsed": false, 334 | "deletable": true, 335 | "editable": true 336 | }, 337 | "outputs": [], 338 | "source": [ 339 | "def countQueries(query):\n", 340 | " if not query:\n", 341 | " return 0\n", 342 | " else:\n", 343 | " return len(query.split('&'))" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": 46, 349 | "metadata": { 350 | "collapsed": true, 351 | "deletable": true, 352 | "editable": true 353 | }, 354 | "outputs": [], 355 | "source": [ 356 | "'''\n", 357 | "featureSet = pd.DataFrame(columns=('url','no of dots','presence of hyphen','len of url','presence of at',\\\n", 358 | "'presence of double slash','no of subdir','no of subdomain','len of domain','no of queries','is IP','presence of Suspicious_TLD',\\\n", 359 | "'presence of suspicious domain','create_age(months)','expiry_age(months)','update_age(days)','country','file extension','label'))'''\n", 360 | "\n", 361 | "featureSet = pd.DataFrame(columns=('url','no of dots','presence of hyphen','len of url','presence of at',\\\n", 362 | "'presence of double slash','no of subdir','no of subdomain','len of domain','no of queries','is IP','presence of Suspicious_TLD',\\\n", 363 | "'presence of suspicious domain','label'))" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 45, 369 | "metadata": { 370 | "collapsed": false, 371 | "deletable": true, 372 | "editable": true 373 | }, 374 | "outputs": [], 375 | "source": [ 376 | "from urllib.parse import urlparse\n", 377 | "import tldextract\n", 378 | "def getFeatures(url, label): \n", 379 | " result = []\n", 380 | " url = str(url)\n", 381 | " \n", 382 | " #add the url to feature set\n", 383 | " result.append(url)\n", 384 | " \n", 385 | " #parse the URL and extract the domain information\n", 386 | " path = urlparse(url)\n", 387 | " ext = tldextract.extract(url)\n", 388 | " \n", 389 | " #counting number of dots in subdomain \n", 390 | " result.append(countdots(ext.subdomain))\n", 391 | " \n", 392 | " #checking hyphen in domain \n", 393 | " result.append(isPresentHyphen(path.netloc))\n", 394 | " \n", 395 | " #length of URL \n", 396 | " result.append(len(url))\n", 397 | " \n", 398 | " #checking @ in the url \n", 399 | " result.append(isPresentAt(path.netloc))\n", 400 | " \n", 401 | " #checking presence of double slash \n", 402 | " result.append(isPresentDSlash(path.path))\n", 403 | " \n", 404 | " #Count number of subdir \n", 405 | " result.append(countSubDir(path.path))\n", 406 | " \n", 407 | " #number of sub domain \n", 408 | " result.append(countSubDomain(ext.subdomain))\n", 409 | " \n", 410 | " #length of domain name \n", 411 | " result.append(len(path.netloc))\n", 412 | " \n", 413 | " #count number of queries \n", 414 | " result.append(len(path.query))\n", 415 | " \n", 416 | " #Adding domain information\n", 417 | " \n", 418 | " #if IP address is being used as a URL \n", 419 | " result.append(isip(ext.domain))\n", 420 | " \n", 421 | " #presence of Suspicious_TLD\n", 422 | " result.append(1 if ext.suffix in Suspicious_TLD else 0)\n", 423 | " \n", 424 | " #presence of suspicious domain\n", 425 | " result.append(1 if '.'.join(ext[1:]) in Suspicious_Domain else 0 )\n", 426 | " \n", 427 | " '''\n", 428 | " \n", 429 | " #Get domain information by asking whois\n", 430 | " domain = '.'.join(ext[1:])\n", 431 | " w = whois.whois(domain)\n", 432 | " \n", 433 | " avg_month_time=365.2425/12.0\n", 434 | " \n", 435 | " \n", 436 | " #calculate creation age in months\n", 437 | " \n", 438 | " if w.creation_date == None or type(w.creation_date) is str :\n", 439 | " result.append(-1)\n", 440 | " #training_df['create_age(months)'] = -1\n", 441 | " else:\n", 442 | " if(type(w.creation_date) is list): \n", 443 | " create_date=w.creation_date[-1]\n", 444 | " else:\n", 445 | " create_date=w.creation_date\n", 446 | "\n", 447 | " if(type(create_date) is datetime.datetime):\n", 448 | " today_date=datetime.datetime.now()\n", 449 | " create_age_in_mon=((today_date - create_date).days)/avg_month_time\n", 450 | " create_age_in_mon=round(create_age_in_mon)\n", 451 | " result.append(create_age_in_mon)\n", 452 | " #training_df['create_age(months)'] = create_age_in_mon\n", 453 | " \n", 454 | " else:\n", 455 | " result.append(-1)\n", 456 | " #training_df['create_age(months)'] = -1\n", 457 | " \n", 458 | " #calculate expiry age in months\n", 459 | " \n", 460 | " if(w.expiration_date==None or type(w.expiration_date) is str):\n", 461 | " #training_df['expiry_age(months)'] = -1\n", 462 | " result.append(-1)\n", 463 | " else:\n", 464 | " if(type(w.expiration_date) is list):\n", 465 | " expiry_date=w.expiration_date[-1]\n", 466 | " else:\n", 467 | " expiry_date=w.expiration_date\n", 468 | " if(type(expiry_date) is datetime.datetime):\n", 469 | " today_date=datetime.datetime.now()\n", 470 | " expiry_age_in_mon=((expiry_date - today_date).days)/avg_month_time\n", 471 | " expiry_age_in_mon=round(expiry_age_in_mon)\n", 472 | " #training_df['expiry_age(months)'] = expiry_age_in_mon\n", 473 | " #### appending in months Appended to the Vector\n", 474 | " result.append(expiry_age_in_mon)\n", 475 | " else:\n", 476 | " #training_df['expiry_age(months)'] = -1\n", 477 | " result.append(-1)#### expiry date error so append -1\n", 478 | "\n", 479 | " #find the age of last update\n", 480 | " \n", 481 | " if(w.updated_date==None or type(w.updated_date) is str):\n", 482 | " #training_df['update_age(days)'] = -1\n", 483 | " result.append(-1)\n", 484 | " else:\n", 485 | " if(type(w.updated_date) is list):\n", 486 | " update_date=w.updated_date[-1]\n", 487 | " else:\n", 488 | " update_date=w.updated_date\n", 489 | " if(type(update_date) is datetime.datetime):\n", 490 | " today_date=datetime.datetime.now()\n", 491 | " update_age_in_days=((today_date - update_date).days)\n", 492 | " result.append(update_age_in_days)\n", 493 | " #training_df['update_age(days)'] = update_age_in_days #### appending updated age in days Appended to the Vector\n", 494 | " else:\n", 495 | " result.append(-1)\n", 496 | " #training_df['update_age(days)'] = -1\n", 497 | " \n", 498 | " #find the country who is hosting this domain\n", 499 | " if(w.country == None):\n", 500 | " #training_df['country'] = \"None\"\n", 501 | " result.append(\"None\")\n", 502 | " else:\n", 503 | " #training_df['country'] = w.country\n", 504 | " result.append(w.country)\n", 505 | " ''' \n", 506 | " \n", 507 | " #result.append(get_ext(path.path))\n", 508 | " result.append(str(label))\n", 509 | " return result\n", 510 | " \n", 511 | " #Yay! finally done! \n", 512 | "\n", 513 | "\n" 514 | ] 515 | }, 516 | { 517 | "cell_type": "markdown", 518 | "metadata": {}, 519 | "source": [ 520 | "a phishing website lives for a short period of time, we believe that trustworthy domains are regularly paid for several years in advance. But whois server takes few requests per day. So I commented out for now." 521 | ] 522 | }, 523 | { 524 | "cell_type": "code", 525 | "execution_count": 47, 526 | "metadata": { 527 | "collapsed": false, 528 | "deletable": true, 529 | "editable": true 530 | }, 531 | "outputs": [], 532 | "source": [ 533 | "for i in range(len(df)):\n", 534 | " features = getFeatures(df[\"URL\"].loc[i], df[\"Lable\"].loc[i]) \n", 535 | " featureSet.loc[i] = features " 536 | ] 537 | }, 538 | { 539 | "cell_type": "code", 540 | "execution_count": 48, 541 | "metadata": { 542 | "collapsed": false, 543 | "deletable": true, 544 | "editable": true 545 | }, 546 | "outputs": [ 547 | { 548 | "data": { 549 | "text/html": [ 550 | "
\n", 551 | "\n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | "
urlno of dotspresence of hyphenlen of urlpresence of atpresence of double slashno of subdirno of subdomainlen of domainno of queriesis IPpresence of Suspicious_TLDpresence of suspicious domainlabel
0http://www.resumescorecard.com/0.00.031.00.00.01.01.023.00.00.00.00.00
1http://www.colorado.edu/MCEN/flowvis/0.00.037.00.00.03.01.016.00.00.00.00.00
2http://www.winestars.com/0.00.025.00.00.01.01.017.00.00.00.00.00
3http://eqworld.ipmnet.ru/0.00.025.00.00.01.01.017.00.00.00.00.00
4http://advods.com/verty/myaccount/webapps/973f60.00.047.00.00.04.00.010.00.00.00.00.01
\n", 659 | "
" 660 | ], 661 | "text/plain": [ 662 | " url no of dots \\\n", 663 | "0 http://www.resumescorecard.com/ 0.0 \n", 664 | "1 http://www.colorado.edu/MCEN/flowvis/ 0.0 \n", 665 | "2 http://www.winestars.com/ 0.0 \n", 666 | "3 http://eqworld.ipmnet.ru/ 0.0 \n", 667 | "4 http://advods.com/verty/myaccount/webapps/973f6 0.0 \n", 668 | "\n", 669 | " presence of hyphen len of url presence of at presence of double slash \\\n", 670 | "0 0.0 31.0 0.0 0.0 \n", 671 | "1 0.0 37.0 0.0 0.0 \n", 672 | "2 0.0 25.0 0.0 0.0 \n", 673 | "3 0.0 25.0 0.0 0.0 \n", 674 | "4 0.0 47.0 0.0 0.0 \n", 675 | "\n", 676 | " no of subdir no of subdomain len of domain no of queries is IP \\\n", 677 | "0 1.0 1.0 23.0 0.0 0.0 \n", 678 | "1 3.0 1.0 16.0 0.0 0.0 \n", 679 | "2 1.0 1.0 17.0 0.0 0.0 \n", 680 | "3 1.0 1.0 17.0 0.0 0.0 \n", 681 | "4 4.0 0.0 10.0 0.0 0.0 \n", 682 | "\n", 683 | " presence of Suspicious_TLD presence of suspicious domain label \n", 684 | "0 0.0 0.0 0 \n", 685 | "1 0.0 0.0 0 \n", 686 | "2 0.0 0.0 0 \n", 687 | "3 0.0 0.0 0 \n", 688 | "4 0.0 0.0 1 " 689 | ] 690 | }, 691 | "execution_count": 48, 692 | "metadata": {}, 693 | "output_type": "execute_result" 694 | } 695 | ], 696 | "source": [ 697 | "featureSet.head()" 698 | ] 699 | }, 700 | { 701 | "cell_type": "code", 702 | "execution_count": 28, 703 | "metadata": { 704 | "collapsed": true, 705 | "deletable": true, 706 | "editable": true 707 | }, 708 | "outputs": [], 709 | "source": [ 710 | "import matplotlib.pyplot as plt\n", 711 | "import pandas as pd\n", 712 | "import seaborn as sns\n", 713 | "import pickle as pkl\n", 714 | "from __future__ import division" 715 | ] 716 | }, 717 | { 718 | "cell_type": "markdown", 719 | "metadata": {}, 720 | "source": [ 721 | "Lets visualize the data" 722 | ] 723 | }, 724 | { 725 | "cell_type": "markdown", 726 | "metadata": {}, 727 | "source": [ 728 | " URL length Distributions of both Malicious as well as Benign URLs. " 729 | ] 730 | }, 731 | { 732 | "cell_type": "code", 733 | "execution_count": 29, 734 | "metadata": { 735 | "collapsed": false, 736 | "deletable": true, 737 | "editable": true 738 | }, 739 | "outputs": [ 740 | { 741 | "data": { 742 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFnCAYAAACcvYGMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtclGX+//HXPTMgIIiAgHgqs9TCQ6uZGptYSZjt2mEr\nsVW/9au1tqzc1czIkt3UVks7kJsdbNvOfC23rC113cxvm6SVu5q2VmoZpHJQQRAVZ+b+/TEyMhwE\nlMMt9/v5ePRYZu65Z64PLLy9rvu6r8swTdNERERELMPR0g0QERGRQApnERERi1E4i4iIWIzCWURE\nxGIUziIiIhajcBYREbEYhbNIDXJzcznvvPOqPb906VJuuummGs/JzMzkgQceqPb8unXrSElJaewm\n1mjjxo1s3boVOHFbK8vNzaVXr16MHDmS1NRUkpOTmTx5Mtu3b/e/Ztq0aXz00UcnfJ8PPviA0tLS\nGo/Nnz+fN954A4BevXqxZ8+eelbks2PHDj7//HMA/vGPf3D//fc36HyR042rpRsgIo3n7bffZuDA\ngfTu3btB5zmdTpYvXw6Ax+MhKyuLX//617z++uucddZZzJs3r873eOqppxgwYADh4eHVjk2ZMqVB\n7alq1apVuN1uBg0aREpKSrP9Y0ekpSicRU5SZmYmeXl5bN26lV/84hcn9R579uwhIyOD77//HoD0\n9HSSk5PJzc0lLS2NiRMnsmTJEoqKirj//vsZNWoUR44cYdq0aWzYsIFzzjmH8847j8LCQvr378+7\n777LRx99xL59+4iMjATgj3/8I//6178ICgri8ccfp2fPnidsk9Pp5MYbbyQvL4+FCxcyf/58xo8f\nz3XXXcdVV13F448/7g/y+Ph4Hn30UZ544gm+//57xo8fzyOPPMJbb71FZGQka9eu5Y477mDNmjV0\n69aNO+64A4D333+fd999l5KSEn7zm9/w61//mqVLl7Js2TJeeuklAP/jCRMm8OyzzxIUFMSBAwfo\n2bOn/3VFRUXMnDmTrVu34nQ6ufrqq5k4cSLg66HPnTuXl156icLCQm699dZ6jSSIWIGGtUVOwZo1\na3juuedO+o/+fffdR+/evVmxYgXPPfcc06ZNY//+/QDs378fh8PBe++9R3p6Ok888QQAS5YsIT8/\nn9WrV/Pwww+zdOlSAMaOHUu/fv249957ufnmmwHfMPe1117LypUrGTx4sD/46uOyyy5j3bp1Ac99\n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\n8MH7ePHF19i8eRM//riTv/51MV6vl/btowDfEPPZZ58DQFxcHKWlpf732rnze/+14aFDk3A6j69d\n3b//z/znFBcX16tthmEAUFpayqRJEwH44YfvufzykVx77Q21nnfhhUNIT7+XkpISLrnkMvr06Vfr\naxtDneG8fv16du7cSVZWFtu3byc9PZ2srCz/8VmzZrF48WLi4+MZN24cqampXH/99Vx//fX+8z/8\n8MOmq+AUvLzlL/W6fiIiIifnjDPOpE2bNuTn5+FyBfHww3Pp0KFDwGsqBy74erKVv3Y4fMcNw/CH\na9XzKp8D0L59FKWlgbsdFhXtJybG99mVrzk//fQTxMbG4nLVHolnnXU2L730BuvXf8aiRU9z5ZWj\nueKKX9RZ/8mqc1g7OzubESNGANCjRw+Ki4v9/6rJyckhMjKShIQEHA4HycnJZGdnB5y/cOFC7rjj\njiZouoiIWN2BA8Xs3buX2Ng4zjuvD5988jEAX375OStXLq/z/M6du/DNN18DsH79Z3g8nnp97rnn\nJrJp038oKioCICfnR3bv3kX37mdVe+1NN93K0qVLTjhUvWrVCnbs2MawYcP5zW/u4Jtv/luvdpys\nOnvOhYWFJCYm+h9HR0dTUFBAeHg4BQUFREdHBxzLycnxP960aRMJCQnExsY2crNFRMSqKq45A5SX\nl/O7391LUFAQt9wykTlz/sCqVSuOXSadWed7XXTRxfz978v47W9v4Wc/G0i7dpH1akNUVBS/+929\npKdPxel04nQ6efDBhwkODq722vDwcG68cQJPP/04GRmzAZgz54+EhIQAMHDgIC666GIee2wOoaFh\nOBwOJk++t77fjpNimFXHAqp48MEHSU5O9veex44dy5w5c+jevTsbNmxg8eLFLFy4EIAlS5aQk5PD\n73//ewAeeughrrzySgYPHlxnQ9xuT7Pv6fncl88xceDEZv1MERGpv6KiItatW0dqaip5eXn8z//8\nD8uX193jPt3V2XOOi4sL6Orn5+f7e8JVj+Xl5REXF+d/vG7dOmbMmFGvhuzfX1bvRp+M2NgICgoC\nrz+UlByu9tzpoKZaTmetqZ7WVAu0rnpUi3WdqB632+Sdd95j0aLnME0vd9wx2dK1N+RnExsbUeux\nOsM5KSmJzMxM0tLS2LJlC3FxcYSHhwPQpUsXSktLyc3NpWPHjqxevZrHHnsM8AV127ZtaxxCEBER\n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\nKz1dNL3SHszXNewtr2yEZjWmsJZugIiIzYQc+68ujZFndYZzXFwchYWF/sf5+fnExsbWeCwvL4+4\nuDiCgoJqPUdEREROrM7ZQ0lJSaxYsQKALVu2EBcX5x+e7tKlC6WlpeTm5uJ2u1m9ejVJSUknPEdE\nREROzDDrMeb82GOP8cUXX2AYBjNnzuTrr78mIiKClJQUPv/8cx577DEALr/8cm655ZYaz+ndu3fT\nViIiItJK1CucRUREpPnoplgRERGLUTiLiIhYTINvpTodzZkzh40bN2IYBunp6fTr16+lm1Qv8+bN\n48svv8TtdnPbbbfx0UcfsWXLFtq3bw/ALbfcwvDhw1m2bBl//etfcTgc3HDDDVx//fUt3PJA69at\n45577uGcc84BoGfPntx6661MmzYNj8dDbGwsjz76KMHBwZavZcmSJSxbtsz/ePPmzfTp04eysjLC\nwnw3uN1333306dOHF154geXLl2MYBpMmTSI5Obmlml3Nt99+yx133MFNN93EuHHj2L17d71/HkeP\nHmX69Ons2rULp9PJI488Qteu9V91rzlquf/++3G73bhcLh599FFiY2NJTExkwIAB/vNeeuklvF6v\npWqB6vVMnz693r/3Vv/Z3H333ezf77ultaioiPPPP5/bbruNX/7yl/Tp0weAqKgonnrqKUpKSpgy\nZQolJSWEhYUxf/58//egJVT9e9y3b9+m/Z0xW7l169aZEydONE3TNLdt22becMMNLdyi+snOzjZv\nvfVW0zRNc9++fWZycrJ53333mR999FHA6w4ePGhefvnl5oEDB8xDhw6ZV155pbl///6WaHKtPvvs\nM/Ouu+4KeG769OnmBx98YJqmac6fP9987bXXTotaKlu3bp2ZkZFhjhs3zvzmm28Cjv3444/mNddc\nYx45csTcu3evmZqaarrd7hZqaaCDBw+a48aNM2fMmGG+8sorpmk27OexdOlSMyMjwzRN0/zkk0/M\ne+65x1K1TJs2zfz73/9umqZpvvrqq+bcuXNN0zTNCy+8sNr5VqrFNGuupyG/91aqp6ZaKps+fbq5\nceNGMycnx7zmmmuqHc/MzDSff/550zRN88033zTnzZvX5G2uTU1/j5v6d6bVD2vXtvyo1Q0aNIgn\nn3wSgHbt2nHo0CE8nuo7Y23cuJG+ffsSERFBSEgIAwYMYMOGDc3d3AZbt24dl112GQCXXHIJ2dnZ\n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\n", 743 | "text/plain": [ 744 | "" 745 | ] 746 | }, 747 | "metadata": {}, 748 | "output_type": "display_data" 749 | } 750 | ], 751 | "source": [ 752 | "sns.set(style=\"darkgrid\")\n", 753 | "sns.distplot(featureSet[featureSet['label']=='0']['len of url'],color='green',label='Benign URLs')\n", 754 | "sns.distplot(featureSet[featureSet['label']=='1']['len of url'],color='red',label='Phishing URLs')\n", 755 | "sns.plt.title('Url Length Distribution')\n", 756 | "plt.legend(loc='upper right')\n", 757 | "plt.xlabel('Length of URL')\n", 758 | "\n", 759 | "sns.plt.show()" 760 | ] 761 | }, 762 | { 763 | "cell_type": "markdown", 764 | "metadata": {}, 765 | "source": [ 766 | "Number of Dots Distributions of both Malicious as well as Benign URLs." 767 | ] 768 | }, 769 | { 770 | "cell_type": "code", 771 | "execution_count": 30, 772 | "metadata": { 773 | "collapsed": false, 774 | "deletable": true, 775 | "editable": true 776 | }, 777 | "outputs": [ 778 | { 779 | "data": { 780 | "image/png": "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\nb775ptT+devWLXPbVwa41Wrl9OnTVRrjyZMni+2nbt26ZGdn2x97eHjY/202m+3Tw5edOnUKm81W\nrEZPT09OnjxZ6TE8/PDDfPnll6VOM5enTp06ADg5Odn/fXmcFy9etD/29va2//vyc5Wbm8vatWvt\noTN//nwuXLhgX6+s5/7kyZN4enraH3t6ehZ7vq7W4cOH8fX1rfR2Q0NDeeSRR1iyZAldunTh6aef\nJj8/v9x9XPnaODk5FXturmy32Wz8+pYJRUVFmM1m++O2bduSnJxMcnIykyZNwsPDg27dulW6Xvlt\nU1CL4aSkpNCpUydcXFyKtbdq1YqlS5eSmprKXXfdxVNPPXXV2/7ll1+K/btu3bolgrQy4V2vXj1O\nnTplf3zq1Cnq1atX6XF4e3vj5ORUbDynTp2yHxlWhrOzM1FRUTz33HPFguLXoXLlPq5Gac+Vv78/\no0aNsofO1q1b2bBhQ4Xbutbn60q7d+/mwoUL3HHHHVe13cGDB/PGG2+wefNm9u/fX+Kb81Xh7e2N\nyWQqMWPyww8/cPPNN5faZ8CAAWRmZrJ169Zr3r/8NiioxTAuf+s7Pj6eSZMmFVv2zTffMGHCBPLz\n83FxcaFNmzaYTCYALBaL/YtFFdm0aRMXL14kOzubPXv20KFDB/z8/MjMzCQ7O5uioiLeffdd+/pl\nbbtXr14kJSVRVFTEuXPneOedd8o8n1wai8XCXXfdZQ+5n376id27d9O1a9dKbwMunc+3Wq1s2rTJ\n3ubn52c/9/7ZZ5/xww8/XNU2L7v8PPznP//Bzc2Nxo0b07dvX9555x3y8vIAeP311/nnP/9Z4bZ6\n9erF1q1bycnJsfe7mufrsq+//ponn3ySiRMn4ubmVu52r3ztVqxYQVJSEgD169fnlltusb9/roWb\nmxv9+/dn6dKl9iP0L7/8krfffrvMXxxYLBbGjx/PokWLSv1Cm8iv6edZUuPCw8Mxm82cOXOGJk2a\nsHr16hJfsmnWrBm33HIL99xzD87OztSpU4fZs2cDEBwczOTJk5kwYUKF+woICGDAgAGcPHmSv/zl\nL/zhD38A4MEHH6R///40bNiQ++67j6+++gq4dH523bp1PPjgg0RFRRUb86FDh/jTn/6EyWQiJCSE\n0NDQq6r76aefZubMmbz11ls4Ozvz7LPPlnkUVp7p06fTv39/++NHH32UyZMn8+9//5tOnTpVaYrV\n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\na+vUqVMNjabqzp49axs2bJht5syZtoSEBJvNZrNFR0fbNm/ebLPZbLa4uDjb3//+92J9Kvp7NZrS\naoyKirJt2rTJZrPZbImJibb58+cX61PR+9lISqtv2rRptg8++KDMPo7wGl4pOjralpGRUaztzTff\ntMXGxt6oIZbJYaa+y7pUKcChQ4eoW7cuN998M05OTvTs2ZPU1NSaHG6VdOzYkSVLLl31yNPTk7y8\nPIqKimp4VDeGo7yGV1qxYgVjxoyp6WFcMxcXF9asWYO/v7+9LS0tjb59+wLQu3fvEq9VeX+vRlRa\njU899RTBwcEAeHt7c+rUqZoa3jUrrb6KOMJreNl3331Hbm6uYWcEHCaos7Ky8Pb2tj++fKlSgMzM\nTHx8fEpdVpuYzWbc3d0BSEpKokePHiWmRZ966imGDBnCokWLKnUVOKP59ttvGTVqFEOGDOE///mP\nvd1RXsPLvvjiC26++eYSF//Jz88nMjKSwYMHs27duhoa3dWxWCy4uroWa8vLy7NPdfv6+pZ4rcr7\nezWi0mp0d3fHbDZTVFTEq6++yr333luiX1nvZ6MprT6AxMREhg8fzqRJkzh58mSxZY7wGl72yiuv\nMGzYsFKXffLJJ0RERPCXv/yFL7/88noOsUwOdY76SrUxpCpr27ZtJCUl8fLLxS/3OGHCBLp3707d\nunUZO3YsKSkphISE1NAor95tt93GuHHjCA0N5dChQwwfPpwtW7aUOLfpCJKSkrj//vtLtEdFRfHn\nP/8Zk8nEsGHD6NChAwEBATUwwupTmb/F2vr3WlRURFRUFHfeeSddunQptqy2v5/vu+8+vLy8aNmy\nJatXr2b58uXMnj27zPVr62uYn5/Pnj17mDNnTollgYGB+Pj40KtXLz777DOmTZvGu+++e8PH6DBH\n1OVdqvTXy44fP35VUzxG8vHHH7Ny5UrWrFmD1Vr8mrT9+/fH19cXi8VCjx49OHDgQA2Nsmrq169P\nWFgYJpOJxo0bU69ePY4fPw441msIl6aG27VrV6J9yJAh1KlTB3d3d+68885a9xpe5u7uzvnz54HS\nXytHubTw9OnTufXWWxk3blyJZeW9n2uDLl260LJlS+DSF1V//V50lNfw008/LXPKu0mTJvYv0LVr\n146TJ0/WyOlGhwnq8i5Vesstt3DmzBl+/vlnCgsL2b59O926davJ4VZJbm4uCxYsYNWqVfZvYl65\n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\n", 781 | "text/plain": [ 782 | "" 783 | ] 784 | }, 785 | "metadata": {}, 786 | "output_type": "display_data" 787 | } 788 | ], 789 | "source": [ 790 | "x=featureSet[featureSet['label']=='0']['no of dots']\n", 791 | "y=featureSet[featureSet['label']=='1']['no of dots']\n", 792 | "plt.hist(x,bins=8, alpha=0.9, label='Benign URLs',color='blue')\n", 793 | "#sns.distplot(x,bins=8,color='blue',label='Benign URLs')\n", 794 | "plt.hist(y,bins=10, alpha=0.6, label='Malicious URLs',color='red')\n", 795 | "#sns.distplot(y,bins=8,color='red',label='Malicious URLs')\n", 796 | "plt.legend(loc='upper right')\n", 797 | "plt.xlabel('Number of Dots')\n", 798 | "plt.title('Distribution of Number of Dots in URL')\n", 799 | "plt.show()" 800 | ] 801 | }, 802 | { 803 | "cell_type": "markdown", 804 | "metadata": {}, 805 | "source": [ 806 | "Domain length Distributions of both Malicious as well as Benign URLs." 807 | ] 808 | }, 809 | { 810 | "cell_type": "code", 811 | "execution_count": 31, 812 | "metadata": { 813 | "collapsed": false, 814 | "deletable": true, 815 | "editable": true 816 | }, 817 | "outputs": [ 818 | { 819 | "data": { 820 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFnCAYAAACcvYGMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VNXh///XnSXrTPaEHQQEgghalLpgBRWE6sdq1Z+k\nFvi01VJrqdWvW0210Ir4wa1WsS4Vq3SxqUjdK0pFayWIuECLoogsCUsyIdtM9pm5vz9uZkgge2aS\nQN7Px4NHZu565gR4zzn33HMN0zRNREREpM+w9XYBREREpDmFs4iISB+jcBYREeljFM4iIiJ9jMJZ\nRESkj1E4i4iI9DEKZ+kXxo0bx8yZM5k1axZnn302P/rRj/j444975Nxbtmzhqquu6tQ+77//PjNn\nzoxSiZrbvHkz27ZtA2D16tV873vfa3efwsJCxo0bx+zZs5k1axbTpk3j+uuvZ8eOHeFtbrnlFt56\n6602j/Paa6/h8/laXHf//ffz7LPPAtbv78CBAx38RJavvvqKDz74AIA333yT2267rVP7i/QmR28X\nQKSn/PGPf2TgwIGYpsnrr7/Otddey0MPPcSUKVOiet5JkyaxYsWKqJ6jO55//nlOOeUUsrOzO7Wf\n3W7n9ddfByAQCJCXl8d3v/td/vKXvzBq1Cjuueeedo/x0EMPMXnyZFwu1xHrbrzxxk6V53Br167F\n7/czZcoUZs6c2WNfdkQiQeEs/Y5hGHzzm9/E5/Nx//3389e//pW6ujruuusu3n//fWw2G9OmTePm\nm2/Gbrdz7rnn8v3vf5/Vq1dTVFTE4sWLyc/P59133yUtLY3f//73JCcn8/HHH3PnnXdSXV2NzWbj\n9ttv58wzz+T999/n9ttv58033+Thhx+mrKyMoqIitm3bRmpqKr/73e/IysrqcPkPHDjA4sWL2blz\nJwC5ublMmzaNwsJCcnJyWLBgAc899xzl5eXcdtttXHDBBdTV1XHLLbfw0UcfMWbMGE444QRKSko4\n6aSTePHFF3nrrbcoLS0lOTkZgF//+tf8+9//xul08pvf/IaxY8e2WSa73c6VV15JUVERjzzyCPff\nfz/z5s3j8ssv5+KLL+Y3v/lNOMgHDBjAvffey4MPPsjOnTuZN28ed999N6tWrSI5OZn169dz7bXX\n8s477zB8+HCuvfZaAF555RVefPFFvF4vP/zhD/nud7/L6tWreemll3j66acBwu/nz5/P448/jtPp\n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\nsePLI45hmib337+Me+/9LY8+uoJNmzY2685+8snH+J//uZjly5/g29++nKeeeqLV8jz/fB4LF97A\n8uVPMGPG+VRUlHf5s5WWHuSzz7YyatToVrf561//xJIl9/DooyvIzh7f7W54dWuLiEhEnHPOeaxd\nu4b09HQyMzOJj48Pr0tKSuK2224ErEdCthSW5eVlxMTEkJpqPVbynnsebLb+888/45prFgIwefKp\nPP30k22UZQb33ns3558/mxkzZoWfTNWWpk+/euutN9m27VPq6+spLT3I9dffTGpqGnV1LT+mcsaM\nWeTm3sysWd9kxoxZxMbGtXu+tqjlLCIiEXHqqafx0UcfsnbtG0yffl54eUNDAw88cA+/+tVSli9/\nghNOOLHF/W02G8FgW497MMKPiWxo8GMYtmaBCoS7r2fPvpCHH36M5OQUbr31Bnbv3tVsu5SUVLze\nQ8+QLisraxbg5547k+XLn+Chhx4jNjaWsWPHtfnZ5837PnfddS/BYJDrrvtxt1rqoHAWEZEIcTqd\nnHzy13j11ReZOvXs8PLq6irsdjvp6RkUFR1g27bPWrwGnJycQjAYwOMpxjRNbrnlerzeQw+ZGD/+\nhHC3+SeffEh29ngSEhIpKyvFNE0OHixh375CAJ5++knsdgcXX3wp5513Prt2fdXsXKeeOoU1a14N\nv3/llRc47bQzjyhTXFwc3/ve1Tz00AOtfu5gMMjjjz9CRkYGOTlzOfHEiRw4cKCDtdYydWuLiEjE\nnHPODMrLy3C5XOFlyckpTJlyGldfPZ/jjx/DlVfO46GHHuCKK75zxP433vhzbr/9VgDOPXcGbveh\nJzddffU13H33nbz88gs4HE5uu+0OkpKSOPXUr4ePPWaM1cIdMGAg119/LW53Em63m5ycuc3O861v\nXcpjjy3nmmt+gN1uZ8SI47juuhtb/EwzZ85m9eq/sXHjBk46aXyzx2MCXHvtdSQkJPKjH30fl8vF\n4MFDGDNmbNcrET0yssceGblypfOYe3Tk0fDoub5Kddc9qr+uU911T089MlLd2iIiIn2MwllERKSP\nUTiLiIj0MQpnERGRPkbhLCIi0sconEVERPoYhbOIiEgfo3AWERHpYxTOPSg0KYmIiEhbFM4iIiJ9\njMJZRESkj1E4i4iI9DEKZxERkT5G4SwiItLHKJxFRET6GIWziIhIH9OhcF66dClz5swhJyeHLVu2\n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\nYII=\n", 821 | "text/plain": [ 822 | "" 823 | ] 824 | }, 825 | "metadata": {}, 826 | "output_type": "display_data" 827 | } 828 | ], 829 | "source": [ 830 | "sns.set(style=\"darkgrid\")\n", 831 | "sns.distplot(featureSet[featureSet['label']=='0']['len of domain'],color='blue',label='Benign URLs')\n", 832 | "sns.distplot(featureSet[featureSet['label']=='1']['len of domain'],color='red',label='Malicious URLs')\n", 833 | "sns.plt.title('Domain Length Distribution')\n", 834 | "plt.legend(loc='upper right')\n", 835 | "plt.xlabel('Length of Domain/Host')\n", 836 | "sns.plt.show()" 837 | ] 838 | }, 839 | { 840 | "cell_type": "code", 841 | "execution_count": 36, 842 | "metadata": { 843 | "collapsed": false, 844 | "deletable": true, 845 | "editable": true 846 | }, 847 | "outputs": [ 848 | { 849 | "data": { 850 | "text/plain": [ 851 | "'\\nsns.set(style=\"whitegrid\")\\nsns.distplot(featureSet[featureSet[\\'label\\']==0][\\'create_age(months)\\'],color=\\'green\\',label=\\'Benign URLs\\')\\nsns.distplot(featureSet[featureSet[\\'label\\']==1][\\'create_age(months)\\'],color=\\'red\\',label=\\'Malicious URLs\\')\\nsns.plt.title(\\'Creation Age Distribution\\')\\nplt.legend(loc=\\'upper right\\')\\nplt.xlabel(\\'Age of Domain (Months)\\')\\nsns.plt.show()\\n'" 852 | ] 853 | }, 854 | "execution_count": 36, 855 | "metadata": {}, 856 | "output_type": "execute_result" 857 | } 858 | ], 859 | "source": [ 860 | "'''\n", 861 | "sns.set(style=\"whitegrid\")\n", 862 | "sns.distplot(featureSet[featureSet['label']==0]['create_age(months)'],color='green',label='Benign URLs')\n", 863 | "sns.distplot(featureSet[featureSet['label']==1]['create_age(months)'],color='red',label='Malicious URLs')\n", 864 | "sns.plt.title('Creation Age Distribution')\n", 865 | "plt.legend(loc='upper right')\n", 866 | "plt.xlabel('Age of Domain (Months)')\n", 867 | "sns.plt.show()\n", 868 | "'''" 869 | ] 870 | }, 871 | { 872 | "cell_type": "markdown", 873 | "metadata": { 874 | "deletable": true, 875 | "editable": true 876 | }, 877 | "source": [ 878 | "I can query minimal URL's per day using whois to get domain information. Waiting to get complete feature set, hence commented out" 879 | ] 880 | }, 881 | { 882 | "cell_type": "code", 883 | "execution_count": 39, 884 | "metadata": { 885 | "collapsed": false, 886 | "deletable": true, 887 | "editable": true 888 | }, 889 | "outputs": [ 890 | { 891 | "name": "stderr", 892 | "output_type": "stream", 893 | "text": [ 894 | "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 895 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 896 | ] 897 | } 898 | ], 899 | "source": [ 900 | "import sklearn.ensemble as ek\n", 901 | "from sklearn import cross_validation, tree, linear_model\n", 902 | "from sklearn.feature_selection import SelectFromModel\n", 903 | "from sklearn.externals import joblib\n", 904 | "from sklearn.naive_bayes import GaussianNB\n", 905 | "from sklearn.metrics import confusion_matrix\n", 906 | "from sklearn.pipeline import make_pipeline\n", 907 | "from sklearn import preprocessing\n", 908 | "from sklearn import svm\n", 909 | "from sklearn.linear_model import LogisticRegression\n" 910 | ] 911 | }, 912 | { 913 | "cell_type": "markdown", 914 | "metadata": { 915 | "deletable": true, 916 | "editable": true 917 | }, 918 | "source": [ 919 | "Let's just see the number of Benign and Phishin/Malicious emails" 920 | ] 921 | }, 922 | { 923 | "cell_type": "code", 924 | "execution_count": 40, 925 | "metadata": { 926 | "collapsed": false, 927 | "deletable": true, 928 | "editable": true 929 | }, 930 | "outputs": [ 931 | { 932 | "data": { 933 | "text/plain": [ 934 | "label\n", 935 | "0 3494\n", 936 | "1 3536\n", 937 | "dtype: int64" 938 | ] 939 | }, 940 | "execution_count": 40, 941 | "metadata": {}, 942 | "output_type": "execute_result" 943 | } 944 | ], 945 | "source": [ 946 | "featureSet.groupby(featureSet['label']).size()" 947 | ] 948 | }, 949 | { 950 | "cell_type": "markdown", 951 | "metadata": { 952 | "deletable": true, 953 | "editable": true 954 | }, 955 | "source": [ 956 | "Separate label and feature set. It would have been nice if I had domain features too. " 957 | ] 958 | }, 959 | { 960 | "cell_type": "code", 961 | "execution_count": 49, 962 | "metadata": { 963 | "collapsed": false, 964 | "deletable": true, 965 | "editable": true 966 | }, 967 | "outputs": [], 968 | "source": [ 969 | "X = featureSet.drop(['url','label'],axis=1).values\n", 970 | "y = featureSet['label'].values" 971 | ] 972 | }, 973 | { 974 | "cell_type": "markdown", 975 | "metadata": {}, 976 | "source": [ 977 | "### Time for Machine Learning" 978 | ] 979 | }, 980 | { 981 | "cell_type": "code", 982 | "execution_count": 50, 983 | "metadata": { 984 | "collapsed": true, 985 | "deletable": true, 986 | "editable": true 987 | }, 988 | "outputs": [], 989 | "source": [ 990 | "model = { \"DecisionTree\":tree.DecisionTreeClassifier(max_depth=10),\n", 991 | " \"RandomForest\":ek.RandomForestClassifier(n_estimators=50),\n", 992 | " \"Adaboost\":ek.AdaBoostClassifier(n_estimators=50),\n", 993 | " \"GradientBoosting\":ek.GradientBoostingClassifier(n_estimators=50),\n", 994 | " \"GNB\":GaussianNB(),\n", 995 | " \"LogisticRegression\":LogisticRegression() \n", 996 | "}" 997 | ] 998 | }, 999 | { 1000 | "cell_type": "markdown", 1001 | "metadata": { 1002 | "deletable": true, 1003 | "editable": true 1004 | }, 1005 | "source": [ 1006 | "##### cross validation" 1007 | ] 1008 | }, 1009 | { 1010 | "cell_type": "code", 1011 | "execution_count": 51, 1012 | "metadata": { 1013 | "collapsed": false, 1014 | "deletable": true, 1015 | "editable": true 1016 | }, 1017 | "outputs": [], 1018 | "source": [ 1019 | "X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y ,test_size=0.2)" 1020 | ] 1021 | }, 1022 | { 1023 | "cell_type": "code", 1024 | "execution_count": 53, 1025 | "metadata": { 1026 | "collapsed": false, 1027 | "deletable": true, 1028 | "editable": true 1029 | }, 1030 | "outputs": [ 1031 | { 1032 | "name": "stdout", 1033 | "output_type": "stream", 1034 | "text": [ 1035 | "DecisionTree : 0.896159317212 \n", 1036 | "RandomForest : 0.899715504979 \n", 1037 | "LogisticRegression : 0.842816500711 \n", 1038 | "GradientBoosting : 0.875533428165 \n", 1039 | "Adaboost : 0.871977240398 \n", 1040 | "GNB : 0.658605974395 \n" 1041 | ] 1042 | } 1043 | ], 1044 | "source": [ 1045 | "results = {}\n", 1046 | "for algo in model:\n", 1047 | " clf = model[algo]\n", 1048 | " clf.fit(X_train,y_train)\n", 1049 | " score = clf.score(X_test,y_test)\n", 1050 | " print (\"%s : %s \" %(algo, score))\n", 1051 | " results[algo] = score" 1052 | ] 1053 | }, 1054 | { 1055 | "cell_type": "code", 1056 | "execution_count": 54, 1057 | "metadata": { 1058 | "collapsed": false, 1059 | "deletable": true, 1060 | "editable": true 1061 | }, 1062 | "outputs": [ 1063 | { 1064 | "name": "stdout", 1065 | "output_type": "stream", 1066 | "text": [ 1067 | "RandomForest\n" 1068 | ] 1069 | } 1070 | ], 1071 | "source": [ 1072 | "winner = max(results, key=results.get)\n", 1073 | "print(winner)" 1074 | ] 1075 | }, 1076 | { 1077 | "cell_type": "code", 1078 | "execution_count": 55, 1079 | "metadata": { 1080 | "collapsed": false, 1081 | "deletable": true, 1082 | "editable": true 1083 | }, 1084 | "outputs": [ 1085 | { 1086 | "name": "stdout", 1087 | "output_type": "stream", 1088 | "text": [ 1089 | "False positive rate : 3.634803 %\n", 1090 | "False negative rate : 4.779412 %\n" 1091 | ] 1092 | } 1093 | ], 1094 | "source": [ 1095 | "clf = model[winner]\n", 1096 | "res = clf.predict(X)\n", 1097 | "mt = confusion_matrix(y, res)\n", 1098 | "print(\"False positive rate : %f %%\" % ((mt[0][1] / float(sum(mt[0])))*100))\n", 1099 | "print('False negative rate : %f %%' % ( (mt[1][0] / float(sum(mt[1]))*100)))" 1100 | ] 1101 | }, 1102 | { 1103 | "cell_type": "markdown", 1104 | "metadata": { 1105 | "deletable": true, 1106 | "editable": true 1107 | }, 1108 | "source": [ 1109 | "### Testing\n", 1110 | "\n", 1111 | "Let's test' some of the malicious URL's listed in Trend Micro's website. http://apac.trendmicro.com/apac/security-intelligence/current-threat-activity/malicious-top-ten/" 1112 | ] 1113 | }, 1114 | { 1115 | "cell_type": "code", 1116 | "execution_count": 52, 1117 | "metadata": { 1118 | "collapsed": false, 1119 | "deletable": true, 1120 | "editable": true 1121 | }, 1122 | "outputs": [ 1123 | { 1124 | "name": "stdout", 1125 | "output_type": "stream", 1126 | "text": [ 1127 | "['1']\n" 1128 | ] 1129 | } 1130 | ], 1131 | "source": [ 1132 | "result = pd.DataFrame(columns=('url','no of dots','presence of hyphen','len of url','presence of at',\\\n", 1133 | "'presence of double slash','no of subdir','no of subdomain','len of domain','no of queries','is IP','presence of Suspicious_TLD',\\\n", 1134 | "'presence of suspicious domain','label'))\n", 1135 | "\n", 1136 | "results = getFeatures('trafficconverter.biz:80/4vir/antispyware/loadadv.exe', '1')\n", 1137 | "result.loc[0] = results\n", 1138 | "result = result.drop(['url','label'],axis=1).values\n", 1139 | "print(clf.predict(result))" 1140 | ] 1141 | }, 1142 | { 1143 | "cell_type": "markdown", 1144 | "metadata": { 1145 | "deletable": true, 1146 | "editable": true 1147 | }, 1148 | "source": [ 1149 | "Success! One more time :) " 1150 | ] 1151 | }, 1152 | { 1153 | "cell_type": "code", 1154 | "execution_count": 56, 1155 | "metadata": { 1156 | "collapsed": false, 1157 | "deletable": true, 1158 | "editable": true 1159 | }, 1160 | "outputs": [ 1161 | { 1162 | "name": "stdout", 1163 | "output_type": "stream", 1164 | "text": [ 1165 | "['1']\n" 1166 | ] 1167 | } 1168 | ], 1169 | "source": [ 1170 | "result = pd.DataFrame(columns=('url','no of dots','presence of hyphen','len of url','presence of at',\\\n", 1171 | "'presence of double slash','no of subdir','no of subdomain','len of domain','no of queries','is IP','presence of Suspicious_TLD',\\\n", 1172 | "'presence of suspicious domain','label'))\n", 1173 | "\n", 1174 | "results = getFeatures('am10.ru:80/code.php', '1')\n", 1175 | "result.loc[0] = results\n", 1176 | "result = result.drop(['url','label'],axis=1).values\n", 1177 | "print(clf.predict(result))" 1178 | ] 1179 | } 1180 | ], 1181 | "metadata": { 1182 | "kernelspec": { 1183 | "display_name": "Python 3", 1184 | "language": "python", 1185 | "name": "python3" 1186 | }, 1187 | "language_info": { 1188 | "codemirror_mode": { 1189 | "name": "ipython", 1190 | "version": 3 1191 | }, 1192 | "file_extension": ".py", 1193 | "mimetype": "text/x-python", 1194 | "name": "python", 1195 | "nbconvert_exporter": "python", 1196 | "pygments_lexer": "ipython3", 1197 | "version": "3.5.2" 1198 | } 1199 | }, 1200 | "nbformat": 4, 1201 | "nbformat_minor": 0 1202 | } 1203 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Sun May 30 21:40:37 2021 4 | 5 | @author: debanjan 6 | """ 7 | 8 | 9 | from flask import Flask, render_template, request 10 | import sklearn.ensemble as ek 11 | import ipaddress as ip 12 | import pandas as pd 13 | from os.path import splitext 14 | import tldextract 15 | from urllib.parse import urlparse 16 | from joblib import load 17 | from sklearn import svm,tree 18 | import pickle 19 | 20 | app = Flask(__name__) 21 | app.config['SECRET_KEY']='debanjan'; 22 | 23 | 24 | @app.route("/") 25 | 26 | def home(): 27 | return render_template("index.html") 28 | 29 | Suspicious_TLD=['zip','cricket','link','work','party','gq','kim','country','science','tk'] 30 | Suspicious_Domain=['luckytime.co.kr','mattfoll.eu.interia.pl','trafficholder.com','dl.baixaki.com.br','bembed.redtube.comr','tags.expo9.exponential.com','deepspacer.com','funad.co.kr','trafficconverter.biz'] 31 | def countdots(url): 32 | return url.count('.') 33 | 34 | def countdelim(url): 35 | count = 0 36 | delim=[';','_','?','=','&'] 37 | for each in url: 38 | if each in delim: 39 | count = count + 1 40 | 41 | return count 42 | 43 | def isip(uri): 44 | try: 45 | if ip.ip_address(uri): 46 | return 1 47 | except: 48 | return 0 49 | 50 | def isPresentHyphen(url): 51 | return url.count('-') 52 | 53 | def isPresentAt(url): 54 | return url.count('@') 55 | 56 | def isPresentDSlash(url): 57 | return url.count('//') 58 | 59 | def countSubDir(url): 60 | return url.count('/') 61 | def get_ext(url): 62 | """Return the filename extension from url, or ''.""" 63 | 64 | root, ext = splitext(url) 65 | return ext 66 | def countSubDomain(subdomain): 67 | if not subdomain: 68 | return 0 69 | else: 70 | return len(subdomain.split('.')) 71 | def countQueries(query): 72 | if not query: 73 | return 0 74 | else: 75 | return len(query.split('&')) 76 | featureSet = pd.DataFrame(columns=('url','no of dots','presence of hyphen','len of url','presence of at',\ 77 | 'presence of double slash','no of subdir','no of subdomain','len of domain','no of queries','is IP','presence of Suspicious_TLD',\ 78 | 'presence of suspicious domain','label')) 79 | 80 | 81 | def getFeatures(url, label): 82 | result = [] 83 | url = str(url) 84 | 85 | #add the url to feature set 86 | result.append(url) 87 | 88 | #parse the URL and extract the domain information 89 | path = urlparse(url) 90 | ext = tldextract.extract(url) 91 | 92 | #counting number of dots in subdomain 93 | result.append(countdots(ext.subdomain)) 94 | 95 | #checking hyphen in domain 96 | result.append(isPresentHyphen(path.netloc)) 97 | 98 | #length of URL 99 | result.append(len(url)) 100 | 101 | #checking @ in the url 102 | result.append(isPresentAt(path.netloc)) 103 | 104 | #checking presence of double slash 105 | result.append(isPresentDSlash(path.path)) 106 | 107 | #Count number of subdir 108 | result.append(countSubDir(path.path)) 109 | 110 | #number of sub domain 111 | result.append(countSubDomain(ext.subdomain)) 112 | 113 | #length of domain name 114 | result.append(len(path.netloc)) 115 | 116 | #count number of queries 117 | result.append(len(path.query)) 118 | 119 | #Adding domain information 120 | 121 | #if IP address is being used as a URL 122 | result.append(isip(ext.domain)) 123 | 124 | #presence of Suspicious_TLD 125 | result.append(1 if ext.suffix in Suspicious_TLD else 0) 126 | 127 | #presence of suspicious domain 128 | result.append(1 if '.'.join(ext[1:]) in Suspicious_Domain else 0 ) 129 | #result.append(get_ext(path.path)) 130 | result.append(str(label)) 131 | return result 132 | 133 | 134 | 135 | @app.route('/model', methods=['GET','POST']) 136 | def model(): 137 | url = request.form['search'] 138 | result = pd.DataFrame(columns=('url','no of dots','presence of hyphen','len of url','presence of at',\ 139 | 'presence of double slash','no of subdir','no of subdomain','len of domain','no of queries','is IP','presence of Suspicious_TLD',\ 140 | 'presence of suspicious domain','label')) 141 | 142 | results = getFeatures(url, '0') 143 | 144 | model_1=pickle.load(open('model_colab.pkl','rb')) 145 | #model_1=load('model.joblib') 146 | result.loc[0] = results 147 | result = result.drop(['url','label'],axis=1).values 148 | pos=0 149 | neg=0 150 | pred=model_1.predict(result) 151 | if(pred=='0'): 152 | neg=neg+1 153 | if(pred=='1'): 154 | pos=pos+1 155 | 156 | if(pos>neg): 157 | res="URL seems to be safe" 158 | else: 159 | res="URL seems to be not safe" 160 | 161 | return render_template("index.html",Result=res) 162 | 163 | if __name__ == "__main__": 164 | 165 | 166 | app.run() -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==1.1.1 2 | gunicorn==19.9.0 3 | itsdangerous==1.1.0 4 | jinja2==2.10.1 5 | MarkupSafe==1.1.1 6 | Werkzeug==0.15.5 7 | numpy>=1.9.2 8 | scipy>=0.15.1 9 | scikit-learn>=0.18 10 | matplotlib>=1.4.3 11 | pandas>=0.19 12 | tldextract==3.1.0 13 | 14 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Check URL 5 | 6 | 7 | 8 | 9 | 10 | 46 |
47 | 48 |
49 | 50 |

Check your URL here

51 |
52 | 53 | 54 |

{{Result}}

55 |
56 | 57 | 58 | 61 | --------------------------------------------------------------------------------