{
"metadata": {
"name": "",
"signature": "sha256:fcaaddd188e30b06b38b51a3082a5955b5e47b89cd9ca393d5eee783031b54c3"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#Driveby PCAP analysis\n",
"
\n",
"###Check yo'self before you wreck yo'self\n",
"We sumbled upon a really great collection of PCAPs that were interactions with suspicious websites. Which seemed to lead to the suspicion being correct, and an end system got exploited, or the suspicion was wrong and nothing bad happened. While we do no machine learning in this notebook, there are several techniques that are usful for collecting statistics about features across all the samples. However, when dealing with network traffic it's often very useful to have the additional context that a full session can provide. Here we try to break out of the sample box and begin showing groups of data as viewed by Bro in each network session.\n",
"\n",
"####Tools\n",
" - Bro (http://www.bro.org)\n",
" - IPython (http://www.ipython.org)\n",
" - pandas (http://pandas.pydata.org)\n",
"\n",
"####What we did:\n",
" - Data gathered with Bro (default Bro content)\n",
" - bro -C -r <pcap file> local\n",
" - Data cleanup\n",
" - Explored the Data!\n",
" - Found some patterns\n",
" - Exploited the patterns to us find new things!\n",
"\n",
"####Thanks!\n",
" - To the people that we borrowed the data from. Once they get back to me I'll be sure to give proper recognition. :)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# All the imports and some basic level setting with various versions\n",
"import IPython\n",
"import os\n",
"import pylab\n",
"import string\n",
"import pandas\n",
"import pickle\n",
"import matplotlib\n",
"import collections\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib as plt\n",
"from __future__ import division\n",
"\n",
"print \"IPython version: %s\" %IPython.__version__\n",
"print \"pandas version: %s\" %pd.__version__\n",
"print \"numpy version: %s\" %np.__version__\n",
"print \"matplotlib version: %s\" %plt.__version__\n",
"\n",
"%matplotlib inline\n",
"pylab.rcParams['figure.figsize'] = (16.0, 5.0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"IPython version: 2.0.0\n",
"pandas version: 0.13.0rc1-32-g81053f9\n",
"numpy version: 1.6.1\n",
"matplotlib version: 1.3.1\n"
]
}
],
"prompt_number": 78
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Mapping of fields of the files we want to read in and initial setup of pandas dataframes\n",
"# Borrowed from aonther notebook, this time we're just going to focus on notice and files for starters\n",
"# But the rest are here when we need 'em\n",
"logs_to_process = {\n",
" 'conn.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','proto','service','duration','orig_bytes','resp_bytes','conn_state','local_orig','missed_bytes','history','orig_pkts','orig_ip_bytes','resp_pkts','resp_ip_bytes','tunnel_parents','sample'],\n",
" 'dns.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','proto','trans_id','query','qclass','qclass_name','qtype','qtype_name','rcode','rcode_name','AA','TC','RD','RA','Z','answers','TTLs','rejected','sample'],\n",
" 'files.log' : ['ts','fuid','tx_hosts','rx_hosts','conn_uids','source','depth','analyzers','mime_type','filename','duration','local_orig','is_orig','seen_bytes','total_bytes','missing_bytes','overflow_bytes','timedout','parent_fuid','md5','sha1','sha256','extracted','sample'],\n",
" 'ftp.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','user','password','command','arg','mime_type','file_size','reply_code','reply_msg','data_channel.passive','data_channel.orig_h','data_channel.resp_h','data_channel.resp_p','fuid','sample'],\n",
" 'http.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','trans_depth','method','host','uri','referrer','user_agent','request_body_len','response_body_len','status_code','status_msg','info_code','info_msg','filename','tags','username','password','proxied','orig_fuids','orig_mime_types','resp_fuids','resp_mime_types','sample'],\n",
" 'irc.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','nick','user','command','value','addl','dcc_file_name','dcc_file_size','dcc_mime_type','fuid','sample'],\n",
" 'notice.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','fuid','file_mime_type','file_desc','proto','note','msg','sub','src','dst','p','n','peer_descr','actions','suppress_for','dropped','remote_location.country_code','remote_location.region','remote_location.city','remote_location.latitude','remote_location.longitude','sample'],\n",
" 'signatures.log' : ['ts','src_addr','src_port','dst_addr','dst_port','note','sig_id','event_msg','sub_msg','sig_count','host_count','sample'],\n",
" 'smtp.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','trans_depth','helo','mailfrom','rcptto','date','from','to','reply_to','msg_id','in_reply_to','subject','x_originating_ip','first_received','second_received','last_reply','path','user_agent','fuids','is_webmail','sample'],\n",
" 'ssl.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','version','cipher','server_name','session_id','subject','issuer_subject','not_valid_before','not_valid_after','last_alert','client_subject','client_issuer_subject','cert_hash','validation_status','sample'],\n",
" 'tunnel.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','tunnel_type','action','sample'],\n",
" 'weird.log' : ['ts','uid','id.orig_h','id.orig_p','id.resp_h','id.resp_p','name','addl','notice','peer','sample']\n",
" }\n",
"\n",
"conndf = pd.DataFrame(columns=logs_to_process['conn.log'])\n",
"dnsdf = pd.DataFrame(columns=logs_to_process['dns.log'])\n",
"filesdf = pd.DataFrame(columns=logs_to_process['files.log'])\n",
"ftpdf = pd.DataFrame(columns=logs_to_process['ftp.log'])\n",
"httpdf = pd.DataFrame(columns=logs_to_process['http.log'])\n",
"ircdf = pd.DataFrame(columns=logs_to_process['irc.log'])\n",
"noticedf = pd.DataFrame(columns=logs_to_process['notice.log'])\n",
"smtpdf = pd.DataFrame(columns=logs_to_process['smtp.log'])\n",
"ssldf = pd.DataFrame(columns=logs_to_process['ssl.log'])\n",
"weirddf = pd.DataFrame(columns=logs_to_process['weird.log'])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"process_files = ['notice.log','files.log']\n",
"for dirName, subdirList, fileList in os.walk('..'):\n",
" for fname in fileList:\n",
" tags = dirName.split('/')\n",
" if len(tags) == 2 and fname in logs_to_process:\n",
" logname = fname.split('.')\n",
" try:\n",
" if fname in process_files:\n",
" #print \"Processing %s - %s\" %(tags[1], fname)\n",
" tempdf = pd.read_csv(dirName+'/'+fname, sep='\\t',skiprows=8, header=None, \n",
" names=logs_to_process[fname][:-1], skipfooter=1)\n",
" tempdf['sample'] = tags[1]\n",
" if fname == 'conn.log':\n",
" conndf = conndf.append(tempdf)\n",
" if fname == 'dns.log':\n",
" dnsdf = dnsdf.append(tempdf)\n",
" if fname == 'files.log':\n",
" filesdf = filesdf.append(tempdf)\n",
" if fname == 'ftp.log':\n",
" ftpdf = ftpdf.append(tempdf)\n",
" if fname == 'http.log':\n",
" httpdf = httpdf.append(tempdf)\n",
" if fname == 'notice.log':\n",
" noticedf = noticedf.append(tempdf)\n",
" if fname == 'signatures.log':\n",
" sigdf = sigdf.append(tempdf)\n",
" if fname == 'smtp.log':\n",
" smtpdf = smtpdf.append(tempdf)\n",
" if fname == 'ssl.log':\n",
" ssldf = ssldf.append(tempdf)\n",
" if fname == 'tunnel.log':\n",
" tunneldf = tunneldf.append(tempdf)\n",
" if fname == 'weird.log':\n",
" weirddf = weirddf.append(tempdf)\n",
" except Exception as e:\n",
" print \"[*] error: %s, on %s/%s\" % (str(e), dirName, fname)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#You can use these to save a copy of the raw dataframe, because reading in the files over-and-over again is awful\n",
"#pickle.dump(filesdf, open('files.dataframe', 'wb'))\n",
"filesdf = pickle.load(open('files.dataframe', 'rb'))\n",
"#pickle.dump(noticedf, open('notice.dataframe', 'wb'))\n",
"noticedf = pickle.load(open('notice.dataframe', 'rb'))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
Well, it took a while to get the data read into the dataframes let's take a quick peek at what it looks like. If everything looks pretty, or at least how we'd expect we can move on with some analysis."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"noticedf.head(3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" ts | \n",
" uid | \n",
" id.orig_h | \n",
" id.orig_p | \n",
" id.resp_h | \n",
" id.resp_p | \n",
" fuid | \n",
" file_mime_type | \n",
" file_desc | \n",
" proto | \n",
" note | \n",
" msg | \n",
" sub | \n",
" src | \n",
" dst | \n",
" p | \n",
" n | \n",
" peer_descr | \n",
" actions | \n",
" suppress_for | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.338423e+09 | \n",
" C2cBNO2DuqzRxvfac6 | \n",
" 192.168.88.10 | \n",
" 1068 | \n",
" 195.210.47.109 | \n",
" 80 | \n",
" FEdFLYNt00bHPa9sb | \n",
" application/x-dosexec | \n",
" http://navozmi.ipq.co/f/1100.exe?ts=405b7ca&af... | \n",
" tcp | \n",
" TeamCymruMalwareHashRegistry::Match | \n",
" Malware Hash Registry Detection rate: 33% Las... | \n",
" https://www.virustotal.com/en/search/?query=85... | \n",
" 192.168.88.10 | \n",
" 195.210.47.109 | \n",
" 80 | \n",
" - | \n",
" bro | \n",
" Notice::ACTION_LOG | \n",
" 3600 | \n",
" ... | \n",
"
\n",
" \n",
" 0 | \n",
" 1.336524e+09 | \n",
" Cbs89uRcl9HnSASEc | \n",
" 192.168.15.10 | \n",
" 1104 | \n",
" 85.17.147.215 | \n",
" 80 | \n",
" FaeRAd49IO4E2V2ndb | \n",
" application/x-dosexec | \n",
" http://mybisyo.com/w.php?f=96ece&e=2 | \n",
" tcp | \n",
" TeamCymruMalwareHashRegistry::Match | \n",
" Malware Hash Registry Detection rate: 24% Las... | \n",
" https://www.virustotal.com/en/search/?query=bc... | \n",
" 192.168.15.10 | \n",
" 85.17.147.215 | \n",
" 80 | \n",
" - | \n",
" bro | \n",
" Notice::ACTION_LOG | \n",
" 3600 | \n",
" ... | \n",
"
\n",
" \n",
" 1 | \n",
" 1.336524e+09 | \n",
" Cpcwv13LGlszc39oQc | \n",
" 192.168.15.10 | \n",
" 1105 | \n",
" 85.17.147.215 | \n",
" 80 | \n",
" F2ZPuu3GQcfZNFezk | \n",
" application/x-shockwave-flash | \n",
" http://mybisyo.com/data/field.swf | \n",
" tcp | \n",
" TeamCymruMalwareHashRegistry::Match | \n",
" Malware Hash Registry Detection rate: 60% Las... | \n",
" https://www.virustotal.com/en/search/?query=d6... | \n",
" 192.168.15.10 | \n",
" 85.17.147.215 | \n",
" 80 | \n",
" - | \n",
" bro | \n",
" Notice::ACTION_LOG | \n",
" 3600 | \n",
" ... | \n",
"
\n",
" \n",
"
\n",
"
3 rows \u00d7 27 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": [
" ts uid id.orig_h id.orig_p id.resp_h \\\n",
"0 1.338423e+09 C2cBNO2DuqzRxvfac6 192.168.88.10 1068 195.210.47.109 \n",
"0 1.336524e+09 Cbs89uRcl9HnSASEc 192.168.15.10 1104 85.17.147.215 \n",
"1 1.336524e+09 Cpcwv13LGlszc39oQc 192.168.15.10 1105 85.17.147.215 \n",
"\n",
" id.resp_p fuid file_mime_type \\\n",
"0 80 FEdFLYNt00bHPa9sb application/x-dosexec \n",
"0 80 FaeRAd49IO4E2V2ndb application/x-dosexec \n",
"1 80 F2ZPuu3GQcfZNFezk application/x-shockwave-flash \n",
"\n",
" file_desc proto \\\n",
"0 http://navozmi.ipq.co/f/1100.exe?ts=405b7ca&af... tcp \n",
"0 http://mybisyo.com/w.php?f=96ece&e=2 tcp \n",
"1 http://mybisyo.com/data/field.swf tcp \n",
"\n",
" note \\\n",
"0 TeamCymruMalwareHashRegistry::Match \n",
"0 TeamCymruMalwareHashRegistry::Match \n",
"1 TeamCymruMalwareHashRegistry::Match \n",
"\n",
" msg \\\n",
"0 Malware Hash Registry Detection rate: 33% Las... \n",
"0 Malware Hash Registry Detection rate: 24% Las... \n",
"1 Malware Hash Registry Detection rate: 60% Las... \n",
"\n",
" sub src \\\n",
"0 https://www.virustotal.com/en/search/?query=85... 192.168.88.10 \n",
"0 https://www.virustotal.com/en/search/?query=bc... 192.168.15.10 \n",
"1 https://www.virustotal.com/en/search/?query=d6... 192.168.15.10 \n",
"\n",
" dst p n peer_descr actions suppress_for \n",
"0 195.210.47.109 80 - bro Notice::ACTION_LOG 3600 ... \n",
"0 85.17.147.215 80 - bro Notice::ACTION_LOG 3600 ... \n",
"1 85.17.147.215 80 - bro Notice::ACTION_LOG 3600 ... \n",
"\n",
"[3 rows x 27 columns]"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf.head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ts | \n",
" fuid | \n",
" tx_hosts | \n",
" rx_hosts | \n",
" conn_uids | \n",
" source | \n",
" depth | \n",
" analyzers | \n",
" mime_type | \n",
" filename | \n",
" duration | \n",
" local_orig | \n",
" is_orig | \n",
" seen_bytes | \n",
" total_bytes | \n",
" missing_bytes | \n",
" overflow_bytes | \n",
" timedout | \n",
" parent_fuid | \n",
" md5 | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.320786e+09 | \n",
" FDbQJR35HG4EfZ0nb4 | \n",
" 75.119.221.151 | \n",
" 192.168.41.10 | \n",
" C9KyD7n902u8uko9j | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" text/html | \n",
" - | \n",
" 0.000024 | \n",
" - | \n",
" F | \n",
" 4305 | \n",
" - | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" 8b07497c411ce08842cf2145380d238e | \n",
" ... | \n",
"
\n",
" \n",
" 1 | \n",
" 1.320786e+09 | \n",
" Fhv2Jx2f5EiIs52jf4 | \n",
" 75.119.221.151 | \n",
" 192.168.41.10 | \n",
" C9KyD7n902u8uko9j | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" text/plain | \n",
" - | \n",
" 0.000323 | \n",
" - | \n",
" F | \n",
" 3233 | \n",
" 3233 | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" db8f4e6949c0fc0fc9cadf85d02e099a | \n",
" ... | \n",
"
\n",
" \n",
" 2 | \n",
" 1.320786e+09 | \n",
" FUJQ4k1k9m9EUOiDL5 | \n",
" 31.31.74.239 | \n",
" 192.168.41.10 | \n",
" CaTFVw42sBoMSa9Zcl | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" text/html | \n",
" - | \n",
" 0.000000 | \n",
" - | \n",
" F | \n",
" 2717 | \n",
" 2717 | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" b030b8e337724d4a2786041a38c0951f | \n",
" ... | \n",
"
\n",
" \n",
" 3 | \n",
" 1.320786e+09 | \n",
" F7p0uQ1a9czI7BIwW4 | \n",
" 69.31.75.17 | \n",
" 192.168.41.10 | \n",
" CgQksU3fAxqa2VzJmi | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" text/html | \n",
" - | \n",
" 0.000000 | \n",
" - | \n",
" F | \n",
" 1567 | \n",
" 1567 | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" 644a4a82d7580c2cf9f97e13b0ee1ced | \n",
" ... | \n",
"
\n",
" \n",
" 4 | \n",
" 1.320786e+09 | \n",
" FitWMF3UfEasz2Vyql | \n",
" 75.119.221.151 | \n",
" 192.168.41.10 | \n",
" C9KyD7n902u8uko9j | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" application/x-shockwave-flash | \n",
" - | \n",
" 1.356016 | \n",
" - | \n",
" F | \n",
" 1177469 | \n",
" 1177469 | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" c2045c6a5e95a99f6ebbc073e62894cd | \n",
" ... | \n",
"
\n",
" \n",
"
\n",
"
5 rows \u00d7 24 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 28,
"text": [
" ts fuid tx_hosts rx_hosts \\\n",
"0 1.320786e+09 FDbQJR35HG4EfZ0nb4 75.119.221.151 192.168.41.10 \n",
"1 1.320786e+09 Fhv2Jx2f5EiIs52jf4 75.119.221.151 192.168.41.10 \n",
"2 1.320786e+09 FUJQ4k1k9m9EUOiDL5 31.31.74.239 192.168.41.10 \n",
"3 1.320786e+09 F7p0uQ1a9czI7BIwW4 69.31.75.17 192.168.41.10 \n",
"4 1.320786e+09 FitWMF3UfEasz2Vyql 75.119.221.151 192.168.41.10 \n",
"\n",
" conn_uids source depth analyzers mime_type \\\n",
"0 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 text/html \n",
"1 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 text/plain \n",
"2 CaTFVw42sBoMSa9Zcl HTTP 0 SHA1,MD5 text/html \n",
"3 CgQksU3fAxqa2VzJmi HTTP 0 SHA1,MD5 text/html \n",
"4 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 application/x-shockwave-flash \n",
"\n",
" filename duration local_orig is_orig seen_bytes total_bytes \\\n",
"0 - 0.000024 - F 4305 - \n",
"1 - 0.000323 - F 3233 3233 \n",
"2 - 0.000000 - F 2717 2717 \n",
"3 - 0.000000 - F 1567 1567 \n",
"4 - 1.356016 - F 1177469 1177469 \n",
"\n",
" missing_bytes overflow_bytes timedout parent_fuid \\\n",
"0 0 0 F - \n",
"1 0 0 F - \n",
"2 0 0 F - \n",
"3 0 0 F - \n",
"4 0 0 F - \n",
"\n",
" md5 \n",
"0 8b07497c411ce08842cf2145380d238e ... \n",
"1 db8f4e6949c0fc0fc9cadf85d02e099a ... \n",
"2 b030b8e337724d4a2786041a38c0951f ... \n",
"3 644a4a82d7580c2cf9f97e13b0ee1ced ... \n",
"4 c2045c6a5e95a99f6ebbc073e62894cd ... \n",
"\n",
"[5 rows x 24 columns]"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"noticedf.note.value_counts()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 29,
"text": [
"TeamCymruMalwareHashRegistry::Match 7212\n",
"Scan::Address_Scan 105\n",
"SSL::Invalid_Server_Cert 105\n",
"dtype: int64"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Everything checks out nicely, and we've got a super-high-level view of what kinds of alerts were generated by Bro. I have a feeling the Team Cymru MHR results will come in handy if we want to get a feel for what's being detected vs. what's sneaking past the goalie.\n",
""
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"hashes = set()\n",
"def grab_hash(s):\n",
" if 'virustotal' in s:\n",
" hashes.add(s.split('=')[1])\n",
" return ''\n",
"\n",
"throwaway = noticedf['sub'].map(grab_hash)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def box_plot_df_setup(series_a, series_b): \n",
" # Count up all the times that a category from series_a\n",
" # matches up with a category from series_b. This is\n",
" # basically a gigantic contingency table\n",
" cont_table = collections.defaultdict(lambda : collections.Counter())\n",
" for val_a, val_b in zip(series_a.values, series_b.values):\n",
" cont_table[val_a][val_b] += 1\n",
" \n",
" # Create a dataframe\n",
" # A dataframe with keys from series_a as the index, series_b_keys\n",
" # as the columns and the counts as the values.\n",
" dataframe = pd.DataFrame(cont_table.values(), index=cont_table.keys())\n",
" dataframe.fillna(0, inplace=True)\n",
" return dataframe"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 31
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Everybody loves a good stacked bar graph. Here we can get a general feel for the data and there seem to be a lot of files! Apparently in some of the driveby activities some malware was (probably) run and grabbed something from an FTP site"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ax = box_plot_df_setup(filesdf['source'], filesdf['mime_type']).T.plot(kind='bar', stacked=True)\n",
"pylab.xlabel('Mime-Type')\n",
"pylab.ylabel('Number of Files')\n",
"patches, labels = ax.get_legend_handles_labels()\n",
"ax.legend(patches, labels, title=\"Service Type\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 32,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAA8IAAAHwCAYAAABtxtYiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4lOW9//HPQBBtSQiklS2WYAlSMJKwBI7L1QACkRak\nhwqiP1atihVR0YJaFDxV0NNWxRqtNipoZVGrgFbEUlygsghErXEJSBRCpJawRFk08Pz+oJkDhDHb\nPZkvud+v68olM8m88zwzTzA383xnQkEQBAIAAAAAwBMNYr0BAAAAAADUJRbCAAAAAACvsBAGAAAA\nAHiFhTAAAAAAwCsshAEAAAAAXmEhDAAAAADwStQWwvv371fPnj2Vnp6uTp066eabb5YklZSUqF+/\nfurQoYP69++vXbt2hW8zY8YMpaamqmPHjlq6dGn4+nXr1iktLU2pqamaOHFi+PoDBw5o+PDhSk1N\nVa9evfTpp5+GPzd79mx16NBBHTp00Jw5c6K1mwAAAACAE0zUFsInn3yyli9frry8PL377rtavny5\nVqxYoZkzZ6pfv376+OOP1bdvX82cOVOSlJ+fr/nz5ys/P19LlizR1VdfrfK3OB4/frxyc3NVUFCg\ngoICLVmyRJKUm5urpKQkFRQU6Prrr9fkyZMlHV5s33HHHVqzZo3WrFmj6dOnH7XgBgAAAAD4K6qn\nRn/nO9+RJH399dc6ePCgmjVrpkWLFmn06NGSpNGjR+uFF16QJC1cuFAjRoxQo0aNlJKSovbt22v1\n6tUqLi5WaWmpMjMzJUmjRo0K3+bI1tChQ7Vs2TJJ0iuvvKL+/fsrMTFRiYmJ6tevX3jxDAAAAADw\nW1QXwocOHVJ6erpatGih3r17q3Pnztq+fbtatGghSWrRooW2b98uSdq2bZuSk5PDt01OTlZRUVGF\n69u0aaOioiJJUlFRkU477TRJUlxcnJo2baodO3ZEbAEAAAAAEBfNeIMGDZSXl6fdu3drwIABWr58\n+VGfD4VCCoVC0dwEAAAAAACOEtWFcLmmTZvqJz/5idatW6cWLVro888/V8uWLVVcXKxTTz1V0uFn\nerds2RK+zdatW5WcnKw2bdpo69atFa4vv81nn32m1q1bq6ysTLt371ZSUpLatGmj1157LXybLVu2\nqE+fPhW2q3379tq0aVOU9hoAAAAAEEtdunRRXl5eheujdmr0v//97/ALVO3bt0+vvvqqMjIyNHjw\nYM2ePVvS4Vd2HjJkiCRp8ODBmjdvnr7++mtt3rxZBQUFyszMVMuWLZWQkKDVq1crCAI9+eSTuvDC\nC8O3KW89++yz6tu3rySpf//+Wrp0qXbt2qWdO3fq1Vdf1YABAyps46ZNmxQEQaUft99+e5W+7kRu\nWd42qy3L28Z+xr7nQ8vytrGfse9ZbVneNqsty9vGfsa+50PL8raxn5V/vPPOO8ddr0btGeHi4mKN\nHj1ahw4d0qFDhzRy5Ej17dtXGRkZGjZsmHJzc5WSkqIFCxZIkjp16qRhw4apU6dOiouLU05OTvi0\n6ZycHI0ZM0b79u3TwIEDlZ2dLUm67LLLNHLkSKWmpiopKUnz5s2TJDVv3lxTp05Vjx49JEm33367\nEhMTa7wvhYWFtbgnToyW654PLdc9qy3XPast1z0fWq57Vluue1ZbrntWW657PrRc96y2XPestlz3\nfGi57lltue5ZbZWL2kI4LS1N69evr3B98+bN9be//e24t7nlllt0yy23VLi+W7dueu+99ypc37hx\n4/BC+lhjx47V2LFjq7nVAAAAAID6ruG0adOmxXojYmX69Omqyu4nJiYqJSXFyfe02nLd86Hlume1\n5bpnteW650PLdc9qy3XPast1z2rLdc+Hluue1ZbrntWW654PLdc9qy3XPSutSGu+UBAEQe0268QV\nCoXk8e4DAAAAQL0Wac0X1fcRri+OfAXq+tpy3fOh5bpnteW6Z7XluudDy3XPast1z2rLdc9qy3XP\nh5brntWW657VluueD61IvebNm4ffDpaP2H80b968Wo9pnbx9EgAAAADUJzt37uTsUkPKX2i5yl/P\nqdHe7j4AAACAGmItYUukx4NTowEAAAAAEAvhKrE6r8C8SGxbrntWW657Vluuez60XPestlz3rLZc\n96y2XPd8aLnuWW257lltue750IpGD7HHQhgAAAAAYuzOO+/UmWeeqS5duigjI0Nr1qxx0r399tu1\nbNmyGt9+x44dysjIUEZGhlq1aqXk5GRlZGSoa9eu+uabb5xsYywwI+zv7gMAAACoIZdribfeekuT\nJk3S66+/rkaNGqmkpEQHDhxQq1atqnT7gwcPqmHDhk625dtMnz5d8fHxuuGGG6L+vaqLGWEAAAAA\nOIF8/vnn+t73vqdGjRpJOvzWTOWL4HXr1ikrK0vdu3dXdna2Pv/8c0lSVlaWrr/+evXo0UN33nmn\nUlJSwgu+r776Sj/4wQ9UVlamMWPG6LnnnpMkrV27Vuecc47S09PVs2dPffXVVzp48KBuuukmZWZm\nqkuXLnrkkUe+dVuDIFBpaanatWunsrIySdKePXt0+umnq6ysTFlZWbruuuuUkZGhtLQ0rV27NrxN\n48aNU8+ePdW1a1ctWrTI/R1ZDSyEq8DqvILl2QcfWq57Vluue1Zbrns+tFz3rLZc96y2XPestlz3\nfGi57lltue5Zbbnu+dCKRu9Y/fv315YtW3TGGWfol7/8pd544w1J0jfffKMJEyboueee09tvv62x\nY8fq1ltvlXT4mc5vvvlGa9eu1W233ab09HS9/vrrkqQXX3xR2dnZiouLC7/P7tdff62LL75Ys2bN\nUl5enpYtW6aTTz5Zubm5SkxM1Jo1a7RmzRo9+uijKiws/NbtjY+PV+/evfXSSy9JkubNm6ehQ4eG\nv9++ffu0YcMG5eTkaNy4cZIOn/rdt29frV69Wn//+9910003ae/evVG6RyvHQhgAAAAAYui73/2u\n1q1bp0ceeUTf//73NXz4cM2ePVsfffSR3n//fZ1//vnKyMjQnXfeqaKiovDthg8fftSf58+fL+nw\nwvTIzwVBoI8++kitWrVSt27dJElNmjRRw4YNtXTpUs2ZM0cZGRnq1auXSkpKtHHjxkq3+fLLL9fj\njz8uSXriiSc0duzY8OdGjBghSTrvvPO0Z88e7d69W0uXLtXMmTOVkZGh3r1768CBA9qyZUst7rXa\nYUbY390HAAAAUEPRXEs899xzmj17tu666y5dccUV+sc//lHha3r37q3f/e536tq1qyTpyy+/VFpa\nmtavX6/09HQVFhYqFApp7Nix+ulPf6ozzjhDV111lVasWHFU5+c//7muvPJK9evXr9Ltmj59upo0\naaJJkyZJktLT03Xfffdp8uTJWr16dXi7br/9dmVlZUmS2rZtq/fee099+vTR3LlzlZqaWpu7JiJm\nhAEAAADgBPLxxx+roKAgfHnDhg1KSUnRGWecoS+++EKrVq2SdPhU6fz8/OM2mjRpoh49eujaa6/V\noEGDFAqFwp8LhUI644wzVFxcrLfffluSVFpaqoMHD2rAgAHKyckJz/t+/PHHVT5ledSoUbr00kvD\npz+XK39mesWKFUpMTFRCQoIGDBigWbNmHbWPscRCuAqszitYnn3woeW6Z7Xlume15brnQ8t1z2rL\ndc9qy3XPast1z4eW657Vluue1Zbrng+taPSO9eWXX2rMmDHq3LmzunTpog8//FDTpk1To0aN9Oyz\nz2ry5MlKT09XRkaG3nrrrYid4cOH6+mnnz7qtOhyjRo10vz58zVhwgSlp6drwIABOnDggC6//HJ1\n6tRJXbt2VVpamsaPHx9eFB/PkQvsSy65RDt37gyfCl3u5JNPVteuXXX11VcrNzdXkjR16lR98803\nOuuss3TmmWfq9ttvr+7d5FRcTL87AAAAAHiua9euWrly5XE/16VLl/CLYB1p+fLlFa4bOnSoDh48\neNR15XO8ktS9e/fjLqTvvPNO3XnnnZVu57GL1xUrVuiiiy5SQkLCUdePHDlS995771HXnXzyyXr4\n4Ycr/R51hRlhf3cfAAAAQA35vpaYMGGCXnnlFf31r39V+/btw9cfO7tcV6o7I8xC2N/dBwAAAFBD\nrCVs4cWyosDqvILl2QcfWq57Vluue1Zbrns+tFz3rLZc96y2XPestlz3fGi57lltue5Zbbnu+dCK\nRg+xx0IYAAAAAOAVTo32d/cBAAAA1BBrCVs4NRoAAAAAgG/BQrgKrM4rWJ598KHlume15bpnteW6\n50PLdc9qy3XPast1z2rLdc+Hluue1ZbrntWW654PrWj0EHsshAEAAAAAXmFG2N/dBwAAAFBDx1tL\nJCQ0V2npzqh9z/j4ZtqzpyRq/RMZM8IAAAAAEAOHF8FB1D6qsshOSUnRd77zHcXHxys+Pl4NGzZU\nw4YNFR8fr1NOOUVxcXHhz6WlpUmSGjRooCZNmig+Pl7JycmaNGmSDh06VKXvk5CQoGbNmumcc87R\nH//4x+MuOrOystS8eXN98803kqSrrroqvA2NGzfWSSedFL78k5/8RJIUBIFOP/10de7cudJ9rgkW\nwlVgdV7B8uyDDy3XPast1z2rLdc9H1que1ZbrntWW657Vluuez60XPestlz3rLZc93xoRaMXTaFQ\nSC+++KJKS0tVWlqqgwcP6uDBgyotLdXDDz+ss88+O/y59957L3y7d999V6WlpVq2bJmefvppPfro\no1X6Pnv27NFnn32mKVOm6O6779Zll1121NcVFhZqzZo1OvXUU7Vw4UJJ0sMPPxzehltuuUUXX3xx\n+PJLL70kSXrjjTd04MABffHFF3r77bcd30sshAEAAADAC0EQVDoaesYZZ+i8887T+++/X+VufHy8\nBg0apPnz52v27NlH3XbOnDk6//zzNXLkSM2ePbvK2zR79mwNHTpUF1544XFvV1vMCPu7+wAAAABq\n6HhriVAopMOnMUftu1a6fmnXrp3+9Kc/qW/fvhU+98QTTyg3N1dvvvnmUdc3aNBABQUF+uEPf6j8\n/Hz17dtXd911l8aOHfut3yc3N1d9+vQ56vq2bdvq5ptv1lVXXSVJat++vaZPn67MzEx17txZW7du\n1amnnhr++mnTpmnTpk168sknw9ft3btXrVq10l//+lft3btXl1xyibZt26ZGjRpFvmeYEQYAAAAA\nPwVBoCFDhqhZs2Zq1qyZ/vu//7tKt+vatauaN2+uwYMH6xe/+IXGjBlTo+/funVr7dx5eJZ5xYoV\nKioq0uDBg5WamqpOnTrp6aefrrTxl7/8RQkJCTrnnHPCC+3yU6ZdYSFcBVbnFSzPPvjQct2z2nLd\ns9py3fOh5bpnteW6Z7Xlume15brnQ8t1z2rLdc9qy3XPh1Y0etEUCoW0cOFC7dy5Uzt37tRf/vKX\nKt1uw4YNKikp0caNG3XHHXf859nt6tu6dauaN28u6fDpzf3791d8fLwk6aKLLqrSac6zZ88OL+Ab\nNmyoIUOGOD89Os5pDQAAAADgpbVr12rbtm0699xztW/fPi1YsECHDh1Sq1atJEkHDhzQrl279O67\n7+qss86SpAoL7q1bt+rvf/+71q5dqwULFkg6fKr0/v37tWPHDiUlJTnZVmaE/d19AAAAADVk9X2E\nI83uSt8+I7xx40adfvrpVd6WI2eR9+zZozfeeEPXXXedzj33XD3xxBOaO3eurrnmGr3zzjs66aST\nJB0+bXvYsGHq0aOHfvvb30qqOCM8Y8YMPfXUU1q+fHn4ewVBoLPPPlvXX3+9rrnmmuNuT3VnhHlG\nGAAAAAAcqGyRGmuhUOi4pzzX9DToQYMGKS4uTg0aNFDnzp01adKk8ItkzZkzR+PGjVNycvJRt7nm\nmms0ceJE3XPPPWrQoEGFbZozZ46uueaao15QSzr83sPln3Mi8FhVd3/58uXOvqfVluueDy3XPast\n1z2rLdc9H1que1ZbrntWW657Vluuez60XPestlz3rLZc93xoRep5vpQyJ9LjEel6XiwLAAAAAOAV\nZoT93X0AAAAANVTf1xKfffaZOnfuXOH6UCik/Pz8Cqc8x1p1Z4RZCPu7+wAAAABqiLWELdVdCEft\n1OgtW7aod+/e6ty5s84880zNmjVL0uFXBUtOTlZGRoYyMjL08ssvh28zY8YMpaamqmPHjlq6dGn4\n+nXr1iktLU2pqamaOHFi+PoDBw5o+PDhSk1NVa9evfTpp5+GPzd79mx16NBBHTp00Jw5c2q1L1bf\n08zy+6P50HLds9py3bPact3zoeW6Z7Xlume15bpnteW650PLdc9qy3XPast1z4dWNHqIvai9anSj\nRo107733Kj09XV9++aW6deumfv36KRQK6YYbbtANN9xw1Nfn5+dr/vz5ys/PV1FRkc4//3wVFBQo\nFApp/Pjxys3NVWZmpgYOHKglS5YoOztbubm5SkpKUkFBgebPn6/Jkydr3rx5Kikp0R133KF169ZJ\nkrp166bBgwcrMTExWrsLAAAAADhB1Nmp0UOGDNE111yjlStXqkmTJpo0adJRn58xY4YaNGigyZMn\nS5Kys7M1bdo0tW3bVn369NEHH3wgSZo3b55ee+01Pfzww8rOztb06dPVs2dPlZWVqVWrVvriiy80\nd+5cvfHGG3rooYckHX6p7aysLF188cVHfU9OZwAAAPBTQmKCSneXfuvXxDeN155de+poi3CiYS1h\ni8n3ES4sLNSGDRvUq1cvrVy5Ug888IDmzJmj7t2763e/+50SExO1bds29erVK3yb5ORkFRUVqVGj\nRkcNYrdp00ZFRUWSpKKiIp122mmHdyQuTk2bNtWOHTu0bdu2o25T3gIAAAAkHV4ET6vka6Z9+0IZ\nwIkr6gvhL7/8Uj//+c91//33q0mTJho/frxuu+02SdLUqVM1adIk5ebmRnszIhozZoxSUlIkSYmJ\niUpPT1dWVpako2cBsrKywpeP/Xx1Lufl5em6666r8e2PvHzfffcdd3st9I6972rTO7Zp5f63/Hi6\nvP95PGvWs/p4Htu01LN6/7vu8XjyeJ5o97/lx7M293/Y5v/8t90Rfy6/XIvtO3Ybrdz/9fXxjOb9\n/2092FJ+fO/atUvS4SdkI3L3FsYVff3110H//v2De++997if37x5c3DmmWcGQRAEM2bMCGbMmBH+\n3IABA4JVq1YFxcXFQceOHcPXP/3008FVV10V/pq33norCIIg+Oabb4Lvfe97QRAEwdy5c4Mrr7wy\nfJsrrrgimDdvXoXvX9Xdt/rm3ry5emxbrntWW657Vluuez60XPestlz3rLZc96y2XPd8aLnuWWlJ\n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\nqjp27KilS5eGr1+3bp3S0tKUmpqqiRMnhq8/cOCAhg8frtTUVPXq1Uuffvpp+HOzZ89Whw4d1KFD\nB82ZM6dK2wsAAAAAqP8qnRGujTfffFNNmjTRqFGjwjPF06dPV3x8vG644YajvjY/P1+XXHKJ1q5d\nq6KiIp1//vkqKChQKBRSZmam/vCHPygzM1MDBw7Utddeq+zsbOXk5Oif//yncnJyNH/+fD3//POa\nN2+eSkpK1KNHD61bt06S1K1bN61bt06JiYlH7zwzwgAA1GvMCCMSZoQBP9R4Rrg2zjvvPDVr1qzC\n9cfbkIULF2rEiBFq1KiRUlJS1L59e61evVrFxcUqLS1VZmamJGnUqFF64YUXJEmLFi3S6NGjJUlD\nhw7VsmXLJEmvvPKK+vfvr8TERCUmJqpfv35asmRJtHYTAAAAAHACiepCOJIHHnhAXbp00WWXXRZ+\nIa5t27YpOTk5/DXJyckqKiqqcH2bNm1UVFQkSSoqKtJpp50mSYqLi1PTpk21Y8eOiK2asnp+OzMB\nsW257lltue5Zbbnu+dBy3bPact2z2nLds9qSZHZ202rLdc9qSxIzwrTqpGe15bpntVUu7ts+WVZW\nps6dO+ujjz5y9g3Hjx+v2267TZI0depUTZo0Sbm5uc761TVmzBilpKRIkhITE5Wenq6srCxJFe/w\n8svHfr46l/Py8mp1+yMv5+Xl1Xp7otlzdbmctfvf+uNp9XI5a/e/L49nOYs9y/c/j2f1L1t6PMML\nknb/+e/nx1z+z23q0+PJ349Vv78rHB/HXK5xL0I/1vd/fX08o/nz5Lpn+f6vD49nXl5e+MnWwsJC\nRVLpjPCFF16oWbNmqW3btt/2ZREVFhZq0KBBx33f4SM/N3PmTEnSlClTJEnZ2dmaPn262rZtq969\ne+uDDz6QJM2dO1dvvPGGHnroIWVnZ2vatGnq1auXysrK1KpVK33xxReaN2+eXnvtNT388MOSpCuv\nvFJ9+vTR8OHDj955ZoQBAKjXmBFGJMwIA36o8YxwSUmJOnfurD59+mjQoEEaNGiQBg8eXOMNKS4u\nDv/5+eefD7+i9ODBgzVv3jx9/fXX2rx5swoKCpSZmamWLVsqISFBq1evVhAEevLJJ3XhhReGbzN7\n9mxJ0rPPPqu+fftKkvr376+lS5dq165d2rlzp1599VUNGDCgxtsMAAAAAKg/Kl0I/8///I9efPFF\n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\nr1Z8fHxdb1vUMSMMAEDtWZ6PZA4UkXBsAH6ItOaLeGr073//exUVFek3v/mNWrdurfj4+PBHQkLN\n3hYAAAAAAIBYi7gQPnTokPbv36/S0tIKH3v27KnLbYw5q+e3MxMQ25brntWW657VluueDy3XPast\n1z2rLec9w/ORPsyBWj42rLYkeXFsuO750HLds9py3bPaKhdxIQwAAAAAQH0UcUbYB8wIAwBQe5bn\nI5kDRSQcG4Afqj0j7MK4cePUokULpaWlha8rKSlRv3791KFDB/Xv31+7du0Kf27GjBlKTU1Vx44d\ntXTp0vD169atU1pamlJTUzVx4sTw9QcOHNDw4cOVmpqqXr166dNPPw1/bvbs2erQoYM6dOigOXPm\nRHM3AQAAAAAnkKguhMeOHaslS5Ycdd3MmTPVr18/ffzxx+rbt69mzpwpScrPz9f8+fOVn5+vJUuW\n6Oqrrw6v3MePH6/c3FwVFBSooKAg3MzNzVVSUpIKCgp0/fXXa/LkyZIOL7bvuOMOrVmzRmvWrNH0\n6dOPWnBXl9Xz25kJiG3Ldc9qy3XPast1z4eW657Vluue1ZbznuH5SB/mQC0fG1Zbkrw4Nlz3fGi5\n7lltue5ZbZWL6kL4vPPOq/C+w4sWLdLo0aMlSaNHj9YLL7wgSVq4cKFGjBihRo0aKSUlRe3bt9fq\n1atVXFys0tJSZWZmSpJGjRoVvs2RraFDh2rZsmWSpFdeeUX9+/dXYmKiEhMT1a9fvwoLcgAAAACA\nn6I+I1xYWKhBgwbpvffekyQ1a9ZMO3fulHR4RqJ58+bauXOnJkyYoF69eunSSy+VJF1++eW64IIL\nlJKSoilTpujVV1+VJL355pu65557tHjxYqWlpemVV15R69atJSm8eH7iiSe0f/9+3XrrrZKk3/zm\nNzrllFM0adKko3eeGWEAAGrN8nwkc6CIhGMD8ENMZoQrEwqFDv/FAQAAAABAHYmr62/YokULff75\n52rZsqWKi4t16qmnSpLatGmjLVu2hL9u69atSk5OVps2bbR169YK15ff5rPPPlPr1q1VVlam3bt3\nKykpSW3atDnqPPItW7aoT58+x92eMWPGKCUlRZKUmJio9PR0ZWVlSTr6XPSsrKzw5WM/X53LeXl5\nuu6662p8+yMv33fffcfdXgu9Y++72vSObVq5/y0/ni7vfx7PmvWsPp7HNi31rN7/rnv18fGUdHge\n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\nooUkqUWLFtq+fbskadu2bUpOTg7fNjk5WUVFRRWub9OmjYqKiiRJRUVFOu200yRJcXFxatq0qUpK\nSupk3wAAAAAAdsXF6huvXLlSrVq10hdffKF+/fqpY8eOR30+FAodnreIsjFjxiglJUWSlJiYqPT0\ndGVlZUn6v395cH25XG175de52j6XvaysrKjdf1buf8uPp+v7n8ezfj2eli+Xs3T/u+7Vx8dT0uFn\nv9od8ecjHXO5ru//8Pcv375jt7eK/Qr70+4/H8fpuzz+Yv3zZPnnszY/T2GVPJ616h3ncqzv//r6\neJ5ol8tZuv9d92L1eObl5WnXrl2SpMLCQkUSsxfLOtL06dPVpEkTPfroo3rttdfUsmVLFRcXq3fv\n3vrwww/Ds8JTpkyRJGVnZ2v69Olq27atevfurQ8++ECSNHfuXL3xxht66KGHlJ2drWnTpqlXr14q\nKysLL7qPxItlAQBQe5ZfKIgXREIkHBuAH0y9WNbevXtVWloqSfrqq6+0dOlSpaWlafDgwZo9e7Yk\nafbs2RoyZIgkafDgwZo3b56+/vprbd68WQUFBcrMzFTLli2VkJCg1atXKwgCPfnkk7rwwgvDtylv\nPfvss+rbt2+Nt7fCv/TVgtWW654PLdc9qy3XPast1z0fWq57Vluue1ZbznuG5yN9mAO1fGxYbUny\n4thw3fOh5bpnteW6Z7VVLianRm/fvl0/+9nPJEllZWW69NJL1b9/f3Xv3l3Dhg1Tbm5u+O2TJKlT\np04aNmyYOnXqpLi4OOXk5IRPm87JydGYMWO0b98+DRw4UNnZ2ZKkyy67TCNHjlRqaqqSkpI0b968\nWOwqAAAAAMAYE6dGxwqnRgMAUHuWTwvl9FdEwrEB+MHUqdEAAAAAAMQKC+EqsHp+OzMBsW257llt\nue5Zbbnu+dBy3bPact2z2nLeMzwf6cMcqOVjw2pLkhfHhuueDy3XPast1z2rrXIshAEAAAAAXmFG\n2N/dBwDACcvzkcyBIhKODcAPzAgDAICwhMQEhUKhb/1ISEyI9WYCABAVLISrwOr57cwExLblume1\n5bpnteW650PLdc9qy3XPSqt0d+nhZ7CO/Bh99OXS3aU13zjD85E+zIHyM1BDHhwbrns+tFz3rLZc\n96y2yrEQBgAAAAB4hRlhf3cfAOAxX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqxen47MwGxbbnuWW25\n7lltue750HLds9py3bPakuTNfKQP+8nPQA15cGy47vnQct2z2nLds9oqx0IYAAAAAOAVZoT93X0A\ngGuWccgAACAASURBVMd8mY/0ZT9RfRwbgB+YEQYAAAAAQCyEq8Tq+e3MBMS25bpnpZWQmKBQKPSt\nHwmJCTHZtmi2XPd8aLnuWW257lltSfJmPtKH/eRnoIY8ODZc93xoue5ZbbnuWW2Vi3NeBHBCK91d\nWvH0rs2S2h3xNdNK63CLAAAAALeYEfZ394HjcjkzBcAuX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqx\nen47MwGxbbnuWW1JMjvnxOMZ25brntWW657VliRv5iN92E9+BmrIg2PDdc+Hluue1ZbrntVWORbC\nAAAAAACvMCPs7+4Dx8WMMOAHX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqxen47MwGxbbnuWW1JMjvn\nxOMZ25brntWW657VliRv5iN92E9+BmrIg2PDdc+Hluue1ZbrntVWORbCAAAAAACvMCPs7+4Dx8WM\nMOAHX+YjfdlPVB/HBuAHZoQBAAAAABAL4Sqxen47MwGxbbnuWW1JMjvnVB8fz4TEBIVCoUo/EhIT\n6nS76qJnteW6Z7UlyZv5SB/2k5+BGvLg2HDd86Hlume15bpntVUuznkRAFBjpbtLK55et1lSu2O+\nblppHW0RAABA/cOMsL+7DxwXM8KxxZwZ6oov85G+7Ceqj2MD8AMzwjEQ7VMcAQAAAADVx0K4Cmp6\nTnr4FMcjP0arwnWlu2t2iiMzAbFtue5ZbUkyO+fky+Np9f533bPact2z2pLkzXykD/vJz0ANeXBs\nuO750HLds9py3bPaKseMMACgziUkJlTpHwHjm8Zrz649dbBFAADAJ8wIR3H3mRfBiYgZ4djy5e8N\nX/bTMl/mI33ZT1QfxwbgB2aEAQAAAAAQC+EqYdaPVl30rLYkmT1ufXk8rd7/znue7KfVliRv5iN9\n2E9+BmrIg2PDdc+Hluue1ZbrntVWORbCAAAAAACvMCPMjDBwFGaEY8vy3xsuX+DK8n76wpf5SF/2\nE9XHsQH4IdKaj1eNBgBUSfgt4Sr7umk1e0s4AACAulKvT41esmSJOnbsqNTUVN1999017jAD9+0S\nEhMUCoUq/UhITKjT7Yp2y3XPakuS2ePWl8fT6v0viXm6etSS5M3j6cN+8jNQQx4cG657PrRc96y2\nXPestsrV24XwwYMHdc0112jJkiXKz8/X3Llz9cEHH9SolZeX527DPneXcrpdteiFnyU68mOAKlxX\nlVMqXW5XtFuue1Zbkswet748nlbvf0lOt83yflo9Nng8a8iD/eRnoIY8ODZc93xoue5ZbbnuWW2V\nq7cL4TVr1qh9+/ZKSUlRo0aNdPHFF2vhwoU1au3atcvdhu13l3K6Xa57Rvbz2Gerr7/+emfPVNd2\n206UliQzj2c0W7XpHe+sCKfHmtH7X5LTbbO8n1aPWx7PGvJgP/kZqCEPjg3XPR9arntWW657Vlvl\n6u2McFFRkU477bTw5eTkZK1evTqGW2RLpBe9mT59evjPVXnBG+sqzDQul9T7mK9hnhG1dNzZWY41\nAIABLn/nq0qrOj0glurtQjgUCtXodlFfIDr8x4zCwsIa3/a4v7g/L+lnR3xNbX5pr+F+Rv0vWMf/\nmFTTxyDa+1mbY+O4jD6ervfTac/lsWbk743j8mQ/XfastiR583j6sJ9WfgZc/3/geD2nizADx4br\n+8zl73xVaVWnd6z6+DPguuXyZ+BE+j3N+f8HVI/fPmnVqlWaNm2alixZIkmaMWOGGjRooMmTJ4e/\nJj09Xe+8806sNhEAAAAAEEVdunQ57oxxvV0Il5WV6YwzztCyZcvUunVrZWZmau7cufrRj34U600D\nAAAAAMRQvT01Oi4uTn/4wx80YMAAHTx4UJdddhmLYAAAAABA/X1GGAAAAACA46m3zwi78vnnn6tl\ny5ax3gwAAFBD69atq/Aimk2bNlXbtm0VF8evQieiPXv2KBQKKT4+PtabAuAExTPClejatavWr19f\no9sePHhQkydP1m9/+1vHW+XGzp07NWfOHBUWFqqsrEzS4VfbnjVrVpUbffv21bJly/SrX/1K99xz\nT622Jy0tLeLnQqGQ3n333Wo3P/nkE51++umVXlcdhYWF2rhxo84//3zt3btXZWVlSkio3vvDHjx4\nUA0bNpQk7d69Wxs3blRqamq1O+XKH4fKrquqTz75RK1atdIpp5wiSdq3b5+2b9+ulJSUardGjRql\n+++/X82aNZMklZSU6MYbb9Rjjz1W5cb+/ft18sknV/t7V5WLX6hcPwYHDx7U9u3bwz+bkvSDH/yg\nWo0gCLR169aj3krOmq+//loffPCBGjRooDPOOEMnnXRSrDdJkjRhwgSFQiGV/y8yFAopISFBPXr0\n0IUXXhiz7Xruuef005/+VI0bN3bSe++99771796quP/++zVx4kStWLFC5557bq1a7777rq644gpt\n3bpVAwcO1N133x3+uyMzM1Nr1qypUbdXr15at26dzjrrLEmH97tz587avXu3HnroIQ0YMKDKLRfH\nhsv/302ePFl33323FixYoGHDhlX5dlWRl5enN998U6FQSOedd566dOlSo86KFSs0ffr0Cr9vfPLJ\nJ9VurV27VuPGjdOePYdfwTYxMVG5ubnq3r17jbbNms2bN6tdu3ax3oxv9dZbb6lz587h31n27Nmj\nDz74QD179ozxlvln/fr16tq1a60aX3zxhb7//e872qITC/8MWona/DtBw4YNtWLFCgVBUOO3c5Kk\nJk2aRLx9KBQK/8+gugYOHKj/+q//0llnnaUGDRrUaDuLi4v1j3/8Q4sWLdLFF19coVGdH87FixdL\nknJyciRJI0eOVBAE+vOf/1ytbTrS0KFDtWHDhqOuu+iii7Ru3boa9R555BE9+uijKikp0aZNm7R1\n61aNHz++Woud+fPn65e//KWaNm2q3//+95o4caJ++MMfqqCgQI888oiys7Or3Nq3b5/27t2rL774\nQiUlJeHr9+zZo6Kiomrt25EuuugivfXWW+HLDRo00M9//nO9/fbb1W69++674V9kJal58+bV/sel\ns88+W+vXr9f/+3//T0899VS1tyESF79QReMxeOCBBzR9+nSdeuqp4X8wkQ7/8l5dF1xwgf75z3/W\naDuOFI2/h1566SVdddVV4X+Y+uSTT/THP/5RAwcOrHLjnHPO0cqVK4+7ff+fvfcOq+Jao8YXsd9o\njPUaYkMFC0WK9CYqKlYkELsUsWBEjT1RAY1GrBFMVKICFiwUjWDBBhZsKCKoGBAFUbBGBenF9/cH\nv5l7DqBh9mzuzfd9ruc5z+M5ZFb2mTOz563rlbM/FhcXIzU1FU5OTiAiREREQE1NDcnJyYiNjcWm\nTZtqzbVgwQIsW7YMTZo0weDBg5GUlIRffvkFEydOlLyuqKgofP/997C2tsbo0aMxePBgWRlNDw8P\nlJSUwNXVFePHj0fz5s0lcwQGBmL27Nnw9PSstt+yrMfHxwfGxsbYuXMnzM3NERkZiW7duqGsrIyZ\nV1VVFTt37oSmpiYAICUlBcuWLcPatWvh4OAgyRHmcW0IzzseOHbsGHx9fbF69WqujrCfnx+2b98O\n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\niCv/AxPbXB+4fNleAAAAAElFTkSuQmCC\n",
"text": [
""
]
}
],
"prompt_number": 32
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf.mime_type.value_counts().head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 33,
"text": [
"text/html 252401\n",
"text/plain 244182\n",
"image/jpeg 200075\n",
"image/gif 141428\n",
"image/png 116836\n",
"dtype: int64"
]
}
],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Lots of files!\"\n",
"print \"Total # of files (across all samples): %s\" %filesdf.shape[0]\n",
"print \"Total # of unique files: %s\" %len(filesdf['sha1'].unique())\n",
"print \"Total # of network sessions involving files: %s\" %len(filesdf['conn_uids'].unique())\n",
"print \"Total # of unique mime_types: %s\" %len(filesdf['mime_type'].unique())\n",
"print \"Total # of unique filenames: %s\" %len(filesdf['filename'].unique())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Lots of files!\n",
"Total # of files (across all samples): 1100106\n",
"Total # of unique files: 312453"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Total # of network sessions involving files: 238211"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Total # of unique mime_types: 46"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Total # of unique filenames: 18324"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# We can use some of the output from above and get rid of them and look are more exciting files\n",
"# Just an example, I don't think we'll do much with this data frame today\n",
"boring = set(['text/html','text/plain','image/jpeg','image/gif','image/png','application/xml','image/x-icon'])\n",
"exciting_filesdf = filesdf[filesdf['mime_type'].apply(lambda x: x not in boring)]\n",
"exciting_filesdf.head(2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ts | \n",
" fuid | \n",
" tx_hosts | \n",
" rx_hosts | \n",
" conn_uids | \n",
" source | \n",
" depth | \n",
" analyzers | \n",
" mime_type | \n",
" filename | \n",
" duration | \n",
" local_orig | \n",
" is_orig | \n",
" seen_bytes | \n",
" total_bytes | \n",
" missing_bytes | \n",
" overflow_bytes | \n",
" timedout | \n",
" parent_fuid | \n",
" md5 | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 4 | \n",
" 1.320786e+09 | \n",
" FitWMF3UfEasz2Vyql | \n",
" 75.119.221.151 | \n",
" 192.168.41.10 | \n",
" C9KyD7n902u8uko9j | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" application/x-shockwave-flash | \n",
" - | \n",
" 1.356016 | \n",
" - | \n",
" F | \n",
" 1177469 | \n",
" 1177469 | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" c2045c6a5e95a99f6ebbc073e62894cd | \n",
" ... | \n",
"
\n",
" \n",
" 7 | \n",
" 1.320786e+09 | \n",
" FAnnpf1X8a1w6JLtV9 | \n",
" 95.211.160.73 | \n",
" 192.168.41.10 | \n",
" CENibi3Z3bv3ZVlyqf | \n",
" HTTP | \n",
" 0 | \n",
" SHA1,MD5 | \n",
" application/x-dosexec | \n",
" - | \n",
" 0.895983 | \n",
" - | \n",
" F | \n",
" 342016 | \n",
" - | \n",
" 0 | \n",
" 0 | \n",
" F | \n",
" - | \n",
" ae12a0a1d449b9f2816d20546c477c0b | \n",
" ... | \n",
"
\n",
" \n",
"
\n",
"
2 rows \u00d7 24 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 35,
"text": [
" ts fuid tx_hosts rx_hosts \\\n",
"4 1.320786e+09 FitWMF3UfEasz2Vyql 75.119.221.151 192.168.41.10 \n",
"7 1.320786e+09 FAnnpf1X8a1w6JLtV9 95.211.160.73 192.168.41.10 \n",
"\n",
" conn_uids source depth analyzers mime_type \\\n",
"4 C9KyD7n902u8uko9j HTTP 0 SHA1,MD5 application/x-shockwave-flash \n",
"7 CENibi3Z3bv3ZVlyqf HTTP 0 SHA1,MD5 application/x-dosexec \n",
"\n",
" filename duration local_orig is_orig seen_bytes total_bytes \\\n",
"4 - 1.356016 - F 1177469 1177469 \n",
"7 - 0.895983 - F 342016 - \n",
"\n",
" missing_bytes overflow_bytes timedout parent_fuid \\\n",
"4 0 0 F - \n",
"7 0 0 F - \n",
"\n",
" md5 \n",
"4 c2045c6a5e95a99f6ebbc073e62894cd ... \n",
"7 ae12a0a1d449b9f2816d20546c477c0b ... \n",
"\n",
"[2 rows x 24 columns]"
]
}
],
"prompt_number": 35
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"After getting a high-level look at the data and doing our Python and pandas stretches we're set to move on to some more intresting ways to view the data and how different properties relate to one another.\n",
"
\n",
"Instead of looking at the top 10 of this or that, let's see how we can examine the top N broken down by various categories.\n",
"
\n",
"We'll start off easy and look at the most popular protocols and then the most popular mime-types by count within those protocls. Followed by a view of the same data but with the restriction that Bro know something about the filename, and last but not least we can look at the most popular filenames within a mime-type within a protocol!\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf['count'] = 1\n",
"filesdf[['source','mime_type','count']].groupby(['source','mime_type']).sum().sort('count', ascending=0).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" source | \n",
" mime_type | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" HTTP | \n",
" text/html | \n",
" 252401 | \n",
"
\n",
" \n",
" text/plain | \n",
" 244182 | \n",
"
\n",
" \n",
" image/jpeg | \n",
" 200075 | \n",
"
\n",
" \n",
" image/gif | \n",
" 141428 | \n",
"
\n",
" \n",
" image/png | \n",
" 116836 | \n",
"
\n",
" \n",
" binary | \n",
" 39964 | \n",
"
\n",
" \n",
" application/x-dosexec | \n",
" 30456 | \n",
"
\n",
" \n",
" application/x-shockwave-flash | \n",
" 17878 | \n",
"
\n",
" \n",
" application/jar | \n",
" 14372 | \n",
"
\n",
" \n",
" application/zip | \n",
" 12247 | \n",
"
\n",
" \n",
"
\n",
"
10 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 36,
"text": [
" count\n",
"source mime_type \n",
"HTTP text/html 252401\n",
" text/plain 244182\n",
" image/jpeg 200075\n",
" image/gif 141428\n",
" image/png 116836\n",
" binary 39964\n",
" application/x-dosexec 30456\n",
" application/x-shockwave-flash 17878\n",
" application/jar 14372\n",
" application/zip 12247\n",
"\n",
"[10 rows x 1 columns]"
]
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# We can get a slightly different view if we look at percentages of files\n",
"# Wonder how accurate the percentages are vs. monitored network traffic?\n",
"filesdf.groupby('source')['mime_type'].apply(lambda x: pd.value_counts(x)/x.count().astype(float)).head(20)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
"source \n",
"FTP_DATA application/x-java-applet 1.000000\n",
"HTTP text/html 0.229434\n",
" text/plain 0.221963\n",
" image/jpeg 0.181869\n",
" image/gif 0.128559\n",
" image/png 0.106205\n",
" binary 0.036328\n",
" application/x-dosexec 0.027685\n",
" application/x-shockwave-flash 0.016251\n",
" application/jar 0.013064\n",
" application/zip 0.011133\n",
" application/xml 0.006645\n",
" application/pdf 0.004922\n",
" application/vnd.ms-fontobject 0.002872\n",
" application/x-java-applet 0.002678\n",
" text/x-c 0.002036\n",
" application/octet-stream 0.001929\n",
" text/x-asm 0.001733\n",
" application/x-elc 0.000960\n",
" application/vnd.ms-cab-compressed 0.000865\n",
"dtype: float64"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf['count'] = 1\n",
"filesdf[filesdf['filename'] != '-'][['source','mime_type','count']].groupby(['source','mime_type']).sum().sort('count', ascending=0).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" source | \n",
" mime_type | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" HTTP | \n",
" application/x-dosexec | \n",
" 17793 | \n",
"
\n",
" \n",
" binary | \n",
" 16810 | \n",
"
\n",
" \n",
" application/jar | \n",
" 8874 | \n",
"
\n",
" \n",
" image/jpeg | \n",
" 4756 | \n",
"
\n",
" \n",
" application/pdf | \n",
" 4672 | \n",
"
\n",
" \n",
" application/zip | \n",
" 4247 | \n",
"
\n",
" \n",
" image/png | \n",
" 847 | \n",
"
\n",
" \n",
" image/gif | \n",
" 161 | \n",
"
\n",
" \n",
" text/plain | \n",
" 120 | \n",
"
\n",
" \n",
" text/html | \n",
" 80 | \n",
"
\n",
" \n",
"
\n",
"
10 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"text": [
" count\n",
"source mime_type \n",
"HTTP application/x-dosexec 17793\n",
" binary 16810\n",
" application/jar 8874\n",
" image/jpeg 4756\n",
" application/pdf 4672\n",
" application/zip 4247\n",
" image/png 847\n",
" image/gif 161\n",
" text/plain 120\n",
" text/html 80\n",
"\n",
"[10 rows x 1 columns]"
]
}
],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf[filesdf['filename'] != '-'][['source','mime_type','filename','count']].groupby(['source','mime_type','filename']).sum().sort('count', ascending=0).head(20)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" source | \n",
" mime_type | \n",
" filename | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" HTTP | \n",
" application/x-dosexec | \n",
" setup.exe | \n",
" 4471 | \n",
"
\n",
" \n",
" binary | \n",
" setup.exe | \n",
" 1461 | \n",
"
\n",
" \n",
" application/x-dosexec | \n",
" about.exe | \n",
" 1204 | \n",
"
\n",
" \n",
" contacts.exe | \n",
" 1170 | \n",
"
\n",
" \n",
" info.exe | \n",
" 1146 | \n",
"
\n",
" \n",
" calc.exe | \n",
" 1101 | \n",
"
\n",
" \n",
" readme.exe | \n",
" 1081 | \n",
"
\n",
" \n",
" scandsk.exe | \n",
" 645 | \n",
"
\n",
" \n",
" PluginInstall.exe | \n",
" 598 | \n",
"
\n",
" \n",
" files/load1.exe | \n",
" 432 | \n",
"
\n",
" \n",
" application/jar | \n",
" 938a99f1be85e19406438f9a572fdf71.jar | \n",
" 374 | \n",
"
\n",
" \n",
" loading.jar | \n",
" 351 | \n",
"
\n",
" \n",
" a03cb4b8e5bb148134a57a2c87ddacd9.jar | \n",
" 300 | \n",
"
\n",
" \n",
" application/x-dosexec | \n",
" files/load2.exe | \n",
" 231 | \n",
"
\n",
" \n",
" uplayermediaplayer-setup.exe | \n",
" 231 | \n",
"
\n",
" \n",
" foto43.exe | \n",
" 188 | \n",
"
\n",
" \n",
" binary | \n",
" ./files/cit_video.module | \n",
" 133 | \n",
"
\n",
" \n",
" image/png | \n",
" ad516503a11cd5ca435acc9bb6523536.png | \n",
" 127 | \n",
"
\n",
" \n",
" application/jar | \n",
" app.jar | \n",
" 112 | \n",
"
\n",
" \n",
" application/x-dosexec | \n",
" 2.exe | \n",
" 108 | \n",
"
\n",
" \n",
"
\n",
"
20 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 39,
"text": [
" count\n",
"source mime_type filename \n",
"HTTP application/x-dosexec setup.exe 4471\n",
" binary setup.exe 1461\n",
" application/x-dosexec about.exe 1204\n",
" contacts.exe 1170\n",
" info.exe 1146\n",
" calc.exe 1101\n",
" readme.exe 1081\n",
" scandsk.exe 645\n",
" PluginInstall.exe 598\n",
" files/load1.exe 432\n",
" application/jar 938a99f1be85e19406438f9a572fdf71.jar 374\n",
" loading.jar 351\n",
" a03cb4b8e5bb148134a57a2c87ddacd9.jar 300\n",
" application/x-dosexec files/load2.exe 231\n",
" uplayermediaplayer-setup.exe 231\n",
" foto43.exe 188\n",
" binary ./files/cit_video.module 133\n",
" image/png ad516503a11cd5ca435acc9bb6523536.png 127\n",
" application/jar app.jar 112\n",
" application/x-dosexec 2.exe 108\n",
"\n",
"[20 rows x 1 columns]"
]
}
],
"prompt_number": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The takeaway seems to be that if you're going to cause a file to be downloaded by a user over HTTP (malicious or not, but likely malicious) you should really call it 'setup.exe' followed not-so closely by: 'about.exe', 'contacts.exe', 'info.exe', 'calc.exe', 'readme.exe'. And looking for a mime-type of 'binary' or 'application/x-dosexec' should do pretty well."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Filenames with a '/' in them??\n",
"# Just some random exploring, wonder why these have a path associated w/them and not the rest? Questions for another day.\n",
"print filesdf[filesdf['filename'].str.contains('/')]['filename'].value_counts().head(10)\n",
"print \n",
"print filesdf[filesdf['filename'].str.contains('\\.\\.')]['filename'].value_counts()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"files/load1.exe 432\n",
"files/load2.exe 231\n",
"./files/cit_video.module 133\n",
"./files/cit_ffcookie.module 60\n",
"users/leftunch/file/ractrupt.exe 44\n",
"files/load5.exe 42\n",
"files/load3.exe 37\n",
"./files/barman.png 36\n",
"./files/up.bin 26\n",
"users/root/file/file.exe 26\n",
"dtype: int64\n",
"\n",
"./../load/12.exe 4\n",
"../admin/files/cit_video.module 2\n",
"Ray Rice had three TD\\xe2\\x80\\x99s..jpeg 2\n",
"../admin/files/cit_ffcookie.module 2\n",
"../admin/files/gconfig8.dll 2\n",
"\\xe1\\xba\\xa3nh h\\xc3\\xa0i h\\xc3\\xb3a ra ng\\xc3\\xa0nh c\\xc6\\xa1 kh\\xc3\\xad b\\xc3\\xa1ch khoa....jpg 2\n",
"../admin/files/webinjects/merged-1.txt 2\n",
"Sexy Dr..jpg 2\n",
"dtype: int64"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Lots of duplicate files Wonder what these look like?\n",
"filesdf.md5.value_counts().head()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 41,
"text": [
"28d6814f309ea289f847c69cf91194c6 8328\n",
"b4491705564909da7f9eaf749dbbfbb1 7527\n",
"cd2e0e43980a00fb6a2742d3afd803b8 5831\n",
"d9feff91276e487e595cc23f62d259bc 4740\n",
"325472601571f31e1bf00674c368d335 4320\n",
"dtype: int64"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf[filesdf['filename'] != '-'][['filename','mime_type','count']].groupby(['filename','mime_type']).sum().sort('count', ascending=0).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" filename | \n",
" mime_type | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" setup.exe | \n",
" application/x-dosexec | \n",
" 4471 | \n",
"
\n",
" \n",
" binary | \n",
" 1461 | \n",
"
\n",
" \n",
" about.exe | \n",
" application/x-dosexec | \n",
" 1204 | \n",
"
\n",
" \n",
" contacts.exe | \n",
" application/x-dosexec | \n",
" 1170 | \n",
"
\n",
" \n",
" info.exe | \n",
" application/x-dosexec | \n",
" 1146 | \n",
"
\n",
" \n",
" calc.exe | \n",
" application/x-dosexec | \n",
" 1101 | \n",
"
\n",
" \n",
" readme.exe | \n",
" application/x-dosexec | \n",
" 1081 | \n",
"
\n",
" \n",
" scandsk.exe | \n",
" application/x-dosexec | \n",
" 645 | \n",
"
\n",
" \n",
" PluginInstall.exe | \n",
" application/x-dosexec | \n",
" 598 | \n",
"
\n",
" \n",
" files/load1.exe | \n",
" application/x-dosexec | \n",
" 432 | \n",
"
\n",
" \n",
"
\n",
"
10 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 42,
"text": [
" count\n",
"filename mime_type \n",
"setup.exe application/x-dosexec 4471\n",
" binary 1461\n",
"about.exe application/x-dosexec 1204\n",
"contacts.exe application/x-dosexec 1170\n",
"info.exe application/x-dosexec 1146\n",
"calc.exe application/x-dosexec 1101\n",
"readme.exe application/x-dosexec 1081\n",
"scandsk.exe application/x-dosexec 645\n",
"PluginInstall.exe application/x-dosexec 598\n",
"files/load1.exe application/x-dosexec 432\n",
"\n",
"[10 rows x 1 columns]"
]
}
],
"prompt_number": 42
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf[filesdf['filename'] != '-'][['filename','md5','count']].groupby(['filename','md5']).sum().sort('count', ascending=0).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" filename | \n",
" md5 | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" loading.jar | \n",
" 2d272e75e6be0d397dcc9b493936d873 | \n",
" 238 | \n",
"
\n",
" \n",
" setup.exe | \n",
" 7776d42f2e2167591de7321b18704e9a | \n",
" 134 | \n",
"
\n",
" \n",
" b87668c676063c0f36f2c7faef6b7d3d | \n",
" 92 | \n",
"
\n",
" \n",
" 618ba1bbd7e537482f7e058419fa8a28 | \n",
" 92 | \n",
"
\n",
" \n",
" 405f6ef1172501148ac36495780a69d0 | \n",
" 78 | \n",
"
\n",
" \n",
" 938a99f1be85e19406438f9a572fdf71.jar | \n",
" e872a71a6060413c1abfa5e41839aa8d | \n",
" 72 | \n",
"
\n",
" \n",
" ad516503a11cd5ca435acc9bb6523536.png | \n",
" 102345b9de00a7f5d7ee00f688ba68ab | \n",
" 72 | \n",
"
\n",
" \n",
" 938a99f1be85e19406438f9a572fdf71.jar | \n",
" 88f7ddd10321d1a035b05a7a0ca263f1 | \n",
" 66 | \n",
"
\n",
" \n",
" foto43.exe | \n",
" 0cd1f2bc16529f88a919830c87f180f7 | \n",
" 66 | \n",
"
\n",
" \n",
" Applet.jar | \n",
" 0e658e5217ea9f0d28e60ab491e716f2 | \n",
" 63 | \n",
"
\n",
" \n",
"
\n",
"
10 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 43,
"text": [
" count\n",
"filename md5 \n",
"loading.jar 2d272e75e6be0d397dcc9b493936d873 238\n",
"setup.exe 7776d42f2e2167591de7321b18704e9a 134\n",
" b87668c676063c0f36f2c7faef6b7d3d 92\n",
" 618ba1bbd7e537482f7e058419fa8a28 92\n",
" 405f6ef1172501148ac36495780a69d0 78\n",
"938a99f1be85e19406438f9a572fdf71.jar e872a71a6060413c1abfa5e41839aa8d 72\n",
"ad516503a11cd5ca435acc9bb6523536.png 102345b9de00a7f5d7ee00f688ba68ab 72\n",
"938a99f1be85e19406438f9a572fdf71.jar 88f7ddd10321d1a035b05a7a0ca263f1 66\n",
"foto43.exe 0cd1f2bc16529f88a919830c87f180f7 66\n",
"Applet.jar 0e658e5217ea9f0d28e60ab491e716f2 63\n",
"\n",
"[10 rows x 1 columns]"
]
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"It seems (from this data) there is a fair amount of resuse of both filenames and actual samples. Perhaps these samples were of the more boring exploit kits that don't try to obfuscate each individual download. Oh well, at least we've got some easy potential IOCs to look for.\n",
"
\n",
"Now we've got some hunches, how can we back these up using the results of the MHR events we found earlier?\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Lookup to see what the Bro - Team Cymru Malware Hash Registry picks up\n",
"def tc_mhr_present_single(sha1):\n",
" if sha1 in hashes:\n",
" return True\n",
" return False\n",
"\n",
"tempdf = filesdf\n",
"tempdf['count'] = 1\n",
"tempdf['mhr'] = tempdf['sha1'].map(tc_mhr_present_single)\n",
"# The following 2 Commands Print out the tables below\n",
"#tempdf[tempdf['filename'] != '-'][['mhr','filename','count']].groupby(['mhr','filename']).sum().sort('count', ascending=0).head(12)\n",
"#tempdf[tempdf['filename'] != '-'][['filename','mhr','count']].groupby(['filename','mhr']).sum().sort('count', ascending=0).head(12)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 44
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The tables below were converted to .png files for pretty display, but they're just screen-caps of the above commands\n",
"
\n",
"
\n",
""
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tempdf.groupby('mhr')['filename'].apply(lambda x: pd.value_counts(x)/len(tempdf.index))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 45,
"text": [
"mhr \n",
"False - 0.940176\n",
" setup.exe 0.003344\n",
" scandsk.exe 0.000546\n",
" PluginInstall.exe 0.000544\n",
" contacts.exe 0.000528\n",
" about.exe 0.000525\n",
" readme.exe 0.000515\n",
" calc.exe 0.000509\n",
" info.exe 0.000499\n",
" files/load1.exe 0.000230\n",
" a03cb4b8e5bb148134a57a2c87ddacd9.jar 0.000224\n",
" uplayermediaplayer-setup.exe 0.000210\n",
" 938a99f1be85e19406438f9a572fdf71.jar 0.000204\n",
" foto43.exe 0.000157\n",
" files/load2.exe 0.000135\n",
"...\n",
"True windows-update-sp4-kb66639-setup.exe 0.000001\n",
" f13f6a19.jar 0.000001\n",
" 34dcaa0c.jar 0.000001\n",
" 7af76.pdf 0.000001\n",
" windows-update-sp3-kb74463-setup.exe 0.000001\n",
" windows-update-sp2-kb66551-setup.exe 0.000001\n",
" a37002b0.jar 0.000001\n",
" windows-update-sp2-kb88572-setup.exe 0.000001\n",
" d1af818e.jar 0.000001\n",
" load/49.exe 0.000001\n",
" FIX_KB111703.exe 0.000001\n",
" windows-update-sp2-kb81951-setup.exe 0.000001\n",
" c5d53367.jar 0.000001\n",
" 2bba99f3.jar 0.000001\n",
" 3.exe 0.000001\n",
"Length: 18400, dtype: float64"
]
}
],
"prompt_number": 45
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"<SURPRISE> AV isn't perfect </SURPRISE>\n",
"\n",
"\n",
"\n",
"
\n",
"At least we got that out of our systems we can keep moving foward and see what else we can discover!\n",
""
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Number of files per sample\n",
"filesdf[['sample','count']].groupby(['sample']).sum().sort('count', ascending=0).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" count | \n",
"
\n",
" \n",
" sample | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" fffa22264e6ebebdfcc3c9526d8bc19c_20130313 | \n",
" 14598 | \n",
"
\n",
" \n",
" c352624409de5b479f26a904c29d413f_20130719 | \n",
" 4936 | \n",
"
\n",
" \n",
" ef3be687d525c85b00a91efdfda711e9_20121204 | \n",
" 4928 | \n",
"
\n",
" \n",
" 51e711110049f0788bcac16b0acd558a_20130814 | \n",
" 4674 | \n",
"
\n",
" \n",
" e259f0c751b02bd2419538ddc6b99772_20140314 | \n",
" 3496 | \n",
"
\n",
" \n",
" d3819a56d678838f0e01fa2c637f3b1a_20111004 | \n",
" 3480 | \n",
"
\n",
" \n",
" 7138d1cd36d383673844013d4eae97af_20130116 | \n",
" 3312 | \n",
"
\n",
" \n",
" ae3d23caa091be1d3df1107898ea5231_20110902 | \n",
" 3292 | \n",
"
\n",
" \n",
" a1da196baea54a71d34e6421b7a8f040_20130908 | \n",
" 3210 | \n",
"
\n",
" \n",
" 0f0fd9ada450841ab1fd767d7387e489_20130803 | \n",
" 3198 | \n",
"
\n",
" \n",
"
\n",
"
10 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 46,
"text": [
" count\n",
"sample \n",
"fffa22264e6ebebdfcc3c9526d8bc19c_20130313 14598\n",
"c352624409de5b479f26a904c29d413f_20130719 4936\n",
"ef3be687d525c85b00a91efdfda711e9_20121204 4928\n",
"51e711110049f0788bcac16b0acd558a_20130814 4674\n",
"e259f0c751b02bd2419538ddc6b99772_20140314 3496\n",
"d3819a56d678838f0e01fa2c637f3b1a_20111004 3480\n",
"7138d1cd36d383673844013d4eae97af_20130116 3312\n",
"ae3d23caa091be1d3df1107898ea5231_20110902 3292\n",
"a1da196baea54a71d34e6421b7a8f040_20130908 3210\n",
"0f0fd9ada450841ab1fd767d7387e489_20130803 3198\n",
"\n",
"[10 rows x 1 columns]"
]
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf[['conn_uids','count']].groupby(['conn_uids']).sum().sort('count', ascending=0).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" count | \n",
"
\n",
" \n",
" conn_uids | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" C9KyD7n902u8uko9j | \n",
" 2916 | \n",
"
\n",
" \n",
" CENibi3Z3bv3ZVlyqf | \n",
" 972 | \n",
"
\n",
" \n",
" COhNOY1kIa174wPKK6 | \n",
" 972 | \n",
"
\n",
" \n",
" CCBO2p2JDrryA2k1gb | \n",
" 972 | \n",
"
\n",
" \n",
" CaTFVw42sBoMSa9Zcl | \n",
" 972 | \n",
"
\n",
" \n",
" CBiXTD427Vvn9DXymd | \n",
" 972 | \n",
"
\n",
" \n",
" CN0i562AIvEXAXVdS6 | \n",
" 972 | \n",
"
\n",
" \n",
" CVANI54q1eA8PJEPNl | \n",
" 972 | \n",
"
\n",
" \n",
" C9O3nw2UUAuRVkxqHe | \n",
" 972 | \n",
"
\n",
" \n",
" CgQrNE10zxxoKNF1O7 | \n",
" 972 | \n",
"
\n",
" \n",
"
\n",
"
10 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 47,
"text": [
" count\n",
"conn_uids \n",
"C9KyD7n902u8uko9j 2916\n",
"CENibi3Z3bv3ZVlyqf 972\n",
"COhNOY1kIa174wPKK6 972\n",
"CCBO2p2JDrryA2k1gb 972\n",
"CaTFVw42sBoMSa9Zcl 972\n",
"CBiXTD427Vvn9DXymd 972\n",
"CN0i562AIvEXAXVdS6 972\n",
"CVANI54q1eA8PJEPNl 972\n",
"C9O3nw2UUAuRVkxqHe 972\n",
"CgQrNE10zxxoKNF1O7 972\n",
"\n",
"[10 rows x 1 columns]"
]
}
],
"prompt_number": 47
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's always fun when data causes more questions than it answers! What's with all the repeated 972s above? Maybe we're not looking at it correctly"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf[['sample','conn_uids','count']].groupby(['sample','conn_uids']).sum().sort('count', ascending=0).head(20)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" sample | \n",
" conn_uids | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" fffa22264e6ebebdfcc3c9526d8bc19c_20130313 | \n",
" C9KyD7n902u8uko9j | \n",
" 2910 | \n",
"
\n",
" \n",
" CVANI54q1eA8PJEPNl | \n",
" 970 | \n",
"
\n",
" \n",
" C3lCz83lC3PGZKMUR9 | \n",
" 970 | \n",
"
\n",
" \n",
" C9O3nw2UUAuRVkxqHe | \n",
" 970 | \n",
"
\n",
" \n",
" CBiXTD427Vvn9DXymd | \n",
" 970 | \n",
"
\n",
" \n",
" CCBO2p2JDrryA2k1gb | \n",
" 970 | \n",
"
\n",
" \n",
" CN0i562AIvEXAXVdS6 | \n",
" 970 | \n",
"
\n",
" \n",
" COhNOY1kIa174wPKK6 | \n",
" 970 | \n",
"
\n",
" \n",
" CENibi3Z3bv3ZVlyqf | \n",
" 970 | \n",
"
\n",
" \n",
" Cf6EYC22yHQsulV7mc | \n",
" 970 | \n",
"
\n",
" \n",
" CgQksU3fAxqa2VzJmi | \n",
" 970 | \n",
"
\n",
" \n",
" CgQrNE10zxxoKNF1O7 | \n",
" 970 | \n",
"
\n",
" \n",
" CaTFVw42sBoMSa9Zcl | \n",
" 970 | \n",
"
\n",
" \n",
" c352624409de5b479f26a904c29d413f_20130719 | \n",
" CFPUpI2zTBwvTHZWe5 | \n",
" 468 | \n",
"
\n",
" \n",
" C7HuQHe3tlEc740dk | \n",
" 450 | \n",
"
\n",
" \n",
" 42c918193f5f3fe008e1ad8007ee0a64_20120612 | \n",
" CNCa6Z2Ybjei8Cu0B | \n",
" 446 | \n",
"
\n",
" \n",
" CJtgFl3ASjdriC7976 | \n",
" 438 | \n",
"
\n",
" \n",
" b1321a9f0dd6c48c296a07205557b969_20120201 | \n",
" CNzvnh3VdsIivzr2z8 | \n",
" 346 | \n",
"
\n",
" \n",
" CyP6oYOs7782sfNO1 | \n",
" 310 | \n",
"
\n",
" \n",
" 9003a3423d9e3d05d96b4a09d8d64c61_20120131 | \n",
" CgDZVO1O4jpz7Rz3uj | \n",
" 292 | \n",
"
\n",
" \n",
"
\n",
"
20 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 48,
"text": [
" count\n",
"sample conn_uids \n",
"fffa22264e6ebebdfcc3c9526d8bc19c_20130313 C9KyD7n902u8uko9j 2910\n",
" CVANI54q1eA8PJEPNl 970\n",
" C3lCz83lC3PGZKMUR9 970\n",
" C9O3nw2UUAuRVkxqHe 970\n",
" CBiXTD427Vvn9DXymd 970\n",
" CCBO2p2JDrryA2k1gb 970\n",
" CN0i562AIvEXAXVdS6 970\n",
" COhNOY1kIa174wPKK6 970\n",
" CENibi3Z3bv3ZVlyqf 970\n",
" Cf6EYC22yHQsulV7mc 970\n",
" CgQksU3fAxqa2VzJmi 970\n",
" CgQrNE10zxxoKNF1O7 970\n",
" CaTFVw42sBoMSa9Zcl 970\n",
"c352624409de5b479f26a904c29d413f_20130719 CFPUpI2zTBwvTHZWe5 468\n",
" C7HuQHe3tlEc740dk 450\n",
"42c918193f5f3fe008e1ad8007ee0a64_20120612 CNCa6Z2Ybjei8Cu0B 446\n",
" CJtgFl3ASjdriC7976 438\n",
"b1321a9f0dd6c48c296a07205557b969_20120201 CNzvnh3VdsIivzr2z8 346\n",
" CyP6oYOs7782sfNO1 310\n",
"9003a3423d9e3d05d96b4a09d8d64c61_20120131 CgDZVO1O4jpz7Rz3uj 292\n",
"\n",
"[20 rows x 1 columns]"
]
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filesdf[filesdf['conn_uids'] == 'CVANI54q1eA8PJEPNl'].shape[0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 49,
"text": [
"972"
]
}
],
"prompt_number": 49
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print filesdf[filesdf['conn_uids'] == 'CVANI54q1eA8PJEPNl']['sample'].unique()\n",
"print filesdf[filesdf['conn_uids'] == 'C9KyD7n902u8uko9j']['sample'].unique() "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[fffa22264e6ebebdfcc3c9526d8bc19c_20130313\n",
" 2f261ef858fe6ac50d3c1a4f9abf9090_20111108]\n",
"[fffa22264e6ebebdfcc3c9526d8bc19c_20130313\n",
" 2f261ef858fe6ac50d3c1a4f9abf9090_20111108]"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 50
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Guess Bro conn uids weren't as unique as I thought they should be.\n",
"\n",
"\n",
"\n",
"\n",
"Let's move on, quickly, shall we!\n",
"\n",
"\n",
"Now that we have a good handle on the data and the successes/failurs of AV, what if we could figure out what samples and sessions had \"interesting\" combinations of file types. Could we build a better driveby detector?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# These are so we can pick up combinations of executable/persistent mime-types along with a mime-type that is frequently\n",
"# associated with exploits/drivebys\n",
"executable_types = set(['application/x-dosexec', 'application/octet-stream', 'binary', 'application/vnd.ms-cab-compressed'])\n",
"common_exploit_types = set(['application/x-java-applet','application/pdf','application/zip','application/jar','application/x-shockwave-flash'])\n",
"\n",
"# If there is at least one executable type and one exploit type in a list of mime-types\n",
"def intresting_combo_data(mimetypes):\n",
" mt = set(mimetypes.tolist())\n",
" et = set()\n",
" cet = set()\n",
" et = mt.intersection(executable_types)\n",
" cet = mt.intersection(common_exploit_types)\n",
" if len(et) > 0 and len(cet) > 0:\n",
" return \":\".join(cet) + \":\" + \":\".join(et)\n",
" if len(et) > 0 and len(cet) == 0:\n",
" return \":\".join(et)\n",
" if len(cet) > 0 and len(et) == 0:\n",
" return \":\".join(cet)\n",
" return \"NONE\"\n",
"\n",
"def intresting_combo_label(mimetypes):\n",
" mt = set(mimetypes.tolist())\n",
" et = set()\n",
" cet = set()\n",
" et = mt.intersection(executable_types)\n",
" cet = mt.intersection(common_exploit_types)\n",
" if len(et) > 0 and len(cet) > 0:\n",
" return \"C-c-c-combo\"\n",
" if len(et) > 0 and len(cet) == 0:\n",
" return \"Executable only\"\n",
" if len(cet) > 0 and len(et) == 0:\n",
" return \"Exploit only\"\n",
" return \"NONE\"\n",
"\n",
"# Lookup to see what the Bro - Team Cymru Malware Hash Registry picks up\n",
"def tc_mhr_present(sha1):\n",
" for h in set(sha1.tolist()):\n",
" if h in hashes:\n",
" return True\n",
" return False"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 51
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Get the data in a list (Series) of -> \n",
"sample_groups = filesdf.groupby('sample')\n",
"s = sample_groups['mime_type'].apply(lambda x: x.unique())\n",
"\n",
"# Rebuild the series into a dataframe and then \"collapse\" the dataframe with a reset index\n",
"sample_combos = pd.DataFrame(s, columns=['mime_types'])\n",
"sample_combos['sample'] = s.index\n",
"sample_combos['combos_data'] = s.map(intresting_combo_data)\n",
"sample_combos['combos_label'] = s.map(intresting_combo_label)\n",
"\n",
"# Add some more columns and reset the index\n",
"sample_combos['sha1'] = sample_groups['sha1'].apply(lambda x: x.unique())\n",
"sample_combos['num_files'] = sample_groups['sha1'].apply(lambda x: len(x))\n",
"sample_combos = sample_combos.reset_index(drop=True)\n",
"sample_combos['mhr'] = sample_combos['sha1'].map(tc_mhr_present)\n",
"sample_combos.head()\n",
"# Now we have a nice \"flat\" dataframe that for each sample has a list of sha1s associated with it, along with mime-types\n",
"# associated with it. Including the list of interesting mime-type combinations and if any of the sha1 hashes were picked up in\n",
"# the MHR"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" mime_types | \n",
" sample | \n",
" combos_data | \n",
" combos_label | \n",
" sha1 | \n",
" num_files | \n",
" mhr | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" [text/html, text/plain, image/jpeg, applicatio... | \n",
" 00065098d5b9f76f15b7eafadc0fd262_20120531 | \n",
" application/zip:application/x-dosexec:binary | \n",
" C-c-c-combo | \n",
" [faa7c496d19abe7fdb0e46deeac899353a6d29f8, a37... | \n",
" 84 | \n",
" True | \n",
"
\n",
" \n",
" 1 | \n",
" [text/html, image/png, text/plain, image/jpeg,... | \n",
" 0009e3e91e87268dfa577f4626072bab_20120615 | \n",
" application/zip:application/x-dosexec:binary | \n",
" C-c-c-combo | \n",
" [7f140fddab21ae35f577f3527aed9933d05b58d3, 32f... | \n",
" 66 | \n",
" False | \n",
"
\n",
" \n",
" 2 | \n",
" [text/plain, text/html, image/jpeg, image/gif,... | \n",
" 001d54c3e3f4cb05bc7676c98d70d0ec_20120509 | \n",
" application/x-shockwave-flash:application/pdf:... | \n",
" C-c-c-combo | \n",
" [3e611f6de96f98df23791dc837aa62f0d627a366, 17a... | \n",
" 350 | \n",
" True | \n",
"
\n",
" \n",
" 3 | \n",
" [text/html, text/plain, application/jar, appli... | \n",
" 0020e9fc0bf7538cdf75b0308c5a236c_20121230 | \n",
" application/x-shockwave-flash:application/jar:... | \n",
" C-c-c-combo | \n",
" [fad057c5e1022a584646517aa2a4ef2998937490, cda... | \n",
" 126 | \n",
" True | \n",
"
\n",
" \n",
" 4 | \n",
" [text/html, text/plain, image/gif, application... | \n",
" 002487431d095f45222491166c16f2ae_20120121 | \n",
" application/x-shockwave-flash:application/jar:... | \n",
" C-c-c-combo | \n",
" [fea5705f0bfa0f45a6dac2dbc8ffa9106a7bc3f4, be0... | \n",
" 132 | \n",
" True | \n",
"
\n",
" \n",
"
\n",
"
5 rows \u00d7 7 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 52,
"text": [
" mime_types \\\n",
"0 [text/html, text/plain, image/jpeg, applicatio... \n",
"1 [text/html, image/png, text/plain, image/jpeg,... \n",
"2 [text/plain, text/html, image/jpeg, image/gif,... \n",
"3 [text/html, text/plain, application/jar, appli... \n",
"4 [text/html, text/plain, image/gif, application... \n",
"\n",
" sample \\\n",
"0 00065098d5b9f76f15b7eafadc0fd262_20120531 \n",
"1 0009e3e91e87268dfa577f4626072bab_20120615 \n",
"2 001d54c3e3f4cb05bc7676c98d70d0ec_20120509 \n",
"3 0020e9fc0bf7538cdf75b0308c5a236c_20121230 \n",
"4 002487431d095f45222491166c16f2ae_20120121 \n",
"\n",
" combos_data combos_label \\\n",
"0 application/zip:application/x-dosexec:binary C-c-c-combo \n",
"1 application/zip:application/x-dosexec:binary C-c-c-combo \n",
"2 application/x-shockwave-flash:application/pdf:... C-c-c-combo \n",
"3 application/x-shockwave-flash:application/jar:... C-c-c-combo \n",
"4 application/x-shockwave-flash:application/jar:... C-c-c-combo \n",
"\n",
" sha1 num_files mhr \n",
"0 [faa7c496d19abe7fdb0e46deeac899353a6d29f8, a37... 84 True \n",
"1 [7f140fddab21ae35f577f3527aed9933d05b58d3, 32f... 66 False \n",
"2 [3e611f6de96f98df23791dc837aa62f0d627a366, 17a... 350 True \n",
"3 [fad057c5e1022a584646517aa2a4ef2998937490, cda... 126 True \n",
"4 [fea5705f0bfa0f45a6dac2dbc8ffa9106a7bc3f4, be0... 132 True \n",
"\n",
"[5 rows x 7 columns]"
]
}
],
"prompt_number": 52
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With the nice table above we have a sample view of the unique mime-types, unique files, total # of files and if any of those files were detected by the MHR all rolled into once nice package.\n",
"\n",
"
\n",
"Assumption Alert!\n",
"
\n",
"In the case of using sample (eg. PCAP) we can treat this as activity from a single host w/o worry about trying to unique out all the information about the sandbox env and it's IPs.\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Reminder\"\n",
"print \"Total files found: %s\" %len(filesdf.index)\n",
"print \"Total Samples: %s\" %len(sample_combos.index)\n",
"print \"\\nData summary\"\n",
"print sample_combos.combos_label.value_counts()\n",
"sample_combos['count'] = 1\n",
"sample_combos[['combos_label','combos_data','count']].groupby(['combos_label','combos_data']).sum().sort('count', ascending=0).head(15)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Reminder\n",
"Total files found: 1100106\n",
"Total Samples: 6662\n",
"\n",
"Data summary\n",
"C-c-c-combo 5410\n",
"Executable only 1218\n",
"Exploit only 25\n",
"NONE 9\n",
"dtype: int64\n"
]
},
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" combos_label | \n",
" combos_data | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" Executable only | \n",
" application/x-dosexec | \n",
" 801 | \n",
"
\n",
" \n",
" C-c-c-combo | \n",
" application/jar:application/x-dosexec | \n",
" 403 | \n",
"
\n",
" \n",
" application/zip:application/x-dosexec:binary | \n",
" 361 | \n",
"
\n",
" \n",
" application/jar:application/x-dosexec:binary | \n",
" 352 | \n",
"
\n",
" \n",
" Executable only | \n",
" application/x-dosexec:binary | \n",
" 305 | \n",
"
\n",
" \n",
" C-c-c-combo | \n",
" application/jar:application/pdf:application/x-dosexec:binary | \n",
" 303 | \n",
"
\n",
" \n",
" application/zip:application/pdf:application/x-dosexec:binary | \n",
" 274 | \n",
"
\n",
" \n",
" application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary | \n",
" 248 | \n",
"
\n",
" \n",
" application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec | \n",
" 238 | \n",
"
\n",
" \n",
" application/x-shockwave-flash:application/x-dosexec | \n",
" 228 | \n",
"
\n",
" \n",
" application/zip:application/x-dosexec | \n",
" 184 | \n",
"
\n",
" \n",
" application/zip:application/x-shockwave-flash:application/x-dosexec:binary | \n",
" 181 | \n",
"
\n",
" \n",
" application/x-shockwave-flash:application/pdf:application/x-dosexec | \n",
" 172 | \n",
"
\n",
" \n",
" application/x-shockwave-flash:application/jar:application/pdf:application/x-dosexec:binary | \n",
" 171 | \n",
"
\n",
" \n",
" application/x-shockwave-flash:application/jar:application/x-dosexec:binary | \n",
" 168 | \n",
"
\n",
" \n",
"
\n",
"
15 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 53,
"text": [
" count\n",
"combos_label combos_data \n",
"Executable only application/x-dosexec 801\n",
"C-c-c-combo application/jar:application/x-dosexec 403\n",
" application/zip:application/x-dosexec:binary 361\n",
" application/jar:application/x-dosexec:binary 352\n",
"Executable only application/x-dosexec:binary 305\n",
"C-c-c-combo application/jar:application/pdf:application/x-dosexec:binary 303\n",
" application/zip:application/pdf:application/x-dosexec:binary 274\n",
" application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 248\n",
" application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 238\n",
" application/x-shockwave-flash:application/x-dosexec 228\n",
" application/zip:application/x-dosexec 184\n",
" application/zip:application/x-shockwave-flash:application/x-dosexec:binary 181\n",
" application/x-shockwave-flash:application/pdf:application/x-dosexec 172\n",
" application/x-shockwave-flash:application/jar:application/pdf:application/x-dosexec:binary 171\n",
" application/x-shockwave-flash:application/jar:application/x-dosexec:binary 168\n",
"\n",
"[15 rows x 1 columns]"
]
}
],
"prompt_number": 53
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"(100. * sample_combos.combos_data.value_counts() / len(sample_combos.index)).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 54,
"text": [
"application/x-dosexec 12.023416\n",
"application/jar:application/x-dosexec 6.049234\n",
"application/zip:application/x-dosexec:binary 5.418793\n",
"application/jar:application/x-dosexec:binary 5.283699\n",
"application/x-dosexec:binary 4.578205\n",
"application/jar:application/pdf:application/x-dosexec:binary 4.548184\n",
"application/zip:application/pdf:application/x-dosexec:binary 4.112879\n",
"application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 3.722606\n",
"application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 3.572501\n",
"application/x-shockwave-flash:application/x-dosexec 3.422396\n",
"dtype: float64"
]
}
],
"prompt_number": 54
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Sorry for the lousy formatting, I really wanted (me) and you to see all the crazy combinations of files in some of these samples.\n",
"# Maybe they're multiple malicious sites, or maybe it's just some crazy spray-and-pray happening!\n",
"sample_mhr = sample_combos[sample_combos['mhr'] == True]\n",
"print \"Total Samples: %s\" %len(sample_mhr.index) \n",
"print\n",
"print sample_mhr.combos_label.value_counts()\n",
"print\n",
"print (100. * sample_mhr.combos_data.value_counts() / len(sample_mhr.index)).head(10)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Total Samples: 2849\n",
"\n",
"C-c-c-combo 2761\n",
"Executable only 85\n",
"Exploit only 3\n",
"dtype: int64\n",
"\n",
"application/jar:application/x-dosexec 9.582310\n",
"application/jar:application/pdf:application/x-dosexec:binary 7.230607\n",
"application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec:binary 7.195507\n",
"application/zip:application/pdf:application/x-shockwave-flash:application/x-dosexec 6.739207\n",
"application/zip:application/x-dosexec:binary 6.598807\n",
"application/zip:application/pdf:application/x-dosexec:binary 5.440505\n",
"application/jar:application/x-dosexec:binary 5.229905\n",
"application/x-shockwave-flash:application/pdf:application/x-dosexec 4.563005\n",
"application/x-shockwave-flash:application/pdf:application/x-dosexec:binary 3.580204\n",
"application/x-shockwave-flash:application/jar:application/pdf:application/x-dosexec:binary 3.545104\n",
"dtype: float64\n"
]
}
],
"prompt_number": 55
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"We've got a great picture at how things could look coming from a host in a \"short\" amount of itme, wonder what it looks like when it's broken up at the network layer. Let's mimic the layout and some of the analysis from above and see what pops up.\n",
"
\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Get the data in a list (Series) of -> \n",
"uid_groups = filesdf.groupby('conn_uids')\n",
"s = uid_groups['mime_type'].apply(lambda x: x.unique())\n",
"\n",
"# Rebuild the series into a dataframe and then \"collapse\" the dataframe with a reset index\n",
"uid_combos = pd.DataFrame(s, columns=['mime_types'])\n",
"uid_combos['conn_uid'] = s.index\n",
"uid_combos['combos_data'] = s.map(intresting_combo_data)\n",
"uid_combos['combos_label'] = s.map(intresting_combo_label)\n",
"\n",
"# Same trick, different day\n",
"uid_combos['sha1'] = uid_groups['sha1'].apply(lambda x: x.unique())\n",
"uid_combos['num_files'] = uid_groups['sha1'].apply(lambda x: len(x))\n",
"uid_combos = uid_combos.reset_index(drop=True)\n",
"uid_combos = uid_combos[uid_combos['conn_uid'] != '(empty)']\n",
"uid_combos['mhr'] = uid_combos['sha1'].map(tc_mhr_present)\n",
"uid_combos.head()\n",
"# Now we've got the same type of dataframe as above in sample_combos."
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" mime_types | \n",
" conn_uid | \n",
" combos_data | \n",
" combos_label | \n",
" sha1 | \n",
" num_files | \n",
" mhr | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" [image/png, text/plain] | \n",
" C000io4MJcSJMUYhmb | \n",
" NONE | \n",
" NONE | \n",
" [d34f84ee29438bba5c353a9d20f3536badb38178, 577... | \n",
" 32 | \n",
" False | \n",
"
\n",
" \n",
" 2 | \n",
" [image/jpeg] | \n",
" C001r8hbIKrnTGyHf | \n",
" NONE | \n",
" NONE | \n",
" [74d87f7b1ca35f84cd4f1a08314c2d2b8c2aa763, 59d... | \n",
" 4 | \n",
" False | \n",
"
\n",
" \n",
" 3 | \n",
" [application/zip] | \n",
" C002bZ2fhBI7mYwQxf | \n",
" application/zip | \n",
" Exploit only | \n",
" [c17ac3fb131adc485b32bebb3bcad742a0a676d1] | \n",
" 2 | \n",
" False | \n",
"
\n",
" \n",
" 4 | \n",
" [text/html] | \n",
" C007502KmyrlCzKHqb | \n",
" NONE | \n",
" NONE | \n",
" [36124e9da41313a4bc3a903abe5fccf0ea9c7736] | \n",
" 2 | \n",
" False | \n",
"
\n",
" \n",
" 5 | \n",
" [image/gif] | \n",
" C009392KwetlBZpxC | \n",
" NONE | \n",
" NONE | \n",
" [75e91ae3e549dab12ed1c9787ade9131aef1c981] | \n",
" 2 | \n",
" False | \n",
"
\n",
" \n",
"
\n",
"
5 rows \u00d7 7 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 56,
"text": [
" mime_types conn_uid combos_data combos_label \\\n",
"1 [image/png, text/plain] C000io4MJcSJMUYhmb NONE NONE \n",
"2 [image/jpeg] C001r8hbIKrnTGyHf NONE NONE \n",
"3 [application/zip] C002bZ2fhBI7mYwQxf application/zip Exploit only \n",
"4 [text/html] C007502KmyrlCzKHqb NONE NONE \n",
"5 [image/gif] C009392KwetlBZpxC NONE NONE \n",
"\n",
" sha1 num_files mhr \n",
"1 [d34f84ee29438bba5c353a9d20f3536badb38178, 577... 32 False \n",
"2 [74d87f7b1ca35f84cd4f1a08314c2d2b8c2aa763, 59d... 4 False \n",
"3 [c17ac3fb131adc485b32bebb3bcad742a0a676d1] 2 False \n",
"4 [36124e9da41313a4bc3a903abe5fccf0ea9c7736] 2 False \n",
"5 [75e91ae3e549dab12ed1c9787ade9131aef1c981] 2 False \n",
"\n",
"[5 rows x 7 columns]"
]
}
],
"prompt_number": 56
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Same deal as above, these 2 make the same tables as the images below\n",
"#uid_combos.describe()\n",
"#sample_combos.describe()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 57
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The tables below were converted to .png files for pretty display, but they're just screen-caps of the above commands\n",
"
\n",
"
Stats bassed on session (conn_uid)
\n",
"Stats based on sample (sample)
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"df_uid = pd.DataFrame()\n",
"df_uid['num_files'] = uid_combos['num_files']\n",
"df_uid['label'] = \"session\"\n",
"df_sample = pd.DataFrame()\n",
"df_sample['num_files'] = sample_combos['num_files']\n",
"df_sample['label'] = \"sample\"\n",
"df = pd.concat([df_sample, df_uid], ignore_index=True)\n",
"df.boxplot('num_files','label',vert=False)\n",
"plt.pyplot.xlabel('Number of Files, Session v. Sample')\n",
"plt.pyplot.ylabel('# of Files')\n",
"plt.pyplot.title('Comparision of # Files')\n",
"plt.pyplot.suptitle(\"\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 82,
"text": [
""
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAA+0AAAFICAYAAAAlCR9nAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcjXX/x/H3mWFwk73IjC0Mxqx2So4kdWevSNGtRd1K\n0uJO26+IcJNf6Ud3d7dQ6Vbu+06ixR2OSlmGmclSWZpBthozyDDM8P39ccwxM2Ycmu2c73k9H4/z\nmHOt53td75PmM+f6XMdhjDECAAAAAAA+J6isBwAAAAAAAApG0Q4AAAAAgI+iaAcAAAAAwEdRtAMA\nAAAA4KMo2gEAAAAA8FEU7QAAAAAA+CiKdgAALDN//nz17NnT63ojRozQhAkTSmFEeb3++uuqU6eO\nqlatqvT09BJ9rfznIigoSD/99FOJviYAAMXJwfe0AwBQsPfee0/Tp0/Xjz/+qMsuu0yxsbF65pln\ndPXVV5f10PxWVlaWqlWrpnXr1ikyMvKC6x47dkwRERHavXu33nrrLW3ZskUvv/xygeu6XC5dd911\nqly5smfeddddp48++ijPekFBQdqxY4euuuqqoh8MAACloFxZDwAAAF80ffp0TZkyRW+88YZ69uyp\nkJAQffbZZ1q8eLFPF+2nT59WcHBwWQ+jUAcOHFBmZqZatmzpdd2EhAS1bt1akrRhwwav5z00NFR7\n9uwplnECAOAruDweAIB8jhw5oueff16zZs1Sv379VKlSJQUHB+vmm2/WlClTJEknT57U6NGjFRoa\nqtDQUD366KM6deqUJPenvmFhYZo6daquuOIK1atXT4sWLdInn3yi8PBw1apVS5MnT/a83gsvvKBb\nb71Vt99+u6pWrao2bdrou+++8yyfPHmymjZtqqpVq6pVq1ZatGiRZ9ncuXN19dVX67HHHlPt2rX1\nwgsvaO7cuerSpYskyRijRx99VHXq1FG1atUUHR2trVu3SpKGDRum5557zrOvN998U82aNVOtWrXU\nt29f7d+/37MsKChIb7zxhsLDw1WjRg2NHDmy0PNX2LnZtm2bp1ivXr26rr/++gvmEB8fn6doj4uL\nu+D6Bcl9Lgoa5xNPPKGGDRuqbt26GjFihDIzMyVJqamp6tWrl2rUqKFatWrp2muvFRcnAgDKAkU7\nAAD5fPvtt8rMzFT//v0LXWfixIlat26dkpKSlJSUpHXr1uXpDz948KBOnjyp/fv3a/z48brvvvs0\nf/58JSQk6KuvvtL48eO1a9cuz/qLFy/WwIEDlZ6erjvuuEP9+vXT6dOnJUlNmzbV119/raNHj+r5\n55/XkCFDdPDgQc+269atU5MmTfTLL7/omWeeyTPOZcuW6auvvtL27dt15MgRLVy4UDVr1pQkORwO\nORwOSdKKFSv09NNPa+HChdq/f78aNmyo22+/Pc++li5dqvj4eH333Xf64IMP9Pnnn1/SuQkPD9eW\nLVskuf8w8sUXXxS4/X333acaNWpo7NixmjZtmmrUqKH4+Hh17txZUVFRhWZyqcaOHasdO3YoKSlJ\nO3bs0N69ezV+/HhJ0ssvv6z69esrNTVVv/zyiyZNmuQ5VwAAlCaKdgAA8jl06JBq166toKDC/zf5\n3nvv6X/+539Uu3Zt1a5dW88//7zeeecdz/Ly5cvrmWeeUXBwsAYNGqS0tDSNHj1alStXVkREhCIi\nIpSUlORZv23bthowYICCg4P12GOPKTMzU99++60k6dZbb1XdunUlSQMHDlSzZs20du1az7b16tXT\nQw89pKCgIFWsWDHPOMuXL6/ffvtN33//vc6cOaPmzZt79pXb/Pnzde+99yo2NlYhISGaNGmSvv32\nW+3evduzztixY1W1alXVr19f3bp1U2Ji4iWfm4v5tPof//iHfvrpJzVq1Ei//vqrZs2apT//+c9K\nT0/Xpk2bCt1u3759qlGjhuexcOHCQgttY4zefPNNTZ8+XdWrV1eVKlX01FNPacGCBZKkkJAQ7d+/\nXykpKQoODvbplggAgN0o2gEAyKdWrVpKTU3VmTNnCl1n3759atiwoWe6QYMG2rdvX5595BSMlSpV\nkiTVqVPHs7xSpUo6duyYZzosLMzz3OFwKCwszHN5+ttvv624uDhPMbp582YdOnTIs379+vULHed1\n112nkSNH6qGHHlKdOnX0wAMP6LfffjtvvZxP13NUrlxZtWrV0t69ez3zchf7f/jDH/KMPzdv5+ZC\nFi9erBo1aqh+/fratWuX6tatqz/96U96++23VaNGDW3YsKHQbevVq6f09HTP47bbbiv0jwS//vqr\njh8/rjZt2njO60033aTU1FRJ0pgxY9S0aVPdcMMNatKkiactAgCA0kbRDgBAPp06dVKFChX04Ycf\nFrpOvXr1lJKS4pnevXu36tWr97tfM/cN1M6cOaOff/5Z9erV065du3T//fdr5syZSktLU3p6uiIj\n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\niLzHO2FC3vNTrpxLxkhnzrink5LOre8eh+vsOJ06eFBas8alunWl2FinDh+WUlJcmjfv3P5SU106\ndkxq1MhyMQFCAAAahElEQVSpcePcyyVp2DCnnE73+yExUTp82KmUFGnePJcWLZKSktzTBw641+/Y\nsfDtJff7yeWSJk926cAB9/aStGiRe3xjx56/vpT39SVp3Dj361ev7j7elBSXtm6V0tKcys52579q\nlfv4q1Rxn//16yWXy71+zvnIf3yJie7jycnH5XKqUSMpNtal2Ni848k/vuKYzlFS+7/08bjzyv9+\nqV7d+/n417+kzZvd06tWudevXt2pfv3c59MXjq8kpxMTE31qPEyTJ9Pu6cTERJ8aD9NMM31O2b2+\nUy7X7/t9J9CnExMTdfjwYUnuq8JLjClh6enp5t133zVdu3Y148aNM3Xq1DE///yzMcaYF154wYwb\nN84YY4zT6TQbNmwwxhizcuVK06tXL88+cpYlJyebhg0beuYvX77c9O/f37NOfHy8+fjjj83gwYO9\njiv3oec5CwWckks5S1KycX+r+8U/KlRw/wwOPjfP4Tj3vGFD9yM4+Nz8rl3d8ypUcL/u888bU62a\ne36FCu5lzz9/7tG1q/unMXmf594u97zc0znzcn7mfp4jZ/2C1ssVWZ795d4+Zx+5l+V+5J6fs17+\nsXbtmnccBY0z/xguZX5B6xS07sVsn3vdS1m/oNcoaPv8+eVe72KP7/eMy2ZFOR+537MAAAC+it//\niqakyuugkvtzgLR//35VrFhRd955p8aMGaOEhAQ5HA7VqlVLx44d08KFCy95n7t379aaNWskSe+9\n9566dOniWeZwONSxY0etXr1aO3fulOTuq9++fXvxHBAAAAAAAKWoRC+P37Rpk8aMGaOgoCCFhITo\n9ddf14cffqjIyEjVrVtXHTp0KHC7C90Jvnnz5po5c6buuecetWrVSiNGjMizvHbt2po7d64GDx6s\nk+7rzjVx4kQ1a9aseA+uUEskFXC79HyqVJHKl3c/j4iQVq+WWraU9u51z6tWTTpyRMrKks52D2jV\nKveN6Y4ckfr1k3bskM5e5SanU0pKkrp2lbKzdfZSlnOvV726e56ks5fnnr9d7nm518+Zl/tn/ue5\n95l/Wa8C7s2Xe3nufRS2LPf86tXzzktNdcnpdHrm5x7HxezvYucXtE5B617M9r9n3cK2K+xcFnYe\n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\nJScnKywsTBs3blSdOnXI0g/169dPK1askCRt27ZNp06dUu3atUsvy0vqyLfAJ598YsLDw02TJk3M\nSy+9VNbDQQG++uor43A4TExMjImNjTWxsbHm008/NYcOHTLdu3c3zZo1Mz169DDp6emebSZOnGia\nNGlimjdvbj777DPP/Pj4eBMZGWmaNGliHn744bI4HJzlcrk8d48nS/+UmJho2rZta6Kjo03//v3N\n4cOHydKPTZkyxURERJjIyEhz1113mVOnTpGnn7j99tvNlVdeacqXL2/CwsLMW2+9VazZZWZmmttu\nu800bdrUdOjQwSQnJ5fm4QWU/FnOnj3bNG3a1DRo0MDzO1DOXaaNIUtflpNlSEiI57/L3Bo3buy5\nEZ0xZOnLCsry1KlTZsiQISYyMtK0bt3arFy50rN+aWTpMIbmCgAAAAAAfFFAXR4PAAAAAIA/oWgH\nAAAAAMBHUbQDAAAAAOCjKNoBAAAAAPBRFO0AAAAAAPgoinYAAAAAAHwURTsAwBpBQUF64oknPNPT\npk3TuHHjimXfw4YN07///e9i2deFLFy4UBEREerevXue+SkpKapUqZLi4uIUFxen1q1ba8+ePbrt\nttskSS6XS7179y7WsSxZskStW7dWbGysWrVqpb///e/Ftu+bb75ZR48eLbb9XayJEycqMjJSMTEx\niouL07p160r09ZxOpzZs2FCirwEAsFu5sh4AAADFJSQkRB9++KGeeuop1apVSw6Ho9j2XZR9ZWdn\nq1y5i/tf7uzZs/WPf/xDnTt3Pm9Z06ZNlZCQkGfewoULf/e4LiQrK0sPPPCA1q9fr3r16ikrK0vJ\nycnFtv+lS5cW274u1rfffqulS5cqISFB5cuXV1pamk6ePFmir+lwOIr1fQgACDx80g4AsEb58uV1\n//3363//93/PW5b/k/IqVapIcn9C3bVrV/Xr109NmjTR2LFj9c4776h9+/aKjo7WTz/95Nnmiy++\nULt27dS8eXNP0Xn69GmNGTNG7du3V0xMjOfTaJfLpS5duqhv375q1arVeeP55z//qejoaEVFRWns\n2LGSpPHjx2v16tW655579Je//MXr8aakpCgqKuq8+RkZGbrnnnvUoUMHtW7dWosXL5YkbdmyRR06\ndFBcXJxiYmK0Y8eOQvf922+/KTs7WzVr1pTkPrfh4eGSpF9//VW33nqr2rdvr/bt2+ubb76RJK1a\ntSrPlQAZGRnav3+/rr32WsXFxSkqKkqrV6+WJDVq1EhpaWmSpOnTpysqKkpRUVF69dVXPcfWsmVL\n3X///YqMjFTPnj2VmZmZZ4xHjhxRo0aN8hx3gwYNdPr06QKP6cCBA6pdu7bKly8vSapZs6auvPJK\nSdKLL76o9u3bKyoqSg888IBnG6fTqccee0zt2rVTy5YttX79evXv31/h4eF67rnnPGNt0aKFhgwZ\nooiICN122206ceLEea+/bNkyde7cWW3atNHAgQOVkZFR6PkHAMDDAABgiSpVqpijR4+aRo0amSNH\njphp06aZF154wRhjzLBhw8y//vWvPOsaY8zKlStN9erVzYEDB8zJkydNvXr1zPPPP2+MMebVV181\no0ePNsYY86c//cncdNNNxhhjtm/fbsLCwkxmZqZ54403zIQJE4wxxmRmZpq2bdua5ORks3LlSlO5\ncmWTkpJy3jj37t1rGjRoYFJTU012dra57rrrzKJFi4wxxjidTrNhw4bztklOTjaVKlUysbGxJjY2\n1owcOdKkpKSYyMhIz3H06tXLGGPMU089Zd59911jjDHp6ekmPDzcZGRkmIcfftjMnz/fGGNMVlaW\nOXHixAXP53333WeuuOIKM3jwYDN//nxz5swZY4wxgwcPNl9//bUxxphdu3aZli1bGmOM6d27t/nm\nm2+MMcZkZGSY7Oxs8/LLL5uJEycaY4w5ffq0+e2334wxxjRq1MgcOnTIxMfHm6ioKHP8+HFz7Ngx\n06pVK5OQkGCSk5NNuXLlTFJSkjHGmIEDB3qOKbe+ffualStXGmOMWbBggRk+fHihx3Ps2DETGxtr\nwsPDzYMPPmhWrVrlWZaWluZ5PnToUPPxxx8bY9x5jB071hjjfj9ceeWVnvdKWFiYSUtLM8nJycbh\ncHiO/Z577jHTpk3zbL9hwwbz66+/mmuvvdYcP37cGGPM5MmTzfjx4y94/gEAMMYYPmkHAFjlsssu\n01133aUZM2Zc9Dbt2rVTnTp1FBISoqZNm6pnz56SpMjISKWkpEhyX+Y8cOBASe7L1K+66ir98MMP\nWrZsmd5++23FxcWpY8eOSktL83yC3b59ezVs2PC811u/fr26deumWrVqKTg4WHfeeae+/PJLz3Jj\nTIHjbNKkiRISEpSQkKDXXnut0PWWLVumyZMnKy4uTt26ddPJkye1e/duderUSS+99JL++te/KiUl\nRRUrVrzgeXnzzTe1fPlytW/fXtOmTdM999wjyX3FwciRIxUXF6e+ffvqt99+U0ZGhq6++mo9+uij\neu2115Senq7g4GC1a9dOc+bM0bhx47Rp0ybPFQ45x/n1119rwIABqlSpkipXrqwBAwboq6++ksPh\nUOPGjRUdHS1JatOmjSeL3AYNGqT3339fkrRgwQINGjSo0OOpXLmyNmzYoL///e+6/PLLNWjQIM2b\nN0+StGLFCnXs2FHR0dFasWKFtm7d6tmuT58+ktzvh8jISM975aqrrtKePXskSfXr11enTp0kSUOG\nDNHXX3+d5zjXrFmjrVu3qnPnzoqLi9Pbb7+t3bt3X/D8AwAg0dMOALDQ6NGj1bp1a919992eeeXK\nldOZM2ckSWfOnNGpU6c8yypUqOB5HhQU5JkOCgpSdnZ2oa+T06v8f//3f+rRo0eeZS6XS5UrVy50\nu9wFtzEmT99zcfRA/+c//1GzZs3yzGvRooU6duyoJUuW6I9//KPeeOMNdevW7YL7ySlUhw4dqsaN\nG2vOnDkyxmjt2rUKCQnJs+6TTz6pXr16aenSpbr66qv1+eefq0uXLvrqq6+0ZMkSDRs2TI899piG\nDh2a51gLOxe5cwkODi7wkvPevXvr6aefVnp6ujZu3KjrrrvugscTFBSkrl27qmvXroqKitK8efN0\n++2368EHH9TGjRsVGhqqcePG5bkUP/f7If97Jef9kTuz/Hnm6NGjh957770Ljg8AgPz4pB0AYJ0a\nNWpo4MCBmj17tqd4atSokecu3osXL1ZWVtYl7dMYo4ULF8oYo507d+qnn35SixYt1LNnT82aNctT\nvG3btk3Hjx+/4L7atWunVatW6dChQzp9+rQWLFigrl27/o4jLVjPnj3zXGmQc/O65ORkNW7cWA8/\n/LD69u2rTZs2SZK6d++u/fv359lHRkaGXC5Xnn3k9I/fcMMNefafmJgoSdq5c6datWqlv/zlL2rX\nrp1+/PFH7d69W5dffrnuu+8+3XvvvXlupOdwONSlSxctWrRIJ06cUEZGhhYtWqQuXboUehVBflWq\nVFG7du00atQo9e7d+4J/8Ni2bZu2b99+3jFlZmbK4XCoVq1aOnbs2O+6ud/u3bu1Zs0aSdJ7772n\nLl265DnOjh07avXq1dq5c6ck9/nNPRYAAApD0Q4AsEbugu3xxx9XamqqZ3r48OFatWqVYmNjtWbN\nmjyXaRdW6OW+87fD4VCDBg3Uvn17z6fUISEhuu+++xQREaHWrVsrKipKI0aMUHZ29gXvGn7llVdq\n8uTJ6tatm2JjY9W2bduL+rq2gvZX0Cf0zz33nLKyshQdHa3IyEg9//zzkqQPPvhAkZGRiouL05Yt\nW3TXXXfpzJkz2rlzp+eGczmMMZo6dapatGihuLg4jRs3TnPnzpUkzZgxQ/Hx8YqJicnzVXCvvvqq\noqKiFBMTo5CQEN14441yuVyKjY1V69attXDhQj3yyCN5XicuLk7Dhg1T+/bt1bFjRw0fPlwxMTEF\nHm9h53PQoEF67733PJfGx8fHa/jw4eetd+zYMQ0bNkytWrVSTEyMfvjhB73wwguqVq2ahg8frsjI\nSN14443q0KFDoee/sDE0b95cM2fOVEREhI4cOaIRI0bkWV67dm3NnTtXgwcPVkxMjDp37qwff/yx\nwH0BAJCbw1zsn7IBAIB1tmzZojlz5mjatGllPRS/lZKSot69e3uuXAAAoDhRtAMAABRBSkqK+vTp\no++++66shwIAsBBFOwAAAAAAPoqedgAAAAAAfBRFOwAAAAAAPoqiHQAAAAAAH0XRDgAAAACAj6Jo\nBwAAAADAR1G0AwAAAADgo/4f7ur81GtJQrUAAAAASUVORK5CYII=\n",
"text": [
""
]
}
],
"prompt_number": 82
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Total connections: %s\" %len(uid_combos.index)\n",
"#100. * uid_combos.combos.value_counts() / len(uid_combos.index)\n",
"uid_combos['count'] = 1\n",
"uid_combos[['combos_label','combos_data','count']].groupby(['combos_label','combos_data']).sum().sort('count', ascending=0).head(15)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Total connections: 238210\n"
]
},
{
"html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" count | \n",
"
\n",
" \n",
" combos_label | \n",
" combos_data | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" NONE | \n",
" NONE | \n",
" 198045 | \n",
"
\n",
" \n",
" Executable only | \n",
" application/x-dosexec | \n",
" 10395 | \n",
"
\n",
" \n",
" binary | \n",
" 10136 | \n",
"
\n",
" \n",
" Exploit only | \n",
" application/x-shockwave-flash | \n",
" 6035 | \n",
"
\n",
" \n",
" application/jar | \n",
" 3276 | \n",
"
\n",
" \n",
" application/zip | \n",
" 2570 | \n",
"
\n",
" \n",
" application/x-java-applet | \n",
" 1483 | \n",
"
\n",
" \n",
" application/pdf | \n",
" 1398 | \n",
"
\n",
" \n",
" C-c-c-combo | \n",
" application/pdf:application/x-dosexec | \n",
" 1030 | \n",
"
\n",
" \n",
" application/jar:application/x-dosexec | \n",
" 902 | \n",
"
\n",
" \n",
" application/zip:application/x-dosexec | \n",
" 877 | \n",
"
\n",
" \n",
" Executable only | \n",
" application/octet-stream | \n",
" 862 | \n",
"
\n",
" \n",
" application/vnd.ms-cab-compressed:binary | \n",
" 242 | \n",
"
\n",
" \n",
" application/vnd.ms-cab-compressed | \n",
" 198 | \n",
"
\n",
" \n",
" C-c-c-combo | \n",
" application/x-shockwave-flash:application/pdf:application/x-dosexec | \n",
" 186 | \n",
"
\n",
" \n",
"
\n",
"
15 rows \u00d7 1 columns
\n",
"
"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 83,
"text": [
" count\n",
"combos_label combos_data \n",
"NONE NONE 198045\n",
"Executable only application/x-dosexec 10395\n",
" binary 10136\n",
"Exploit only application/x-shockwave-flash 6035\n",
" application/jar 3276\n",
" application/zip 2570\n",
" application/x-java-applet 1483\n",
" application/pdf 1398\n",
"C-c-c-combo application/pdf:application/x-dosexec 1030\n",
" application/jar:application/x-dosexec 902\n",
" application/zip:application/x-dosexec 877\n",
"Executable only application/octet-stream 862\n",
" application/vnd.ms-cab-compressed:binary 242\n",
" application/vnd.ms-cab-compressed 198\n",
"C-c-c-combo application/x-shockwave-flash:application/pdf:application/x-dosexec 186\n",
"\n",
"[15 rows x 1 columns]"
]
}
],
"prompt_number": 83
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"uid_mhr = uid_combos[uid_combos['mhr'] == True]\n",
"print \"Total connections: %s\" %len(uid_mhr.index)\n",
"print\n",
"print uid_mhr.combos_label.value_counts()\n",
"print\n",
"100. * uid_mhr.combos_data.value_counts() / len(uid_mhr.index)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Total connections: 6066\n",
"\n",
"Executable only 2998\n",
"C-c-c-combo 1748\n",
"Exploit only 1320\n",
"dtype: int64\n",
"\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 84,
"text": [
"application/x-dosexec 49.010880\n",
"application/pdf:application/x-dosexec 9.347181\n",
"application/jar:application/x-dosexec 9.066930\n",
"application/x-shockwave-flash 8.127267\n",
"application/jar 6.594131\n",
"application/zip:application/x-dosexec 5.637982\n",
"application/x-java-applet 4.648863\n",
"application/x-shockwave-flash:application/pdf:application/x-dosexec 2.884932\n",
"application/pdf 2.176063\n",
"application/x-shockwave-flash:application/x-dosexec 1.483680\n",
"application/x-dosexec:binary 0.395648\n",
"application/pdf:application/x-dosexec:binary 0.263765\n",
"application/x-shockwave-flash:application/pdf 0.214309\n",
"application/x-shockwave-flash:application/pdf:application/x-dosexec:binary 0.049456\n",
"application/jar:binary 0.049456\n",
"application/pdf:binary 0.016485\n",
"application/x-shockwave-flash:application/pdf:binary 0.016485\n",
"application/x-dosexec:application/octet-stream 0.016485\n",
"dtype: float64"
]
}
],
"prompt_number": 84
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"After a long slog through the data (some interesting, and some ... eh) we've got a few more questions we can answer. We'll stick to just the session view from now on, but these can just as easily be done above via the sample dataframe.\n",
"
\n",
"Great, AV was able to detect some things, but what is it missing? Can we find any relationships between what AV missed and what it found?\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"uid_mhr = uid_combos[uid_combos['mhr'] != True]\n",
"print uid_mhr.combos_label.value_counts()\n",
"print\n",
"uid_mhr[uid_mhr['combos_label'] == 'C-c-c-combo']['combos_data'].value_counts()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"NONE 198045\n",
"Executable only 18981\n",
"Exploit only 13496\n",
"C-c-c-combo 1622\n",
"dtype: int64\n",
"\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 85,
"text": [
"application/zip:application/x-dosexec 535\n",
"application/pdf:application/x-dosexec 463\n",
"application/jar:application/x-dosexec 352\n",
"application/jar:binary 150\n",
"application/x-shockwave-flash:application/x-dosexec 35\n",
"application/x-shockwave-flash:binary 33\n",
"application/pdf:binary 26\n",
"application/x-shockwave-flash:application/pdf:application/x-dosexec 11\n",
"application/zip:binary 4\n",
"application/zip:application/jar:application/x-dosexec 4\n",
"application/x-shockwave-flash:application/octet-stream 3\n",
"application/pdf:application/x-dosexec:binary 3\n",
"application/x-shockwave-flash:application/x-dosexec:binary 1\n",
"application/zip:application/jar:binary 1\n",
"application/x-java-applet:application/x-dosexec 1\n",
"dtype: int64"
]
}
],
"prompt_number": 85
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"combos = uid_combos[uid_combos['combos_label'] == 'C-c-c-combo'].shape[0]\n",
"print \"% of MHR hits in sessions with an \\\"interesting\\\" file combination\"\n",
"print uid_combos[uid_combos['combos_label'] == 'C-c-c-combo']['mhr'].value_counts().apply(lambda x: x/combos)\n",
"print \"\\n% of MHR hits from samples (end systems) with an \\\"interesting\\\" file combination\"\n",
"combos = sample_combos[sample_combos['combos_label'] == 'C-c-c-combo'].shape[0]\n",
"print sample_combos[sample_combos['combos_label'] == 'C-c-c-combo']['mhr'].value_counts().apply(lambda x: x/combos)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"% of MHR hits in sessions with an \"interesting\" file combination\n",
"True 0.518694\n",
"False 0.481306\n",
"dtype: float64\n",
"\n",
"% of MHR hits from samples (end systems) with an \"interesting\" file combination\n",
"True 0.510351\n",
"False 0.489649\n",
"dtype: float64\n"
]
}
],
"prompt_number": 86
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"Wait, what!?\n",
"
\n",
"Did we just figure out that (according to our samples) that if you're relying on AV to detect bad files instead of looking for a super easy pattern in network traffic you're missing out on 1/2 of the possible malware driveby downloads. Granted this requires an \"interesting\" file combination be present in both the same session or from the same source host, but wow.\n",
"
\n",
"\n",
"\n",
"Assumption Alert!\n",
"
\n",
"Again, we believe this data to be composed of mostly driveby downloads, so we're only looking at labels within a known-malicous set. Looking for those interesting file combinations on the network may yield additional false-positives.\n",
"\n",
"
\n",
"\n",
"Closing\n",
"\n",
"We were able to successfully dissect properties of files that traverse the network. Based on the properties the effectiveness of current solutions, proposed patterns to look for new and \"un-known\" attacks were discovered! Never underestimate the value of having better data. With this set, some insights were gained, but if the data came pre-labeled or we knew more about how it was collected perhaps we'd have more or different assumptions and gotten different results.\n",
"
"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}