본문 바로가기

Rookies 9기/시스템 네트워크보안

시스템/네트워크 보안 6일차

728x90

 복습

•취약점 분석 단계

1) 기본 스캔

2) 조사(검색)

3) 상세 스캔

4) Exploit

 

•취약점 분석도구

- 1,3단계 기능을 SW에 내장하고 2단계 지식은 본사 DB에 저장되어 있는 취약점(=지식) 확인해서 리포트로 만들어 줌

- 버전 확인&약간의 테스트(스크립트) 기능 

- 기본 스캔은 Nmap Source Code를 사용하기도 한다(Nmap은 Open Source이므로 참조하면 내가 만든 것도 Open Source가 됨 : GPL라이센스)

- 지식은 재산이기 때문에 돈 받고 팔 수 있음

실습( Ubuntu_DVWA & Metasploitabl2 )

- DVWA에 여러 가지 웹 해킹 실습을 했다 --> 로그에 남아있다.
- 어디에 그런 내용이 있을까?

var/log

대부분의 모든 로그는 /var/log 안에 있다.

auth.log //시스템에 로그인 성공/실패에 대한 기록을 남기는 로그  ex) Dictionary, Brute Force Attack을 하면 기록
syslog  // 시스템에 대한 특이점이 있으면 남기는 로그
cat auth.log  // 모든 내용을 터미널 상태에서 다 보게 됨 --> cat은 사용하지 않는 것을 권장 -> less 사용

 

head auth.log

head auth.log // 맨 위에서부터 10줄 보임 ---> Old log

head -20 syslog // syslog를 위에서부터 20줄 보려고 할 때

tail auth.log

tail auth.log  // 맨 아래에서부터 10줄 보임  --> New log

tail -20 syslog // syslog를 아래에서부터 20줄 보려고 할 때

• 로그 : 6하 원칙 중 5개 있다. (누가, 언제, 어디서, 무엇을, 어떻게)
- 로그의 순서 : 월 일 시 

‣ 로그의 일부만 보고 싶을 땐?
---> 골라내기를 하는 명령을 사용 : grep [키워드], awk 문을 사용해보기

 

syslog의 첫번째 컬럼($1), 두번째 컬럼($2), 세번째 컬럼($3)만 보려면?

awk 사용

tail syslog | awk '{print $1,$2,$3}'은 월, 일, 시 출력된다.

 

누가($5), 무엇을 했나($10,$11)만 골라서 보려면?

awk 사용

cat syslog | awk '{print $5,$10,$11}'에서 awk를 사용을 하면 원하는 것만 골라서 볼 수 있다.

 

아파치로그 ( 웹서버 로그 )

access.log

백업된 파일을 확인해야 한다. (access.log.1)

access.log => 누가 접근헀나?
error.log => 무엇이 문제였나?

 

어느 페이지가 접근이 많았을까요?

$11가 의미하는 건 192.168.5.1 - - [15/Sep/2022:16:46:05 +0900] "GET /dvwa/dvwa/css/login.css HTTP/1.1" 200 741 "http://192.168.5.128/dvwa/login.php" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"에서 구분자(공백) 기준으로 11번째에 있기 때문에 $11을 사용한다.

sort : 정렬
uniq -c : 중복제거 & 앞에 개수 표시
sort -rn : 내림차순으로 정렬
sort -n : 오름차순

 

본격적으로 공격했던 로그를 분석하기( 가장 큰 파일 : access.log.3.gz)
• access.log.3.gz 파일을 사용하기위한 과정
$ 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.3  | awk '{print $11}' | sort | uniq -c | sort -rn으로 보면 너무 많은 로그가 출력이 된다.

sudo  cat access.log.3  | awk '{print $11}' | sort | uniq -c | sort -rn | head  -20 헤드를 사용해  많이 사용한 20개만 출력을 한다.

• awk문의 특징
- 공백을 기준으로 컬럼으로 인식해서 $1, $2, $3 ... -> 원하는것만 출력해서 볼수 있다.

• 리눅스 환경에서 로그 분석

- 많은 오픈 소스

- 로그분석에 필요한 CLI 환경

- 파이프라인을 통한 분석 툴의 유기적 조합 가능

- 쉘 스크립트를 통한 자동화된 분석 가능

