본문 바로가기
(실기) 정보보안기사&산업기사

UNIX/Linux 기본 학습 26~서버취약점 1,2,3

by IT매니절 2024. 3. 15.

 

 

포맷 스트링 공격 Format String Attack (FSB라고도 함)
- 포맷 스트링은 printf()등의 함수에서 다양한 타입의 데이터를 문자열로 출력하기 위한 서식문자열
입력된 값을 검증하지 않고 입출력 함수의 포맷 스트링을 그대로 사용하는 경우의 취약점을 이용
- 포맷 스트링을 이용해 취약한 프로세스를 공격하거나 임의의 코드를 실행하거나, 메모리 내용을 읽거나 쓸 수 있다.- printf, fprintf, sprintf

ex
printf("name : %s, age:%d %n \n", name, age, &nbytes); <- &붙이면 주소값 반환
=> 서식식별자 %d10진수정수 %s문자열 %c문자 %f실수

%n, %hn
출력한 총 바이트수를 저장하는 변수.
악성코드의 주소값을 저장시키는 방식으로 공격할 수 있음

 

취약점

포맷 스트링을 지정하지 않고 사용자 입력을 통해 포맷 스트링이 결정된다면,
공격자는 이를 조작하여 메모리 내용을 참조하고 변경할 수 있다

 

int main(int argc, char **argv){
 printf(argv[1]);
}
# ./test "%8x %8x %8x %8x "

소스코드 : 외부입력값을 그대로 출력
호출 : 외부입력을 넣어 호출

printf는 외부입력값 "%8x~"를 읽는데
그에 대응되는 변수 지정이 없으므로, 현재 할당된 스택의 메모리를 순차적으로 읽어나간다
이 때 읽어온 변수중에 공격자가 원하는 주소값(이를테면, RET나 SFP)을 탈취할 수도 있고
%n, %hn으로 덮어쓸 수도 있다
(상당히 어려운 공격방식으로 실습은 힘들고 원리만 공부)

 

대응방안
- 포맷 스트링을 입력 파라미터로 직접 사용하지 않는다 ex printf("%s", argv[1]);

 

(키워드 복습
stack buffer overflow
=> strcpy

race condition
=> 임시파일 생성, 심볼릭 링크, 권한상승

Format String Attack
=> printf )

 

 

-- 기본학습 끝

 

계정관리
1) root 이외의 UID가 0 금지

2) 보안설정
/etc/passwd 파일 내 UID 확인
=> 적절한 UID를 재부여하거나 불필요한 경우 계정 삭제

SOLARIS, (100이상 권장)
LINUX, (100이상 권장)
HP-UX (500이상 권장)
=> usermod -u 1234 user1              //UID를 1234로 변경

(fedora/centos의 경우 root가 아닌, uid 0인 계정의 usermod 변경이 안됨

usermod -u 1000 user1
usermod: user user1 is currently used by process 1

/etc/passwd 파일을 수정하여 변경해야 함)

AIX
=> chuser id=1234 user1                 //UID를 1234로 변경

+userdel -r : -r추가하면 메일박스, 홈디렉터리까지 전부 삭제됨

 

패스워드 복잡성 설정
(가) 부적절한 패스워드 유형
- 사전에 나오는 단어나 이들의 조합
- 너무 짧거나 공백(NULL), 키보드 자판 일련순 ex qwer, asdf, 1234
- 사용자 계정 정보과 관련있는 단어

(나) 관리 방법
- 영문, 숫자, 특수문자 조합, 계정명과 상이한 8자 이상의 길이
영문 대문자, 영문 소문자, 숫자, 특수문자 2종류 이상을 조합한 10자이상 또는 3종류 이상 8자 이상의 길이
- 시스템마다 상이한 패스워드 사용, 패스워드를 기록할때는 변형하여 기록

 

패스워드 최소 길이 설정
패스워드 무차별 공격 Brute Force Attack이나 패스워드 추측 공격 Password Guessing을 피하기 위함

