처음 만나는 클라우드 보안

Argus로그를 이용한 침해사고분석 본문

정보보안

Argus로그를 이용한 침해사고분석

영민하게 2022. 5. 18. 23:52
반응형

 

이번 포스팅에선 Argus에 대해 알아보고 관련 로그를 통해 감염된 PC를 찾아본다.

 

Argus란?

: 대표적인 오픈소스 IDS 중 하나로서 네트워크 보안 모니터링 도구 및 세션 기반 데이터 로깅에 사용된다.

세팅: Argus IDS의 본체는 네트워크 중간에 배치, Argus 콘솔은 사무실에 배치 => Argus IDS Client 설치


1. Argus로그 분석 기초

ra (read argus data)를 이용한 데이터 읽기 => 누가 공격자인지 알아내기 위함

$ ra -r file1 file2

$ ra -r s file1

원본 Argus로그 파일일은 위와 같이 바이너리로 작성되어 'ra' 명령문을 통해 분석한다.

-s(옵션) 주요 필드명

  • stime: 시작시간
  • ltime: 종료시간
  • sbytes: src ->dst (아웃바운드;유출)
  • dbytes: dst ->src (인바운드;유입)
  • saddr: 출발지 IP
  • dport: 목적지 Port
  • daddr: 목적지 IP
  • dport: 목적지 Port

ra -nzr 형태로 자주쓰인다. (-n: 알려진 포트도 숫자로 표현, z: 상세 내용 보기)

ra -nzr 1_merged_total.arg -s saddr,sport,daddr,dport  // 아래 출력 값

 


BPF (Berkeley Packet Filter)

: 버클리 대학에서 만든 자연어 기반 패킷 필터, 인간의 언어 순서와 매우 유사한 입력이 가능하다.

BPF필터를 이용한 분석

DNS로그 분석 기본

- DNS (Domain name service)란?

Domain Name을 입력하면 IP주소를 알려주는 것

역방향 조회: IP주소를 입력하면 Domain Name을 알려준다.

 

- DNS Record

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

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

PTR (Pointer): 역방향 조회 ex) nslookup의 ns -> name server

 

- DNS로그 열람 예시

 

구분자 : [**]

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

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

# tail -10 2_dns.log

 

위 결과 중 Response이면서, A(정방향 조회)인 결과 : 도메인은 세 번째 칼럼, IP주소는 여섯 번째에 위치해있다.

 

- DNS 로그 추출

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

 // 구분자 | 로 만든 후, | 제거 예정 (바로 null값으로 치환은 불가함)

 

# 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를 골라냄

두번째 컬럼이 Response이고, A로 표시, 3번째, 6번째만 골라서 추출


2. Argus IDS 로그분석

해킹당한 내부 서버의 Argus 로그 데이터를 분석하여 감염된 PC를 찾는다.

(서버 구상도) Argus 로그데이터를 통해 내부의 감염된 PC를 찾아낼 수 있다.

 

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

 

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

 

3)  tcp포트로 출발하는 IP통계 확인

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

 

4)  3번 결과에서 상휘 10개의 목적지 IP통계 구하기

ra -nzr 1_merged_total.arg -s daddr - "tcp" | sort |uniq -c | sort -rn | head -10

 

  4-1) TCP 업로드가 가장 많은 상위 10개의 출발지 IP

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

외부로 가장 많은 데이터를 유출했을 것으로 보는 내부 사용자 확인

 

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   (sort -k 1,1?) 

 

6) tcp 통신하는 출발지 IP, 목적지 IP, 목적지 PORT 추출

ra -nzr 1_merged_total.arg -s saddr, dport, daddr - "tcp" | sort | uniq -c | sort -rn | awk '{print $1 "\t" $2 "\t" $ "\t" $3}' | head

\t : 일정한 간격을 위한 탭

 

7) 2_dns.log파일에서 구분자([**])를 파이프'|'로 치환하고 $2에서 Response로 시작하며 $가 A인 것들을 골라 $3만 $6만 추출하여 dns.lookup으로 저장

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

 

8) tcp_connection파일에서 내부망(172.16.0.0/16, 192.168.0.0/16, 10.0.0./8) 대역(목적지 IP)으로 이동하는 트래픽을 제외한  Top 30 통신 트래픽 생성, dns.lookup파일과 매칭 하여 목적지 IP에 대한 도메인을 구하시오.

 

 추가 설명

> 내부망(172.16.0.0/16, 192.168.0.0/16, 10.0.0./8): !~/^192.168.|^172.16.|^10./

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

> 목적지IP주소 중 사설 IP주소가 아닌 것: $3~/^192.168.|^172.16.|^10./

> 특수문자  escape처리: $3~/^192\.168\.|^172\.16\.|^10\./

 

$3~/ OOO/ : 3번째 칼럼이 OOO을 포함하는 것부터

 

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

 

  8-1) top30의 목적지 주소에 대한 도메인 주소를 dns.lookup에서 찾아서 dns_matched로 저장

#cat top30 | while read line (리눅스 프로그래밍의 While문)

> do

> dip=$(echo $line | awk '{print $2}')    //두번째 컬럼은 dip로 저장

> domain=$(cat dns.lookup | awk -v ip=$dip '$2==ip {print $1}' | head -1)   // head-1 사이 스페이스 꼭 넣기!

> echo $line $domain

> done > dns_matched

 

인도 도메인 blinq.in 확인

 

9)  의심 도메인 (blingq.in)과 통신한 IP 확인

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

해킹 피해 PC는 192.168.1.71 그리고 192.168.1.72로 확인되었다.

 


 

참고) SSH 트래픽을 많이 사용한 로그 확인하기. 시간(stime), 출발 IP(saddr), 목적지 IP(daddr), 목적지 Port(dport) 순으로 출력

ra -nzr 1_merged_total.arg -s saddr, stime, sport, daddr, stime, dport - "port 22" | awk '{print $1, $3, $4, $6}' | sort -rn | head -30

 

반응형
Comments