HomeLập trìnhPythonBảo mật mạng...

Bảo mật mạng tại nhà – Cách sử dụng Suricata, RaspberryPI4 và Python để đảm bảo an toàn cho mạng của bạn


Trong một bài viết trước, tôi đã chỉ cho bạn cách bảo mật mạng gia đình không dây của bạn bằng Kismet.

Kismet là công cụ hoàn hảo để phát hiện sự bất thường và một số kiểu tấn công nhất định – nhưng nếu tôi muốn phân tích lưu lượng truy cập và tìm kiếm các kiểu hoặc mẫu bất thường có thể chỉ ra một cuộc tấn công thì sao?

Và Hệ Thống Phát Hiện Xâm Nhập (ID) Là:

…một thiết bị hoặc ứng dụng phần mềm giám sát mạng hoặc hệ thống để phát hiện hoạt động độc hại hoặc vi phạm chính sách.

Tôi đã sử dụng một IDS tốt trong quá khứ gọi là Snort V2, tôi biết rằng Snort 3 đã hết. Nhưng có một cảnh báo khá rõ ràng về việc chạy nó trên máy không có nhiều bộ nhớ:

Mặc dù Snort có thể biên dịch trên hầu hết các máy dựa trên *nix, nhưng bạn không nên biên dịch Snort trên máy có công suất thấp hoặc RAM thấp. Snort yêu cầu bộ nhớ để chạy và phân tích chính xác càng nhiều lưu lượng càng tốt.

Snort không chính thức hỗ trợ bất kỳ hệ điều hành cụ thể nào.

Không chính xác là một lý do để không thích nó, nhưng tôi cảm thấy tự tin hơn khi nhà cung cấp cho tôi biết hệ điều hành của tôi có trong danh sách nền tảng được hỗ trợ của họ hay không. Tôi cũng có kinh nghiệm thiết lập gần đây hơn với công cụ nguồn mở Suricata, vì vậy tôi quyết định thử nghiêm túc hơn để theo dõi các tab trên mạng cục bộ của mình và thông báo cho tôi nếu phát hiện thấy bất kỳ hoạt động đáng ngờ nào.

Tìm kiếm xung quanh tôi đã tìm thấy hơn cho mạng cục bộ của mình, 8 GB RAM sẽ đủ cùng với bản phân phối Linux của tôi:

[email protected]:~$ lsb_release --release
Release:	20.04

Phiên bản Ubuntu của tôi được hỗ trợ ra khỏi hộp.

Sự lựa chọn là của bạn. Trong trường hợp của tôi, sử dụng Suricata tốt hơn Snort. Như thường lệ, bạn cần lập kế hoạch xung quanh phần cứng, trường hợp sử dụng và các tính năng do công cụ cung cấp (bao gồm cả hỗ trợ thương mại).

Việc cài đặt được giải thích chi tiết tại đây, vì vậy tôi sẽ chỉ đưa ra đây các bước cài đặt nhanh mà tôi đã sử dụng trên máy của mình:

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata 

Suricata là một con thú phức tạp

Bạn có thể sử dụng Suricata để phát hiện và cảnh báo cho bạn về sự bất thường trong lưu lượng truy cập mạng (IDS) hoặc bạn có thể chủ động loại bỏ các kết nối đáng ngờ khi làm việc trong Hệ thống ngăn chặn xâm nhập (IPS).

Nó cũng có thể nắm bắt lưu lượng truy cập mạng và lưu trữ ở định dạng PCAP để phân tích sau này (hãy cẩn thận vì bạn có thể ngốn dung lượng ổ đĩa của mình khá nhanh).

Chúng tôi sẽ giữ mọi thứ đơn giản và hiện tại sẽ thực hiện một cách tiếp cận thụ động hơn và nhận thông báo khi phát hiện có xâm nhập (theo chế độ IDS) trong hướng dẫn này.

Lý tưởng nhất là bạn muốn đặt cảm biến Suricata gần bộ định tuyến gia đình. Một cách để làm điều đó là kết nối tất cả các thiết bị (bao gồm cả bộ định tuyến gia đình của bạn) với một công tắc chung, sau đó phản ánh lưu lượng đi vào/ra từ bộ định tuyến gia đình vào một cổng trên công tắc. Suricata sẽ được kết nối với cổng đó, lắng nghe tất cả lưu lượng.

Nếu bạn muốn chạy Suricata dưới dạng IPS thì khả năng kết nối sẽ phải khác, nhưng đây không phải là mục đích sử dụng trong hướng dẫn này.

Lý tưởng nhất là nơi tốt nhất để đặt Suricata là giữa tường lửa và phần còn lại của các máy chủ trong mạng gia đình của bạn.

Trong trường hợp này, hãy giả sử rằng điều đó là không thể vì không có tường lửa (OK, đó sẽ là bộ định tuyến ISP của bạn, nhưng bạn không thể chạy Suricata ở đó). Vì vậy, điều tốt nhất tiếp theo là giao diện mạng có dây được kết nối với nó (trong trường hợp của tôi là eth0).

Tệp /etc/suricata/suricata.yaml chứa các giá trị mặc định. Tôi sẽ chỉ ra ở đây những gì tôi ghi đè:

