반응형

오늘은 NTFS 파일 시스템에서의 파일복구를 실습해볼것이다.

툴은 NTFS Walker, HxD(+ FTK Imager, 010 Editor)를 이용해 볼 것이다.

 

*본 실습엔 개념을 NTFS에 대한 이해를 전제로 진행한다.

 


0. 파일 생성

실습을 위해 복구할 파일을 만들고자 한다.
D드라이브에 텍스트 파일을 하나 생성해보았다.

 

파일 명 : Forensic_NTFS_Study_Day1.txt

파일 타입 : .txt

크기 : 1,296byte(디스크 할당 크기 4,096byte)

 

*내용은 Non-resident 형태로 만들기 위해 700바이트가 넘도록 내용을 작성하였다.



1. 파일 삭제

우선 실습환경이 SSD 이기때문에 Trim을 비활성화하였다.

CMD 관리자 권한으로 fsutil behavior set DisableDeleteNotify 1 명령어로 비활성화가 가능하다.

 

그리고 파일을 완전히 삭제한다.



2. 분석

이제 분석을 진행 할 시간이다.


우선 HxD(관리자 권한 실행)를 통해 D드라이브를 물리디스크 형식(도구-디스크열기-물리디스크)으로 열어본다.


아래를 보면 VBR이 0x00 00 08 00으로 2048번째 섹터에 위치 해 있는 것을 확인 할 수 있다.

 

 

VBR이다. 해당 영역의 13번째 인덱스의 값은 클러스터 당 섹터의 개수이다. 0x08로 8개인 것을 확인 할 수 있다.

 

 

위 정보를 이용하여 이제 삭제한 파일의 데이터를 찾아가 볼 것이다.



3. 파일 복구

이제 본격적으로 파일을 복구해 볼 것이다.

일단 NTFS Walker를 이용하여 삭제된 파일의 MFT Entry Number를 확인한다.

1209번이 삭제된 파일의 Entry Nubmer이다.

 

한 Entry당 두개의 섹터(본 시스템 기준 512byte*2 = 1024byte 크기)를 가지고 있다.
VBR 영역에서 Start Cluster for $MFT를 통해 해당 섹터를 찾아가서 1209 * 2 섹터만큼 건너 뛰면 되지만,

본 포스팅에서는 편리를 위해 FTK Imager로 $MFT를 덤프하여 010 Editor를 통해 열어 해당 Entry를 찾아가 보았다.

 

 

해당 FileName 영역을 보면 삭제된 파일의 이름이 존재한다. 해당 영역이라는 것은 증빙이 되었다.

 

 

이제 Runlist부분을 찾아가 본다.

 

 

Runlist는 0x31 01 DD 3B 0C 부분이다.

Run Length는 0x01, Run Offset은 0x0C 3B DD이다.

해당 값과 공식을 이용하여 실제 컨텐츠 데이터에 접근해 보겠다.

(사진에 드래그한 앞에 8바이트는 파일의 Initalized Size를 이야기한다. 0x05 10 값으로 1296byte였던 파일이었다는 정보를 알 수 있다.)

 

0C 3B DD * 8(클러스터 당 섹터) + 2048(VBR 시작 섹터) = 6,416,104섹터(10진수/실제 컨텐츠 데이터)

 

HxD에서 해당 섹터로 찾아가본다.

 

 

삭제되었던 텍스트 파일이 존재한다!

해당 주소부터 파일의 크기인 1296byte만큼 복사하여 새로운 파일로 저장한다.

 



3. 파일 복구 성공

다음과 같이 파일이 복구가 된 것을 확인 할 수 있다.

 

 


이제 실습끝났으니 다시 Trim을 활성화하여 빠른 속도로 사용합니다!

반응형

반응형

오늘은 AI의 대표적인 데이터셋인 MNIST를 이용하여

손글씨 숫자 이미지를 인식하는 실습을 해보고자 한다.

 

스마트폰 앱에서 글씨를 캡쳐하면 실제 데이터로 변형되어 출력되는 것을 본적이 있을 것이다.

오늘은 이런 것이 어떻게 가능한 것인지 알아보고, 실습하는데 목적을 둔다.

 

*추후 모델과 기초 개념에 대해서도 다룰 예정이다.


0. 목표

우리는 위 숫자가 '8'이란 것을 안다. 어떻게 알게 되었는가?

 

