Linux 에서 악성 코드 지표 식별하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Linux 시스템에서 잠재적인 악성코드 지표를 식별하는 기본적인 기술을 배우게 됩니다. 일련의 실습을 통해 표준 명령줄 유틸리티를 사용하여 일반적인 침해 징후를 조사하고, 시스템 모니터링 및 기본적인 포렌식 분석에 대한 실질적인 기술을 습득하게 됩니다.

먼저 의심스러운 프로세스 활동을 관찰하며, 악성 프로세스를 나타낼 수 있는 비정상적인 CPU 및 메모리 급증을 감지하는 방법을 배우게 됩니다. 다음으로 파일 시스템에 집중하여 예상치 못한 파일 생성 및 수정을 탐지하며, 이는 무단 활동의 주요 지표입니다. 마지막으로 시스템 로그를 분석하여 보안 침해를 나타낼 수 있는 비정상적인 항목을 찾는 연습을 하게 됩니다.

CPU 및 메모리 급증에 대한 의심스러운 프로세스 활동 관찰

이 단계에서는 표준 Linux 유틸리티를 사용하여 시스템 프로세스의 비정상적인 CPU 및 메모리 사용량 급증을 모니터링하는 방법을 배우게 됩니다. 갑작스럽고 높은 리소스 소비는 악성 소프트웨어 (malware), 침해된 프로세스 또는 오작동하는 애플리케이션의 일반적인 지표입니다. 실시간 모니터링을 위해 top 명령을 사용하고, 고부하 시나리오를 안전하게 시뮬레이션하기 위해 stress 도구를 사용할 것입니다. 모든 명령은 ~/project 디렉토리에서 실행됩니다.

먼저, 기본 시스템에 포함되어 있지 않으므로 stress 유틸리티를 설치해야 합니다. apt-get 패키지 관리자를 사용합니다. 첫 번째 명령은 패키지 목록을 업데이트하고, 두 번째 명령은 stress를 설치합니다.

sudo apt-get update
sudo apt-get install stress -y

설치가 완료되면, 시스템의 현재 프로세스를 확인하여 기준선을 설정해 보겠습니다. top 명령은 실행 중인 시스템의 실시간 동적 보기를 제공합니다.

top

지속적으로 업데이트되는 전체 화면 인터페이스가 표시됩니다. %CPU (CPU 사용량) 및 %MEM (메모리 사용량) 열에 주의를 기울이십시오. 정상적인 조건에서는 대부분의 프로세스에서 이러한 값이 상대적으로 낮아야 합니다. q 키를 눌러 top을 종료하고 명령 프롬프트로 돌아갑니다.

top - 16:20:42 up 10 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 100 total,   1 running,  99 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    845.5 free,    450.1 used,    691.6 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1355.2 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  169404  13120   8484 S   0.0   0.6   0:01.55 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

이제 CPU 를 많이 사용하는 의심스러운 프로세스를 시뮬레이션해 보겠습니다. stress를 사용하여 60 초 동안 CPU 집약적인 계산을 수행할 작업자 하나를 시작합니다. 끝에 있는 &는 명령을 백그라운드에서 실행하여 터미널을 계속 사용할 수 있도록 합니다.

stress --cpu 1 --timeout 60 &

백그라운드 작업에 대한 프로세스 ID(PID) 가 표시됩니다. 이제 top을 다시 실행하여 효과를 관찰해 보겠습니다.

top

이번에는 stress 프로세스가 목록의 맨 위 또는 그 근처에 표시되며, %CPU 값이 100.0에 가까울 것입니다. 이것이 바로 CPU 를 과도하게 사용하는 프로세스를 찾을 때 확인해야 할 사항입니다. 60 초 후 stress 프로세스는 자동으로 종료됩니다. q를 눌러 top을 종료합니다.

다음으로, 메모리를 많이 사용하는 프로세스를 시뮬레이션해 보겠습니다. 이 명령은 256MB 의 메모리를 할당하고 60 초 동안 유지하는 작업자 하나를 시작합니다.

stress --vm 1 --vm-bytes 256M --timeout 60 &

다시 top을 즉시 실행하여 영향을 확인합니다.

top

top 출력에서 stress 프로세스를 찾습니다. 이번에는 %CPU는 낮지만 %MEM 값이 다른 프로세스보다 훨씬 높을 것이며, 이는 메모리 누수 또는 메모리 집약적인 공격을 보여줍니다. 이 기술은 추가 조사가 필요한 비정상적인 리소스 소비를 식별하는 데 도움이 됩니다. q를 눌러 종료합니다.

예상치 못한 파일 생성 및 수정 탐지

