이것저것

[SK shieldus Rookies 29기] 17일차 본문

SK Shieldus Rookies 29

[SK shieldus Rookies 29기] 17일차

atfield1988 2025. 12. 5. 09:09

어제에 이어서 마저 정리하지 못한 부분을 이어서 가보자.
오늘이 네트워크 보안 마지막이다.

Payload 탐지 - 절대 위치 (Offset/Depth)

개념

패킷의 데이터 영역(Payload) 시작점을 기준으로 절대적인 위치를 지정하여 검색

  • offset: 검사를 시작할 위치 (0부터 시작)
  • depth: offset부터 검사할 범위(길이)

예시

content:"ABC"; offset:2; depth:3;
  • 의미: Payload의 3번째 바이트(인덱스 2)부터 시작하여 3바이트 범위 내에서 "ABC" 문자열을 검색
  • 목적: 불필요한 전체 검색을 줄이고 탐지 효율성 증대

Payload 탐지 - 상대 위치 (Distance/Within)

개념

이전 content 매칭이 끝난 지점을 기준으로 상대적인 위치를 지정하여 검색

  • distance: 이전 패턴 매칭 에서부터 떨어진 거리
  • within: distance 위치부터 검사할 범위(길이)

예시

content:"A"; content:"B"; distance:1; within:2;
  • 의미: "A"를 찾은 후, 1바이트 뒤에서부터 2바이트 범위 내에 "B"가 있는지 검사
  • 목적: 연관된 두 패턴 사이의 거리를 지정하여 정밀 탐지

Header Rule Option

헤더 정보 검사

Payload가 아닌 IP/TCP/UDP 헤더의 특정 값을 검사

옵션 설명 예시
ttl Time To Live 값 검사 ttl:128;
tos Type of Service 값 검사 tos:4;
id IP Header ID 값 검사 id:12345;
dsize Payload 크기 검사 dsize:>100;
flags TCP Flag 검사 (S, F, R, P, A, U) flags:SF; (SYN+FIN)
flow 트래픽 방향 및 상태 검사 flow:established,to_server;

Threshold (임계치) 설정

개념

동일한 이벤트가 과도하게 발생할 때 경고 횟수를 조절하여 로그 폭주 방지 및 탐지 효율성 증대

📊 3가지 유형 (Type)

유형 설명 용도
limit 시간 내에 발생한 첫 N개까지만 로그 기록 로그 폭주 방지
threshold 시간 내에 N번 이상 발생 시마다 로그 기록 지속적인 공격 탐지
both 시간 내에 N번 이상 발생 시 한 번만 로그 기록 Brute Force 탐지

📝 구문

threshold: type [limit|threshold|both], track [by_src|by_dst], count [N], seconds [T];
  • track: 추적 기준 (출발지 IP 또는 목적지 IP)
  • count: 횟수
  • seconds: 시간 (초)

예시 (Telnet Brute Force):

threshold: type both, track by_src, count 3, seconds 20;
  • 20초 동안 동일 출발지에서 3회 이상 발생 시 1번 경고

탐지 예시 룰 - HTTP Flooding

🔍 Get Flooding 탐지

alert tcp any any -> any any (msg:"Get Flooding"; \
    content:"GET / HTTP/1."; nocase; depth:13; \
    threshold: type threshold, track by_dst, count 10, seconds 1; \
    sid:1000999;)
  • 분석:
    • GET / HTTP/1. 패턴을 패킷 시작 13바이트 내에서 검사
    • 1초 동안 동일 목적지로 10회 이상 발생 시 경고
    • 웹 서버 자원 소모 공격(DoS) 탐지

탐지 예시 룰 - 비정상 패킷 차단

🔍 SYN/FIN 동시 설정 패킷 차단

drop tcp any any -> any any (msg:"SYN/FIN Drop"; flags:SF;)
  • 분석:
    • flags:SF: SYN(연결 요청)과 FIN(연결 종료) 플래그가 동시에 설정됨
    • 정상적인 TCP 통신에서는 불가능한 상태
    • 스캔 공격 또는 방화벽 우회 시도 차단

탐지 예시 룰 - XSS (Cross Site Scripting)

🔍 XSS 공격 탐지

alert tcp any any -> any 80 (msg:"XSS Detect"; \
    content:"GET"; offset:0; depth:3; \
    content:"/login.php?id=%3Cscript%3E"; distance:1; \
    sid:1000500;)
  • 분석:
    • HTTP GET 요청 확인
    • URI에 <script> 태그(%3Cscript%3E)가 포함된 경우 탐지
    • 스크립트 삽입 공격 방어

탐지 예시 룰 - Heartbleed

🔍 OpenSSL Heartbleed 취약점 탐지

alert tcp any any <> any [443,465,563] (msg:"SSLv3 Malicious Heartbleed Request V2"; \
    content:"|18 03 00|"; depth:3; \
    content:"|01|"; distance:2; within:1; \
    content:!"|00|"; within:1; \
    sid:100300;)
  • 분석:
    • |18 03 00|: Heartbeat 메시지 헤더 (0x18) + SSLv3.0 (0x0300)
    • |01|: Request 패킷 확인
    • !|00|: Payload 길이가 0이 아님을 확인 (비정상적으로 긴 길이 요청 탐지)

