12. lp취약점 패치 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level18
> 해당 패스워드(PW) : passwd=18
솔라리스 2.8 시스템을 운영중에 파일프린팅에 사용되는 lp라는 root setuid
프로그램이 버퍼오버플로우 취약점이 있는 것으로 알려졌다.
하지만 파일 프린팅을 해야되기 때문에 이 프로그램을 제거할 수는 없고,
시스템의 용도때문에 root setuid를 제거할수도 없다.
이 lp라는 프로그램에 대해여 적절한 보안해결책을 모색하시오.
참고로, 다행히 OS제작사에서는 이 프로그램의 보안버전(patch)를 최근에
109320-04 패치번호로 발표된바 있으며,
이 패치파일을 /var/sadm/spool/patch/109320-04.zip 에 다운로드 받아놓았다.
=>
1. /var/sadm/spool/patch/ 폴더안에 이미 존재 하므로
그냥
#>patchadd 109320-04
이러하면 패치가 된다.-_-;;
#finish
passwordn is bebop
-----------------------------------------------------------------------------
1. 패치확인하기
showrev [-a] [-p] [-w] [-c command] 명령어로 확인할수 있다.
2. 패치하기 & 패치 삭제하기
patchadd [patch ID] : 패치 하기
patchrm [patch ID] : 패치 삭제
13.다운로드받은 패치 파일의 checksum 값 확인을 통한 변조확인
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level21
> 해당 패스워드(PW) : passwd=21
OS 패치를 하기 위해 패치 파일을 다운받은 관리자는 해당 파일이 변조가 되지 않은 무결한 파일인지
확인해 보려고 한다. 패치 파일의 checksum 값과 MD5 값을 확인하여 변조여부를 확인해 보시오.
(패치 파일은 /var/spool/patch 아래에 존재)
=>
문제에는 chksum에 값이라고 되어있지만 답에서는 sum에 값을 원하고 있다
#>sum 110281-02.jar
#>md5 110281-02.jar
#>finish
Enter the result of sum--including file name >
Enter the result of md5--only md5 value>
14. Linux 시스템상의 /etc/lilo.conf 파일을 통한 물리적 보안 설정
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level22
> 해당 패스워드(PW) : passwd=22
학교 연구실에 있는 실험용 서버인 Linux 7.0 서버는 학생들이 많이 출입하는 실습실에 설치되어 있다.
Linux 시스템의 물리적 보안을 위하여 BIOS에 암호를 설정한 상태이며 학생들이 싱글 유저 모드로 부팅하여
root 패스워드를 바꾸지 못하도록 미리 패스워드를 sislilo로 설정하여라.
=>
#vi /etc/lilo.conf
lilo에 설정파일에
password=sislilo 를 추가 한다.
#/sbin/lilo
lilo 실행
#finish
password is agrarian
---------------------------------------------------------------------------------
lilo......
1.lilo의 환경파일 및 실행파일
환경파일 : /etc/lilo.conf
실행파일 : /sbin/lilo
* 환경파일을 바꾸면 /sbin/lilo 를 실행해야한다.
2. lilo와 grub 간의 변경 방법
lilo -> grub 할때는 /sbin/grub-install /dev/hda
grub -> lilo 할때는 lilo.conf 파일을 작성하고 /sbin/lilo를 실행
3. lilo.conf파일 분석
#cat /etc/lilo.conf
prompt
timeout=20 -> 키보드 입력 시간 5초
default=linux -label 값(?)이 들어감
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
#message=/boot/message : 주석처리를 하면 부팅시 부트위치를 설정하는 부분을 없앤다(?)
message=/boot/message.txt : 임의로 원하는 파일 편집해서 지정할 수 있다.
linear
password=1234 -> lilo에 패스워드를 건다.
restricted ->password로 패스거는 방법은 모든 모드에 패스를 걸어 불편함으로 문제점을 보안하는 방법으로 default(/etc/initab)나 타 os는 패스를 안건다.
single-key :번호를 누르면 aliais번호(?)로 가도로 지정
image=/boot/vmlinuz-2.4.20.8 -> 실제 부팅이미지
label=linux
initrd=/boot/initrd-2.4.20-8.img ->부팅시 필요한 디바이스관련 이미지
read-only
append="root=LABEL=/"
alias=1 -> single-key 값
other=/dev/hda1
label=win
alias=2
4. /sbin/lilo -D 옵션
#lilo -D win : dafault 를 무시하고 win 으로 부팅하게 함
#lilo -D linux
Ignoring entry 'default'
Added linux *
-D 옵션으로 무시된것을 원상태로 복구
#lilo -u
#lilo
Added linux *
5. 참고[부팅디스크 만들기]
#mkbootdisk --device /dev/fd0 'uname -r'
부팅디스크로 부팅할때
cmos에서 floopy로 부트지정
boot:vmlinuz root=/dev/hda1
lilo를 실행하면 MBR(?)에 올라온다.
15. PAM 모듈을 이용한 내부 서비스 거부공격 대처를 위한 설정 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level24
> 해당 패스워드(PW) : passwd=24
실습용으로 학생들에게 계정을 부여한 학교의 Linux 서버에서 학생들이 실수 또는
고의적으로 프로세스나 CPU의 과도한 점유, 메모리 고갈등으로 다른 학생들이
실습을 할 수 없는 내부 서비스 공격이 자주 발생하고 있다. 이런 문제점을 해결
하기 위하여 학생들이 사용할 수 있는 CPU 선점시간을 최대 10분 그리고 Data
크기를 10M 최대로 띄울 수 있는 프로세스개수를 10개미만으로 제한하도록 하시오.
LINUX서버에는 PAM이 설치되어 있고 학생들은 student의 그룹으로 설정되어 있다.
=>
*문제 요점
- PAM 모듈 이용
- student 그룹으로 설정
- 설정해야 할 것
- CPU 선점시간 10분미만으로
- data 크기 10MB
- 최대 process 개수 10개 미만
*문제 풀이
-pam 설정 관련파일 : /etc/security/limits.conf
/etc/pam.d/login
/lib/security/pam_limits.so
limits.conf 파일 설명
------------------------------------------------------------------
: user name
groupname(ex: @groupname)
wildcard *
: "soft" or "hard"
- : core - limits the core file size (KB)
data - max data size (KB)
fsize - maximum filesize (KB)
memlock - max locked-in-memory address space (KB)
nofile - max number of open files
rss - max resident set size (KB)
stack - max stack size (KB)
cpu - max CPU time (MIN)
nproc - max number of processes
as - address space limit
maxlogins - max number of logins for this user
priority - the priority run user process with
--------------------------------------------------------------------
문제 대로 설정 해보자
@student soft nproc 9 // nproc 최대 process 개수
@student hard rss 10000 // rss data 크기
@student hard cpu 10 // cpu cpu 선점 시간
저장하고 나와서
/etc/pam.d/login 파일을 수정한다
session required /lib/security/pam_libmits.so
finish
password is MLaaVStzPP
---------------------------------------------------------------------
간단히 PAM 이란?
PAM은 장착이 가능한 인증모듈 이다.
PAM은 login, ftp, telnet 등의 일반적인 서비스에 대한 인증부분을 효율적이고 보다
쉽게 관리하기 위해 SUN사에서 처음 고안된 것으로 리눅스에서도 받아들여 사용하고 있다.
PAM으로 가능한 주요설정
1. 패스워드 크랙이나 부르트포스 공격(brute force attack)을 어렵게 만든다.
2. 사용자들 시스템 자원(프로세스 수, 메모리 양, 등..) 을 제한여 서비스 거부공격을
어느정도 막을 수 있다.
3. 패스워드를 쉐도우 패스워드로 감추는 것을 쉽게 할 수 있다.
특정한 사용자가 특정한 시간에 특정한 장소에서만 로그인 할 수 있도록
로그인 제한 설정을 가할 수 있다.
4. PAM을 이용한 최대 로그인수 및 각 사용자가 생성할 수 있는 프로세스의 최대 개수등의
제한 방법을 이용할 수 있다.
16. 솔라리스 시스템상에서 telnet, ftp 배너제거를 위한 설정 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level26
> 해당 패스워드(PW) : passwd=26
솔라리스 7 시스템에서 telnet, ftp 접속시 보여주는 배너의 내용에는 기본적으로
OS 버전이 나타난다. 이는 OS 버전별 취약점을 이용한 공격을 한층 쉽게 만드므로
배너에서 OS버전을 보여주지 않도록 설정하고자 한다.
telnet, ftp의 배너를 제거하도록 설정하시오.
=>
솔라리스에 배너 설정 파일은
/etc/default/에 telnetd과 ftpd
둘다 모두 빈 파일이다.
배너제거
#>echo "BANNER=\"\"" >> ftpd
#>echo "BANNER=\"\"" >> telnetd
#>finish
password is balbal
17. 주기적인 스크립트 실행을 통한 crontab 설정 문제
Question 28
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level28
> 해당 패스워드(PW) : passwd=28
아파치 웹서버를 운영하고 있는 솔라리스 2.7 시스템에서 매주 일요일 04:00시마다 access_ log와
error_log를 백업받아 특정 폴더에 저장하려고 한다. 원래의 access_log, error_log는 백업받은 후
사이즈 0인 파일로 만들고, 로그파일의 제목은 access_log_YYYYMMDD, error_log_YYYYMMDD로 하여
디렉토리 /var/adm/httpd/에 저장한다. 위 작업을 루트권한으로 crontab 기능을 이용하여 수행하시오.
아파치 웹서버의 위치는 /usr/local/apache이다.
예) 2002년 6월 30일 일요일 04:00에 access_log, error_log 파일을 백업
(이 때 로그파일 내용은 2002년 6월 23일 04:00 ~ 2002년 6월 30일 04:00까지의 로그)
- /usr/local/apache/logs/access_log 파일을 /var/adm/httpd/access_log_20020630로 백업하고
/usr/local/apache/logs/access_log 파일을 사이즈 0으로 만듬
- error_log도 access_log와 마찬가지
=>
매주 일요일 4시에 백업을 할려고 한다.
문제에서도 crontab을 언급한다.
crontab 옵션
-l : 리스트 보기
-e : crontab 수정
-r : crontab 제거
crontab 파일의 형식은 다음과 같습니다.
Minutes Hours Date Month Day-of-Week command
문제에서느 매주 일요일 4시 이기때문에
0 4 * * 0 /home0/yspace/cron.sh
그리고 스크립트를 수정한다.
vi /home0/yspace/cron.sh
#!/bin/bash
cp /usr/local/apache/logs/access_log /var/adm/httpd/access_log_`date +%Y%m%d`
echo "" > /usr/local/apache/logs/access_log
cp /usr/local/apache/logs/error_log /var/adm/httpd/error_log_`date +%Y%m%d`
echo "" > /usr/local/apache/logs/error_log
저장하고 해당 스크립트에 실행 권한을 주어야 한다.
chmod 755 /home0/yspace/cron.sh
crontab comman 부분을 스크립트가 들어 있는 곳으로 설정한다.
스크립트에서 명령어 부분은 ' 이 아니라 ` 이다.
passwd is KkYj9pognM
18.John The Ripper를 통한 취약한 패스워드 점검 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level29
> 해당 패스워드(PW) : passwd=29
시스템 관리자는 관리하고 있는 시스템의 사용자들이 취약한 패스워드를 사용하고 있는지 주기적으로
점검해야 한다. 취약한 패스워드 점검은 패스워드 점검툴을 이용하여 수행하고, 점검결과를 보고
해당 시스템의 사용자 중 패스워드가 취약한 사용자의 계정과 패스워드를 찾으시오.
단, 점검툴은 john the ripper(/usr/sbin/john)를 사용할 수 있다.
=>
아무 디렉토리에서 john을 실행 시키면 에러가 뜬다 -_-;
path에 등록 되어 있었는데 에러가;;
#>cd /usr/sbin/john
#>john /etc/shadow
결과를 볼려면
#>john --show /etc/shadow
bslle:common:11940::182:7:::
1 password cracked, 10 left
19. 시스템상의 특정 파일을 사용하는 불필요한 프로세스 제거
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level30
> 해당 패스워드(PW) : passwd=30
피해시스템을 분석하던 관리자는 /dev 디렉토리에서 침입자가 심어놓은 것으로 추정되는 파일을 발견했다.
이는 침입자의 악의적인 프로세스를 숨기기 위한 파일로 보이며 관리자는 이 파일을 찾아서 삭제하여야 한다.
그리고 이 파일을 사용하고 있는 프로세스가 있는지 확인하고 만약 존재한다면 그 프로세스를 종료시키시오.
=>
/dev 디렉토리에 누군가 심어놓았다면 만들어진 날짜가 최근일것이다.
#>ls -alt | more
ptyp
ptyq
/tmp
위에 3개 파일이 가장 최근에 만들어진 파일이다.
tmp는 빈 디렉토리이고
#>file ptyp
ptyp : 아스키 텍스트
#>file ptyq
ptyq: 아스키 텍스트
나머지 두개는 크기가 5, 6 정도인 아스키 텍스트 파일이다.
#>cat ptyp
bconn
#>cat ptyq
2222
ptyp에는 "bconn"이란 텍스트가 있고 ptyq에는 "2222" 텍스트가 들어가 있다.
ptyp 파일이 특정 프로세스 명을 숨기기 위한 파일로 사용된 것이라면
bconn이란 파일을 찾아보아야 할것이다. 2222이란 파일은 존재하지 않았다.
#>find / -name bconn 2>/dev/null
/usr/bin/bconn
ps -ef 에 결과에는 bconn이 나오지 않았다.
#>lsof /usr/bin/bconn
COMMAND PID USER ...
bconn 6271 2001 ...
lsof로 bconn을 사용하는 프로세스를 검색한 결과
bcoon 자신이 돌고있다.
여기서 보인다고 바로 프로세스 내리고 /dev에 파일을 삭제할려고하면 권한이 없다고 나온다 -_-;;
나와있는 PID를 가지고 다시 lsof로 찾아보자
#>kill -9 6271
문제에서 프로세스를 죽이고
프로세스를 숨기기 위한 파일을 삭제하라고 되어있다.
여기에서는 파일을 삭제하려면 권한이 없다고 나온다.
그래서
#> echo /dev/null > /dev/ptyp
#> echo /dev/null > /dev/ptyq
해당 파일안에 내용을 지워버렸다.
#>finish
password is QhUGHJuQij
#20. /etc/system 파일을 통한 session time out값 설정 문제
훈련 시스템에 접속하기 위한 아이디와 패스워드는 아래와 같습니다.
Question 32
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level32
> 해당 패스워드(PW) : passwd=32
평소 방화벽(Firewall)으로 운영되던 시스템의 네트워크 상태를 점검확인한 결과 사용자들이 session만
맺은 상태로 시스템 자원을 낭비하고 있다는 것을 발견하였다. 그래서 방화벽으로 운영하는 서버의
session time out값을 적당하게 유지함으로써 자원낭비를 막고 성능을 최적화시키려고 한다고 한다.
(이때 사용되는 session time out값은 200으로 설정을 하고 시스템 재부팅은 생략하도록 한다.)
=>
vi /etc/system
* session time out 설정
set swip :tcpidletimeout=200
21.root 사용자의 콘솔 접속과 로그인 세션값 설정 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level33
> 해당 패스워드(PW) : passwd=33
원격 시스템에서 root 계정을 사용해서 웹서버 관리를 해오던 시스템 관리자는 최근 웹서버를
모니터링 한 결과, 누군가 지속적으로 스니핑(sniffing)과 함께 불법적으로 root 계정으로 시스템에
접속을 한 사실을 발견했다. 그래서 관리자는 원격시스템에서 root 계정을 통한 접속을 차단하고
일정시간동안 사용을 하지 않는 사용자들에 대해서는 session을 끊고자 한다.
(즉, login session 값을 10분(600초)으로 하고자 한다.)
=>
로그인 세션 설정은 /etc/default/login 파일에서 다룬다
vi /etc/default/login
...
#CONSOLE=/dev/console
...
#TIMEOUT=300
...
두 옵션이 주석처리가 되어있다.
CONSOLE=/dev/console과 같이 설정된 경우 슈퍼유저로서 로그인은 단지 콘솔에서만 허용된다.
두옵션 모두 주석을 풀고 timeout 값을 600으로 변경한다. timeout 값은 초단위로 계산한다.
0~900 사이로 설정해야함.
22.스택stack상에서 프로그램 실행 방지를 위한 설정 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level34
> 해당 패스워드(PW) : passwd=34
시스템상에서 버퍼 오버플로우(Buffer over flow) 공격은 입력 값의 길이를 올바르게
검사하지 않아 생기는 취약점으로 하나로 프로그램의 실행 흐름을 바꾸어 특정 코드가
실행되게 하는 기법이다. 취약점이 발표된 벤더(vender)의 패치를 적용하는 것도
해결방법이지만 스택상에서 프로그램이 실행되지 못하게 하는 것도 하나의 대책이
될 수 있다.
스택상에서 실행코드가 수행될 수 없도록 하면서 로그를 남기도록 설정하고 시스템
재부팅은 생략하도록 한다.
=>
#> vi /etc/system
set noexec_user_stack=1
set noexec_user_stack_log=1
stack execution 방지와 그에 따른 로깅을 위한 설정이다
* #boot r
o 버퍼오버플러우 공격에 대한 “stack smashing”공격을 디폴트로 차단시키기 위해
실행 가능한 스택모드를 실행 불가능하도록 설정하여 운연하는것이 바람직하다.
위에 두 라인을 추가하고 시스템을 재부팅하면 된다
#23.비정상적인 사용자의 로그인 접속 기록 설정 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level35
> 해당 패스워드(PW) : passwd=35
얼마 전부터 웹서버 시스템 계정을 알게된 불법적인 사용자가 시스템에 접속하고자
계속해서 무차별 패스워드 공격을 하는 것을 발견하고 이에 대한 대비책으로
시스템 접속시 5번 이상 잘못된 패스워드를 5번 이상 입력한 사용자에 대해 별도의
로그정보를 남길수 있도록 로그파일을 생성하고 해당 사용자 ID에 대해서는 일정
시간 동안 로그인을 할 수 없도록 시스템에 설정을 하시오.
(로그 파일 생성은 시스템에서 이미 정해진 로그 파일명을 사용하도록 하시오.)
=>
#>vi /etc/default/login
RETRIES = 5
SYSLOG_FAILED_LOGINS=5
시스템 접속시 5번 이상 패스워드 오류시에
24. 솔라리스 시스템상에서 ACLs를 통한 제한적인 파일 퍼미션 설정
Question 38
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level38
> 해당 패스워드(PW) : passwd=38
오랫동안 Solaris 유닉스 시스템을 사용해오던 무선보안 연구소의 전산담당자는
파일서버에 있는 현재 진행되고 있는 프로젝트관련 파일(icert_solution.d)을
무선보안 연구팀내의 특정 사용자(itiger)에게만 별도의 쓰기 퍼미션을 줘서
프로젝트 수행을 하고자 한다.
이때 퍼미션 설정은 솔라리스에서 제공되는 ACLs을 사용하도록 하고 해당 파일은
/home0/cert/icert_solution.d이다.
조건)
- 소유자에게는 읽기/쓰기 권한 부여
- 그룹에게는 읽기 권한 부여
- 기타 사용자에게는 아무런 권한도 주지 않는다.
- itiger 계정에게는 읽기/쓰기 권한 부여
=>
ACL을 사용하기위한 명령어는
getfacl : acl 설정을 보기 위한
-a
-d
setfacl : acl 설정하기 위한
-r ??
-m 추가/수정
-d 삭제
설정 형대는 group:name:permision 이다.
/home0/cert/icert_solution.d 에 파일에 퍼미션을 보자
ls -al /home0/cert/icert_solution.d
-rw-r--r-- 1 root other icert_solution.d
조건중에 소유자 그룹 기타 사용자에 대한 설정은 chmod로 충분히 설정할수 있다.
chmod 640 /home0/cert/icert_solution.d
그리고 특정 계정에 설정을 하기위해서
setfacl -m user:itiger:rw- /home0/cert/icert_solution.d
password is pzX3oUQBq0
25. inetd 서비스에 대한 syslog 메시지 처리 설정 문제
Question 40
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level40
> 해당 패스워드(PW) : passwd=40
사내에 있는 파일서버 사용자들의 telnet, ftp 등 접속에 대한 정보를 확인하고자
솔라리스 서버 세팅시 원격지 사용자로부터 요구되는 inetd 서비스에 대한 접속정보를
추적할 수 있도록 설정을 하시오.
이것은 원격지 클라이언트의 IP주소와 port번호를 로깅함으로써 행해지는데, 이것은
inetd가 'daemon' facility와 'notice' messages level에서만 /var/adm/inetdlogs
파일에 로깅을 하도록 한다.
조건)
- ftp 서비스에 대한 로깅과 디버깅 기능에 대한 옵션값 설정
- 원격지 클라이언트의 IP주소와 port번호에 대해 로깅을 하도록 inetd 서비스
옵션값 설정
- syslog 로깅처리를 위한 설정조건
facility ==> daemon
messages level ==> notice
/var/adm/inetdlogs 파일에 로깅
=>
#>vi /etc/inetd.conf ->inetd.conf 파일 수정
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -ld
->-ld 로깅과 디버깅 옵션 추가
#>vi /etc/syslog.conf ->syslog.conf파일 수정
daemon.notice /var/adm/inetdlogs ->daemon.notice가 /var/adm/inetdlogs에 로깅 파일 저장
#>ps
#>kill -HUP syslog프로세스번호 ->syslog 프로세스 저장하고 재시작
#>kill -9 inetd프로세스번호
#>find / -name inetd |more
#>/usr/sbin/inetd -s -t ->IP주소와 Port 번호 로깅 하도록 재시작함
---------------------------------------
inetd 옵션
-s 옵션은 inetd 를 stand-alone 모드로 실행
-t 옵션은 TCP 로 접속하는 접속자의 IP 주소와 Port 정보를 로그에 기록
로그 기록에는 유닉스의 syslog를 사용함.
#26.ufsdump, ufsrestore를 이용한 백업 및 복구문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level41
> 해당 패스워드(PW) : passwd=41
UNIX 시스템의 /data 디렉토리 전체를 ufsdump 명령어를 사용하여
/data_bak/data.dump 파일로 가장 낮은 수준의 전체 백업을 하고, 백업한 데이터에서
/data/test.data 파일을 ufsrestore 명령을 사용하여 /data_bak/data.dump 파일로
복구하시오.
=>
백업
#> ufsdump 0uf /data_bak/data.dump /data
복구
#> ufsrestore svf /data_bak/data.dump /data/test.data
27.Apache 웹서버의 디렉토리 노출 취약점 제거 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level43
> 해당 패스워드(PW) : passwd=43
침해사고 피해시스템을 분석하는 중, 외부 IP(200.200.200.1)에서 지속적으로
telnet 접속했던 것이 확인되었다. 해당 피해시스템은 Apache 웹서버이고 웹서버의
option 설정은 디폴트로 되어 있었다. 조사결과 침입자는 웹서버의
디렉토리 리스팅 취약점을 이용하여 passwd, shadow 파일을 읽은 후
패스워드를 크랙한 것으로 추정된다. 비인가된 재접속을 막기 위하여
다음과 같이 보안조치를 하시오.
1. 웹서버 Option 설정변경 : Server-side includes(exec 기능 제외) 기능만
가능하도록 설정
2. 패스워드 정책변경 : passwd 유효기간을 8주, 8자리 이상으로 강제함
3. 공격IP에서의 접근제한 설정 : ipfilter를 이용하여 200.200.200.1에서의 접근을
제한
=>
찾아보니 /usr/local/apache/ 가 있다.
#> vi /usr/local/apache/conf/httpd.conf
#
#
# This may also be "None", "All", or any combination of "Indexes",
# "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
수전전 Options All
수정후 Options IncluedesNOEXEC
옵션 :
Indexes
FollowSymLinks
MultiViews
=>
패스워드 정책 수정
#>vi /etc/default/passwd
MAXWEKS=8
MINWEKS=0 /default value
WARNWEEKS=1 /default value
PASSLENGTH=8
=>
/etc/opt/ipf 밑에
ipf.conf 파일이 있다.
#> vi ipf.conf
block in from 200.200.200.1/32 to any
28.crontab 명령어 실행에 대한 사용자 접근제어
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level50
> 해당 패스워드(PW) : passwd=50
관리자 이씨는 솔라리스 서버를 관리하는 초보 관리자이다.
훌륭한 관리자가 되기 위해서는 서버의 설치 관리뿐만 아니라 보안에도 많은 신경을
써야한다는 것을 알게 되었다. 그래서 보안에 관한 공부를 하던 도중 해킹 기법 중에
일반 사용자가 root권한을 얻기 위해 crontab을 이용하여 race condition과 같은
해킹 기법을 할 수 있다는 것을 알고 root가 아닌 일반 사용자의 접근제어가 필요하다
는 사실을 알게 되었다.
crontab 명령어를 사용하는데 있어 백업 관리자(dump_admin)를 제외한 일반 계정의
접근 권한을 제한 하시오.
=>
cron에 대한 설정은 /etc/cron.d 에 있다.
원래는 cron.deny 와 cron.allow가 둘다 있어야 되지만
본 서버에는 cron.allow가 없다.
그래서 cron.allow를 만들어야 한다.
#>vi cron.allow
dump_admin
허용시킬 사용자만 추가 하고 저장
29.리눅스 시스템의 소프트레벨 커널 튜닝
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level51
> 해당 패스워드(PW) : passwd=51
리눅스에서 syn flooding 등 각종 공격에 대응하기 위하여 시스템의 kernel 튜닝을
하는 것이 좋다.
다음의 기능이 작동하도록 커널 튜닝을 하여라.
* ping 요청에 반응하지 않도록 설정한다.
* 소스 라우팅을 차단한다.
* synflooding 에 대응하기 위해 syncookie를 설정한다.
* ICMP Redirect를 차단한다.
* 스푸핑, 소스 라우팅 및 리다이렉트된 패킷은 로그에 남긴다.
* 패킷 포워딩을 차단한다.
=>
* ping 요청에 반응하지 않도록 설정한다.
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# Broadcast로부터 오는 핑을 차단함(Smurt 공격을 차단함).
sysctl -w net.ipv4.icmp_echo_ignore_all=1
# 모든 핑을 차단함
* 소스 라우팅을 차단한다.
sysctl -w net.ipv4.conf.eth0.accept_source_route=0
sysctl -w net.ipv4.conf.lo.accept_source_route=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.all.accept_source_route=0
# 스푸핑을 막기 위해 source route 패킷을 허용하지 않는다.
소스 라우팅을 허용할 경우 악의적인 공격자가 IP 소스 라우팅을
사용해서 목적지의 경로를 지정할 수도 있고, 원래 위치로 돌아오는
경로도 지정할 수 있다. 이러한 소스 라우팅이 가능한 것을 이용해 공격
자가 마치 신뢰받는 호스트나 클라이언트인 것처럼 위장할수 있는것이다.
* synflooding 에 대응하기 위해 syncookie를 설정한다.
sysctl -w net.ipv4.tcp_syncookies=1
* ICMP Redirect를 차단한다.
sysctl -w net.ipv4.conf.eth0.accept_redirect=0
sysctl -w net.ipv4.conf.lo.accept_redirect=0
sysctl -w net.ipv4.conf.default.accept_redirect=0
sysctl -w net.ipv4.conf.all.accept_redirect=0
# icmp redirects를 허용하지 않는다.
만약 ICMP Redirect를 허용할 경우에는 공격자가 임의의 라우팅 테이블을
변경할 수 있게 되어 자신이 의도하지 않는 경로, 즉 공격자가 의도한
경로로 트래픽이 전달될 수 있는 위험이 있다.
* 스푸핑, 소스 라우팅 및 리다이렉트된 패킷은 로그에 남긴다.
sysctl -w net.ipv4.conf.eth0.log_martians=0
sysctl -w net.ipv4.conf.lo.log_martians=0
sysctl -w net.ipv4.conf.default.log_martians=0
sysctl -w net.ipv4.conf.all.log_martians=0
# 스푸핑된 패킷이나 소스라우팅, Redirect 패킷에 대해 로그파일에 정보를 남긴다.
* 패킷 포워딩을 차단한다.
sysctl -w net.ipv4.ip_forward=0
# 게이트웨이 서버가 아닌 이상 패킷을 포워딩 할 필요는 없다.
30.sudo를 이용한 특정사용자에게 특정 명령어에 대한 권한 부여
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level52
> 해당 패스워드(PW) : passwd=52
IT 업체인 W사는 솔라리스 서버를 이용하여 사용자들의 홈페이지를 제작해주는
업체를 경영하였다. 1년 정도의 시간이 지나자 많은 사용자들이 서버에 입주했고
입주 업무가 폭주하다 보니 별도의 상담 업무만을 전담하는 직원을 두게 되었다.
상담원 이씨에게 사용자들의 id 개설 업무를 주었는데 팀장 황씨는 시스템의
다른 권한은 주고 싶지 않았다.
이에 대한 접근제어 역할을 제공하는 도구를 찾던 중 sudo라는 도구가 훌륭히 역할을
수행 할 수 있다는 것을 알았다.
sudo를 이용하여 상담자 이씨(id: user_admin)에게 useradd 명령어에 대한 권한을
주도록 설정하라.
=>
#> find / -name useradd 2>/dev/null
/usr/sbin/useradd
#> vi /etc/sudoers
user_admin ALL=/usr/sbin/useradd
#> finish
------------------------------------------------------------------------------------------------------
▶ sudo 명령어
관리자가 특정 사용자에게 특정 명령을 root 계정으로 실행할 수 있는 권한을 부여한다.
sudo 명령어 다음에 사용하고자 하는 명령어를 입력하면 sudo 유틸리티는 /etc/sudoers
파일내에 현재 호스트에서 그 명령어를 사용하는 것이 허가 되어 있는지를 확인한 후,
허가 되어 있으면 패스워드를 입력하여 사용하도록 한다.
한번 sudo 명령어를 사용하면 5분간 허용된 명령어를 사용할 수 있는 권한이 부여되고,
다시 sudo 명령어를 사용할 때마다 그 시간은 갱신된다. 시간이 지나면 다시 패스워드를 입력해야함.
예) sudo shutdown -g 5 -i 0 -y
★ 옵션
* -l : 사용에게 허용됐거나 금지된 명령어 목록 출력.
* -v : 사용자의 타임스탬프 필드를 확인 후 타임아웃시간을 늘린다.
* -k : 타임스탬프를 죽인다. (sudo 타이머 동작을 멈춤)
* -b : sudo가 명령을 백그라운드로 실행하도록 함.
★ 구성파일 : /etc/sudoers
* user, host, command 정의 가능.
* user, host, command의 alias 지정 가능
* 구조
user host = commands
user : login id, alias name
host : hostname, alias host name
commands : 콤마로 구분되는 명령어 리스트
예) rootALL = ALL : 루트 유저가 모든 호스트 상에서 모든 명령어 사용가능
heaven hostA = /usr/sbin/shutdown : heaven이라는 유저가 호스트 A상에서
shutdown 명령어
사용 가능
31. ssh 인증키 인증설정 문제
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level54
> 해당 패스워드(PW) : passwd=54
솔라리스 서버를 운영하고 있는 모 보안 업체에서 ssh를 사용한 터미널 접속만
허용하고 있다.
현재 모든 사용자들이 해당 시스템 계정의 등록된 암호를 이용해 ssh를 접속하고
있는데, 이 보안 업체에서는 좀더 안전한 ssh 인증을 위하여 인증키에 기반한
ssh 인증 방식을 권장하고 있다.
이 보안 업체가 제공하는 서버의 사용자로서 인증키 기반의 ssh 접속을 위해
키 생성 및 공개키 배포를 하라.
< 환경 및 필요 정보>
- 인증키는 ~/.ssh/id_rsa 로 생성한다.
- 공개키를 배포할 곳의 도메인은 “PubHome" 이다.
- PubHome의 ID는 pascal, Password는 cobol 이다.
- 공개키를 배포할 때는 scp를 이용하라.
=>
인증키 생성
#> ssh_keygen -t rsa
Enter passphrase:
Enter same passphrase again:
#> scp /~/.ssh/id_rsa pascal@PubHome:.ssh/authorized_keys
32.시스템 파일의 퍼미션 및 소유권 보안설정
> 훈련 시스템 접속 주소 : 211.241.82.54
> 해당 아이디(ID) : level55
> 해당 패스워드(PW) : passwd=55
시스템을 초기화하는 과정에서 find 프로그램을 이용하여 보안상 문제가 될 수 있는
파일이나 디렉토리를 찾아 적당한 퍼미션으로 변경하는 것이 중요하다.
따라서 아래의 과정은 시스템 초기화과정에서 중요한 단계라 할 수 있는데,
각각의 단계에 따라 문제가 될 수 있는 파일 또는 디렉토리를 찾아 파일로 저장하라.
* 외부에서 쓰기 권한이 설정된 디렉토리와 파일을 찾아/tmp/write.txt 로 저장하라.
* 소유자가 없는 파일을 찾아 /tmp/no_own.txt 파일로 저장하라.
* suid / sgid 가 설정된 파일을 찾아 /tmp/suid.txt 파일로 저장하라.
=>
#> find / -type f \( -perm -04000 -o -perm -02000 \) -print > /tmp/suid.txt
#> find / -type f \( -perm -04000 -o -perm -02000 \) -print | grep -v proc > /tmp/suid.txt
*grep -v 명령으로 tmp와 proc이 관련된 디렉토리를 리스트에서 삭제
#> find / -nouser -o -nogroup | grep -v '/tmp/' | grep -v '/proc/' > /tmp/no_own.txt
#> find / -perm -20 -print > /tmp/write.txt
# finish
33.윈도우 NetBIOS 서비스 보안
IDC(인터넷 데이터 센터)에 서버를 임대하여 사용중인 ekms21세기 회사가 있다.
시스템 관리자는 네트워크 환경을 통해 자신의 서버가 노출되고 있다는 것을
알게 되었다.
또한 동일 네트워크 내에서 불필요한 파일 공유 접속 시도가 빈번히 발생되어
이벤트 로그가 계속 가득차는 현상이 발생되고 있다.
Microsoft Windows 네트워크 환경을 통해 자신의 서버가 Browsing 되지 않고,
파일이나 프린터가 네트워크를 통해 공유되지 않도록 설정하시오.
포트 필터링 방법은 제외하며 네트워크 설정을 통해 Browsing 되지 않도록 설정한다.
=>
34. 익명 보안 옵션
1. 윈도우 서버는 기본적으로 원격 컴퓨터에서 익명 연결을 허용하고 있다.
익명 접근을 통해 서버에서 획득 가능한 정보들로는 로컬컴퓨터의 사용자명,
그룹정보, 공유자원 정보, 네트워크 정보 등이다.
이러한 위험에 대비하기 위해 원격 컴퓨터에서 익명 사용자의 접근을
차단하도록 레지스트리 값을 설정하여라.
=>
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 에
"restricAnonymous" 값을 "2"로 변경
2. 바이러스, 해킹은 공유된 폴더나 관리용 폴더를 통해 전파되는 특성이 있다.
특히 관리용 폴더는 초기 공유 폴더 이름이 모든 컴퓨터 마다 동일하게
적용되어 있으므로 유추가 매우 쉽다. 시스템이 자동으로
관리 공유(IPC$,C$,D$등)를 만들지 않도록 레지스트리 값을 설정하여라.
=>
[기본 공유 제거 - XP / 2003]
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters"
- Value name : AutoShareServer
- Data Type : DWORD
- Value : 0(zero)
[기본 공유 제거 - 2000]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
- Value name : AutoShareWks
- Data Type : DWORD
- Value : 0(zero)
3. 익명 사용자가 서버 공유 폴더 명을 확인하지 못하도록 'c:\data'를 data이름을
가진 숨김 공유로 만들어라.
=>
net share data$=c:\data
36. rpm 패키지 관리 명령을 이용한 변조된 파일 확인
Linux 시스템의 패키지 관리 명령인 rpm 은 시스템 분석에 매우 유용한 도구이다.
특히 설치된 패키지의 변조된 파일을 분석하는데 사용될 수 있다.
rpm 명령을 사용하여 변조된 실행 파일을 찾도록 한다.
=>
rpm -V 패키지명 으로 확인가능하다.
그전에 실행 파일이 어떤 패키지에 있는지 확인해야한다.
예를 들어 /bin/ls 가 어떤 패키지 인지 확인하려면
#>rpm -qf /bin/ls
coreutils-4.5.3-19
라도 나온다.
#>rpm -v coreutils
S.5....T /bin/ls
현재 ls는 파일에 사이즈가 변경되었다. 그러면서 만들어진 시간과 md5 가 변경되었다는 것을 알수 있다.
설명 :
5 MD5 sum
S File size
L Symlink
T Mtime
D Device
U User
G Group
M Mode (퍼미션&file type)
바이너리파일(실행파일)이 크기가(S) 변경되었다면 시스템크래킹 여부와 전체적인 시스템 체크가 필요합니다.
37. chkrootkit 을 이용한 rootkit 탐지
chkrootkit 은 시스템을 검색하여 현재까지 잘 알려진 rootkit 을 탐지해 주는
도구로서 매우 간편하게 자신의 시스템에 rootkit, 특히 알려진 rootkit 이
설치되어 있는지 점검해 볼 수 있다.
또한 LKM 기반 rootkit 의 설치여부에 대해서도 진단을 해준다.
chkrootkit 을 설치해 보고 다음의 문제를 해결하도록 한다.
chkrootkit 프로그램은 /root 디렉토리에 위치해 있다.
운영 중인 Linux 시스템의 로그 중 일부가 삭제된 것을 발견하였다.
해킹 여부를 판단하기 위하여 chkrootkit 프로그램을 이용하여 해킹여부를
판단하고, 어떠한 피해가 있는지 확인하도록 한다.
- 공격자에 의해 변조된 시스템 명령은 어떤 것인가 ?
- 공격자에 의해 숨겨진 프로세스는 어떤 것인가 ?
주: chkrootkit, chkproc, lsof 를 이용해서 문제를 해결한다.
주: chkrootkit은 옵션을 사용하지 않고 실행시킨다
=>
tar -zxvf 파일명으로 압축을 풀고 make 명령어서 설치를 한다.
이제 하나씩 실행해본다.
chkrootkit은 옵션을 사용하지 말라고 했지 때문에
그냥 실행해본다.
#>./chkrootkit > result
result 를 열어서 보면
중간에
chkecing `ps' ... INFECTED
...
라고 나왔다.
더 밑으로 내려가 보자
...
checking `lkm' ... You have 1 process hidden for ps command
chkproc: Warning: Possible LKM Trojan installed
...
여기에서 lkm 명령어가 변조되었다는 것과 숨겨진 프로세스가 하나 있다는 것이다.
그렇다면 숨겨진 프로세스에 PID를 확인해보자
#>./chkproc -v
1776 is a Linux Thread, marking as such...
1777 is a Linux Thread, marking as such...
1778 is a Linux Thread, marking as such...
1779 is a Linux Thread, marking as such...
1810 is a Linux Thread, marking as such...
PID 1863: not in ps output
You have 1 process hidden for ps command
숨경진 프로세스에 PID는 1863번이다. 그러면 1863 프로세스에 이름을 확인할 차례이다.
#>lsof -p 1863
COMMAND PID
bindshell 1863 root ....
bindshell 1863 root ....
결과로 bindshell 이란 process가 숨겨져 있다.
bindshell에 위치를 찾아보자
만약에 bindshell이 find 명령어를 변조했다면 나오지 않을것이다.
하지만 여기에서는 잘 찾아진다.
#>find / -name bindshell 2>/dev/null
/home/rootkit/bindshell
/home/rootkit 디렉토리에서 확인을 해보자 나오지 않는다.
이말은 ls 명령어도 변조되었기 때문이다.
Q. 공격자에 의해 변조된 시스템 명령은 어떤 것인가 ?
ls ps
Q 숨겨진 프로세스의 전체 경로는 무엇인가?
/home/rootkit/bindshell