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)들로 분류
* 암호화폐로 보상을 해주는 블로그
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

- 누구의 권한으로 실행되었는지 확인
$ 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

- 어떤 명령이 가장 많이 사용되었는지 그리고 몇 번 사용되었는지?
$ 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

- 어떤 페이지를 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도 없다고 하면 마찬가지로 설치

# apt install make
# make && make install
# cd .. (또는 # cd /home/계정/Downloads)
# ra --help
# 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인 패킷만 골라서보기

* 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

- 구분자 : [**]
- 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

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\./