디지털 포렌식 - 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 |
curl | URL 요청 및 데이터 송수신 | 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
# 시스템의 네트워크 연결 상태를 파일로 저장
netstat -antp > netstat_result.txt
# 시스템에서 실행 중인 프로세스를 파일로 저장
ps -ef > process_result.txt
- 파이프
- 앞 명령어의 실행 결과를 뒤 명령어의 입력값으로 전달 : |
cat test.txt | grep Redirection
cat 명렁어에서 출력된 값을 grep 명령어의 입력값으로 전달
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 진행 순서
- 네트워크 Birdged Adapter 모드로 설정
- 게스트에서 ip addr 을 통해 IP 주소 확인 (inet 이후 문자열이 게스트의 ip주소)
- 호스트에서 게스트로 ping을 전송 (ping *guestIP* )
- Ubuntu에서 SSH 서버 설치 ( sudo apt install -y openssh-server )
- 실행 상태 확인 ($ sudo systemctl status ssh) , active 라고 나오면 정상적으로 실행중
- 호스트에서 게스트로 SSH 연결 수행 (꼭 호스트에서 게스트로 연결되어야 하는 것은 아님)
- ssh [ID]@[IP] -p[포트]
- SSH가 정상 연결되면 시스템의 터미널을 통해 직접 입력하는 것과 동일하게 시스템에 명령어를 실행시킬 수 있음
- 운영체제 버전 확인을 위한 명령어
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammy
- 디스크 파티션 확인하는 명령어
$ 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
- 파일 시스템의 사용 가능한 공간을 표시해 주는 명령어($ 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 폴더에는 시스템에서 사용하는 가변 데이터 파일과 시스템 로그도 저장됨
폴더 이름 | 설명 |
/ | 최상위 디렉토리 |
/root | root 계정의 홈 디렉토리 |
/bin | 시스템 실행 기본 명령어들이 모여 있는 폴더 |
/etc | 시스템 환경 설정, 서비스 구성 설정, 사용자/그룹 목록 등 시스템 전반에 대한 설정 파일들이 모여 있는 폴더 |
/boot | 리눅스 커널이 저장되는 폴더 |
/mnt | 외부 장치가 마운트되는 폴더 |
/usr | 프로그램이 설치되는 폴더 |
/lib | 프로그램에서 사용하는 라이브러리가 저장되는 폴더 |
/home | 사용자 계정의 홈 디렉토리가 존재하는 폴더 |
/dev | 시스템의 디바이스 목록과 정보가 저장되는 폴더 |
/proc | 시스템의 프로세스 정보를 확인할 수 있는 폴더 |
/var | 시스템에서 사용되는 가변 데이터 파일이 저장되는 폴더 |
/tmp | 임시 파일을 저장하기 위한 폴더 |
- /var 경로에 시스템 로그 저장 → 이에 대한 설정값은 /etc/rsyslog.conf 파일에 존재
- $ cat /etc/rsyslog.conf 로 확인
- 파일의 소유자, 그룹, 권한을 설정하고 로그를 임시 저장하기 위한 공간(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 ###### 하단 생략 ######
- 활성화할 시스템 로그 종류 선택
- 모든 로그를 활성화하기 위해 로그에 대한 주석 삭제 → 시스템 재시작 → 재부팅 후 /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.log | cron 작업에 대한 로그 *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 웹 로그 실습
- 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 설치 확인
- Apache2 설치를 확인하기 위해서 브라우저를 켠 후 http://localhost 에 접속해 아래 페이지가 나오는지 확인
- 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 테이블 값 조회
- php 파일 생성 → 가상 머신 내에서 vim 에디터로 파일 생성
SQL injection 취약점이 존재하는 로그인 페이지 구축. - 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 ...
- 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 웹 공격 분석 실습
- 오픈소스 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 = '';
- sqlmap을 호스트 pc에 설치, 게스트 pc로 공격 payload 전송💡
페이로드(Payload)란?
페이로드란 공격 과정에서 실제로 전송되는 데이터를 뜻함
sqlmap -u "http://우분투서버IP/check_login.php" --data "id=guest&pw=guest"
- access.log와 error.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 프로세스 함수 호출 확인
- 프로세스의 행위를 파악하기 위해 프로세스가 실행하는 함수 파악 : strace와 ltrace 명령어
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 네트워크 패킷 수집
- 네트워크 분석을 위해 ip addr 명령어로 현재 PC의 네트워크 인터페이스와 IP를 조사
- 현재 시스템이 외부와 주고 받는 네트워크 패킷을 수집하려면 tcpdump 명령어 tcpdump -i [네트워크_인터페이스] -vv -w [파일이름] [표현식]
- 옵션/필터 사용
5.3.2 네트워크 패킷 분석
- 저장된 패킷 파일을 분석해 네트워크 연결 흔적을 찾아내는 것
- 키로거가 동작하는 pc 에서 sudo tcpdump -i any -w ~/sample.pcap 명령어
- tcpdump를 종료한 후 생성된 파일을 외부 pc로 옮기기
- 분석 도구 설치 : WireShark
WireShark 패킷 검색
5.3.3 프로세스 파악
- netstat : 네트워크 연결 상태, 라우팅 테이블, 인터페이스 상태 등을 보여주는 명령어로, 프로세스와 네트워크를 연결지어 검색할 수 있음
- WireShark를 통해 특정 IP 혹은 port와 수상한 외부 연결 상태 확인 ↔ netstat 을 통해 특정 프로세스와 연결