보안설정
1) SOLARIS
 - cat /etc/default/passwd의 PASSLENGTH=8
2) LINUX
 - cat /etc/login.defs의 PASS_MIN_LEN 8
3) AIX
 - cat /etc/security/user의 minlen=8
4) HP-UX
 - cat /etc/default/security의 MIN_PASSWORD_LENGTH=8

 

패스워드 최대 사용 기간

보안설정
1) SOLARIS
 - cat /etc/default/passwd의 MAXWEEKS=12 (단위: 주)
2) LINUX
 - cat /etc/login.defs의 PASS_MAX_DAYS 90 (단위: 일)
3) AIX
 - cat /etc/security/user의 maxage=12 (단위: 주)
4) HP-UX
 - cat /etc/default/security의 PASSWORD_MAXDAYS=90 (단위: 일)

 

패스워드 최소 사용 기간
최근 암호사용 제한을 오해하여,

사용자에게 익숙한 패스워드(기존에 사용하던)를 사용하지 않게 하기 위하여.

(ex 최근 3회 제한이 있을때, 하루에 4회 변경 후 기존 패스워드로 바꿔놓을 수 있음)


보안설정
1) SOLARIS
 - cat /etc/default/passwd의 MINWEEKS=1 (단위: 주)
2) LINUX
 - cat /etc/login.defs의 PASS_MIN_DAYS 1 (단위: 일)
3) AIX
 - cat /etc/security/user의 minage=1 (단위: 주)
4) HP-UX
 - cat /etc/default/security의 PASSWORD_MINDAYS=1 (단위: 일)

 

* 단위 : SOLARIS, AIX

* 단위 : LINUX, HP-UX

 

패스워드 파일 보호
- 평문으로 저장하면 유출 피해가 있을 수 있어, 암호화하여 보호하여야 함
- shadow 패스워드를 사용하여 /etc/shadow 파일에 저장하고 권한이 있는 사람만 읽을 수 있게 제한

 

SOLARIS, LINUX
/etc/shadow 파일, /etc/passwd 파일의 두 번째 필드 x 표기

AIX
/etc/security/passwd 파일

HP-UX
- /tcb/files/auth 디렉터리, /etc/passwd 파일 두번째 필드 x 표기

 

쉘 변수
1. 지역변수 : 선언된 쉘에서만 사용 가능
2. 환경변수 : 선언된 쉘 뿐만 아니라 자식 쉘에서도 사용 가능

 

실습
VAR='1234'   <- 지역변수 선언
echo $VAR   <- 사용시 $ 붙여서 사용
sh                 <- 자식쉘 생성
echo $VAR   <- 자식쉘에서 사용불가
exit               <- 자식쉘 종료
export VAR  <- export 붙여주면 자식쉘에서도 사용가능

 

*Session Timeout 설정

- 접속된 상태로 방치될 경우 악의적 목적으로 사용될 수 있으므로, 일정시간 이후 이벤트가 발생하지 않으면 연결을 종료

보안설정
<sh, ksh, bash 사용시>
cat /etc/profile 또는 .profile
TMOUT=600
export TMOUT (한줄로 export TMOUT=600)

<csh 사용시>
cat /etc/csh.login 또는 /etc/csh.cshrc
set autologout=10

 

/etc/profile

모든 사용자에게 적용되는 환경설정파일

계정에 접속하면, /etc/profile 파일을 먼저 읽고,
개별 사용자 홈 디렉토리의 .bash_profile 파일을 추가로 읽어 적용하게 된다

 

 

-- 1 END

 

PATH 환경변수 : 명령어를 실행하기 위한 경로

