디지털 포렌식 - Linux Forensic

1. Linux Forensic

1.1 활성 시스템 포렌식

  • 활성 시스템 (전원이 종료되지 않은 상태)에서 증거를 수집하여 분석하는 것

    ↔ 비활성 시스템 포렌식 : 수집된 디스크 이미지에서 증거를 수집하여 분석하는 것

  • 폴더를 열거나 프로그램을 실행시키는 과정 등에서 대상 시스템이 변질될 수 있으므로 선호되는 방식이 아님

1.1.1 활성 포렌식이 필요한 이유

  • 활성 포렌식을 통해서만 수집할 수 있는 데이터(e.g. 직전 수행중인 프로그램, 메모리 덤프(암호화 키나 패스워드 포함), 원격 시스템의 정보) 수집을 위해
  • 특정 상황(e.g. 종료시킬 수 없는 웹 서버의 데이터 수집)

1.1.2 활성 포렌식 주의점

  • 메모리 사용이 적은 CLI 도구 권장
  • 원하는 데이터를 검색할 수 있는 방법을 미리 준비
    • Windows - everything
    • Linux - find, grep
  • 사용할 도구는 전부 준비해서 가져가 시간을 절약
  • 수집 명령어는 운영체제에서 기본으로 지원하는 것 사용
    • Windows - .bat 배치 스크립트
    • Linux - .sh 쉘 스크립트

1.2 Appendix

1.2.1 Linux 기본 명령어

명령어설명예시
ls디렉토리 내 파일/폴더 목록 보기ls -al
cd디렉토리 이동cd /home/user
pwd현재 작업 디렉토리 출력pwd
mkdir새 디렉토리 생성mkdir new_folder
rm파일/디렉토리 삭제rm file.txtrm -r folder/
cp파일/디렉토리 복사cp file1.txt file2.txtcp -r dir1/ dir2/
mv파일/디렉토리 이동 또는 이름 변경mv oldname.txt newname.txt
touch새 파일 생성touch file.txt
cat파일 내용 출력cat file.txt
less파일을 페이지 단위로 보기less file.txt
echo문자열 출력 또는 변수 확인echo "Hello"
grep문자열 검색grep "text" file.txt
find파일/디렉토리 검색find . -name "*.txt"
man명령어의 매뉴얼 보기man ls
chmod권한 변경chmod +x script.sh
chown소유자 변경chown user:group file.txt
df디스크 공간 사용량 확인df -h
du디렉토리/파일 용량 확인du -sh *
top실시간 프로세스 상태 보기top
ps현재 실행 중인 프로세스 확인ps aux
kill프로세스 종료kill 1234 (PID 기준)
tar파일 압축/해제tar -cvf file.tar folder/tar -xvf file.tar
wget파일 다운로드wget http://example.com/file.txt
curlURL 요청 및 데이터 송수신curl https://example.com
sudo관리자 권한으로 명령 실행sudo apt update
apt패키지 관리 (Debian/Ubuntu)sudo apt install git
yum패키지 관리 (RHEL/CentOS)sudo yum install git
history명령어 히스토리 보기history
clear터미널 화면 지우기clear
exit셸 종료exit

1.2.2 리디렉션 및 파이프

  • 리디렉션
    • 기존 파일 내용 삭제 : >
    • 기존 파일 내용에 추가 : >>
    echo "Redirection Test" > ./test.txt echo "Redirection Add" >> ./test.txt
    notion image
# 시스템의 네트워크 연결 상태를 파일로 저장 netstat -antp > netstat_result.txt # 시스템에서 실행 중인 프로세스를 파일로 저장 ps -ef > process_result.txt
디지털 포렌식 과정에서 사용하는 리디렉션
  • 파이프
    • 앞 명령어의 실행 결과를 뒤 명령어의 입력값으로 전달 : |
    cat test.txt | grep Redirection
    cat 명렁어에서 출력된 값을 grep 명령어의 입력값으로 전달
    notion image