[email protected]:~# grep -in1 af-p /etc/suricata/suricata.yaml 
580-# Linux high speed capture support
581:af-packet:
582-  - interface: eth0
[email protected]:~# grep -in 'HOME_NET: "' /etc/suricata/suricata.yaml |grep -v '#'
15:    HOME_NET: "[192.168.1.0/24]"

Bắt đầu Suricata:

[email protected]:~# systemctl start suricata.service
[email protected]:~# systemctl status suricata.service
● suricata.service - LSB: Next Generation IDS/IPS
     Loaded: loaded (/etc/init.d/suricata; generated)
     Active: active (running) since Sun 2022-04-10 23:49:00 UTC; 24h ago
       Docs: man:systemd-sysv-generator(8)
      Tasks: 10 (limit: 9257)
     CGroup: /system.slice/suricata.service
             └─1834983 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid --af-packet -D -vvv

Apr 10 23:49:00 raspberrypi systemd[1]: Starting LSB: Next Generation IDS/IPS...
Apr 10 23:49:00 raspberrypi suricata[1834973]: Starting suricata in IDS (af-packet) mode... done.
Apr 10 23:49:00 raspberrypi systemd[1]: Started LSB: Next Generation IDS/IPS.

Các chi tiết quan trọng sẽ được đưa vào tệp ‘/var/log/suricata/eve.json’. Của tôi bắt đầu phát triển nhanh một cách đáng ngạc nhiên sau khi bắt đầu Suricata:

