이것저것

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

SK Shieldus Rookies 29

[SK shieldus Rookies 29기] 42일차

atfield1988 2026. 1. 17. 13:17

지난 번 다양한 컴플라이언스를 다루고 이제는 다시 기술적인 이야기를 할 타이밍이다. 지금부터는 아무래도 이론적인 내용보다는 실무에 초점을 맞춘 작업형 과정이 다수 포함이 되어 있어서 캡처뜨기 좀 빡셀 것 같다...

URI, URL, URN 차이 쉽게 이해하기

인터넷에서 자주 보이는 URI, URL, URN은 모두 "자원(resource)을 식별하는 방법"과 관련된 개념이다.

1. URI (Uniform Resource Identifier)

정의

  • 인터넷 상의 자원을 식별하는 모든 문자열

이 주식이 뭔지 알 수 있는 모든 정보를 말함
종목명
종목코드
거래소 + 위치 정보
기타 등등

2. URL (Uniform Resource Locator)

정의

  • 자원의 "위치"를 알려주는 URI

어디에 있는지 알려줌, 우리가 흔히 말하는 "웹 주소"
브라우저에 입력하는 주소 대부분이 URL

  • 예시
    https://www.google.com
    ftp://ftp.example.com/file.txt
  • 구성 요소
    https://   www.example.com   /index.html
    프로토콜       도메인             경로

    어느 거래소에서, 어떤 방식으로 거래되는 주식인지를 생각하면 됨
    NYSE 거래소, NVDA 종목 페이지 위치

3. URN (Uniform Resource Name)

정의

  • 자원의 "이름"만으로 식별하는 URI

  • 위치 정보는 몰라도 됨

  • "어디 있는지는 몰라도, 이게 뭔지는 앎"

  • 주로 표준 문서, ISBN, 고유 식별자 등에 사용함

  • 예시

    urn:isbn:9780134685991
    urn:uuid:550e8400-e29b-41d4-a716-446655440000

티커 생각하면 됨! 엔비디아: NVDA, 아마존:AMZN
이건 바뀔 일 없음.

URI는 자원을 식별하는 전체 개념이고,
URL은 위치를 알려주는 URI,
URN은 이름으로 식별하는 URI이다.


네트워크 보안

채용 공고를 잘 보면 네떡이 많은 것을 알 수가 있다. 그렇다면 네떡 엔지니어, 유지보수 등등 회사나 사람들이 왜 이렇게 네떡에 진심인지 알아보자.

네트워크는 물리적 제약이 적다, 피아 식별이 어렵다. 이 말은 공격하기는 상당히 쉽고 방어하기는 상당히 어렵다는 말이다. 그러면 사람들은 왜 네트워크를 사용하는 걸까? 그야 당연히 온 세상이 네트워크로 이미 구축되어 있으니까다. 뭐 어쩌겠나 이미 태어나보니 다 이렇게 되어 있게 이걸 바꿀만한 저기도 없고 하니깐 그냥 쓰는 거지...

방화벽

  • IP/Port 기반으로 동작
  • 허용 정책에 포함되지 않는 모든 IP/Port 차단

그런데 문제가 생김. 방화벽으로도 커버되지 않는 문제가 발생한다. 대표적으로 우리가 배운 웹 해킹이다.

IDS(Intrusion Detection System)

  • IP/Port 상위 개념의 접근제어 필요성 대두
  • 애플리케이션 레이어의 데이터 패턴을 검사하는 snort
  • 패턴매칭(주고 받는 패턴으로 상호관계 파악 가능)

침입탐지모델

구분 블랙리스트 (패턴 매칭) 화이트리스트 (이상징후 탐지)
개념 정의된 패턴을 갖는 공격만 차단 정의된 패턴을 갖는 정상만 허용
기본 접근 알려진 공격 패턴 기반 정상 행위 기준선(Baseline) 기반
장점 (알려진) 공격 정의가 쉽다 정상만 정의하면 된다
단점 알려지지 않은 공격은 탐지 불가 정상 범위를 정의하기 어렵다
오탐/미탐 미탐(false negative) 가능성 높음 오탐(false positive) 가능성 높음
구현 예시 IDS, IPS, 방화벽, 웹 방화벽 이상징후 기반 IDS, 행위 기반 보안 시스템