1.2.3 기타 명령어

  • ls : 디렉토리 내부의 파일/폴더 조회하는 명령어
  • -a 숨겨진 파일 및 폴더 출력
  • -l : 다양한 정보를 함께 제공
  • 접근 권한
    • r: Read(4)
    • w : Write(2)
    • x : Execute(1)
    • e.g. -wx: 권한 값 = 3 , r-x : 권한 값 = 5

2. 시스템 정보 확인

  • Linux 운영체제는 GUI 없는 환경이 일반적이므로 운영체제 정보, 디스크 파티션 확인, 저장장치 마운트 확인, 네트워크 설정 확인 기초적인 정보들을 수집하기 위해서 명령어를 이용
  • 시스템 정보를 확인하기 위해 시스템에 접속해야 함
    • ssh : Secure Shell, 일반적인 접속 방법으로 원격 호스트에 접속하기 위해 사용되는 인터넷 프로토콜 혹은 프로그램을 의미함

2.1 SSH 실습

  • ssh 실습을 위해서 가상 머신의 네트워크 설정을 바꿔주어야 함
  • 호스트(본 컴퓨터)/게스트(가상 머신 상 컴퓨터)
  • 모드
    • Bridged Adapter : 호스트와 게스트가 같은 네트워크에 연결되는 모드
    • NAT : 호스트가 별도의 사설망을 만들어 게스트가 이용할 수 있도록 하는 방식, 호스트가 공유기 역할. 호스트와 게스트가 통신하기 위해 포트 포워딩이 필요함
      💡

      포트 포워딩이란?

      포트 포워딩이란, 외부에서 특정 포트로 들어온 요청을 내부 IP의 특정 장비/포트로 전달하는 설정

      <집에 있는 PC에 웹 서버를 띄웠다고 가정>

      • 웹 서버는 192.168.0.5 내부 IP에서 포트 80으로 동작 중
      • 외부에서 우리집공인IP:80으로 접속하면 공유기에서 이 요청을 192.168.0.5:80으로 전달해야 웹 페이지가 보임

2.1.1 VirtualBox 진행 순서

  1. 네트워크 Birdged Adapter 모드로 설정
  2. 게스트에서 ip addr 을 통해 IP 주소 확인 (inet 이후 문자열이 게스트의 ip주소)
  3. 호스트에서 게스트로 ping을 전송 (ping *guestIP* )
  4. Ubuntu에서 SSH 서버 설치 ( sudo apt install -y openssh-server )
  5. 실행 상태 확인 ($ sudo systemctl status ssh) , active 라고 나오면 정상적으로 실행중

  1. 호스트에서 게스트로 SSH 연결 수행 (꼭 호스트에서 게스트로 연결되어야 하는 것은 아님)
  2. ssh [ID]@[IP] -p[포트]
  3. SSH가 정상 연결되면 시스템의 터미널을 통해 직접 입력하는 것과 동일하게 시스템에 명령어를 실행시킬 수 있음

  1. 운영체제 버전 확인을 위한 명령어
    $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammy
  2. 디스크 파티션 확인하는 명령어
    $ sudo fdisk -l # 일부 생략 Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors Disk model: VMware Virtual S Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: E4E85C38-9651-40C8-834C-65C30CD5EF56 Device Start End Sectors Size Type /dev/sda1 2048 4095 2048 1M BIOS boot /dev/sda2 4096 1054719 1050624 513M EFI System /dev/sda3 1054720 41940991 40886272 19.5G Linux filesystem Disk /dev/sdb: 14.75 GiB, 15833497600 bytes, 30924800 sectors Disk model: Flash Disk Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xf53bc2a7 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 30922751 30920704 14.7G 7 HPFS/NTFS/exFAT
  3. 파일 시스템의 사용 가능한 공간을 표시해 주는 명령어($ df -h), 시스템 버전과 CPU 정보를 확인하는 명령어($ cat /proc/version, $ cat /proc/cpuinfo), 시스템 시간, 시스템 실행 이후 지속 시간, 현재 접속중인 사용자 수 등을 얻을 수 있음

