본문 바로가기

카테고리 없음

네트워크 보안 13.

5월 18일 수요일

 

* PCRE (정규표현식, Perl Compatible Regular Expression)

- 패턴을 저장, 추출, 검색 등을 할 때 사용

   ex) IP주소, 전화번호, 주민등록번호, 이메일 등등

 

* DLP (Data Loss Prevention) : 개인정보가 외부로 유출되지 않도록 하는 SW, 자체 PC를 검색하기도함 (패턴으로 검색)

 

* 특수문자

 ^ : 캐럿 (carrot)

 ~ : 틸드 (tilde)

 * : 아스테리스크 (Asterisk)

 [  ] : 브라킷 (bracket)

   .   : 닷(dot), 포인트

  @ : at

 

[0-9]   :  숫자만 사용가능

{3} : 3자리 사용 가능

{1,3} : 1자리~3자리 사용 가능

    ex)  [0-9]{1,3}  :   0~999 

 

A{3} : A를 세자리로 만듦  AAA

[a-z] : a부터 z까지

[a-z]{3} : a부터 z까지 3번 사용 : aaa,aab,aac,....,abc,.....,kjh,.....,zzz    -----> 알파벳 소문자3자리

[a-z]{1,3} : a부터 z까지 1~3번 사용 :  a,b,c,d,....,aa,ab,ac,....,aaa,aab,aac,....,zzz 

 

[^a-z] : 소문자 아닌것

[^'] : '가 아닌 것

 

i..o  :   info(가능)  into(가능)   .는 문자 1개를 의미하는 와일드 카드

 

* 특수문자의 Escape 처리를 해주어야 함

- Escape : 특수문자가 고유한 기능을 못하게 하는 것

- 특수문자 앞에 \를 붙이는 것

 

* AWK

- awk는 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작하거나 데이터화하는 것을 목적으로 사용하는 프로그램

- awk 명령의 입력으로 지정된 파일로부터 데이터를 분류한 다음, 분류된 텍스트 데이터를 바탕으로 패턴 매칭 여부를 검사하거나 데이터 조작 및 연산 등의 액션을 수행하고, 그 결과를 출력하는 기능

- awk는 기본적으로 입력 데이터를 라인(line) 단위의 레코드(Record)로 인식

- 각 레코드에 들어 있는 텍스트는 공백 문자(space, tab)로 구분된 필드(Field)들로 분류

 

* 암호화폐로 보상을 해주는 블로그

https://steemit.com/

 

Steemit

Communities without borders. A social network owned and operated by its users, powered by Steem.

steemit.com

 


 

* Linux 문법 간단 정리

 

$ echo "Mina Sana Dahyun Jeonyun" | awk '{print $1,$4,$3,$2  }'

 

$ echo "Mina Sana Dahyun Jeonyun" | awk '{print $1,$4}' | awk '{print $2,$1}'

  ---->  Jeonyun Mina

 

* sed : 치환할 때 많이 사용하는 명령

  $ sed 's/old/new/g'                              // old가 new로 바뀜

 

cf.  DNS로그는 구분자를 [**]로 사용함 ㅡㅡ;;

    ----> awk문은 공백을 구분자로 사용하기 때문에 DNS로그를 읽을 수가 없음...

 

예제)  [**]를 |(파이프)로 치환하려면?

     sed  's///g'                                    // 공식

     sed  's/[**]/|/g'                               // 바꿀 내용 입력

     sed  's/\[\*\*\]/|/g'                       // 이스케이프 처리를 위해 \(백슬래시)를 붙임

 

 

실습파일 다운로드) 우분투를 실행하고 Firefox에서 아래 사이트에 접속해서 파일을 다운로드

https://cafe.naver.com/boanworld/864

 

로그분석 실습 파일

 

cafe.naver.com

 


 

 

* 우분투에 7zip 설치 + linux 문법

$ sudo  apt  install  p7zip  p7zip-full

 

 

$ cd  Downloads

 

$ tail  -10  bee_access.log

- 6번째 컬럼만 골라서 보려면?

$ sudo  cat  bee_access.log  |  awk '{print $6}'

(!. 이때 '{print $0}' 는 전체 출력 명령어)

 

 

 

- 무슨 행위가 있었는지 보려면?  (6~8번 까지 확인)

 

$ sudo  cat  bee_access.log  |  awk '{print $6,$7,$8}'

 

 

 