탐지 예시 룰 - Password Cracking

🔍 Telnet 로그인 실패 반복 탐지

alert tcp any 23 -> any any (msg:"Telnet Login Failed"; \
    content:"login incorrect"; nocase; \
    threshold: type both, track by_src, count 3, seconds 20; \
    sid:3000004;)
  • 분석:
    • Telnet(23) 서버 응답 중 "login incorrect" 문자열 감지
    • 20초 내 3회 이상 실패 시 Brute Force 공격으로 간주하고 경고

이제 다 배웠으니까 마지막으로 한 번만 더 해보자!

1. 목적

공격 패턴을 파악하여 관제룰을 생성할 수 있다.

생성된 룰을 통해 실제 공격 시 탐지된 로그들을 확인할 수 있다.

2. Ping of Death란

죽음의 핑(PoD) 공격은 서비스 거부(DoS) 공격으로, 공격자가 최대 허용 크기보다 큰 패킷을 전송하여 대상 컴퓨터를 중단시키거나 충돌시키는 것을 목표로 합니다. 인터넷 제어 메시지 프로토콜(ICMP) echo request를 보냅니다. 일부 TCP/IP 시스템은 최대값보다 큰 패킷을 처리하도록 설계되지 않았으므로 해당 크기를 초과하는 패킷에는 취약합니다.

-출처: CloudFlare_aritcile(Ping of death DDoS attack)

3. 설정

Ping of Death를 탐지하기 위한 기본적인 설정을 진행합니다. 우선적으로 수업 시간에 설정하였던 기본적인 세팅을 그대로 가져갑니다. 이제 가장 중요한 local.rules를 설정해야 합니다. Rule을 설정하기 위해 위에서 설명한 Ping of Death의 설명을 보면 ICMP echo request라는 표현이 보입니다. 공격자는 수많은 echo request를 보내서 Client or Server를 중단시키거나 충돌을 시킵니다. 이러한 지점에서 수많은 echo request가 보인다면 Ping of Death의 시그니처 패턴이라고 볼 수 있습니다. 아래는 Wireshark로 수집한 ICMP echo request입니다.

추가적으로 Wireshark 하단의 상세 정보를 보면

textReassembled IPv4 (2008 bytes)

이것이 원본 재조합된 패킷 크기입니다. 그렇다면 562로 보이는 것은 무엇인지에 대한 설명을 시작하겠습니다.

                  원본 ICMP 패킷: 2028바이트
                             ↓
                Fragment 1: 약 1500바이트
                Fragment 2: 약 528바이트 ← 이것이 Wireshark에서 562바이트
                             ↓
       Snort는 두 조각을 자동 재조합하여 원본 2028바이트로 검사를 진행합니다.

따라서 Wireshark로 인한 시그니처 패턴 2개를 분석하였습니다. 이제 시그니처 패턴을 가지고 Snort rule을 만들겠습니다.

4. Snort rule

alert icmp any any -> 192.168.10.20 any (msg:"Ping of Death Attack"; itype:8; dsize:>1500; threshold:type both, track by_src, count 2, seconds 10; sid:3000005; rev:1;)

snort rule은 위와 같이 설정하였다. 설정 이유에 대해서는 아래에서 밝힙니다.

Snort 규칙 구성 의미 분석

구성 요소 의미 비고
alert 규칙 매칭 시 alert 생성 로그 기록
icmp ICMP 프로토콜만 검사
any any 모든 출발지 IP와 포트
단방향 이 방향으로 흐르는 패킷만 검사
192.168.10.20 any 목표 IP 포트는 ICMP이므로 무의미
msg:"Ping of Death Attack" 로그에 출력되는 알림 메시지
itype:8 ICMP Type field = 8 Echo request (Snort 2.9 버전 기준)
dsize:>1500 ICMP payload 크기 > 1500byte Ping of Death 공격 특징
threshold:type both 임계값 달성 후 모든 매칭 패킷을 alert
track by_src 출발지 IP별로 독립 집계 rand-source 공격 대응
count 2 같은 출발지에서 2회 이상 탐지 탐지율 향상을 위해 조정 (50회 → 2회)
seconds 10 10초 내에 발생한 패킷만 집계
rev:1 규칙 버전 규칙 수정 시 1씩 증가

이제 Kali로 Ping of Death 공격을 진행하겠습니다.

그 전에 먼저 우분투 설정을 살피겠습니다.

sudo snort -T -c /etc/snort/snort.conf             # Rule 테스트 및 오류 검사 
sudo snort -i eth0 -c /etc/snort/snort.conf        # Rule 을 인터페이스에 적용

해당 명령어를 터미널 2개를 열고 모두 실행을 합니다. 아래와 같은 화면이 나오면 성공입니다.

