Yesterday, we released binsnitch.py – a tool you can use to detect unwanted changes to the file sytem. The tool and documentation is available here: https://github.com/NVISO-BE/binsnitch.
Binsnitch can be used to detect silent (unwanted) changes to files on your system. It will scan a given directory recursively for files and keep track of any changes it detects, based on the SHA256 hash of the file. You have the option to either track executable files (based on a static list available in the source code), or all files.
Binsnitch.py can be used for a variety of use cases, including:
- Use binsnitch.py to create a baseline of trusted files for a workstation (golden image) and use it again later on to automatically generate a list of all modifications made to that system (for example caused by rogue executables installed by users, or dropped malware files). The baseline could also be used for other detection purposes later on (e.g., in a whitelist);
- Use binsnitch.py to automatically generate hashes of executables (or all files if you are feeling adventurous) in a certain directory (and its subdirectories);
- Use binsnitch.py during live malware analysis to carefully track which files are touched by malware (this is the topic of this blog post).
In this blog post, we will use binsnitch.py during the analysis of a malware sample (VirusTotal link:
A summary of options available at the time of writing in binsnitchy.py:
usage: binsnitch.py [-h] [-v] [-s] [-a] [-n] [-b] [-w] dir
dir the directory to monitor
-h, --help show this help message and exit
-v, --verbose increase output verbosity
-s, --singlepass do a single pass over all files
-a, --all keep track of all files, not only executables
-n, --new alert on new files too, not only on modified files
-b, --baseline do not generate alerts (useful to create baseline)
-w, --wipe start with a clean db.json and alerts.log file
We are going to use binsnitch.py to detect which files are created or modified by the sample. We start our analysis by creating a “baseline” of all the executable files in the system. We will then execute the malware and run binsnitch.py again to detect changes to disk.
Creating the baseline
Command to create the baseline of our entire system.
We only need a single pass of the file system to generate the clean baseline of our system (using the “-s” option). In addition, we are not interested in generating any alerts yet (again: we are merely generating a baseline here!), hence the “-b” option (baseline). Finally, we run with the “-w” argument to start with a clean database file.
After launching the command, binsnitch.py will start hashing all the executable files it discovers, and write the results to a folder called binsnitch_data. This can take a while, especially if you scan an entire drive (“C:/” in this case).
Baseline creation in progress … time to fetch some cheese in the meantime! 🐀 🧀
After the command has completed, we check the alerts file in “binsnitch_data/alerts.log”. As we ran with the “-b” command to generate a baseline, we don’t expect to see alerts:
Baseline successfully created! No alerts in the file, as we expected.
Looks good! The baseline was created in 7 minutes.
We are now ready to launch our malware and let it do its thing (of-course, we do this step in a fully isolated sandbox environment).
Running the malware sample and analyzing changes
Next, we run the malware sample. After that, we canrun binsnitch.py again to check which executable files have been created (or modified):
Scanning our system again to detect changes to disk performed by the sample.
We again use the “-s” flag to do a single pass of all executable files on the “C:/” drive. In addition, we also provide the “-n” flag: this ensures we are not only alerted on modified executable files, but also on new files that might have been created since the creation of the baseline. Don’t run using the “-w” flag this time, as this would wipe the baseline results. Optionally, you could also add the “-a” flag, which would track ALL files (not only executable files). If you do so, make sure your baseline is also created using the “-a” flag (otherwise, you will be facing a ton of alerts in the next step!).
Running the command above will again take a few minutes (in our example, it took 2 minutes to rescan the entire “C:/” drive for changes). The resulting alerts file (“binsnitch_data/alerts.log”) looks as following:
Bingo! We can clearly spot suspicious behaviour now observing the alerts.log file. 🔥
A few observations based on the above:
- The malware file itself was detected in “C:/malware”. This is normal of-course, since the malware file itself was not present in our baseline! However, we had to copy it in order to run it;
- A bunch of new files are detected in the “C:/Program Files(x86)/” folder;
- More suspicious though are the new executable files created in “C:/Users/admin/AppData/Local/Temp” and the startup folder.
The SHA256 hash of the newly created startup item is readily available in the alerts.log file: 8b030f151c855e24748a08c234cfd518d2bae6ac6075b544d775f93c4c0af2f3
Doing a quick VirusTotal search for this hash results in a clear “hit” confirming our suspicion that this sample is malicious (see below). The filename on VirusTotal also matches the filename of the executable created in the C:/Users/admin/AppData/Local/Temp folder (“A Bastard’s Tale.exe”).
VirusTotal confirms that the dropped file is malicious.
You can also dive deeper into the details of the scan by opening “binsnitch_data/data.json” (warning, this file can grow huge over time, especially when using the “-a” option!):
Details on the scanned files. In case a file is modified over time, the different hashes per file will be tracked here, too.
From here on, you would continue your investigation into the behaviour of the sample (network, services, memory, etc.) but this is outside the scope of this blog post.
We hope you find binsnitch.py useful during your own investigations and let us know on github if you have any suggestions for improvements, or if you want to contribute yourself!