파일 및 디렉터리 관리
1) root 홈, 패스 디렉터리 권한 및 패스 설정
- PATH 환경변수에 . 이 포함되어 있으면, root 계정으로 접속한 관리자가 의도하지 않은 현재 디렉터리에 위치하고 있는 명령어가 실행될 수 있다.
- 특히 /bun/sbin 등 명령어보다 우선하여 위치할 경우, root 관리자가 특정 명령을 실행시 불법적으로 현재 디렉터리에 위치시킨 파일을 실행하여 예기치 않은 결과를 가져올 수 있음 ($PATH의 경로에서 순차적으로 명령어를 찾기 때문에)
.을 환경변수에 포함하려면 맨 마지막으로 이동시키거나 불필요시 삭제한다

 

$PATH 맨 앞에 . 이 있으면?
ps나 pwd 등을 사용할 때 /usr/bin/ps ~가 아니라 ./ps ./pwd (공격자에 의해 변조된) 가 실행된다


PATH=$PATH:.
=> 현재 PATH에 현재 디렉터리를 추가한다
=> 현재 디렉터리의 실행파일을 ./ 없이 실행할수있게됨

 

. .bash_profile
=> profile 정보를 다시 읽을 때의 명령어

 

sh, bash, ksh
=> /etc/profile

csh
=> /etc/.login

리눅스는 bash쉘 이고 개인설정은 $HOME/.bash_profile

 

-- 2 END

 

파일 및 디렉터리 소유자/소유그룹 설정
- 소유자/소유그룹이 없는 파일/디렉터리는 현재 없는 소유자/그룹의 소유거나 관리소홀로 인해 생긴 파일일 수 있다
시스템 자원 낭비가 될 수 있고 중요한 파일 및 디렉터리는 관리가 되지 않는 문제

보안설정
1. 소유자/소유그룹이 없는 파일/디렉터리 검색
find / \( -nouser -o -nogroup \) -exec ls -al {} \;

2. 불필요시 삭제필요하다면 chown과 chgrp 명령어를 통해 소유자/소유그룹을 변경한다
ex
chown user1 test.txt
chgrp user1 test1.txt
또는
chown user1:user1 test1.txt

(chown 소유자:소유그룹 파일명)

 

(그룹은 /etc/group 에서 확인가능하다.

useradd시 따로 그룹을 지정해주지 않으면, 유저명과 같은 그룹을 생성하여 설정한다.

그룹지정 : useradd user1 -g group1 )

 

world writable 파일 점검
- 모든 사용자(others)에게 쓰기 권한이 부여되어 있는 파일
- 일반 사용자의 실수 또는 악의적으로 주요 파일 정보를 변경할 수 있기 때문에 시스템 장애나 공격에 활용될 수 있음

 

보안설정
1) world writable 파일/디렉터리 검색
find /폴더 -perm -2 -exec ls -la {} \;
또는
find /폴더 -perm -0002 -exec ls -la {} \;
=> r4 w2 x1, 즉 2 = others의 w 권한

2) 모든 사용자의 쓰기(w)권한을 삭제 또는 불필요한 파일/디렉터리 삭제
chmod o-w ww_test.txt

또는 rm -rf 로 삭제

 

주요 파일 소유자 및 권한 설정
1. /etc/passwd : root 소유의 644 이하 권한 설정 rw-r--r--
2. /etc/shadow : root 이외에 read 불가, root 소유의 400이하 권한 r--------
3. /etc/hosts : IP와 호스트 이름 매핑시 사용. root 소유의 600 이하 권한 (금융위원회 권고 644 : hosts 파일은 다른 어플리케이션이 참조할 수도 있기 때문에) rw------- or rw-r--r--
4. /etc/(x)inted.conf : inetd데몬 설정파일. 악의적 프로그램을 등록하고 root 소유 권한으로 실행될 가능성 있음. root 소유 600 이하 권한 rw-------
5. /etc/syslog.conf : syslogd 데몬 설정파일. 시스템 로그가 정상적으로 기록되지 않으면 분석에 애로사항이 생김. root 소유의 644 이하 권한 rw-r--r--
6. /etc/services : 서비스 관리(서비스별 포트/프로토콜) 정보 파일. 정상적인 서비스를 제한하거나 비허용 서비스를 등록하게 될 수 있음. root 소유의 644 이하 권한 rw-r--r--