ADS(Alternate Data Stream)와 디지털 포렌식
DFIR/File System

ADS(Alternate Data Stream)와 디지털 포렌식

안녕하세요. 저번 달 DFC(2021)에 ADS를 분석하는 문제가 출제되었더라구요, 덕분에 ADS에 대해서 공부를 해보게 되었습니다.

그래서 이번 포스팅에서는 악성 페이로드를 숨기는 데 자주 사용되는 기술인 ADS에 대해서 알아보겠습니다.

 


 

1. ADS(Alternate Data Stream) 개념

 

ADS는 macOS HFS 파일시스템과의 호환성을 목적으로 처음 생기게 되었으며, 파일에 사용되는 기본 스트림 외에 다른 데이터 스트림을 추가로 저장할 수 있는 NTFS 파일 시스템에서 제공하는 기능입니다.

NTFS 파일시스템에서는 파일이 $DATA 속성을 하나 이상 가질 수 있습니다. 하나의 파일에 $DATA 속성이 여러 개 올 수 있다는 의미인데 추가적으로 존재하는 $DATA 속성을 ADS라고 합니다.

 

FAT32와 NTFS의 파일 구조 차이

 

위 그림과 같이 FAT32 파일시스템에서는 파일 하나 당 메인 데이터 스트림 1개만 존재하지만, NTFS 파일시스템에서는 메인 데이터 스트림이 저장되는 $DATA 속성 외에 추가적으로 데이터 스트림을 할당할 수 있습니다.

ADS에는 텍스트 데이터를 은닉시키는 것은 물론, 실행 파일의 데이터 또한 은닉할 수 있기 때문에 악의적인 목적으로도 사용되고 있는 기능입니다.

실제로 ADS를 활용하는 멀웨어들이 지속적으로 있었기 때문에 많은 보안 솔루션들이 ADS를 탐지한다고 합니다.

 

ADS 형태

 

ADS는 위와 같이 생겼습니다. 파일명 뒤에 콜론이 붙고 뒤에 ADS 식별자가 붙는 형식입니다.

ADS가 있는 파일이라고 하더라도 일반적인 방법으로는 위와 같이 보이지 않으며 그냥 파일명만 보입니다.

ADS의 존재를 확인하는 방법, ADS를 생성하는 방법, ADS를 실행하는 방법과 포렌식적 접근에 대해 알아보도록 하겠습니다.

 


 

2. ADS 존재 여부 확인 방법

 

ADS의 존재를 확인하는 3가지 방법에 대해 소개해드리겠습니다.

 

2-1. CMD를 이용한 확인 방법

 

dir /R

 

dir /R

위 명령어를 이용하여 현재 경로에 존재하는 파일들과 ADS 영역을 확인할 수 있습니다.

빨간색 네모 영역에서 보이는 ADS Sample.txt 파일의 ADS가 4개 존재하는 것을 알 수 있습니다.

ADS Sample.txt:calc.vbs, ADS Sample.txt:calc.exe, ADS Sample.txt:Memo.txt, ADS Sample.txt:notepad.exe

 

more < [filename:ADSname]

 

more < [filename:ADSname]

more 명령어를 사용하여 ADS의 데이터를 확인할 수 있습니다.

 

2-2. PowerShell을 이용한 확인 방법

 

Get-Item [Filename] -stream *

 

Get-Item [Filename] -stream *
Get-Item [Filename] -stream [Stream name]

파워쉘에서는 GetItem 명령어로 파일에 존재하는 스트림에 대한 정보를 확인할 수 있습니다.

ADS의 이름은 물론 크기가 얼마인지도 볼 수 있습니다.

 

Get-Content [filename] -stream [ADSname]

 

Get-Content [filename] -stream [ADSname]

Get-Content 명령어를 사용하여 ADS의 데이터를 확인할 수 있습니다.

gci -recurse | % { gi $_.FullName -stream * } | where stream -ne ':$Data'

위 명령어를 사용하여 존재하는 ADS를 모두 찾을 수 있습니다.

 

2-3. FTK Imager를 이용한 확인 방법

 

FTK Imager ADS 확인

 

FTK Imager에서는 ADS가 존재하는 파일을 더블 클릭하면 내부의 ADS 데이터들을 확인할 수 있습니다.

또한 ADS를 추출할 수도 있습니다.

 

추가로 Sysinternals의 Streams.exe, NirSoft의 AlternateStreamView.exe 프로그램을 사용해서 스트림을 확인할 수 있습니다.

 


 

