리눅스용 DFIR 수집 도구 - bitCollector

1. 새로운 도구의 필요성

침해사고 대응에서 시간은 매우 중요한 요소이다. 신속한 대응은 사고의 파급 효과를 최소화하고, 잠재적인 피해를 줄일 수 있다.
이러한 맥락에서 수집 도구는 다양한 아티팩트 및 로그를 수집해야 한다. 기존의 상용 수집 도구는 종종 사용자의 요구에 따라 수집 경로를 변경하거나 추가하는 것이 어려웠다. 또한, 오픈소스 도구들은 YAML과 같은 별도의 설정 파일 형식을 이해하고 사용해야 하며, 특정 프로그래밍 언어(Python, Go 등)로 개발되어 운영체제 간 종속성 문제가 있다.

이런 문제는 특히 레거시 운영체제에서 더욱 도드라지며, 많은 레거시 시스템들은 Python3 및 Go와 같은 프로그래밍 언어를 지원하지 않는다. 또한, 레거시 시스템을 현재까지 운영하는 경우 망이 분리된 특수한 환경에서 구동되는 경우가 많기에 기존 도구들을 활용하기 어렵다.
아래 표는 GitHub에 공개된 리눅스용 DFIR 수집 도구 중 Star 수가 많은 4개의 도구를 선정해 bitCollector for Linux와 비교한 표다.

도구 명 지원 운영체제 언어 설정 파일 아티팩트 커스텀 파일 해시 수집 결과 메모리 수집
bitCollector Any *nix Shell CSV O O zip, tar.gz X
UAC Any *nix Shell YAML O O tar.gz X
LEAF up to Ubuntu 20.04/Debian Python ≥ 3.8 YARA O X ISO X
artifactcollector Any *nix Go (Required. GLIBC_2.29) YAML O O forensicstore (SQLite 파일) X
fastir_artifacts Any *nix Python ≥ 3.6 YAML O O zip X

​대부분의 도구가 언어에 따른 종속성을 요구하고, 정의된 아티팩트는 YAML 형식을 사용한다. YAML의 계층적 구조는 데이터 간의 관계를 시각적으로 잘 표현하지만, 수정과 활용을 위해서는 데이터의 관계, 들여쓰기 등 많은 사항이 고려되야 한다. YAML의 계층적 구조로 인해 데이터 구성이 복잡해지면서, 하나의 파일로는 모든 데이터를 관리하기 어렵다. 이에 따라 여러 아티팩트를 다수의 YAML 파일에 나누어 관리하고 있다. 이런 분산된 구조는 수정이 필요한 상황에서 많은 시스템 명령어를 사용하게 만들어 일부 데이터가 오염될 수 있다. 이러한 문제를 해결하기 위해, 상대적으로 단순한 CSV 방식을 활용한다.

bitCollector for Linux는 사용자가 직접 수집 항목을 설정하고, 필요에 맞게 도구를 조정할 수 있는 유연성을 제공한다. 이는 현장에서 발생할 수 있는 다양한 변수에 신속하게 대응하고, 더욱 효과적인 데이터 수집을 가능하게 한다. 이러한 접근 방식은 보안 전문가들이 더욱 신속하고 정확하게 사고에 대응할 수 있도록 지원할 것으로 예상된다.


2. 리눅스용 bitCollector

PLAINBIT는 2013년부터 각종 사고 분석, 컨설팅 서비스를 통한 다양한 환경의 사이버 위협 조사 경험을 보유하고 있다. 최근 5년 동안 3,500건 이상의 광범위한 사고 조사와 대응을 수행하면서 유연한 리눅스 환경의 데이터 수집 이슈를 현장에서 효율적으로 바로 해결할 수 있는 수집기가 필요했다.

따라서, bitCollector for Linux는 다양한 경험을 토대로 사용자가 쉽게 경로를 수정하거나 수집 대상을 추가할 수 있도록 설계되었다. 일부 도구들에서 문제가 되는 유연성과 호환성을 고려함으로써, 레거시 시스템을 포함한 다양한 운영 체제에서의 사용이 가능하다. 이는 특히 다양한 산업 분야에서 발생할 수 있는 보안 사고에 신속하게 대응할 수 있다.

침해사고 대응에서 신속성은 매우 중요하다. bitCollector for Linux는 사용자가 직접 커스터마이징할 수 있는 기능은 빠른 시간 내에 적절한 데이터를 수집하고 분석할 수 있도록 도와주며, 이는 전체적인 사고 대응 시간을 단축하는 데 기여한다.

또한, bitCollector for Linux는 특정 프로그래밍 언어의 종속성에서 벗어나 다양한 환경에서의 운영을 지원한다. Bash 기반 스크립트를 사용해 광범위한 시스템과 호환되며, 이를 통해 사용자는 별도의 언어 지원 없이도 필요한 데이터를 수집할 수 있다. 이러한 점은 bitCollector for Linux를 특히 유용하게 만드는 요소 중 하나이다.


