보안정보
전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.
침해사고의 재구성 Gotthard Base : Part2. 해결편
2021.01.07
5,191
01. 개요
지난 11월호 월간보안동향 테크노트 ‘침해사고의 재구성_Gotthard Base : Part1. 사건편’ 에서 정보보안전문업체 OO사 침해사고 분석팀 김보안 씨는 △△소프트웨어 홍길동씨로부터 침해사고 분석을 요청받게 된다. 김 보안 씨는 인터뷰를 통해 특정 사용자들만 악성코드에 감염되었으며, 감염된 사용자들은 내부 소프트웨어 설치프로그램에 포함된 'patch.exe' 파일을 다운로드한 사실을 알게 된다.
해당 사고가 사용자의 부주의로 악성코드에 감염된 것이 아닌 외부 공격자에 의해 치밀한 공격이 이루어진 것으로 판단한 김 보안 씨는 분석대상과 범위를 산정하여 증거수집 및 분석을 통해 사고 원인과 공격 방식을 알 수 있게 된다.

[그림 1] 이글루시큐리티 보안분석팀 침해사고 대응 프로세스
02. 증거수집 및 분석
1) 최초 공격 시도


[그림 2] 공격자의 초기 거점확보(Initial Compromise)
김 보안 씨는 공격자가 가장 최초로 접근한 DMZ 영역의 GitServer의 증거를 수집하고 분석을 진행하였다. GitServer의 apache access 로그 확인 결과 2020-11-3 09:42:58 시각을 기점으로 공격 시도 징후가 포착되었으며, 확인 결과 POST 방식으로 exploit.php 파일을 실행한 기록이 확인되었다.

[그림 3] apache access 로그 기록
exploit.php 파일은 system 함수를 사용하여 시스템 명령어를 수행하고 출력해주는 함수로 일종의 웹쉘(Webshell)로 확인되었다. 즉, 해당 GitServer 내 한줄 웹쉘(One Line Webshell, 일구화목마 등으로 명명)이 생성되었으며, 공격자는 이를 통해 시스템 명령어를 수행한 것으로 확인된다.

[그림 4] exploit.php 파일 내용
김 보안 씨는 exploit.php 파일이 어떻게 생성되었는지 확인하던 중, GitServer에서 사용 중인 gitstack 2.3.10버전에서 원격 코드 실행(RCE, Remote Code Execution)이 가능한 CVE-2018-5955취약점이 존재한다는 사실을 인지하게 되었다.

[그림 5] GitServer를 공격 가능한 취약점 목록
[그림 6]은 CVE-2018-5955 취약점의 PoC코드 일부로, PoC코드의 공격 Payload와 access로그에서 확인된 공격구문이 동일하다는 것을 확인하였다. 즉, 공격자는 CVE-2018-5955의 PoC(개념 증명, Proof of Concept)코드를 이용하여 exploit.php 파일을 생성한 것으로 판단할 수 있었다.
[그림 6]에서 사용된 CVE-2018-5955의 PoC코드는 gitstack의 취약점을 이용한 RCE공격 가능 여부만 확인이 가능하다. Access 로그에서 exploit.php 파일의 접근기록이 8회만 수행된 것으로 보아 공격자 역시 공격 가능 여부만 확인한 것으로 판단된다.

[그림 6] CVE-2018-5955 PoC Code 일부
[그림 7]은 GitServer의 프로세스 트리 구조를 추출한 것으로 김 보안 씨는 해당 목록을 통해서 의심스러운 프로세스를 확인 할 수 있었다. 정상적인 PowerShell 실행파일의 경우 explorer의 자식프로세스로 실행되는 구조가 일반적이지만, 피해 시스템의 프로세스 실행내역에서는 powershell.exe가 개별프로세스로 실행되는 것이 확인되었다.

[그림 7] 의심스러운 프로세스 트리 구조
[그림 8]과 같이 의심 프로세스인 Powershell.exe(PID 3780)을 확인해본 결과 부모프로세스가 존재하지 않는 고아 프로세스인 것을 확인할 수 있었다. 악성코드의 경우 드롭퍼(Dropper)에 의해 악성코드가 실행되고 실행한 프로세스가 종료되면 이처럼 고아 프로세스 형태를 띠는 경우가 존재함으로 악성파일로 의심된다. 프로세스의 Command line내 base64로 인코딩된 스크립트가 발견되어 해당 구분을 분석하였다.