3. ADS 생성 방법

 

3-1. CMD를 이용한 생성 방법

 

cmd로 ADS 생성

 

type [Src file] > [Dst file:{ADS name}]
echo [data] > [Dst file:{ADS name}]
more < [Src file] > [Dst file:{ADS name}]
findstr /V /L [...] [Src file] > [Dst file:{ADS name}]

ADS를 생성하는 방법 중 CMD를 활용한 4가지 방법입니다.

type, echo, more, findstr 명령어를 사용하여 ADS 데이터를 추가할 수 있습니다.

findstr의 경우 존재하지 않는 문자열 값을 인자로 주는 것입니다.

 

3-2. PowerShell을 이용한 생성 방법

 

PowerShell로 ADS 생성

 

Set-Content [Filename:ADSname] -Value [value]

파워쉘에서도 Set-Content 명령어를 이용해 ADS를 생성할 수 있습니다.

Remove-item –path [Filename] –stream [ADSname]

위 명령어로 삭제 또한 가능합니다.

 


 

4. ADS 실행 방법

 

4-1. wmic을 이용한 실행 방법

 

wmic process call create [ADSfile full path]

 

wmic process call create [ADSfile full path]

wmic을 이용하여 ADS에 저장된 실행 파일을 실행할 수 있습니다.

파일의 전체 경로를 넣어야 실행이 됩니다.

 

start [ADSfile full path]

XP 운영체제에서는 위와 같이 start 명령어를 사용하여 실행할 수 있습니다.

 

4-2. cscript, wscript를 이용한 실행 방법

 

[c,w]script [ADSfile]

 

cscript [ADSfile]
wscript [ADSfile]

cscript.exe와 wscript.exe를 이용하여 ADS에 저장된 vbs 코드를 실행할 수 있습니다.

 

4-3. 기타 실행 방법

 

이외에도 ADS에 저장된 데이터가 dll 파일인 경우 rundll32.exe를 이용하여 호출할 수 있으며,

HTA 파일인 경우 mshta.exe를 통해 호출할 수 있습니다.

또한 그림 파일인 경우 mspaint.exe를 통해 실행할 수 있으며

텍스트인 경우 notepad.exe를 통해 실행할 수 있습니다.

 


 

5. ADS 포렌식적 접근

 

5-1. Prefetch

 

findstr.exe prefetch

 

findstr.exe를 사용하여 ADS 데이터를 삽입한 경우 프리패치에 파일을 로드한 흔적이 남습니다.

 

cscript.exe prefetch
wscript.exe prefetch

 

cscript와 wscript를 사용하여 ADS의 vbs 코드를 실행한 기록 역시 프리패치에 남습니다.

 

5.2 Zone Identifier

 

인터넷에서 파일을 다운로드 받았을 때 해당 파일이 악성행위를 할 가능성은 언제나 열려있습니다.

따라서 웹 브라우저에서 파일을 다운로드 받게 되면 어느 사이트에서 파일을 다운로드 받았는지 기록을 남기게 되는데 그것이 바로 Zone Identifier라는 값입니다.

ADS 이야기를 하다가 갑자기 Zone Identifier가 왜 나왔냐하면 이 Zone Identifier 값이 바로 파일의 ADS 영역에 저장되기 때문입니다.

 

dog.jpg의 Zone.Identifier

 

인터넷에서 개 사진을 다운로드 한 뒤 more 명령어를 통해 Zone.Identifier 값을 확인한 모습입니다.

ReferrerUrl에는 해당 그림 파일이 올라간 웹 사이트의 주소가 저장되어 있으며

HostUrl에는 해당 그림 파일의 URL이 저장된 것을 알 수 있습니다.

 

5-3. ADS 추출

 

expand [ADSfile] [new filename]

 

expand [ADSfile] [new filename]

cmd의 expand 명령어를 사용하여 ADS 데이터만 추출할 수 있습니다.

또는 AlternateStreamView.exe과 같은 프로그램을 사용하여 추출할 수도 있습니다.

 

 

참고한 사이트

 

https://www.deepinstinct.com/2018/06/12/the-abuse-of-alternate-data-stream-hasnt-disappeared/

https://blog.malwarebytes.com/101/2015/07/introduction-to-alternate-data-streams/

https://blog.forensicresearch.kr/17

https://oddvar.moe/2018/04/11/putting-data-in-alternate-data-streams-and-how-to-execute-it-part-2/