├── 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 | " URL \n",
52 | " Lable \n",
53 | " \n",
54 | " \n",
55 | " \n",
56 | " \n",
57 | " 0 \n",
58 | " http://www.resumescorecard.com/ \n",
59 | " 0 \n",
60 | " \n",
61 | " \n",
62 | " 1 \n",
63 | " http://www.colorado.edu/MCEN/flowvis/ \n",
64 | " 0 \n",
65 | " \n",
66 | " \n",
67 | " 2 \n",
68 | " http://www.winestars.com/ \n",
69 | " 0 \n",
70 | " \n",
71 | " \n",
72 | " 3 \n",
73 | " http://eqworld.ipmnet.ru/ \n",
74 | " 0 \n",
75 | " \n",
76 | " \n",
77 | " 4 \n",
78 | " http://advods.com/verty/myaccount/webapps/973f6 \n",
79 | " 1 \n",
80 | " \n",
81 | " \n",
82 | "
\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 | " url \n",
556 | " no of dots \n",
557 | " presence of hyphen \n",
558 | " len of url \n",
559 | " presence of at \n",
560 | " presence of double slash \n",
561 | " no of subdir \n",
562 | " no of subdomain \n",
563 | " len of domain \n",
564 | " no of queries \n",
565 | " is IP \n",
566 | " presence of Suspicious_TLD \n",
567 | " presence of suspicious domain \n",
568 | " label \n",
569 | " \n",
570 | " \n",
571 | " \n",
572 | " \n",
573 | " 0 \n",
574 | " http://www.resumescorecard.com/ \n",
575 | " 0.0 \n",
576 | " 0.0 \n",
577 | " 31.0 \n",
578 | " 0.0 \n",
579 | " 0.0 \n",
580 | " 1.0 \n",
581 | " 1.0 \n",
582 | " 23.0 \n",
583 | " 0.0 \n",
584 | " 0.0 \n",
585 | " 0.0 \n",
586 | " 0.0 \n",
587 | " 0 \n",
588 | " \n",
589 | " \n",
590 | " 1 \n",
591 | " http://www.colorado.edu/MCEN/flowvis/ \n",
592 | " 0.0 \n",
593 | " 0.0 \n",
594 | " 37.0 \n",
595 | " 0.0 \n",
596 | " 0.0 \n",
597 | " 3.0 \n",
598 | " 1.0 \n",
599 | " 16.0 \n",
600 | " 0.0 \n",
601 | " 0.0 \n",
602 | " 0.0 \n",
603 | " 0.0 \n",
604 | " 0 \n",
605 | " \n",
606 | " \n",
607 | " 2 \n",
608 | " http://www.winestars.com/ \n",
609 | " 0.0 \n",
610 | " 0.0 \n",
611 | " 25.0 \n",
612 | " 0.0 \n",
613 | " 0.0 \n",
614 | " 1.0 \n",
615 | " 1.0 \n",
616 | " 17.0 \n",
617 | " 0.0 \n",
618 | " 0.0 \n",
619 | " 0.0 \n",
620 | " 0.0 \n",
621 | " 0 \n",
622 | " \n",
623 | " \n",
624 | " 3 \n",
625 | " http://eqworld.ipmnet.ru/ \n",
626 | " 0.0 \n",
627 | " 0.0 \n",
628 | " 25.0 \n",
629 | " 0.0 \n",
630 | " 0.0 \n",
631 | " 1.0 \n",
632 | " 1.0 \n",
633 | " 17.0 \n",
634 | " 0.0 \n",
635 | " 0.0 \n",
636 | " 0.0 \n",
637 | " 0.0 \n",
638 | " 0 \n",
639 | " \n",
640 | " \n",
641 | " 4 \n",
642 | " http://advods.com/verty/myaccount/webapps/973f6 \n",
643 | " 0.0 \n",
644 | " 0.0 \n",
645 | " 47.0 \n",
646 | " 0.0 \n",
647 | " 0.0 \n",
648 | " 4.0 \n",
649 | " 0.0 \n",
650 | " 10.0 \n",
651 | " 0.0 \n",
652 | " 0.0 \n",
653 | " 0.0 \n",
654 | " 0.0 \n",
655 | " 1 \n",
656 | " \n",
657 | " \n",
658 | "
\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 |
49 |
50 | Check your URL here
51 |
56 |
57 |
58 |
61 |
--------------------------------------------------------------------------------