[그림 8] Powershell script 코드

[그림 9] .gz 파일 시그니처 확인
파일들은 고유한 포맷을 가지고 있으며 파일 포맷을 구분하기 위한 파일의 고유 시그니처 값이 존재한다. 파일 시그니처는 파일의 가장 앞에 혹은 가장 뒤에 존재한다. 가장 앞에 존재하는 시그니처를 헤더(Header) 시그니처라고 한다. [그림 9]의 디코딩한 스크립트를 보면 파일의 헤더 시그니처 값이 1F 8B 08이다. 이 값은 .gz 파일(압축파일) 포맷의 고유한 헤더 시그니처이다.

[표 1] 대표적인 파일 포맷 헤더 시그니처
디코딩한 스크립트 결과 값을 .gz 확장자로 저장 후 파일 압축 해제하면 shell이라는 쉘코드 확인할 수 있었다. Shell 파일 내에는 base64 인코딩 되어 있는 스크립트가 확인되어 다시 디코딩하여 분석을 시도하였다.

[그림 10] shellcode 디코딩
[그림 11] 디코딩한 스크립트를 보면 어샘셈블리어 코드를 확인할 수 있었다. 어셈블리어 코드를 분석한 결과 외부 주소와 포트 주소로 통신을 시도하는 코드를 확인할 수 있었다.
[그림 11] 외부와 연결을 시도하는 코드 확인
네트워크 연결 상태 중 10.10.10.200:4444는 powershell 스크립트 코드에 의해 외부와 세션이 맺어진 것으로 확인되었다.

[그림 12] 네트워크 연결 정보
앞서 확인된 내용을 토대로 김 보안 씨는 다음과 같은 추론을 내렸다.
2) AD Controller 공격


[그림 13] 공격자의 권한 상승 및 측면이동(Establish Foothold, Move Laterally)
김 보안 씨는 GitServer의 $MFT를 분석하여 시스템에 생성된 의심 파일 및 디렉터리를 확인하기 시작하였다. $MFT(Master File Table)는 볼륨에 존재하는 모든 파일 및 디렉터리에 대한 메타데이터 정보를 가지고 있는 파일로, 시스템에서 생성되었던 파일 및 디렉터리에 대한 메타데이터를 확인할 수 있다.

[그림 14] $MFT(Master File Table) 정보
최초 공격 시각으로 추정되는 2020-11-03 09:42:58 이후 시스템에 생성된 파일 목록 중 공격에 사용된 것으로 확인되는 파일들을 확인할 수 있었다.

[표 2] 공격에 사용된 도구 목록
김 보안 씨는 레지스트리 분석을 통해 AD Controller의 기본 하드 디스크 공유 폴더 C$를 마운트한 기록을 확인할 수 있었다.

[그림 15] registry 기록 (HKU{SID}Network)
[그림 15]는 HKUSIDNetwork Key를 추출한 내용으로 네트워크 드라이브 매핑 정보와 같은 설정 값을 저장하고 있어 공유 드라이브 마운트 시 해당 레지스트리를 통해 확인할 수 있다. HKUS-1-5-18Network KEY 확인 결과 2020-11-03 10:05 시각 S-1-5-18(SYSTEM) 계정이 Administrator 계정으로 AD Controller 서버의 기본공유 폴더 C$를 볼륨 문자열 "X:"로 마운트 하였다. 해당 기록은 [그림 16] 이벤트 로그에서도 확인할 수 있었으며 네트워크 정보를 통해서 445 포트를 사용한 것을 확인하였다.