3. bitCollector 사용법

bitCollector for Linux는 Linux 기반 시스템에서 중요 데이터를 수집하는 도구이다. 이 목차에서는 설치부터 실행까지의 과정을 단계별로 설명한다.

3.1. bitCollector 다운로드

  • Github Repository를 다운로드한다.
git clone https://github.com/Plainbit/bitCollector.git
cd bitCollector/Linux

bitCollector for Linux 다운로드

3.2. 스크립트 실행 권한 부여

  • Script에 실행권한을 부여한다.
chmod +x bitCollector.sh

스크립트 실행 권한 부여

3.3. 스크립트 실행

  • Script를 root 권한으로 실행한다.
⚠️
수집 대상 중 일부는 운영체제 시스템 파일로, root 권한이 필요하기 때문에 원활한 수집을 위해 수집기를 root 권한으로 실행해야 한다.
sudo ./bitCollector

스크립트 실행

3.4. 수집 방법 선택

bitCollector for Linux는 System 아티팩트 3rd-party 애플리케이션 아티팩트를 별도로 수집할 수 있게 구성되어 있다.

bitCollector for Linux 실행화면

사용자는 아래 두가지의 옵션을 선택해 수집을 시작한다.

  • 1: Collect system artifacts
  • 2: Collect 3rd-party application artifacts

3.4.1. 시스템 아티팩트 수집

실행된 환경의 OS에 맞는 {SystemOS}.ini에 정의된 대상들이 수집되며, bitCollector for Linux에서 지원하는 운영체제는 아래와 같다.

Distribution Version Comment
CentOS >= 5
RHEL >= 5
OpenSuse >= 10.2
Ubuntu >= 7
Raspbian >=2 Debian 6 이상

이외의 UNIX 계열 운영체제라도 Bash Shell 3.2 버전 이상이면 수집이 가능하다.

3.4.2. 3rd-party 프로그램 아티팩트 수집

Apache, MySQL, Redis 등 3rd-party 프로그램 아티팩트를수집한다. 3rdParty.ini 에 정의되어 있으며 기본적으로 아래 프로그램에 관련된 아티팩트를 수집한다.

Category App
Web Server Apache, Nginx
DataBase MySQL, MongoDB, PostgreSQL, Redis
Web Browser Chrome, FireFox
FTP FileZilla, Vsftp, Pure-FTP, ProFTP, Wget
Remote Access VNC, OpenSSH, AnyDesk
Other Apache Kafka, Apache Tomcat

3.5. 압축 비밀번호 설정

침해사고 시 수집되는 데이터에는 Web, DataBase 등 다양한 로그가 수집된다. 해당 로그들에는 고객 정보나 기타 기업의 민감한 정보가 들어있을 수 있다. 따라서, 사고와 관련이 없는 제삼자가 데이터를 보거나 유출되는 경우에 일차적인 보호를 위해 비밀번호를 설정해야 한다.

따라서, bitCollector for Linux는 앞서 비교한 4가지 도구와 다르게 비밀번호 설정 기능을 제공한다. 다만, 시스템에 Zip 명령이 존재할 경우에만 비밀번호를 입력받는다. 이외에는 비밀번호 입력 없이 tar.gz 형식으로 압축만 진행한다.


4. bitCollector 설정 파일 작성 방법

bitCollector for Linux는 CSV 형식의 설정 파일을 지원한다. 설정 파일은 몇 가지 주요 섹션으로 구분되어 있으며, 각 섹션은 대괄호([])로 표시된다. 각 섹션 하위에는 데이터 수집 작업을 정의할 수 있으며, 이 작업은 다음과 같은 다섯 필드로 구성된다:

  1. 주요 카테고리 (Volatile, NonVolatile, Other): 데이터 유형를 의미하며, 수집 시 상위 폴더명으로 활용
  2. 하위 카테고리: 데이터를 더 세분화해 구분하며, 상위 폴더 내 하위 폴더명으로 활용
  3. 저장 파일 이름: 데이터 수집 결과를 저장할 파일 이름으로 별도의 저장 파일명 없이 원본 파일명을 사용하는 경우, none을 사용해 원본 파일명으로 저장
  4. 수집 유형 (cmd, file, dir, function): 데이터를 수집하는 방법 정의되어 있으며, 수집 대상에 따라 적절히 사용
    • 명령어 실행 결과 수집(cmd)
    • 파일 수집(file)
    • 디렉터리 수집(dir)
    • 사용자 정의 함수 호출(function)
  1. 수집 대상: 수집 유형에 맞는 대상 명령어 및 경로 작성, 사용자 정의 함수의 경우, Shell Script 내 사용자가 정의한 함수명 작성

