A minimal, consistent API for building integrations with malware sandboxes.
This library currently supports the following sandbox systems:
- Cuckoo Sandbox
- FireEye AX Series
- Joe Sandbox
- VMRay Analyzer
- Falcon Sandbox (Formerly VxStream)
It provides at least the following methods for each sandbox:
is_available()
: Check if the sandbox is operable and reachable; returns a booleananalyze(handle, filename)
: Submit a file for analysis; returns anitem_id
check(item_id)
: Check if analysis has completed for a file; returns a booleanreport(item_id, report_format='json')
: Retrieve the report for a submitted filescore(report)
: Parse out and return an integer score from the report object
Some sandbox classes may have additional methods implemented. See inline documentation for more details.
Note that the value returned from the score
method may be on the range
0-10, or 0-100, depending on the sandbox in question, so you should refer to
the specific sandbox's documentation when interpreting this value.
Install through pip:
pip install sandboxapi
Supports Python 2.7+.
Basic usage is as follows:
import sys
import time
import pprint
from sandboxapi import cuckoo
# connect to the sandbox
sandbox = cuckoo.CuckooAPI('http://192.168.0.20:8090/')
# verify connectivity
if not sandbox.is_available():
print("sandbox is down, exiting")
sys.exit(1)
# submit a file
with open('myfile.exe', "rb") as handle:
file_id = sandbox.analyze(handle, 'myfile.exe')
print("file {f} submitted for analysis, id {i}".format(f=filename, i=file_id))
# wait for the analysis to complete
while not sandbox.check(file_id):
print("not done yet, sleeping 10 seconds...")
time.sleep(10)
# print the report
print("analysis complete. fetching report...")
report = sandbox.report(file_id)
pprint.pprint(report)
print("Score: {score}".format(score=sandbox.score(report)))
Since the library provides a consistent API, you can treat all sandoxes the same way:
import sys
import time
import pprint
from sandboxapi import cuckoo, fireeye, joe
# connect to the sandbox
sandboxes = [
cuckoo.CuckooAPI('http://192.168.0.20:8090/'),
fireeye.FireEyeAPI('myusername', 'mypassword', 'https://192.168.0.21', 'winxp-sp3'),
joe.JoeAPI('mykey', 'https://jbxcloud.joesecurity.org/api', True)
]
for sandbox in sandboxes:
# verify connectivity
if not sandbox.is_available():
print("sandbox is down, exiting")
sys.exit(1)
# submit a file
with open('myfile.exe', "rb") as handle:
file_id = sandbox.analyze(handle, 'myfile.exe')
print("file {f} submitted for analysis, id {i}".format(f=filename, i=file_id))
# wait for the analysis to complete
while not sandbox.check(file_id):
print("not done yet, sleeping 10 seconds...")
time.sleep(10)
# print the report
print("analysis complete. fetching report...")
report = sandbox.report(file_id)
pprint.pprint(report)
print("Score: {score}".format(score=sandbox.score(report)))
Constructor signature:
CuckooAPI(url, verify_ssl=False)
Example:
CuckooAPI('http://192.168.0.20:8090/')
This library attempts to support any Cuckoo-like API, including older 1.x
installations (though those without a score won't be able to use the .score
method), compatible forks like spender-sandbox and CAPE, and the latest 2.x
Cuckoo releases. If you find a version that doesn't work, let us know.
There is an unofficial Cuckoo library written by @keithjjones with much more functionality. For more information on the Cuckoo API, see the Cuckoo API documentation.
Constructor signature:
FireEyeAPI(username, password, url, profile, verify_ssl=True)
Example:
FireEyeAPI('myusername', 'mypassword', 'https://192.168.0.20', 'winxp-sp3')
There is some limited FireEye API documentation on their blog. For more information on FireEye's sandbox systems, see the AX Series product page.
Constructor signature:
JoeAPI(apikey, apiurl, accept_tac, timeout=None, verify_ssl=True, retries=3)
Example:
JoeAPI('mykey', 'https://jbxcloud.joesecurity.org/api', True)
There is an official Joe Sandbox library with much more functionality.
This library is installed as a dependency of sandboxapi, and wrapped by the
sandboxapi.joe.JoeSandbox
class.
Constructor signature:
VMRayAPI(api_key, url='https://cloud.vmray.com', verify_ssl=True)
Example:
VMRayAPI('mykey')
VMRay customers have access to a Python library with much more functionality. Check your VMRay documentation for more details.
Constructor signature:
FalconAPI(key, url='https://www.reverse.it/api/v2', env=100)
Example:
FalconAPI('mykey')
This class only supports version 2.0+ of the Falcon API, which is available in version 8.0.0+ of the Falcon Sandbox.
There is an official Falcon library with much more functionality, that supports the current and older versions of the Falcon API. Note that the official library only supports Python 3.4+.
You may also be interested in malsub, a similar project with support for a number of online analysis services.