- 192.168.5.1에서 몇번이나 접속했는지 확인하려면?

 

$ cat  bee_access.log  |  awk '{print $1}' |  sort  |  uniq  -c  |  sort -rn

    ----> 212

uniq  -c  : 중복값 제거 + 넘버링

sort -rn : 내림차순 (역순)

 

 


 

- 공격이 언제 시작해서 언제 끝났는지?

 

$ cat bee_access.log  |  grep '192.168.5.1'  |  awk '{print $1,$4,$5}'  |  head -1                    // 첫번째줄은 공격을 시작한 시간

$ cat bee_access.log  |  grep '192.168.5.1'  |  awk '{print $1,$4,$5}'  |  tail -1                       // 마지막줄은 공격을 끝낸 시간

 

첫번째 ~ 마지막 공격 시간

 

 

* 7zip파일 압축 풀기

$ sudo  7zr  x  log.7z

$ tail -10  auth.log

 

$ tail -10    auth.log

 

 

- 누구의 권한으로 실행되었는지 확인

$ cat auth.log  |  awk '{print $10}' | sort | uniq -c | sort -rn

 

 

 

- 3번 이상만 골라서 확인 (1~2번 나온 것은 의미 없음)

$ cat auth.log  |  awk '{print $10}' | sort | uniq -c | sort -rn |  awk '$1>2'

 

 

 

- 그 결과를 저장하려면? (my.log 저장)

$ cat auth.log  |  awk '{print $10}' | sort | uniq -c | sort -rn |  awk '$1>2'   >  my.log

 

my.log 저장

 

- 어떤 명령이 가장 많이 사용되었는지 그리고 몇 번 사용되었는지?

$ tail  -10  auth.log

$ cat auth.log  |  awk '{print $5}'  | awk -F"[" '{print $1}'  | sort | uniq -c | sort -rn

-> $5 프린트 한것 중에서 | [ 전까지 끊고 $1 (맨앞에 꺼) 출력하고 | sort 하고 | 중복 제거 + 넘버링 | 내림차순 정렬

 

 

 

   -----> SSH(외부접속)로 접속한 횟수가 70442번??? 매우 수상

   -----> CRON(예약작업)으로 D-Day에 동작하도록 설정을 할 수 있음 (악의적 행위가 동작하는 시점이 지정되어 있음)

 


 

$ cd  ~/Downloads

$ head   -20  dv_access.log

 

$ head     -20    dv_access.log

 

 

- 어떤 페이지를 POST로 요청했는지 확인

- 6번 컬럼은 POST 또는 GET으로 시작하므로 POST만 골라서 보고, 11번 컬럼은 요청한 페이지이므로 아래와 같이 작성

$ cat  dv_access.log  |  awk '$6~/"POST/{print $11}' : 6번 칼럼에서 (~) "POST"로 시작하는 페이지의 11번 칼럼 출력

$ cat  dv_access.log  |  awk '$6~/"POST/{print $11}' | sort | uniq -c | sort -rn

 

 


 

 

* Argus IDS를 설치

- IDS의 대표적인 오픈 소스 : Snort, Suricata, Argus IDS 

- Argus IDS의 본체는 네트워크 중간에 배치, Argus의 사용자 콘솔은 사무실에 설치

 

* Argus IDS Client 설치

$ cd ~

$ sudo  apt  install  flex

$ sudo  apt  install  bison

$ cd  Downloads

$ sudo  -i                         // root 권한으로 전환

 

 

# cd   /home/계정/Downloads

# tar  zxvf  argus-clients-3.0.8.tar.gz

# cd  argus-clients-3.0.8

# ./configure                                         //  gcc가 없는 경우,  apt  install  gcc해서 설치하면 됨,  byacc도 없다고 하면 마찬가지로 설치

 

# ./configure

 

# apt  install  make

# make  &&  make install

# cd   ..                                 (또는   # cd  /home/계정/Downloads)

# ra  --help

# ra  -nzr  1_merged_total.arg   -s  saddr,sport,daddr,dport                 // 상당히 많이 나옴

 

# ra    -nzr    1_merged_total.arg     -s    saddr,sport,daddr,dport

 


* BPF (Berkeley Packet Filter)

- 자연어 기반의 필터  (자연어는 (미국에 사는 영어사용하는) 인간의 언어)

 

#  ra -nzr 1_merged_total.arg - "src host 192.168.1.122 and udp"           

// 출발지 IP주소가 192.168.1.122이고 UDP인 패킷만 골라서보기

 

#    ra -nzr 1_merged_total.arg - "src host 192.168.1.122 and udp"

 


 

* DNS (Domain Name Service)

- 정방향 조회: Domain Name을 입력하면 IP주소를 알려주는 것

- 역방향 조회: IP주소를 입력하면 Domain Name을 알려주는 것

- DNS Record

   A : 정방향 조회 (IPv4주소를 알려줌)

   AAAA 또는 A6 : 정방향 조회 (IPv6주소를 알려줌)

   PTR (pointer) : 역방향 조회

   cname : 별칭

   NS : Name Server의 준말

 

# head  -10  2_dns.log

 

# head    -10    2_dns.log

 


 

- 구분자 : [**]

- Query : Client(웹브라우저)가 DNS Server에게 IP주소를 물어보는 것

- Response : DNS Server가 Client(웹 브라우저)에게 IP주소를 알려주는 것

- 3번째 컬럼이 도메인이고, 6번째가 IP주소

- Response 이면서, A로 표시된 것이 정방향 조회의 결과임

 

- 구분자를 |로 만든 후, |를 제거할 예정

# cat  2_dns.log  |  sed  's/\[\*\*\]/|/g' |  awk  -F"|"  '{print $3,$6}'

 

- 2번째 컬럼이 Response이고 4번째 컬럼이 A인 것만 골라서 추출

# cat  2_dns.log  |  sed  's/\[\*\*\]/|/g' |  awk  -F"|"    '$2~/Response/  && $4~"A"{print $3,$6}'  | sort  -u

- 구분자를 없애기 위해서 파이프로 치환 :  sed  's/[**]/|/g' (백슬래시 추가:Escape)  

- 파이프를 제거  awk  -F"|"

- $2에서 Response를 골라내고 

- &&는 AND의 의미

- $4에서 A를 골라냄

- $3이 도메인이고, $6이 IP주소이므로 화면에 출력

 


 

1번) 192.168.1.0/24(내부망)에서 Web Server에 접속한 로그를 골라서 web.log에 저장