어렸을 때 우린 1부터 9까지 숫자들의 모양을 학습하였고,

위 이미지와 우리가 알고있는 모양인 숫자 8과 일치시켜 답을 내놓을 수 있었을 것이다.

 

컴퓨터로는 어떻게 위 이미지를 인식하여 데이터를 처리할 수 있을까?

 

우리는 해당 포스팅을 통해 '손글씨 숫자 이미지를 인식하여 예측'해보는 모델을 만들어보고자 한다.

  • 1부터 9까지의 데이터를 학습하여 손글씨 이미지를 예측할 수 있는 '모델'을 만들고
  • 임의의 손글씨 이미지를 만들어 이 그림이 어떠한 숫자를 의미하는지 예측해 볼 것이다.

*참고로 이미지 데이터를 처리할때 높은 정확도를 도출하기 위해 CNN 방식을 많이 사용하지만 본 포스팅에선 CNN을 중점적으로 다루지 않는다. 추후 다룰 예정이다.

 


1. MNIST 데이터 셋

이번 포스팅에서도 다시 얘기하지만 Deep Learning의 핵심은 '좋은 데이터'이다.

 

이번은 AI에서 대표적인 손글씨 데이터 셋인 MNIST 데이터 셋에 대해 이야기해보겠다.

 

MNIST Dataset


MNIST는 다음과 같은 특징을 갖는다.

  • 대표 데이터 셋인 만큼 import하여 손쉽게 데이터를 불러올 수 있다.
  • 60,000개의 학습 데이터, 10,000개의 테스트 데이터로 나뉘어 있다.
  • 각 이미지는 28x28 크기로 784개의 픽셀을 가진다.

(1) 데이터를 불러오는 방법은 다음과 같다.

from keras.datasets import mnist


(2) 데이터 갯수는 다음과 같다.

(X_train, Y_class_train), (X_test, Y_class_test) = mnist.load_data()
print("학습셋 이미지 수 : %d 개" % (X_train.shape[0]))
print("테스트셋 이미지 수 : %d 개" % (X_test.shape[0]))

  • 첫번째 라인에서 X_train에는 학습할 60,000개의 각 784개 픽셀 정보가 배열 형태로 저장되게 되고
  • Y_class_train에는 60,000개 이미지 정답인 클래스 정보가 담기게 된다.
  • X_test와 Y_class_test는 테스트 데이터로 10,000개이고 형태는 위 학습데이터와 같다.

(3) 다음은 데이터 형태이다(X_train 데이터의 첫번째 원소).

# 이미지 형태 출력을 위한 pyplot 모듈 import
import matplotlib.pyplot as plt
# 위 60000개 데이터 배열에서 0번째 원소를 흑백으로 출력
plt.imshow(X_train[0], cmap='Greys')
plt.show()

################################

# 0번째 원소의 모든 데이터를 출력
for x in X_train[0]:
    for i in x:
        sys.stdout.write('%d  ' % i)
    sys.stdout.write('\n')

  • 위 그림을 보면 가로 28개 픽셀, 세로 28개 필셀의 집합으로 하나의 그림이 만들어 진 것을 볼 수 있다.
  • 흰색은 0, 검정색은 255 이렇게 각 픽셀의 색상을 데이터화하여 X_train의 원소에 담겨져 있는 것이다.

 

 


2. Training

# 딥러닝에 필요한 케라스 함수 호출
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense

# 필요 라이브러리 호출
import numpy
import tensorflow as tf

# 데이터 셋 호출
from keras.datasets import mnist

# 실행 시마다 같은 결과값 도출을 위한 시드 설정
numpy.random.seed(0)
tf.random.set_seed(0)

# 데이터를 불러와서 각 변수에 저장
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

# 학습에 적합한 형태로 데이터 가공
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255

# 클래스를 학습에 이용하기 위해 데이터 가공
Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)

# 딥러닝 모델 구조 설정(2개층, 512개의 뉴런 연결, 10개 클래스 출력 뉴런, 784개 픽셀 input 값, relu와 softmax 활성화 함수 이용)
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))

# 딥러닝 구조 설정(loss 옵션을 다중 클래스에 적합한 categorical_crossentropy, 옵티마이저는 adam 설정)
model.compile(loss='categorical_crossentropy', optimizer='adam',
              metrics=['accuracy'])

# 모델 실행(X_test, Y_test로 검증, 200개씩 30번 학습)
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=2)