이제 터미널 하나는 잠시 빠져나와서 아래의 명령어를 입력합니다.

sudo tail -f /var/log/snort/snort.alert.fast | grep Ping

사전에 진행을 해본 결과 요구사항에 부합하는 메시지가 출력되지 않아서 grep 명령어를 이용하여 원하는 메시지를 출력하겠습니다.

정상적으로 로그가 수집이 되는 것을 확인할 수 있습니다.


네트워크 보안은 끝났고 이제 시스템 보안으로 넘어간다.


권한 설정 (Permission)

권한 구조

리눅스 파일 시스템은 소유자(User), 그룹(Group), 기타(Other) 세 가지 주체에 대해 읽기, 쓰기, 실행 권한을 부여합니다.

구분 읽기 (Read) 쓰기 (Write) 실행 (Execute)
기호 r w x
4 2 1

권한 변경 명령어

  1. chmod (Change Mode)

    • 파일이나 디렉터리의 접근 권한을 변경합니다.
      # chmod 777 sample.txt
      # chmod u+x sample.txt
  2. chown (Change Owner)

    • 파일의 소유자를 변경합니다.
      # chown centos sample.txt
      # chown centos.admin sample.txt (소유자.그룹)
  3. chgrp (Change Group)

    • 파일의 소유 그룹을 변경합니다.
      # chgrp admin sample.txt

Umask (기본 권한 설정)

새로 생성되는 파일이나 디렉터리의 기본 권한을 결정하는 값입니다.

  • 파일 최대 권한: 666 (rw-rw-rw-)
  • 디렉터리 최대 권한: 777 (rwxrwxrwx)

계산식:

기본 권한 = 최대 권한 - Umask

예시 (Umask 0022):

  • 파일: 666 - 022 = 644 (rw-r--r--)
  • 디렉터리: 777 - 022 = 755 (rwxr-xr-x)

정보기 준비하는 분들은 계산하는 거 다 아시죠.
알기사 가라사대 빼기로 하지마라...


특수 권한 (Special Permissions)

특수 권한의 종류

일반적인 rwx 권한 외에 특별한 기능을 수행하는 권한입니다.

권한 문자 절대값 설명 설정 예시
SetUID s (User) 4000 실행 시 파일 소유자의 권한으로 실행됨 chmod 4755 file
SetGID s (Group) 2000 실행 시 파일 소유 그룹의 권한으로 실행됨 chmod 2755 file
Sticky Bit t (Other) 1000 공용 디렉터리에서 자신의 파일만 삭제 가능 chmod 1777 dir

🔍 특수 권한 파일 검색

find / -perm -4000 -print  # SetUID 파일 검색
find / -perm -2000 -print  # SetGID 파일 검색

여기서부터는 간략하게만 정리하고 다음 일차에 자세히 정리를 시작하겠습니다.

링크 (Link)

Hard Link vs Symbolic Link

구분 Hard Link Symbolic Link
개념 원본 파일의 데이터(Inode)를 직접 가리킴 원본 파일의 경로(Path)를 가리킴 (바로가기)
Inode 원본과 동일 원본과 다름 (새로운 파일)
원본 삭제 시 데이터 유지 (링크 카운트 감소) 접근 불가 (Broken Link)
파일 시스템 동일 파일 시스템 내에서만 가능 다른 파일 시스템 간 연결 가능

파일 상태 확인 (stat)

stat 명령어

파일이나 파일 시스템의 상세 상태 정보를 출력합니다.

$ stat /etc/passwd

출력 정보:

  • 파일 크기 (Size)
  • Inode 번호
  • 권한 (Access)
  • 타임스탬프 (Access, Modify, Change, Birth)

타임스탬프 (Timestamp)

3가지 시간 정보 (MAC Time)

종류 약어 설명 변경 시점
Access Time atime 접근 시간 파일 내용을 읽었을 때 (cat, more)
Modify Time mtime 수정 시간 파일 내용이 변경되었을 때 (vi, nano)
Change Time ctime 변경 시간 파일 속성(권한, 소유자 등)이 변경되었을 때
Birth Time btime 생성 시간 일반적으로 변경 불가

시간 변경 (touch)

  • touch 명령어는 주로 mtime과 atime을 현재 시간 또는 특정 시간으로 변경할 때 사용합니다.
  • ctime은 사용자가 임의로 변경할 수 없습니다. (시스템 시간에 의존)
touch -t 202511281200 file.txt  # 수정 시간을 특정 시간으로 변경

파일 관리 및 검색 명령어

find 명령어

파일 시스템에서 조건에 맞는 파일을 검색합니다.

기본 구문:

find [경로] [조건] [동작]

주요 조건:

  • -name: 파일 이름으로 검색
  • -type: 파일 타입 (f: 파일, d: 디렉터리)
  • -perm: 권한으로 검색
  • -user: 소유자로 검색
  • -size: 크기로 검색
  • -atime, -mtime: 시간으로 검색

활용 예시:

# 이름이 file인 것을 찾아 삭제
find / -name file -exec rm -rf {} \;