# ra -nzr 1_merged_total.arg - "src net 192.168.1.0/24 and dst port (443 or 80) and tcp" > web.log

# less  web.log                        // PgUp or PgDn

 

 

2번) 1번결과가 너무 많이 나오므로 중복을 제거하고 다시 저장

# ra -nzr 1_merged_total.arg - "src net 192.168.1.0/24 and dst port (443 or 80) and tcp"  | uniq -c  > web.log

 

 

cf.  uniq -c와 sort -u의 차이점은?

  uniq -c  :  중복을 제거하고 왼쪽에 개수를 표시

  sort  -u  :  중복만 제거

 

 

4-1) 업로드가 많다는 것은 데이터를 외부로 유출했을 것으로 보고 가장 많은 데이터를 외부로 보낸 사용자를 찾아내려고함

# ra -nzr 1_merged_total.arg -s sbytes, saddr - "tcp" | sort -rn | head -10

 

{"originWidth":743,"originHeight":553,"style":"alignCenter","caption":"# ra -nzr 1_merged_total.arg -s sbytes, saddr - \"tcp\"

 

 

sort 는  정렬하라는 의미  ----> 같은 것끼리 묶음

sort  -n  :  오름차순

sort  -rn  :  내림차순 (r : reverse, 역순)

 

 

5번) 업로드의 양을 IP별로 합산해서 상위 10개를 출력하도록 함

# ra -nzr 1_merged_total.arg -s saddr,sbytes - "tcp" | sort -k 1,1 | awk 'ip==$1{sum=sum+$2;next}{print sum, ip; ip=$1; sum=$2}' | sort -rn | head

 

 

8번) 목적지IP주소가 사설IP를 제외하려고 함

    사설IP만 골라내려면 :      /^192.168.|^172.16.|^10./               //  ^은 ~~로 시작하는 의미

    사설IP가 아닌것을 골라서 보려면:     !~/^192.168.|^172.16.|^10./

    tcp_connection에서 세번째 컬럼이 목적지IP주소임:   $3

    $3에서 사설IP가 아닌것을 고르려면:  $3!~/^192.168.|^172.16.|^10./

    특수문자에 Escape처리해주어야 함:  $3!~/^192\.168\.|^172\.16\.|^10\./