2.2 사용자 확인

2.2.1 사용자 확인

  • Linux 시스템에서는 시스템에 존재하는 사용자 정보를 /etc/passwd 파일에 저장함
    $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash # 중간 생략 hunjison:x:1000:1000:hunjison,,,:/home/hunjison:/bin/bash sshd:x:129:65534::/run/sshd:/usr/sbin/nologin
    cat 명령어를 통해 출력 가능

2.2.1 패스워드 해시 확인

  • 사용자 계정의 패스워드는 /etc/shadow 파일에 해시값으로 저장함
    $ sudo cat /etc/shadow [sudo] password for hunjison: root:!:19823:0:99999:7::: daemon:*:19773:0:99999:7::: bin:*:19773:0:99999:7::: # 중간 생략 hunjison:$y$j9T$7x[생략]tK.$BJ[생략]T/:19823:0:99999:7::: sshd:*:19823:0:99999:7:::

    !, $y$j9T$7x : password 필드, 해시화된 패스워드

  • $id 의 값은 해시 알고리즘을 나타냄
    • 1 : MD5, 2 : Blowfish, 5 : SHA-256, y : yescrypt .. etc

2.3 네트워크 확인

2.3.1 IP 확인

  • 시스템이 사용하고 있는 네트워크 인터페이스, IP 주소는 반드시 확인해야 할 정보
$ ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:ac:72:c5 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.0.221/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33 valid_lft 464sec preferred_lft 464sec inet6 fe80::17d7:2e6:6e1a:f4a0/64 scope link noprefixroute valid_lft forever preferred_lft forever
  • 네트워크 인터페이스에 lo(loopback)와 ens33 이 있음
💡

네트워크 인터페이스란?

네트워크 인터페이스란 컴퓨터가 네트워크와 통신할 수 있도록 해주는 물리적 또는 논리적 장치

구분설명예시
물리적(Physical)실제 하드웨어 장치LAN 카드, Wi-Fi 카드, Ethernet 포트 등
논리적(Logical)소프트웨어로 만든 가상 인터페이스lo(loopback), tun0(VPN), docker0(도커 네트워크) 등
역할설명
IP 주소 할당인터페이스마다 고유한 IP 주소를 가짐
데이터 송수신네트워크를 통해 데이터를 주고받음
MAC 주소 사용네트워크 상에서의 장치 식별자 역할
라우팅 연결서로 다른 네트워크 간 통신을 가능하게 함


2.3.2 라우팅 테이블 확인

  • 라우팅 테이블이란 목적지의 주소를 목적지에 도달하기 위한 네트워크 노선으로 변환시키는 목적으로 사용되는 데이터
$ ip route default via 192.168.0.1 dev ens33 proto dhcp metric 100 169.254.0.0/16 dev ens33 scope link metric 1000 192.168.0.0/24 dev ens33 proto kernel scope link src 192.168.0.221 metric 100
  • 192.168.0.1이 기본 라우팅 주소로 이용되고 있으며
  • 169.254.0.0/16 192.168.0.0/24 범위의 대역이 내부 네트워크(link)로만 사용되고 있음

2.3.3 ARP 캐시 확인

  • ARP(Address Resolution Protocol)란, IP주소와 물리적인 MAC 주소를 서로 연결하기 위한 프로토콜
  • ARP 캐시를 통해 IP주소에 대응하는 MAC 주소를 알아냄
$ ip neigh 192.168.0.1 dev ens33 lladdr 00:1d:ec:2f:ec:47 STALE

3. 시스템 로그 분석