# 학습 정확도, 검증 정확도 출력
print('\nAccuracy: {:.4f}'.format(model.evaluate(X_train, Y_train)[1]))
print('\nVal_Accuracy: {:.4f}'.format(model.evaluate(X_test, Y_test)[1]))

# 모델 저장
model.save('Predict_Model.h5')

 

다음 부분에 설명이 필요할 것이다.

  • X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
  • 학습을 위해 각 데이터는 0-255에서 0-1사이의 숫자로 변환해야한다. 그래서 위 연산을 수행한다.
  • 위 함수를 아래 3줄로 풀어 출력하면 다음과 같다. 천천히 이해를 해보기 바란다.

  • np_utils.to_categorical(Y_train, 10)
  • 해당 클래스 정보도 0-10 값을 0, 1, 2, 3~~ 이렇게 저장할 수 있지만 앞서 말했듯이 0, 1값으로 저장해야 원할한 데이터 처리가 가능하다.
  • 5를 표현하기 위해 클래스 갯수를 가지는 리스트를 만들어 5번째 원소에만 1을 주는 방식으로 one-hot vector화하는 함수다.

 

이후 학습을 진행한다.

CNN을 사용하지 않았지만 높은 정확도를 보였다. 검증 정확도가 98%이다.

 

 

해당 모델은 다음과 같이 잘 저장되었다.

 

 

 


3. Testing

테스트를 위해 이미지를 하나 만들어보았다.

픽셀을 28x28로 만들고(어차피 resize해서 필요없긴하나 편의를 위해), 붓으로 숫자 8을 그려보았다.


이제 jupyter notebook에 업로드하고 다음과 같이 코딩한다.

# 딥러닝에 필요한 케라스 함수 호출
from keras.models import load_model
from keras.utils import np_utils

# 필요 라이브러리 호출(PIL은 이미지파일 처리위함)
from PIL import Image
import numpy as np

# test.png는 그림판에서 붓으로 숫자 8을 그린 이미지 파일
# test.png 파일 열어서 L(256단계 흑백이미지)로 변환
img = Image.open("test.png").convert("L")

# 이미지를 784개 흑백 픽셀로 사이즈 변환
img = np.resize(img, (1, 784))

# 데이터를 모델에 적용할 수 있도록 가공
test_data = ((np.array(img) / 255) - 1) * -1

# 모델 불러오기
model = load_model('Predict_Model.h5')

# 클래스 예측 함수에 가공된 테스트 데이터 넣어 결과 도출
res = model.predict_classes(test_data)
# 2021/10/02 수정 - 오류시 아래 명령어로 대체 가능합니다.
# res =(model.predict(test_data) > 0.5).astype("int32")

print(res)

 

출력 결과는 다음과 같다.

정확히 예측에 성공하였다.

학습 데이터가 좋아 쉽게 성공하였는데 이후에 CNN을 이용하여 실습해 보겠다.

 

 


4. 블랙박스 부수기

현재 우리는 블랙박스를 부수지 못하고있다.

인식, 예측엔 성공했지만 '어떻게' 이것이 가능한지는 원리적으로 알지 못한다.

아직 model.add(Dense(~~)) 부분도 상세히 설명하지 않았다.

 

해당 포스팅은 딥러닝이란 분야에 흥미를 불러일으키기 위한 목적을 가진다.

 

이후 글부터 '어떻게'에 초점을 맞추어 활성화 함수부터 모델에 대한 전반적인 개념에 대한 포스팅을 진행할 예정이다.

그리고 다시 해당 포스팅으로 돌아오면, 안보이던 코드(블랙 박스)가 하나하나 보이기 시작할 것이다.

 


같이 공부해요 ㅎㅎ

반응형
반응형

오늘은 공부한 것을 토대로 직접 테스트 데이터도 추가하여

폐암 환자의 수술 후 생존 여부를 예측해볼 것이다.

 

*추후 모델과 기초 개념에 대해서도 다룰 예정이다.


0. 목표

머신러닝은 '알고리즘을 이용하여 데이터를 분석하고, 학습하여 이러한 내용을 기반으로 판단, 예측하는 기술' 이다.

 

딥러닝도 머신러닝 범주에 속해있으며 우린 이를 이용해 미래의 일을 예측해보고자 한다.

 

이런 예측하는 기술은 어디에 사용할 수 있을까?

 

