공부/시스템,네트워크 보안

9월 22일 시스템/네트워크 보안 6

마준123 2022. 9. 22. 17:30

복습!

 

 * 취약점 분석 단계

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가 범인(?) 이었다.