云安全入门
作者打算在接下来的两个月内学习云安全,会将进度更新到这里,也会新建一个专栏,以后可能更多更新云安全和ai开发相关的话题,ctf不知道啥时候有空再玩玩吧。然后以下内容仅是我个人学习过程和思路,如有冲突或者与事实不符的地方请以事实为准,仅代表个人意见,各位理性观看。
从底层到云
我们先来回顾一下正常安全的攻击思路:从外到内分别是:三件套自带的漏洞(XSS等)、框架漏洞、服务供应漏洞(目录穿越等)、中间件漏洞、数据库漏洞(SQL注入等)、后台配置漏洞(文件上传、ssrf、csrf等),然后是拿到webshell之后的提权、内网提权渗透维权等。
那么云安全有什么不一样呢?按照我的理解,云安全完全重构了传统安全的流程,减少了很多中间流程的同时极大提高了攻击的难度。我们先来看看云安全的三板斧:云计算、云原生、云服务。
云服务
云服务是一种通过互联网提供计算资源、存储、数据库、应用程序及其他服务的模式。这些服务通常由第三方云服务提供商管理和维护,用户可以根据需要按需订阅和使用这些服务,而无需自行购买、安装和维护昂贵的硬件设备。云服务通常提供灵活、可扩展和弹性的计算资源,使用户能够更高效地管理和利用IT资源,同时降低了成本和技术管理的复杂性。常见的云服务包括IaaS(基础设施即服务)、PaaS(平台即服务)和SaaS(软件即服务)等不同层次和形式的服务模型。
比如向亚马逊的平台租借CPU、GPU等显卡算力资源,能从大量可伸缩性系统资源池中按照用户需求为用户提供服务,而不需要用户自己使用专门的物理显卡和配置。也就是说,云计算就是别人自身有大规模的显卡算力集提供给你使用,用户不是买真实的物理显卡,而是购买使用权限。就好比买百度网盘的会员,腾讯视频的VIP一样。
1、LaaS(基础设施即服务)
这是云计算服务中最底层的提供方式,LaaS公司提供基础的服务器、显卡等算力资源服务,用户可以选择在任何时间任何地点调用这些配置好的服务资源进行操作,而不用承担维护和运输等成本。现存市面上知名的公司有IBM,CSC,亚马逊等,我上面提到的从亚马逊处租用显卡也是LaaS的一种。
但是这种模式只是提供底层物理硬件,用户租用之后仍需要在此基础上搭建自己的操作系统,应用软件,开放端口等,就是传统安全中的物理层安全被LaaS公司承担了,其他安全仍然由用户承担。
2、PaaS(平台即服务)
PaaS(Platform as a Service)即平台即服务,是云计算服务模式之一。PaaS提供了一个完整的开发和部署环境,使开发人员可以通过互联网来构建、运行和管理应用程序,无需购买和维护基础设施。PaaS通常包括开发工具、数据库管理系统、操作系统和服务等,开发人员可以借助这些工具快速开发应用程序并将其部署到云端。通过PaaS,开发人员可以更便捷地进行应用程序的开发、测试、部署和扩展,提高了开发效率和灵活性,降低了开发成本和风险。
与LaaS的区别就是PaaS公司提供了成熟的操作系统和数据库等基础调用资源,用户在租用后仅需在上面搭建自己的应用程序就可以,将操作系统等板块的漏洞进一步上交到公司进行处理。
一些知名的PaaS提供商包括百度云、阿里云、腾讯云等众多国内云平台,他们就是PaaS的交付模式。
3、SaaS(软件即服务)
SaaS是Software as a Service(软件即服务)的缩写,是一种云计算服务模型,通过互联网提供软件应用程序,用户可以通过订阅方式使用软件,而无需购买、安装和维护软件本身。SaaS模式下,软件供应商负责软件的部署、维护、更新和安全性,用户只需通过互联网访问软件即可实现各种业务需求。SaaS通常以按需订阅的形式提供,用户可以根据实际需求随时调整订阅规模。SaaS模式能够降低用户的IT成本,提高企业的运营效率和灵活性。
SaaS通常设计为针对小白用户的应用,通过一键订阅功能,SaaS公司负责所有应用的开发,应用,维护和技术支持需求,用户只需要点点点就好了。就之前口罩时期很火的zoom,就是SaaS的交付方式,通过一键安装应用订阅,就可以享受视频共享及多主机协作功能,用户无需懂得终端服务器应该怎么配置,直接享受结果就好。国外比较火的则是Google Workspace:谷歌提供的一套云端办公应用套件。
4、Faas(函数即服务)
FaaS,即函数即服务,在这种模型中,开发者可以编写并部署函数(即代码段),而无需关注底层的服务器管理。在FaaS中,函数会被云平台自动触发执行,通常以事件驱动的方式来实现。开发者只需关注编写函数逻辑和业务代码,而具体的基础设施管理和伸缩性等工作则由云服务提供商来处理。FaaS可帮助开发者快速部署和扩展应用,同时节省了运维成本和管理复杂性。
不知道师傅们有没有刷过力扣,这个就像是力扣刷题时的解释器,无需在本地配置语言环境和数据库等基础程序,直接输入函数即可通过云平台在力扣服务器上运行并自动填入数字和输出来验证算法可行性。
(其实以上是根据公司管理的从少到多进行排序的,我觉得就按照使用者的适配范围来说,SaaS适合于所有小白用户使用,而FaaS适合有一定代码基础的师傅,有自己的拓展需求进行使用)
云计算
云计算是一种基于互联网的计算模式,通过将计算任务和数据存储在远程的服务器上,用户可以通过互联网按需访问和使用计算资源。云计算提供了一种灵活、可扩展和按需的计算资源管理方式,同时降低了用户购买和维护硬件设备的成本和复杂性。云计算可以根据用户需求提供计算能力、存储空间、数据库服务和应用程序等多种服务,用户可以根据实际需求灵活选择和调整所使用的资源,以实现更高效的IT资源管理和利用。常见的云计算服务模型包括公有云、私有云、混合云和多云环境等不同类型的部署方式和管理模式。
顾名思义,能看懂我上面说的内外网的师傅应该能明白,公有云就是共享到外网上可供所有人访问的云资源,私有云就是类似内网资源,只有获取到一定权限的用户才有资格进行访问;混合云就是一部分服务是放在外网公开的,剩下大部分服务是放在私有云中不能随意访问,就像是获取webshell之后要横向获取内网进入权限一样。
社区云就比较特殊:是为了满足金融、保险等行业的需求而专门开发的一种云平台,用于提供集成的特殊社区服务。
云原生
云原生是一种软件开发和部署方法论,旨在充分利用云计算架构和服务以实现高效、可扩展、可靠的应用程序开发和部署。云原生应用程序是专门为在云环境中构建和运行而设计的,充分利用云基础设施的动态性、弹性和自动化特性。
云原生应用程序通常遵循以下几个核心原则:
- 微服务架构:应用程序被拆分为小型、独立的服务,每个服务专注于执行特定的功能。
- 容器化部署:使用容器技术(如Docker)打包应用程序和其所有依赖项,实现跨平台、易于部署和管理。
- 自动化运维:通过自动化工具和流程实现应用程序的部署、扩展、监控和更新,减少人工干预和运维成本。
- 持续交付:采用持续集成和持续部署(CI/CD)实践,实现快速、频繁地交付新功能和修复漏洞。
云原生将传统的软件开发和部署模式转变为更灵活、敏捷和高效的方式,使开发团队能够更快地响应市场需求和提供更优质的用户体验。通过云原生架构,企业能够更好地利用云计算技术和云服务,从而实现业务的快速创新和增长。
云安全的原理及攻击面
说了这么多,那么我提到的云安全跟传统安全原理有什么不同吗?
云安全的几种主要攻防方式包括:
-
加密:使用数据加密技术对数据进行保护,包括数据传输加密和数据存储加密,确保数据在传输和储存过程中不被恶意窃取或篡改。
-
访问控制:通过身份验证、授权和审计等措施管理用户对云资源的访问权限,限制未经授权的访问,防止恶意用户或程序入侵系统。
-
安全监控与日志分析:监控云环境中的异常活动、安全事件和安全威胁,及时发现并应对潜在的安全风险。
-
漏洞管理:定期进行漏洞扫描和安全评估,修补系统漏洞,及时升级补丁,防止因系统漏洞而遭受攻击。
-
安全培训与意识提升:加强员工和用户的安全意识,提供专业的安全培训,教育用户如何防范网络钓鱼、恶意软件等网络攻击。
云安全将传统安全领域的各大版块集中到各云提供公司手里,极大提高了这个漏洞爆出的难度。这就是我说了几乎重构的安全攻击面的原因。比如说我之前打过的大模型RCE,就算实现了rce,因为处于docker环境下无法进行docker逃逸,使得本来危害程度很高的rce变得没什么危害。现在云安全所遇见的常见问题有配置不当,账户劫持,未授权接口,硬编码,所部署服务漏洞等导致云上凭证泄露。
相信很多师傅都发现过类似的aksk,知道这个能调用oss储存桶,但是aksk还能有其他利用方式,通过小脚本或者企业自带的SDK可以实现更丰富的利用链。
云原生安全--docker逃逸
上文不是提到了docker逃逸失败嘛,所以世面常见的除了aksk利用之外,就是docker逃逸技术了。
Docker是一种轻量级的容器化技术,通过利用操作系统级虚拟化技术,允许开发人员在单个主机上独立运行多个应用程序实例。Docker利用容器来打包应用程序及其依赖项,提供了一种快速、可移植和自包含的部署解决方案。
在Docker技术中,每个容器都是一个独立的运行时实例,具有自己的文件系统、网络和进程空间。通过Docker镜像,可以定义容器的环境和配置,使得开发人员能够快速部署和运行应用程序,无需担心依赖项和环境的差异。
Docker提供了一种标准化的部署方式,使得应用程序开发、测试和部署变得更加简单和高效。其可移植性和可伸缩性使得Docker成为当今云原生应用开发和部署中不可或缺的技术之一。通过Docker,开发人员可以实现快速的应用程序交付和部署,同时提高整体的开发效率和运维管理能力。
按照我的理解,docker技术就相当于用户端和服务端之间的应用层接口,通过调用一系列的api接口(docker内部会封装成更规范性的表述和格式),实现通信和内外隔离。所以docker检测和逃逸全流程如下:
1. 检测是否在 Docker 容器中运行
首先,需要确认当前环境是否为 Docker 容器。以下是几种常用的检测方法:
- 检查 /proc/1/cgroup 文件
执行以下命令:
如果输出中包含类似 /docker/ 的路径,则表明当前环境是 Docker 容器。cat /proc/1/cgroup
- 检查 .dockerenv 文件
执行:
如果该文件存在,通常表示当前在 Docker 容器内。ls /.dockerenv
- 检查环境变量
执行:
如果输出中包含与 Docker 相关的环境变量,可能是在容器中运行。env | grep docker
- 测试 docker 命令
执行:
如果命令无法执行(例如提示命令不存在),则可能在容器内;如果成功执行并列出容器信息,则可能不在容器内。docker ps
通过以上方法,可以较为准确地判断是否运行在 Docker 容器中。
2. 评估容器配置和权限
确认在容器内后,需评估容器的配置和权限,以找到可能的逃逸途径。
- 检查挂载的卷
查看是否有宿主机的文件系统被挂载,例如 /var/run/docker.sock(Docker 套接字)或宿主机的根目录 /。mount
- 检查是否为特权模式
执行:
如果 CapEff 的值接近 0000003fffffffff或0x1ffffff,说明容器以特权模式运行,拥有较高权限。cat /proc/self/status | grep CapEff
根据大佬指点,这里的CapEff是权限加密之后的值,可以使用“capsh --decode=”命令将获取到的值进行解码输出,就能看到所获得的有什么权限了。
3. 利用挂载的 Docker Socket 逃逸
如果容器挂载了 /var/run/docker.sock,可以通过 Docker API 逃逸到宿主机。
- 安装 Docker 客户端
如果容器内没有 Docker 客户端,可尝试安装:
或者下载静态二进制文件。apt-get update && apt-get install -y docker.io
- 创建新容器并挂载宿主机根目录
执行:
这会启动一个新容器,将宿主机的根目录挂载到 /host,然后通过 chroot 切换到宿主机的文件系统,从而实现逃逸。docker run -v /:/host -it alpine chroot /host /bin/sh
4. 利用特权模式逃逸
如果容器以特权模式运行,可以通过操作设备文件逃逸。
- 创建设备文件
假设宿主机的根文件系统在 /dev/sda1,执行:mknod /dev/sda b 8 0
- 挂载宿主机文件系统
执行:
挂载成功后,访问 /mnt 即可进入宿主机的文件系统。mount /dev/sda1 /mnt
以上逃逸出现在特权容器当中,在docker内部对挂载目录有读写权限,这是高危行为,一般创建时都是默认不开启的,如果开启了就证明你运气好拿到了一个特权容器,可以进行类似目录穿越的漏洞了。
5. 利用 CVE 漏洞逃逸
某些 Docker 或相关组件的版本可能存在已知漏洞,可用于逃逸。例如:
- CVE-2019-5736
针对 runC 的漏洞,通过覆盖宿主机的 runC 二进制文件执行任意代码。 - CVE-2020-15257
针对 containerd-shim 的漏洞,通过操纵容器网络命名空间实现逃逸。
利用这些漏洞需要特定条件和对应的 exploit 代码,具体方法因漏洞而异,需根据环境进一步研究。
6. 利用不当配置逃逸
某些容器可能存在配置错误,可直接利用:
- 挂载敏感目录
如果容器挂载了宿主机的 /etc 或 /root 等目录,可直接修改宿主机的配置文件或执行命令。 - CAP_SYS_ADMIN 权限
如果容器具有 CAP_SYS_ADMIN 能力,可执行 mount 或 unshare 等操作,从而逃逸到宿主机。
总结
本文仅仅只是作者对于云安全入门的一点个人看法,只是提到了基础的docker逃逸手法,后续会补充docker更多的逃逸手法,其实我有些小小的预感,未来不一定是底层逻辑的天下,底层逻辑现在被证明是可以被ai代替的,那么我觉得云安全在将来一定会成为一个热门的存在,随着越来越多的设备和集群上云,对应的漏洞也会随之产生,由于重构了底层漏洞的产生逻辑,所以更需要重新接触学习,希望看到这里的各位师傅共勉,我们一起学习进步!