본 포스팅에서는 '폐암 환자의 수술 후 생존 여부'을 예측해보고자 한다.

  • 기존의 폐암 환자 데이터를 학습하여 수술 후 생존 여부를 예측할 수 있는 '모델'을 만들고
  • 가상의 환자 데이터(미래)를 만들어 수술 후 생존 여부를 예측해 볼 것이다.


 


1. 폐암 환자 데이터

AI에서 가장 중요한 부분이자 기반이 되야 하는 것이 '좋은 데이터'이다.

 

폐함 환자 생존률 데이터는 '모두의 딥러닝' 예제의 [ThoraricSurgery.csv]를 사용하였고,

직접 [test.csv]를 만들어 가상의 환자를 만들어 보았다.

* ThoraricSurgery.csv : 구글에 치면 다운받을 수 있는 깃허브 주소가 나온다.

 

[ThoraricSurgery.csv] 데이터의 구조를 살펴보자.

  • 데이터에는 470명의 환자 정보가 들어있다.
  • '속성' 정보는 [종양 유형, 폐활량, 기침, 흡연 여부 등] 각각의 17개의 환자의 정보가 담겨있다.
  • '클래스'에는 [수술 후 생존, 사망 여부] 정보가 담겨 있다.

[test.csv] 데이터 구조도 살펴보자.

  • 글쓴이가 만든 가상의 환자 정보이다.
  •  '속성' 정보는 [종양 유형, 폐활량, 기침, 흡연 여부 등] 위와 같이 17개의 환자의 정보가 담겨있다.
  • '클래스'[수술 후 생존, 사망 여부] 정보는 우리가 모델을 통해 예측해볼 것이다!


 


2. Training

# 딥러닝에 필요한 케라스 함수 호출
from keras.models import Sequential, load_model
from keras.layers import Dense

# 필요 라이브러리 호출
import numpy as np
import tensorflow as tf

# 실행 시마다 같은 결과값 도출을 위한 시드 설정
np.random.seed(0)
tf.random.set_seed(0)

# csv 파일을 읽어 ','기준으로 나눠 Dataset에 불러오기
Dataset = np.loadtxt("ThoraricSurgery.csv", delimiter=",")

# 환자 정보는 0-16번(17개)까지이므로 해당 부분까지 X에 담기
X = Dataset[:, 0:17]
# 수술 후 결과는 마지막 17번은 클래스로 Y에 담기
Y = Dataset[:, 17]

# 딥러닝 모델 구조 설정(3개층, 속성이 17개 input 값, relu와 sigmoid 활성화 함수 이용)
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(15, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 딥러닝 실행(오차함수는 평균제곱오차, 최적화함수는 adam 이용)
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=30, batch_size=5)

# 만들어진 모델 저장
model.save('Predict_Model.h5')

 

중간에 Dataset을 출력한 사진이다.

다음과 같이 470명 환자의 17가지 정보가 들어간 이중 리스트가 만들어졌다.

 

중간 X와 Y를 출력한 사진이다.

X엔 환자 정보가, Y엔 마지막 컬럼인 생존여부부분이 들어간 것을 볼 수 있다.

 

모델의 정확도이다.

5개 단위(batch-size)로 30번(epochs) 학습시켜 85.74% 정확도를 가진 모델을 만들었다.

 

그리고 다음과 같이 잘 저장되었다.


3. Testing

# 딥러닝에 필요한 케라스 함수 호출
from keras.models import load_model
from keras.utils import np_utils

# 필요 라이브러리 호출
import numpy as np

# csv 파일을 읽어 ','기준으로 나눠 Dataset에 불러오기
Dataset = np.loadtxt("test.csv", delimiter=",")

# 환자 정보는 0-16번(17개)까지이므로 해당 부분까지 X에 담기
X = Dataset[:, 0:17]
# 수술 후 결과 정보인 예측값 변수 초기화
Y = []

# 모델 불러오기
model = load_model('Predict_Model.h5')

# X 값에 대한 predict_classes 함수 실행결과 Y에 저장
Y = model.predict_classes(X)

print('Predict : ', Y)

 

중간 Dataset 변수를 출력한 사진이다.

3명의 가상 환자 정보가 잘 들어간 것을 알 수 있다.

 

마지막 예측 결과 사진이다.

3명의 가상 환자에 대해 다음과 같은 결과를 도출했다.

  • 1번 가상 환자 : 수술 후 사망 예상
  • 2번 가상 환자 : 수술 후 사망 예상
  • 3번 가상 환자 : 수술 후 생존 예상