이 단계에서는 파일의 예상치 못한 생성 또는 수정과 같은 의심스러운 파일 시스템 활동을 탐지하는 방법을 배우게 됩니다. 공격자는 종종 지속성을 확보하거나, 악성 페이로드를 저장하거나, 시스템 구성을 조작하기 위해 파일을 생성하거나 변경합니다. 두 가지 강력한 명령줄 도구를 사용할 것입니다: 수정 시간을 기준으로 파일을 검색하는 find와 디렉토리 이벤트를 실시간으로 모니터링하는 inotifywait입니다. 모든 작업은 ~/project 디렉토리에서 수행됩니다.

먼저, find 명령을 사용하여 최근에 수정된 파일을 찾습니다. 이는 주기적인 보안 감사에 유용합니다. 모니터링할 샘플 구성 파일을 만들어 보겠습니다.

echo "SERVER_IP=192.168.1.1" > ~/project/app.conf

find 명령은 다양한 기준에 따라 파일을 검색할 수 있습니다. "수정된 시간 (분 전)"을 의미하는 -mmin 플래그를 사용할 것입니다. 다음 명령은 현재 디렉토리 (.) 에서 지난 5 분 이내에 수정된 모든 파일을 찾습니다.

find . -mmin -5

출력에는 방금 생성한 파일이 나열됩니다.

./app.conf

이제 공격자가 이 구성 파일을 수정하는 것을 시뮬레이션해 보겠습니다.

echo "MALICIOUS_PAYLOAD=..." >> ~/project/app.conf

find 명령을 다시 실행하면 수정 시간이 업데이트되었기 때문에 app.conf가 다시 표시됩니다. 이것은 최근 변경 사항을 신속하게 파악하는 간단한 방법입니다. 이제 공격자가 새 파일을 드롭하는 것을 시뮬레이션해 보겠습니다. 이는 일반적인 전술입니다.

touch ~/project/hidden_script.sh

find 명령을 한 번 더 실행합니다.

find . -mmin -5

이제 수정된 파일과 새로 생성된 파일 모두 나열되어 최근 파일 시스템 활동을 신속하게 식별하는 방법을 보여줍니다.

./app.conf
./hidden_script.sh

find는 감사에 유용하지만 실시간 경고를 제공하지는 않습니다. 이를 위해 inotify-tools를 사용할 수 있습니다. 먼저 패키지를 설치해야 합니다.

sudo apt-get update
sudo apt-get install -y inotify-tools

핵심 명령은 inotifywait이며, 특정 이벤트에 대해 파일 또는 디렉토리를 모니터링할 수 있습니다. 모니터 모드 (-m) 에서 ~/project 디렉토리에 대해 실행해 보겠습니다. &는 백그라운드 프로세스로 실행하여 터미널을 계속 사용할 수 있도록 합니다.

inotifywait -m ~/project &

이제 명령이 변경 사항을 조용히 감시하고 있습니다. 몇 가지 작업을 수행하여 트리거해 보겠습니다. 먼저 파일을 생성합니다.

echo "new file" > ~/project/new_file.txt

inotifywait에서 CREATE 이벤트를 보고하는 출력을 즉시 보게 됩니다.

/home/labex/project/ CREATE new_file.txt

이제 파일을 수정합니다.

echo "modified" >> ~/project/new_file.txt

도구에서 MODIFY 이벤트를 보고합니다.

/home/labex/project/ MODIFY new_file.txt

마지막으로 파일을 삭제합니다.

rm ~/project/new_file.txt

DELETE 이벤트를 보게 됩니다. 이 실시간 피드백은 보안 운영 센터 (SOC) 또는 자동화된 침입 탐지 시스템에 매우 중요합니다.

/home/labex/project/ DELETE new_file.txt

백그라운드 모니터링 프로세스를 중지하려면 pkill 명령을 사용할 수 있습니다.

pkill inotifywait

findinotifywait를 모두 사용하여 파일 시스템 변경 사항을 성공적으로 탐지했습니다.

비정상적인 항목에 대한 시스템 로그 분석

이 단계에서는 시스템 로그를 분석하여 의심스러운 활동의 증거를 찾는 방법을 배우게 됩니다. 시스템 로그는 시스템에서 발생하는 이벤트의 기록이며, 보안 모니터링 및 포렌식 분석을 위한 중요한 정보 소스입니다. 인증 로그 (사용자 로그인 및 권한 상승 추적) 에 초점을 맞추고, grep, tail, journalctl과 같은 표준 Linux 도구를 사용하여 비정상적인 항목을 찾을 것입니다.

Linux 시스템의 대부분의 시스템 로그는 /var/log 디렉토리에 저장됩니다. 보안에 가장 중요한 로그 중 하나는 /var/log/auth.log이며, SSH 로그인 및 sudo 명령 사용을 포함한 인증 관련 이벤트를 기록합니다. tail 명령을 사용하여 이 파일의 마지막 몇 줄을 보는 것으로 시작하겠습니다. 이 파일은 보호되어 있으므로 sudo가 필요합니다.

sudo tail /var/log/auth.log

타임스탬프가 찍힌 일련의 항목이 표시됩니다. 형식은 일반적으로 날짜, 시간, 호스트 이름, 로그를 생성한 프로세스 및 이벤트 메시지를 포함합니다.

