복습!
* 취약점 분석 단계
1 ) 기본스캔
2 ) 조사 : 검색
3 ) 상세 스캔
4 ) Exploit
* 취약점 분석 도구도
= 1,3단계 기능을 SW에 내장하고 2단계 지식은 본사 DB에 저장되어 있는 취약점을 확인해서 리포트 만들어줌
= 버전 확인 & 약간의 테스트 ( 스크립트 ) 기능
= 기본 스캔은 Nmap Source Code를 사용하기도 함 ( Nmap은 Open Source이므로 참조하면 내가 만든 것도 Open Source가 됨 )
= 지식은 재산이기 때문에 돈받고 팔 수 있음
실습 ) Ubuntu_DVWA & Metaploitable2
= DVWA 에 여러가지 웹해킹 실습을 했음
= 어디에 그런 내용이 있을까?
$ cd /var/log
$ ls -l
auth.log // 시스템에 로그인 성공/실패에 대한 기록을 남기는 로그 ex) Dictionary, Brute Force Attack 을 하면 기록
syslog // 시스템에 대한 특이점이 있으면 남기는 로그
cat auth.log // cat으로 읽으면 내용이 너무 많아서 터미널로 읽으면 힘들 수 있음
head auth.log // head 로 읽으면 내용의 앞부분만 10줄 보여줌
tail auth.log // tail로 읽으면 내용의 뒷부분만 10줄 보여줌
head -20 auth.log // 앞부분만 20줄 보여줌
tail -20 auth.log // 뒷부분만 20줄 보여줌
* 로그 : 6하원칙 중 5개만 있음 ( 누가, 언제, 어디서, 무엇을, 어떻게 ) // 왜는 없음!
* 로그가 다 보고 싶지 않고 일부만 보고싶다?
----> 골라내기를 하는 명령을 사용 : greb [키워드] , awk 문
$ tail syslog | awk '{print $1,$2,$3}' // 앞에서 1,2,3 개의 컬럼만 보겠다는 의미
$ cat syslog | awk '{print $5,$10,$11}' // 전체를 다 보면서 5,10,11번째 컬럼만 보겠다는 의미, 누가($5),무엇을($10,$11)
* 아파치로그 ( 웹서버로그 )
$ cd /var/log/apache2
access.log ---> 누가 접근 했나?
error.log -----> 무엇이 문제였나?
$ tail access.log.1
192.168.5.1 - - [15/Sep/2022:17:26:00 +0900] "GET /favicon.ico HTTP/1.1" 404 492 "- "Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0) like Gecko"
실습 ) 어느 페이지가 공격을 많이 당했나.
$ sudo cat /var/log/apache2/access.log.1 | awk '{print $12}' | sort | uniq -c | sort -n
sort : 정렬
uniq -c : 중복제거 & 앞에 개수를 표시
sort -n : 오름차순으로 정렬
sort -rn : 내림차순으로 정렬
실습 ) 본격적으로 공격했던 로그를 분석하기 ( 가장 큰 파일 : access.log
$ mkdir /home/j/log
$ sudo cp access.log.3.gz /home/j/log
$ cd /home/j/log
$ sudo gzip -d access.log.3.gz
$ sudo cat access.log.2 | awk '{print $11}' | sort | uniq -c | sort -rn | head -20
* 리눅스 환경에서 로그 분석 하는 이유
= 많은 오픈 소스 ( 무료 )
= 로그 분석에 필요한 CLI 환경
= 파이프라인을 통한 분석 툴의 유기적 조합 가능
= 쉘 스크립트를 통한 자동화된 분석 가능
= 대용량 로그 분석 가능
= 윈도우에서 10G 로그 분석 불가능
= 리눅스에서는 10G 로그 분석 가능
= 다수의 파일에 반복적 작업이 가능
* 정규표현식이 뭘까 ? ( PCRE : Perl Compatible Regular Expression )
= 숫자나 문자의 패턴을 인식하기 위해서 사용하는 표현방식
= 패턴에 해당하는 숫자나 문자를 골라내기 위해서 사용
예) 휴대폰번호 : 010-nnnn-nnnn (n은 숫자)
/^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/ ex) 010-1234-5678, 019-111-2222
/^\d{3}-\d{3,4}-\d{4}$/
^ : caret (캐럿) ----> 맨 앞 시작 ex) ^010 : 010으로 시작하는 것
[ ] : 대괄호, Braket
ex) 소문자만 사용하려면 [a-z]
ex) 대문자만 사용하려면 [A-Z]
ex) 숫자만 사용하려면 [0-9]
ex) 소문자,대문자,숫자만 사용하려면 [a-zA-Z0-9]
[^ ] : ~~가 아닌것
ex) 대문자가 아닌것 [^A-Z]
ex) 숫자가 아닌것 [^0-9]
. : 아무 문자나 와도 됨
ex) .... : 아무 문자나 4개 와도 됨 (점의 개수는 문자의 개수)
* : Asterisk (아스테리스크),
문자의 반복을 표현할 때 : { } (중괄호, Brace)
a를 3번 반복하면? a{3}
Nike를 5번 반복하면? Nike{5}
adidas를 3번에서 4번까지 반복하려면? adidas{3,4}
0부터 9까지 숫자를 4번 반복하려면? [0-9]{4}
전화번호 패턴을 만들 수 있음 : 010-[0-9]{4}-[0-9]{4}
* Escape : 특수문자가 기능을 하지 못하게 함 (특수문자 앞에 \를 붙임)
A{4,8}B ---> A\{4,8\}B
작성할 때, 먼저 식을 만들고 마지막에 \를 붙이는 방법이 편리함
예제) 처음이 127.0.0.1로 시작하지 않는 로그만 골라서 보려면
cat access.log | grep -v "127\.0\.0\.1" -----> .(dot)이 IP주소의 구분자 역할일 뿐, 기능을 해서는 안되기 때문에 \를 붙여야 함
* 알파벳 순서로 재 정렬 하려면?
$ echo "Momo Dahyun Sana Mina" | awk '{print $2,$4,$1,$3}'
* 일본인 멤버만 알파벳 순서로 하려면?
$ echo "Momo Dahyun Sana Mina" | awk '{print $4,$1,$3}'
* IP주소만 골라서 보거나, Port번호만 골라서 보려고 할 때
> (gt : greater than ~보다 큰)
>를 사용하면, 파일이 없으면 만들어서 저장, 파일이 있으면 덮어쓰기가 됨 (주의!!)
>>를 사용하면, 기존에 파일 뒤에 내용이 추가됨
$ for t in Momo Dahyun Sana Mina; do echo $t; done > twice.txt
----------------------------------------------------------------------------------------------------------------------
실습 ) 멤버들을 알파벳 순으로 정렬하시오
$ cd /home/j/log
$ cat twice.txt | sort
$ cat twice.txt | sort -n ( -n : 오름차순, -rn : 내림차순 )
$ cat twice.txt | sort | sort -n
* 일정부분 생략하기
sudo[1324]
sudo[1455]
-----> 서로 다른 프로세스가 요청한 sudo 명령임
그런데, sudo 명령을 몇번 사용했는지를 보려면 [이하를 생략해야 함 ----> sudo가 2번 나옴
awk -F"[" '{print $1}'
----> sudo
/var/log/syslog 5번째 컬럼이 데몬인데 뒤에 [ ]이 붙어있음, 이 [ ]를 제거하고 중복제거해서 내림차순 정리해보기
$ sudo cat /var/log/syslog | awk '{print $5}' | awk -F"[" '{print $1}' | sort | uniq -c | sort -rn
---------------------------------------------------------------------------------------------------------------------------------------------------------------
* BPF (Berkeley Packet Filter)
= 사람이 사용하는 언어와 매우 유사 (영어권 국가의 모국어가 영어이면 따로 배우지 않아도 될 정도)
실습) Ubuntu_DVWA에서 실습파일 다운로드
= Firefox를 켜고
https://cafe.naver.com/rookies9/76 에서 파일 세개를 다운로드 합니다. (Windows에서 하는 거 아님)
(다운로드가 다 되면, Firefox는 닫습니다)
$ cd ~
$ ls
(다운로드를 블럭설정하고 복사한 다음)
$ cd 다운로드 // 오른쪽 마우스 눌러서 붙여넣기
$ sudo apt install p7zip // 7zip 파일 압축을 풀기 위해 p7zip 설치
$ 7zr x log.7z // 압축풀기(x), 참고로 압축하기는 a
* 확장자가 arg라고 되어 있는 파일이 있는데, Argus IDS에서 생성된 로그임 ----> arg는 Binary로 되어 있음 (용량을 줄이려고)
----> arg파일을 보기 위해서는 Argus IDS의 클라이언트 도구를 설치해야 함 (Argus IDS Server는 네트워크에서 모니터링을 함)
실습) Argus IDS Client 설치
$ tar zxvf argus-clients-3.0.8.tar.gz
$ cd argus-clients-3.0.8/
$ sudo apt update
$ sudo apt install gcc // gcc는 컴파일을 하기 위한 도구 (소스코드를 컴파일 가능)
$ sudo apt install flex bison byacc
$ ./configure
$ sudo apt install make
$ sudo make && make install
$ sudo su // 같은 디렉토리에서 root권한으로 전환됨
(PW : ubuntu )
# ./configure
# make && make install
# ra --help // 도움말이 나오면 성공적으로 설치됨
# ra -nzr [파일명] // n : number(숫자), z : 상세, r : read file
# cd ..
# ra -nzr 1_merged_total.arg | head -10
-----------------------------------------------------------------------------------------------------------------------------------------------------
* sed문 : 치활할 때 사용
sed 's/old텍스트/new텍스트/g'
.sample 을 모두 삭제하려면?
ex ) sed 's/.sample//g' //new 파일 자리가 비워져 있으므로 삭제
ex ) bitcoin을 ethereum으로 바꾸려면?
sed 's/bitcoin/ethereum/g'
* DNS ( Domain name System )
= 도메인 이름에 해당하는 IPv4주소를 알려주는 것 : 정방향 조회 ( A )
= 도메인 이름에 해당하는 IPv6주소를 알려주는 것 : 정방향 조회 ( AAAA 또는 A6 )
= IP주소에 해당하는 도메인 이름을 알려주는 것 : 역방향 조회 ( PTR : pointer )
= Query : 도메인 이름에 해당하는 IPv4/IPv6를 물어보는 것
= Response : DNS가 Web Browser에게 IPv4/IPv6를 알려주는 것 ( 악성코드가 C&C의 URL을 DNS에게 물어볼 것임 )
#tail -20 2_dns.log
----> DNS로그의 특징 : 구분자를 [**] 사용중 ----> 제거??? \[\*\*\]
03/25/2013-21:23:10.029321 [**] Response TX 4c26 [**] shopping.phinf.naver.net.static.gscdn.net [**] A [**] TTL 34 [**] 121.156.109.46 [**] 77.47.128.224:53 -> 192.168.1.196:19513
sed로 [**]를 제거하고 나면
03/25/2013-21:23:10.029321 Response TX 4c26 shopping.phinf.naver.net.static.gscdn.net A TTL 34 121.156.109.46 77.47.128.224:53 -> 192.168.1.196:19513
------> $5(도메인네임)과 $9(IP주소)이 필요함!!!
실습) [**]를 sed문으로 제거하고, awk문으로 $5, $9을 추출해서 내림차순으로 정렬하려면?
# cat 2_dns.log | sed 's/\[\*\*\]//g' | awk '{print $5,$9}' | sort | uniq -c | sort -rn
* Response로 되어 있는 것만 추출하려면?
awk '$2~/Response/ {print $5, $9}' // Response로 시작하는 것 중에서 $5와 $9을 골라서 보기
# cat 2_dns.log | sed 's/\[\*\*\]//g' | awk '$2~/Response/ {print $5, $9}' | sort | uniq -c | sort -rn
$2~/Response/ : $2에 Response를 포함하고 있는 것만 골라서...
# cat 2_dns.log | sed 's/\[\*\*\]//g' | awk '$2~/Response/ && $6~"A" {print $5, $9}' | sort | uniq -c | sort -rn
&&는 and 조건, $5는 도메인, $9은 IP주소
# cat 2_dns.log | sed 's/\[\*\*\]//g' | awk '$2~/Response/ && $6~"A" {print $5, $9}' | sort | uniq -c | sort -rn | head -20 > dns_search
(리눅스에서는 확장자가 없어도 잘 인식함 : File Signature로 인식)
----> dns_search로 저장하기
----------------------------------------------------------------------------------------------------------------------------------------
문제1. 출발지가 192.168.1.0/24이고 외부의 웹서비스(443 or 80)에 접속한 로그만 골라서 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
(다 봤으면 q 누르면 종료됨)
# ra -nzr 1_merged_total.arg -s saddr,daddr,dport - "src net 192.168.1.0/24 and dst port (443 or 80) and tcp" | sort | uniq -c | sort -rn > web.log
-----> 172.16으로 시작하는 주소는 Server Room에 있는 서버들임
# less web.log // IP에 대한 URL은 dns_search에서 찾을 수 있음
q (종료)
문제3. tcp 포트로 출발하는 IP 통계를 구하시오.
----> 인터넷 연결이 많은 사용자 (Internet Heavy User)는 누구였나?
# ra -nzr 1_merged_total.arg -s saddr - "tcp" | sort | uniq -c | sort –rn
문제6) TCP 연결 하는 출발지IP, 목적지IP, 목적지Port를 추출해서 중복제거하고 내림차순 정렬하기
# ra -nzr 1_merged_total.arg -s saddr,daddr,dport - "tcp" | sort | uniq -c | sort -rn // IP와 Port번호가 붙어있음
# ra -nzr 1_merged_total.arg -s saddr,daddr,stime,dport - "tcp" | awk '{print $1,$2,$4}' | sort | uniq -c | sort -rn // stime을 넣었다가 제거
-----> 결과를 tcp_connection으로 저장하세요.
# ra -nzr 1_merged_total.arg -s saddr,daddr,stime,dport - "tcp" | awk '{print $1,$2,$4}' | sort | uniq -c | sort -rn > tcp_connection
* 사설IP주소를 제외하려면?
- 사설IP : 192.168.x.x 172.16.x.x 10.x.x.x
- 사설IP만 골라서 보려면? /^192.168.|^172.16.|^10./ ^~~은 ~~으로 시작하는 것
- 사설IP가 아닌것만 보려면? !~/^192.168.|^172.16.|^10./
- tcp_connection에서 목적지IP($3)가 사설IP가 아닌것만 보려면? $3!~/^192.168.|^172.16.|^10./
- $2, $3, $4만 보면됨($1은 개수) : awk '$3!~/^192.168.|^172.16.|^10./ {print $2,$3,$4}'
- 특수문자 중에 .(dot)은 Escape처리해야 함 : awk '$3!~/^192\.168\.|^172\.16\.|^10\./ {print $2,$3,$4}'
* tcp_connection에서 사설IP를 제외한 상위 30개만 따로 저장하려면?
# cat tcp_connection | awk '$3!~/^192\.168\.|^172\.16\.|^10\./ {print $2,$3,$4}' | head -30 > top30
# less top30
# cat 2_dns.log | sed 's/\[\*\*\]/|/g' | awk -F"|" '$2~/Response/ && $4~"A" {print $3,$6}' | sort -u > dns.lookup
* top30에 있는 목적지 주소를 dns.lookup을 참조해서 도메인 이름과 매칭을 시켜서 dns_matched로 저장하시오.
# cat top30 | while read line
> do
> dip=$(echo $line | awk '{print $2}')
> domain=$(cat dns.lookup | awk -v ip=$dip '$2==ip {print $1}' | head -1) // top30의 IP와 dns.lookup의 IP가 같다면
> echo $line $domain
> done > dns_matched
# less dns_matched
-----> 범인은 누구일까요? blinq.in을 방문한 사용자 또는 악성코드 PC : 192.168.1.71
* 회사 내부에 또다른 사용자가 blinq.in을 방문했는지 확인
# ra -nzr 1_merged_total.arg -s saddr,daddr - "dst host 188.53.211.186" | awk '{print $1}' | sort -u
71과 72가 범인(?) 이었다.
'공부 > 시스템,네트워크 보안' 카테고리의 다른 글
9월 23일 시스템/네트워크 보안 7 (0) | 2022.09.23 |
---|---|
9월 21일 시스템/네트워크 보안 5 (0) | 2022.09.21 |
9월 20일 시스템/네트워크 보안 4 (0) | 2022.09.20 |
9월 19일 시스템/네트워크 보안 3 (0) | 2022.09.19 |
9월 16일 시스템/네트워크 보안 2 (0) | 2022.09.16 |