이라는 결과를 내놓았다.


4. 신뢰성

여기서 한가지 밝힐 사실이 있다.

이 가상 환자 세명은 사실 [ThoraricSurgery.csv] 데이터의 환자의 정보를 참고하여 만들었다.

두명은 수술 후 사망했던 환자 정보유사한 속성 정보를 집어넣었고

마지막 한명은 수술 후 생존했던 환자 정보유사하게 속성 정보를 집어넣었다.

 

보시다시피 결과는 예상과 같았다.

이러한 결과는 모델에 대한 정확도를 보여주는 또 한가지의 지표가 되었다.


 

AI를 이용하면 다음과 같이 기존 데이터를 이용해 미래의 일을 예측해볼 수 있다.

하지만 그만큼 어려운 분야인 만큼 많은 공부를 필요로 한다.

계속해서 공부해나가다 보면 우리 모두 좋은 성과를 도출해낼 수 있을 것이다.

반응형
반응형

당분간 딥러닝 관련 포스팅을 진행할 예정이다.

기초부터 원리, 실데이터를 이용한 실습까지 차근차근 진행해볼 예정이다.

딥러닝 공부를 위한 실습 환경 조성부터 진행해보자.


0. 환경 확인

 본인은 Windows 10 64bit 기준으로 설명한다.

실습시 GPU는 이용하지 않고 CPU를 이용할 예정이다.


1. 아나콘다 설치

  • 아나콘다3를 설치한다.

  • Add Anaconda3 to my PATH enviroment variable을 체크해줘서 환경변수 설정을 해주자.

  • 시작 - 검색에 anaconda를 검색하여 나타나면 설치가 완료된 것이다.

 


2. 텐서플로, 케라스 설치

  • Anaconda Prompt를 '관리자 권한으로 실행'한다.

  • 환경을 생성한다.
    > conda create -n [작업환경명] python=[버전] [필요라이브러리명], ...
    > ex:) conda create -n saynot python=3.8 numpy pandas matplotlib spyder 

  • 환경을 활성화한다.
    > activate [작업환경명]

  • 텐서플로를 설치한다.
    > pip install tensorflow

  • 텐서플로가 제대로 설치되었는지 확인한다.
    > python - import tensorflow as tf - print(tf.__version__) 입력 시 버전 출력되면 설치 확인

  • 케라스를 설치한다.
    > pip install keras

  • 케라스가 잘 설치 되었는지 확인한다.
    > python - import keras 입력 시 Using TensorFlow backend 문구나 에러문구 출력안되면 설치완료

 


3. 주피터 노트북 설치

마지막으로 주피터 노트북을 설치해서 코딩 환경을 조성한다.

  • 주피터 노트북 설치한다.
    > pip install jupyter

  • 주피터 노트북을 실행한다.
    > jupyter notebook
    > 메모장 or 페이지 or 도스상에 주피터 노트북 링크가 뜨게 되는데 해당 링크를 복사하여 크롬에 붙여넣기한다.

  • 주피터 노트북 페이지 접속하여 테스트해보기.
    > New - Python 3
    > 라인에서 파이썬 코드 입력후 Run 클릭

  • 저장 버튼은 항상 필수!!



4. 추후 접속 시

  • Anaconda Prompt (관리자 권한 실행) - activate [작업환경명] - jupyter notebook 순으로 접속하면 된다.

이제 실습환경 구축이 끝났으니 다음 챕터부터 딥러닝을 본격적으로 공부해 보겠다.

저작권 및 오타 지적 환영!

 

반응형
반응형

필자는 pcap 라이브러리를 사용하며 다양한 프로그램을 구현해본 경험이 있다.

최근 python으로도 pcap 라이브러리가 존재한다는 것을 알게되었다.

바로 PyPCAP인데, 자료가 많지 않더라. 공부해보자.


1. PyPCAP?

pypcap을 이야기하기 전에 pcap에 대해 먼저 알아야한다.

 

pcap이란 Packet Capture의 약자인데, 네트워크상의 패킷을 캡쳐하기 위한 API이다.

윈도우는 Winpcap, 리눅스에선 libpcap을 사용하여 이용 가능하다.

 

pypcap은 말그대로 python 버전의 pcap 라이브러리이다.

