Vimana is a modular security framework designed to audit Python web applications using different and sometimes uncommon approaches.
In the beginning, the main goal behind this framework was to act as a web fuzzer to identify Python exceptions. That was the core idea. Later it became just another feature that can be invoked by other siddhis or directly via command line with vimana run --plugin <plugin_name>
. In the current releases, there are available module types like:
- persistence
- crawlers
- trackers
- exploits
- fuzzers
- parses
- audit
Lately, Vimana is walking to its maturity while a Framework with a robust core to support modularization, various integrations, and post-analysis features to enrich security assessments. In addition, many new siddhis (vimana plugins) are consistently being researched and developed.
Vimana aims not to take a side as a defensive or offensive tool. Instead, the motivation here is to mix those both perspectives, allowing a software developer to audit their projects, for example, and give offensive, security engineer, and bug hunter folks a great resource to their arsenals.
With time, this project has revealed some promising capabilities to support security research related to Python Frameworks and applications, and it has recently been one of the current studies. In other words, research about how to support research goals. Quite meta-research stuff. I have no idea where it goes, but I've some clues, and it is worth it.
Follow the installation guide to get started with Vimana. After finishing the setup successfully, your terminal should look like this:
˙ ٭ . ˖ . :. * : └┐'┌┘ . : . └┐// ' \\┌┘ ¨⣠⠛⠛⠛⠛⠛---=======---⠛⠛⠛⠛⠛⣄ .' .::::__\├ ┤/⠛⠛⣄⣇⣷\├ ┤/__::::. '-'\_____/'-' v0.8 ⣄ :: '│.│.│' . about ◍◍ About the framework flush ◍◉ Remove a recorded resource guide ◎◎ Show plugin usage examples and args info ◉◉ Show information about plugins list ◎◍ List available plugins load ◉◎ Load a recorded session (post-analysis) run ◉◉ Run a resource, plugin or case start ◉◎ Start Vimana in a interactive mode (vimana_env) ➟
At this point, if you try to run a plugin, you're going to see the following:
* `'´ * ˙ ٭. ˖ __'__'__ , ˖ `''´ ˙ ٭ . ˖ -o- ' .* o . * o ˖ | . -O- `ç´ . | * ' . -0- * o . ' * . ˖ ˖ You haven't populated the database yet. Please run the following to fix it: vimana load --plugins
With that, you have the framework itself ready. The last step is to load Vimana plugins. You can do this by running:
$ vimana load --plugins ˙ ٭ . ˖ . :. * : └┐'┌┘ . : . └┐// ' \\┌┘ ¨⣠⠛⠛⠛⠛⠛---=======---⠛⠛⠛⠛⠛⣄ .' .::::__\├ ┤/⠛⠛⣄⣇⣷\├ ┤/__::::. '-'\_____/'-' v0.8 ⣄ :: '│.│.│' . ⠞⠓⠊⠎ Abducting dmt: Django Misconfiguration Tracker ...
It will register all vimana plugins. At the end of this process, the framework will show a table with all available modules loaded:
þ * `'´ * ˙ ٭. ˖ __'__'__ , ˖ `''´ ˙ ٭ . ˖ -o- ' .* o . * o ˖ | . -O- `ç´ . | * ' . -0- * o . ' * . ˖ ˖ +---------------------------------------------------------------------------------------------------------+ | siddhis | +----------+-------------+-----------+--------------------------------------------------------------------+ | Name | Type | Category | Info | +----------+-------------+-----------+--------------------------------------------------------------------+ | djunch | fuzzer | framework | application fuzzer for django framework | | 2pacx | exploit | package | remote code execution via insecure file extraction | | prana | tracker | framework | utility to retrieve cve ids from the official django security page | | dmt | tracker | framework | tracks and exploits misconfigurations in django applications | | flame | parser | framework | traceback parser for flask applications | | sttinger | fingerprint | framework | identify the framework version in a passive way | | jungle | audit | framework | brute force utility to audit django administration portal | | viwec | crawler | discovery | simple web crawler utility | | atlatl | persistence | framework | capture, authenticate, and persist flask debug console sessions. | | viewscan | audit | framework | simple static analysis utility for django views | | tictrac | tracker | framework | track bug tickets in django ticket system | +----------+-------------+-----------+--------------------------------------------------------------------+
Done that, you can get information about what a vimana module is about by running vimana info
, for example, with 2pacx module, an exploit one you'll do
$ vimana info --module 2pacx Name 2pacx Author s4dhu <s4dhul4bs[at]prontonmail[dot]ch Info Remote code execution via insecure file extraction Category package Framework generic Package zipfile Type exploit Tags Path Traversal,Zipfile CWE 22,73 The vulnerability occurs when a zipped file is sent to a Python application that uses the zipfile.ZipInfo() method from the zipfile[1] library to obtain the information necessary to perform the server side extraction. In this scenario, an attacker can manipulate a specially created .zip file, in which the filename (fileinfo.filename) is configured, via path traversal (eg: '../config/__init__.py'), by setting an arbitrary location for record the contents of the malicious zip file[2][3]. The goal of the exploit is to subscribe to the content of some __init__.py file (zipfile.ZipInfo.writestr()) within any directory of the exploited application. Note that there are numerous particularities necessary for this flaw to be exploited, one of which is the fact that the payload sent will only be executed immediately in cases where the Python application (Flask/Django) is running with DEBUG true, otherwise the payload will only be triggered when the server restarts. Another important point is that it is necessary that the directory specified in the filename of the sent zip exists on the server with an __init__.py file. References https://docs.python.org/2/library/zipfile.html#zipfile.ZipInfo https://ajinabraham.com/blog/exploiting-insecure-file-extraction-in-python-for-code-execution https://github.com/MobSF/Mobile-Security-Framework-MobSF/issues/358
In version 0.7 was introduced a new command to guide usage, modules required arguments, usage examples, and tips to set up a lab for tests.
You can see the help for this new command by just typing:
$ vimana guide ˙ ٭ . ˖ . :. * : └┐'┌┘ . : . └┐// ' \\┌┘ ¨⣠⠛⠛⠛⠛⠛---=======---⠛⠛⠛⠛⠛⣄ .' .::::__\├ ┤/⠛⠛⣄⣇⣷\├ ┤/__::::. '-'\_____/'-' v0.8 ⣄ :: '│.│.│' . [guide] Show usage examples → Usage: vimana guide --module <module name> <options> Examples: # Show full DMT plugin guide $ vimana guide --module dmt $ vimana guide -m dmt # Show DMT plugin arguments $ vimana guide --module DMT -args $ vimana guide -m dmt -a # Show only usage examples $ vimana guide --module dmt --examples $ vimana guide -m dmt -e # Show lab setup tips: $ vimana guide -m dmt --labs $ vimana guide -m dmt -l
This command is responsible for guiding you through usage, options, and tips to get started.
$ vimana guide --module dmt --args ø----------------------------------------------------------------------ø │└┐└│└┘┌┐│└└┘┌┐┘└┘└┐└┘│└┐┘││└┘│- DMT ARGS ┐│││││├┤┘│││┤└┘││└┐└┘│┌┌┐└│┐ ø-----------+----------------------------------------------------------ø │ target └┐ │ +------------+---------------------------------------------------------+ --target Run DMT against a single target --target-list Run DMT against a target list (comma separated) --file Run DMT loading scope from a file +-----------+----------------------------------------------------------+ │ port └┐ │ +------------+---------------------------------------------------------+ --port Setting a single port for the target --port-list Setting a port-list (comma separated) --port-range Setting a range of ports for each target --ignore-state Ignore port status checks +-----------+----------------------------------------------------------+ │ autoload └┐ │ +------------+---------------------------------------------------------+ --nmap-xml Load the scope from nmap xml file --docker-scope Load the scope from Docker environment +-----------+----------------------------------------------------------+ │ modes └┐ │ +------------+---------------------------------------------------------+ --extended-scope Run DMT in sample mode with extended scope --exit-on-trigger Run in default mode exiting on first exception --sample Run DMT in silent sample mode +-----------+----------------------------------------------------------+ │ options └┐ │ +------------+---------------------------------------------------------+ --save-session Save analysis results as a interactive session --verbose Enable verbosity (not enabled in sample mode) --debug Enable debug messages (not enabled in sample mode) --auto Enable auto-confirmation (default on sample mode) * You can also see some examples with `vimana guide -m DMT -e`
$ vimana guide -m dmt --examples ø----------------------------------------------------------------------ø ⠞⠓⠊⠎:⠞⠓⠎⠞⠎-⠞⠊⠞⠓~⠊⠎⠞⠓⠊⠎└┐ DMT GUIDE ⠞⠓⠊⠎.~⠞⠎⠞⠓⠊⠓⠊::::::⠞⠓⠊-⠞⠓⠊⠎ ø---------------------└┘-----------------------------------------------ø Run DMT in (default) analytical mode (all occurrences) against a specific target and port, enabling debug mode: $ vimana run -m dmt -t djapp1.vmnf.com -p 8000 --debug ø----------------------------------------------------------------------ø Run DMT against a list of targets on a specific port with sample mode enabled. This mode will suppress all debug or verbose messages focused on triggering just one exception. It aims to be fast once we're looking for a single sample instead of analytical mode (default), which looks for all unique occurrences: $ vimana run \ --module dmt \ --target-list 127.0.0.1, 192.168.1.161 \ --port 9001 \ --sample ø----------------------------------------------------------------------ø Creating a case setting DMT against a list of targets and ports enabling auto-confirmation, verbose and running the case with name 'djapps': $ vimana run \ --module dmt \ --target-list 127.0.0.1, 192.168.1.161, djapp1.vmnf.com\ --port-list 8888,9001,8000,5001 \ --verbose \ --auto \ --save-case djapps \ --exec-case ø----------------------------------------------------------------------ø
$ vimana guide -m dmt --labs ø----------------------------------------------------------------------ø │└┘⠞⠓┌┐│└⠞⠓└┘┌⠞⠓┐┌┘.┌⠞⠓┬┐.└┐┘│ LAB SETUP ┘└┐│.└┘.┌┐│⠞⠓│┬.│⠞└┘┌┬┐└┐┌.│ ø----------------------------------------------------------------------ø Even though there are many ways to test DMT, I encourage you to set up a test environment using some Django open-source projects available on GitHub. Also, you can easily find many interesting images on Docker Hub to run DMT against it. Check it out: https://hub.docker.com If you're running DMT for the first time, I recommend using this purposefully vulnerable Django application provided by nVisium: https://github.com/nVisium/django.nV You can simply follow the steps bellow to setup a test env using django.nV: $ git clone https://github.com/nVisium/django.nV.git $ export PYTHONPATH="/usr/local/lib/python3.4/site-packages" $ virtualenv -p python3 ~/django.nV_venv $ source ~/django.nV_venv/bin/activate $ cd django.nV $ pip install -r requirements.txt $ ./reset_db.sh $ ./runapp.sh In another terminal start DMT with debug and save-session enabled: $ vimana run \ --module dmt \ --target localhost \ --port 8000 \ --debug \ --save-session In case you have not set Vimana using set_env script: $ python3 vimana.py run \ --module dmt \ --target localhost \ --port 8000 \ --debug * args: `vimana guide -m dmt -a`
Resource | Type | Category | Focus | Status |
---|---|---|---|---|
caiman | Plugin | Exploitation/Scanner | SSTI | 🧙♂️ In progress... |
vfte | Templates | Template engine | Python CVEs | 🕸️ Designing... |
d4m8 | Plugin | Fuzzer | PyApps Forms | 👾: Done! |
engine | Framework | Plugins | Refactory | 👾: Done! |
guides | Framework | Plugins | Docs | 👾: Done! |