Sunday, August 10, 2008

Snort 3.0 Architecture Series Part 3: The command shell


One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 biggest user-facing changes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Snort 3 architecture is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inclusion of a user shell interface to interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system. Up until now everything has been controlled strictly via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command line interface at startup time and via signals sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. There are many reasons for going with a command shell that I detailed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first part of this series but basically since Snort is designed to be able to run continuously now it was essential to have a way to interact with it.

Upon starting SnortSP you are sent directly to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command shell prompt.

[+] Loaded pcap DAQ
[+] Loaded file DAQ
[+] Loaded afpacket DAQ
[*] DAQ Modules Loaded...
[*] Loading decoder modules
[+] Loaded ecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rnet
[+] Loaded null
[+] Loaded arp
[+] Loaded ip
[+] Loaded tcp
[+] Loaded udp
[+] Loaded icmp
[+] Loaded icmp6
[+] Loaded gre
[+] Loaded mpls
[+] Loaded 8021q
[+] Loaded ipv6
[+] Loaded ppp
[+] Loaded pppoe
[+] Loaded gtp
[+] Loaded raw
[*] Decoder initialized...
[*] Flow manager initialized...
[*] Data source subsystem loaded
[*] Engine manager initialized
Control thread running - 3082939280 (18555)
[*] Loading command interface
[!] Loading SnortSP command metatable
[!] Loading data source command metatable
[!] Loading engine command metatable
[!] Loading output command metatable
[!] Loading analyzer command metatable
Executing etc/snort.lua
,,_ -*> SnortSP! <*-
o" )~ Version 3.0.0b2 (Build 9) [BETA]
'''' By Martin Roesch & The Snort Team: http://www.snort.org/team.html
(C) Copyright 2008 Sourcefire Inc.
snort>


If this is your first time running Snort you'll probably want to get help. Every subsystem in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Snort 3 architecture has its own help function available as do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 engine modules, if you ever get lost working with a module just invoke its object help function. For example:

snort> ssp.help()
[*] SnortSP Commands:
help()
set_log_level( [debug|info|notice|warn|error|critical] )
shutdown()
Available subsystems within SnortSP have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own help() methods:
dsrc - Data Source
eng - Dispatcher/Engine
analyzer - Analytics Modules
output - Output Modules
For example: dsrc.help() will call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Data Source help function


As you can see, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top level module for SnortSP is called "ssp" and you can invoke its help function by calling it with a "ssp.help()" function. If you want to find out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data source subsystem's available functions simply call "dsrc.help()" and so on.

One cool thing: if your system has Readline support available cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Lua interpreter will pick it up automatically and you'll have standard shell functionality available within SnortSP such as command history and command line editing.

Under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 covers a few things are happening. When a command is invoked in SnortSP cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a series of lookups performed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 src/platform/lua_interface.c file. Lua is really handy for wrapping C function calls, it's one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initial reasons I went with it for Snort. Let's take a look at some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simple functionality in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lua_interface.c file for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ssp.* commands.


static int set_log_level_wrap(lua_State *L) {
int level;

if (lua_isnumber(L, 1))
{
level = lua_tointeger(L, 1);
}
else
{
const char *name = (char *) luaL_checkstring(L, 1);
if (name ==NULL) return 0;

if (strcasecmp(name, "debug") == 0) level = S_LOG_DEBUG;
else if (strcasecmp(name, "info") == 0) level = S_LOG_INFO;
else if (strcasecmp(name, "notice") == 0) level = S_LOG_NOTICE;
else if (strcasecmp(name, "warn") == 0) level = S_LOG_WARN;
else if (strcasecmp(name, "error") == 0) level = S_LOG_ERROR;
else if (strcasecmp(name, "critical") == 0) level = S_LOG_CRITICAL;
else return 0;
}
log_set_current_log_level(level);
level = log_get_current_log_level();
S_INFO("Log level set to %s", log_level_to_string(level));
return 0;
}

static int shutdown_wrap(lua_State *L) {
stop_processing = 1;
return 0;
}

static int platform_help_wrap(lua_State *L) {
printf("[*] "PLATFORM_NAME" Commands:\n"
" help()\n"
" set_log_level( [debug|info|notice|warn|error|critical] )\n"
" shutdown()\n"
" Available subsystems within "PLATFORM_NAME" have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own help() methods:\n"
" dsrc - Data Source\n"
" eng - Dispatcher/Engine\n"
" analyzer - Analytics Modules\n"
" output - Output Modules\n"
" For example: dsrc.help() will call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Data Source help function\n");
return 0;
}

static void platform_set_info(lua_State *L) {
lua_pushliteral (L, "_COPYRIGHT");
lua_pushliteral (L, "Copyright (C) 2008 Sourcefire Inc.");
lua_settable (L, -3);
lua_pushliteral (L, "_DESCRIPTION");
lua_pushliteral (L, "Network Intrusion Prevention System command interface");
lua_settable (L, -3);
lua_pushliteral (L, "_VERSION");
lua_pushliteral (L, PLATFORM_NAME" 0.1");
lua_settable (L, -3);
}

static const struct luaL_reg platformlib[] = {
{"help", platform_help_wrap},
{"shutdown", shutdown_wrap},
{"set_log_level", set_log_level_wrap},
{NULL, NULL},
};

static int platform_dir_create_meta (lua_State *L) {
luaL_newmetatable (L, METATABLE);
/* set its __gc field */
lua_pushstring (L, "__gc");
lua_settable (L, -2);
return 1;
}

static int luaopen_platform(lua_State *L) {
platform_dir_create_meta(L);
S_INFO("[!] Loading "PLATFORM_NAME" command metatable");
luaL_openlib(L, PLATFORM_PROMPT, platformlib, 0);
platform_set_info(L);
return 1;
}


This code sets up a "metatable" in Lua which allows us to call functions from its root with dot notation. The call to bind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root name is a little hidden in this case, it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 luaL_openlib() call in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last function above. We ended up using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PLATFORM_PROMPT substitution due to our habit of renaming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole project periodically in its earlier days....

The array definition at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code listing shows how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keywords are being mapped to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function calls cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves. When you put it all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, if you call "PLATFORM_PROMPT.help()" it maps that back to calling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 platform_help_wrap() function. If you're familiar with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internals of Snort 1.x-2x you'll know that this mapping of keywords in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter to function calls is very similar to how Snort's parser worked so it was a very comfortable transition for me. Add in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validation and scripting that you can get from lua and you can do some really cool stuff!

Let's take a look at a sample lua function scripting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SnortSP architecture to demonstrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 power of this arrangement. One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 things I wanted to do with SnortSP in its early days is test out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoders to make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were no huge flaws in any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m that would lead to crash, as you know Snort's decoders are "critical infrastructure" that must be fast and crash free, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system is counting on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. The function I wrote would allow a user to point Snort at a directory of pcap files and process each one sequentially until every file in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory had been processed.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old days we would have had to start a new instance of Snort (2.x) for each file we wanted to process and take all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time to load and shutdown. In SnortSP you could (in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory) load a detection configuration and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n process each file, all without having to restart. The way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function is setup right now it just processes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file and prints cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 packet dump to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 screen. Here's a listing.

require"lfs"     # load filesystem functions

function rundir (path, mask) # args are path to pcap files, filename mask
once = 0 # initialize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data source once only
for file in lfs.dir(path) do # grab cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path
if string.match(file, mask) ~= nil cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n # find files that match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mask
print("Processing File "..path..'/'..file)
if(once == 0) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n # setup cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dsrc params once only
once = 1
dsrc1 = {name="src1",
type="pcap",
intf="file",
filename=path..'/'..file,
flags=1,
snaplen=0,
maxflows=16384,
maxidle=10,
flow_memcap=10000000,
display="max"}
dsrc.new(dsrc1) # instantiate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dsrc once only
eng.new("e1") # instantiate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dispatcher once only
eng.link({engine="e1", source="src1"}) # link dsrc to dispatcher
print("Starting engine")
eng.start("e1") # run it
else
eng.run_file("e1", path..'/'..file) # just fun cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file now
end
end
end
if(once == 1) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n # process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last file too
eng.run_file("e1", "")
end
end


The first thing happening here is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inclusion of a Lua library called "lfs". That's necessary for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filesystem interface, Lua doesn't ship with one natively. (I know.) After that it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function definition which takes two arguments, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pcap files and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filename mask to use to select cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right files from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory. The first iteration through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 config data structures and engine objects are instantiated and configured and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first file is processed, after that it just processes all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 directory.

This is pretty cool! Practically speaking you can script cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 startup and shutdown of Snort and script cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operation of all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different system objects as well. For example, you can make external system calls to lookup runtime parameters like interface configuration or available memory and use that information to tune your runtime configuration parameters of your engine. You can also script testing new software modules or even get into more crazy stuff like automatically turning engine modules on and off at certain times of day or pretty much anything else you can imagine.

This is just a brief tour of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command line, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's more that can be done! I'll leave it to interested readers to explore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SnortSP command shell and I'd love to hear about interesting things you do with it.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series I'll start writing about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data source subsystem and its components.

Labels: , , , ,

8 Comments:

At 8:32 AM, Anonymous Anonymous said...

Good stuff Martin, Now how do we use it :-)

 
At 9:54 AM, Blogger Martin Roesch said...

Check out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 README file with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 distro, it's got a comprehensive set of docs for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commands included with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system as well as usage examples.

Also check out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 README.bridge document for an example of how to move your existing inline Snort implementation over to SnortSP.

Hope that helps!

Marty

 
At 7:38 PM, Anonymous Anonymous said...

If I want to run snort3.0 on multicore system, what is best way to have multiple snort engine threads working on same data source?
simply to duplicate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 eng.add_analyzer()? current snort.lua can only start one thread of data source and one thread of snort engine, but I want to start as many as I want.

 
At 4:48 PM, Anonymous Anonymous said...

Hi,

This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time, my question is does it work with Visa OS?

Thanks
O.H

 
At 8:03 PM, Blogger Martin Roesch said...

It doesn't support Vista at this time, Win32 support will be added later.

 
At 8:04 PM, Blogger Martin Roesch said...

To answer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 earlier question about multiple analysis threads, that's exactly how you add threads. Sorry for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 delay in responding. :)

 
At 6:53 AM, Anonymous Anonymous said...

This is all very exciting but I find it worrying that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no new beta since July 2008. Is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project dead/stopped/delayed?

 
At 4:28 PM, Blogger Martin Roesch said...

Sorry for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 long delays, Beta 3 is now available. Expect more frequent updates moving forward.

 

Post a Comment

<< Home