ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ubuntu - Argus-clients, Shell Script - 우분투 Argus-client, 쉘 스크립트
    Security 2022. 5. 18. 17:54

    Ubuntu

    Argus-clients 설치

    IDS의 대표적인 오픈 소스 : Snort, Suricata, Argus IDS

    Argus IDS의 본체는 네트워크 중간에 배치, Argus의 사용자 콘솔은 사무실에 설치

    실습해보겠습니다.

    wget http://qosient.com/argus/src/argus-clients-3.0.8.tar.gz

    sudo apt install flex

    sudo apt install bison

    cd Downloads
    sudo -i#root 권한으로 전환
    cd /home/h/Downloads#여기서 두 번째의 h는 계정입니다. 보시는 분은 계정 이름을 넣어주시면 됩니다.
    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

     

     

    Argus (IDS) Log 분석

    : 로그 분석을 통한 침해사고 분석, 호스트 행위 분석, 타겟 공격의 흐름 이해/지점 확인

    분석 도구 - Argus (IDS) : 네트워크 보안 모니터링 도구, 세션기반 데이터 로깅- Suricata (IPS) : 오픈소스 IPS, 시그니처 기반 탐지(Snort 유사), DNS 로그 활용

     

    ra (read argus data)를 이용한 데이터 읽기

    ra --help#관련 도움말

    cd ..#home/계정명/Downloads에서 진행

    ra -nzr 1_merged_total.arg -s saddr,sport,daddr,dport#아주 많이 나옴

    상당히 많이 나옵니다.

     

    * BPF Filter 적용 *

     

    : BPF (Berkeley Packet Filter) : 자연어(인간의 언어) 기반의 필터이며 awk 대신 사용하는 필터 도구입니다.

    ra -nzr 1_merged_total.arg - "src host 192.168.1.122 and udp"#출발지 IP Address가 192.168.1.122이고 UDP인 패킷만 골라서 보기

    이것도 상당히 많이 나옵니다.

     

     

    DNS (Domain Name Service)

     

    - 정방향 조회 : Domain Name을 입력하면 IP Address를 알려주는 것

    - 역방향 조회 : IP Address를 입력하면 Domain Name을 알려주는 것

    - DNS : Record

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

      AAAA 또는 A6 : 정방향 조회 (IPv6 Address를 알려줌)

      PTR (Pointer) : 역방향 조회

      cname : 별칭

      NS : Name Server의 준말

    tail -10 2_dns.log

    - 구분자 : [**]

    - Query : Client(Web Browser)가 DNS Server에게 IP Address를 물어보는 것

    - Response: DNS Server가 Client(Web Browser)에게 IP Address를 알려주는 것

    - 3번째 Column이 Domain이고, 6번째 Column이 IP Address

    - Response이면서, A로 표시된 것이 정방향 조회의 결과

     

    구분자를 |로 만든 후, |를 제거할 예정입니다.

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

    2번째 Column이 Response이고 4번째 Column이 A인 것만 골라서 추출합니다.

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

    - 구분자를 없애기 위해서 Pipe로 치환 : sed 's////g' (백슬래시 추가 : Escape)

    - 파이프를 제거 awk -F"|"

    - $2에서 Response를 골라내고

    - &&는 AND의 의미

    - $4에서 A를 골라냄

    - $3이 Domain이고, $6이 IP Address이므로 화면에 출력합니다.

    - /  /는 사이의 문자를 포함하면

    - "  "는 사이의 문자와 같으면

    일부 캡쳐, 내용이 상당히 많습니다.

     

     

    실습 문제

     

    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#읽기

    위 아래로 내용을 훑으려면 Page Up, Page Down키를 사용하시면 됩니다. 혹시 안된다면 Num Lock을 확인해주세요.

     

    2. TCP Port로 출발하는 IP 통계 구하기

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

     

    3. Upload가 많은 상위 10개의 출발지 IP 통계

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

     

    4. Upload가 많은 상위 10개의 출발지 IP 통계에 대한 awk group by sum

    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

     

    5. TCP를 사용하고 접속이 가장 많은 상위 10개의 IP Address 10개 출력

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

    6. Pipe를 치환하고 $2에는 Response가 포함되고, $4는 A인 Record들의 $3(Domain)과 $6(IP)를 중복 제거하고 dns.lookup으로 추출

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

     

    7. TCP 통신하는 출발지 IP, 목적지 IP, 목적지 Port를 추출

    ra -nzr 1_merged_total.arg -s saddr, daddr, stime, dport - "tcp" | awk '{print $1,$2,$4}' | sort | uniq -c | sort -rn > tcp_connection
    less tcp_connection

     

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

     

    사설 IP만 골라내려면 : /^192.168.|^172.16.|^10./     //^은 ~~로 시작하는 의미

    사설 IP가 아닌 것을 골라서 보려면: !~/^192.168.|^172.16.|^10./

    tcp_connection에서 세 번째 Column이 목적지 주소 $3

    $3에서 사설 ip가 아닌 것을 고르려면 $3!~/^192.168.|^172.16.|^10./

    특수문자에 Escape 처리를 해줘야 함  $3!~/^192\.\168\.\|^172.16\.\|^10\.\/ // ^는 기능을 하지만 .은 기능을 하지 않기 때문에 Escape 처리

     

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

     

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

    cat top30 | while read line
    > do
    > dip=$(echo $line | awk '{print $2}')
    > domain=$(cat dns.lookup | awk -v ip=$dip 'ip==$2 {print $1}' | head -1)
    > echo $dip $domain #아래의 첫 번째 결과는 $dip, 두 번째 결과는 $line
    > done > dns_matched

    less dns_matched

    첫 번째 결과, $dip를 사용
    두 번째 결과, $line을 사용

    192.168.1.71  188.53.211.186  80  blinq.in 경로가 의심스러운 도메인

     

    또 다른 사용자가 blinq.in에 접속했는지 확인

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

     

    위 두 개의 주소는 Windows일 것이므로 포렌식을 통해 피해 상태를 확인

    댓글

Designed by Tistory.