위에 내용에 이어서 패턴매칭을 적용하여 보안관제를 실시를 했을 경우 어마무시한 로그들이 찍히는 것을 확인할 수 있다.

근데 이렇게 엄청나게 많은 로그를 어떻게 하나하나씩 다 보냐?
그러니까 더욱 더 정밀하게 룰들을 설정하고 패턴들을 설정해야한다.


앞에는 그냥 리마인드 겸 단순 몸풀기 정도이다. 이어서 할 snort도 오늘은 그렇게까지 저기 하지 않으므로 만약 기억이 안난다면 복습을 다시 하자!

복습 링크 15일차 16일차 17일차

우선 그냥 진행하면 권한이 막힐 수가 있기 때문에 관리자 권한으로 전환한다.

1. 관리자 권한으로 cmd창 실행 후 net user administrator /active:yes 명령어 입력

2. 기존 계정 로그아웃

3. administrator 계정으로 로그인

이제 시작하자~

snort 설치를 위해서 아래와 같은 명령어를 입력하자

yum install epel-release -y
yum install wget gcc gcc-c++ libnetfilter_queue-devel git flex bison zlib zlib-devel pcre pcredevel libdnet* libpcap* nghttp2 xz-devel libtool libsfbpf* daq* -y
rpm -ivh https://snort.org/downloads/snort/snort-2.9.20-1.centos.x86_64.rpm
ln -s /usr/lib64/libdnet.so.1.0.1 /usr/lib64/libdnet.1

yum install epel-release -y이 뭐 하는 거냐면 EPEL 저장소를 추가하는 명령어임. 기본 yum 저장소에는 없는 패키지들을 설치할 수 있게 해줌. 그래서 왜 설치하냐면 snort나 기타 의존성 패키지들 중 일부가 EPEL에만 있음. 이거 없으면 나중에 패키지를 찾을 수 없습니다하면서 에러 남.

yum install wget gcc gcc-c++ libnetfilter_queue-devel git \
flex bison zlib zlib-devel pcre pcre-devel \
libdnet* libpcap* nghttp2 xz-devel libtool \
libsfbpf* daq* -y

주요 패키지 설명 (with gpt)

  • 컴파일 도구

    • gcc, gcc-c++
      → C/C++ 컴파일러 (Snort는 C 기반)

    • flex, bison
      → Snort 룰 파싱할 때 사용

    • libtool
      → 라이브러리 빌드/링크 관리

  • 네트워크 관련

    • libpcap*
      → 패킷 캡처 핵심 라이브러리 (Snort 필수)

    • libdnet*
      → 저수준 네트워크 처리 (라우팅, 인터페이스 등)

    • libnetfilter_queue-devel
      → Linux 커널의 netfilter와 연동 (IPS 모드에서 중요)

    • daq*
      → Snort DAQ(Data Acquisition) 모듈
      → Snort가 패킷을 어디서/어떻게 받을지 결정함

  • 문자열/압축 처리

    • pcre, pcre-devel
      → 정규표현식 처리 (Snort 룰에서 엄청 많이 씀)

    • zlib, zlib-devel
      → 압축 데이터 처리

  • 기타

    • wget
      → 파일 다운로드

    • git
      → 소스 코드 관리

    • nghttp2
      → HTTP/2 지원

    • xz-devel
      → xz 압축 라이브러리

    • libsfbpf*
      → 고성능 BPF 필터 (Snort 성능 관련)

rpm -ivh https://snort.org/downloads/snort/snort-2.9.20-1.centos.x86_64.rpm

-> 스노트 사이트에서 미리 컴파일된 RPM 패키지를 설치

ln -s /usr/lib64/libdnet.so.1.0.1 /usr/lib64/libdnet.1

-> 라이브러리 심볼릭 링크 생성(원래는 되어 있는게 맞긴 하지만 오픈소스다. 알아서 모자르면 하자.)

[root@Snort ~]# vi /etc/snort/snort.conf









