From 9edbf3e53c849635de62042afc82c0c5d0e128fc Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Fri, 19 Oct 2012 14:02:35 -0500 Subject: [PATCH 1/3] Add GPRS Tunnelling Protocol (GTPv1) decapsulation. This currently supports automatic decapsulation of GTP-U packets on UDP port 2152. The GTPv1 headers for such tunnels can be inspected by handling the "gtpv1_g_pdu_packet" event, which has a parameter of type "gtpv1_hdr". Analyzer and test cases are derived from submissions by Carsten Langer. Addresses #690. --- scripts/base/frameworks/tunnels/main.bro | 5 +- scripts/base/init-bare.bro | 50 ++++++ src/Analyzer.cc | 4 + src/AnalyzerTags.h | 1 + src/CMakeLists.txt | 3 + src/GTPv1.cc | 24 +++ src/GTPv1.h | 29 ++++ src/NetVar.cc | 2 + src/NetVar.h | 1 + src/const.bif | 2 + src/event.bif | 15 +- src/gtpv1-analyzer.pac | 161 ++++++++++++++++++ src/gtpv1-protocol.pac | 27 +++ src/gtpv1.pac | 10 ++ src/types.bif | 1 + .../conn.log | 12 ++ .../http.log | 11 ++ .../tunnel.log | 13 ++ .../core.tunnels.gtp.false_gtp/conn.log | 10 ++ .../core.tunnels.gtp.false_gtp/dns.log | 10 ++ .../core.tunnels.gtp.inner_ipv6/conn.log | 12 ++ .../core.tunnels.gtp.inner_ipv6/tunnel.log | 11 ++ .../core.tunnels.gtp.inner_teredo/conn.log | 26 +++ .../core.tunnels.gtp.inner_teredo/tunnel.log | 27 +++ .../core.tunnels.gtp.non_recursive/out | 1 + .../conn.log | 11 ++ .../core.tunnels.gtp.opt_header/conn.log | 11 ++ .../Baseline/core.tunnels.gtp.opt_header/out | 31 ++++ .../core.tunnels.gtp.opt_header/tunnel.log | 11 ++ .../core.tunnels.gtp.outer_ip_frag/conn.log | 11 ++ .../core.tunnels.gtp.outer_ip_frag/http.log | 10 ++ .../core.tunnels.gtp.outer_ip_frag/tunnel.log | 11 ++ .../dpd.log | 10 ++ .../tunnel.log | 11 ++ .../Traces/tunnels/gtp/gtp10_not_0xff.pcap | Bin 0 -> 258 bytes .../gtp1_gn_normal_incl_fragmentation.pcap | Bin 0 -> 68590 bytes .../tunnels/gtp/gtp2_different_udp_port.pcap | Bin 0 -> 75398 bytes .../Traces/tunnels/gtp/gtp3_false_gtp.pcap | Bin 0 -> 122 bytes .../tunnels/gtp/gtp4_udp_2152_inside.pcap | Bin 0 -> 1020 bytes .../Traces/tunnels/gtp/gtp6_gtp_0x32.pcap | Bin 0 -> 5492 bytes .../btest/Traces/tunnels/gtp/gtp7_ipv6.pcap | Bin 0 -> 292 bytes .../btest/Traces/tunnels/gtp/gtp8_teredo.pcap | Bin 0 -> 1550 bytes .../gtp9_unknown_or_too_short_payload.pcap | Bin 0 -> 13195 bytes .../core/tunnels/gtp/different_dl_and_ul.test | 10 ++ testing/btest/core/tunnels/gtp/false_gtp.test | 8 + .../btest/core/tunnels/gtp/inner_ipv6.test | 6 + .../btest/core/tunnels/gtp/inner_teredo.test | 7 + .../btest/core/tunnels/gtp/non_recursive.test | 11 ++ .../core/tunnels/gtp/not_user_plane_data.test | 9 + .../btest/core/tunnels/gtp/opt_header.test | 12 ++ .../btest/core/tunnels/gtp/outer_ip_frag.test | 11 ++ .../tunnels/gtp/unknown_or_too_short.test | 13 ++ 52 files changed, 670 insertions(+), 2 deletions(-) create mode 100644 src/GTPv1.cc create mode 100644 src/GTPv1.h create mode 100644 src/gtpv1-analyzer.pac create mode 100644 src/gtpv1-protocol.pac create mode 100644 src/gtpv1.pac create mode 100644 testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/http.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/tunnel.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.false_gtp/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.false_gtp/dns.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/tunnel.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.inner_teredo/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.inner_teredo/tunnel.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.non_recursive/out create mode 100644 testing/btest/Baseline/core.tunnels.gtp.not_user_plane_data/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.opt_header/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.opt_header/out create mode 100644 testing/btest/Baseline/core.tunnels.gtp.opt_header/tunnel.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/conn.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/http.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/tunnel.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/dpd.log create mode 100644 testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/tunnel.log create mode 100755 testing/btest/Traces/tunnels/gtp/gtp10_not_0xff.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp2_different_udp_port.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp3_false_gtp.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp4_udp_2152_inside.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp6_gtp_0x32.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp7_ipv6.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp8_teredo.pcap create mode 100755 testing/btest/Traces/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap create mode 100644 testing/btest/core/tunnels/gtp/different_dl_and_ul.test create mode 100644 testing/btest/core/tunnels/gtp/false_gtp.test create mode 100644 testing/btest/core/tunnels/gtp/inner_ipv6.test create mode 100644 testing/btest/core/tunnels/gtp/inner_teredo.test create mode 100644 testing/btest/core/tunnels/gtp/non_recursive.test create mode 100644 testing/btest/core/tunnels/gtp/not_user_plane_data.test create mode 100644 testing/btest/core/tunnels/gtp/opt_header.test create mode 100644 testing/btest/core/tunnels/gtp/outer_ip_frag.test create mode 100644 testing/btest/core/tunnels/gtp/unknown_or_too_short.test diff --git a/scripts/base/frameworks/tunnels/main.bro b/scripts/base/frameworks/tunnels/main.bro index 0861559558..a3db7061d3 100644 --- a/scripts/base/frameworks/tunnels/main.bro +++ b/scripts/base/frameworks/tunnels/main.bro @@ -88,7 +88,10 @@ redef dpd_config += { [ANALYZER_AYIYA] = [$ports = ayiya_ports] }; const teredo_ports = { 3544/udp }; redef dpd_config += { [ANALYZER_TEREDO] = [$ports = teredo_ports] }; -redef likely_server_ports += { ayiya_ports, teredo_ports }; +const gtpv1u_ports = { 2152/udp }; +redef dpd_config += { [ANALYZER_GTPV1] = [$ports = gtpv1u_ports] }; + +redef likely_server_ports += { ayiya_ports, teredo_ports, gtpv1u_ports }; event bro_init() &priority=5 { diff --git a/scripts/base/init-bare.bro b/scripts/base/init-bare.bro index 70026394e9..e8f60dfc64 100644 --- a/scripts/base/init-bare.bro +++ b/scripts/base/init-bare.bro @@ -1450,6 +1450,44 @@ type teredo_hdr: record { hdr: pkt_hdr; ##< IPv6 and transport protocol headers. }; +## A GTPv1 (GPRS Tunneling Protocol) header. +type gtpv1_hdr: record { + ## The 3-bit version field, which for GTPv1 should be 1. + version: count; + ## Protocol Type value differentiates GTP (value 1) from GTP' (value 0). + pt_flag: bool; + ## Reserved field, should be 0. + rsv: bool; + ## Extension Header flag. When 0, the *next_type* field may or may not + ## be present, but shouldn't be meaningful. When 1, *next_type* is + ## present and meaningful. + e_flag: bool; + ## Sequence Number flag. When 0, the *seq* field may or may not + ## be present, but shouldn't be meaningful. When 1, *seq* is + ## present and meaningful. + s_flag: bool; + ## N-PDU flag. When 0, the *n_pdu* field may or may not + ## be present, but shouldn't be meaningful. When 1, *n_pdu* is + ## present and meaningful. + pn_flag: bool; + ## Message Type. A value of 255 indicates user-plane data is encapsulated. + msg_type: count; + ## Length of the GTP packet payload (the rest of the packet following the + ## mandatory 8-byte GTP header). + length: count; + ## Tunnel Endpoint Identifier. Unambiguously identifies a tunnel endpoint + ## in receiving GTP-U or GTP-C protocol entity. + teid: count; + ## Sequence Number. Set if any *e_flag*, *s_flag*, or *pn_flag* field is + ## set. + seq: count &optional; + ## N-PDU Number. Set if any *e_flag*, *s_flag*, or *pn_flag* field is set. + n_pdu: count &optional; + ## Next Extension Header Type. Set if any *e_flag*, *s_flag*, or *pn_flag* + ## field is set. + next_type: count &optional; +}; + ## Definition of "secondary filters". A secondary filter is a BPF filter given as ## index in this table. For each such filter, the corresponding event is raised for ## all matching packets. @@ -2776,6 +2814,9 @@ export { ## Toggle whether to do IPv6-in-Teredo decapsulation. const enable_teredo = T &redef; + ## Toggle whether to do GTPv1 decapsulation. + const enable_gtpv1 = T &redef; + ## With this option set, the Teredo analysis will first check to see if ## other protocol analyzers have confirmed that they think they're ## parsing the right protocol and only continue with Teredo tunnel @@ -2792,6 +2833,15 @@ export { ## :bro:see:`Tunnel::yielding_teredo_decapsulation`. const delay_teredo_confirmation = T &redef; + ## With this set, the GTP analyzer waits until the most-recent upflow + ## and downflow packets are a valid GTPv1 encapsulation before + ## issuing :bro:see:`protocol_confirmation`. If it's false, the + ## first occurence of a packet with valid GTPv1 encapsulation causes + ## confirmation. Since the same inner connection can be carried + ## differing outer upflow/downflow connections, setting to false + ## may work better. + const delay_gtp_confirmation = F &redef; + ## How often to cleanup internal state for inactive IP tunnels. const ip_tunnel_timeout = 24hrs &redef; } # end export diff --git a/src/Analyzer.cc b/src/Analyzer.cc index 8c5573f96b..570b877881 100644 --- a/src/Analyzer.cc +++ b/src/Analyzer.cc @@ -40,6 +40,7 @@ #include "Syslog-binpac.h" #include "Teredo.h" #include "ConnSizeAnalyzer.h" +#include "GTPv1.h" // Keep same order here as in AnalyzerTag definition! const Analyzer::Config Analyzer::analyzer_configs[] = { @@ -139,6 +140,9 @@ const Analyzer::Config Analyzer::analyzer_configs[] = { { AnalyzerTag::Teredo, "TEREDO", Teredo_Analyzer::InstantiateAnalyzer, Teredo_Analyzer::Available, 0, false }, + { AnalyzerTag::GTPv1, "GTPV1", + GTPv1_Analyzer::InstantiateAnalyzer, + GTPv1_Analyzer::Available, 0, false }, { AnalyzerTag::File, "FILE", File_Analyzer::InstantiateAnalyzer, File_Analyzer::Available, 0, false }, diff --git a/src/AnalyzerTags.h b/src/AnalyzerTags.h index 4301de8f71..21f50f3b52 100644 --- a/src/AnalyzerTags.h +++ b/src/AnalyzerTags.h @@ -37,6 +37,7 @@ namespace AnalyzerTag { AYIYA, SOCKS, Teredo, + GTPv1, // Other File, Backdoor, InterConn, SteppingStone, TCPStats, diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b77863d107..fa30d9ff55 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -203,6 +203,8 @@ binpac_target(dns.pac dns-protocol.pac dns-analyzer.pac) binpac_target(dns_tcp.pac dns.pac) +binpac_target(gtpv1.pac + gtpv1-protocol.pac gtpv1-analyzer.pac) binpac_target(http.pac http-protocol.pac http-analyzer.pac) binpac_target(ncp.pac) @@ -330,6 +332,7 @@ set(bro_SRCS Frame.cc Func.cc Gnutella.cc + GTPv1.cc HTTP.cc HTTP-binpac.cc Hash.cc diff --git a/src/GTPv1.cc b/src/GTPv1.cc new file mode 100644 index 0000000000..b7a0fdc664 --- /dev/null +++ b/src/GTPv1.cc @@ -0,0 +1,24 @@ +#include "GTPv1.h" + +GTPv1_Analyzer::GTPv1_Analyzer(Connection* conn) +: Analyzer(AnalyzerTag::GTPv1, conn) + { + interp = new binpac::GTPv1::GTPv1_Conn(this); + } + +GTPv1_Analyzer::~GTPv1_Analyzer() + { + delete interp; + } + +void GTPv1_Analyzer::Done() + { + Analyzer::Done(); + Event(udp_session_done); + } + +void GTPv1_Analyzer::DeliverPacket(int len, const u_char* data, bool orig, int seq, const IP_Hdr* ip, int caplen) + { + Analyzer::DeliverPacket(len, data, orig, seq, ip, caplen); + interp->NewData(orig, data, data + len); + } diff --git a/src/GTPv1.h b/src/GTPv1.h new file mode 100644 index 0000000000..e111158833 --- /dev/null +++ b/src/GTPv1.h @@ -0,0 +1,29 @@ +#ifndef GTPv1_h +#define GTPv1_h + +#include "gtpv1_pac.h" + +class GTPv1_Analyzer : public Analyzer { +public: + GTPv1_Analyzer(Connection* conn); + virtual ~GTPv1_Analyzer(); + + virtual void Done(); + virtual void DeliverPacket(int len, const u_char* data, bool orig, + int seq, const IP_Hdr* ip, int caplen); + + static Analyzer* InstantiateAnalyzer(Connection* conn) + { return new GTPv1_Analyzer(conn); } + + static bool Available() + { return BifConst::Tunnel::enable_gtpv1 && + BifConst::Tunnel::max_depth > 0; } + +protected: + friend class AnalyzerTimer; + void ExpireTimer(double t); + + binpac::GTPv1::GTPv1_Conn* interp; +}; + +#endif diff --git a/src/NetVar.cc b/src/NetVar.cc index 248ae15e1a..1783130f34 100644 --- a/src/NetVar.cc +++ b/src/NetVar.cc @@ -5,6 +5,7 @@ #include "Var.h" #include "NetVar.h" +RecordType* gtpv1_hdr_type; RecordType* conn_id; RecordType* endpoint; RecordType* endpoint_stats; @@ -308,6 +309,7 @@ void init_net_var() #include "input.bif.netvar_init" #include "reporter.bif.netvar_init" + gtpv1_hdr_type = internal_type("gtpv1_hdr")->AsRecordType(); conn_id = internal_type("conn_id")->AsRecordType(); endpoint = internal_type("endpoint")->AsRecordType(); endpoint_stats = internal_type("endpoint_stats")->AsRecordType(); diff --git a/src/NetVar.h b/src/NetVar.h index 2561fa0ad9..4bb2d2a7f9 100644 --- a/src/NetVar.h +++ b/src/NetVar.h @@ -8,6 +8,7 @@ #include "EventRegistry.h" #include "Stats.h" +extern RecordType* gtpv1_hdr_type; extern RecordType* conn_id; extern RecordType* endpoint; extern RecordType* endpoint_stats; diff --git a/src/const.bif b/src/const.bif index 7373403c11..ea7dc03817 100644 --- a/src/const.bif +++ b/src/const.bif @@ -15,8 +15,10 @@ const Tunnel::max_depth: count; const Tunnel::enable_ip: bool; const Tunnel::enable_ayiya: bool; const Tunnel::enable_teredo: bool; +const Tunnel::enable_gtpv1: bool; const Tunnel::yielding_teredo_decapsulation: bool; const Tunnel::delay_teredo_confirmation: bool; +const Tunnel::delay_gtp_confirmation: bool; const Tunnel::ip_tunnel_timeout: interval; const Threading::heartbeat_interval: interval; diff --git a/src/event.bif b/src/event.bif index 0c79c6159d..03df6a9071 100644 --- a/src/event.bif +++ b/src/event.bif @@ -577,6 +577,19 @@ event teredo_origin_indication%(outer: connection, inner: teredo_hdr%); ## it may become particularly expensive for real-time analysis. event teredo_bubble%(outer: connection, inner: teredo_hdr%); +## Generated for GTPv1 G-PDU packets. That is, packets with a UDP payload +## that includes a GTP header followed by an IPv4 or IPv6 packet. +## +## outer: The GTP outer tunnel connection. +## +## inner_gtp: The GTP header. +## +## inner_ip: The inner IP and transport layer packet headers. +## +## .. note:: Since this event may be raised on a per-packet basis, handling +## it may become particularly expensive for real-time analysis. +event gtpv1_g_pdu_packet%(outer: connection, inner_gtp: gtpv1_hdr, inner_ip: pkt_hdr%); + ## Generated for every packet that has a non-empty transport-layer payload. ## This is a very low-level and expensive event that should be avoided when ## at all possible. It's usually infeasible to handle when processing even @@ -858,7 +871,7 @@ event udp_contents%(u: connection, is_orig: bool, contents: string%); ## Generated when a UDP session for a supported protocol has finished. Some of ## Bro's application-layer UDP analyzers flag the end of a session by raising ## this event. Currently, the analyzers for DNS, NTP, Netbios, Syslog, AYIYA, -## and Teredo support this. +## Teredo, and GTPv1 support this. ## ## u: The connection record for the corresponding UDP flow. ## diff --git a/src/gtpv1-analyzer.pac b/src/gtpv1-analyzer.pac new file mode 100644 index 0000000000..08fbdef74a --- /dev/null +++ b/src/gtpv1-analyzer.pac @@ -0,0 +1,161 @@ + +connection GTPv1_Conn(bro_analyzer: BroAnalyzer) + { + upflow = GTPv1_Flow(true); + downflow = GTPv1_Flow(false); + + %member{ + bool valid_orig; + bool valid_resp; + %} + + %init{ + valid_orig = valid_resp = false; + %} + + function valid(orig: bool): bool + %{ + return orig ? valid_orig : valid_resp; + %} + + function set_valid(orig: bool, val: bool): void + %{ + if ( orig ) + valid_orig = val; + else + valid_resp = val; + %} + } + +%code{ +inline void violate(const char* r, const BroAnalyzer& a, const bytestring& p) + { + a->ProtocolViolation(r, (const char*) p.data(), p.length()); + } +%} + +flow GTPv1_Flow(is_orig: bool) + { + datagram = GTPv1_Header withcontext(connection, this); + + function process_gtpv1(pdu: GTPv1_Header): bool + %{ + BroAnalyzer a = connection()->bro_analyzer(); + Connection *c = a->Conn(); + const EncapsulationStack* e = c->GetEncapsulation(); + + connection()->set_valid(is_orig(), false); + + if ( e && e->Depth() >= BifConst::Tunnel::max_depth ) + { + reporter->Weird(c, "tunnel_depth"); + return false; + } + + if ( e && e->LastType() == BifEnum::Tunnel::GTPv1 ) + { + // GTP is never tunneled in GTP so, this must be a regular packet + violate("GTP-in-GTP", a, ${pdu.packet}); + return false; + } + + if ( ${pdu.version} != 1 ) + { + // Only know of GTPv1 with Version == 1 + violate("GTPv1 bad Version", a, ${pdu.packet}); + return false; + } + + if ( ! ${pdu.pt_flag} ) + { + // Not interested in GTP' + return false; + } + + if ( ${pdu.e_flag} ) + { + // TODO: can't currently parse past extension headers + return false; + } + + if ( ${pdu.msg_type} != 0xff ) + { + // Only interested in decapsulating user plane data beyond here. + return false; + } + + if ( ${pdu.packet}.length() < (int)sizeof(struct ip) ) + { + violate("Truncated GTPv1", a, ${pdu.packet}); + return false; + } + + const struct ip* ip = (const struct ip*) ${pdu.packet}.data(); + + if ( ip->ip_v != 4 && ip->ip_v != 6 ) + { + violate("non-IP packet in GTPv1", a, ${pdu.packet}); + return false; + } + + IP_Hdr* inner = 0; + int result = sessions->ParseIPPacket(${pdu.packet}.length(), + ${pdu.packet}.data(), ip->ip_v == 6 ? IPPROTO_IPV6 : IPPROTO_IPV4, + inner); + + if ( result == 0 ) + { + connection()->set_valid(is_orig(), true); + + if ( (! BifConst::Tunnel::delay_gtp_confirmation) || + (connection()->valid(true) && connection()->valid(false)) ) + a->ProtocolConfirmation(); + } + + else if ( result < 0 ) + violate("Truncated GTPv1", a, ${pdu.packet}); + + else + violate("GTPv1 payload length", a, ${pdu.packet}); + + if ( result != 0 ) + { + delete inner; + return false; + } + + if ( ::gtpv1_g_pdu_packet ) + { + RecordVal* rv = new RecordVal(gtpv1_hdr_type); + + rv->Assign(0, new Val(${pdu.version}, TYPE_COUNT)); + rv->Assign(1, new Val(${pdu.pt_flag}, TYPE_BOOL)); + rv->Assign(2, new Val(${pdu.rsv}, TYPE_BOOL)); + rv->Assign(3, new Val(${pdu.e_flag}, TYPE_BOOL)); + rv->Assign(4, new Val(${pdu.s_flag}, TYPE_BOOL)); + rv->Assign(5, new Val(${pdu.pn_flag}, TYPE_BOOL)); + rv->Assign(6, new Val(${pdu.msg_type}, TYPE_COUNT)); + rv->Assign(7, new Val(ntohs(${pdu.length}), TYPE_COUNT)); + rv->Assign(8, new Val(ntohl(${pdu.teid}), TYPE_COUNT)); + + if ( ${pdu.has_opt} ) + { + rv->Assign(9, new Val(ntohs(${pdu.opt_hdr.seq}), TYPE_COUNT)); + rv->Assign(10, new Val(${pdu.opt_hdr.n_pdu}, TYPE_COUNT)); + rv->Assign(11, new Val(${pdu.opt_hdr.next_type}, TYPE_COUNT)); + } + + BifEvent::generate_gtpv1_g_pdu_packet(a, c, rv, + inner->BuildPktHdrVal()); + } + + EncapsulatingConn ec(c, BifEnum::Tunnel::GTPv1); + + sessions->DoNextInnerPacket(network_time(), 0, inner, e, ec); + + return (result == 0) ? true : false; + %} + + }; + +refine typeattr GTPv1_Header += &let { proc_gtpv1 = $context.flow.process_gtpv1(this); }; diff --git a/src/gtpv1-protocol.pac b/src/gtpv1-protocol.pac new file mode 100644 index 0000000000..5bf31a48ee --- /dev/null +++ b/src/gtpv1-protocol.pac @@ -0,0 +1,27 @@ + +type GTPv1_Header = record { + flags: uint8; + msg_type: uint8; + length: uint16; + teid: uint32; + opt: case has_opt of { + true -> opt_hdr: GTPv1_Opt_Header; + false -> no_opt: empty; + } &requires(has_opt); + packet: bytestring &restofdata; + +} &let { + version: uint8 = (flags & 0xE0) >> 5; + pt_flag: bool = flags & 0x10; + rsv: bool = flags & 0x08; + e_flag: bool = flags & 0x04; + s_flag: bool = flags & 0x02; + pn_flag: bool = flags & 0x01; + has_opt: bool = flags & 0x07; +} &byteorder = littleendian; + +type GTPv1_Opt_Header = record { + seq: uint16; + n_pdu: uint8; + next_type: uint8; +} diff --git a/src/gtpv1.pac b/src/gtpv1.pac new file mode 100644 index 0000000000..d155ecfd67 --- /dev/null +++ b/src/gtpv1.pac @@ -0,0 +1,10 @@ +%include binpac.pac +%include bro.pac + +analyzer GTPv1 withcontext { + connection: GTPv1_Conn; + flow: GTPv1_Flow; +}; + +%include gtpv1-protocol.pac +%include gtpv1-analyzer.pac diff --git a/src/types.bif b/src/types.bif index 92cc8db551..b25f75c29a 100644 --- a/src/types.bif +++ b/src/types.bif @@ -177,6 +177,7 @@ enum Type %{ AYIYA, TEREDO, SOCKS, + GTPv1, %} type EncapsulatingConn: record; diff --git a/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/conn.log b/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/conn.log new file mode 100644 index 0000000000..e2861b4ae1 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/conn.log @@ -0,0 +1,12 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-17-03-55 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458850.321642 arKYeMETxOg 10.131.17.170 51803 173.199.115.168 80 tcp http 0.257902 1138 63424 S3 - 0 ShADadf 29 2310 49 65396 UWkUyAuUGXf,k6kgXLOoSKl +1333458850.325787 k6kgXLOoSKl 207.233.125.40 2152 167.55.105.244 2152 udp gtpv1 0.251127 65788 0 S0 - 0 D 49 67160 0 0 (empty) +1333458850.321642 UWkUyAuUGXf 167.55.105.244 5906 207.233.125.40 2152 udp gtpv1 0.257902 2542 0 S0 - 0 D 29 3354 0 0 (empty) +#close 2012-10-19-17-03-55 diff --git a/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/http.log b/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/http.log new file mode 100644 index 0000000000..66b17e1200 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/http.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path http +#open 2012-10-19-17-03-55 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth method host uri referrer user_agent request_body_len response_body_len status_code status_msg info_code info_msg filename tags username password proxied mime_type md5 extraction_file +#types time string addr port addr port count string string string string string count count count string count string string table[enum] string string table[string] string string file +1333458850.340368 arKYeMETxOg 10.131.17.170 51803 173.199.115.168 80 1 GET cdn.epicgameads.com /ads/flash/728x90_nx8com.swf?clickTAG=http://www.epicgameads.com/ads/bannerclickPage.php?id=e3ubwU6IF&pd=1&adid=0&icpc=1&axid=0&uctt=1&channel=4&cac=1&t=728x90&cb=1333458879 http://www.epicgameads.com/ads/banneriframe.php?id=e3ubwU6IF&t=728x90&channel=4&cb=1333458905296 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 0 31461 200 OK - - - (empty) - - - application/x-shockwave-flash - - +1333458850.399501 arKYeMETxOg 10.131.17.170 51803 173.199.115.168 80 2 GET cdn.epicgameads.com /ads/flash/728x90_nx8com.swf?clickTAG=http://www.epicgameads.com/ads/bannerclickPage.php?id=e3ubwU6IF&pd=1&adid=0&icpc=1&axid=0&uctt=1&channel=0&cac=1&t=728x90&cb=1333458881 http://www.epicgameads.com/ads/banneriframe.php?id=e3ubwU6IF&t=728x90&cb=1333458920207 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) 0 31461 200 OK - - - (empty) - - - application/x-shockwave-flash - - +#close 2012-10-19-17-03-55 diff --git a/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/tunnel.log b/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/tunnel.log new file mode 100644 index 0000000000..233ad1c850 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.different_dl_and_ul/tunnel.log @@ -0,0 +1,13 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2012-10-19-17-03-55 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1333458850.321642 UWkUyAuUGXf 167.55.105.244 5906 207.233.125.40 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.325787 k6kgXLOoSKl 207.233.125.40 2152 167.55.105.244 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.579544 k6kgXLOoSKl 207.233.125.40 2152 167.55.105.244 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.579544 UWkUyAuUGXf 167.55.105.244 5906 207.233.125.40 2152 Tunnel::GTPv1 Tunnel::CLOSE +#close 2012-10-19-17-03-55 diff --git a/testing/btest/Baseline/core.tunnels.gtp.false_gtp/conn.log b/testing/btest/Baseline/core.tunnels.gtp.false_gtp/conn.log new file mode 100644 index 0000000000..1234558195 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.false_gtp/conn.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-17-07-44 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458871.219794 UWkUyAuUGXf 10.131.24.6 2152 195.178.38.3 53 udp dns - - - S0 - 0 D 1 64 0 0 (empty) +#close 2012-10-19-17-07-44 diff --git a/testing/btest/Baseline/core.tunnels.gtp.false_gtp/dns.log b/testing/btest/Baseline/core.tunnels.gtp.false_gtp/dns.log new file mode 100644 index 0000000000..a293d6ff6a --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.false_gtp/dns.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path dns +#open 2012-10-19-17-07-44 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto trans_id query qclass qclass_name qtype qtype_name rcode rcode_name AA TC RD RA Z answers TTLs rejected +#types time string addr port addr port enum count string count string count string count string bool bool bool bool count vector[string] vector[interval] bool +1333458871.219794 UWkUyAuUGXf 10.131.24.6 2152 195.178.38.3 53 udp 27595 abcd.efg.hijklm.nm 1 C_INTERNET 1 A - - F F T F 0 - - F +#close 2012-10-19-17-07-44 diff --git a/testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/conn.log b/testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/conn.log new file mode 100644 index 0000000000..326205172a --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/conn.log @@ -0,0 +1,12 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-17-21-27 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458851.770000 arKYeMETxOg fe80::224c:4fff:fe43:414c 1234 ff02::1:3 5355 udp dns - - - S0 - 0 D 1 80 0 0 UWkUyAuUGXf +1333458851.770000 UWkUyAuUGXf 118.92.124.41 2152 118.92.124.72 2152 udp gtpv1 0.199236 152 0 S0 - 0 D 2 208 0 0 (empty) +1333458851.969236 k6kgXLOoSKl fe80::224c:4fff:fe43:414c 133 ff02::2 134 icmp - - - - OTH - 0 - 1 56 0 0 UWkUyAuUGXf +#close 2012-10-19-17-21-27 diff --git a/testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/tunnel.log b/testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/tunnel.log new file mode 100644 index 0000000000..dfae2ba269 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.inner_ipv6/tunnel.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2012-10-19-17-21-27 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1333458851.770000 UWkUyAuUGXf 118.92.124.41 2152 118.92.124.72 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458851.969236 UWkUyAuUGXf 118.92.124.41 2152 118.92.124.72 2152 Tunnel::GTPv1 Tunnel::CLOSE +#close 2012-10-19-17-21-27 diff --git a/testing/btest/Baseline/core.tunnels.gtp.inner_teredo/conn.log b/testing/btest/Baseline/core.tunnels.gtp.inner_teredo/conn.log new file mode 100644 index 0000000000..9c3e1f6f66 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.inner_teredo/conn.log @@ -0,0 +1,26 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-17-34-25 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458850.037956 qCaWGmzFtM5 10.131.112.102 51403 94.245.121.253 3544 udp teredo - - - SHR - 0 d 0 0 1 84 GSxOnSLghOa +1333458850.040098 70MGiRM1Qf4 174.94.190.229 2152 190.104.181.57 2152 udp gtpv1 0.003698 192 0 S0 - 0 D 2 248 0 0 (empty) +1333458850.016620 nQcgTWjvg4c 172.24.16.121 61901 94.245.121.251 3544 udp teredo - - - S0 - 0 D 1 80 0 0 k6kgXLOoSKl +1333458850.029781 FrJExwHcSal 172.24.16.67 52298 94.245.121.253 3544 udp teredo - - - S0 - 0 D 1 88 0 0 TEfuqmmG4bh +1333458850.035456 VW0XPVINV8a 190.104.181.210 2152 190.104.181.125 2152 udp gtpv1 0.000004 194 0 S0 - 0 D 2 250 0 0 (empty) +1333458850.016620 k6kgXLOoSKl 174.94.190.229 2152 190.104.181.62 2152 udp gtpv1 0.016267 88 92 SF - 0 Dd 1 116 1 120 (empty) +1333458850.029781 TEfuqmmG4bh 190.104.181.254 2152 190.104.181.62 2152 udp gtpv1 0.000002 192 0 S0 - 0 D 2 248 0 0 (empty) +1333458850.035460 iE6yhOq3SF 172.27.159.9 63912 94.245.121.254 3544 udp teredo - - - S0 - 0 D 1 89 0 0 VW0XPVINV8a +1333458850.037956 GSxOnSLghOa 190.104.181.57 2152 190.104.181.222 2152 udp gtpv1 - - - S0 - 0 D 1 120 0 0 (empty) +1333458850.014199 UWkUyAuUGXf 174.94.190.213 2152 190.104.181.57 2152 udp gtpv1 - - - S0 - 0 D 1 124 0 0 (empty) +1333458850.040098 h5DsfNtYzi1 172.24.203.81 54447 65.55.158.118 3544 udp teredo 0.003698 120 0 S0 - 0 D 2 176 0 0 70MGiRM1Qf4 +1333458850.029783 5OKnoww6xl4 172.24.16.67 52298 65.55.158.118 3544 udp teredo - - - S0 - 0 D 1 88 0 0 TEfuqmmG4bh +1333458850.032887 3PKsZ2Uye21 10.131.42.160 62069 94.245.121.253 3544 udp teredo - - - SHR - 0 d 0 0 1 84 k6kgXLOoSKl +1333458850.014199 arKYeMETxOg 172.24.204.200 56528 65.55.158.118 3544 udp teredo - - - S0 - 0 D 1 88 0 0 UWkUyAuUGXf +1333458850.035456 fRFu0wcOle6 172.27.159.9 63912 94.245.121.253 3544 udp teredo - - - S0 - 0 D 1 89 0 0 VW0XPVINV8a +1333458850.016620 j4u32Pc5bif 2001:0:5ef5:79fb:38b8:1695:2b37:be8e 128 2002:2571:c817::2571:c817 129 icmp - - - - OTH - 0 - 1 52 0 0 nQcgTWjvg4c +1333458850.035456 qSsw6ESzHV4 fe80::ffff:ffff:fffe 133 ff02::2 134 icmp - 0.000004 0 0 OTH - 0 - 2 96 0 0 fRFu0wcOle6,iE6yhOq3SF +#close 2012-10-19-17-34-25 diff --git a/testing/btest/Baseline/core.tunnels.gtp.inner_teredo/tunnel.log b/testing/btest/Baseline/core.tunnels.gtp.inner_teredo/tunnel.log new file mode 100644 index 0000000000..904fcc7db6 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.inner_teredo/tunnel.log @@ -0,0 +1,27 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2012-10-19-17-34-25 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1333458850.014199 UWkUyAuUGXf 174.94.190.213 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.016620 k6kgXLOoSKl 174.94.190.229 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.016620 nQcgTWjvg4c 172.24.16.121 61901 94.245.121.251 3544 Tunnel::TEREDO Tunnel::DISCOVER +1333458850.029781 TEfuqmmG4bh 190.104.181.254 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.035456 VW0XPVINV8a 190.104.181.210 2152 190.104.181.125 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.035456 fRFu0wcOle6 172.27.159.9 63912 94.245.121.253 3544 Tunnel::TEREDO Tunnel::DISCOVER +1333458850.035460 iE6yhOq3SF 172.27.159.9 63912 94.245.121.254 3544 Tunnel::TEREDO Tunnel::DISCOVER +1333458850.037956 GSxOnSLghOa 190.104.181.57 2152 190.104.181.222 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.040098 70MGiRM1Qf4 174.94.190.229 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.043796 70MGiRM1Qf4 174.94.190.229 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.043796 nQcgTWjvg4c 172.24.16.121 61901 94.245.121.251 3544 Tunnel::TEREDO Tunnel::CLOSE +1333458850.043796 VW0XPVINV8a 190.104.181.210 2152 190.104.181.125 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.043796 k6kgXLOoSKl 174.94.190.229 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.043796 TEfuqmmG4bh 190.104.181.254 2152 190.104.181.62 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.043796 iE6yhOq3SF 172.27.159.9 63912 94.245.121.254 3544 Tunnel::TEREDO Tunnel::CLOSE +1333458850.043796 GSxOnSLghOa 190.104.181.57 2152 190.104.181.222 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.043796 UWkUyAuUGXf 174.94.190.213 2152 190.104.181.57 2152 Tunnel::GTPv1 Tunnel::CLOSE +1333458850.043796 fRFu0wcOle6 172.27.159.9 63912 94.245.121.253 3544 Tunnel::TEREDO Tunnel::CLOSE +#close 2012-10-19-17-34-25 diff --git a/testing/btest/Baseline/core.tunnels.gtp.non_recursive/out b/testing/btest/Baseline/core.tunnels.gtp.non_recursive/out new file mode 100644 index 0000000000..a299c4d592 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.non_recursive/out @@ -0,0 +1 @@ +protocol_violation, [orig_h=74.125.216.149, orig_p=2152/udp, resp_h=10.131.138.69, resp_p=2152/udp], GTP-in-GTP [n\xd9'|\x00\x00\x01\xb6[\xf6\xdc0\xb7d\xe5\xe6\xa76\x91\xfbk\x0e\x02\xc8A\x05\xa8\xe6\xf3Gi\x80(]\xcew\x84\xae}\xd2...] diff --git a/testing/btest/Baseline/core.tunnels.gtp.not_user_plane_data/conn.log b/testing/btest/Baseline/core.tunnels.gtp.not_user_plane_data/conn.log new file mode 100644 index 0000000000..ad6e4fb2c4 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.not_user_plane_data/conn.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-17-46-48 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458850.532814 UWkUyAuUGXf 247.56.43.90 2152 247.56.43.248 2152 udp - - - - S0 - 0 D 1 52 0 0 (empty) +1333458850.867091 arKYeMETxOg 247.56.43.214 2152 237.56.101.238 2152 udp - 0.028676 12 14 SF - 0 Dd 1 40 1 42 (empty) +#close 2012-10-19-17-46-48 diff --git a/testing/btest/Baseline/core.tunnels.gtp.opt_header/conn.log b/testing/btest/Baseline/core.tunnels.gtp.opt_header/conn.log new file mode 100644 index 0000000000..9f250903f2 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.opt_header/conn.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-17-19-16 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458852.011535 arKYeMETxOg 10.222.10.10 44960 173.194.69.188 5228 tcp ssl 0.573499 704 1026 S1 - 0 ShADad 17 1604 14 1762 UWkUyAuUGXf +1333458852.011535 UWkUyAuUGXf 79.188.154.91 2152 243.149.173.198 2152 udp gtpv1 0.573499 1740 1930 SF - 0 Dd 17 2216 14 2322 (empty) +#close 2012-10-19-17-19-16 diff --git a/testing/btest/Baseline/core.tunnels.gtp.opt_header/out b/testing/btest/Baseline/core.tunnels.gtp.opt_header/out new file mode 100644 index 0000000000..7feeb2a110 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.opt_header/out @@ -0,0 +1,31 @@ +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=60, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=60, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=64, teid=159098, seq=0, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=170, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=1, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=194, teid=159098, seq=2, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=111, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=3, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=89, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=4, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=93, teid=159098, seq=5, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=457, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=157, teid=159098, seq=6, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=173, teid=159098, seq=7, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=137, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=56, teid=159098, seq=8, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=157, teid=159098, seq=9, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=189, teid=159098, seq=10, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=173, teid=159098, seq=11, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=205, teid=159098, seq=12, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=T, pn_flag=F, msg_type=255, length=189, teid=159098, seq=13, n_pdu=0, next_type=0] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] +gtpv1_packet, [version=1, pt_flag=T, rsv=F, e_flag=F, s_flag=F, pn_flag=F, msg_type=255, length=52, teid=1980578736, seq=, n_pdu=, next_type=] diff --git a/testing/btest/Baseline/core.tunnels.gtp.opt_header/tunnel.log b/testing/btest/Baseline/core.tunnels.gtp.opt_header/tunnel.log new file mode 100644 index 0000000000..a421f399ec --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.opt_header/tunnel.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2012-10-19-17-19-16 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1333458852.011535 UWkUyAuUGXf 79.188.154.91 2152 243.149.173.198 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458852.585034 UWkUyAuUGXf 79.188.154.91 2152 243.149.173.198 2152 Tunnel::GTPv1 Tunnel::CLOSE +#close 2012-10-19-17-19-16 diff --git a/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/conn.log b/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/conn.log new file mode 100644 index 0000000000..b5f61564cf --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/conn.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path conn +#open 2012-10-19-16-44-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto service duration orig_bytes resp_bytes conn_state local_orig missed_bytes history orig_pkts orig_ip_bytes resp_pkts resp_ip_bytes tunnel_parents +#types time string addr port addr port enum string interval count count string bool count string count count count count table[string] +1333458850.364667 arKYeMETxOg 10.131.47.185 1923 79.101.110.141 80 tcp http 0.069783 2100 56702 SF - 0 ShADadfF 27 3204 41 52594 UWkUyAuUGXf +1333458850.364667 UWkUyAuUGXf 239.114.155.111 2152 63.94.149.181 2152 udp gtpv1 0.069813 3420 52922 SF - 0 Dd 27 4176 41 54070 (empty) +#close 2012-10-19-16-44-02 diff --git a/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/http.log b/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/http.log new file mode 100644 index 0000000000..8a994d56af --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/http.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path http +#open 2012-10-19-16-44-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p trans_depth method host uri referrer user_agent request_body_len response_body_len status_code status_msg info_code info_msg filename tags username password proxied mime_type md5 extraction_file +#types time string addr port addr port count string string string string string count count count string count string string table[enum] string string table[string] string string file +1333458850.375568 arKYeMETxOg 10.131.47.185 1923 79.101.110.141 80 1 GET o-o.preferred.telekomrs-beg1.v2.lscache8.c.youtube.com /videoplayback?upn=MTU2MDY5NzQ5OTM0NTI3NDY4NDc&sparams=algorithm,burst,cp,factor,id,ip,ipbits,itag,source,upn,expire&fexp=912300,907210&algorithm=throttle-factor&itag=34&ip=212.0.0.0&burst=40&sver=3&signature=832FB1042E20780CFCA77A4DB5EA64AC593E8627.D1166C7E8365732E52DAFD68076DAE0146E0AE01&source=youtube&expire=1333484980&key=yt1&ipbits=8&factor=1.25&cp=U0hSSFRTUl9NSkNOMl9MTVZKOjh5eEN2SG8tZF84&id=ebf1e932d4bd1286&cm2=1 http://s.ytimg.com/yt/swfbin/watch_as3-vflqrJwOA.swf Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko; X-SBLSP) Chrome/17.0.963.83 Safari/535.11 0 56320 206 Partial Content - - - (empty) - - - application/octet-stream - - +#close 2012-10-19-16-44-02 diff --git a/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/tunnel.log b/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/tunnel.log new file mode 100644 index 0000000000..54c4acd0d6 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.outer_ip_frag/tunnel.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2012-10-19-16-44-02 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1333458850.364667 UWkUyAuUGXf 239.114.155.111 2152 63.94.149.181 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458850.434480 UWkUyAuUGXf 239.114.155.111 2152 63.94.149.181 2152 Tunnel::GTPv1 Tunnel::CLOSE +#close 2012-10-19-16-44-02 diff --git a/testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/dpd.log b/testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/dpd.log new file mode 100644 index 0000000000..221fa16f4f --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/dpd.log @@ -0,0 +1,10 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path dpd +#open 2012-10-19-17-38-54 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p proto analyzer failure_reason +#types time string addr port addr port enum string string +1333458853.075889 UWkUyAuUGXf 173.86.159.28 2152 213.72.147.186 2152 udp GTPV1 Truncated GTPv1 [E\x00\x05\xc8G\xea@\x00\x80\x06\xb6\x83\x0a\x83w&\xd9\x14\x9c\x04\xd9\xc2\x00P\xddh\xb4\x8f41eVP\x10\x10\xe0u\xcf\x00\x00...] +#close 2012-10-19-17-38-54 diff --git a/testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/tunnel.log b/testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/tunnel.log new file mode 100644 index 0000000000..659090a581 --- /dev/null +++ b/testing/btest/Baseline/core.tunnels.gtp.unknown_or_too_short/tunnel.log @@ -0,0 +1,11 @@ +#separator \x09 +#set_separator , +#empty_field (empty) +#unset_field - +#path tunnel +#open 2012-10-19-17-38-54 +#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p tunnel_type action +#types time string addr port addr port enum enum +1333458853.034734 UWkUyAuUGXf 173.86.159.28 2152 213.72.147.186 2152 Tunnel::GTPv1 Tunnel::DISCOVER +1333458853.108391 UWkUyAuUGXf 173.86.159.28 2152 213.72.147.186 2152 Tunnel::GTPv1 Tunnel::CLOSE +#close 2012-10-19-17-38-54 diff --git a/testing/btest/Traces/tunnels/gtp/gtp10_not_0xff.pcap b/testing/btest/Traces/tunnels/gtp/gtp10_not_0xff.pcap new file mode 100755 index 0000000000000000000000000000000000000000..575edf55f9fd21ae83c90cbf8363d92b995b877f GIT binary patch literal 258 zcmca|c+)~A1{MYw`2U}Qff2}A^u5a8PmzPc3CIRv28K8W#(OWeduTHr;9ziNU@!@a zWMKFws50lfg?1DW|KP~r$Y4;2oM|M*AOO|?Bm@?GQVwWkV7YSQs{_bHVQXFn8=yD{ zGcfS5uX)k&;PZ+7AAlzAV9;3p0VpFF{~T!AwYL_j@4zOCcmx_TLLB%n6RZtLfXotK xjcgXkbqs2!Ew_SPw}U|oWY#;uwNF6ifXoA%C1&Mi#Kgb`G6iH7ACTr_000LSMXdk; literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap b/testing/btest/Traces/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap new file mode 100755 index 0000000000000000000000000000000000000000..7ca3b3b05dc3d3b18330ef1ae226daa2b5402d19 GIT binary patch literal 68590 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 literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/tunnels/gtp/gtp2_different_udp_port.pcap b/testing/btest/Traces/tunnels/gtp/gtp2_different_udp_port.pcap new file mode 100755 index 0000000000000000000000000000000000000000..fda97cdaf536a663c80cba7e531b61a08efd47ae GIT binary patch literal 75398 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 J@^V3Pi~xMY9l!tp literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/tunnels/gtp/gtp4_udp_2152_inside.pcap b/testing/btest/Traces/tunnels/gtp/gtp4_udp_2152_inside.pcap new file mode 100755 index 0000000000000000000000000000000000000000..ca67a370460ec34d5aa8bd071050d7b541b12f01 GIT binary patch literal 1020 zcmVu%X6d;kCewp;exFt=po=BGB1`)dvY z$Uz0D=JQ8sfGAzgcZ9Be(nojiMK%*dw@9aeaSg$7Ks2zq>j^wm;)C(z&yZPTn}Twj zJ~S}oRVGlywNK$=8@6}dit$Z(H&#!3+t$BKJZ%@9qeMN%eC*O5$xbZ ztIdiDR7m-fH5sefNTj-UFhP@wh>3Uu&7|ZbcZfXeW*!9^vj`73kK|062ol+~Rjq;2 z;LM)`Av*?lwa;sNbWBQ}>hgED-v#9@8ToCOE1mbsmX#@t!eW(Vm3dmTM~Chrf6Lc* zF15aQH1T9`D8#|qls-CyvPN`9m$OLaG&|ls&wFpIJflabROvqXG9JmIVtIEkN#yI_ zc%LQjQ_VzUBAtq;;9%YYikZFQvJ+&an9w4p3Od|ndwiPz>6Pl3dsO$_rPjZ6cf_(# zbd2#Pw#G$+LKXKg31xt$RZ!U;>zmufh3dVtl)zqA%9>t~t+=tgU5F-qX_76)-ldA2 ze5F&XHb%#k{pRy^eWuj*Vd5erCot-!^w0-U=4CGSytsZ0;6oXmAxo#?kV2itT{yed zNTZjnT6zo|M>3d&kwn`(ZhEE~y2CBck{G@|M_SuVWP)8IT!~)t54sV%T7CDjB0Uz7 z!lul+Zm!1ryH6gU>vJ6rL(XM#M|wx9t2~+EEbyho)#P#&y$+EEcX?8|oYR!k=^&+onBS9 qWv+4D9zzITUcP}UH9SpKb~9uWZIiZ6SUPa8-Q9PhZN0OXrL&h9E%pWg literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/tunnels/gtp/gtp6_gtp_0x32.pcap b/testing/btest/Traces/tunnels/gtp/gtp6_gtp_0x32.pcap new file mode 100755 index 0000000000000000000000000000000000000000..7dd3905c5d7a7f9b85aff9dd6d58c139d13003b4 GIT binary patch literal 5492 zcmai&2{@E%AI6`-*q1PtPKb(xBun%mDqARPAxn}Z;xOqX<%A<^${txlQj#?#6=f|n z%5t29Y~>(iNtTlDdERg}Grsv;*K=LAd4KPH|L^;G-kH{_qI5dI0G7WN7XiS*A2Mfr zjJUP};10h>3jlVedxIf8Q!k&5GXrgBVBZo9fExFDDWj*?t*7F0Ynh#yoq=IUp4=i( z`-4NZKpXx!eYYmiWQ-!PzGr34t<-*+pGG*PB_W-Tu9rqPKYnQp06GSIF#{blD_{@n zLBGe*)8i0*4Q+ZTMwg^X--FS4{}(;5@>lw0_Fw7v8~}*$7ia-s2XOBPOZ231&!Kin z;K*qYz!dk^2&5a`0jAx!zF&S3XaYJnAM_e+W}p@Z|4)i>VH9accR@InpQg@WBMd#r zNaImJ zP1i!y$eXKD1%17TVVstzt%%A`j{}}Ca&GiEBcGWUM8n|DpML)7S;{jJwdCfahubD4MKJM{@x4IHJ7ctVVmx^$sH;uw$sJAn#N0{nm% zumS}j54Hh3j5iT4(9Yrw{!L}bV1J)PQ3C~j`e)B zsVvpPli_~N#_gYm^8UZmI{^V+4u?Y*l{=fcXXFIVR{!?n><3JJq`O>F$C8OE0*Xq? z;q(dLeKu4_w5E!#PtguBOs@#7Jp2WDAaIzDM!tJCqNMS}lO>HZ-`ZHd1<8{pBM9?- z2j*L$5|(!DbF`@P9n;f-sN6YZ)Qcf{FyFr~<@@(^9W39St5OAh z74(ExsAGuwi%lXL?uOE>QSTys9H&kweA&f2KH_S#%~-gC@gZ~UQRi!s|H#yNafCkN zFmy=~8=m7wH_RnKPa~v8mMAJC$z)N{s~=wpDg9DNk6}@nr-;fO7*aD7Qgs+5WL1q2 z7YRmX43WbY=|MO&2`wtCe1~r%tC&W~tU4Lu1+B7LvdSu57qe=D!YVUtK+vkiqGhWh zcoA6uW=VATFU|n>c-%@FG+6d>O!1Xa`zU&GkQLWg&oJpEvu4YbKNt@$(S+EHm4r?H+HXtYlHjoX8*>`_Tyl8THlXtXBXC0 z=CDQI<*%D-|Eb%)H^uNU&5g&kR;(CQ~EC&4H-bwD8~? z+z!#AObTvv(gIO`y!w@jYrhmLw}`9znG{@I`aVRxdT~{%psx&F5;+wbf{W}BRClRM zd!x*kubE7r8(lcV$;F?*?vzq8p*9s9yvFCvmE=@E{l18uUPoGgs4wd8x11>T5Gf)F z%l7_r4NuH7^*Uh0b-Z5pR&LW7F0r@$aXwCUea2t!vXP30(z6^MbczynrHtH(W^B`Y z0=e#+jhkAHrXOXix`_C*<8T!+UquFYeiVrNN@yMM zDm*l+Qc|UAW#mJrZexADTRQakY7j5KbHBH?t-7x(80{^#3