아래는 설정 파일의 예시이다.

[CentOS]
Volatile, Logon, last, cmd, last
Volatile, Logon, lastb, cmd, lastb
Volatile, OS, release, cmd, cat /etc/*release*
...
NonVolatile, Log, none, dir, /var/log/
NonVolatile, History, none, file, /home/*/.bash_history
NonVolatile, RootDir, none, dir, /root/

CentOS.ini 설정 파일 예시

4.1. 사용자 정의 함수

bitCollector for Linux는 사용자 정의 함수를 통해 분석가가 특정 환경이나 응용 프로그램에 관한 유연한 수집을 지원하고 있다. 작성된 함수는 설정 파일을 통해 유연하게 호출할 수 있다.

사용자 정의 함수의 예시는 아래와 같다.

function CollectProc() {
    local dest="$1"
    local lastDir=$(basename "$dest")

    if [ "$lastDir" == "none" ]; then
        dest=$(dirname "$dest")
    else
        mkdir -p "$dest"
    fi

    # 필요한 도구가 있는지 확인
    if ! command_exists stat || ! command_exists readlink; then
        RecordLog Error "CollectProc: Required commands (stat or readlink) not found."
        return 1
    fi

    # 실행 가능한 파일의 리스트를 생성
    local exec_files=()
    while read -r pid; do
        local exe_link="/proc/${pid}/exe"
        local target
        if target=$(readlink -f "$exe_link" 2>/dev/null); then
            [[ -n "$target" && -e "$target" ]] && exec_files+=("$target")
        fi
    done < <(ps -e -o pid=)

    # 중복을 제거하고 결과를 파일에 저장
    printf "%s\n" "${exec_files[@]}" | sort | uniq | tar -P -zcf "${dest}/process.tar.gz" -T - && \
    RecordLog Success "CollectProc: Compression of ${dest}/process.tar.gz was successfully." || \
    RecordLog Error "CollectProc: An error occurred in ${dest}/process.tar.gz compression."
}

사용자 정의 함수 (CollectProc) 예시

4.1.1. 인자

사용자 정의 함수에 제공되는 인자는 다음과 같다.

  • $1: 사용자 정의 함수명
  • $2: 저장 파일 이름

또한, 아래 코드를 통해 전달된 인자를 통해 적절한 저장 경로를 지정할 수 있다. 사용자는 final_dest 변수를 호출해 저장 경로를 설정한다.

    local source="$1"
    local dest="$2"
    local final_dest=""

    # Destination이 "/none"으로 끝나는 경우의 처리
    if [[ "$(basename "$dest")" == "none" ]]; then
      final_dest="${dest%/none}/$(source)"
    else
      final_dest="$dest"
    fi

4.1.2. 함수 호출

사용자 정의 함수는 아래와 같이 설정 파일에 작성해 호출할 수 있다.

Volatile, Process, none, function, CollectProc

5. 결론

서두에서 언급했듯이, 침해사고 대응에서는 신속한 대응이 핵심 요소이다. 이러한 중요성을 인지해, bitCollector for Linux는 사용자의 다양한 요구에 민첩하게 대응할 수 있는 유연성과 편의성을 제공함으로써, 신속하고 효율적인 분석을 가능하게 한다. PLAINBIT의 풍부한 사고 대응 경험은 bitCollector for Linux의 설계에 고스란히 녹아있어, 실제 현장에서 필요한 다양한 요소들을 효과적으로 반영하고 있다.

PLAINBIT는 디지털 데이터의 올바른 해석을 통해 사회 문제의 해결을 도모하고자 한다. 대부분의 디지털 포렌식 도구가 Windows 기반으로 제공되지만, Linux처럼 점유율은 낮더라도 산업군에서 많이 사용되는 운영 체제 중 일부는 현장에서 필요한 도구가 없는 경우가 많다. 이에 대응해 bitCollector for Linux를 개발해, 특수한 환경에서 사고 대응을 지원하고자 공개하게 되었다.

범용적이지 않은 플랫폼에서의 대응은 항상 어려움이 많았으며, 침해사고 대응에서 신속성이 중요하지만 이를 달성하지 못하는 상황은 늘 안타까웠다. 앞으로도 PLAINBIT는 지속해서 사용자 피드백을 수렴하고, 이를 기반으로 bitCollector for Linux를 개선해 나갈 계획이다. 현재도 공격자들은 지속해서 진화하고 있으며, 방어는 항상 공격보다 까다롭다는 현실을 인식해, 더 많은 노하우를 공유하고 산업 전반의 보안 수준을 향상하는 데 주력할 것이다.

You've successfully subscribed to PLAINBIT
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.