{"timestamp":"2022-04-10T23:49:32.527488+0000","event_type":"stats","stats":{"uptime":32,"capture":{"kernel_packets":113,"kernel_drops":0,"errors":0},"decoder":{"pkts":126,"bytes":17986,"invalid":0,"ipv4":30,"ipv6":74,"ethernet":126,"chdlc":0,"raw":0,"null":0,"sll":0,"tcp":4,"udp":30,"sctp":0,"icmpv4":0,"icmpv6":70,"ppp":0,"pppoe":0,"geneve":0,"gre":0,"vlan":0,"vlan_qinq":0,"vxlan":0,"vntag":0,"ieee8021ah":0,"teredo":0,"ipv4_in_ipv6":0,"ipv6_in_ipv6":0,"mpls":0,"avg_pkt_size":142,"max_pkt_size":392,"max_mac_addrs_src":0,"max_mac_addrs_dst":0,"erspan":0,"event":{"ipv4":{"pkt_too_small":0,"hlen_too_small":0,"iplen_smaller_than_hlen":0,"trunc_pkt":0,"opt_invalid":0,"opt_invalid_len":0,"opt_malformed":0,"opt_pad_required":0,"opt_eol_required":0,"opt_duplicate":0,"opt_unknown":0,"wrong_ip_version":0,"icmpv6":0,"frag_pkt_too_large":0,"frag_overlap":0,"frag_ignored":0},"icmpv4":{"pkt_too_small":0,"unknown_type":0,"unknown_code":0,"ipv4_trunc_pkt":0,"ipv4_unknown_ver":0},"icmpv6":{"unknown_type":0,"unknown_code":0,"pkt_too_small":0,"ipv6_unknown_version":0,"ipv6_trunc_pkt":0,"mld_message_with_invalid_hl":0,"unassigned_type":0,"experimentation_type":0},"ipv6":{"pkt_too_small":0,"trunc_pkt":0,"trunc_exthdr":0,"exthdr_dupl_fh":0,"exthdr_useless_fh":0,"exthdr_dupl_rh":0,"exthdr_dupl_hh":0,"exthdr_dupl_dh":0,"exthdr_dupl_ah":0,"exthdr_dupl_eh":0,"exthdr_invalid_optlen":0,"wrong_ip_version":0,"exthdr_ah_res_not_null":0,"hopopts_unknown_opt":0,"hopopts_only_padding":0,"dstopts_unknown_opt":0,"dstopts_only_padding":0,"rh_type_0":0,"zero_len_padn":21,"fh_non_zero_reserved_field":0,"data_after_none_header":0,"unknown_next_header":0,"icmpv4":0,"frag_pkt_too_large":0,"frag_overlap":0,"frag_invalid_length":0,"frag_ignored":0,"ipv4_in_ipv6_too_small":0,"ipv4_in_ipv6_wrong_version":0,"ipv6_in_ipv6_too_small":0,"ipv6_in_ipv6_wrong_version":0},"tcp":{"pkt_too_small":0,"hlen_too_small":0,"invalid_optlen":0,"opt_invalid_len":0,"opt_duplicate":0},"udp":{"pkt_too_small":0,"hlen_too_small":0,"hlen_invalid":0},"sll":{"pkt_too_small":0},"ethernet":{"pkt_too_small":0},"ppp":{"pkt_too_small":0,"vju_pkt_too_small":0,"ip4_pkt_too_small":0,"ip6_pkt_too_small":0,"wrong_type":0,"unsup_proto":0},"pppoe":{"pkt_too_small":0,"wrong_code":0,"malformed_tags":0},"gre":{"pkt_too_small":0,"wrong_version":0,"version0_recur":0,"version0_flags":0,"version0_hdr_too_big":0,"version0_malformed_sre_hdr":0,"version1_chksum":0,"version1_route":0,"version1_ssr":0,"version1_recur":0,"version1_flags":0,"version1_no_key":0,"version1_wrong_protocol":0,"version1_malformed_sre_hdr":0,"version1_hdr_too_big":0},"vlan":{"header_too_small":0,"unknown_type":0,"too_many_layers":0},"ieee8021ah":{"header_too_small":0},"vntag":{"header_too_small":0,"unknown_type":0},"ipraw":{"invalid_ip_version":0},"ltnull":{"pkt_too_small":0,"unsupported_type":0},"sctp":{"pkt_too_small":0},"mpls":{"header_too_small":0,"pkt_too_small":0,"bad_label_router_alert":0,"bad_label_implicit_null":0,"bad_label_reserved":0,"unknown_payload_type":0},"vxlan":{"unknown_payload_type":0},"geneve":{"unknown_payload_type":0},"erspan":{"header_too_small":0,"unsupported_version":0,"too_many_vlan_layers":0},"dce":{"pkt_too_small":0},"chdlc":{"pkt_too_small":0}},"too_many_layers":0},"flow":{"memcap":0,"tcp":1,"udp":20,"icmpv4":0,"icmpv6":15,"tcp_reuse":0,"get_used":0,"get_used_eval":0,"get_used_eval_reject":0,"get_used_eval_busy":0,"get_used_failed":0,"wrk":{"spare_sync_avg":100,"spare_sync":4,"spare_sync_incomplete":0,"spare_sync_empty":0,"flows_evicted_needs_work":0,"flows_evicted_pkt_inject":0,"flows_evicted":0,"flows_injected":0},"mgr":{"full_hash_pass":1,"closed_pruned":0,"new_pruned":0,"est_pruned":0,"bypassed_pruned":0,"rows_maxlen":1,"flows_checked":4,"flows_notimeout":4,"flows_timeout":0,"flows_timeout_inuse":0,"flows_evicted":0,"flows_evicted_needs_work":0},"spare":9600,"emerg_mode_entered":0,"emerg_mode_over":0,"memuse":11668608},"defrag":{"ipv4":{"fragments":0,"reassembled":0,"timeouts":0},"ipv6":{"fragments":0,"reassembled":0,"timeouts":0},"max_frag_hits":0},"flow_bypassed":{"local_pkts":0,"local_bytes":0,"local_capture_pkts":0,"local_capture_bytes":0,"closed":0,"pkts":0,"bytes":0},"tcp":{"sessions":0,"ssn_memcap_drop":0,"pseudo":0,"pseudo_failed":0,"invalid_checksum":0,"no_flow":0,"syn":0,"synack":0,"rst":0,"midstream_pickups":0,"pkt_on_wrong_thread":0,"segment_memcap_drop":0,"stream_depth_reached":0,"reassembly_gap":0,"overlap":0,"overlap_diff_data":0,"insert_data_normal_fail":0,"insert_data_overlap_fail":0,"insert_list_fail":0,"memuse":2424832,"reassembly_memuse":393216},"detect":{"engines":[{"id":0,"last_reload":"2022-04-10T23:49:00.377030+0000","rules_loaded":0,"rules_failed":0}],"alert":0},"app_layer":{"flow":{"http":0,"ftp":0,"smtp":0,"tls":0,"ssh":0,"imap":0,"smb":0,"dcerpc_tcp":0,"dns_tcp":0,"nfs_tcp":0,"ntp":1,"ftp-data":0,"tftp":0,"ikev2":0,"krb5_tcp":0,"dhcp":0,"snmp":0,"sip":0,"rfb":0,"mqtt":0,"rdp":0,"failed_tcp":0,"dcerpc_udp":0,"dns_udp":0,"nfs_udp":0,"krb5_udp":0,"failed_udp":19},"tx":{"http":0,"ftp":0,"smtp":0,"tls":0,"ssh":0,"imap":0,"smb":0,"dcerpc_tcp":0,"dns_tcp":0,"nfs_tcp":0,"ntp":1,"ftp-data":0,"tftp":0,"ikev2":0,"krb5_tcp":0,"dhcp":0,"snmp":0,"sip":0,"rfb":0,"mqtt":0,"rdp":0,"dcerpc_udp":0,"dns_udp":0,"nfs_udp":0,"krb5_udp":0},"expectations":0},"http":{"memuse":0,"memcap":0},"ftp":{"memuse":0,"memcap":0},"file_store":{"open_files":0}}}

Bộ sưu tập vô giá của Etruscan Snoods!, Batman. Làm cách nào để chúng tôi điều chỉnh Suricata để tránh lượng thông tin quá lớn này?

Đọc thêm  Hàm any() và all() của Python – Được giải thích bằng các ví dụ

Bây giờ hãy dừng nó lại trong khi chúng ta tìm ra nó.

Đảm bảo cài đặt của suricata.yaml phù hợp với mạng gia đình:

sudo -i
# And a YAML linter so we can make sure our Suricata configuration files are good
apt-get install yamllint
cp -v -p  /etc/suricata/suricata.yaml /etc/suricata/suricata.yaml.orig

Lưu ý rằng tôi cung cấp ở đây một phiên bản gọn gàng và sạch sẽ của tệp suricata.yaml của tôi.

Cách thuần hóa tệp /var/log/suricata/eve.json

Đây là tệp mà chúng tôi có thể tìm hiểu chi tiết điều gì đã kích hoạt cảnh báo. Nhưng nó có thể phát triển RẤT nhanh, tùy thuộc vào cấu hình quy tắc sự kiện và lưu lượng truy cập của bạn.