이를 이용하여 python 환경에서 네트워크 트래픽을 손쉽게 캡쳐하고, 분석 가능할 수 있다.

 

*공식 문서와 설명은 다음 링크에 있다.




2. 사용법

pypcap을 사용하기 위해선 pypcap을 먼저 설치해야한다.

이후 pcap을 import하여 사용하면 된다.

 

1. 설치

pip intall pypcap

  • python3의 경우 pip3 install pypcap
  • libpcap-dev, python-dev 패키지 의존

 

2. 사용법

import pcap




3. 실습/예제

이제 pypcap을 이용하여 간단한 코딩을 진행하자.

 

네트워크 패킷을 캡쳐하게 되면 호스트에선 Ethernet Header의 MAC Frame 부분부터 잡기 시작한다.

아래와 같이 첫 6바이트는 Destination의 MAC 주소를 가리키고, 다음 6바이트는 Source의 MAC 주소를 가리킨다.

 

다음은 Destination MAC주소와 Source MAC 주소를 출력하는 코드의 예문이다.

 

import pcap #pypcap 라이브러리

sniffer = pcap.pcap(name=None, promisc=True, immediate=True, timeout_ms=50)

for ts, pkt in sniffer:
    print('Dst MAC - ', end='', flush=True)
    print(':'.join('%02X' % i for i in pkt[0:6])) #패킷의 0번부터 5번 바이트까지 출력
    print('Src MAC - ', end='', flush=True)
    print(':'.join('%02X' % i for i in pkt[6:12])) #패킷의 6번부터 11번 바이트까지 출력
    print()

 

위와 같이 매우 짧은 코드로 잡힌 패킷의

출발지 맥주소와 도착지 맥주소를 출력할 수 있다.

 

코드를 잠시 살펴보자.

 

  • sniffer = pcap.pcap(name = None, promisc = True, immediate = True, timeout_ms = 50)
    • name = None > 디바이스 이름이다. None을 두면 디폴트값이 들어가게 되고, 작은따옴표 안에 직접 디바이스 명을 넣어줄 수 있다.
    • promisc = True > 프리큐어스(무차별) 모드이다. 해당 옵션을 True, 곧 사용하겠다는 뜻이다. 해당 옵션으로 모든 패킷을 캡쳐 가능하다.
    • immediate = True > immediate 옵션이다. 해당 옵션을 True로 설정하여 지연문제를 없앨 수 있다.
    • timeout_ms = 50 > 말그대로 타임아웃 시간이다. ms단위로 50이므로 0.05초로 설정하였다.
    • 해당 return 값을 sniffer에 반환한다.

print(sniffer)

  • for ts, pkt in sniffer
    • sniffer 객체의 첫번째 값은 timestamp, 두번째 값은 packet으로 반복문을 돌겠다는 의미이다.
    • 이후 pkt[idx] 형식으로 네트워크 패킷의 특정 위치 인덱스 값을 가져올 수 있다.



 

4. 응용

pypcap은 dpkt나 socket 모듈 등과 함께 편리하게 사용 가능하다.

다음은 dpkt 모듈을 이용하여 Ethernet의 정보를 파싱하여 출력하는 예문이다.

 

import pcap
import dpkt

sniffer = pcap.pcap(name='eth0', promisc=True, immediate=True, timeout_ms=50)
sniffer.setfilter('tcp and port 443')

def mac_addr(address):
    return ':'.join('%02X' % dpkt.compat.compat_ord(b) for b in address)

for ts, pkt in sniffer:
    eth = dpkt.ethernet.Ethernet(pkt)
    #ip = eth.data
    #tcp = ip.data
    print('Ethernet INFO - ', mac_addr(eth.dst), mac_addr(eth.src), eth.type)
  • eth0 디바이스를 이용하여 캡쳐를 진행하고,
  • setfilter() 함수를 통해 tcp 패킷과 443번 포트를 필터링
  • 이후 dpkt의 Ethernet 클래스로 ethernet 부분을 파싱
  • 해당 함수의 변수를 사용해 원하는 값을 출력

 

 

*eth.data, ip.data 등을 이용해 IP와 TCP Header에 대한 파싱도 손쉽게 가능하다.



4. 마무리

위와 같이 해당 모듈을 이용해 자신이 원하는 대로 네트워크 패킷을 캡쳐, 분석 가능하다.

 

  • 느낀점
    • C++보다 훨씬 짧은 코드로 원하는 결과를 표현 가능
    • python의 장점을 잘 살린 pcap 모듈
    • 하지만 관련 자료가 많지 않아 해당 라이브러리의 공식 문서를 찾는 수고가 필요

 