- 대용량 로그 분석 가능 

  ‣ 윈도우에서 10G 로그 분석 불가능

  ‣ 리눅스에서는 10G 로그 분석 가능

- 다수의 파일에 반복적 작업이 가능

 

• 정규표현식(PCRE : Perl Compatible Regular Expression)

- 숫자나 문자의 패턴을 인식하기 위해서 사용하는 표현방식

- 패턴에 해당하는 숫자나 문자를 골라내기 위해서 사용

• 정규표현식 - 메타 문자
 ^  -> ‘^abc’                               // 문자열의 가장 첫 문자열이 ‘abc’인 패턴
$ ->  ‘abc$’                                // 문자열의 마지막 문자열이 ‘abc’로 끝나는 패턴
[ ] -> ‘[a-zA-Z0-9]’                    // 영문 대소문자 및 숫자를 의미
[ ^ ]  ->  ‘[^0-9]’                       // 숫자 아닌 아무 문자 패턴
 . -> ‘a.. d’                                 // a와 d 사이의 아무 2개 문자가 오는 패턴(점의 개수는 문자의 개수)
* -> ‘a*’                                    // a문자의 0번 이상 반복 반복
• Escape : 특수문자가 기능을 하지 못하게 함(특수문자 앞에 \ 를 붙임)
\{n, m\} ->A\{4, 8\} B       // A가 4번 이상, 8번 이하로 반복되며, 이후에 B가 오는 패턴

※ 예시

휴대폰 번호 010-nnnn-nnnn(n은 숫자) --> /^\d{3}-\d{3,4}-\d{4}$/

[ ] : 대괄호, 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}

처음이 127.0.0.1로 시작하지 않는 로그만 골라서 보려면

cat access.log | grep -v "127\.0\.0\.1"  ----->  .(dot)이 IP주소의 구분자 역할일 뿐, 기능을 해서는 안되기 때문에 \를 붙여야 함

 

알파벳 순서로 재 정렬 하려면?

awk 사용

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

 

• 반복문

반복문 예제
반복문 예제

> (gt : greater than ~ 보다 큰)

>를 사용하면, 파일이 없으면 만들어서 저장, 파일이 있으면 덮어쓰기가 된다(주의!!)

>>를 사용하면, 기존에 파일 뒤에 내용이 추가된다.

 

멤버들을 알파벳 순으로 정렬하시오
- Momo, Dahyun, Sana, Mina

반복문 예제

$ cat twice.txt | sort -n                   // n : 오름차순

$ cat twice.txt | sort | sort -rn        // rn 은 내림차순

 

/var/log/syslog  5번째 컬럼이 데몬인데 뒤에 [     ]이 붙어 있음,  이 [   ]을 제거하고 중복제거해서 내림차순 정리해보기

cat  /var/log/syslog | awk '{print $5}'  awk -F"["  '{print $1}'  |  sort  |  uniq -c  |  sort  -rn

awk '{print $5}'에서 5번째 컬럼을 가져오면 그 컬럼은 1번째 컴럼이기 때문에 awk -F"["  '{print $1}'에서는 1번째 컬럼이라고 지정을 해야 한다.

 

 로그 분석 (Argus IDS)

• bpf (Berkeley Packet Filter) 

- awk 대신 사용하는 필터 도구

- 사람이 사용하는 언어와 매우 유사 (영어권 국가의 모국어가 영어이면 따로 배우지 않아도 될 정도)

실습 다운로드
- Ubuntu_DVWA에서 실습파일 다운로드
-Firefox를 켜고 카페에들어가 파일 3개를 다운로드 한다.( Windows에서 다운하는게 아님)

- sudo apt install p7zip  // 7zip 파일 압축을 풀기 위해 p7zip 설치
- 7zr x log.7z   // 압축풀기(x) , 압축하기(a)

※ 확장자가 arg라고 되어 있는 파일이 있는데 Argus IDS에서 생성된 로그이다. ---> 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       
$ sudo  apt  install  flex  bison  byacc

$ sudo  su                                      // 같은 디렉토리에서 root권한으로 전환됨
    (PW : ubuntu )
# ./configure
# make && make install
# ra  --help                                    // 도움말이 나오면 성공적으로 설치됨

ra -nzr 사용

• sed 문

- 치환할 때 사용 => sed 's/old/new/g'

