From ceb4f0335a700afaed3b6f92861834c2692cf5a1 Mon Sep 17 00:00:00 2001
From: wisepythagoras <55108282+wisepythagoras@users.noreply.github.com>
Date: Sun, 9 Feb 2020 15:29:18 -0500
Subject: [PATCH] Initial commit
---
.gitignore | 103 +++++++++++++++
LICENSE | 21 +++
README.md | 84 ++++++++++++
classifier-nb.dmp | Bin 0 -> 5456 bytes
config.json | 11 ++
defense.js | 97 ++++++++++++++
example-fingerprints/fingerprints.csv | 121 +++++++++++++++++
gather_and_train.py | 74 +++++++++++
graph.py | 40 ++++++
graphs/.RData | Bin 0 -> 41680 bytes
graphs/graph-screenshot.png | Bin 0 -> 36927 bytes
metadata/jjay-1 | 35 +++++
metadata/jjay-2 | 40 ++++++
metadata/jjay-3 | 39 ++++++
mysources.json | 29 ++++
package.json | 12 ++
packet.py | 28 ++++
pcaps/capture.sh | 22 ++++
pcaps/mass.sh | 29 ++++
predict.py | 63 +++++++++
utils.py | 182 ++++++++++++++++++++++++++
21 files changed, 1030 insertions(+)
create mode 100644 .gitignore
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 classifier-nb.dmp
create mode 100644 config.json
create mode 100644 defense.js
create mode 100644 example-fingerprints/fingerprints.csv
create mode 100755 gather_and_train.py
create mode 100644 graph.py
create mode 100644 graphs/.RData
create mode 100644 graphs/graph-screenshot.png
create mode 100644 metadata/jjay-1
create mode 100644 metadata/jjay-2
create mode 100644 metadata/jjay-3
create mode 100644 mysources.json
create mode 100644 package.json
create mode 100644 packet.py
create mode 100755 pcaps/capture.sh
create mode 100755 pcaps/mass.sh
create mode 100755 predict.py
create mode 100644 utils.py
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f74b184
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,103 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# dotenv
+.env
+
+# virtualenv
+.venv
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+*.pcap
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5dce3a2
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Constantine Apostolou
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1b36326
--- /dev/null
+++ b/README.md
@@ -0,0 +1,84 @@
+# Website Fingerprinting
+
+Website fingerprinting is a method of Tor or VPN packet inspection that aims to collect enough features and information from individual sessions that could aid in identifying the activity of anonymized users.
+
+## Introduction
+
+For this experiment Tor is required. It can be installed by running the following commands:
+
+``` bash
+# For Debian or Ubuntu
+sudo apt install tor lynx
+
+# For Fedora
+sudo yum install tor lynx
+```
+
+By installing Tor we also get a program called `torsocks`; this program will be used to redirect traffic of common programs through the Tor network. For example, it can be run as follows:
+
+``` bash
+# SSH through Tor.
+torsocks ssh user@example.com
+
+# CUrl through Tor.
+torsocks curl -L http://httpbin.org/ip
+
+# Etc...
+```
+
+### Required Python Modules
+
+``` bash
+pip install sklearn dpkt
+```
+
+## Data Collection
+
+For the data collection process two terminal windows in a side-by-side orientation are required, as this process is fairly manual. Also, it's advised to collect the fingerprints in a VM, in order to avoid caputring any unintended traffic. To listen on traffic there exists a script, namely [capture.sh](pcaps/capture.sh), which should be run in one of the terminals:
+
+``` bash
+./pcaps/capture.sh duckduckgo.com
+```
+
+Once the listener is capturing traffic, on the next terminal run:
+
+``` bash
+torsocks lynx https://duckduckgo.com
+```
+
+Once the website has finished loading, the capture process needs to be killed, along with the browser session (by hitting the `q` key twice). The process should be repeated several times for each web page so that there is enough data.
+
+## Machine Learning
+
+[Scikit Learn](http://scikit-learn.org/stable/) was used to write a [k Nearest Neighbors](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbors-classification) classifier, that would read the pcap files, as specified in the [config.json](config.json) file. `config.json` can be changed according to which webpages were targeted for training. The training script is [gather_and_train.py](gather_and_train.py).
+
+
+
+
+
+## Classifying Unknown Traffic
+
+Once the training is done, and the `classifier-nb.dmp` is created, the [predict.py](predict.py) script can be run with the pcap file as the sole argument. The script will load the classifier and attempt to identify which web page the traffic originated from.
+
+It is worth noting that from each sample only the first 40 packets will be used to train a usable model and to run through the resulting classifier.
+
+
+
+
+
+As it can be seen in the screenshot above, the patterns of the packets of each website can be seen clearly on a 3D scale. The classifier visualizes the data in a similar way and gives us the most accurate result.
+
+An interactive version of this graph can be found in the [graphs](graphs) folder.
+
+## Limitations and Disclaimers
+
+This setup was created in order to research the topic of website fingerprinting and how easy it is to attempt to deanonymize users over Tor or VPNs. Traffic was captured and identified in a private setting and for purely academic purposes; use of this source code is intended for those reasons only.
+
+Traffic is never "clean", as the assumption was - for simplicity - in this reasearch. However, if an entity has enough resources, the desired anonymized traffic can be isolated and fed into this simple classifier. This means that it is entirely possible to use a method like this to compromise anonymized users.
+
+## References
+
+1. Wang, T. and Goldberg, I. (2017). Website Fingerprinting. [online] Cse.ust.hk. Available at: https://www.cse.ust.hk/~taow/wf/.
+2. Wang, T. and Goldberg, I. (2017). Improved Website Fingerprinting on Tor. Cheriton School of Computer Science. Available at: http://www.cypherpunks.ca/~iang/pubs/webfingerprint-wpes.pdf
+3. Wang, T. (2015). Website Fingerprinting: Attacks and Defenses. University of Waterloo. Available at: https://uwspace.uwaterloo.ca/bitstream/handle/10012/10123/Wang_Tao.pdf
+
diff --git a/classifier-nb.dmp b/classifier-nb.dmp
new file mode 100644
index 0000000000000000000000000000000000000000..c3241f03fcf73890253593fac77fa2ac7c384278
GIT binary patch
literal 5456
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
literal 0
HcmV?d00001
diff --git a/config.json b/config.json
new file mode 100644
index 0000000..a445ea9
--- /dev/null
+++ b/config.json
@@ -0,0 +1,11 @@
+{
+ "pcaps": [
+ "duckduckgo.com",
+ "github.com",
+ "jjay.cuny.edu",
+ "telegram.org",
+ "reddit.com",
+ "torproject.org",
+ "perdu.com"
+ ]
+}
diff --git a/defense.js b/defense.js
new file mode 100644
index 0000000..b8698ab
--- /dev/null
+++ b/defense.js
@@ -0,0 +1,97 @@
+"use strict";
+
+const TorAgent = require("toragent");
+const request = require("request");
+const mysources = require("./mysources.json");
+
+let websites = mysources.sources;
+let agent = null;
+
+/**
+ * Gets some random URLs from articles.
+ * @param {function} callback This is called when this is done.
+ */
+function getNews(callback) {
+ let newsUrl = "https://newsapi.org/v2/everything?q=snowden&sortBy=publishedAt&apiKey=";
+ newsUrl += mysources.newsapi_key;
+
+ // Get the articles.
+ get(newsUrl, (error, results) => {
+ if (!error) {
+ // Parse the results.
+ results = JSON.parse(results);
+
+ // Add the articles to the list.
+ for (let i = 0; i < results.articles.length; i++) {
+ websites.push(results.articles[i].url);
+ }
+ } else {
+ throw(error);
+ }
+
+ callback();
+ });
+}
+
+/**
+ * Connects to the Tor network.
+ * @param {function} callback The callback function that's called once we're
+ * connected to the network.
+ */
+function connect(callback) {
+ console.log("Getting new identity");
+
+ TorAgent.create(false, function(error, newAgent) {
+ if (error) {
+ // Unable to connect to the Tor network
+ throw(err);
+ }
+
+ agent = newAgent;
+ callback();
+ });
+}
+
+/**
+ * Creates a simple HTTP GET request.
+ * @param {string} url The URL to get.
+ * @param {function} callback The function called once the request is done.
+ */
+function get(url, callback) {
+ request({
+ url: url,
+ agent: agent,
+ rejectUnauthorized: false,
+ }, function(err, res, body) {
+ if(err) {
+ websites.splice(websites.indexOf(url), 1);
+ callback(err, false);
+ } else {
+ callback(null, body);
+ }
+ });
+}
+
+/**
+ * Gets a random website from the list.
+ * @returns {string} A URL of a page to load.
+ */
+function getRandomPage() {
+ let len = websites.length;
+ return websites[Math.round(Math.random() * len) % len];
+}
+
+/**
+ * Generates random traffic.
+ */
+function loadRandomUrl() {
+ let page = getRandomPage();
+ get(page, (err) => console.error(err ? err : `GET: ${page}`));
+
+ setTimeout(loadRandomUrl, Math.round(Math.random() * 800) % 800);
+}
+
+// Connect to Tor and begin jamming the session.
+connect(() => {
+ getNews(loadRandomUrl);
+});
\ No newline at end of file
diff --git a/example-fingerprints/fingerprints.csv b/example-fingerprints/fingerprints.csv
new file mode 100644
index 0000000..97af98d
--- /dev/null
+++ b/example-fingerprints/fingerprints.csv
@@ -0,0 +1,121 @@
+domain,total_incoming_sizes,total_number_packets,no_outgoing_packets,no_incoming_packets,ratio_incoming_to_outgoing,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39
+duckduckgo.com,27427,96,41,55,1.34146341463,609,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609,-66
+duckduckgo.com,26971,98,42,56,1.33333333333,597,-60,-597,54,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-1514,-165,54,597,-60,-597,597,-60,-597
+duckduckgo.com,26911,96,41,55,1.34146341463,597,-60,-597,54,597,-60,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-597,597,-597,597,-60
+duckduckgo.com,27241,105,45,60,1.33333333333,597,-60,-597,54,597,-60,-60,-597,597,-60,597,-60,609,-597,597,-66,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,609,609,-60,597,-66,-66,-60,-597,597,-60,-1514,-165,54
+duckduckgo.com,26971,97,41,56,1.36585365854,597,-60,-597,54,597,-60,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-1514,-165,54,597,-60,-597,597,-60,-597,597
+duckduckgo.com,26971,96,40,56,1.4,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597,597,-60
+duckduckgo.com,26971,96,40,56,1.4,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597,597,-60
+duckduckgo.com,27031,98,41,57,1.39024390244,597,-60,-597,54,597,-60,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597
+duckduckgo.com,27508,99,43,56,1.3023255814,597,-60,-597,54,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597,597
+duckduckgo.com,27151,101,42,59,1.40476190476,597,-60,-597,54,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597,597
+duckduckgo.com,26851,95,41,54,1.31707317073,597,-60,-597,54,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-597,597,-597,597,-60,597
+duckduckgo.com,27031,98,41,57,1.39024390244,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,597,-60,-597,597,-60,-597
+duckduckgo.com,27568,100,43,57,1.32558139535,597,-60,-597,54,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597,597
+duckduckgo.com,27091,99,41,58,1.41463414634,597,-60,-597,54,597,-60,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-1514,-165,54,597,-60,-597,597,-60,-597,597
+duckduckgo.com,27295,104,43,61,1.41860465116,597,-60,-597,54,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,-66,66,-66,-66,66,-66,597
+duckduckgo.com,28073,98,41,57,1.39024390244,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609
+duckduckgo.com,26971,96,40,56,1.4,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-597,597,-60,597,-60,-597,597,-60,-1514,-165,54,597,-60,-597,597,-60,-597,597,-60
+github.com,39829,98,42,56,1.33333333333,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609
+github.com,39829,97,41,56,1.36585365854,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+github.com,39668,93,39,54,1.38461538462,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-609,609
+github.com,39183,94,40,54,1.35,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609
+github.com,39212,88,34,54,1.58823529412,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609,609
+github.com,40248,94,39,55,1.41025641026,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-609,609
+github.com,39697,96,42,54,1.28571428571,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-609,609
+github.com,40372,91,35,56,1.6,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-609,66,-1123,66,609,-66,-609,66,609,-66
+github.com,39829,97,41,56,1.36585365854,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+github.com,40182,90,36,54,1.5,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+github.com,39602,87,34,53,1.55882352941,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609,-66
+github.com,39183,93,39,54,1.38461538462,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609,609
+github.com,40429,97,38,59,1.55263157895,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609,609
+github.com,39220,95,40,55,1.375,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+github.com,39763,89,34,55,1.61764705882,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+github.com,39088,93,40,53,1.325,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,609,-66,-609,66,609,-66,-609,609
+github.com,39220,91,36,55,1.52777777778,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609
+github.com,39734,92,37,55,1.48648648649,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+jjay.cuny.edu,63096,115,49,66,1.34693877551,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,74,-74,66,532,-609,609,-66,-1514,66,-1514,66,-166,66,-66
+jjay.cuny.edu,35647,64,22,42,1.90909090909,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,609,-1514,-1514,66,-797,-66,-1514
+jjay.cuny.edu,36227,70,27,43,1.59259259259,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66,-1514
+jjay.cuny.edu,35610,72,31,41,1.32258064516,609,-66,-609,66,609,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,609,-1514,66
+jjay.cuny.edu,36256,65,22,43,1.95454545455,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514
+jjay.cuny.edu,35742,74,31,43,1.38709677419,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,66,-283,66,-1514,66,-1514,66
+jjay.cuny.edu,35742,67,24,43,1.79166666667,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66
+jjay.cuny.edu,52344,89,32,57,1.78125,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,705,-66,-117,66,274,-609,609,-66,-66,609,-66,-609,609,-66,-609,609,-1514,-1514,66,-1514,-1514,66,-1514,-1514,66,-1514,-1514,66
+jjay.cuny.edu,35742,71,28,43,1.53571428571,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66,-1514
+jjay.cuny.edu,35581,63,22,41,1.86363636364,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66,-1514
+jjay.cuny.edu,35713,71,28,43,1.53571428571,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66
+jjay.cuny.edu,36256,75,32,43,1.34375,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,66,-1514,66,-1514,66
+jjay.cuny.edu,35713,70,27,43,1.59259259259,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66
+jjay.cuny.edu,36322,75,31,44,1.41935483871,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,-1514,-1514,66,-797,-1514,66,-703
+jjay.cuny.edu,7110,46,20,26,1.3,609,-66,-609,66,609,-66,597,-60,-609,609,-597,54,-66,609,-66,-609,609,-66,-609,609,597,-66,609,-60,-66,-609,609,-66,-609,609,-66,609,-66,1123,597,-66,-60,-609,609,-609
+jjay.cuny.edu,62516,106,41,65,1.58536585366,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,74,-66,-74,66,534,-609,609,-66,-1514,66,-1514,66,-215,66,257,-66,609,-324,66,279,-66,-609,609,-66,-66,-609,609,-66
+jjay.cuny.edu,35742,74,31,43,1.38709677419,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-1514,-283,66,66,-1514,66,-1514,66
+telegram.org,20580,69,29,40,1.37931034483,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609
+telegram.org,20514,69,30,39,1.3,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+telegram.org,20580,70,30,40,1.33333333333,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+telegram.org,20514,69,30,39,1.3,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+telegram.org,20580,70,30,40,1.33333333333,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+telegram.org,21123,73,33,40,1.21212121212,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+telegram.org,53575,125,53,72,1.35849056604,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609
+telegram.org,33207,85,35,50,1.42857142857,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+telegram.org,41458,114,49,65,1.32653061224,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-609,609
+telegram.org,20580,70,30,40,1.33333333333,1123,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+telegram.org,20646,72,31,41,1.32258064516,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+telegram.org,20646,71,30,41,1.36666666667,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66
+telegram.org,40514,101,42,59,1.40476190476,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,74,-609,609,-74,66,341,-66,609,-66,-219,66,397,-66,-609,-66,609,-66,-609,609,-1514,-1514,66,-1514,-1514,66
+telegram.org,21341,80,35,45,1.28571428571,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,74,-74,66,312,-66,-489,66
+telegram.org,20514,69,30,39,1.3,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+telegram.org,41153,106,46,60,1.30434782609,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,74,-74,66,341,-609,609,-66,-1514,66,-1514,66,-1514,-245
+telegram.org,20580,70,30,40,1.33333333333,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-609,609
+reddit.com,111578,170,65,105,1.61538461538,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+reddit.com,109361,161,58,103,1.77586206897,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609,609
+reddit.com,111931,164,61,103,1.68852459016,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609,-66
+reddit.com,110015,161,55,106,1.92727272727,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66
+reddit.com,109862,162,57,105,1.84210526316,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66
+reddit.com,109974,163,60,103,1.71666666667,609,609,609,609,609,609,-66,-609,609,-66,-609,609,609,-609,78,-78,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66
+reddit.com,109574,161,55,106,1.92727272727,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609,-66
+reddit.com,109332,159,56,103,1.83928571429,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+reddit.com,109237,163,61,102,1.67213114754,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+reddit.com,108230,159,58,101,1.74137931034,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+reddit.com,109171,153,52,101,1.94230769231,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-609,66,609,-609,609,-66
+reddit.com,108913,165,61,104,1.70491803279,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66
+reddit.com,111557,174,68,106,1.55882352941,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+reddit.com,110447,155,52,103,1.98076923077,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609
+reddit.com,110607,164,56,108,1.92857142857,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+reddit.com,108657,162,61,101,1.65573770492,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-66,-609
+reddit.com,109398,165,61,104,1.70491803279,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,609,-66,-609,66,609,-66,-609,609,-66
+torproject.org,20580,68,28,40,1.42857142857,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609
+torproject.org,20646,70,29,41,1.41379310345,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20675,70,29,41,1.41379310345,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609
+torproject.org,20646,69,28,41,1.46428571429,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20712,71,29,42,1.44827586207,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20712,70,28,42,1.5,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20646,69,28,41,1.46428571429,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20807,72,29,43,1.48275862069,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,21189,71,30,41,1.36666666667,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,66,-609,66,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609
+torproject.org,21255,72,30,42,1.4,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20646,69,28,41,1.46428571429,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20646,69,28,41,1.46428571429,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20646,70,29,41,1.41379310345,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,609,-66,-609,609,-66
+torproject.org,20580,68,28,40,1.42857142857,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609
+torproject.org,20580,67,27,40,1.48148148148,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609,-66
+torproject.org,20646,69,28,41,1.46428571429,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609
+torproject.org,20646,73,32,41,1.28125,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1514,-189,66,609,-66,-609,609,-66,-609,609
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6450,34,13,21,1.61538461538,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-272,-1123,66,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6457,42,18,24,1.33333333333,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,74,-1123,66,-74,66,313,-66,-73,66,-66
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,1152,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
+perdu.com,6112,32,13,19,1.46153846154,609,-66,-609,66,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0,0
+perdu.com,6178,33,13,20,1.53846153846,609,-66,-609,66,609,-66,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-609,609,-66,609,-66,-609,609,-66,-1123,66,0,0,0,0,0,0,0
diff --git a/gather_and_train.py b/gather_and_train.py
new file mode 100755
index 0000000..00501fc
--- /dev/null
+++ b/gather_and_train.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+
+import os
+import re
+import sys
+import json
+import utils
+from sklearn.externals import joblib
+
+
+# Read the configuration and start training.
+with open('config.json') as fp:
+ print("* Parsing configuration")
+
+ # Load the configuration from the file.
+ config = json.load(fp)
+
+ # This is where all the streams are going to live.
+ streams = []
+
+ # This is where all the labels are going to live.
+ labels = []
+ labels_str = []
+ base_labels = [None] * len(config['pcaps'])
+
+ # The base label starts from 1 and increments after that.
+ current_label = 1
+ pat = re.compile(".*-curl\.pcap$")
+
+ for domain in config['pcaps']:
+ # Set the base label.
+ base_labels[current_label - 1] = domain
+
+ # Increment the label
+ current_label += 1
+
+ utils.empty_csv()
+ current_label = 1
+
+ for domain in config['pcaps']:
+ print(" - {}".format(domain))
+ i = 0
+
+ # Traverse the directory for all the pcaps.
+ for file in os.listdir('./pcaps/{}'.format(domain)):
+ if file.endswith(".pcap") and (pat.match(file) is None):
+ # if i > 20:
+ # break
+
+ # This is the pcap file we'll be reading at this point.
+ file = os.path.join("./pcaps/{}".format(domain), file)
+
+ # Read the pcap file.
+ data = utils.read_pcap_file(file)
+
+ # Append the data to the streams array.
+ streams.append(data)
+
+ # Append everything to the log.
+ utils.append_to_csv(domain, data)
+
+ # Add a label for the new file.
+ labels.append(current_label)
+ labels_str.append(domain)
+
+ i += 1
+
+ print " {} pcap files".format(i)
+
+ # Increment the label
+ current_label += 1
+
+ # Finally train the classifier.
+ utils.train(streams, labels)
diff --git a/graph.py b/graph.py
new file mode 100644
index 0000000..8828cbd
--- /dev/null
+++ b/graph.py
@@ -0,0 +1,40 @@
+from plotly import offline
+import plotly.plotly as py
+import plotly.graph_objs as go
+import numpy as np
+import pandas as pd
+
+# Read the data.
+data = pd.read_csv('./example-fingerprints/fingerprints.csv')
+
+d = data['domain']
+#x = data['total_number_packets']
+#y = data['no_incoming_packets']
+#z = data['no_outgoing_packets']
+x = data['total_incoming_sizes']
+y = data['ratio_incoming_to_outgoing']
+z = data['total_number_packets']
+
+xt = []
+yt = []
+zt = []
+data = []
+
+for i in range(0, len(x)):
+ if i == len(x) - 1 or d[i] != d[i + 1]:
+ data.append(go.Scatter3d(x=xt, y=yt, z=zt, mode='markers', \
+ marker=dict(), name=d[i]))
+
+ xt = []
+ yt = []
+ zt = []
+ else:
+ xt.append(x[i])
+ yt.append(y[i])
+ zt.append(z[i])
+
+layout = go.Layout(margin=dict(l=0, r=0, b=0, t=0))
+
+fig = go.Figure(data=data, layout=layout)
+offline.plot(fig, filename='graphs/graph.html', auto_open=False)
+
diff --git a/graphs/.RData b/graphs/.RData
new file mode 100644
index 0000000000000000000000000000000000000000..31dcd1938e7aeceb050e4e61f865ca3cebf995d9
GIT binary patch
literal 41680
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
MLdMNknB>;~0e!2g6#xJL
literal 0
HcmV?d00001
diff --git a/graphs/graph-screenshot.png b/graphs/graph-screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..65d579ac82ee30f75d1dcf0fcca8de35e285a457
GIT binary patch
literal 36927
zcmb@u1yq#Z+ci8$cQ;6PD*}?zCEXnYB1jDa15y%FA{~l?l+va2NDR^@K_ILUO%+9B*sJZ2S7ugbp+{%u*uImG{N%n_?6^(*`rqd5G{WUc!X=gJvAagh!Ci0FLz;^IzSM*>0TwA@GMfogeqnQd6J
zBt$LfYHErO{f7D0fI{#EFZe#r>Difqg$4dc+oYD3mXbWozZU92zrw|uk~#8XJxCid
z%fiBcYz{d=)nx1yt?u^%qL=@SzZG1yOY7SD06_F1m-
zH$q?O^0eojoCLyuevvufdi(BOZSV=SY2FjkQEK$A#&fP0Gl~
zNC*T>u%Lkb^YHNUNTK>ySMjERJ=;&i5m8y_wT%71`Dz;~WbiU4r`B)F^wP)9E{~V|
z7DFP&UQSL9VJuuiQnIk3f+&ea!8BN5w!vfBZgGBoXm9=Viq|oTKD8D_|oEBznZXP=_VxaQRD^+&!_K;mM`W`HiJlQM31pj?(@*3Y>RJ_=z)yB2ynee)#a&aA3&!u^7LAK%gT0
z@sY4N1M%A08U#{bUk{J{^7%8XfB>QHJ4!-A!jiHw%XBOE_tVK>p{pm$r$V2`#O!aD
zS0mPcI)sK^r>3UHIO`u6_|DPNo5a$4dboAs>vMS?IM*JgunqP&@6T!Cu`A;6Tz}KQ
zsg_3M2RquCjhUOXuCS~p=zY%I6;Ca2ye@ydgt>7TWNd7_v@ueMkz)RS`WYN9yRx=c
z@b;~X!6DY}MMg$O{O-H9w(Eg`fv~O0M(@*K52$Ep4yw0ycc0o;$LPLOwy>b*=HWS6
zheDzD@23&FVEr{=_Z?L?TyUtfwXfqk?EyC(HoS2pkf
zOU8e@qspdrY&Vnl@9)4f`0(L_eRn)HIAy&Pl~%}~Cu6&*|9m+%{pnxxjL>-S_s{(Q
z_%QaD%ceBy1o_TmvxU9&!|V>m;88<;JqE1hS(RydV&LP>K@7?#e*sxa+bcfYg$p%%
znO1|}^YWqR*>)e0{b@XX{rwns5CXKE@IRrECo8Pg+`rlXq%n27pthDA012ge?%=WkcfT=)8`1C_H0|Ro?O3UccQNw3RNk3<8-@6d|?=2*P
z|HJot7&rFz)SaEVeg(;GZf |