3.1 시스템 로그 경로

  • /var 폴더에는 시스템에서 사용하는 가변 데이터 파일과 시스템 로그도 저장됨
폴더 이름설명
/최상위 디렉토리
/rootroot 계정의 홈 디렉토리
/bin시스템 실행 기본 명령어들이 모여 있는 폴더
/etc시스템 환경 설정, 서비스 구성 설정, 사용자/그룹 목록 등 시스템 전반에 대한 설정 파일들이 모여 있는 폴더
/boot리눅스 커널이 저장되는 폴더
/mnt외부 장치가 마운트되는 폴더
/usr프로그램이 설치되는 폴더
/lib프로그램에서 사용하는 라이브러리가 저장되는 폴더
/home사용자 계정의 홈 디렉토리가 존재하는 폴더
/dev시스템의 디바이스 목록과 정보가 저장되는 폴더
/proc시스템의 프로세스 정보를 확인할 수 있는 폴더
/var시스템에서 사용되는 가변 데이터 파일이 저장되는 폴더
/tmp임시 파일을 저장하기 위한 폴더
  1. /var 경로에 시스템 로그 저장 → 이에 대한 설정값은 /etc/rsyslog.conf 파일에 존재
  2. $ cat /etc/rsyslog.conf 로 확인
  3. 파일의 소유자, 그룹, 권한을 설정하고 로그를 임시 저장하기 위한 공간(spool)으로 /var/spool/rsyslog를 이용하고, 추가적인 설정은 /etc/rsyslog.d/*.conf를 통해 이루어짐
    $ cat /etc/rsyslog.d/50-default.conf # Default rules for rsyslog. # # For more information see rsyslog.conf(5) and /etc/rsyslog.conf # # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # #mail.info -/var/log/mail.info #mail.warn -/var/log/mail.warn mail.err /var/log/mail.err ###### 하단 생략 ######
  4. 활성화할 시스템 로그 종류 선택
  5. 모든 로그를 활성화하기 위해 로그에 대한 주석 삭제 → 시스템 재시작 → 재부팅 후 /var/log폴더 로그 확인

3.2 시스템 로그 종류

시스템 로그 경로설명
/var/run/utmp현재 시스템에 로그인하고 있는 사용자의 정보
/var/log/btmp사용자가 시스템에 로그인 실패한 정보
/var/log/wtmp사용자가 시스템에 로그인한 기록 및 시스템 재부팅 기록
/var/log/lastlog사용자가 시스템에 마지막으로 로그인 성공한 기록
/var/log/messages시스템 전반에 대한 로그를 기록
/var/log/auth.log /var/log/secure *Linux 배포판 차이원격 로그인 및 권한 상승에 대한 성공 및 실패를 기록
/var/log/dmesg시스템 부팅 과정에서 생성되는 커널 메시지 로그를 기록
/var/log/cron.logcron 작업에 대한 로그 *cron: Linux에서 주기적 반복 작업을 처리하는 스케줄러 프로그램
/var/log/boot.log운영체제 부팅 과정에서 생성되는 로그를 기록
/var/log/daemon.log실행 중인 데몬의 정보가 기록
/var/log/user.log시스템 내 모든 사용자에 대한 로그가 기록
  • utmp, wtmp, btmp, lastlog는 Linux 시스템에서 사용자 로그인과 관련된 정보를 기록
    • 텍스트 데이터가 아니라 별도의 포맷이 있는 바이너리 데이터이므로, 별도의 명령어 w,who 로 해석
  • utmp현재 시스템에 로그인하고 있는 사용자의 정보를 나타내며 w, who 명령어로 해석
  • btmp사용자가 시스템에 로그인 실패한 정보를 나타내며 lastb 명령어로 해석
  • wtmp사용자가 시스템에 로그인한 기록 및 시스템 재부팅 기록을 나타내며 last 명령어로 해석
  • lastlog사용자가 시스템에 마지막으로 로그인 성공한 기록을 나타내며 lastlog 명령어로 해석

3.3 logrotate

  • 시스템 로그를 계속해서 활성화하게 되면, 시스템 로그의 크기가 점점 커지는데 logrotate로 시스템 로그를 적절히 관리함
  • 로그 회전 : 이전 로그 파일을 백업/압축해 보관하고 새로운 로그 파일 생성

4. 웹로그 분석

  • 리눅스는 웹 서버로 활용되는 경우가 많음
  • 서버가 제공하는 웹에 대한 기록은 웹 로그에 저장됨
  • 웹 서버 예시 : Apache, Nginx, IIS, LiteSpeed
웹 로그설명
access.log서버가 처리하는 모든 요청을 기록
error.log서버가 요청을 처리하는 도중 발생한 오류를 기록

4.1 웹 로그 실습

  1. Apache2, MariaDB, PHP 설치
    # apt update sudo apt update # install apache2 sudo apt install -y apache2 # install mariadb sudo apt install -y mariadb-server sudo mysql_secure_installation # install php sudo apt install -y php libapache2-mod-php php-mysql # 설치가 잘 되었는지 결과 확인 # Apache2는 웹 브라우저 이용해서 http://localhost 접속 sudo mariadb # mariadb 결과 확인 php -v # php 설치 확인
  2. Apache2 설치를 확인하기 위해서 브라우저를 켠 후 http://localhost 에 접속해 아래 페이지가 나오는지 확인
  3. mariadb 쉘에서 아래 커맨드를 입력해 데이터베이스를 구축
    create database dreamhack; # 데이터베이스 생성 use dreamhack; # 생성한 데이터베이스 선택 create table member( # member 테이블 생성 id varchar(10) not null, pass varchar(100) not null, name varchar(10) not null, primary key(id) ); insert into member values('guest', 'guest', 'guest'); # 테이블에 값 추가 insert into member values('root', 'veryverylongpassworditis', 'root'); select * from member; # member 테이블 값 조회
    notion image
  4. php 파일 생성 → 가상 머신 내에서 vim 에디터로 파일 생성
    SQL injection 취약점이 존재하는 로그인 페이지 구축.
    SQL injection 취약점이 존재하는 로그인 페이지 구축.
  5. access.log 분석
    192.168.0.179 - - [13/Apr/2024:19:49:52 +0900] "POST /check_login.php HTTP/1.1" 200 521 "http://192.168.0.221/login.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" 192.168.0.179 - - [13/Apr/2024:19:49:54 +0900] "GET /login.php HTTP/1.1" 200 572 "http://192.168.0.221/check_login.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
    IP 주소 192.168.0.179에서 [13/Apr/2024:19:49:52 +0900] 시간에 POST 메서드를 이용해 /check_login.php 페이지에 대해 HTTP/1.1 프로토콜로 응답을 보냄

    해당 응답은 상태 코드 200(요청 성공)을 반환했으며, 512 바이트 응답 메시지가 전송

    클라이언트의 Referer는 "<http://192.168.0.221/login.php>"이었고, User Agent는 "Mozilla/5.0 (Windows NT ...

  6. error.log 분석
    [Sat Apr 13 20:11:47.811356 2024] [php:error] [pid 1009] [client 192.168.0.179:51667] PHP Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'guest'' at line 1 in /var/www/html/check_login.php:21\nStack trace:\n#0 /var/www/html/check_login.php(21): mysqli->query()\n#1 {main}\n thrown in /var/www/html/check_login.php on line 21, referer: http://192.168.0.221/login.php
    [Sat Apr 13 20:11:47.811356 2024][php:error] 수준의 에러가 발생하였으며, 에러가 발생한 프로세스 ID는 [pid 1009]

    클라이언트의 IP 주소는 [client 192.168.0.179:51667]이며, 발생한 에러의 내용은 PHP Fatal error: ...

4.2 웹 공격 분석 실습

  1. 오픈소스 SQL Injection 도구 sqlmap 이용
💡

SQL Injection이란?

SQL Injection은 사용자가 입력한 값에 악의적인 SQL 구문을 삽입하여 데이터베이스를 조작하거나 탈취하는 공격 기법

원래 SQL 문

SELECT * FROM users WHERE username = '$input' AND password = '$input2';

공격 입력:

입력값: ' OR '1'='1

결과 쿼리:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
  1. sqlmap을 호스트 pc에 설치, 게스트 pc로 공격 payload 전송
    💡

    페이로드(Payload)란?

    페이로드란 공격 과정에서 실제로 전송되는 데이터를 뜻함

    notion image
    sqlmap -u "http://우분투서버IP/check_login.php" --data "id=guest&pw=guest"
  2. access.logerror.log 를 통해 URL, 응답 코드, 시간 정보, 에러 정보 등을 확인해 악의적인 사용자의 공격이 있었는지 확인할 수 있음

4.3 기타 로그 분석

  • .bash_history : 사용자가 bash 쉘에 입력한 명령어들을 저장하고 있는 파일
  • .viminfo : vim 에디터에서 이용하는 로그 파일, vim 에디터를ㄹ 이용해 열어 본 파일과 명령어 저장됨

5. 공격 정황 탐색

5.1 프로세스 분석

5.1.1 실습 환경 구성

  • 게스트 PC에 키로거 스크립트 생성
  • 키로거란, 키보드에 입려된 내용을 기록하는 프로그램으로 ID/PW 뿐 아니라 모든 채팅 내역을 기록하다 외부로 유출하기도 함
  • keyboard 모듈 설치: pip install keyboard
  • python 스크립트 실행: python keylogger.py
  • 게스트 PC에서 tcpdump 명령어 실행 시, 5초에 한번씩 입력한 IP 주소로 UDP 패킷이 전송됨
💡

패킷이란 ? 컴퓨터 네트워크에서 데이터를 전송할 때

작게 나눈 조각 단위의 데이터 블록

패킷 구성 구조

계층포함 정보예시
응용 계층메시지, 요청/응답 내용HTTP 요청, DNS 질의 등
전송 계층포트 번호, 오류 체크TCP/UDP 헤더
네트워크 계층IP 주소, 경로 정보IP 헤더
데이터 링크 계층MAC 주소, 프레임 정보Ethernet 헤더
물리 계층전기 신호, 비트케이블을 통해 전송됨

5.1.2 프로세스 식별

  • 현재 실행중인 프로세스 확인 : ps 명령어 , ps -ef , ps -aux 등으로 활용
  • 옵션
    • e: 모든 프로세스
    • f: full-format 출력
    • a: 콘솔(tty)로 실행된 모든 프로세스
    • u: 사용자 정보를 자세히(user-oriented format)
    • x: 콘솔(tty)로 실행되지 않은 모든 프로세스
  • 힌트 : 지나치게 CPU 사용량 및 메모리 사용량이 높은 프로세스를 의심해볼 것
  • STAT 필드.
    • S+ : 프로세스가 실행 중인 상태
    • Ss : 프로세스가 세션 리더이며 대기 중인 상태
    • Sl+: 프로세스가 멀티 스레딩을 지원하는 프로그램의 메인 스레드인 상태

5.1.3 프로세스 관련 파일 확인

  • 프로세스가 실행 중에 열고 있는 파일 : lsof 명령어
  • 옵션
    • lsof -u [User]: 특정 사용자 지정
    • lsof -u ^[User]: 특정 사용자 제외
    • lsof -p [Process]: 특정 프로세스 출력
    • lsof -i [TCP:Port]: TCP에서 특정 포트를 이용하는 프로세스 출력
    • lsof [FilePath]: 특정 파일을 열고 있는 프로세스 출력
    • lsof +D [DirectoryPath]: 특정 폴더를 열고 있는 프로세스 출력

5.1.4 프로세스 함수 호출 확인

  • 프로세스의 행위를 파악하기 위해 프로세스가 실행하는 함수 파악 : straceltrace 명령어

5.1.5 프로세스 내 문자열 확인

  • 프로그램의 실행을 유추할 수 있는 문자열들 추출 : strings 명령어

5.1.6 파일 검색

  • Linux 시스템 내부의 파일/폴더 검색 : find 명령어
  • find [옵션] [경로] [표현식]
    • 옵션
      • P: 심볼릭 링크를 따라가지 않고, 심볼릭 링크 자체 정보를 이용함 (Default)
      • L: 심볼릭 링크에 연결된 파일의 정보를 이용함
    • 경로
      • 검색을 수행할 경로로, 입력하지 않으면 현재 경로(./)로 설정됨
    • 표현식
      • name: 파일 이름으로 찾기
      • type: 파일 타입으로 찾기
      • size: 파일 크기로 찾기
      • perm: 파일 권한으로 찾기
      • mtime, ctime, atime: 파일 시간 기반으로 찾기

5.1.7 파일 이름으로 찾기

  • 파일 이름 기반으로 검색 : -name 옵션

5.1.8 파일 타입과 크기로 찾기

  • -type 옵션
    • d:디렉토리
    • f:파일
    • l:심볼릭 링크
  • size 옵션
    • + ,- : 해당 사이즈 이상, 이하
    • c, k: 바이트, 킬로바이트

5.1.9 기타

  • 파일 권한, 파일 시간 기반으로 찾기

5.2 자동 실행

  • cron : 정해진 시간이 되면 자동으로 정해진 작업 수행
  • 시스템 부팅 시 자동 실행되는 스크립트

5.2.1 cron

  • cron이란, Linux 시스템 기반 잡 스케줄러
  • cron에 등록된 작업을 조회, 편집하기 위해서는 crontab 명령어
  • 작업 등록 crontab -e → 작업 조회 crontab -l→ …
  • 경로
    • 시스템 전반에 대해 동작하는 cron/etc/crontab
    • 실제로 수행되는 작업들은 /etc/cron.daily
    • 시스템 부팅 시 수행되는 작업들은 /etc/systemd
필드설명
After이 Unit보다 먼저 실행되어야 할 Unit들
ExecStartPre서비스를 실행하기 전에 실행되는 명령어
ExecStart서비스를 실행하는 명령어
RuntimeDirectory서비스가 실행되는 디렉토리

5.3 네트워크 분석

5.3.1 네트워크 패킷 수집

  1. 네트워크 분석을 위해 ip addr 명령어로 현재 PC의 네트워크 인터페이스와 IP를 조사
  2. 현재 시스템이 외부와 주고 받는 네트워크 패킷을 수집하려면 tcpdump 명령어 tcpdump -i [네트워크_인터페이스] -vv -w [파일이름] [표현식]
  3. 옵션/필터 사용

5.3.2 네트워크 패킷 분석

  • 저장된 패킷 파일을 분석해 네트워크 연결 흔적을 찾아내는 것
  1. 키로거가 동작하는 pc 에서 sudo tcpdump -i any -w ~/sample.pcap 명령어
  2. tcpdump를 종료한 후 생성된 파일을 외부 pc로 옮기기
  3. 분석 도구 설치 : WireShark
    notion image
    WireShark 패킷 검색
    WireShark 패킷 검색

5.3.3 프로세스 파악

  • netstat : 네트워크 연결 상태, 라우팅 테이블, 인터페이스 상태 등을 보여주는 명령어로, 프로세스와 네트워크를 연결지어 검색할 수 있음
  • WireShark를 통해 특정 IP 혹은 port와 수상한 외부 연결 상태 확인 ↔ netstat 을 통해 특정 프로세스와 연결