Jiraffe 🦒

January 7, 2026 · View on GitHub

Jiraffe
Jiraffe 🦒 - One stop place for Jira security reconnaissance and exploitation in your proximity

Installation    |    Usage    |    Demo    |    Documentation

Jiraffe is a modern Jira security reconnaissance & exploitation framework for identifying misconfigurations, exposed APIs, and vulnerable components in Atlassian Jira deployments.

Built for security professionals who care about correctness, signal quality, and clean architecture.

Features

Jiraffe is a semi-automatic security assessment framework designed for real-world Jira deployments.

Highlights

  • Modular recon & exploit framework
  • Passive reconnaissance modules (unauthenticated access checks, information disclosure, and misconfiguration detection)
  • CVE validation with safe defaults and compatibility gating
  • Interactive & automatic execution mode with AWS SSRF helpers (metadata, IAM, custom targets)
  • Jira version & deployment detection
  • Cloud vs Server/DC awareness to avoid invalid or misleading checks
  • Structured JSON output for scripting and CI pipelines

Jiraffe follows a recon-first, exploit-second model with strict separation between discovery and exploitation, keeping assessments accurate and controlled.

A modular design and low-noise defaults ensure extensibility without automatic shell execution or intrusive behavior.

This makes Jiraffe suitable for:

  • Bug bounty reconnaissance
  • Internal security assessments
  • Red team tooling
  • Responsible vulnerability validation

Installation

Use pip to install Jiraffe. This is the recommended way of running Jiraffe.

$ pip install jiraffe

or, installing from the source by running

# clone the repo
$ git clone https://github.com/0x48piraj/jiraffe.git

# change the working directory to jiraffe
$ cd jiraffe

# install the jiraffe python package
$ python3 setup.py install --user
# or, the modern way
$ python3 -m pip install .

Usage

$ python3 -m jiraffe --help