M5<|q0OHa6L-9D zsH)n{61cbNv0TLW|18)r{n=QmH4`d682FdOTlq)rjCWjd8P9q8w?MI*jjZB_(#TKqfy2%> zihJkowmn*i5uTfo?!2N99$>P?aq$_VJU-gO2h%20z(W zVrkHQ5u5O&gBAysV={EpE!!UK&0f#ry^mdX(9zGTsv?gRzfqtx&XFfed(TZPBT-pv zTS@maBsXLyBaQ83HU<@YUi{Z$1Iq10AKOkSp21}~)ER8$(RT9W^GdPxYJ_;q5VhEV z7IhA0NR4|gmnPK!qwZiuLn*pogQ?ay~ROH{at+2^lNEf5u@*7#G=aevE^@b0(wIUf&<#Pdgo z`10vV`^~DG?92LA-|0SKl}>UJ7rBZAu0Q#nP?o3uP0DSPtlX5RImQi%JIm&bUZp^DV?TB>1~)&2Y5Vw zR;pS~DeniEQVT>r-@!zq{_SfK+2Ic|a&EooO8r@u>VFa=UtN_9>tFb4nM{yEWUT%s z4+}Ue?hT|b%JrmG2RWJB6!?wwGiYdaFZ{Vcc*!05an9)JjZI?PTn{sy_ajO%W$R27 zG4VzQOzoJVdu$q>Al9lm{6(uJnVYzl{)LFLx1pk92O6%xB^4ASB(b)akr7-yi$>f*S{aD%kU~%DNS9X{yCf}Dr ze$=vjMK5ak9zwiY)&iZX9|^_%3Rfqko=2Xs&N=TWc23-W5cj$7(Atk$nZ(ORr(9=i z3#3y?x3&*_{xGjt&3$4^zXqf4DIgrGxUlV&X-~>Rd6GQ-QE$g)s;cHBy8I7^8_fj zE)2f^gVVMlmwSY9S?(_Q(Dd`sn;^X$=18$IOXsf*IUdcDhsU0s={%jM8Bi`YeaME@ zv?E8_ZRbl;;Y48RwnL+(q<0678>jGAwDe|yOYJG@*S#aSx*Dtvxc;^F`Fv9GqAW{$ z<#RtJX-3`hnDVzqeBn_Zhd58Y>egLk6LDuz)~cJ)zU4V4)>0H2B);uyTEZ=H65dk8 zZu4Zb=-Ae}+t>7J@3pk_-$Ql`LOW=LUk$TEfy@q4UFS;pIhMljhS}jtVMo%k9R~W; zcKDTB6A%2|A4TlZ?5J|FsAigOjx)26oK?^$U$-Ovx}*-b4O8e$yRTWU4d;JvaIM43-K{ows^ z)b-E}TozY~Kha5Tv9^+}xKouyr~h=WWPT_e*8R84G|oa+0dzhLW{{l^lxN|7>{MDq zaVj~eGuW}CQ|VF8Pw6lPK{Y}IDMVGHO@$jOq^8lN9>Azvt5BmbssuGvoi=qHMopzj zHNvQz)YK!4h+0xeP2D$2)8VTamHhKYN{5XxD#t3+B#ipo3N;uyER7u2r%jE*sN|nB WQc_JYDmyjRUKCLu#;#C95cR(`itN<@ literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/tunnels/gtp/gtp7_ipv6.pcap b/testing/btest/Traces/tunnels/gtp/gtp7_ipv6.pcap new file mode 100755 index 0000000000000000000000000000000000000000..4f358bc374d6c0c69d4acd956cdca4f214cc233e GIT binary patch literal 292 zcmca|c+)~A1{MYw`2U}Qff2}A{JqNm!hUXsCLkMx85nrj*SzR>@cG344;&1x3=Adm zYzz!Gf>oYnF*TY%?7@-2k-?BK;kvhCK}X*GtRlY_nZ&k-??YFxAhha z0x(}jBLIVg+HYCm88U!E>{A1E#Bd)yJoS+%eDB3)Q3ZViN z$7L=?h$|P%y78H~fEoamxH?JgpwsS^Ri(ck6pcbq$!0md4Bo3HxKzT7a?a;=@_T2Q z<{FLZImvpzNUynAUq+BolaOv91fUsS4_dP0nIxO^2RM&2P+KHBL-$ZtjIwtq^W|jn zu?Un!s95_NltqXdNOtY4+QCkVg4s_4DDxRilheyKUS`>>N5`70C@Yq*TT-=a=}!Ra zsUS}j@-Tmd#w0p~t1g|@5e*V&A3g9BnKn?c+Fk|}m5ND=` z+h3U*hXDM<*&UP@Rg$Y>;_N<@#Q-zqj+w;>0|4B_DFKw1^@VLUqS4Q1!QYTC=Vtu9 zzg)`guB)31yUdwMu6UPVhL;$@N!O7klJzvU+D;{rN`+-C!uP2y+FQ9B94RlQ8>)t| z<#MVMZGEVUH*5EKu)s@y^IDG zb?7qEWiYb*$n?wRL#_w)iI%rKZ4*ax`GfXk0WE@~Ih$w(o@R5JXs@K>sbAkldHfSC zsC2nnKAxaj4%Q>h6WbVHORbozB^>2ynJlGRYD@T9rX-0*wf*4lc1q4A!Pk;@)mCYJ zT3B^ulev~IlkOU<4=>ccJcRqlzNuOhKUBc4Er05peL*R*?igEwx3xC1{eSU literal 0 HcmV?d00001 diff --git a/testing/btest/Traces/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap b/testing/btest/Traces/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap new file mode 100755 index 0000000000000000000000000000000000000000..a39026aeffb05b292694e195e75bbb71da192737 GIT binary patch literal 13195 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 +# @TEST-EXEC: btest-diff out + +# In telecoms there is never a GTP tunnel within another GTP tunnel. +# So if we find inside a GTP tunnel anohter IP/UDP packet with port 2152, +# it is just a UDP packet, but not another GTP tunnel. + +event protocol_violation(c: connection, atype: count, aid: count, reason: string) + { + print "protocol_violation", c$id, reason; + } diff --git a/testing/btest/core/tunnels/gtp/not_user_plane_data.test b/testing/btest/core/tunnels/gtp/not_user_plane_data.test new file mode 100644 index 0000000000..a6a3333360 --- /dev/null +++ b/testing/btest/core/tunnels/gtp/not_user_plane_data.test @@ -0,0 +1,9 @@ +# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp10_not_0xff.pcap +# @TEST-EXEC: btest-diff conn.log +# @TEST-EXEC: test ! -e tunnel.log + +# There are GTP tunnel packets, which do not contain user plane data. Only +# those with gtp.message==0xff contain user plane data. Other GTP packets +# without user plane data are echo request, echo reply, error indication +# and stop marker (not included in trace). Those non-user plane GTP +# packets are ignored for now. diff --git a/testing/btest/core/tunnels/gtp/opt_header.test b/testing/btest/core/tunnels/gtp/opt_header.test new file mode 100644 index 0000000000..b7100f2190 --- /dev/null +++ b/testing/btest/core/tunnels/gtp/opt_header.test @@ -0,0 +1,12 @@ +# @TEST-EXEC: bro -r $TRACES/tunnels/gtp/gtp6_gtp_0x32.pcap %INPUT >out +# @TEST-EXEC: btest-diff out +# @TEST-EXEC: btest-diff conn.log +# @TEST-EXEC: btest-diff tunnel.log + +# Some GTPv1 headers have some optional fields totaling to a 4-byte extension +# of the mandatory header. + +event gtpv1_g_pdu_packet(outer: connection, inner_gtp: gtpv1_hdr, inner_ip: pkt_hdr) + { + print "gtpv1_packet", inner_gtp; + } diff --git a/testing/btest/core/tunnels/gtp/outer_ip_frag.test b/testing/btest/core/tunnels/gtp/outer_ip_frag.test new file mode 100644 index 0000000000..b2badb9c1b --- /dev/null +++ b/testing/btest/core/tunnels/gtp/outer_ip_frag.test @@ -0,0 +1,11 @@ +# @TEST-EXEC: bro -C -r $TRACES/tunnels/gtp/gtp1_gn_normal_incl_fragmentation.pcap +# @TEST-EXEC: btest-diff conn.log +# @TEST-EXEC: btest-diff http.log +# @TEST-EXEC: btest-diff tunnel.log + +# Normal GTP file, incl. TCP handshake and HTTP message. +# The inner IP packet is put into a GTP tunnel and as the original user payload +# is already 1500 byte, the tunneled packet incl. GTP/UDP/IP payload is +# bigger than 1500 byte and thus the outer IP must be fragmented, as seen here. +# (checksums are incorrect because packets were anonymized and tcprewrite +# seems to fail to correct the checksums when there's IP fragmentation). diff --git a/testing/btest/core/tunnels/gtp/unknown_or_too_short.test b/testing/btest/core/tunnels/gtp/unknown_or_too_short.test new file mode 100644 index 0000000000..e1b3d4ba20 --- /dev/null +++ b/testing/btest/core/tunnels/gtp/unknown_or_too_short.test @@ -0,0 +1,13 @@ +# @TEST-EXEC: bro -C -r $TRACES/tunnels/gtp/gtp9_unknown_or_too_short_payload.pcap +# @TEST-EXEC: btest-diff dpd.log +# @TEST-EXEC: btest-diff tunnel.log + +# Packet 11, epoch time 1333458853.075889 is malformed. Only 222 byte are +# captured, although according to the IP header a full packet should be +# available. In Sessions.cc this throws a weird message at line 710. +# Packet 12, epoch time 1333458853.075904 is malformed. The user plane +# packet is no IPv4 nor IPv6 packet. Very probably this is a follow up +# issue on a problem of the user plane packet before it was put into the +# tunnel. The user plane packet may got corrupt and then put into 2 tunnel +# packets, here packet 11 and 12, and in packet 12 the user plane data is +# part of the remainder of the broken user plane packet of packet 11. From 3e7fb3a659d617426259ac58bf282147a6d440e0 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Fri, 19 Oct 2012 14:17:29 -0500 Subject: [PATCH 2/3] Add GTP tunnel analyzer memory leak unit test. --- testing/btest/core/leaks/gtp_opt_header.test | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 testing/btest/core/leaks/gtp_opt_header.test diff --git a/testing/btest/core/leaks/gtp_opt_header.test b/testing/btest/core/leaks/gtp_opt_header.test new file mode 100644 index 0000000000..76c65d5762 --- /dev/null +++ b/testing/btest/core/leaks/gtp_opt_header.test @@ -0,0 +1,15 @@ +# Needs perftools support. +# +# @TEST-REQUIRES: bro --help 2>&1 | grep -q mem-leaks +# +# @TEST-GROUP: leaks +# +# @TEST-EXEC: HEAP_CHECK_DUMP_DIRECTORY=. HEAPCHECK=local bro -m -r $TRACES/tunnels/gtp/gtp6_gtp_0x32.pcap %INPUT >out + +# Some GTPv1 headers have some optional fields totaling to a 4-byte extension +# of the mandatory header. + +event gtpv1_g_pdu_packet(outer: connection, inner_gtp: gtpv1_hdr, inner_ip: pkt_hdr) + { + print "gtpv1_packet", inner_gtp; + } From 7cf54b2541139bb62e8bb19240ab5f5f24f35f32 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Mon, 29 Oct 2012 12:15:48 -0500 Subject: [PATCH 3/3] Change binpac exceptions in AYIYA/GTP analyzers to do protocol_violation As opposed to creating weirds for e.g. "binpac::ExceptionOutOfBound". The protocol_violation will also result in the disabling of the analyzer by default. --- src/AYIYA.cc | 10 +++++++++- src/GTPv1.cc | 9 ++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/AYIYA.cc b/src/AYIYA.cc index c525a73b6c..79fa44e743 100644 --- a/src/AYIYA.cc +++ b/src/AYIYA.cc @@ -20,5 +20,13 @@ void AYIYA_Analyzer::Done() void AYIYA_Analyzer::DeliverPacket(int len, const u_char* data, bool orig, int seq, const IP_Hdr* ip, int caplen) { Analyzer::DeliverPacket(len, data, orig, seq, ip, caplen); - interp->NewData(orig, data, data + len); + + try + { + interp->NewData(orig, data, data + len); + } + catch ( const binpac::Exception& e ) + { + ProtocolViolation(fmt("Binpac exception: %s", e.c_msg())); + } } diff --git a/src/GTPv1.cc b/src/GTPv1.cc index b7a0fdc664..68b6f30a0c 100644 --- a/src/GTPv1.cc +++ b/src/GTPv1.cc @@ -20,5 +20,12 @@ void GTPv1_Analyzer::Done() void GTPv1_Analyzer::DeliverPacket(int len, const u_char* data, bool orig, int seq, const IP_Hdr* ip, int caplen) { Analyzer::DeliverPacket(len, data, orig, seq, ip, caplen); - interp->NewData(orig, data, data + len); + try + { + interp->NewData(orig, data, data + len); + } + catch ( const binpac::Exception& e ) + { + ProtocolViolation(fmt("Binpac exception: %s", e.c_msg())); + } }