#define DEBUG_APPID 0x0400000000000000LL
#ifdef PIGLET
-#define DEBUG_PIGLET 0x0400000000000000LL
+#define DEBUG_PIGLET 0x0800000000000000LL
#endif
const PegInfo appid_pegs[] =
{
{ "packets", "count of packets processed by appid" },
+ { "bit_clients", "count of bittorrent clients discovered by appid" },
+ { "bit_flows", "count of bittorrent flows discovered by appid" },
+ { "bittracker_clients", "count of bittorrent tracker clients discovered by appid" },
{ "dns_udp_flows", "count of dns flows over udp discovered by appid" },
{ "dns_tcp_flows", "count of dns flows over tcp discovered by appid" },
{ "ftp_flows", "count of ftp flows discovered by appid" },
{ "pop flows", "count of pop service flows discovered by appid" },
{ "smtp_flows", "count of smtp flows discovered by appid" },
{ "smtps_flows", "count of smtps flows discovered by appid" },
+ { "ssh_clients", "count of ssh clients discovered by appid" },
{ "ssh_flows", "count of ssh flows discovered by appid" },
{ "ssl_flows", "count of ssl flows discovered by appid" },
{ "telnet_flows", "count of telnet flows discovered by appid" },
struct AppIdStats
{
PegCount packets;
+ PegCount bit_clients;
+ PegCount bit_flows;
+ PegCount bittracker_clients;
PegCount dns_udp_flows;
PegCount dns_tcp_flows;
PegCount ftp_flows;
PegCount pop_flows;
PegCount smtp_flows;
PegCount smtps_flows;
+ PegCount ssh_clients;
PegCount ssh_flows;
PegCount ssl_flows;
PegCount telnet_flows;
static RNAClientAppModule* static_client_list[] =
{
&smtp_client_mod,
+ &ssh_client_mod,
#ifdef REMOVED_WHILE_NOT_IN_USE
&msn_client_mod,
&ym_client_mod,
&sip_udp_client_mod,
&sip_tcp_client_mod,
+#endif
&bit_client_mod,
&bit_tracker_client_mod,
+#ifdef REMOVED_WHILE_NOT_IN_USE
&rtp_client_mod,
- &ssh_client_mod,
&timbuktu_client_mod,
&tns_client_mod,
&vnc_client_mod,
return nullptr;
}
-void add_pattern_data(SearchTool* st, const RNAClientAppModule* li, int position, const
- uint8_t* const pattern, unsigned size,
- unsigned nocase, int* count, ClientAppConfig* pClientAppConfig)
+void add_pattern_data(SearchTool* st, const RNAClientAppModule* li, int position,
+ const uint8_t* const pattern, unsigned size, unsigned nocase,
+ int* count, ClientAppConfig* pClientAppConfig)
{
ClientPatternData* pd = (ClientPatternData*)snort_calloc(sizeof(ClientPatternData));
pd->ca = li;
if (proto == IpProtocol::TCP)
{
- if (pClientAppConfig->tcp_patterns)
- delete pClientAppConfig->tcp_patterns;
- pClientAppConfig->tcp_patterns = new SearchTool("ac_full");
- pClientAppConfig->udp_patterns = nullptr;
+ if (!pClientAppConfig->tcp_patterns)
+ pClientAppConfig->tcp_patterns = new SearchTool("ac_full");
count = &pClientAppConfig->tcp_pattern_count;
add_pattern_data(pClientAppConfig->tcp_patterns, li, position, pattern, size,
nocase, count, pClientAppConfig);
}
else if (proto == IpProtocol::UDP)
{
- if (pClientAppConfig->udp_patterns)
- delete pClientAppConfig->udp_patterns;
- pClientAppConfig->udp_patterns = new SearchTool("ac_full");
- pClientAppConfig->tcp_patterns = nullptr;
+ if (!pClientAppConfig->udp_patterns)
+ pClientAppConfig->udp_patterns = new SearchTool("ac_full");
count = &pClientAppConfig->udp_pattern_count;
add_pattern_data(pClientAppConfig->udp_patterns, li, position, pattern, size,
nocase, count, pClientAppConfig);
}
else
{
- if (pClientAppConfig->tcp_patterns)
- delete pClientAppConfig->tcp_patterns;
- pClientAppConfig->tcp_patterns = nullptr;
-
- if (pClientAppConfig->udp_patterns)
- delete pClientAppConfig->udp_patterns;
- pClientAppConfig->udp_patterns = nullptr;
-
ErrorMessage("Invalid protocol when registering a pattern: %u\n",(unsigned)proto);
}
}
{
if ((li->module->validate == fcn) && (li->module->userData == userData))
{
- clientCreatePattern(proto, pattern, size, position, nocase, li->module,
- pClientAppConfig);
+ clientCreatePattern(proto, pattern, size, position, nocase,
+ li->module, pClientAppConfig);
break;
}
}
}
}
-int AppIdDiscoverClientApp(Packet* p, int direction, AppIdData* rnaData, const
- AppIdConfig* pConfig)
+int AppIdDiscoverClientApp(Packet* p, int direction, AppIdData* rnaData,
+ const AppIdConfig* pConfig)
{
if (!pConfig->clientAppConfig.enabled)
return APPID_SESSION_SUCCESS;
#include "client_app_api.h"
#include "application_ids.h"
+#include "appid_module.h"
#include "main/snort_debug.h"
#include "utils/util.h"
static Client_App_Pattern patterns[] =
{
- { (const uint8_t*)BIT_BANNER, sizeof(BIT_BANNER)-1, 0, APP_ID_BITTORRENT },
+ { (const uint8_t*)BIT_BANNER, BIT_BANNER_LEN, -1, APP_ID_BITTORRENT },
};
static AppRegistryEntry appIdRegistry[] =
done:
bit_client_mod.api->add_app(flowp, APP_ID_BITTORRENT, APP_ID_BITTORRENT, nullptr);
setAppIdFlag(flowp, APPID_SESSION_CLIENT_DETECTED);
+ appid_stats.bit_clients++;
return CLIENT_APP_SUCCESS;
}
#include "app_info_table.h"
#include "application_ids.h"
#include "client_app_api.h"
+#include "appid_module.h"
static const char UDP_BIT_QUERY[] = "d1:a";
static const char UDP_BIT_RESPONSE[] = "d1:r";
static Client_App_Pattern udp_patterns[] =
{
- { (const uint8_t*)UDP_BIT_QUERY, sizeof(UDP_BIT_QUERY), 0, APP_ID_BITTRACKER_CLIENT },
- { (const uint8_t*)UDP_BIT_RESPONSE, sizeof(UDP_BIT_RESPONSE), 0, APP_ID_BITTRACKER_CLIENT },
- { (const uint8_t*)UDP_BIT_ERROR, sizeof(UDP_BIT_ERROR), 0, APP_ID_BITTRACKER_CLIENT },
+ { (const uint8_t*)UDP_BIT_QUERY, sizeof(UDP_BIT_QUERY) - 1, -1, APP_ID_BITTRACKER_CLIENT },
+ { (const uint8_t*)UDP_BIT_RESPONSE, sizeof(UDP_BIT_RESPONSE) - 1, -1, APP_ID_BITTRACKER_CLIENT },
+ { (const uint8_t*)UDP_BIT_ERROR, sizeof(UDP_BIT_ERROR) - 1, -1, APP_ID_BITTRACKER_CLIENT },
};
static AppRegistryEntry appIdRegistry[] =
bit_tracker_client_mod.api->add_app(flowp, APP_ID_BITTORRENT, APP_ID_BITTRACKER_CLIENT,
nullptr);
setAppIdFlag(flowp, APPID_SESSION_CLIENT_DETECTED);
+ appid_stats.bittracker_clients++;
return CLIENT_APP_SUCCESS;
}
#include "app_info_table.h"
#include "application_ids.h"
#include "client_app_api.h"
+#include "appid_module.h"
static const char SSH_CLIENT_BANNER[] = "SSH-";
#define SSH_CLIENT_BANNER_LEN (sizeof(SSH_CLIENT_BANNER)-1)
static Client_App_Pattern patterns[] =
{
- { (const uint8_t*)SSH_CLIENT_BANNER, sizeof(SSH_CLIENT_BANNER)-1, 0, APP_ID_SSH },
- { (const uint8_t*)OPENSSH_BANNER, sizeof(OPENSSH_BANNER)-1, 0, APP_ID_OPENSSH },
- { (const uint8_t*)PUTTY_BANNER, sizeof(PUTTY_BANNER)-1, 0, APP_ID_PUTTY },
- { (const uint8_t*)LSH_BANNER, sizeof(LSH_BANNER)-1, 0, APP_ID_LSH },
- { (const uint8_t*)DROPBEAR_BANNER, sizeof(DROPBEAR_BANNER)-1, 0, APP_ID_DROPBEAR },
+ { (const uint8_t*)SSH_CLIENT_BANNER, sizeof(SSH_CLIENT_BANNER) - 1, 0, APP_ID_SSH },
+ { (const uint8_t*)OPENSSH_BANNER, sizeof(OPENSSH_BANNER) - 1, -1, APP_ID_OPENSSH },
+ { (const uint8_t*)PUTTY_BANNER, sizeof(PUTTY_BANNER) - 1, -1, APP_ID_PUTTY },
+ { (const uint8_t*)LSH_BANNER, sizeof(LSH_BANNER) - 1, 0, APP_ID_LSH },
+ { (const uint8_t*)DROPBEAR_BANNER, sizeof(DROPBEAR_BANNER) - 1, -1, APP_ID_DROPBEAR },
};
static AppRegistryEntry appIdRegistry[] =
ssh_client_mod.api->add_app(flowp, APP_ID_SSH, fd->client_id, (const char*)fd->version);
setAppIdFlag(flowp, APPID_SESSION_CLIENT_DETECTED);
+ appid_stats.ssh_clients++;
return CLIENT_APP_SUCCESS;
}
else
{
clearAppIdFlag(flowp, APPID_SESSION_CONTINUE);
- appid_stats.imap_flows++;
return SERVICE_SUCCESS;
}
&battlefield_service_mod,
&mdns_service_mod,
&timbuktu_service_mod,
- &bit_service_mod,
&tns_service_mod,
#endif
+ &bit_service_mod,
&pattern_service_mod,
&http_service_mod
};
// service_bit.cc author Sourcefire Inc.
-#include "main/snort_debug.h"
-#include "utils/util.h"
+
#include "application_ids.h"
#include "service_api.h"
+#include "appid_module.h"
+
+#include "main/snort_debug.h"
+#include "utils/util.h"
static const char svc_name[] = "bt";
static const uint8_t BIT_BANNER[] = "\023BitTorrent protocol";
success:
bit_service_mod.api->add_service(flowp, args->pkt, args->dir, &svc_element,
APP_ID_BITTORRENT, nullptr, nullptr, nullptr);
+ appid_stats.bit_flows++;
return SERVICE_SUCCESS;
fail:
void* context, int* current_state) override
{
if ( !obj->dfa_enabled() )
- return 0; // nfa + all not supported
-
- return acsm_search_dfa_full_all(obj, T, n, match, context, current_state);
+ return acsm_search_nfa(obj, T, n, match, context, current_state);
+ else
+ return acsm_search_dfa_full_all(obj, T, n, match, context, current_state);
}
int print_info() override
delete stool;
}
+TEST(search_tool_tests, search_all_ac_full)
+{
+ SearchTool *stool = new SearchTool("ac_full");
+ CHECK(stool->mpse);
+
+ pattern_id = 1;
+ stool->add("the", 3, pattern_id);
+ CHECK(stool->max_len == 3);
+
+ pattern_id = 77;
+ stool->add("uba", 3, pattern_id);
+ CHECK(stool->max_len == 3);
+
+ pattern_id = 2112;
+ stool->add("away", 4, pattern_id);
+ CHECK(stool->max_len == 4);
+
+ pattern_id = 1000;
+ stool->add("nothere", 7, pattern_id);
+ CHECK(stool->max_len == 7);
+
+ stool->prep();
+
+ const char *datastr = "the tuba ran away";
+ int result = stool->find_all(datastr, strlen(datastr), Test_SearchStrFound);
+ CHECK(result == 3);
+ delete stool;
+}
+
//-------------------------------------------------------------------------
// main
//-------------------------------------------------------------------------