http://git-wip-us.apache.org/repos/asf/metron/blob/5f7454e4/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/bro/BasicBroParserTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/bro/BasicBroParserTest.java b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/bro/BasicBroParserTest.java new file mode 100644 index 0000000..aa60d1f --- /dev/null +++ b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/bro/BasicBroParserTest.java @@ -0,0 +1,1189 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.metron.parsers.bro; + +import org.adrianwalker.multilinestring.Multiline; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.log4j.Level; +import org.apache.metron.test.utils.UnitTestHelper; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; +import org.junit.AfterClass; +import org.junit.Assert; + +import java.util.Map; +import org.junit.BeforeClass; +import org.junit.Test; + +public class BasicBroParserTest { + private BasicBroParser broParser = new BasicBroParser(); + private JSONParser jsonParser = new JSONParser(); + + @BeforeClass + public static void setup() { + UnitTestHelper.setLog4jLevel(BasicBroParser.class, Level.FATAL); + } + + @AfterClass + public static void teardown() { + UnitTestHelper.setLog4jLevel(BasicBroParser.class, Level.ERROR); + } + + /** + * This test is included as a gut-check about our formatting expectations using the Java JDK + * https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html + */ + @Test + public void testDecimalFormatAssumptions() { + Pair[] pairs = { + Pair.of(12345678d, "12345678.0"), + Pair.of(12345678.0d, "12345678.0"), + Pair.of(12345678.1d, "12345678.1"), + Pair.of(12345678.11d, "12345678.11"), + Pair.of(12345678.111d, "12345678.111"), + Pair.of(12345678.1111d, "12345678.1111"), + Pair.of(12345678.11111d, "12345678.11111"), + Pair.of(12345678.111111d, "12345678.111111") + }; + for (Pair pair : pairs) { + Assert.assertEquals("Format did not match", pair.getRight(), BasicBroParser.DECIMAL_FORMAT.get().format(pair.getLeft())); + } + } + + /** + * { + * "ts":1449511228.474, + * "uid":"CFgSLp4HgsGqXnNjZi", + * "id.orig_h":"104.130.172.191", + * "id.orig_p":33893, + * "id.resp_h":"69.20.0.164", + * "id.resp_p":53, + * "proto":"udp", + * "trans_id":3514, + * "rcode":3, + * "rcode_name":"NXDOMAIN", + * "AA":false, + * "TC":false, + * "RD":false, + * "RA":false, + * "Z":0, + * "rejected":false, + * "sensor":"cloudbro", + * "type":"dns" + * } + */ + @Multiline + public final static String unwrappedBroMessage; + + @Test + public void testUnwrappedBroMessage() throws ParseException { + JSONObject rawJson = (JSONObject)jsonParser.parse(unwrappedBroMessage); + JSONObject broJson = broParser.parse(unwrappedBroMessage.getBytes()).get(0); + + String expectedBroTimestamp = "1449511228.474"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1449511228474"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port"), rawJson.get("id.orig_p")); + Assert.assertEquals(broJson.get("ip_dst_port"), rawJson.get("id.resp_p")); + Assert.assertEquals(broJson.get("uid").toString(), rawJson.get("uid").toString()); + Assert.assertEquals(broJson.get("trans_id").toString(), rawJson.get("trans_id").toString()); + Assert.assertEquals(broJson.get("sensor").toString(), rawJson.get("sensor").toString()); + Assert.assertEquals(broJson.get("type").toString(), rawJson.get("type").toString()); + Assert.assertEquals(broJson.get("rcode").toString(), rawJson.get("rcode").toString()); + Assert.assertEquals(broJson.get("rcode_name").toString(), rawJson.get("rcode_name").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("DNS")); + } + + /** + * { + * "http": { + * "ts":1402307733.473, + * "uid":"CTo78A11g7CYbbOHvj", + * "id.orig_h":"192.249.113.37", + * "id.orig_p":58808, + * "id.resp_h":"72.163.4.161", + * "id.resp_p":80, + * "trans_depth":1, + * "method":"GET", + * "host":"www.cisco.com", + * "uri":"/", + * "user_agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3", + * "request_body_len":0, + * "response_body_len":25523, + * "status_code":200, + * "status_msg":"OK", + * "tags":[], + * "resp_fuids":["FJDyMC15lxUn5ngPfd"], + * "resp_mime_types":["text/html"] + * } + * } + */ + @Multiline + public final static String httpBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testHttpBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(httpBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(httpBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1402307733.473"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1402307733473"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("uid").toString(), rawJson.get("uid").toString()); + Assert.assertEquals(broJson.get("method").toString(), rawJson.get("method").toString()); + Assert.assertEquals(broJson.get("host").toString(), rawJson.get("host").toString()); + Assert.assertEquals(broJson.get("resp_mime_types").toString(), rawJson.get("resp_mime_types").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("HTTP")); + } + + /** + * Ensure we are able to parse values with fewer than 13 digits, including the millis after the decimal. + * This test verifies we handle parsing timestamps in situations where, for instance, 123.000000 is represented + * more compactly as 123.0 + */ + @SuppressWarnings("rawtypes") + @Test + public void testHttpBroMessageWithZeroDecimalTruncation() throws ParseException { + { + String rawMessage = "{\"http\": {\"ts\":1467657279,\"uid\":\"CMYLzP3PKiwZAgBa51\",\"id.orig_h\":\"192.168.138.158\",\"id.orig_p\":49206,\"id.resp_h\":\"95.163.121.204\"," + + "\"id.resp_p\":80,\"trans_depth\":2,\"method\":\"GET\",\"host\":\"7oqnsnzwwnm6zb7y.gigapaysun.com\",\"uri\":\"/img/flags/it.png\",\"referrer\":\"http://7oqnsnzwwnm6zb7y.gigapaysun.com/11iQmfg\",\"user_agent\":\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)\",\"request_body_len\":0,\"response_body_len\":552,\"status_code\":200,\"status_msg\":\"OK\",\"tags\":[],\"resp_fuids\":[\"F3m7vB2RjUe4n01aqj\"],\"resp_mime_types\":[\"image/png\"]}}"; + + Map rawMessageMap = (Map) jsonParser.parse(rawMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(rawMessage.getBytes()).get(0); + String expectedTimestamp = "1467657279000"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + String expectedBroTimestamp = "1467657279.0"; + Assert.assertEquals(broJson.get("bro_timestamp").toString(), expectedBroTimestamp); + } + { + String rawMessage = "{\"http\": {\"ts\":1467657279.0,\"uid\":\"CMYLzP3PKiwZAgBa51\",\"id.orig_h\":\"192.168.138.158\",\"id.orig_p\":49206,\"id.resp_h\":\"95.163.121.204\"," + + "\"id.resp_p\":80,\"trans_depth\":2,\"method\":\"GET\",\"host\":\"7oqnsnzwwnm6zb7y.gigapaysun.com\",\"uri\":\"/img/flags/it.png\",\"referrer\":\"http://7oqnsnzwwnm6zb7y.gigapaysun.com/11iQmfg\",\"user_agent\":\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)\",\"request_body_len\":0,\"response_body_len\":552,\"status_code\":200,\"status_msg\":\"OK\",\"tags\":[],\"resp_fuids\":[\"F3m7vB2RjUe4n01aqj\"],\"resp_mime_types\":[\"image/png\"]}}"; + + Map rawMessageMap = (Map) jsonParser.parse(rawMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(rawMessage.getBytes()).get(0); + String expectedTimestamp = "1467657279000"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + String expectedBroTimestamp = "1467657279.0"; + Assert.assertEquals(broJson.get("bro_timestamp").toString(), expectedBroTimestamp); + } + { + String rawMessage = "{\"http\": {\"ts\":1467657279.1,\"uid\":\"CMYLzP3PKiwZAgBa51\",\"id.orig_h\":\"192.168.138.158\",\"id.orig_p\":49206,\"id.resp_h\":\"95.163.121.204\"," + + "\"id.resp_p\":80,\"trans_depth\":2,\"method\":\"GET\",\"host\":\"7oqnsnzwwnm6zb7y.gigapaysun.com\",\"uri\":\"/img/flags/it.png\",\"referrer\":\"http://7oqnsnzwwnm6zb7y.gigapaysun.com/11iQmfg\",\"user_agent\":\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)\",\"request_body_len\":0,\"response_body_len\":552,\"status_code\":200,\"status_msg\":\"OK\",\"tags\":[],\"resp_fuids\":[\"F3m7vB2RjUe4n01aqj\"],\"resp_mime_types\":[\"image/png\"]}}"; + + Map rawMessageMap = (Map) jsonParser.parse(rawMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(rawMessage.getBytes()).get(0); + String expectedTimestamp = "1467657279100"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + String expectedBroTimestamp = "1467657279.1"; + Assert.assertEquals(broJson.get("bro_timestamp").toString(), expectedBroTimestamp); + } + { + String rawMessage = "{\"http\": {\"ts\":1467657279.11,\"uid\":\"CMYLzP3PKiwZAgBa51\",\"id.orig_h\":\"192.168.138.158\",\"id.orig_p\":49206,\"id.resp_h\":\"95.163.121.204\"," + + "\"id.resp_p\":80,\"trans_depth\":2,\"method\":\"GET\",\"host\":\"7oqnsnzwwnm6zb7y.gigapaysun.com\",\"uri\":\"/img/flags/it.png\",\"referrer\":\"http://7oqnsnzwwnm6zb7y.gigapaysun.com/11iQmfg\",\"user_agent\":\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)\",\"request_body_len\":0,\"response_body_len\":552,\"status_code\":200,\"status_msg\":\"OK\",\"tags\":[],\"resp_fuids\":[\"F3m7vB2RjUe4n01aqj\"],\"resp_mime_types\":[\"image/png\"]}}"; + + Map rawMessageMap = (Map) jsonParser.parse(rawMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(rawMessage.getBytes()).get(0); + String expectedTimestamp = "1467657279110"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + String expectedBroTimestamp = "1467657279.11"; + Assert.assertEquals(broJson.get("bro_timestamp").toString(), expectedBroTimestamp); + } + } + + /** + * { + * "http": { + * "ts":1457149494.166991, + * "uid":"CTo78A11g7CYbbOHvj", + * "id.orig_h":"192.249.113.37", + * "id.orig_p":58808, + * "id.resp_h":"72.163.4.161", + * "id.resp_p":80, + * "trans_depth":1, + * "method":"GET", + * "host":"www.cisco.com", + * "uri":"/", + * "user_agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3", + * "request_body_len":0, + * "response_body_len":25523, + * "status_code":200, + * "status_msg":"OK", + * "tags":[], + * "resp_fuids":["FJDyMC15lxUn5ngPfd"], + * "resp_mime_types":["text/html"] + * } + * } + */ + @Multiline + public final static String httpBroDecimalMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testHttpBroDecimalMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(httpBroDecimalMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(httpBroDecimalMessage.getBytes()).get(0); + String expectedBroTimestamp = "1457149494.166991"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1457149494166"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("uid").toString(), rawJson.get("uid").toString()); + Assert.assertEquals(broJson.get("method").toString(), rawJson.get("method").toString()); + Assert.assertEquals(broJson.get("host").toString(), rawJson.get("host").toString()); + Assert.assertEquals(broJson.get("resp_mime_types").toString(), rawJson.get("resp_mime_types").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("HTTP")); + } + + + /** + * { + * "dns": { + * "ts":1402308259.609, + * "uid":"CuJT272SKaJSuqO0Ia", + * "id.orig_h":"10.122.196.204", + * "id.orig_p":33976, + * "id.resp_h":"144.254.71.184", + * "id.resp_p":53, + * "proto":"udp", + * "trans_id":62418, + * "query":"www.cisco.com", + * "qclass":1, + * "qclass_name":"C_INTERNET", + * "qtype":28, + * "qtype_name":"AAAA", + * "rcode":0, + * "rcode_name":"NOERROR", + * "AA":true, + * "TC":false, + * "RD":true, + * "RA":true, + * "Z":0, + * "answers":["www.cisco.com.akadns.net","origin-www.cisco.com","2001:420:1201:2::a"], + * "TTLs":[3600.0,289.0,14.0], + * "rejected":false + * } + * } + */ + @Multiline + public final static String dnsBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testDnsBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(dnsBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(dnsBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1402308259.609"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1402308259609"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("qtype").toString(), rawJson.get("qtype").toString()); + Assert.assertEquals(broJson.get("trans_id").toString(), rawJson.get("trans_id").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("DNS")); + } + + /** + * { + * "files": { + * "analyzers": ["X509","MD5","SHA1"], + * "conn_uids":["C4tygJ3qxJBEJEBCeh"], + * "depth": 0, + * "duration": 0.0, + * "fuid":"FZEBC33VySG0nHSoO9", + * "is_orig": false, + * "local_orig": false, + * "md5": "eba37166385e3ef42464ed9752e99f1b", + * "missing_bytes": 0, + * "overflow_bytes": 0, + * "rx_hosts": ["10.220.15.205"], + * "seen_bytes": 1136, + * "sha1": "73e42686657aece354fbf685712361658f2f4357", + * "source": "SSL", + * "timedout": false, + * "ts": 1425845251.334, + * "tx_hosts": ["68.171.237.7"] + * } + * } + */ + @Multiline + public final static String filesBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testFilesBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(filesBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(filesBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1425845251.334"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1425845251334"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), ((JSONArray)rawJson.get("tx_hosts")).get(0).toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), ((JSONArray)rawJson.get("rx_hosts")).get(0).toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("fuid").toString(), rawJson.get("fuid").toString()); + Assert.assertEquals(broJson.get("md5").toString(), rawJson.get("md5").toString()); + Assert.assertEquals(broJson.get("analyzers").toString(), rawJson.get("analyzers").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("FILES")); + } + + /** + * { + * "conn": { + * "ts":1166289883.163553, + * "uid":"CTKCLy1z4C9U8OqU0c", + * "id.orig_h":"192.168.0.114", + * "id.orig_p":1140, + * "id.resp_h":"192.168.0.193", + * "id.resp_p":7254, + * "proto":"tcp", + * "service":"ftp-data", + * "duration":0.006635, + * "orig_bytes":0, + * "resp_bytes":5808, + * "conn_state":"S1", + * "missed_bytes":0, + * "history":"ShAd", + * "orig_pkts":3, + * "orig_ip_bytes":128, + * "resp_pkts":5, + * "resp_ip_bytes":6016, + * "tunnel_parents":[] + * } + * } + */ + @Multiline + public final static String connBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testConnBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(connBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(connBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1166289883.163553"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1166289883163"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("proto").toString(), rawJson.get("proto").toString()); + Assert.assertEquals(broJson.get("service").toString(), rawJson.get("service").toString()); + Assert.assertEquals(broJson.get("duration").toString(), rawJson.get("duration").toString()); + Assert.assertEquals(broJson.get("orig_bytes").toString(), rawJson.get("orig_bytes").toString()); + Assert.assertEquals(broJson.get("resp_bytes").toString(), rawJson.get("resp_bytes").toString()); + Assert.assertEquals(broJson.get("conn_state").toString(), rawJson.get("conn_state").toString()); + Assert.assertEquals(broJson.get("missed_bytes").toString(), rawJson.get("missed_bytes").toString()); + Assert.assertEquals(broJson.get("history").toString(), rawJson.get("history").toString()); + Assert.assertEquals(broJson.get("orig_pkts").toString(), rawJson.get("orig_pkts").toString()); + Assert.assertEquals(broJson.get("orig_ip_bytes").toString(), rawJson.get("orig_ip_bytes").toString()); + Assert.assertEquals(broJson.get("resp_pkts").toString(), rawJson.get("resp_pkts").toString()); + Assert.assertEquals(broJson.get("resp_ip_bytes").toString(), rawJson.get("resp_ip_bytes").toString()); + Assert.assertEquals(broJson.get("tunnel_parents").toString(), rawJson.get("tunnel_parents").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("CONN")); + } + + /** + * { + * "dpd": { + * "ts":1216704078.712276, + * "uid":"CwlB8d119WPanz63J", + * "id.orig_h":"192.168.15.4", + * "id.orig_p":34508, + * "id.resp_h":"66.33.212.43", + * "id.resp_p":80, + * "proto":"tcp", + * "analyzer":"HTTP", + * "failure_reason":"not a http reply line" + * } + * } + */ + @Multiline + public final static String dpdBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testDpdBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(dpdBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(dpdBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216704078.712276"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216704078712"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("proto").toString(), rawJson.get("proto").toString()); + Assert.assertEquals(broJson.get("analyzer").toString(), rawJson.get("analyzer").toString()); + Assert.assertEquals(broJson.get("failure_reason").toString(), rawJson.get("failure_reason").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("DPD")); + } + + /** + * { + * "ftp": { + * "ts":1166289883.164645, + * "uid":"CuVhX03cii8zrjrtva", + * "id.orig_h":"192.168.0.114", + * "id.orig_p":1137, + * "id.resp_h":"192.168.0.193", + * "id.resp_p":21, + * "user":"csanders", + * "password":"<hidden>", + * "command":"RETR", + * "arg":"ftp://192.168.0.193/Music.mp3", + * "mime_type":"<unknown>", + * "file_size":192, + * "reply_code":150, + * "reply_msg":"Data connection accepted from 192.168.0.114:1140; transfer starting for Music.mp3 (4980924 bytes).", + * "fuid":"FlS6Jg1aNdsBxNn9Bf" + * } + * } + */ + @Multiline + public final static String ftpBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testFtpBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(ftpBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(ftpBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1166289883.164645"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1166289883164"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("user").toString(), rawJson.get("user").toString()); + Assert.assertEquals(broJson.get("password").toString(), rawJson.get("password").toString()); + Assert.assertEquals(broJson.get("command").toString(), rawJson.get("command").toString()); + Assert.assertEquals(broJson.get("arg").toString(), rawJson.get("arg").toString()); + Assert.assertEquals(broJson.get("mime_type").toString(), rawJson.get("mime_type").toString()); + Assert.assertEquals(broJson.get("file_size").toString(), rawJson.get("file_size").toString()); + Assert.assertEquals(broJson.get("reply_code").toString(), rawJson.get("reply_code").toString()); + Assert.assertEquals(broJson.get("reply_msg").toString(), rawJson.get("reply_msg").toString()); + Assert.assertEquals(broJson.get("fuid").toString(), rawJson.get("fuid").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("FTP")); + } + + /** + * { + * "known_certs": { + * "ts":1216706999.896836, + * "host":"65.54.186.47", + * "port_num":443, + * "subject":"CN=login.live.com,OU=MSN-Passport,O=Microsoft Corporation,street=One Microsoft Way,L=Redmond,ST=Washington,postalCode=98052,C=US,serialNumber=600413485,businessCategory=V1.0\u005c, Clause 5.(b),1.3.6.1.4.1.311.60.2.1.2=#130A57617368696E67746F6E,1.3.6.1.4.1.311.60.2.1.3=#13025553", + * "issuer_subject":"CN=VeriSign Class 3 Extended Validation SSL CA,OU=Terms of use at https://www.verisign.com/rpa (c)06,OU=VeriSign Trust Network,O=VeriSign\u005c, Inc.,C=US", + * "serial":"6905C4A47CFDBF9DBC98DACE38835FB8" + * } + * } + */ + @Multiline + public final static String knownCertsBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testKnownCertsBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(knownCertsBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(knownCertsBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216706999.896836"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216706999896"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("host").toString(), rawJson.get("host").toString()); + Assert.assertEquals(broJson.get("port_num").toString(), rawJson.get("port_num").toString()); + Assert.assertEquals(broJson.get("subject").toString(), rawJson.get("subject").toString()); + Assert.assertEquals(broJson.get("issuer_subject").toString(), rawJson.get("issuer_subject").toString()); + Assert.assertEquals(broJson.get("serial").toString(), rawJson.get("serial").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("KNOWN_CERTS")); + } + + /** + * { + * "smtp": { + * "ts":1258568059.130219, + * "uid":"CMeLem2ouYvV8fzUp9", + * "id.orig_h":"192.168.1.103", + * "id.orig_p":1836, + * "id.resp_h":"192.168.1.1", + * "id.resp_p":25, + * "trans_depth":1, + * "helo":"m57pat", + * "last_reply":"220 2.0.0 Ready to start TLS", + * "path":["192.168.1.1","192.168.1.103"], + * "tls":true, + * "fuids":[], + * "is_webmail":false + * } + * } + */ + @Multiline + public final static String smtpBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testSmtpBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(smtpBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(smtpBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1258568059.130219"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1258568059130"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("trans_depth").toString(), rawJson.get("trans_depth").toString()); + Assert.assertEquals(broJson.get("helo").toString(), rawJson.get("helo").toString()); + Assert.assertEquals(broJson.get("last_reply").toString(), rawJson.get("last_reply").toString()); + Assert.assertEquals(broJson.get("path").toString(), rawJson.get("path").toString()); + Assert.assertEquals(broJson.get("tls").toString(), rawJson.get("tls").toString()); + Assert.assertEquals(broJson.get("fuids").toString(), rawJson.get("fuids").toString()); + Assert.assertEquals(broJson.get("is_webmail").toString(), rawJson.get("is_webmail").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("SMTP")); + } + + /** + * { + * "ssl": { + * "ts":1216706999.444925, + * "uid":"Chy3Ge1k0IceXK4Di", + * "id.orig_h":"192.168.15.4", + * "id.orig_p":36532, + * "id.resp_h":"65.54.186.47", + * "id.resp_p":443, + * "version":"TLSv10", + * "cipher":"TLS_RSA_WITH_RC4_128_MD5", + * "server_name":"login.live.com", + * "resumed":false, + * "established":true, + * "cert_chain_fuids":["FkYBO41LPAXxh44KFk","FPrzYN1SuBqHflXZId","FZ71xF13r5XVSam1z1"], + * "client_cert_chain_fuids":[], + * "subject":"CN=login.live.com,OU=MSN-Passport,O=Microsoft Corporation,street=One Microsoft Way,L=Redmond,ST=Washington,postalCode=98052,C=US,serialNumber=600413485,businessCategory=V1.0\u005c, Clause 5.(b),1.3.6.1.4.1.311.60.2.1.2=#130A57617368696E67746F6E,1.3.6.1.4.1.311.60.2.1.3=#13025553", + * "issuer":"CN=VeriSign Class 3 Extended Validation SSL CA,OU=Terms of use at https://www.verisign.com/rpa (c)06,OU=VeriSign Trust Network,O=VeriSign\u005c, Inc.,C=US", + * "validation_status":"unable to get local issuer certificate" + * } + * } + */ + @Multiline + public final static String sslBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testSslBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(sslBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(sslBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216706999.444925"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216706999444"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("version").toString(), rawJson.get("version").toString()); + Assert.assertEquals(broJson.get("cipher").toString(), rawJson.get("cipher").toString()); + Assert.assertEquals(broJson.get("server_name").toString(), rawJson.get("server_name").toString()); + Assert.assertEquals(broJson.get("resumed").toString(), rawJson.get("resumed").toString()); + Assert.assertEquals(broJson.get("established").toString(), rawJson.get("established").toString()); + Assert.assertEquals(broJson.get("cert_chain_fuids").toString(), rawJson.get("cert_chain_fuids").toString()); + Assert.assertEquals(broJson.get("client_cert_chain_fuids").toString(), rawJson.get("client_cert_chain_fuids").toString()); + Assert.assertEquals(broJson.get("subject").toString(), rawJson.get("subject").toString()); + Assert.assertEquals(broJson.get("issuer").toString(), rawJson.get("issuer").toString()); + Assert.assertEquals(broJson.get("validation_status").toString(), rawJson.get("validation_status").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("SSL")); + } + + /** + * { + * "weird": { + * "ts":1216706886.239896, + * "uid":"CLSluk42pqbExeZQFl", + * "id.orig_h":"192.168.15.4", + * "id.orig_p":36336, + * "id.resp_h":"66.151.146.194", + * "id.resp_p":80, + * "name":"unescaped_special_URI_char", + * "notice":false, + * "peer":"bro" + * } + * } + */ + @Multiline + public final static String weirdBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testWeirdBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(weirdBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(weirdBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216706886.239896"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216706886239"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("name").toString(), rawJson.get("name").toString()); + Assert.assertEquals(broJson.get("notice").toString(), rawJson.get("notice").toString()); + Assert.assertEquals(broJson.get("peer").toString(), rawJson.get("peer").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("WEIRD")); + } + + /** + * { + * "notice": { + * "ts":1216706377.196728, + * "uid":"CgpsTT28ZTiuSEsfVi", + * "id.orig_h":"192.168.15.4", + * "id.orig_p":35736, + * "id.resp_h":"74.125.19.104", + * "id.resp_p":443, + * "proto":"tcp", + * "note":"SSL::Invalid_Server_Cert", + * "msg":"SSL certificate validation failed with (unable to get local issuer certificate)", + * "sub":"CN=www.google.com,O=Google Inc,L=Mountain View,ST=California,C=US", + * "src":"192.168.15.4", + * "dst":"74.125.19.104", + * "p":443, + * "peer_descr":"bro", + * "actions":["Notice::ACTION_LOG"], + * "suppress_for":3600.0, + * "dropped":false + * } + * } + */ + @Multiline + public final static String noticeBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testNoticeBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(noticeBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(noticeBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216706377.196728"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216706377196"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("proto").toString(), rawJson.get("proto").toString()); + Assert.assertEquals(broJson.get("note").toString(), rawJson.get("note").toString()); + Assert.assertEquals(broJson.get("msg").toString(), rawJson.get("msg").toString()); + Assert.assertEquals(broJson.get("sub").toString(), rawJson.get("sub").toString()); + Assert.assertEquals(broJson.get("src").toString(), rawJson.get("src").toString()); + Assert.assertEquals(broJson.get("dst").toString(), rawJson.get("dst").toString()); + Assert.assertEquals(broJson.get("p").toString(), rawJson.get("p").toString()); + Assert.assertEquals(broJson.get("peer_descr").toString(), rawJson.get("peer_descr").toString()); + Assert.assertEquals(broJson.get("actions").toString(), rawJson.get("actions").toString()); + Assert.assertEquals(broJson.get("suppress_for").toString(), rawJson.get("suppress_for").toString()); + Assert.assertEquals(broJson.get("dropped").toString(), rawJson.get("dropped").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("NOTICE")); + } + + /** + * { + * "dhcp": { + * "ts":1258567562.944638, + * "uid":"C8rZDh400N68UV9Ulj", + * "id.orig_h":"192.168.1.103", + * "id.orig_p":68, + * "id.resp_h":"192.168.1.1", + * "id.resp_p":67, + * "mac":"00:0b:db:63:5b:d4", + * "assigned_ip":"192.168.1.103", + * "lease_time":3564.0, + * "trans_id":418901490 + * } + * } + */ + @Multiline + public final static String dhcpBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testDhcpBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(dhcpBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(dhcpBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1258567562.944638"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1258567562944"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("mac").toString(), rawJson.get("mac").toString()); + Assert.assertEquals(broJson.get("assigned_ip").toString(), rawJson.get("assigned_ip").toString()); + Assert.assertEquals(broJson.get("lease_time").toString(), rawJson.get("lease_time").toString()); + Assert.assertEquals(broJson.get("trans_id").toString(), rawJson.get("trans_id").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("DHCP")); + } + + /** + * { + * "ssh": { + * "ts":1320435870.747967, + * "uid":"CSbqud1LKhRqlJiLDg", + * "id.orig_h":"172.16.238.1", + * "id.orig_p":58429, + * "id.resp_h":"172.16.238.136", + * "id.resp_p":22, + * "version":2, + * "auth_success":false, + * "client":"SSH-2.0-OpenSSH_5.6", + * "server":"SSH-2.0-OpenSSH_5.8p1 Debian-7ubuntu1", + * "cipher_alg":"aes128-ctr", + * "mac_alg":"hmac-md5", + * "compression_alg":"none", + * "kex_alg":"diffie-hellman-group-exchange-sha256", + * "host_key_alg":"ssh-rsa", + * "host_key":"87:11:46:da:89:c5:2b:d9:6b:ee:e0:44:7e:73:80:f8" + * } + * } + */ + @Multiline + public final static String sshBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testSshBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(sshBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(sshBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1320435870.747967"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1320435870747"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("version").toString(), rawJson.get("version").toString()); + Assert.assertEquals(broJson.get("auth_success").toString(), rawJson.get("auth_success").toString()); + Assert.assertEquals(broJson.get("client").toString(), rawJson.get("client").toString()); + Assert.assertEquals(broJson.get("server").toString(), rawJson.get("server").toString()); + Assert.assertEquals(broJson.get("cipher_alg").toString(), rawJson.get("cipher_alg").toString()); + Assert.assertEquals(broJson.get("mac_alg").toString(), rawJson.get("mac_alg").toString()); + Assert.assertEquals(broJson.get("compression_alg").toString(), rawJson.get("compression_alg").toString()); + Assert.assertEquals(broJson.get("kex_alg").toString(), rawJson.get("kex_alg").toString()); + Assert.assertEquals(broJson.get("host_key_alg").toString(), rawJson.get("host_key_alg").toString()); + Assert.assertEquals(broJson.get("host_key").toString(), rawJson.get("host_key").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("SSH")); + } + + /** + * { + * "software": { + * "ts":1216707079.49066, + * "host":"38.102.35.231", + * "host_p":80, + * "software_type":"HTTP::SERVER", + * "name":"lighttpd", + * "version.major":1, + * "version.minor":4, + * "version.minor2":18, + * "unparsed_version":"lighttpd/1.4.18" + * } + * } + */ + @Multiline + public final static String softwareBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testSoftwareBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(softwareBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(softwareBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216707079.49066"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216707079490"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("host").toString(), rawJson.get("host").toString()); + Assert.assertEquals(broJson.get("host_p").toString(), rawJson.get("host_p").toString()); + Assert.assertEquals(broJson.get("software_type").toString(), rawJson.get("software_type").toString()); + Assert.assertEquals(broJson.get("name").toString(), rawJson.get("name").toString()); + Assert.assertEquals(broJson.get("version.major").toString(), rawJson.get("version.major").toString()); + Assert.assertEquals(broJson.get("version.minor").toString(), rawJson.get("version.minor").toString()); + Assert.assertEquals(broJson.get("version.minor2").toString(), rawJson.get("version.minor2").toString()); + Assert.assertEquals(broJson.get("unparsed_version").toString(), rawJson.get("unparsed_version").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("SOFTWARE")); + } + + /** + * { + * "software": { + * "ts":1216707079.518447, + * "host":"72.21.202.98", + * "host_p":80, + * "software_type":"HTTP::SERVER", + * "name":"AmazonS3", + * "unparsed_version":"AmazonS3" + * } + * } + */ + @Multiline + public final static String softwareBroMessage2; + + @SuppressWarnings("rawtypes") + @Test + public void testSoftwareBroMessage2() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(softwareBroMessage2); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(softwareBroMessage2.getBytes()).get(0); + String expectedBroTimestamp = "1216707079.518447"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216707079518"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("host").toString(), rawJson.get("host").toString()); + Assert.assertEquals(broJson.get("host_p").toString(), rawJson.get("host_p").toString()); + Assert.assertEquals(broJson.get("software_type").toString(), rawJson.get("software_type").toString()); + Assert.assertEquals(broJson.get("name").toString(), rawJson.get("name").toString()); + Assert.assertEquals(broJson.get("unparsed_version").toString(), rawJson.get("unparsed_version").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("SOFTWARE")); + } + + /** + * { + * "radius": { + * "ts":1440447766.441298, + * "uid":"Cfvksv4SEJJiqFobPj", + * "id.orig_h":"127.0.0.1", + * "id.orig_p":53031, + * "id.resp_h":"127.0.0.1", + * "id.resp_p":1812, + * "username":"steve", + * "result":"failed" + * } + * } + */ + @Multiline + public final static String radiusBroMessageFailed; + + @SuppressWarnings("rawtypes") + @Test + public void testRadiusBroMessageFailed() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(radiusBroMessageFailed); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(radiusBroMessageFailed.getBytes()).get(0); + String expectedBroTimestamp = "1440447766.441298"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1440447766441"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("username").toString(), rawJson.get("username").toString()); + Assert.assertEquals(broJson.get("result").toString(), rawJson.get("result").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("RADIUS")); + } + + /** + * { + * "radius": { + * "ts":1440447839.947956, + * "uid":"CHb5MF3GTmyPniTage", + * "id.orig_h":"127.0.0.1", + * "id.orig_p":65443, + * "id.resp_h":"127.0.0.1", + * "id.resp_p":1812, + * "username":"steve", + * "result":"success" + * } + * } + */ + @Multiline + public final static String radiusBroMessageSuccess; + + @SuppressWarnings("rawtypes") + @Test + public void testRadiusBroMessageSuccess() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(radiusBroMessageSuccess); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(radiusBroMessageSuccess.getBytes()).get(0); + String expectedBroTimestamp = "1440447839.947956"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1440447839947"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("username").toString(), rawJson.get("username").toString()); + Assert.assertEquals(broJson.get("result").toString(), rawJson.get("result").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("RADIUS")); + } + + /** + * { + * "x509": { + * "ts":1216706999.661483, + * "id":"FPrzYN1SuBqHflXZId", + * "certificate.version":3, + * "certificate.serial":"5B7759C61784E15EC727C0329529286B", + * "certificate.subject":"CN=VeriSign Class 3 Extended Validation SSL CA,OU=Terms of use at https://www.verisign.com/rpa (c)06,OU=VeriSign Trust Network,O=VeriSign\u005c, Inc.,C=US","certificate.issuer":"CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign\u005c, Inc. - For authorized use only,OU=VeriSign Trust Network,O=VeriSign\u005c, Inc.,C=US", + * "certificate.not_valid_before":1162944000.0, + * "certificate.not_valid_after":1478563199.0, + * "certificate.key_alg":"rsaEncryption", + * "certificate.sig_alg":"sha1WithRSAEncryption", + * "certificate.key_type":"rsa", + * "certificate.key_length":2048, + * "certificate.exponent":"65537", + * "basic_constraints.ca":true, + * "basic_constraints.path_len":0 + * } + * } + */ + @Multiline + public final static String x509BroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testX509BroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(x509BroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(x509BroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1216706999.661483"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1216706999661"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("id").toString(), rawJson.get("id").toString()); + Assert.assertEquals(broJson.get("certificate.version").toString(), rawJson.get("certificate.version").toString()); + Assert.assertEquals(broJson.get("certificate.serial").toString(), rawJson.get("certificate.serial").toString()); + Assert.assertEquals(broJson.get("certificate.subject").toString(), rawJson.get("certificate.subject").toString()); + Assert.assertEquals(broJson.get("certificate.issuer").toString(), rawJson.get("certificate.issuer").toString()); + Assert.assertEquals(broJson.get("certificate.not_valid_before").toString(), rawJson.get("certificate.not_valid_before").toString()); + Assert.assertEquals(broJson.get("certificate.not_valid_after").toString(), rawJson.get("certificate.not_valid_after").toString()); + Assert.assertEquals(broJson.get("certificate.key_alg").toString(), rawJson.get("certificate.key_alg").toString()); + Assert.assertEquals(broJson.get("certificate.sig_alg").toString(), rawJson.get("certificate.sig_alg").toString()); + Assert.assertEquals(broJson.get("certificate.key_type").toString(), rawJson.get("certificate.key_type").toString()); + Assert.assertEquals(broJson.get("certificate.key_length").toString(), rawJson.get("certificate.key_length").toString()); + Assert.assertEquals(broJson.get("certificate.exponent").toString(), rawJson.get("certificate.exponent").toString()); + Assert.assertEquals(broJson.get("basic_constraints.ca").toString(), rawJson.get("basic_constraints.ca").toString()); + Assert.assertEquals(broJson.get("basic_constraints.path_len").toString(), rawJson.get("basic_constraints.path_len").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("X509")); + } + + /** + * { + * "known_devices": { + * "ts":1258532046.693816, + * "mac":"00:0b:db:4f:6b:10", + * "dhcp_host_name":"m57-charlie" + * } + * } + */ + @Multiline + public final static String knownDevicesBroMessage; + + @SuppressWarnings("rawtypes") + @Test + public void testKnownDevicesBroMessage() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(knownDevicesBroMessage); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(knownDevicesBroMessage.getBytes()).get(0); + String expectedBroTimestamp = "1258532046.693816"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1258532046693"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertTrue(broJson.get("original_string").toString().startsWith(rawMessageMap.keySet().iterator().next().toString().toUpperCase())); + + Assert.assertEquals(broJson.get("mac").toString(), rawJson.get("mac").toString()); + Assert.assertEquals(broJson.get("dhcp_host_name").toString(), rawJson.get("dhcp_host_name").toString()); + + Assert.assertTrue(broJson.get("original_string").toString().startsWith("KNOWN_DEVICES")); + } + + /** + * { + * "ht*tp": { + * "ts":1402307733.473, + * "uid":"CTo78A11g7CYbbOHvj", + * "id.orig_h":"192.249.113.37", + * "id.orig_p":58808, + * "id.resp_h":"72.163.4.161", + * "id.resp_p":80, + * "trans_depth":1, + * "method":"GET", + * "host":"www.cisco.com", + * "uri":"/", + * "user_agent":"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3", + * "request_body_len":0, + * "response_body_len":25523, + * "status_code":200, + * "status_msg":"OK", + * "tags":[], + * "resp_fuids":["FJDyMC15lxUn5ngPfd"], + * "resp_mime_types":["text/html"] + * } + * } + */ + @Multiline + public final static String protocolKeyCleanedUp; + + @SuppressWarnings("rawtypes") + @Test + public void testProtocolKeyCleanedUp() throws ParseException { + Map rawMessageMap = (Map) jsonParser.parse(protocolKeyCleanedUp); + JSONObject rawJson = (JSONObject) rawMessageMap.get(rawMessageMap.keySet().iterator().next()); + + JSONObject broJson = broParser.parse(protocolKeyCleanedUp.getBytes()).get(0); + String expectedBroTimestamp = "1402307733.473"; + Assert.assertEquals(broJson.get("bro_timestamp"), expectedBroTimestamp); + String expectedTimestamp = "1402307733473"; + Assert.assertEquals(broJson.get("timestamp").toString(), expectedTimestamp); + Assert.assertEquals(broJson.get("ip_src_addr").toString(), rawJson.get("id.orig_h").toString()); + Assert.assertEquals(broJson.get("ip_dst_addr").toString(), rawJson.get("id.resp_h").toString()); + Assert.assertEquals(broJson.get("ip_src_port").toString(), rawJson.get("id.orig_p").toString()); + Assert.assertEquals(broJson.get("ip_dst_port").toString(), rawJson.get("id.resp_p").toString()); + Assert.assertTrue(broJson.get("original_string").toString().startsWith("HTTP")); + } + + @Test(expected=IllegalStateException.class) + public void testBadMessage() throws ParseException { + broParser.parse("{ \"foo\" : \"bar\"}".getBytes()); + } + + @Test(expected=IllegalStateException.class) + public void testBadMessageNonJson() { + broParser.parse("foo bar".getBytes()); + } +}
http://git-wip-us.apache.org/repos/asf/metron/blob/5f7454e4/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/integration/BroIntegrationTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/integration/BroIntegrationTest.java b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/integration/BroIntegrationTest.java new file mode 100644 index 0000000..3cb44bd --- /dev/null +++ b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/java/org/apache/metron/parsers/integration/BroIntegrationTest.java @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.metron.parsers.integration; + +import org.apache.metron.parsers.integration.validation.PathedSampleDataValidation; +import org.apache.metron.parsers.integration.validation.SampleDataValidation; + +import java.util.ArrayList; +import java.util.List; + +public class BroIntegrationTest extends ParserIntegrationTest { + @Override + public String getSensorType() { + return "bro"; + } + + @Override + public List<ParserValidation> getValidations() { + return new ArrayList<ParserValidation>() {{ + add(new PathedSampleDataValidation("src/test/resources/data/parsed/test.parsed")); + }}; + } + + @Override + + protected String getGlobalConfigPath() throws Exception{ + return "../../../../metron-integration-test/src/main/config/zookeeper/"; + } + @Override + protected String getSampleDataPath() throws Exception { + return "src/test/resources/data/raw/test.raw"; + } +} http://git-wip-us.apache.org/repos/asf/metron/blob/5f7454e4/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/TestSchemas/BroSchema.json ---------------------------------------------------------------------- diff --git a/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/TestSchemas/BroSchema.json b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/TestSchemas/BroSchema.json new file mode 100644 index 0000000..0105c19 --- /dev/null +++ b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/TestSchemas/BroSchema.json @@ -0,0 +1,28 @@ +{ + "title": "Bro Schema", + "type": "object", + "properties": { + "status_code": { + "type": "integer" + }, + "uid": { + "type": "string" + }, + "protocol": { + "type": "string" + }, + "ip_dst_addr": { + "type": "string" + }, + "host": { + "type": "string" + }, + "request_body_len": { + "type": "integer" + }, + "response_body_len": { + "type": "integer" + } + }, + "required": ["status_code", "uid", "protocol","ip_dst_addr","host","request_body_len","response_body_len"] +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/metron/blob/5f7454e4/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/config/BroParserTest.config ---------------------------------------------------------------------- diff --git a/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/config/BroParserTest.config b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/config/BroParserTest.config new file mode 100644 index 0000000..0dcfc71 --- /dev/null +++ b/metron-platform/metron-extensions/metron-parser-extensions/metron-parser-bro-extension/metron-parser-bro/src/test/resources/config/BroParserTest.config @@ -0,0 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +#BroParserTestConfig +logFile=src/test/resources/BroParserTest.log