mirror of
https://github.com/aquasecurity/kube-hunter.git
synced 2026-08-23 22:26:23 +00:00
46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
import logging
|
|
import json
|
|
import requests
|
|
|
|
from kube_hunter.conf import get_config
|
|
from kube_hunter.core.types import Hunter, RemoteCodeExec, KubernetesCluster
|
|
from kube_hunter.core.events import handler
|
|
from kube_hunter.core.events.types import Vulnerability, Event
|
|
from kube_hunter.modules.discovery.dashboard import KubeDashboardEvent
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class DashboardExposed(Vulnerability, Event):
|
|
"""All operations on the cluster are exposed"""
|
|
|
|
def __init__(self, nodes):
|
|
Vulnerability.__init__(
|
|
self,
|
|
KubernetesCluster,
|
|
"Dashboard Exposed",
|
|
category=RemoteCodeExec,
|
|
vid="KHV029",
|
|
)
|
|
self.evidence = "nodes: {}".format(" ".join(nodes)) if nodes else None
|
|
|
|
|
|
@handler.subscribe(KubeDashboardEvent)
|
|
class KubeDashboard(Hunter):
|
|
"""Dashboard Hunting
|
|
Hunts open Dashboards, gets the type of nodes in the cluster
|
|
"""
|
|
|
|
def __init__(self, event):
|
|
self.event = event
|
|
|
|
def get_nodes(self):
|
|
config = get_config()
|
|
logger.debug("Passive hunter is attempting to get nodes types of the cluster")
|
|
r = requests.get(f"http://{self.event.host}:{self.event.port}/api/v1/node", timeout=config.network_timeout)
|
|
if r.status_code == 200 and "nodes" in r.text:
|
|
return [node["objectMeta"]["name"] for node in json.loads(r.text)["nodes"]]
|
|
|
|
def execute(self):
|
|
self.publish_event(DashboardExposed(nodes=self.get_nodes()))
|