usage: jiraffe [-h] [-t https://jira.company.com]


                                                                           /)/)
                                                                          ( ..\
      ___  __      _______        __       _______   _______   _______    /'-._)
     |   ||  \    /       \      /  \     /       | /       | /       |  /#/ v2.2.0
     ||  |||  |  |:        |    /    \   (: ______)(: ______)(: ______) /#/  @03C0
     |:  ||:  |  |_____/   )   /' /\  \   \/    |   \/    |   \/    |
  ___|  / |.  |   //      /   //  __'  \  // ___)   // ___)   // ___)_
 /  :|_/ )/\  |\ |:  __   \  /   /  \\  \(:  (     (:  (     (:       |
(_______/(__\_|_)|__|  \___)(___/    \___)\__/      \__/      \_______)


optional arguments:
  -h, --help            show this help message and exit
  -t https://jira.company.com, --target https://jira.company.com
                        Target Jira instance URL
  -a, --auto            Automatic mode
  --check-only, --dry-run
                        Only check for vulnerabilities, do not run exploits
  --list-exploits
  --cmd CMD             Command for CVE-2019-11581
  --ssrf SSRF           SSRF target URL
  --user-agent USER_AGENT
                        Custom User-Agent header
  --severity {LOW,MEDIUM,HIGH,CRITICAL,INFO}
                        Run only exploits of this severity
  --json                Output results in JSON format (for automation / scripting)
  --insecure            Disable TLS certificate verification (allow self-signed HTTPS)
  -v, --verbose         Enable verbose output (debug information)

$ python3 -m jiraffe -t https://jira.example.com
$ python3 -m jiraffe -t https://jira.example.com --auto
$ python3 -m jiraffe --list-exploits

Documentation

Detailed documentation is available over the wiki, including:

Recon modules

ModuleSeveritySummary
Jira Dev Mode EnabledLOWDetects whether Jira development mode is enabled, which may expose debug functionality
Query Component Field DisclosureLOWIdentifies exposed Query Component fields accessible without authentication
Service Desk Signup EnabledMEDIUMChecks for publicly accessible Service Desk signup that may allow unauthorized account creation
Unauthenticated Admin MenuINFODetects presence of the admin menu without authentication
Unauthenticated DashboardsINFOEnumerates dashboards accessible without authentication
Unauthenticated Gadget ConfigurationLOWIdentifies exposed gadget configuration endpoints
Unauthenticated Group PickerINFOChecks for unauthenticated access to group picker functionality
Unauthenticated Popular FiltersINFOEnumerates popular filters accessible without authentication
Unauthenticated Project CategoriesLOWIdentifies exposed project categories via unauthenticated access
Unauthenticated Projects APILOWEnumerates projects using the unauthenticated Projects API
Unauthenticated Resolutions APIINFODetects unauthenticated access to issue resolutions
Unauthenticated Screens APILOWIdentifies exposed Screens API endpoints
Unauthenticated User PickerINFOChecks for unauthenticated access to user picker functionality
User Registration EnabledMEDIUMDetects whether unauthenticated user self‑registration is enabled

Supported vulnerabilities

CVESeverityAffectedSummaryReferences
CVE-2017-9506HIGH< 7.3.5OAuth IconUriServlet SSRF leading to internal network access and XSSNVD · Atlassian
CVE-2018-20824HIGH-Wallboard dashboard XSSNVD
CVE-2018-5230HIGH-Reflected XSS via Velocity template (.vm)NVD
CVE-2019-11581CRITICAL< 7.6.14Velocity template injection leading to remote code execution (RCE)NVD · Atlassian
CVE-2019-3396CRITICAL-Tinymce macro read-only path traversalNVD
CVE-2019-3402HIGH-Labels gadget XSSNVD
CVE-2019-3403LOW-Unauthenticated REST user enumerationNVD
CVE-2019-8442LOW-Jira Maven POM.xml disclosureNVD
CVE-2019-8443LOW-Jira Maven POM.xml disclosure via alternate pathNVD
CVE-2019-8449LOW2.1 - 8.3.4Unauthenticated username enumeration via GroupUserPicker APINVD · Atlassian
CVE-2019-8451HIGH>=7.6.0,<7.13.9 and >=8.0.0,<8.4.0Pre-authenticated SSRF via gadgets makeRequestNVD · Atlassian
CVE-2020-14178LOW-Unauthenticated project existence disclosureNVD
CVE-2020-14179LOW-QueryComponent disclosure via QueryComponent!Default.jspa resourceNVD
CVE-2020-14181LOW-User hover disclosure via ViewUserHover.jspa resourceNVD
CVE-2020-36287LOW-Gadget preferences brute-force disclosureNVD
CVE-2020-36289MEDIUM-QueryComponentRendererValue information disclosureNVD
CVE-2019-11581: Server-side Template Injection (RCE)

POC

Component(s)

  • ContactAdministrators action
  • SendBulkMail action
  • Velocity template rendering pipeline

Vulnerability Class

  • Server-Side Template Injection (SSTI)

Impact

  • Remote Code Execution (RCE)

Attack Surface

  • Unauthenticated (when Contact Administrators form is enabled)
  • Authenticated (JIRA Administrators role required if form is disabled)

Exploitation Preconditions
At least one of the following must be true:

  • An SMTP server is configured and the Contact Administrators form is enabled
  • An SMTP server is configured and the attacker has JIRA Administrators privileges

Root Cause

  • Unsafe evaluation of user-controlled input within Velocity templates
  • Insufficient input sanitization prior to template execution

Affected Versions

  • Jira Server / Data Center 4.4.0 ≤ version < 7.6.14
  • Jira Server / Data Center 7.7.0 ≤ version < 7.13.5
  • Jira Server / Data Center 8.0.0 ≤ version < 8.0.3
  • Jira Server / Data Center 8.1.0 ≤ version < 8.1.2
  • Jira Server / Data Center 8.2.0 ≤ version < 8.2.3

Fixed Versions

  • 7.6.14 (LTS)
  • 7.13.5 (LTS)
  • 8.0.3
  • 8.1.2
  • 8.2.3
  • 8.3.0+

Severity

  • Critical (CVSS High)

Notes
Successful exploitation allows arbitrary code execution on the Jira application host, resulting in full system compromise.

Reference

  • Atlassian Advisory: JRASERVER-69532

Majority of the bugs stated above poses Server-Side Request Forgery (SSRF) vulnerability, where attacker can abuse a specific functionality on the server to read or update internal resources. The attacker can supply or a modify a URL which the code running on the server will read or submit data to, and by carefully selecting the URLs, the attacker may be able to read server configuration such as AWS metadata, connect to internal services like HTTP enabled databases or perform post requests towards internal services which are not intended to be exposed.

Currently, some of the common Amazon AWS credentials leak attacks are present with an additional Custom Payload Option for sending crafted payloads for any cloud platform (Amazon AWS, Google Cloud, etc.). For sending custom payloads, take help from PayloadsAllTheThings — SSRF URL for Cloud Instances. Feel free to implement more post exploitation modules for vendor specifc deployments. For looking under the hood, read wiki.

Reconnaissance modules

In addition to exploits, Jiraffe includes a modular reconnaissance (auxiliary) framework for structured information gathering and weak-signal detection.

Recon modules are non-exploit checks designed to identify conditions that may enable or influence exploitation, without actively attacking the target.

What recon modules cover

Recon modules typically fall into one of the following categories:

  • Unauthenticated access checks:
    Endpoints or resources accessible without authentication.

  • Information disclosure:
    Version leaks, configuration exposure, banners, metadata, or other passive signals.

  • Misconfiguration / weak settings:
    Insecure defaults, exposed services, or deployment weaknesses.

Architecture

Recon modules live under:

jiraffe/recons/

Each module is implemented as a subclass of ReconModule, providing a consistent interface and lifecycle similar to exploit modules, while remaining strictly separated from exploitation logic.

This auxiliary-style design allows reconnaissance to scale independently, reusing the same modular discovery model as exploits without coupling reconnaissance to exploitation.

Contributing recon modules

Adding a new recon module is simple:

  1. Create a new Python file under jiraffe/recons/
  2. Implement a subclass of ReconModule
  3. Define metadata (name, severity, description)
  4. Implement the run() method

No changes to core logic or registries are required — modules are discovered dynamically at runtime.

This makes it easy to contribute new reconnaissance checks without impacting existing exploits or execution flow.

Demonstration

Below is a typical Jiraffe workflow showing target detection, reconnaissance, and controlled exploit validation.

Jiraffe Demo

Tests

The tests are next to the package i.e. tests are not part of the package, only of the repository. The reason is simply to keep the package small.

Running the unit tests

$ python3 -m unittest --verbose # Python 3 and up

Legalese

Jiraffe is intended for authorized security testing and defensive research. Only assess systems you own or have explicit permission to test. The project follows responsible disclosure principles and aims to improve the overall security posture of Jira deployments.

This project is a personal development. Please respect it's philosophy and don't use it for evil purposes. By using Jiraffe, you agree to the MIT license included in the repository. For more details at The MIT License — OpenSource.

Using Jiraffe for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program.

Licensing

This project is licensed under the MIT license.