- .sample로 끝나는 텍스트 모두 제가 하려면  => sed 's/\. smaple//g'

- bitcoin을 ethereum으로 바꾸려면? => sed 's/bitcoin/ethereum/g'

 

• DSN (Domain Name System)

- 도메인 이름에 해당하는 IPv4주소를 알려주는 것: 정방향 조회 (A)

- 도메인이름에 해당하는 IPv6 주소를 알려주는 것 : 정방향 조회 (AAAA 또는 A6)

- IP주소에 해당하는 도메인 이름을 알려주는 것 : 역방향 조희 (PTR : Pointer)

- Query : Web Brower가 DNS에게 도메인 이름에 해당하는 IPv4/IPv6를 물어보는 것

- Response : DNS가 Web Browser에게 IPv4/IPv6를 알려주는 것 (악성코드가 C&C의 URL을 DNS에게 물어볼 것임)

 

[**]를 sed문으로 제거하고, awk문으로 $5, $5을 추출해서 내림차순으로 정렬하려면?

tail -20 2_dns.log

2_dns.log을 보면  구분자가 [**]로 되어있다 이제 이 부분을 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
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 이다.
우리는 도메인네임 과 IP주소가 필요하기 떄문에 $5 하고 $9가 필요하다(공백으로 구분을 한다)

 

cat 2_dns.log  |  sed  's/\[\*\*\]//g'  |  awk '{print $5,$9}'  |  sort  |  uniq -c |  sort -rn을 사용하면 수많은 로그들을 볼 수 있다.

 

Response로 되어 있는 것만 추출하려면?

cat  2_dns.log | sed 's/\[\*\*\]//g' |awk '$2~/Response/ && $6~"A" {print $5,$9}' |sort | uniq -c |sort -rn| head -20 > dns_search 명령어는 Response로 시작하는 것 중에 $5와 $9를 출력한다.

$2~/Response/ : $2에 Response를 포함하고 있는 것만 고른다.

&& : and 조건

$6~"A" : $6에 IPv4 주소(정방향 조회)를 포함하고 있는 것만 고른다.

 

출발지가 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

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으로도 사용이 가능하다. 

 

tcp 포트로 출발하는 IP 통계를 구하시오
- 인터넷 연결이 많은 사용자는 누구였을까?

ra -nzr 1_merged_total.arg -s saddr - "tcp" | sort | uniq -c | sort –rn 

saddr은 출발 IP이다.

 

TCP 연결 하는 출발지IP, 목적지IP, 목적지Port를 추출해서 중복제거하고 내림차순 정렬하고 결과를 tcp_coonection으로 저장하기

ra -nzr 1_merged_total.arg -s saddr, daddr, stime, dport - "tcp" | awk '{print $1,$2,$4}'  |  sort | uniq -c | sort -rn > tcp_connection에서 stime을 넣었다 제거하는 이유는 daddr과 dport가 합쳐져서 172.16.2.211.80으로 되기 때문이다.

tcp_connection

tcp_connection에서 사설IP를 제외한 상위 30개만 따로 저장하려면?

• 사설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}'

cat  tcp_connection  |  awk '$3!~/^192\.168\.|^172\.16\.|^10\./  {print $2,$3,$4}'  | head -30  >  top 30이다.

top30

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

dns.log에서 sed로 [**] 구분자를 없애고 Response, A를 포함하고 있는 도매임 네임과 IP주소를 dns.lookup파일로 만들어준다.

dns_lookup 파일

top30에 있는 목적지 주소를 dns.lookup을 참조해서 도메인 이름과 매칭을 시켜서 dns_matched로 저장하시오

top 30의 IP와 dns.lookup의 IP가 같아야 한다.

• While 문을 사용
#  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

dns_matched

도메인 중에 이상한 도메인이 있는 걸 확인할 수 있다.

범인은 누구일까요? => blinq.in을 방문한 사용자 또는 악성코드 PC : 192.168.1.71

 

회사 내부에 또다른 사용자가 blinq.in을 방문했는지 확인

192.168.1.71 하고 192.168.1.72 아이피 주소가 blinq.in사이트에 방문을 하였다.

ra  -nzr  1_merged_total.arg   -s saddr, daddr  - "dst host 188.53.211.186" | awk '{print $1}' | sort -u