Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bro's Exec Module

Bro's Exec Module

From the 2013 Bro Exchange.

Vlad Grigorescu

August 06, 2013
Tweet

More Decks by Vlad Grigorescu

Other Decks in Programming

Transcript

  1. system BIF • Invokes a command via the system function

    of the OS. • The command runs in the background with stdout redirecting to stderr. 2
  2. system BIF • Invokes a command via the system function

    of the OS. • The command runs in the background with stdout redirecting to stderr. • Bro can’t access the result (output, exit code, etc.) 2
  3. Integration • Block a malicious IP, create an incident, send

    to SEM. • CMU’s Bro cluster has: 46 workers, 6 proxies, 1 manager... and 1 Barnyard node. 3
  4. Review: Input Framework ##!  The  input  framework  provides  a  way

     to   ##!  read  previously  stored  data  either  as                                                                                                                                                                                                                                                                                                                                                                                                       ##!  an  event  stream  or  into  a  bro  table.   4
  5. Review: Input Framework ##!  The  input  framework  provides  a  way

     to   ##!  read  previously  stored  data  either  as                                                                                                                                                                                                                                                                                                                                                                                                       ##!  an  event  stream  or  into  a  bro  table.   4 • Readers: • SQLite • ASCII • Binary • Intel Framework
  6. The Exec Module 5 base/utils/exec.bro: module  Exec; export  {  

     ##  Function  for  running  command  line    ##  programs  and  getting  output.    global  run:  function(cmd:  Command):  Result; }
  7. Exec: Command 6 type  Command:  record  {    ##  The

     command  line  to  execute.                                                                                                                                                                                                                                                                                                                                                                                                                                                                    cmd:                  string;    ##  Provide  standard  in  to  the  program.                                                                                                                                                                                                                                                                                                                                                                                                                                stdin:              string            &default="";    ##  If  additional  files  are  required  to  be      ##  read  in  as  part  of  the  output  of  the    ##  command,  they  can  be  defined  here.                                                                                                                                                                                                                                                                                                                                                                                                                                              read_files:    set[string]  &optional;    ##  The  unique  id  for  tracking  executors.                                                                                                                                                                                                                                                                                                                                                                                                                                                      uid:  string  &default=unique_id("");  };
  8. Exec: Command 6 type  Command:  record  {    ##  The

     command  line  to  execute.                                                                                                                                                                                                                                                                                                                                                                                                                                                                    cmd:                  string;    ##  Provide  standard  in  to  the  program.                                                                                                                                                                                                                                                                                                                                                                                                                                stdin:              string            &default="";    ##  If  additional  files  are  required  to  be      ##  read  in  as  part  of  the  output  of  the    ##  command,  they  can  be  defined  here.                                                                                                                                                                                                                                                                                                                                                                                                                                              read_files:    set[string]  &optional;    ##  The  unique  id  for  tracking  executors.                                                                                                                                                                                                                                                                                                                                                                                                                                                      uid:  string  &default=unique_id("");  };
  9. Exec: Command 6 type  Command:  record  {    ##  The

     command  line  to  execute.                                                                                                                                                                                                                                                                                                                                                                                                                                                                    cmd:                  string;    ##  Provide  standard  in  to  the  program.                                                                                                                                                                                                                                                                                                                                                                                                                                stdin:              string            &default="";    ##  If  additional  files  are  required  to  be      ##  read  in  as  part  of  the  output  of  the    ##  command,  they  can  be  defined  here.                                                                                                                                                                                                                                                                                                                                                                                                                                              read_files:    set[string]  &optional;    ##  The  unique  id  for  tracking  executors.                                                                                                                                                                                                                                                                                                                                                                                                                                                      uid:  string  &default=unique_id("");  };
  10. Exec: Command 6 type  Command:  record  {    ##  The

     command  line  to  execute.                                                                                                                                                                                                                                                                                                                                                                                                                                                                    cmd:                  string;    ##  Provide  standard  in  to  the  program.                                                                                                                                                                                                                                                                                                                                                                                                                                stdin:              string            &default="";    ##  If  additional  files  are  required  to  be      ##  read  in  as  part  of  the  output  of  the    ##  command,  they  can  be  defined  here.                                                                                                                                                                                                                                                                                                                                                                                                                                              read_files:    set[string]  &optional;    ##  The  unique  id  for  tracking  executors.                                                                                                                                                                                                                                                                                                                                                                                                                                                      uid:  string  &default=unique_id("");  };
  11. Exec: Command 6 type  Command:  record  {    ##  The

     command  line  to  execute.                                                                                                                                                                                                                                                                                                                                                                                                                                                                    cmd:                  string;    ##  Provide  standard  in  to  the  program.                                                                                                                                                                                                                                                                                                                                                                                                                                stdin:              string            &default="";    ##  If  additional  files  are  required  to  be      ##  read  in  as  part  of  the  output  of  the    ##  command,  they  can  be  defined  here.                                                                                                                                                                                                                                                                                                                                                                                                                                              read_files:    set[string]  &optional;    ##  The  unique  id  for  tracking  executors.                                                                                                                                                                                                                                                                                                                                                                                                                                                      uid:  string  &default=unique_id("");  };
  12. Exec: Result type  Result:  record  {    ##  Exit  code

     from  the  program.    exit_code:      count                        &default=0; 7
  13. Exec: Result type  Result:  record  {    ##  Exit  code

     from  the  program.    exit_code:      count                        &default=0;    ##  Was  the  command  terminated  with  a  signal?    signal_exit:  bool                          &default=F; 7
  14. Exec: Result type  Result:  record  {    ##  Exit  code

     from  the  program.    exit_code:      count                        &default=0;    ##  Was  the  command  terminated  with  a  signal?    signal_exit:  bool                          &default=F;    ##  Each  line  of  standard  out.                                                                                                                                                                                                                                                                                                                                                                                                                                              stdout:            vector  of  string  &optional; 7
  15. Exec: Result type  Result:  record  {    ##  Exit  code

     from  the  program.    exit_code:      count                        &default=0;    ##  Was  the  command  terminated  with  a  signal?    signal_exit:  bool                          &default=F;    ##  Each  line  of  standard  out.                                                                                                                                                                                                                                                                                                                                                                                                                                              stdout:            vector  of  string  &optional;    ##  Each  line  of  standard  error.                                                                                                                                                                                                                                                                                                                                                                                                                                              stderr:            vector  of  string  &optional; 7
  16. Exec: Result type  Result:  record  {    ##  Exit  code

     from  the  program.    exit_code:      count                        &default=0;    ##  Was  the  command  terminated  with  a  signal?    signal_exit:  bool                          &default=F;    ##  Each  line  of  standard  out.                                                                                                                                                                                                                                                                                                                                                                                                                                              stdout:            vector  of  string  &optional;    ##  Each  line  of  standard  error.                                                                                                                                                                                                                                                                                                                                                                                                                                              stderr:            vector  of  string  &optional;    ##  If  additional  files  were  requested  to  be    ##  read,  the  content  of  those  files.    files:  table[string]  of  string_vec  &optional;  }; 7
  17. 8 Exec: Example @load  base/utils/exec when  (  local  result  =

     Exec::run([$cmd="ls  /tmp"])  )                print  result;
  18. 8 Exec: Example @load  base/utils/exec when  (  local  result  =

     Exec::run([$cmd="ls  /tmp"])  )                print  result; vladg@grotto  tmp  %  bro  exec.bro [exit_code=0,  signal_exit=F,   stdout=[gpg-­‐CqkLNc,  ssh-­‐PwEdfvWB1673],   stderr=<uninitialized>,  files=<uninitialized>] vladg@grotto  tmp  %  ls  /tmp   gpg-­‐CqkLNc    ssh-­‐PwEdfvWB1673
  19. 9 Exec: Standalone Example @load  policy/frameworks/communication/listen @load  base/utils/exec when  (

     local  result  =  Exec::run([$cmd="ls  /tmp"])  )                          {                print  result;                terminate();                }
  20. Integration • Previously been able to block IPs, create tickets,

    etc. • We can now verify our blocks, see how long until the block took effect. • We can add a field to notice.log with the ticket number. 10
  21. Informing Notice Actions • Check our ticket system to see

    if this host has a history of notifications/ suspensions. • Check LDAP to see if the user is a student or a faculty member. • Check Identity Finder to see if the system has PII. 11
  22. Offensive Defense 12 @load  base/utils/exec @load  policy/protocols/conn/known-­‐services event  log_known_services(rec:  Known::ServicesInfo)

       {    if  (  rec$port_num  !=  3389/tcp  )        return;    local  cmd  =  "/opt/nessus/bin/nasl  -­‐t  %s  "  +                            "/opt/nessus/lib/nessus/plugins/ms12-­‐020.nbin";    when  (  local  result  =  Exec::run([$cmd=fmt(cmd,  rec$host)])  )        {        for  (  i  in  result$stdout  )            {            if  (  /Success/  in  result$stdout[i]  )                print  fmt("%s  is  vulnerable  to  MS12-­‐020",  rec$host);            }        }    }
  23. Offensive Defense 12 @load  base/utils/exec @load  policy/protocols/conn/known-­‐services event  log_known_services(rec:  Known::ServicesInfo)

       {    if  (  rec$port_num  !=  3389/tcp  )        return;    local  cmd  =  "/opt/nessus/bin/nasl  -­‐t  %s  "  +                            "/opt/nessus/lib/nessus/plugins/ms12-­‐020.nbin";    when  (  local  result  =  Exec::run([$cmd=fmt(cmd,  rec$host)])  )        {        for  (  i  in  result$stdout  )            {            if  (  /Success/  in  result$stdout[i]  )                print  fmt("%s  is  vulnerable  to  MS12-­‐020",  rec$host);            }        }    }
  24. Offensive Defense 12 @load  base/utils/exec @load  policy/protocols/conn/known-­‐services event  log_known_services(rec:  Known::ServicesInfo)

       {    if  (  rec$port_num  !=  3389/tcp  )        return;    local  cmd  =  "/opt/nessus/bin/nasl  -­‐t  %s  "  +                            "/opt/nessus/lib/nessus/plugins/ms12-­‐020.nbin";    when  (  local  result  =  Exec::run([$cmd=fmt(cmd,  rec$host)])  )        {        for  (  i  in  result$stdout  )            {            if  (  /Success/  in  result$stdout[i]  )                print  fmt("%s  is  vulnerable  to  MS12-­‐020",  rec$host);            }        }    }
  25. Offensive Defense 12 @load  base/utils/exec @load  policy/protocols/conn/known-­‐services event  log_known_services(rec:  Known::ServicesInfo)

       {    if  (  rec$port_num  !=  3389/tcp  )        return;    local  cmd  =  "/opt/nessus/bin/nasl  -­‐t  %s  "  +                            "/opt/nessus/lib/nessus/plugins/ms12-­‐020.nbin";    when  (  local  result  =  Exec::run([$cmd=fmt(cmd,  rec$host)])  )        {        for  (  i  in  result$stdout  )            {            if  (  /Success/  in  result$stdout[i]  )                print  fmt("%s  is  vulnerable  to  MS12-­‐020",  rec$host);            }        }    }
  26. Offensive Defense 12 @load  base/utils/exec @load  policy/protocols/conn/known-­‐services event  log_known_services(rec:  Known::ServicesInfo)

       {    if  (  rec$port_num  !=  3389/tcp  )        return;    local  cmd  =  "/opt/nessus/bin/nasl  -­‐t  %s  "  +                            "/opt/nessus/lib/nessus/plugins/ms12-­‐020.nbin";    when  (  local  result  =  Exec::run([$cmd=fmt(cmd,  rec$host)])  )        {        for  (  i  in  result$stdout  )            {            if  (  /Success/  in  result$stdout[i]  )                print  fmt("%s  is  vulnerable  to  MS12-­‐020",  rec$host);            }        }    }
  27. Emerging Malware • Team Cymru Malware Hash Registry out of

    the box • What about fresh malware? 13
  28. Emerging Malware • Team Cymru Malware Hash Registry out of

    the box • What about fresh malware? • Other files? PDFs, JARs, etc. 13
  29. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  30. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  31. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  32. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  33. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  34. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  35. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  36. @load  base/utils/exec @load  policy/frameworks/files/hash-­‐all-­‐files event  file_hash(f:  fa_file,  kind:  string,  hash:

     string)    {    if  (  kind  !=  "md5"  )  return;    local  url  =  "https://www.google.com/search\?tbm\=blg\&q\=%s";    local  user_agent  =  "\"Mozilla/5.0  (Macintosh;  Intel  Mac...  ”;    local  strip_crud  =  "  2>  /dev/null  |  tidy  |  grep  ...";    local  cmd  =  "curl  -­‐s  "  +  fmt(url,  hash)  +  "  -­‐A"  +  user_agent  +                            strip_crud  ;    when  (  local  results  =  Exec::run([$cmd=cmd])  )        {        for  (  i  in  result$stdout  )            {            if  (  /[mM]alware/  in  result$stdout[i]  )                print  “Danger,  danger!”;        }   } 14 To the Blogosphere!
  37. Protip: str_shell_escape ##  Takes  a  string  and  escapes  characters  

    ##  that  would  allow  execution  of                                                                                                                                                                                                                                                                                                                                                                                                                     ##  commands  at  the  shell  level. ## ##  Escapes:  `,  “  ,  \\,  $                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   function  str_shell_escape(source:  string):  string 15
  38. Friends of Exec - ActiveHTTP A module for performing HTTP

    requests and getting the reply. global  request:      function(req:  ActiveHTTP::Request):   ActiveHTTP::Response; Request:  url,  method,  client_data,                  max_time,  addl_curl_args Response:  code,  msg,  body,  headers 16
  39. Friends of Exec - ActiveHTTP A module for performing HTTP

    requests and getting the reply. global  request:      function(req:  ActiveHTTP::Request):   ActiveHTTP::Response; Request:  url,  method,  client_data,                  max_time,  addl_curl_args Response:  code,  msg,  body,  headers 16
  40. Friends of Exec - ActiveHTTP A module for performing HTTP

    requests and getting the reply. global  request:      function(req:  ActiveHTTP::Request):   ActiveHTTP::Response; Request:  url,  method,  client_data,                  max_time,  addl_curl_args Response:  code,  msg,  body,  headers 16
  41. Friends of Exec - ActiveHTTP A module for performing HTTP

    requests and getting the reply. global  request:      function(req:  ActiveHTTP::Request):   ActiveHTTP::Response; Request:  url,  method,  client_data,                  max_time,  addl_curl_args Response:  code,  msg,  body,  headers 16
  42. 17 Friends of Exec: Dir Register a directory to monitor

    with a callback that is called every time a previously unseen file is seen. global  monitor:  function(      dir:  string,        callback:  function(fname:  string),      poll_interval:  interval );
  43. 17 Friends of Exec: Dir Register a directory to monitor

    with a callback that is called every time a previously unseen file is seen. global  monitor:  function(      dir:  string,        callback:  function(fname:  string),      poll_interval:  interval );
  44. Someone sent their credentials over plaintext HTTP? See if those

    creds work to SSH into their system! 19 Fun with Bro!
  45. Someone sent their credentials over plaintext HTTP? See if those

    creds work to SSH into their system! Someone ran Windows Updates! Send them a pizza. (github.com/coryarcangel/Pizza- Party-0.1.b) 19 Fun with Bro!
  46. Someone sent their credentials over plaintext HTTP? See if those

    creds work to SSH into their system! Someone ran Windows Updates! Send them a pizza. (github.com/coryarcangel/Pizza- Party-0.1.b) Have Bro make phone calls. “Is your open recursive DNS server running?” 19 Fun with Bro!
  47. Someone sent their credentials over plaintext HTTP? See if those

    creds work to SSH into their system! Someone ran Windows Updates! Send them a pizza. (github.com/coryarcangel/Pizza- Party-0.1.b) Have Bro make phone calls. “Is your open recursive DNS server running?” >  net  send  win2k  The  21st  century  called... 19 Fun with Bro!