Jul 22 10:30:01 labex-vm sudo:    labex : TTY=pts/0 ; PWD=/home/labex/project ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
Jul 22 10:30:01 labex-vm sudo: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Jul 22 10:30:01 labex-vm sudo: pam_unix(sudo:session): session closed for user root

이제 일반적인 의심스러운 이벤트인 실패한 로그인 시도를 시뮬레이션해 보겠습니다. 공격자는 종종 유효하거나 일반적인 사용자 이름에 대한 암호를 추측하려고 시도합니다. baduser와 같이 존재하지 않는 사용자 이름으로 자체 머신 (localhost) 에 SSH 를 시도하여 이를 시뮬레이션할 수 있습니다.

ssh baduser@localhost

시스템에서 암호를 묻는 메시지가 표시됩니다 (암호로 labex를 사용할 수 있습니다). 사용자가 존재하지 않으므로 어떤 암호를 사용해도 실패합니다. 암호 프롬프트를 취소하고 터미널로 돌아가려면 Ctrl+C를 누르기만 하면 됩니다. 연결 시도는 실패하지만 기록됩니다.

이제 증거를 찾아보겠습니다. grep 명령을 사용하여 auth.log 파일을 "failed"라는 단어가 포함된 줄에 대해 필터링할 수 있습니다. 이렇게 하면 실패한 이벤트를 신속하게 격리할 수 있습니다.

sudo grep "Failed" /var/log/auth.log

출력에는 실패한 SSH 로그인 시도에 대한 로그 항목이 명확하게 표시되며, 이는 잠재적인 침입 시도의 강력한 지표입니다.

Jul 22 10:35:15 labex-vm sshd[12345]: Failed password for invalid user baduser from 127.0.0.1 port 54321 ssh2

systemd를 사용하는 최신 Linux 시스템에는 journald에서 관리하는 중앙 집중식 로깅 시스템도 있습니다. journalctl 명령은 이러한 로그를 쿼리하는 강력한 도구입니다. sshd 프로세스의 메시지를 검색하여 동일한 실패한 로그인 이벤트를 찾기 위해 사용해 보겠습니다. 시스템 수준 로그를 보려면 sudo를 사용해야 합니다.

sudo journalctl | grep sshd

출력을 스크롤하고 (화살표 키를 사용하고 q를 눌러 종료) 동일한 "Failed password" 항목을 찾을 수 있습니다. 더 쉽게 만들기 위해 메시지 우선순위별로 필터링할 수 있습니다. journalctlsshd 서비스에 대해 우선순위가 "error"(err) 이상인 항목만 표시하도록 요청해 보겠습니다.

sudo journalctl -p err | grep sshd

이 명령은 오류 조건만 훨씬 더 간결하게 보여주므로 문제를 파악하는 데 매우 효율적입니다.

-- Logs begin at ... --
Jul 22 10:35:15 labex-vm sshd[12345]: Failed password for invalid user baduser from 127.0.0.1 port 54321 ssh2
-- End of logs --

마지막으로 logger 명령을 사용하여 수동으로 메시지를 로그에 주입할 수도 있습니다. 이는 사용자 지정 스크립트가 보안 이벤트를 보고하는 데 유용합니다. 사용자 지정 경고를 만들어 보겠습니다.

logger "SECURITY-ALERT: Unauthorized file access detected in /etc"

이제 시스템 로그에서 이 특정 경고를 검색합니다.

sudo grep "SECURITY-ALERT" /var/log/syslog

사용자 지정 메시지가 표시되며, 자체 모니터링을 시스템의 로깅 기능과 통합하는 방법을 보여줍니다.

Jul 22 10:40:00 labex-vm labex: SECURITY-ALERT: Unauthorized file access detected in /etc

이제 시스템 로그를 탐색하여 비정상적이고 잠재적으로 악의적인 활동의 증거를 찾는 기본 사항을 배웠습니다.

요약

이 실습에서는 Linux 시스템에서 악성 코드 지표를 식별하는 필수 기술을 배웠습니다. top 명령을 사용하여 비정상적인 CPU 및 메모리 급증을 모니터링하여 의심스러운 프로세스 활동을 관찰하는 연습을 했습니다. 실제 시나리오에서 이것이 어떻게 보이는지 이해하기 위해 stress 유틸리티를 사용하여 고부하 프로세스를 시뮬레이션하고 정상 시스템 기준선과 리소스 소비를 비교했습니다.

또한 이 실습에서는 시스템이 손상되었을 때 흔히 나타나는 징후인 예상치 못한 파일 생성 및 수정을 탐지하는 방법을 다루었습니다. 마지막으로, 무단 액세스, 잘못된 구성 또는 기타 보안 관련 이벤트의 증거를 찾는 데 중요한 기술인 비정상적인 항목에 대한 시스템 로그를 분석하는 방법을 배웠습니다.