Vì vậy, sử dụng logrotate (được cài đặt như một phần của Ubuntu), hãy làm điều này:

# Keep a week of logs, 1 GB of size.
# Always test your config: logrotate -vdf /etc/logrotate.d/suricata
/var/log/suricata/*.log /var/log/suricata/*.json {
    daily
    maxsize 1G
    rotate 7
    missingok
    nocompress
    create
    sharedscripts
    postrotate
        systemctl restart suricata.service
    endscript
}

Cách giúp Suricata thực hiện công việc của mình bằng cách sử dụng các quy tắc về mối đe dọa mới nổi

Chúng tôi có thể điều chỉnh Suricata bằng cách sử dụng Bộ quy tắc ET OPEN. Vì các mối đe dọa luôn thay đổi nên bạn cần tự động tải xuống và cập nhật chúng.

Vì vậy, hãy cài đặt nó trước:

sudo -i
python3 -m venv ~/virtualenv/suricata
. ~/virtualenv/suricata/bin/activate
pip install --upgrade pip
pip install --upgrade suricata-update
suricata-update
# Also, install jq so we can see the contents of the eve.json file nicely formatted
apt-get install jq

Hãy chạy thủ công và xem các quy tắc được công cụ cập nhật như thế nào:

asciicast

Đối với mạng gia đình của chúng tôi, chúng tôi sẽ tải xuống các quy tắc này mỗi ngày một lần. Một công việc Cron đơn giản sẽ thực hiện thủ thuật:

crontab -e
# Run Suricata update once a day, 
# per https://rules.emergingthreats.net/OPEN_download_instructions.html
# Also will update at a different time than the log rotation, to avoid a race condition
# while rotating the logs. Note than we do not need to restart suricata
0 30 * * * . ~/virtualenv/suricata/bin/activate && suricata-update && suricatasc -c reload-rules

Hãy bắt đầu lại Suricata để chúng ta có thể kiểm tra một số quy tắc:

asciicast

Có gì bên trong tệp /var/log/suricata/eve.json?

Tệp chứa khá nhiều thông tin, được mô tả chi tiết tại đây:

{"timestamp":"2022-04-15T20:52:05.026189+0000","flow_id":1378250082748552,"in_iface":"eth0","event_type":"flow","src_ip":"192.168.1.1","src_port":59317,"dest_ip":"239.255.255.250","dest_port":1900,"proto":"UDP","app_proto":"failed","flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":378,"bytes_toclient":0,"start":"2022-04-15T20:50:32.264328+0000","end":"2022-04-15T20:50:32.264328+0000","age":0,"state":"new","reason":"timeout","alerted":false}}
{"timestamp":"2022-04-15T20:52:05.026418+0000","flow_id":2222739437411106,"in_iface":"eth0","event_type":"flow","src_ip":"192.168.1.1","src_port":60890,"dest_ip":"239.255.255.250","dest_port":1900,"proto":"UDP","app_proto":"failed","flow":{"pkts_toserver":1,"pkts_toclient":0,"bytes_toserver":376,"bytes_toclient":0,"start":"2022-04-15T20:50:32.482082+0000","end":"2022-04-15T20:50:32.482082+0000","age":0,"state":"new","reason":"timeout","alerted":false}}

Nếu bạn tình cờ kiểm tra nội dung của tệp trong thời gian thực, tôi khuyên bạn nên sử dụng jq (kiểm tra bộ lọc của bạn trên jqplay.org) và hiển thị một vài trường quan tâm:

asciicast

Trong tương lai, chúng tôi sẽ tập trung vào các cảnh báo, vì vậy chúng tôi chỉ có thể lọc ra theo loại sự kiện đó:

jq 'select(.event_type=="alert")' /var/log/suricata/eve.json

Những người ở Suricata đã tập hợp một trang hay với các ví dụ mà bạn nên xem qua.

Cách kiểm tra cài đặt Suricata

Công cụ giao dịch: Các tệp Wireshark, tcpreplay và PCAP

Chúng tôi sẽ sử dụng một số tệp lưu lượng truy cập, ở định dạng PCAP. Vậy tệp PCAP là gì?

Vào cuối những năm 1980, Van Jacobson, Steve McCanne và những người khác tại Nhóm Nghiên cứu Mạng tại Phòng thí nghiệm Quốc gia Lawrence Berkeley đã phát triển chương trình tcpdump để thu thập và phân tích các dấu vết mạng.

Mã để nắm bắt lưu lượng, sử dụng các cơ chế cấp thấp trong các hệ điều hành khác nhau và để đọc và ghi các dấu vết mạng vào một tệp sau đó đã được đưa vào một thư viện có tên libpcap.

Và chúng tôi sẽ sử dụng một công cụ để kiểm tra nội dung của tệp PCAP. Wireshark là một công cụ phân tích lưu lượng truy cập mạnh mẽ và chúng tôi sẽ sử dụng tcpreplay để kích hoạt cảnh báo Suricata bằng cách phát tệp PCAP có hoạt động đáng ngờ:

# On Ubuntu, Debian: sudo apt-get install wireshark tcpreplay
sudo dnf install -y wireshark tcpreplay

Cách tốt nhất để tìm hiểu cách thức hoạt động của những kẻ xấu là xem dấu chân của chúng. Bạn chắc chắn nên truy cập https://www.malware-traffic-analysis.net/ và tải xuống một số mẫu, một cách thực hành thậm chí còn tốt hơn với các bài tập phân tích PCAP của họ.

CẢNH BÁO: Bạn sẽ tải xuống các tệp nguy hiểm:

Sử dụng trang web này có nguy cơ của riêng bạn! Nếu bạn tải xuống hoặc sử dụng bất kỳ thông tin nào từ trang web này, bạn phải chịu trách nhiệm hoàn toàn về bất kỳ tổn thất hoặc thiệt hại nào.

Vì vậy, hãy cẩn thận và có trách nhiệm khi sử dụng công cụ chụp lưu lượng mạng này.

Đọc thêm  Cách sử dụng OpenCV và Python cho Computer Vision và AI

Không có quy tắc nào được bật theo mặc định?

Làm thế nào chúng ta có thể kiểm tra nếu đó là trường hợp? Tôi sẽ chỉ cho bạn tiếp theo:

asciicast

Khi bạn kích hoạt các quy tắc (suricata-update list-sources --free; uricata-update enable-source source; suricata-update list-enabled-sources) bạn có thể yêu cầu Suricata tải lại các quy tắc mà không cần khởi động lại:

[email protected]:~# suricatasc -c reload-rules
{"message": "done", "return": "OK"}

23-02-2022 – BÀI TẬP PHÂN TÍCH GIAO THÔNG – SUNNYSTATION

Hãy xem liệu chúng ta có thể kích hoạt Suricata bằng cách sử dụng mối đe dọa cụ thể này không (nó tương đối mới).

Bắt đầu bằng cách tải xuống 2022-02-23-traffic-analysis-exercise.pcap.zip (mật khẩu có trên trang giới thiệu).

insta_dir="$HOME/Downloads/malware/"
mkdir --parent --verbose "$insta_dir"
url="https://www.malware-traffic-analysis.net/2022/02/23/2022-02-23-traffic-analysis-exercise.pcap.zip"
exercise=$(basename $url)
curl --fail --location --output "$insta_dir/$exercise" $url
# Be ready to put the password :-)
cd $insta_dir && unzip $exercise 

Bên trong là gì? Chúng tôi có thể kiểm tra với capinfos để có được một số thông tin chi tiết về tệp chúng tôi vừa tải xuống:

[[email protected] malware]$ capinfos 2022-02-23-traffic-analysis-exercise.pcap
File name:           2022-02-23-traffic-analysis-exercise.pcap
File type:           Wireshark/tcpdump/... - pcap
File encapsulation:  Ethernet
File timestamp precision:  microseconds (6)
Packet size limit:   file hdr: 65535 bytes
Number of packets:   30k
File size:           19MB
Data size:           19MB
Capture duration:    2680.736661 seconds
First packet time:   2022-02-23 13:22:24.405139
Last packet time:    2022-02-23 14:07:05.141800
Data byte rate:      7,191 bytes/s
Data bit rate:       57kbps
Average packet size: 642.09 bytes
Average packet rate: 11 packets/s
SHA256:              eefc7e61b50e7846f5a3282d7645539d7b2b4b85aa08a09d0b823896c9449d1f
RIPEMD160:           a8d84d262e37563c179e9ca52cdc6aae271efd9c
SHA1:                fdfa0d0edfe0cbcc0c1400fbe6ac61ff40942755
Strict time order:   True
Number of interfaces in file: 1
Interface #0 info:
                     Encapsulation = Ethernet (1 - ether)
                     Capture length = 65535
                     Time precision = microseconds (6)
                     Time ticks per second = 1000000
                     Number of stat entries = 0
                     Number of packets = 30023

Sẽ sử dụng một bọc nhỏ xung quanh tcpreplay để phát lại tệp PCAP của chúng tôi:

#!/bin/bash
:<<DOC
Script to replay a PCAP file at accelerated pace on the default network interface
Author: Jose Vicente Nunez ([email protected])
DOC
default_dev=$(ip route show| grep default| sort -n -k 9| head -n 1| cut -f5 -d' ')|| exit 100
if [ "$(id --name --user)" != "root" ]; then
  echo "ERROR: I need to be root to inject the PCAP contents into '$default_dev'"
  echo "Maybe 'sudo $0 $*'?"
  exit 100
fi
for util in tcpreplay ip; do
  if ! type -p $util > /dev/null 2>&1; then
    echo "Please put $util on the PATH and try again!"
    exit 100
  fi
done
:<<DOC
We may have more than one 'default' route, so we sort by priority and pick the one with the
preferred metric:
default via 192.168.1.1 dev eno1 proto dhcp metric 100 <----- PICK ME!!!
default via 192.168.1.1 dev wlp4s0 proto dhcp metric 600
DOC
for pcap in "[email protected]"; do
  if [ -f "$pcap" ]; then
    if ! tcpreplay --stats 5 --intf1 "$default_dev" --multiplier 24 "$pcap"; then
      echo "ERROR: Will not try to replay any pending PCAP files due previous errors"
      exit 100
    fi
  fi
done

Hãy để nó phát lại cho đến khi đến cuối tệp:

[email protected]:~# tcpreplay --stats 5 --intf1 eth0 --multiplier 24 ~josevnz/Downloads/malware/2022-02-23-traffic-analysis-exercise.pcap 
Test start: 2022-04-16 17:51:40.673394 ...
Actual: 3783 packets (1075843 bytes) sent in 5.03 seconds
Rated: 213624.5 Bps, 1.70 Mbps, 751.17 pps
Actual: 6959 packets (3325918 bytes) sent in 10.04 seconds
Rated: 331191.4 Bps, 2.64 Mbps, 692.96 pps
Actual: 8627 packets (4464002 bytes) sent in 15.14 seconds
Rated: 294744.2 Bps, 2.35 Mbps, 569.61 pps
Actual: 10975 packets (6331901 bytes) sent in 20.21 seconds
Rated: 313180.5 Bps, 2.50 Mbps, 542.83 pps
Actual: 13148 packets (7870783 bytes) sent in 25.26 seconds
Rated: 311561.9 Bps, 2.49 Mbps, 520.45 pps
Actual: 14500 packets (8612630 bytes) sent in 30.43 seconds
...
Actual: 24467 packets (14960314 bytes) sent in 110.83 seconds
Rated: 134978.5 Bps, 1.07 Mbps, 220.75 pps
Test complete: 2022-04-16 17:53:33.735188
Actual: 30023 packets (19277433 bytes) sent in 113.06 seconds
Rated: 170503.5 Bps, 1.36 Mbps, 265.54 pps
Statistics for network device: eth0
	Successful packets:        30023
	Failed packets:            0
	Truncated packets:         0
	Retried packets (ENOBUFS): 0
	Retried packets (EAGAIN):  0

Và cuối cùng chúng tôi nhận được một vài cảnh báo:

"2022-04-16T17:52:20.134763+0000,dns,1296231906414153,172.16.0.170:53806,172.16.0.52:53"
"2022-04-16T17:52:20.286785+0000,dns,293726410006593,172.16.0.170:50935,172.16.0.52:53"
"2022-04-16T17:52:20.290084+0000,dns,293726410006593,172.16.0.170:50935,172.16.0.52:53"
"2022-04-16T17:52:20.520858+0000,alert,1626224981242326,172.16.0.149:49795,172.16.0.52:139"
"2022-04-16T17:52:21.784804+0000,alert,1992149752477936,172.16.0.149:49796,172.16.0.52:139"
"2022-04-16T17:52:22.142041+0000,flow,1739064507071469,172.16.0.149:5353,224.0.0.251:5353"
"2022-04-16T17:52:22.351091+0000,dns,2078727703255923,172.16.0.149:51367,172.16.0.52:53"
"2022-04-16T17:52:22.351260+0000,dns,181632058678300,172.16.0.149:64943,172.16.0.52:53"
"2022-04-16T17:52:22.351129+0000,dns,2078727703255923,172.16.0.149:51367,172.16.0.52:53"
"2022-04-16T17:52:23.037637+0000,alert,282956779721256,172.16.0.149:49798,172.16.0.52:139"
"2022-04-16T17:52:23.901721+0000,dns,556717995180633,172.16.0.170:51164,172.16.0.52:53"
"2022-04-16T17:52:23.904764+0000,dns,556717995180633,172.16.0.170:51164,172.16.0.52:53"
"2022-04-16T17:52:24.293356+0000,alert,2006941620009246,172.16.0.149:49799,172.16.0.52:139"
"2022-04-16T17:52:25.322102+0000,dns,1671081620007478,172.16.0.170:51909,172.16.0.52:53"

Ví dụ: phóng to id cảnh báo ‘282956779721256’:

// [email protected]:~# grep 282956779721256 /var/log/suricata/eve.json|jq
{
  "timestamp": "2022-04-16T17:52:23.037637+0000",
  "flow_id": 282956779721256,
  "in_iface": "eth0",
  "event_type": "alert",
  "src_ip": "172.16.0.149",
  "src_port": 49798,
  "dest_ip": "172.16.0.52",
  "dest_port": 139,
  "proto": "TCP",
  "metadata": {
    "flowints": {
      "applayer.anomaly.count": 1
    }
  },
  "alert": {
    "action": "allowed",
    "gid": 1,
    "signature_id": 2260002,
    "rev": 1,
    "signature": "SURICATA Applayer Detect protocol only one direction",
    "category": "Generic Protocol Command Decode",
    "severity": 3
  },
  "smb": {
    "id": 1,
    "dialect": "NT LM 0.12",
    "command": "SMB1_COMMAND_NEGOTIATE_PROTOCOL",
    "status": "STATUS_SUCCESS",
    "status_code": "0x0",
    "session_id": 0,
    "tree_id": 0,
    "client_dialects": [
      "PC NETWORK PROGRAM 1.0",
      "LANMAN1.0",
      "Windows for Workgroups 3.1a",
      "LM1.2X002",
      "LANMAN2.1",
      "NT LM 0.12"
    ],
    "server_guid": "a21b9552-a4a0-48cd-8abb-ea111498253d"
  },
  "app_proto": "smb",
  "app_proto_ts": "failed",
  "flow": {
    "pkts_toserver": 4,
    "pkts_toclient": 3,
    "bytes_toserver": 579,
    "bytes_toclient": 387,
    "start": "2022-04-16T17:52:23.037416+0000"
  },
  "payload": "AAAAiv9TTUJzAAAAABgHyAAAQlNSU1BZTCAAAP////4AAEAADP8AAAAEQTIAAAAAAAAASgAAAAAA1AAAoE8AYEgGBisGAQUFAqA+MDygDjAMBgorBgEEAYI3AgIKoioEKE5UTE1TU1AAAQAAAJeCCOIAAAAAAAAAAAAAAAAAAAAACgBhSgAAAA8AAAAAAA==",
  "payload_printable": ".....SMBs.........BSRSPYL [email protected]`H..+......>0<..0..\n+.....7..\n.*.(NTLMSSP.........................\n.aJ.........",
  "stream": 0,
  "packet": "AB5PDqh0ABv8e9HACABFAAC2t+tAAIAG6WysEACVrBAANMKGAIthfGQf7GIEdVAYIBP6YwAAAAAAiv9TTUJzAAAAABgHyAAAQlNSU1BZTCAAAP////4AAEAADP8AAAAEQTIAAAAAAAAASgAAAAAA1AAAoE8AYEgGBisGAQUFAqA+MDygDjAMBgorBgEEAYI3AgIKoioEKE5UTE1TU1AAAQAAAJeCCOIAAAAAAAAAAAAAAAAAAAAACgBhSgAAAA8AAAAAAA==",
  "packet_info": {
    "linktype": 1
  },
  "host": "ras[berripi"
}
{
  "timestamp": "2022-04-16T17:55:42.050329+0000",
  "flow_id": 282956779721256,
  "in_iface": "eth0",
  "event_type": "flow",
  "src_ip": "172.16.0.149",
  "src_port": 49798,
  "dest_ip": "172.16.0.52",
  "dest_port": 139,
  "proto": "TCP",
  "app_proto": "smb",
  "app_proto_ts": "failed",
  "flow": {
    "pkts_toserver": 13,
    "pkts_toclient": 12,
    "bytes_toserver": 1743,
    "bytes_toclient": 1963,
    "start": "2022-04-16T17:52:23.037416+0000",
    "end": "2022-04-16T17:52:23.488633+0000",
    "age": 0,
    "state": "closed",
    "reason": "timeout",
    "alerted": true
  },
  "metadata": {
    "flowbits": [
      "smb.tree.connect.ipc"
    ],
    "flowints": {
      "applayer.anomaly.count": 1
    }
  },
  "tcp": {
    "tcp_flags": "1b",
    "tcp_flags_ts": "1b",
    "tcp_flags_tc": "1b",
    "syn": true,
    "fin": true,
    "psh": true,
    "ack": true,
    "state": "closed"
  },
  "host": "raspberrypi"
}

Đó là khá một chút để xử lý. Hãy nhớ rằng trong khi điều chỉnh Suricata, chúng tôi cũng có thể yêu cầu nó phát lại trực tiếp một hoặc nhiều tệp PCAP.

Yêu cầu Suricata chạy ở chế độ ngoại tuyến bằng tệp PCAP cho SUNNYSTATION

Đây là một cách rất thuận tiện để kiểm tra Suricata, vì chúng tôi không đưa bất kỳ lưu lượng truy cập nào vào mạng của mình và thay vào đó, để Suricata ‘nhập’ trực tiếp nội dung của tệp PCAP để kiểm tra các quy tắc.

Đọc thêm  Tên plot_cases_simple không được xác định – Cách khắc phục lỗi Python này

Ngoài ra, chúng tôi chuyển hướng nhật ký đến một vị trí riêng biệt (theo mặc định là thư mục nơi bạn đang chạy chế độ ‘ngoại tuyến’), vì vậy chúng tôi không làm ô nhiễm bản cài đặt trực tiếp.

asciicast

Một ví dụ khác: EMOTET VỚI COBALT Strike

Hãy thử chụp phần mềm độc hại khác, trong trường hợp này là 2022-02-08 (THỨ BA) – TỆP CHO NHẬT KÝ ISC (EMOTET VỚI COBALT STRIKE):

cd ~/Downloads/malware/ && \
curl --remote-name https://www.malware-traffic-analysis.net/2022/02/08/2022-02-08-Emotet-epoch4-infection-start-and-spambot-traffic.pcap.zip && \
unzip 2022-02-08-Emotet-epoch4-infection-start-and-spambot-traffic.pcap.zip && \
sudo suricata -r ~josevnz/Downloads/malware/2022-02-08-Emotet-epoch4-infection-start-and-spambot-traffic.pcap -k none --runmode autofp -c /etc/suricata/suricata.yaml -l ~josevnz/Downloads/malware/ 

Đây là một phiên mẫu:

asciicast

Suricata sẽ lưu rất nhiều chi tiết khi phát hiện ra sự bất thường. Bạn có thể nói rằng việc sử dụng jq để xem qua các cảnh báo có thể không được mong muốn.

Để thiết lập lớn hơn, bạn có thể muốn sử dụng Ngăn xếp đàn hồi (Filebeat, Logstash, Tìm kiếm đàn hồi, Kibana):

  • Nhận nhật ký
  • Lưu trữ lịch sử và bình thường hóa các bản ghi
  • Trực quan hóa nội dung của họ

Nhưng điều đó cảm thấy quá mức cần thiết đối với việc thiết lập tại nhà, vì vậy tôi sẽ giới thiệu một số tập lệnh để giúp tôi thực hiện những gì tôi cần.

Cho tôi xem chuyện gì đã xảy ra trong 10 phút vừa qua

Đây là tập lệnh giả định hầu hết các giá trị mặc định, vì vậy tôi không phải nhập biểu thức jq. Nếu có bất kỳ cảnh báo nào thì tôi sẽ tìm hiểu sâu hơn về tệp eve.json.

Một tập lệnh Python 3 đơn giản sẽ thực hiện thủ thuật cho chúng tôi:

#!/usr/bin/env python
"""
Show Suricata alerts
Author: Jose Vicente Nunez ([email protected])
"""
import argparse
import json
from datetime import datetime, timedelta
from json import JSONDecodeError
from pathlib import Path
from typing import Callable, Any, Dict

DEFAULT_EVE = [Path("/var/log/suricata/eve.json")]
DEFAULT_TIMESTAMP_10M_AGO = datetime = datetime.now() - timedelta(minutes=10)


def _parse_timestamp(candidate: str) -> datetime:
    """
    Expected something like 2022-02-08T16:32:14.900292+0000
    :param candidate:
    :return:
    """
    if isinstance(candidate, str):
        try:
            iso_candidate = candidate.split('+', 1)[0]
            return datetime.fromisoformat(iso_candidate)
        except ValueError:
            raise ValueError(f"Invalid date passed: {candidate}")
    elif isinstance(candidate, datetime):
        return candidate


def alert_filter(
        *,
        timestamp: datetime = DEFAULT_TIMESTAMP_10M_AGO,
        data: Dict[str, Any]
) -> bool:
    if 'event_type' not in data:
        return False
    if data['event_type'] != 'alert':
        return False
    try:
        event_timestamp = _parse_timestamp(data['timestamp'])
        if event_timestamp > timestamp:
            return False
    except ValueError:
        return False
    return True


def get_alerts(
        *,
        eve_files=None,
        row_filter: Callable = alert_filter,
        timestamp: datetime = DEFAULT_TIMESTAMP_10M_AGO
) -> str:
    if eve_files is None:
        eve_files = DEFAULT_EVE
    for eve_file in eve_files:
        with open(eve_file, 'rt') as eve:
            for line in eve:
                try:
                    data = json.loads(line)
                    if row_filter(data=data, timestamp=timestamp):
                        yield data
                except JSONDecodeError:
                    continue  # Try to read the next record


if __name__ == "__main__":
    PARSER = argparse.ArgumentParser(description=__doc__)
    PARSER.add_argument(
        "--timestamp",
        type=_parse_timestamp,
        default=DEFAULT_TIMESTAMP_10M_AGO,
        help=f"Minimum timestamp in the past to use when filtering events ({DEFAULT_TIMESTAMP_10M_AGO})"
    )
    PARSER.add_argument(
        'eve',
        type=Path,
        nargs="+",
        help=f"Path to one or more {DEFAULT_EVE[0]} file to parse."
    )
    OPTIONS = PARSER.parse_args()
    try:
        for alert in get_alerts(eve_files=OPTIONS.eve, timestamp=OPTIONS.timestamp):
            print(json.dumps(alert, indent=6, sort_keys=True))
    except KeyboardInterrupt:
        pass

Đó là một cải tiến lớn so với jq vì ít nhất chúng ta có thể lọc theo dấu thời gian, nhưng sẽ thật tuyệt nếu tập lệnh của chúng ta có thể thực hiện như sau:

  1. Hỗ trợ phân trang
  2. Tô màu đầu ra
  3. Cho phép bạn hiển thị giữa định dạng bảng hoặc đầu ra JSON thô

asciicast

Suricata là một phần mềm phức tạp. Cần có thời gian để thuần hóa nó và nhiều thời gian hơn để hiểu thông tin mà nó trình bày. Nhưng sẽ rất bổ ích khi biết cách bạn có thể xử lý một công cụ cho phép bạn bảo vệ mạng của mình khỏi các mối đe dọa.

  • Kênh YouTube OISF Suricata có nhiều tài nguyên thú vị về công cụ này và một cộng đồng thịnh vượng.
  • Bạn muốn tìm hiểu cách phân tích tệp PCAP để tìm lưu lượng truy cập xấu? phân tích lưu lượng phần mềm độc hại có tài liệu hoàn hảo dành cho bạn.
  • Viết phần mềm phức tạp là khó. Ví dụ: các phiên bản cũ hơn của Snort dễ bị tấn công có thể vô hiệu hóa nó, CVE-2022-20685. Suricata cũng có CVE-2019-1010279 . Các sự cố này đã được khắc phục nhưng cho thấy nhu cầu cập nhật phần mềm của bạn, đặc biệt là phần mềm bạn sử dụng để bảo vệ mạng của mình.
  • Tôi đã không chạm vào chế độ IPS hoặc thậm chí là các chế độ kết hợp cho Suricata. Vui lòng đọc tài liệu chính thức để bắt kịp tốc độ.
  • Cuối cùng, hãy tự giúp mình và đọc Hướng dẫn Suricata này từ FloCon 2016. Nó rất đầy đủ và bạn sẽ tìm kiếm thêm.

Bạn có thể để lại nhận xét của mình trên kho lưu trữ Git và báo cáo bất kỳ lỗi nào. Nhưng điều quan trọng hơn là hãy tải Suricata, lấy mã của hướng dẫn này và bắt đầu bảo mật cơ sở hạ tầng không dây tại nhà của bạn ngay lập tức.



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status