정보보안기사 필기/실기 동시 대비 - 시스템 보안
oolongeya
·2022. 7. 19. 23:26
사지방에서 글을 작성합니다. 설치하고 이용하는 것이 제한되어서 AWS EC2 환경에서 우분투 인스턴스로 작업했습니다.
저처럼 군대에서 공부하시는 분들도 AWS를 이용해서 공부하는게 도움이 됩니다. (요금도 저렴합니다)
연습하실 때는 리눅스로 직접 타이핑하시는 것을 추천합니다.
- ASLR(Address Space Layout Randomization)
실행파일이 메모리에 로드될 때 기본주소(ImageBase)는 항상 동일한 주소를 갖는다. 하지만 이렇게 동일한 메모리 주소를 가지면 공격자에게 매우 취약한 문제점이 발생한다. 즉, 주소가 동일하기 때문에 해당 주소에 악성 코드를 적재하기 쉬워진다.
-> 이런 문제점을 고치기 위해 메모리 주소를 항상 동적으로 할당하게 한다
-> 즉 기본주소(ImageBase)가 동적으로 할당된다.
-> 리눅스에서도 기본주소를 동적으로 사용할 수 있는 시스템 변수가 있다.
ASLR을 해제 (고정주소)
sysctl -w kernel.randomize_va_space=0
ASLR을 설정 (동적주소)
sysctl -w kernel.randomize_va_space=1
- sysctl 이란?
sysctl 는 명령어인데,
런타임(Runtime)중에 /proc/sys 하위 디렉토리에 대한 커널 매개변수 값을 변경할 때 사용하는 명령어. 리눅스 커널에 대한 설정값 변경 및 조회가 가능하며 커널 튜닝을 위한 명령어라고 생각하면 됨.
시스템 관리자라면 sysctl 명령어를 알아둬야 하며 DDoS 방어를 위해서 네트워크 트래픽 관련된 커널 매개변수들은 필수로 숙지해아함. /proc/sys 하위 디렉토리에 존재하는 디렉토리를 구분하는 '/'sysctl 명령어 이용시 '.' 으로 대체함.
- 스택 버퍼 오버플로우 공격(Stack Buffer Overflow Attack)
스택에 저장되어 있는 복귀주소가 지역변수에 의해서 침범 당하는 공격이다.
버퍼 오버플로우에 취약한 함수 | 버퍼 오버플로우를 방지하는 함수 |
strcpy, strcat, getwd, gets, fscanf, scanf, sprintf | strncpy, strncat, fgets, vfscanf, snprintf, vsnprintf |
- 경쟁 조건 (Race Condition)
다중 프로세스 환경에서 두 개 이상의 프로세스가 동시에 수행될 때 발생되는 비정상적인 상태를 의미한다.
즉, 임의의 공유자원을 여러 개의 프로세스가 경쟁하기 때문에 발생한다.
우선 백도어(Backdoor) 파일을 하나 생성한다.
test.c
참고로 UID와 GID의 0은 오직 root 사용자만 가질 수 있다.
백도어를 만든 후에 chmod 명령어를 이용해서 setuid를 설정해야 한다. 그야 임의 사용자가 백도어 파일을 실행할 수 있다.
test.c 백도어 파일에 대해서 racecondition 심볼릭 링크를 만든다. (심볼릭 링크는 윈도우에서 바로가기 같은 개념이다.)
일반 사용자가 터미널 로그인 이후 racecondition 심볼릭 링크를 실행하면 바로 root 권한 획득 가능이다.
여기까지는 일반적인 setuid 취약점을 이용한 백도어 공격이다.
만약 root 사용자가 test.c 라는 백도어 프로그램을 삭제했어도 심볼릭 링크에는 링크 정보가 그대로 남아있다.
그리고 root 사용자가 만약 test라는 이름의 파일을 같은 디렉터리에 생성 하면 심볼릭 링크 정보가 그대로 남는다.
이렇게 하는 공격이 경쟁조건(Race Condition)이다.
- ln 이란?
ln은 Link의 약어로 리눅스 파일시스템에서 링크파일을 만드는 명령어이다. 링크 파일은 두 가지 종류가 있다.
심볼릭 링크(Symbolic Link) : 단순히 원본파일을 가리키도록 링크만 시켜둔 것 (윈도우의 바로가기)
하드링크(Hard Link) : 원본파일과 다른 이름으로 존재하는 파일 (복제본인데 원본 바꿀 시 같이 바꿔짐)
- APT (Advanced Persistent Threat)
특정 기법 및 조직을 대상으로 다양한 공격 기법을 사용하여 지속적으로 공격을 수행하는 행위
흔히 SNS을 사용하여 정보수집, 악성코드 배포를 수행하고 공격표적을 선정하여 지속적으로 공격을 수행한다.
Zero Day Attack은 소프트웨어 패치 전에 취약점을 이용한 공격이고, MAIL APT는 악성코드를 메일에 첨부하여 발송하고
이를 통해서 정보를 획득하는 공격이다. 백도어 APT는 표적에 침투 후 백도어를 설치하여 재침입 시에 유입경로를 열어두는 것이다.
- 바이너리 디핑(Binary Diffing)
Zero Day Attack 취약점을 찾을 수 있는 기법이다. 리버싱 분야에서 활용된다. 디핑 기술을 이용해서 스크립트된 바이너리 함수 정보를 획득한다.
- CDR (Content Disarm & Reconstruction)
첨부파일에 있는 매크로를 자동으로 삭제한다.
이메일 첨부파일을 이용하여 첨부파일 다운로드 / 공격 -> 감염되는 공격 기법에 대응한다
- 윈도우 인증 시스템
* 인증 프로세스 구성요소
구성요소 | 세부 내용 |
Winlogon | 윈도우 로그인 프로세스 winlogon은 내부적으로 msgina.dll이라는 GINA 프로그램을 구동시키며 검증을 위해서 아이디를 LSA에 전달한다. NTML값과 SAM에 저장된 NTLM값을 비교해서 같으면 SRM에게 권한(토큰)을 부여한다. |
GINA(msgina.dll) | Winlogon은 msgina.dll을 로딩하여 사용자가 입력한 계정과 암호를 LSA에게 전달 |
LSA(lsas.exe) | - 계정과 암호를 검증하기 위해서 NTLM(암호화)모듈을 로딩하고 계정을 검증 - SRM이 작성한 감사로그를 기록 |
SAM | - 사용자 계정정보(해시 값)에 저장 - 리눅스의 /etc/shadow 파일과 같은 역할을 수행 |
SRM | 사용자에게 고유 SID를 부여하고 SID에 권한을 부여 |
- 윈도우 실행 프로세스
* 윈도우 운영체제 관련 프로세스 세부 내역
프로세스 | 설명 |
wininit.exe | 윈도우 시작 프로그램 |
services.exe | 윈도우 서비스를 관리 |
lsm.exe | - Local Session Manager - 시스템 관리 작업, 주요 함수 실행, 호스트 컴퓨터와 서버의 연결을 관리 |
lsass.exe | - LSASS(Local Security Authority Subsystem Service) - 사용자 로그인 검사, 비밀번호 변경 관리, 엑세스 토큰을 생성 - Windows Security Log를 작성 |
svchost.exe | 서비스를 관리하기 위한 프로세스 |
conhost.exe | 키보드, 마우스 입력 허용, 문자 출력, 콘솔 API 등 셸의 기본 기능을 수행 |
- 쉘 환경변수
환경변수라는 것은 특정한 의미로 설정된 값을 의미한다. 예를 들어 HOME라는 것은 사용자 계정의 홈 디렉터리를 가지고 있다. 이를 사용하려면 $HOME으로 입력하면 된다. 즉 유용하게 사용될 변수 및 설정해야 하는 값을 설정해두는 것이다.
env 명령어로 현재 환경에 설정되어 있는 모든 변수를 확인할 수 있다.
- inode
리눅스 커널이 현재 사용하는 자료구조(파일 정보)를 유지하는 구조체
리눅스는 파일에 접근 시 아이노드를 통해서 파일을 참조한다.
inode Number라는 일련의 숫자를 부여하여 파일을 관리한다.
파일이 생성되면 파일명과 함께 inode Number가 부여되며 inode Number는 유일한 값을 가진다.
리눅스 커널과 파일 시스템은 inode Number를 이용해서 파일을 사용하거나 관리한다
ls -il로 inode Number를 확인할 수 있다.
- 리눅스 부팅 순서
서버 전원 키기 -> ROM BIOS를 읽음 -> 디스크의 MBR에 있는 부트로더가 실행 -> 부트로더가 리눅스 커널을 실행
리눅스 커널이 root의 읽기전용으로 마운트를 수행 -> root의 쓰기 전용으로 마운트를 수행 -> 리눅스 커널이 init 프로세스 실행 -> PID 1번 활당 -> init 프로세스는 자신의 설정파일인 /etc/inittab의 파일을 읽어 디바이스 및 프로세스 활성화
* init 프로세스의 작업 수행은 리눅스의 Run 레벨에 따라 다르게 부팅한다.
* Run level
실행단계 | 내용 |
0 | PROM 감사단계 |
1 | - 관리 상태의 단계 - 사용자 로그인 접근이 불가능한 단일 사용자 단계 (여러 파일 시스템이 로드되어 있음) - 암호 변경할 때 사용 |
2 | - 공유된 자원을 갖지 않은 다중 사용자 단계 |
3 | - 기본 실행 단계 - 공유 자원을 가진 다중 사용자 단계, 텍스트 유저모드 |
4 | 현재 사용하지 않음 |
5 | Run level 3로 기동 후에 그래픽 모드인 X-Windows를 실행 |
6 | - 재부팅 단계 - 실행단계 3의 상태로 재부팅 |
init 6 명령어로 리눅스를 재부팅 할 수 있다.
- 현재 로그인 사용자 확인
리눅스에서 "w" 또는 "who" 명령을 실행하여 현재 로그인 한 사용자 정보를 확인할 수 있다.
(utmp 파일을 읽어서 터미널에 출력해주는 역할)
(로그인 사용자 ID, 사용 터미널, 로그인 시간)
현재 로그인한 사용자 상태정보는 로그인을 수행할 때 utmp 라는 파일에 기록된다.
utmp 파일은 /var/run/utmp에 존재한다.
utmp 파일에 대한 정보를 확인하기 위해서 리눅스의 stat 명령을 실행할 수 있다.
stat 명령으로 파일명, 파일크기, 사용되는 블록정보, inode 정보, 파일에 부여된 권한 (0664),
접근 시간, 수정시간, 변경시간을 확인할 수 있다.
참고로 사용자가 연결한 터미널 정보는 tty 명령어로 확인할 수 있다.
wtmp 로그파일은 사용자의 로그인과 로그아웃 정보를 가지고 있는 로그파일로 접속정보를 계속 기록하는 파일이다.
wtmp 파일은 /var/log 디렉터리에 존재하고 last 명령으로 wtmp 파일을 읽을 수 있다.
추가로 wtmp 파일은 로그인과 로그아웃 정보 외에도 시스템 관련 정보를 포함하고 있어 침해사고 분석 시에 확인한다.
- 사용자 로그인 및 로그아웃 정보
- 시스템 관련 정보
- 시스템 종료 및 부팅 정보
- 재부팅 정보
- telnet 및 ftp를 통한 로그인 정보
btmp 로그파일은 리눅스 로그인 시 실패한 정보를 가지고 있는 로그파일이다. 해당 로그파일은 바이너리(Binary)로 되어있기 때문에 lastb 명령어를 실행해서 확인해야 한다.
lastlog 는 가장 최근(마지막)에 성공한 로그인기록을 담고 있는 로그 파일이다.
- cron
cron은 일정한 날짜와 시간에 지정된 작업을 실행하는 프로세스로 반복적인 작업을 수행할 때 사용한다.
cron 프로세스는 /etc/crontab 파일에 설정된 것을 읽어서 작업을 수행한다.
ps -ef | grep cron 으로 cron 프로세스 기동 여부를 확인할 수 있다.
/usr/sbin/cron 으로 보이는 것이 cron 데몬 프로세스이다.
/etc/crontab 파일을 cron 데몬 프로세스가 읽어서 실행한다.
vi /etc/crontab으로 확인을 할 수 있다.
작은 단위에서 큰 단위로 커진다고 생각하면 된다.
분 - 시 - 일 - 월 - 요일 - 사용자 - 실행 명령
crontab 설정 예제
30 * * * * root /home/user/test : 무조건 30분에 맞춰 test를 실행
*/10 * * * * root /home/user/test : 무조건 10분마다 test를 실행
*/10 2-5 * * * root /home/user/test : 2시부터 5시까지 10분마다 test를 실행
20 1 * * * root rm -rf /home/tmp/* : 매일 1시 20분에 /home/tmp 아래의 모든 파일 및 디렉터리를 삭제
30 3 * * 2 root /home/clean.sh : 매주 화요일 3시 30분에 /home/clean.sh 실행
0 7 1 1-10/2 * /bin/vipcheck.sh : 매년 1월부터 10월까지 두 달 주기로 1일 오전 7시 정각에 /bin/vipcheck.sh 실행
crontab 옵션
-l : 현재 로그인 된 계정에 잡혀있는 작업 스케줄 확인
-e : 현재 로그인 중인 계정에 작업을 등록
-r : 현재 crontab에 등록된 작업을 삭제
-u 유저명 : 작업을 실행시킬 유저명 설정
crontab -e 로 명령하고 nano 에디터를 이용해서 /etc/crontab 설정 파일을 수정할 수 있다.
작성하고 저장한 뒤 crontab -l 명령어로 root 계정으로 clear 명령을 수행하라는 cron이 설정되어 있다.
- at
at은 cron과 다르게 예약한 명령어를 정해진 시간에 한 번만 실행할 때 사용하는 명령어이다.
at 명령을 사용해서 18시에 TCP Syn DDoS 공격을 하도록 하고 그 로그를 attack.txt 파일에 저장한다.
at -l : 현지 실행 대기 중인 명령어 목록 출력
at -r : 실행 대기 중인 명령에서 해당 작업번호를 삭제
at -f : 표준 입력 대신 실행할 명령을 파일로 지정
- 파일 무결성 검사
tripwire
초기 상태의 파일 정보에 대해서 해시 값을 저장하고 원하는 시점에 초기의 해시값과 비교해서 변경 여부를 확인한다.
해시 값을 사용해서 파일의 무결성을 검사하는 도구이다.
tripwire --init : 해시 값을 저장한 데이터베이스 초기화
tripwire --check : 무결성 검사를 실행
Nessus, NMAP, nikto2 : 취약점 점검 도구
tripwire : 무결성 점검 도구
- 리눅스 패스워드 파일
/etc/shadow
root : $1$Fz4q1gw2/ : 14806 : 0 : 99999 : 7 : : : (1) (2) (3) (4) (5) (6) (7) (8) (9) 1 : login name : 사용자 계정 2: Encrypted : 패스워드를 암호화시킨 값 3 : Last Changed : 1970년 1월 1일부터 패스워드를 수정된 날짜의 일을 계산 4 : Minimum : 패스워드 변경 전 최소 사용기간(일 수) 5 : Maximum : 패스워드 변경 전 최대 사용기간(일 수) 6 : Warn : 패스워드 사용 만기일 전에 경고 메세지를 제공하는 일 수 7 : Inactive : 로그인 접속 차단 일 수 8 : Expire : 로그인 사용을 금지하는 일 수 9 : Reserved : 사용되지 않음 |
* 리눅스에서 패스워드 만료날짜를 확인하는 명령어
chage -l <사용자명> 으로 패스워드 만료 날짜를 확인 (chage 명령어는 shadow 파일을 읽는다)
- xinetd
다른 데몬의 실행을 관장하는 슈퍼데몬이다. (참고로 데몬에는 슈퍼데몬, xinetd 방식 / standalone 방식이 존재한다.
standalone 방식 : 단독으로 메모리에 상주하고 있는 방식
xinetd 방식 : 슈퍼데몬이 메모리에 상주해 있으면서 슈퍼메돈이 관리하는 데몬이 호출될 경우 그 데몬을 잠깐 올렸다가 처리가 끝나면 다시 종료시킨다. standalone 보다는 느리지만 효율적으로 많은 데몬들을 운용할 수 있다.)
xinetd 의 경우 다음의 3가지로 구성되어있다.
- /etc/xinetd.conf (기본 설정파일)
- /etc/sinetd.d (디렉토리)
- /etc/rc.d/init.d/xinetd (데몬)
- /etc/xinetd.conf
기본 default 값 설정을 아래 처럼 지정할 수 있다.
- /etc/xinetd.d
디렉토리 하위에 서비스 명으로 된 설정파일을 만들어 서비스별로 설정할 수 있다.
서비스명은 /etc/services 와 동일하게 맞추고 .conf는 붙이지 않는다.
참고로 xinetd가 사용되면서 이전의 inetd는 더이상 쓰이지 않는다. 다만 TCP Wrapper는 여전히 사용한다.
/etc/hosts.deny와 /etc/hosts.allow가 그것이다.
서비스를 다 막아두고 ssh, ftp 등 주요 서비스를 특정 호스트에만 허용해 줄 수 있는 기능이다.
'자격증 (Certificate) > 정보보안기사' 카테고리의 다른 글
정보보안기사 취득 계획 안내 / 정리 (0) | 2022.07.16 |
---|---|
정보보안기사 2020년 11월 7일 필기 기출 + 내용 정리 (0) | 2022.02.21 |
정보보안기사 필기 (시스템 보안 - 1, 운영체제 이해 및 관리) (0) | 2021.08.13 |