[그림 16] Window Event 로그 (Security)
GitServer 프로세스 목록 및 공격에 사용된 도구 목록 중 plink.exe 프로그램이 확인되었다. Plink는 putty와 같이 클라이언트 원격 접속 프로그램으로 악성 프로그램은 아니지만 공격자는 이 도구를 사용하여 악의적인 행위를 한 것으로 판단된다. 동작 중인 plink 프로세스를 확인하여 다음과 같은 결과를 확인할 수 있었다.
[그림 17]의 plink.exe 프로세스에 대한 정보는 다음과 같다. 해당 프로세스는 10:14:57 시각에 실행되었으며 프로그램의 경로는 악성코드가 설치된 경로에 존재하고 있다. plink.exe 프로그램의 해시 값 확인 결과 정상 plink.exe 프로그램과 일치하여 악성코드는 삽입되어있지 않은 것으로 판단되었다. 하지만 악성 프로세스 powershell.exe 자식 프로세스로 존재하는 것을 보아 공격에 사용된 것으로 추측하였다.

[그림 17] plink.exe 프로세스 정보

[표 3] plink.exe 프로세스 상세 정보

[그림 18] plink.exe 옵션
plink.exe 프로세스의 Command line 확인 결과 공격자가 내부 침투 목적으로 사용한 것을 확인할 수 있었다. plink 옵션의 –R 옵션은 원격지의 포트를 특정 주소로 전달하는 옵션으로 해당 명령어를 통해 공격자는 외부에서 접속할 수 없는 내부 시스템에 접근(원격 데스크톱)하기 위해 터널링 공격을 한 것으로 판단하였다. Command line에서 확인된 명령어를 해석하면 다음과 같다.


[그림 19] Window Event 로그 (RDP 접속기록)
AD Controller 의 이벤트 로그 기록 확인 결과 2020-11-03 10:15 시각에 원격 접속 기록이 확인되었다. 앞서 확인된 내용으로 볼 때 터널링 이후 접속된 기록으로 공격자가 터널링을 통해 AD Controller로 원격 접속에 성공한 것으로 추측된다.
앞서 확인된 내용을 토대로 김 보안 씨는 다음과 같은 추론을 내렸다.

3) AD Controller 공격 및 악성코드 유포


[그림 20] 공격자의 악성코드 유포(Complete Mission)
김 보안 씨는 공격자가 AD Controller 서버로 원격 접속까지 접근한 기록까지 확인하였다. 이후 공격자의 악성코드 유포 방식을 확인하기 위해 AD Controller 서버의 증거를 수집하고 분석하기 시작하였다.

[그림 21] $LogFile 파일 정보
$LogFile은 파일이나 디렉터리의 생성, 삭제, 데이터 작성, 파일명 변경과 같은 트랜잭션 작업 내용을 기록하는 파일이다. AD Controller 서버의 $LogFile 확인 결과 2020-11-03 10:08 시각에 tmp 하위 폴더 내 malware.exe 파일이 생성되었으며, 파일명을 patch.exe 로 수정하였다. 해당 파일의 시간을 보면 수정 시간(11-03 10:01)이 생성 시간(11-03 10:08)보다 빠른 것을 볼 수 있다. 이런 경우 파일이 복사된 경우 다음과 같은 시간역행 현상이 일어난다. 즉, 해당 파일은 다른 파일로부터 복사된 파일이라고 할 수 있다.

[그림 22] tmp 폴더 내 존재하는 파일들
zap 파일은 사용자에게 응용 프로그램 게시를 위한 텍스트 파일로서 Active Directory 환경에서 실행 파일을 배포할 때 사용된다. 해당 파일은 10:17분 생성되었으며, 10:29 시각에 내용을 수정하였다.

[그림 23] zap 파일 내용
zap 파일 내용 확인 결과 악성코드의 파일 이름, 파일 경로 등이 저장되어 있다. 해당 zap 파일을 통해 악성코드를 배포하기 위한 내용이 포함되어있는 것을 확인할 수 있다.

[그림 24] zap 파일 내용
OfficeGroup 내 소프트웨어 설치 정책으로 patch.zap 파일이 등록되어있으며, OfficeGroup에 포함된 인원들이 해당 설치프로그램을 통해 악성코드가 설치된 것으로 확인된다.
03. 보고서 작성
1) 문제 풀이


2) 사건의 재구성


[그림 25] 공격자의 주요 행위 재구성
Advanced Persistent Threat Attack Lifecycle 관점에서 바라본 공격자의 주요 행위는 다음과 같다.

[표 4] Advanced Persistent Threat Attack Lifecycle
3) 대응방안
