1. Windows 기본 학습
(1) 윈도우 인증 과정
- 윈도우 인증과정에서 사용되는 주요 서비스는 LSA, SAM, SRM 등이 있다.
LSA (Local Security Authority) |
모든 계정의 로그인에 대한 검증 및 시스템 자원에 대한 접근권한을 검사 계정명과 SID를 매칭하며, SRM이 생성한 감사로그를 기록 NT 보안의 중심 서비스, 보안 서브 시스템이라고 불림 |
SAM (Security Account Manager) |
사용자/그룹 계정 정보에 대한 데이터베이스를 관리 사용자 로그인 정보와 SAM 파일에 저장된 사용자 패스워드 정보를 비교하여 인증 여부를 결정 |
SRM (Service Reference Monitor) |
인증된 사용자에게 SID(Security ID)를 부여 SID를 기반으로 파일/디렉터리에 대한 접근 여부를 결정하고 이에 대한 감사메시지 생성 |
- 로컬 인증 : 로그인 프로세스 시작 -> Winlogon 화면에서 ID,PW입력 -> LSA가 NTLM 모듈에 넘기고 이를 SAM이 받아 로그인 처리한다.
- 원격(도메인) 인증 : 로그인 프로세스 시작 -> Winlogon 화면에서 ID,PW입력 -> LSA이 로컬 인증용인지 도메인 인증용인지 확인하고 Kerberos 프로토콜을 이용하여 도메인 컨트롤러에 인증을 요청 -> 접근 토큰을 부여
- SAM 파일 접근 통제 설정 : 드라이브 -> Windows -> System32 -> config -> SAM 파일 속성에서 Administrators 및 System 그룹 외에는 접근을 제한하기, 불필요한 그룹 및 계정 권한 제거
(2) 윈도우 보안 식별자(SID)
- 윈도우의 각 사용자나 그룹에 부여되는 고유한 식별번호.
- 사용자가 로그인 수행하면 접근 토큰이 생성되며, 토큰에는 SID 정보가 담겨있다.
- 접근 토큰의 사본은 사용자에 의해 시작된 모든 프로세스에 할당된다.
- SAM 파일에 SID 정보 저장되어 있다.
- SID 구조 : S-1(윈도우 시스템)-5-21(도메인 컨트롤러 또는 단독 시스템을 의미)-4243321-3213123-353534(해당 시스템만의 고유 식별자)-500(500:Administrator, 501:Guest, 1000이상:일반 사용자)
- SID 확인 : 실행 -> wmic -> useraccount list brief
(3) 윈도우 인증 구조
- 윈도우는 Challenge & Response 방식의 인증 구조를 사용
- 사용자가 윈도우 시스템에 인증 요청 -> 서버는 Challenge 값 생성하여 사용자에게 전달 -> 사용자는 Challenge 값과 패스워드 정보 이용해 Response 값 생성하여 서버에 전달 -> 서버는 값을 확인하여 인증 성공 여부를 전달
- Lan Manager는 네트워크를 통한 파일 및 프린터 공유 등과 같은 작업시 인증을 담당하는 서비스
- 제어판 -> 관리도구 -> 로컬보안정책 -> 로컬정책 -> 보안옵션 -> "LAN Manager 인증 수준" -> LTLMv2 사용 권장
(4) 패스워드 크래킹
1) 사전 공격(Dictionary Attack)
- 패스워드로 자주 사용되는 사전에 있는 단어, 키보드 자판의 일련순, 주민등록번호, 이름 등을 미리 사전 파일로 만든 후 이를 하나씩 대입하여 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법
2) 무차별 공격(Brute Force Attack)
- 패스워드에 사용될 수 있는 문자열 범위를 정하고, 그 범위 내에서 생성 가능한 모든 패스워드를 생성하여 하나씩 대입하여 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법, 일반적으로 사전 대입 공격 실패 후 진행
3) 혼합 공격(Hybrid Attack)
- 사전 대입 공격과 무작위 대입 공격을 혼합한 방식
4) 레인보우 테이블(Rainbow Table)을 이용한 공격
- 하나의 패스워드에서 시작해 특정한 변이함수를 이용해 여러 변이된 형태의 패스워드를 생성한다. 그리고 각 변이된 패스워드의 해시를 고리처럼 연결하여 일정 수의 패스워드와 해시로 이루어진 체인을 무수히 만들어 놓은 테이블이다.
- 해시 테이블과 R(Reduction)함수의 반복 수행을 통해 일치하는 해시값을 통하여 패스워드 찾아내는 방법
2. UNIX/Linux 기본 학습 -> Linux Master 참고
3. UNIX/Linux 시스템 관리 -> Linux Master 참고
4. UNIX/Linux 서버 보안
(1) 시스템 보안 -> Linux Master 참고
(2) 네트워크 보안
1) 보안 셸(SSH)
- 보안 셸(Secure Shell)은 암호통신을 이용하여 네트워크 상의 다른 컴퓨터에 접속하여 원격으로 명령 실행하거나 파일 조작하는 응용프로그램 또는 프로토콜을 의미, 기존의 rsh, rlogin, Telnetm FTP 등 평문 송수신 서비스를 대체
- 기능 : 암호화된 원격 터미널 서비스 제공, 암호화된 파일 송수신 서비스 제공
- 디폴트로 22/tcp 포트를 사용
2) 슈퍼 데몬(inetd 데몬)
- Stand-Alone 방식 : 개별 서비스별로 서버 프로세스(데몬)가 동작하는 방식으로 속도가 빠른 장점이 있지만 서버 자원을 많이 점유하는 단점 있다.
- inetd(xinetd) 방식 : 슈퍼 데몬을 이용하여 개별 서비스를 동작시키는 방식으로 상대적으로 속도 느리지만 자원 절약
- inetd 데몬은 N개의 개별 서버를 하나로 통합하여 클라이언트로부터 서비스 요청이 올때마다 해당 서비스에 관련된 실행 모듈(FTP, Telnet, SSH 등)을 실행해준다.
- inetd 데몬 최초 실행시 /etc/inetd.conf 파일 정보를 참조하여 서비스할 프로그램에 대한 정보 얻는다. 시스템 관리자는 inetd 데몬으로 서비스할 프로그램 특징을 /etc/inetd.conf 파일에 정의해야 한다.
- inetd 파일 구조 : [서비스명] [소켓타입] [프로토콜] [플래그] [계정명] [실행경로] [실행인수]
- 서비스 활성화 : inetd.conf 파일에 실행할 서비스에서 #(주석기호) 제거한 후 inetd 데몬 재시작 <-> 서비스 비활성화
- 불필요한/취약한 서비스 비활성화 : echo(7/tcp), discard(9/tcp), daytime(13/tcp), chargen(19/tcp). r계열 서비스
3) 접근 통제(TCP Wrapper)
- 외부에서 들어오는 클라이언트에 대해 접근통제 기능을 제공
- 클라이언트 IP 주소 확인하여 시스템 관리자가 접근 허용한 호스트에 대해서만 서비스를 허용
- 접근통제는 /etc/hosts.allow와 /etc/hosts.deny 파일에 정의된 호스트 정보(IP)를 기준으로 한다.
- TCP Wrapper 사용할 경우, 해당 서비스의 실행경로에 /usr/sbin/tcpd를 명시한다.
- shell_command는 일반적으로 hosts.deny 파일에서 설정하여 차단된 호스트에게 경고메시지 보내는 용도로 사용
- twist : 명령의 결과를 클라이언트에게 전송, spawn : 명령의 결과를 클라이언트에게 전송하지 않음
- shell_command 라인에서 사용가능한 특수문자
%a | 클라이언트의 IP |
%A | 서버의 IP |
%c | 클라이언트의 정보 |
%d | 서비스명 |
%h | 클라이언트 호스트명 또는 IP |
%n | 클라이언트 호스트명 |
%u | 클라이언트 사용자 이름 |
%p | 서비스의 데몬 프로세스 |
%s | 서버의 정보 |
%% | 하나의 % 문자 |
in.telnet : 192.168.0.104 : twist /bin/echo "!!! 192.168.0.104는 연결이 거부되었음 !!!" -> 192.168.0.104 IP주소 갖는 호스트에서 telnet 연결요청이 오면 연결거부하고 메시지 전송 in.telnet : 192.168.0.104 : sqawn /bin/mail -s "%a is denied" root -> 192.168.0.104 IP주소 갖는 호스트에서 telnet 연결요청이 오면 연결거부하고 root에게 메일 전송 |
4) 슈퍼 데몬(xinetd)
- /etc/xinetd.conf : 글로벌 xinetd 설정파일, /etc/xinetd.d/서비스 설정파일 : 개별 서비스에 대한 설정파일
- 설정파일 설명
service | 서비스 이름 |
disable | 해당 서비스의 실행 여부를 결정(yes:실행안함, no:실행) |
socket_type | 서비스 소켓 유형을 설정. 일반적으로 tcp는 stream |
wait | 서비스 요청 처리 중 다음 요청이 들어오면 즉시 처리할 것인지(no) 이전 요청 완료될 때까지 대기할 것인지(yes) 결정 |
user | 어떤 사용자로 서비를 실행할지 설정 |
server | 서비스 실행 파일 경로를 설정(반드시 절대 경로로 설정) |
cps | 연결 요청을 제한하기 위한 설정 첫번째 인자는 초당 연결 개수를 의미 두번째 인자는 초당 연결 개수를 초과하면 일시적으로 서비스 중지하는 시간(단위 : 초) |
instances | 동시에 서비스를 할 수 있는 서버의 최대 개수 |
per_source | 출발지 IP를 기준으로 최대 서비스 연결 개수 |
only_from | 특정 주소 또는 대역만 접근을 허용 |
no_access | 특정 주소 또는 대역의 접근을 차단 |
access_times | 지정한 시간 범위 내에서만 접근을 허용 |
log_on_failure | 서버 접속 실패시 로그파일에 기록할 내용을 설정 |
log_on_success | 서버 접속 성공시 로그파일에 기록할 내용을 설정 |
(3) PAM
(4) 시스템 로그 설정과 관리
5. 시스템 해킹
(1) 버퍼 오버플로우 공격(Buffer Overflow Attack)
1) 개요
- 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생
- 버퍼 오버플로우 발생하면 프로그램 오작동 유발시키거나, 악의적인 코드 실행시킴으로서 통제권한을 획득하게 된다.
2) 구조
- Text 영역 : 프로그램 코드와 상수가 정의되어 있고, 읽기만 가능한 메모리 영역
- Data 영역 : 전역변수와 정적변수가 저장되어 있는 영역
- Heap 영역 : 프로그래머의 필요에 따라 동적 메모리 호출에 의해 할당되는 메모리 영역
- Stack 영역 : 함수 인자 값, 함수 내 지역변수, 함수 반환주소 등이 저장되는 영역
3) 스택 버퍼 오버플로우
- 보통 SetUID가 설정된 루트 권한의 프로그램을 공격대상으로 한다. 스택에 정해진 버퍼보다 큰 공격코드를 삽입하여 반환주소를 변경함으로써 임의의 공격코드를 루트권한으로 실행하도록 하는 방법이다.
- 저장된 데이터는 인접한 변수영역까지 침범하여 포인터 영역까지 침범하므로 해커가 원하는 특정 코드가 실행
- /etc/system 에서 set noexec_user_stack=1, set noexec_user_stack_log=1 로 수정
4) 힙 오버플로우
- maloc 같은 메모리 할당 함수를 이용하여 프로그램을 사용할 때 할당하며 힙 영역을 오버플로우 시켜서 특정 코드를 실행
(2) 레이스 컨디션 공격(Race Condition Attack)
(3) 포맷 스트링 공격(Format String Attack)