아래와 같은 명령어 입력할 것
:548,651norm i#

그러면 이제 이렇게 바뀜
스노트 룰도 한 번 추가해주자!

alert icmp any any -> any any (msg:"ping-request"; itype:8; sid:1000000; rev:1;)
alert icmp any any -> any any (msg:"ping-response"; itype:0; sid:1000001; rev:1;)

snort -i eth1 -c /etc/snort/snort.conf -A fast

잘 잡히는 것을 확인할 수 있다.
그러면 이렇게 잡은 물고기를 그냥 두면 안된다.
DB에 저장하자! 근데 DB가 없으니까 설치 한 번 해보자

rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
  • MySQL 공식 YUM 저장소(repo) 를 시스템에 추가하는 명령어
yum install mysql-server mysql-devel -y
  • MySQL 서버 + 개발 라이브러리 설치
service mysqld start
  • MySQL 서비스 실행


정상적으로 active 된 걸 확인할 수 있다.

mysql이 버전업이 되면서 패스워드 정책이 까탈스럽게 바뀌었기 때문에 원만한 실습을 위해 조금 설정을 변경하자.

echo >> /etc/my.cnf
echo "default_password_lifetime=0" >> /etc/my.cnf
echo "validate_password.policy=LOW" >> /etc/my.cnf
echo "validate_password.length=6" >> /etc/my.cnf
echo "validate_password.special_char_count=0" >> /etc/my.cnf
echo "validate_password.mixed_case_count=0" >> /etc/my.cnf
echo "validate_password.number_count=0" >> /etc/my.cnf
echo "skip_external_locking" >> /etc/my.cnf
echo "skip_name_resolve " >> /etc/my.cnf

그리고 당연하지만 적용하려면 재시작해야 한다.

service mysqld restart

그리고 mysql을 접속할 때 비번을 입력해야 되는데 비번을 모르니까 우리가 아는 비번으로 바꾸는 작업을 시작하자. 그럴려면 초기 비번을 알아내야 한다. 초기 비번을 알아낸 뒤 no1ids로 변경을 하자.

[root@Centos7 ~]# grep "temporary password is generated" /var/log/mysqld.log | grep -oP "\S+$"
f+bQNiPd6cTg
[root@Centos7 ~]# mysql --connect-expired-password -uroot -p -e "alter user 'root'@'localhost' identified with mysql_native_password by 'no1ids';"
Enter password:
[root@Centos7 ~]#


성공했음

원격접속을 위한 세팅을 마쳤으니까 잘 되는지 한 번 확인해보자!

성공했음

원격접속을 위한 세팅을 마쳤으니까 잘 되는지 한 번 확인해보자


이제 디비를 생성하고 내용을 채워야 함


[barnyard2.conf]에서 mysql 연동하려면 설정 변경해야쥐

[root@Centos7 ~]# vi /etc/snort/snort.conf
[root@Centos7 ~]# vi /etc/snort/sid-msg.map
[root@Centos7 ~]# cat /etc/snort/sid-msg.map
1000000 || ping-request
1000001 || ping-response



[root@Centos7 ~]# barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort/ -f alert.log -w /bar.log.snort/barnyard2.temp

아까처럼 ping 192.168.56.100을 날려보자


수집한 데이터를 디비에서 보기 위해 쿼리문을 입력하자

select a.timestamp, b.sig_name
from event a, signature b
where a.signature = b.sig_id


사실 지금까지 한 건 그냥 간단한 연습임

이제는 아까 열심히 설정한 것들이 이미 설정된 파일이 snort.ova을 가지고 해보자고

이제 진짜로 snort를 불러오고 다시 해보자

[root@Snort ~]# barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort/ -f alert.log -w /var/log/snort/by.tmp


잘 되는 것을 확인할 수 있다. 아까처럼 디비에서도 되는지 확인해보자
굳굳 잘된다!!

이제 여기서 각종 쿼리문을 조합하여 조인도 하고 테이블도 변경해가면서 원하는 컬럼값을 뽑아내면 된다.


아직까진 뭐...그냥저냥 할 만한 정도