계속해서 공부하다보면 네트워크를 이용하는 프로그램을 손쉽게 만들 수 있게 될 것이다.


(이렇게 한글로 된 pypcap 자료 갯수에 이바지하였다.)

반응형

'Programming > Network' 카테고리의 다른 글

[소켓 프로그래밍] TCP Echo-Client, Server 구현  (0) 2020.06.09
반응형

오늘은 네트워크를 공부해볼 것이다.

유명 오픈소스 IDSSuricata(수리카타)에 대해 공부해보자.


1. Snort? Suricata?

본 주제에 들어가기 전에 Snort부터 이야기를 해보려고 한다.

Snort(스노트)는 sourcefile사에서 만든 오픈소스 IDS(Intrusion Detection System)

실시간 트래픽을 분석하거나 패킷 로깅 용도로 오랫동안 사랑 받아왔다.

또, 그동안의 수많은 개발자들에 의한 rule을 제공받을 수 있고 다양한 OS를 지원한다.

그러나 Snort에도 단점이 존재했는데, 그건 바로 단일-스레드 처리방식이었다.

시간이 지날 수록 처리해야 할 트래픽은 늘어가지만

단일-스레드 방식으로 이 모든 데이터를 처리하기엔 한계가 있었다.

 

그래서 해당 단점을 보완하고자, Suricata가 등장한다.

Suricata(수리카타) 역시 오픈소스 IDS(Intrusion Detection System)이다.

Snort를 발전시킨 만큼, Snort 룰이 호환되어 사용 가능하다.

무엇보다 멀티 코어와 멀티-스레드 처리방식으로 데이터를 처리할 수 있어서

현재도 많은 사랑을 받고있다.

뿐만 아니라 하드웨어(GPU) 가속 역시 지원하기 때문에 큰 기업에서도 많이 사용한다.

 

아래는 Snort와 Suricata에 대한 비교 사진이다.

출저 :  http://wiki.aanval.com/wiki/Snort_vs_Suricata



2. Suricata - 설치

리눅스Suricata를 설치해보자.

 

기존엔 복잡한 방법으로 설치하였으나 최근엔 쉽게 설치가 가능하다.

우선 본인은 기존에 설치되어 있는 OS인 Kali linux 5.3.0버전에서 진행하였다(참고로 Kali에서 실습하는건 추천하지 않는다).

 

1. (sudo)apt-get install suricata 명령어로 설치(본인은 이미 설치가 되어있음)

 

2. suricata 명령어로 실행 확인



3. Suricata - rule 생성

80 포트(HTTP)와 443 포트(HTTPS)를 사용하는 두가지 사이트에 대한 필터링 룰을 생성해보겠다.

1. suri.rules 파일을 생성한다.

2. 해당 파일에 문법에 맞게 rule을 작성한다. > 문법은 https://suricata.readthedocs.io/en/suricata-4.1.4/rules/intro.html 참고

alert tcp any any -> any 80 (msg:"80site.com Access"; content:"GET /"; content:"Host: "; content:"80site.com"; sid:10001; rev:1;)
alert tcp any any -> any 443 (msg:"443site.com Access"; flow:to_server,established; tls_sni; content:"443site.com"; sid:10002; rev:1;)



4. Suricata - 실행

rules 파일까지 작성이 끝났다.

이제 Suricata를 실행시켜보자.

 

1. suricata -s suri.rules -i eth0 명령어로 인터페이스와 파일을 인자로 넣어 실행한다.

2. 해당 사이트에 접속한다(본인은 80포트는 교수님 사이트, 443포트는 얼굴책 사이트를 지정하였다)

 

3. 로그파일을 확인한다. > /var/log/suricata/fast.log에 룰 정책에 의한 접속 로그들이 저장된다.

4. 위와 같이 조건대로 log가 저장된 것을 확인 가능하다.


여기까지 suricata를 실습해보았다.

오픈소스로 사용하기 아까울 정도로 잘 만들어논 프로그램 같다.

Suricata를 올바르게 사용한다면 기업 입장에선 비용을 많이 절감할 수 있어보인다.

 

이후 편에서 문법부터 상세한 설명을 포함하여 포스팅해볼 예정이다.

반응형

+ Recent posts