aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Deri <deri@ntop.org>2020-10-26 21:40:59 +0100
committerLuca Deri <deri@ntop.org>2020-10-26 21:40:59 +0100
commit948a9060378a2a33f5701947386492ff10cb2de6 (patch)
tree82ad122f24bc6ee7a9f5abea09abf790099091fe
parent9873972acb2be4682434543b051833feff071f6e (diff)
Added -D flag for detecting DoH in the wild
Removed heuristic from CiscoVPN as it leads to false positives
-rw-r--r--example/ndpiReader.c143
-rw-r--r--example/reader_util.c28
-rw-r--r--example/reader_util.h5
-rw-r--r--src/include/ndpi_typedefs.h1
-rw-r--r--src/lib/ndpi_analyze.c2
-rw-r--r--src/lib/ndpi_main.c5
-rw-r--r--src/lib/protocols/ciscovpn.c23
-rw-r--r--src/lib/protocols/tls.c14
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/result/anyconnect-vpn.pcap.out4
10 files changed, 174 insertions, 53 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c
index 4ff298db8..ac82fb45c 100644
--- a/example/ndpiReader.c
+++ b/example/ndpiReader.c
@@ -76,7 +76,7 @@ u_int8_t enable_protocol_guess = 1, enable_payload_analyzer = 0, num_bin_cluster
u_int8_t verbose = 0, enable_joy_stats = 0;
int nDPI_LogLevel = 0;
char *_debug_protocols = NULL;
-u_int8_t human_readeable_string_len = 5;
+u_int8_t human_readeable_string_len = 5, enable_doh_dot_detection = 0;
u_int8_t max_num_udp_dissected_pkts = 16 /* 8 is enough for most protocols, Signal requires more */, max_num_tcp_dissected_pkts = 80 /* due to telnet */;
static u_int32_t pcap_analysis_duration = (u_int32_t)-1;
static u_int16_t decode_tunnels = 0;
@@ -213,6 +213,48 @@ extern void ndpi_report_payload_stats();
FILE *trace = NULL;
#endif
+/* ********************************** */
+
+#define NUM_DOH_BINS 2
+
+struct ndpi_bin doh_ndpi_bins[NUM_DOH_BINS];
+
+u_int8_t doh_centroids[NUM_DOH_BINS][PLEN_NUM_BINS] = {
+ { 23,25,3,0,26,0,0,0,0,0,0,0,0,0,2,0,0,15,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
+ { 35,30,21,0,0,0,2,4,0,0,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+};
+
+float doh_max_distance = 35.5;
+
+void init_doh_bins() {
+ u_int i;
+
+ for(i=0; i<NUM_DOH_BINS; i++) {
+ ndpi_init_bin(&doh_ndpi_bins[i], ndpi_bin_family8, PLEN_NUM_BINS);
+ doh_ndpi_bins[i].u.bins8 = doh_centroids[i];
+ }
+}
+
+/* *********************************************** */
+
+u_int check_bin_doh_similarity(struct ndpi_bin *bin, float *similarity) {
+ u_int i;
+ float lowest_similarity = 9999999999;
+
+ for(i=0; i<NUM_DOH_BINS; i++) {
+ *similarity = ndpi_bin_similarity(&doh_ndpi_bins[i], bin, 0);
+
+ if(*similarity <= doh_max_distance)
+ return(1);
+
+ if(*similarity < lowest_similarity) lowest_similarity = *similarity;
+ }
+
+ *similarity = lowest_similarity;
+
+ return(0);
+}
+
/* *********************************************** */
void ndpiCheckHostStringMatch(char *testChar) {
@@ -391,7 +433,7 @@ static void help(u_int long_help) {
"-i <file|device> "
#endif
"[-f <filter>][-s <duration>][-m <duration>][-b <num bin clusters>]\n"
- " [-p <protos>][-l <loops> [-q][-d][-J][-h][-e <len>][-t][-v <level>]\n"
+ " [-p <protos>][-l <loops> [-q][-d][-J][-h][-D][-e <len>][-t][-v <level>]\n"
" [-n <threads>][-w <file>][-c <file>][-C <file>][-j <file>][-x <file>]\n"
" [-T <num>][-U <num>] [-x <domain>]\n\n"
"Usage:\n"
@@ -439,6 +481,7 @@ static void help(u_int long_help) {
" | only the last instance will be considered\n"
" -T <num> | Max number of TCP processed packets before giving up [default: %u]\n"
" -U <num> | Max number of UDP processed packets before giving up [default: %u]\n"
+ " -D | Enable DoH traffic analysis based on content (no DPI)\n"
" -x <domain> | Check domain name [Test only]\n"
,
human_readeable_string_len,
@@ -715,7 +758,7 @@ static void parseOptions(int argc, char **argv) {
}
#endif
- while((opt = getopt_long(argc, argv, "b:e:c:C:df:g:i:hp:P:l:s:tu:v:V:n:Jrp:x:w:q0123:456:7:89:m:T:U:",
+ while((opt = getopt_long(argc, argv, "b:e:c:C:dDf:g:i:hp:P:l:s:tu:v:V:n:Jrp:x:w:q0123:456:7:89:m:T:U:",
longopts, &option_idx)) != EOF) {
#ifdef DEBUG_TRACE
if(trace) fprintf(trace, " #### -%c [%s] #### \n", opt, optarg ? optarg : "");
@@ -731,6 +774,10 @@ static void parseOptions(int argc, char **argv) {
enable_protocol_guess = 0;
break;
+ case 'D':
+ enable_doh_dot_detection = 1;
+ break;
+
case 'e':
human_readeable_string_len = atoi(optarg);
break;
@@ -2000,9 +2047,8 @@ static void setupDetection(u_int16_t thread_id, pcap_t * pcap_handle) {
ndpi_finalize_initalization(ndpi_thread_info[thread_id].workflow->ndpi_struct);
-#ifdef USE_TLS_LEN
- ndpi_set_detection_preferences(ndpi_thread_info[thread_id].workflow->ndpi_struct, ndpi_pref_enable_tls_block_dissection, 1);
-#endif
+ if(enable_doh_dot_detection)
+ ndpi_set_detection_preferences(ndpi_thread_info[thread_id].workflow->ndpi_struct, ndpi_pref_enable_tls_block_dissection, 1);
}
/* *********************************************** */
@@ -2513,23 +2559,63 @@ static void printFlowsStats() {
if(verbose > 1) {
#ifndef DIRECTION_BINS
- struct ndpi_bin *bins = (struct ndpi_bin*)ndpi_malloc(sizeof(struct ndpi_bin)*num_flows);
- u_int16_t *cluster_ids = (u_int16_t*)ndpi_malloc(sizeof(u_int16_t)*num_flows);
+ struct ndpi_bin *bins = (struct ndpi_bin*)ndpi_malloc(sizeof(struct ndpi_bin)*num_flows);
+ u_int16_t *cluster_ids = (u_int16_t*)ndpi_malloc(sizeof(u_int16_t)*num_flows);
+ u_int32_t num_flow_bins = 0;
#endif
for(i=0; i<num_flows; i++) {
#ifndef DIRECTION_BINS
+ if(enable_doh_dot_detection) {
+ /* Discard flows with few packets per direction */
+ if((all_flows[i].flow->src2dst_packets < 10)
+ || (all_flows[i].flow->dst2src_packets < 10)
+ /* Ignore flows for which we have not seen the beginning */
+ )
+ goto print_flow;
+
+ if(all_flows[i].flow->protocol == 6 /* TCP */) {
+ /* Discard flows with no SYN as we need to check ALPN */
+ if((all_flows[i].flow->src2dst_syn_count == 0) || (all_flows[i].flow->dst2src_syn_count == 0))
+ goto print_flow;
+
+ if(all_flows[i].flow->detected_protocol.master_protocol == NDPI_PROTOCOL_TLS) {
+ if((all_flows[i].flow->src2dst_packets+all_flows[i].flow->dst2src_packets) < 40)
+ goto print_flow; /* Too few packets for TLS negotiation etc */
+ }
+ }
+ }
+
if(bins && cluster_ids) {
- memcpy(&bins[i], &all_flows[i].flow->payload_len_bin, sizeof(struct ndpi_bin));
- ndpi_normalize_bin(&bins[i]);
+ u_int j;
+ u_int8_t not_empty;
+
+ if(enable_doh_dot_detection) {
+ not_empty = 0;
+
+ /* Check if bins are empty (and in this case discard it) */
+ for(j=0; j<all_flows[i].flow->payload_len_bin.num_bins; j++)
+ if(all_flows[i].flow->payload_len_bin.u.bins8[j] != 0) {
+ not_empty = 1;
+ break;
+ }
+ } else
+ not_empty = 1;
+
+ if(not_empty) {
+ memcpy(&bins[num_flow_bins], &all_flows[i].flow->payload_len_bin, sizeof(struct ndpi_bin));
+ ndpi_normalize_bin(&bins[num_flow_bins]);
+ num_flow_bins++;
+ }
}
#endif
+ print_flow:
printFlow(i+1, all_flows[i].flow, all_flows[i].thread_id);
}
#ifndef DIRECTION_BINS
- if(bins && cluster_ids && (num_bin_clusters > 0)) {
+ if(bins && cluster_ids && (num_bin_clusters > 0) && (num_flow_bins > 0)) {
char buf[64];
u_int j;
struct ndpi_bin *centroids;
@@ -2539,7 +2625,7 @@ static void printFlowsStats() {
ndpi_init_bin(&centroids[i], ndpi_bin_family32 /* Use 32 bit to avoid overlaps */,
bins[0].num_bins);
- ndpi_cluster_bins(bins, num_flows, num_bin_clusters, cluster_ids, centroids);
+ ndpi_cluster_bins(bins, num_flow_bins, num_bin_clusters, cluster_ids, centroids);
printf("\n"
"\tBin clusters\n"
@@ -2547,8 +2633,11 @@ static void printFlowsStats() {
for(j=0; j<num_bin_clusters; j++) {
u_int16_t num_printed = 0;
+ float max_similarity = 0;
+
+ for(i=0; i<num_flow_bins; i++) {
+ float similarity, s;
- for(i=0; i<num_flows; i++) {
if(cluster_ids[i] != j) continue;
if(num_printed == 0) {
@@ -2567,16 +2656,38 @@ static void printFlowsStats() {
ntohs(all_flows[i].flow->dst_port));
print_bin(out, NULL, &bins[i]);
- printf("][similarity: %f]", ndpi_bin_similarity(&centroids[j], &bins[i], 0));
+ printf("][similarity: %f]",
+ (similarity = ndpi_bin_similarity(&centroids[j], &bins[i], 0)));
if(all_flows[i].flow->ssh_tls.client_requested_server_name[0] != '\0')
fprintf(out, "[%s]", all_flows[i].flow->ssh_tls.client_requested_server_name);
+ if(enable_doh_dot_detection) {
+ if(((all_flows[i].flow->detected_protocol.master_protocol == NDPI_PROTOCOL_TLS)
+ || (all_flows[i].flow->detected_protocol.app_protocol == NDPI_PROTOCOL_TLS)
+ || (all_flows[i].flow->detected_protocol.app_protocol == NDPI_PROTOCOL_DOH_DOT)
+ )
+ && all_flows[i].flow->ssh_tls.tls_alpn /* ALPN */
+ ) {
+ if(check_bin_doh_similarity(&bins[i], &s))
+ printf("[DoH (%f distance)]", s);
+ else
+ printf("[NO DoH (%f distance)]", s);
+ } else {
+ if(all_flows[i].flow->ssh_tls.tls_alpn == NULL)
+ printf("[NO DoH check: missing ALPN]");
+ }
+ }
+
printf("\n");
num_printed++;
+ if(similarity > max_similarity) max_similarity = similarity;
}
- if(num_printed) printf("\n");
+ if(num_printed) {
+ printf("\tMax similarity: %f\n", max_similarity);
+ printf("\n");
+ }
}
for(i=0; i<num_bin_clusters; i++)
@@ -3595,6 +3706,8 @@ int orginal_main(int argc, char **argv) {
exit(0);
}
+ if(enable_doh_dot_detection) init_doh_bins();
+
if(!quiet_mode) {
printf("\n-----------------------------------------------------------\n"
"* NOTE: This is demo app to show *some* nDPI features.\n"
diff --git a/example/reader_util.c b/example/reader_util.c
index 9b31f0e3f..3a8faed03 100644
--- a/example/reader_util.c
+++ b/example/reader_util.c
@@ -38,6 +38,8 @@
#include <float.h>
#endif
+#include "reader_util.h"
+
#ifndef ETH_P_IP
#define ETH_P_IP 0x0800 /* IPv4 */
#endif
@@ -77,11 +79,6 @@
#define DLT_LINUX_SLL 113
#endif
-#define PLEN_MAX 1504
-#define PLEN_BIN_LEN 32
-#define PLEN_NUM_BINS 48 /* 47*32 = 1504 */
-#define MAX_NUM_BIN_PKTS 256
-
#include "ndpi_main.h"
#include "reader_util.h"
#include "ndpi_classify.h"
@@ -89,6 +86,7 @@
extern u_int8_t enable_protocol_guess, enable_joy_stats, enable_payload_analyzer;
extern u_int8_t verbose, human_readeable_string_len;
extern u_int8_t max_num_udp_dissected_pkts /* 8 */, max_num_tcp_dissected_pkts /* 10 */;
+extern u_int8_t enable_doh_dot_detection;
static u_int32_t flow_id = 0;
/* ****************************************************** */
@@ -1213,17 +1211,17 @@ void process_ndpi_collected_info(struct ndpi_workflow * workflow, struct ndpi_fl
flow->ndpi_flow->protos.stun_ssl.ssl.alpn);
}
-#ifdef USE_TLS_LEN
- /* For TLS we use TLS block lenght instead of payload lenght */
- ndpi_reset_bin(&flow->payload_len_bin);
-
- for(i=0; i<flow->ndpi_flow->l4.tcp.tls.num_tls_blocks; i++) {
- u_int16_t len = abs(flow->ndpi_flow->l4.tcp.tls.tls_application_blocks_len[i]);
-
- /* printf("[TLS_LEN] %u\n", len); */
- ndpi_inc_bin(&flow->payload_len_bin, plen2slot(len), 1);
+ if(enable_doh_dot_detection) {
+ /* For TLS we use TLS block lenght instead of payload lenght */
+ ndpi_reset_bin(&flow->payload_len_bin);
+
+ for(i=0; i<flow->ndpi_flow->l4.tcp.tls.num_tls_blocks; i++) {
+ u_int16_t len = abs(flow->ndpi_flow->l4.tcp.tls.tls_application_blocks_len[i]);
+
+ /* printf("[TLS_LEN] %u\n", len); */
+ ndpi_inc_bin(&flow->payload_len_bin, plen2slot(len), 1);
+ }
}
-#endif
}
if(flow->detection_completed && (!flow->check_extra_packets)) {
diff --git a/example/reader_util.h b/example/reader_util.h
index 4dba29ddc..7337bb182 100644
--- a/example/reader_util.h
+++ b/example/reader_util.h
@@ -54,6 +54,11 @@ extern int dpdk_port_init(int port, struct rte_mempool *mbuf_pool);
extern int dpdk_port_deinit(int port);
#endif
+#define PLEN_MAX 1504
+#define PLEN_BIN_LEN 32
+#define PLEN_NUM_BINS 48 /* 47*32 = 1504 */
+#define MAX_NUM_BIN_PKTS 256
+
/* ETTA Spec defiintions for feature readiness */
#define ETTA_MIN_PACKETS 10
#define ETTA_MIN_OCTETS 4000
diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h
index 1a53a93c6..0c22a02fb 100644
--- a/src/include/ndpi_typedefs.h
+++ b/src/include/ndpi_typedefs.h
@@ -1032,6 +1032,7 @@ struct ndpi_detection_module_struct {
u_int32_t current_ts;
u_int32_t ticks_per_second;
u_int16_t num_tls_blocks_to_follow;
+ u_int8_t skip_tls_blocks_until_change_cipher:1, _notused:7;
#ifdef NDPI_ENABLE_DEBUG_MESSAGES
void *user_data;
diff --git a/src/lib/ndpi_analyze.c b/src/lib/ndpi_analyze.c
index 37e31474f..ddc782fbe 100644
--- a/src/lib/ndpi_analyze.c
+++ b/src/lib/ndpi_analyze.c
@@ -468,6 +468,7 @@ void ndpi_normalize_bin(struct ndpi_bin *b) {
b->u.bins8[i] = (b->u.bins8[i]*100) / tot;
}
break;
+
case ndpi_bin_family16:
for(i=0; i<b->num_bins; i++) tot += b->u.bins16[i];
@@ -476,6 +477,7 @@ void ndpi_normalize_bin(struct ndpi_bin *b) {
b->u.bins16[i] = (b->u.bins16[i]*100) / tot;
}
break;
+
case ndpi_bin_family32:
for(i=0; i<b->num_bins; i++) tot += b->u.bins32[i];
diff --git a/src/lib/ndpi_main.c b/src/lib/ndpi_main.c
index 9de47e471..65f1db852 100644
--- a/src/lib/ndpi_main.c
+++ b/src/lib/ndpi_main.c
@@ -603,10 +603,11 @@ int ndpi_set_detection_preferences(struct ndpi_detection_module_struct *ndpi_str
case ndpi_pref_enable_tls_block_dissection:
/*
- If this option is enabled only the TLS Application data blocks past the
- certificate negotiation are considered
+ If this option is enabled only the TLS Application data blocks past the
+ certificate negotiation are considered
*/
ndpi_str->num_tls_blocks_to_follow = NDPI_MAX_NUM_TLS_APPL_BLOCKS;
+ ndpi_str->skip_tls_blocks_until_change_cipher = 1;
break;
default:
diff --git a/src/lib/protocols/ciscovpn.c b/src/lib/protocols/ciscovpn.c
index c97ab25db..b503f1184 100644
--- a/src/lib/protocols/ciscovpn.c
+++ b/src/lib/protocols/ciscovpn.c
@@ -57,7 +57,7 @@ void ndpi_search_ciscovpn(struct ndpi_detection_module_struct *ndpi_struct, stru
if((tdport == 10000 && tsport == 10000) ||
((tsport == 443 || tdport == 443) &&
(packet->payload_packet_len >= 4) &&
- (packet->payload[0] == 0x17 &&
+ (packet->payload[0] == 0x17 /* TLS Application Data */ &&
packet->payload[1] == 0x01 &&
packet->payload[2] == 0x00 &&
packet->payload[3] == 0x00)
@@ -68,28 +68,27 @@ void ndpi_search_ciscovpn(struct ndpi_detection_module_struct *ndpi_struct, stru
ndpi_int_ciscovpn_add_connection(ndpi_struct, flow);
return;
}
+#if 0
+ /* Code disabled as it is too generic and it can lead to false positives */
else if(((tsport == 443 || tdport == 443) ||
(tsport == 80 || tdport == 80)) &&
(packet->payload_packet_len >= 5) &&
- ((packet->payload[0] == 0x17 &&
- packet->payload[1] == 0x03 &&
- packet->payload[2] == 0x03 &&
- packet->payload[3] == 0x00 &&
- packet->payload[4] == 0x3A)))
+ ((packet->payload[0] == 0x17 /* TLS Application Data */ &&
+ packet->payload[1] == 0x03 && packet->payload[2] == 0x03 && /* TLS 1.2 */
+ packet->payload[3] == 0x00 && packet->payload[4] == 0x3A /* Length */)))
{
/* TLS signature of Cisco AnyConnect 0X170303003A */
NDPI_LOG_INFO(ndpi_struct, "found CISCO Anyconnect VPN\n");
ndpi_int_ciscovpn_add_connection(ndpi_struct, flow);
return;
}
+#endif
else if(((tsport == 8009 || tdport == 8009) ||
(tsport == 8008 || tdport == 8008)) &&
(packet->payload_packet_len >= 5) &&
- ((packet->payload[0] == 0x17 &&
- packet->payload[1] == 0x03 &&
- packet->payload[2] == 0x03 &&
- packet->payload[3] == 0x00 &&
- packet->payload[4] == 0x69)))
+ ((packet->payload[0] == 0x17 /* TLS Application Data */ &&
+ packet->payload[1] == 0x03 && packet->payload[2] == 0x03 && /* TLS 1.2 */
+ packet->payload[3] == 0x00 && packet->payload[4] == 0x69 /* Length */)))
{
/* TCP signature of Cisco AnyConnect 0X1703030069 */
NDPI_LOG_INFO(ndpi_struct, "found CISCO Anyconnect VPN\n");
@@ -116,7 +115,7 @@ void ndpi_search_ciscovpn(struct ndpi_detection_module_struct *ndpi_struct, stru
(usport == 443 || udport == 443)
&&
(packet->payload_packet_len >= 5) &&
- (packet->payload[0] == 0x17 &&
+ (packet->payload[0] == 0x17 /* TLS Application Data */ &&
packet->payload[1] == 0x01 &&
packet->payload[2] == 0x00 &&
packet->payload[3] == 0x00 &&
diff --git a/src/lib/protocols/tls.c b/src/lib/protocols/tls.c
index 192625c5c..7f9e8d5c0 100644
--- a/src/lib/protocols/tls.c
+++ b/src/lib/protocols/tls.c
@@ -712,12 +712,14 @@ static int ndpi_search_tls_tcp(struct ndpi_detection_module_struct *ndpi_struct,
p = packet->payload, p_len = packet->payload_packet_len; /* Backup */
if(content_type == 0x14 /* Change Cipher Spec */) {
- /*
- Ignore Application Data up until change cipher
- so in this case we reset the number of observed
- TLS blocks
- */
- flow->l4.tcp.tls.num_tls_blocks = 0;
+ if(ndpi_struct->skip_tls_blocks_until_change_cipher) {
+ /*
+ Ignore Application Data up until change cipher
+ so in this case we reset the number of observed
+ TLS blocks
+ */
+ flow->l4.tcp.tls.num_tls_blocks = 0;
+ }
}
if((len > 9)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 75fc7e030..82625902c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -3,4 +3,4 @@ TESTS = do.sh
EXTRA_DIST = do.sh vagrind_test.sh ossfuzz.sh pcap result
all:
- @echo ""
+ @echo -n ""
diff --git a/tests/result/anyconnect-vpn.pcap.out b/tests/result/anyconnect-vpn.pcap.out
index b2fcc0a4e..fa65086c1 100644
--- a/tests/result/anyconnect-vpn.pcap.out
+++ b/tests/result/anyconnect-vpn.pcap.out
@@ -35,8 +35,8 @@ JA3 Host Stats:
12 TCP 10.0.0.227:56954 <-> 10.0.0.149:8008 [proto: 7/HTTP][cat: Web/5][4 pkts/527 bytes <-> 3 pkts/1401 bytes][Goodput ratio: 48/85][0.01 sec][Host: 10.0.0.149][bytes ratio: -0.453 (Download)][IAT c2s/s2c min/avg/max/stddev: 0/3 2/3 6/3 3/0][Pkt Len c2s/s2c min/avg/max/stddev: 66/66 132/467 317/1261 107/561][URL: 10.0.0.149:8008/ssdp/device-desc.xml][StatusCode: 200][Content-Type: application/xml][User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36][Risk: ** Known protocol on non standard port **][PLAIN TEXT (HGET /ssdp/device)][Plen Bins: 0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,0,0,0]
13 UDP [fe80::408:3e45:3abc:1552]:5353 -> [ff02::fb]:5353 [proto: 8/MDNS][cat: Network/14][9 pkts/1628 bytes -> 0 pkts/0 bytes][Goodput ratio: 66/0][25.40 sec][Host: _raop._tcp.local][_raop._tcp.local][bytes ratio: 1.000 (Upload)][IAT c2s/s2c min/avg/max/stddev: 819/0 3174/0 11263/0 3646/0][Pkt Len c2s/s2c min/avg/max/stddev: 152/0 181/0 206/0 24/0][Risk: ** Malformed packet **][PLAIN TEXT (companion)][Plen Bins: 0,0,33,22,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
14 UDP 10.0.0.227:137 -> 10.0.0.255:137 [proto: 10/NetBIOS][cat: System/18][15 pkts/1542 bytes -> 0 pkts/0 bytes][Goodput ratio: 59/0][6.05 sec][Host: lp-rkerur-osx][bytes ratio: 1.000 (Upload)][IAT c2s/s2c min/avg/max/stddev: 0/0 465/0 1499/0 677/0][Pkt Len c2s/s2c min/avg/max/stddev: 92/0 103/0 110/0 9/0][PLAIN TEXT ( EMFACNFCELEFFC)][Plen Bins: 0,40,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
- 15 TCP 10.0.0.227:56914 <-> 52.37.243.173:443 [proto: 161.178/CiscoVPN.Amazon][cat: VPN/2][8 pkts/847 bytes <-> 7 pkts/651 bytes][Goodput ratio: 38/29][21.75 sec][bytes ratio: 0.131 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 35/1 3340/2605 9634/9670 4130/3611][Pkt Len c2s/s2c min/avg/max/stddev: 66/66 106/93 131/129 31/31][Risk: ** Known protocol on non standard port **][Plen Bins: 0,75,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
- 16 TCP 10.0.0.227:56915 <-> 52.37.243.173:443 [proto: 161.178/CiscoVPN.Amazon][cat: VPN/2][8 pkts/847 bytes <-> 7 pkts/651 bytes][Goodput ratio: 38/29][22.76 sec][bytes ratio: 0.131 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 35/0 3340/3011 10636/10673 4210/3967][Pkt Len c2s/s2c min/avg/max/stddev: 66/66 106/93 131/129 31/31][Risk: ** Known protocol on non standard port **][Plen Bins: 0,75,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
+ 15 TCP 10.0.0.227:56914 <-> 52.37.243.173:443 [proto: 91.178/TLS.Amazon][cat: Web/5][8 pkts/847 bytes <-> 7 pkts/651 bytes][Goodput ratio: 38/29][21.75 sec][bytes ratio: 0.131 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 35/1 3340/2605 9634/9670 4130/3611][Pkt Len c2s/s2c min/avg/max/stddev: 66/66 106/93 131/129 31/31][Plen Bins: 0,75,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
+ 16 TCP 10.0.0.227:56915 <-> 52.37.243.173:443 [proto: 91.178/TLS.Amazon][cat: Web/5][8 pkts/847 bytes <-> 7 pkts/651 bytes][Goodput ratio: 38/29][22.76 sec][bytes ratio: 0.131 (Mixed)][IAT c2s/s2c min/avg/max/stddev: 35/0 3340/3011 10636/10673 4210/3967][Pkt Len c2s/s2c min/avg/max/stddev: 66/66 106/93 131/129 31/31][Plen Bins: 0,75,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
17 UDP 10.0.0.213:5353 -> 224.0.0.251:5353 [proto: 8/MDNS][cat: Network/14][9 pkts/1448 bytes -> 0 pkts/0 bytes][Goodput ratio: 74/0][25.40 sec][Host: _raop._tcp.local][_raop._tcp.local][bytes ratio: 1.000 (Upload)][IAT c2s/s2c min/avg/max/stddev: 819/0 3174/0 11263/0 3646/0][Pkt Len c2s/s2c min/avg/max/stddev: 132/0 161/0 186/0 24/0][Risk: ** Malformed packet **][PLAIN TEXT (companion)][Plen Bins: 0,0,33,22,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
18 UDP 10.0.0.151:1900 -> 10.0.0.227:57547 [proto: 12/SSDP][cat: System/18][4 pkts/1412 bytes -> 0 pkts/0 bytes][Goodput ratio: 88/0][2.86 sec][PLAIN TEXT (HTTP/1.1 200 OK)][Plen Bins: 0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
19 TCP 10.0.0.227:56881 <-> 162.222.43.153:443 [proto: 91/TLS][cat: Web/5][6 pkts/762 bytes <-> 6 pkts/396 bytes][Goodput ratio: 48/0][0.05 sec][bytes ratio: 0.316 (Upload)][IAT c2s/s2c min/avg/max/stddev: 0/1 0/1 0/2 0/1][Pkt Len c2s/s2c min/avg/max/stddev: 82/66 127/66 292/66 75/0][Plen Bins: 50,33,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]