-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathprocess_search_hunter.py
executable file
·84 lines (76 loc) · 3.54 KB
/
process_search_hunter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python
#
#The MIT License (MIT)
#
# Copyright (c) 2015 Bit9 + Carbon Black
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# -----------------------------------------------------------------------------
# The purpose of this script is to execute a large number of Cb Queries against
# a Cb server and only display back the queries that have a matching process
# ***Facets must be enabled and used in the query***
# by default Facets are enabled on Process Search Queries in Carbon Black
#
# last updated 2015-11-23
#
import sys
import struct
import socket
import json
from optparse import OptionParser
# in the github repo, cbapi is not in the example directory
sys.path.append('../src/cbapi')
from cbapi import CbApi
#this is the size of the data returned
pagesize=20
def build_cli_parser():
parser = OptionParser(usage="%prog [options]", description="Hunt a Carbon Black Server based on a list of queries")
# for each supported output type, add an option
parser.add_option("-c", "--cburl", action="store", default=None, dest="server",
help="CB server's URL. e.g., http://127.0.0.1 ")
parser.add_option("-a", "--apitoken", action="store", default=None, dest="token",
help="API Token for Carbon Black server")
parser.add_option("-f", "--searchfile", action="store", default=None, dest="procsearchfile",
help="File containing a line for each query you would like to run")
parser.add_option("-n", "--no-ssl-verify", action="store_false", default=True, dest="ssl_verify",
help="Do not verify server SSL certificate.")
return parser
def processsearchlist(procnamefile):
with open(procnamefile) as tmp:
lines = filter(None, [line.strip() for line in tmp])
return lines
parser = build_cli_parser()
opts, args = parser.parse_args(sys.argv[1:])
if not opts.server or not opts.token or not opts.procsearchfile:
print "Missing required param."
sys.exit(-1)
cb = CbApi(opts.server, ssl_verify=opts.ssl_verify, token=opts.token)
searchprocess = processsearchlist(opts.procsearchfile)
for search in searchprocess:
data = cb.process_search(search, rows=1)
if 0 != (data['total_results']):
print "------------------------------"
print "Search Query | %s" % (search)
print "Resulting Processes | %s" % (data['total_results'])
facet=data['facets']
hosts =[]
for term in facet['hostname']:
hosts.append("%s (%s%%)" % (term['name'], term['ratio']))
print "Resulting Hosts | "+"|".join(hosts)