- vừa được xem lúc

Giới thiệu về kiểm thử xâm nhập (phần 4): Network and Network Monitoring

0 0 16

Người đăng: Nguyen Xuan Chien

Theo Viblo Asia

Bài viết hôm nay của mình sẽ tiếp tục với series Giới thiệu về kiểm thử xâm nhập. Trong các phần trước, chúng ta đã đi tìm hiểu cơ bản về Pentest và bước đầu tiên trong quá trình khai thác - Reconnaissance.

Trước khi đến với bước khai thác tiếp theo, chúng ta cần tìm hiểu thêm kiến thức về mạng máy tính. Các kiến thức về mạng rất quan trọng đối với Pentester để biết điều gì sẽ xảy ra ở cấp độ Network khi bạn khởi chạy quá trình quét cổng hoặc lỗ hổng. Một Pentester phải biết cách theo dõi quá trình làm việc của bản thân vì trong một số trường hợp, khách hàng có thể yêu cầu bạn ghi lại tất cả các hoạt động hoặc lưu lượng truy cập đến tổ chức của họ.

I. Network basic

Phần này bao gồm một số vấn đề cơ bản về mạng, bao gồm từ bắt tay ba bước TCP, TCP header đến UDP.

TCP và bắt tay 3 bước

TCP hay "giao thức điều khiển truyền tải" là một giao thức lớp truyền tải tiêu chuẩn mà internet sử dụng để truyền dữ liệu. TCP hoạt động ở tầng vận chuyển (Transport) của mô hình OSI. Request For Comments (RFC) 793 định nghĩa TCP là một giao thức hướng kết nối và đáng tin cậy, nó có thể khôi phục từ các lần truyền bị hỏng, trùng lặp hoặc bị mất. TCP thực hiện điều này dựa vào các thông tin cụ thể được truyền giữa các máy chủ giao tiếp, được gọi là Acknowledgement hoặc viết tắt là ACK.

Bắt tay ba bước TCP là một nguyên lý của TCP sử dụng ACK để thiết lập kết nối giữa hai thiết bị, chi tiết về bắt tay ba bước được thể hiện trong hình dưới đây:

Ta sẽ đi vào chi tiết các bước:

Bước 1: Bước đầu tiên trong quá trình bắt tay ba bước yêu cầu máy Client bắt đầu kết nối bằng cách gửi tới Server một yêu cầu kết nối TCP với cờ kiểm soát SYN (đồng bộ hóa) được đặt số thứ tự ngẫu nhiên (Seq = n)

Bước 2: Sau khi Server nhận được yêu cầu, nó sẽ gửi trở lại máy khách với cả hai cờ kiểm soát SYN và ACK được đặt. Trong đó, Server tăng thêm một giá trị để gửi lại cho máy khách qua cờ ACK (Seq = n + 1) và đặt giá trị của chính nó trong cờ SYN (Seq = m)

Bước 3: Máy Client nhận được phân đoạn được gắn cờ SYN-ACK. ACK (Seq = n + 1) tăng lên so với giá trị ban đầu (Seq = n) cho phép khách hàng biết rằng gói trước đó đã được nhận thành công, đồng thời nhận được giá trị SYN (Seq = m) từ phía Server. Sau đó, máy khách sẽ gửi một gói ACK trở lại Server và tăng giá trị của Server (Seq = m + 1). Tại thời điểm này, kết nối được coi là "đã thiết lập"

Hai hệ thống tiếp tục tăng số thứ tự mỗi khi nhận được gói thành công cho đến khi kết nối bị ngắt với gói FIN (kết thúc) hoặc RST (đặt lại)

TCP và IP headers

TCP header

Ta đã biết TCP sử dụng các cờ và các số thứ tự để thực hiện bắt tay ba bước. Vậy các cờ điều khiển và số thứ tự này được lưu trữ ở đâu?

Câu trả lời là chúng được lưu trữ cùng với các thông tin khác trong các trường của TCP header, chi tiết về TCP header được thể hiện trong hình dưới đây:

Thông tin đầu tiên trong TCP header bao gồm Cổng Nguồn (Source Port) và Cổng Đích (Destination Port), mỗi cổng chứa 16 bit, cung cấp tổng cộng 65.536 (0–65.535) cổng nguồn và đích có thể. Bit thông tin tiếp theo là Sequence Number, chứa giá trị nếu SYN được đặt. Tiếp đến là Acknowledgement Number, phần này chỉ bao gồm nội dung nào đó nếu ACK được đặt và giá trị này phải lớn hơn số ACK nhận được trước đó.

Trong quá trình kết nối được thiết lập, ACK phải luôn được đặt. Phần thông tin tiếp theo mà bạn nên quan tâm là các flag (được gọi là bit điều khiển trong RFC), sẽ được đặt dựa trên trạng thái của kết nối. Chỉ có một số flag nhất định nên được đặt tại bất kỳ điểm nào trong một kết nối điển hình. Khi bạn đang quét, bạn có thể sửa đổi các flag này dựa trên nhu cầu của mình. Các flag là một khía cạnh quan trọng của TCP, chúng ta đã thảo luận về các cờ SYN, ACK và FIN, ngoài ra còn có các cờ khác được mô tả ngắn gọn như sau:

  • URG: Nó cho biết chúng ta có cần sử dụng con trỏ khẩn cấp (urgent pointer) hay không.
  • PSH: Yêu cầu mô-đun TCP chuyển dữ liệu đến ứng dụng ngay lập tức.
  • RST: Đặt lại kết nối
  • FIN: Bắt đầu hủy kết nối

IP header

TCP header chỉ là một phần của trong quá trình Network Scan, để thực hiện theo dõi mạng bạn cần biết các loại thông tin được lưu trữ trong IP header - (IP header chứa các thông tin giúp các hệ thống giao tiếp có thể đi từ mạng này sang mạng khác). Trong khi IPv4 vẫn chiếm hầu hết lưu lượng mạng, IPv6 có đã dần trở nên phổ biến hơn những năm gần đây, vì vậy bài viết này sẽ đề cập đến cả hai loại IP này.

IPv4 header:

Khi lập và quét các mục tiêu trên IPv4, hãy chú ý đến hai phần sau:

  • Time to Live (TTL) Trường này được đặt để các gói thực hiện không di chuyển trên Internet vô thời hạn. Giá trị này sẽ giảm đi một mỗi lần nó được định tuyến đến một khác mạng. Nếu TTL bằng 0, gói tin sẽ bị loại bỏ.
  • Flags: Nếu giá trị này được đặt thành “DF”, điều đó có nghĩa là không thực hiện phân mảnh gói tin. Nếu nó được đặt thành “M” nghĩa là sẽ có nhiều hơn các mảnh gói sẽ theo sau.

IPv6 header:

IPv6 header đơn giản hơn nhiều so với IPv4 header. Khi theo dõi các mạng IPv6, hãy chú ý đến giá trị Hop Limit có chức năng tương tự TTL trong IPv4. Trong IPv6, việc phân mảnh không được xử lý bởi bộ định tuyến mà bởi máy chủ nên việc phân mảnh sẽ được chỉ định trong tiêu đề mở rộng trong IPv6.

UDP

Giao thức UDP được xác định bởi RFC 768 và đơn giản hơn nhiều về bản chất so với giao thức TCP. TCP được xây dựng để có thể khôi phục các gói tin từ các giao tiếp trùng lặp hoặc bị mất. UDP không có yêu cầu như vậy, một khi gói tin đã rời khỏi người gửi, không có gì đảm bảo rằng gói tin sẽ đến được đích và người nhận sẽ không thông báo cho người gửi xem gói tin đó đến được hay không. Chính sự khác biệt lớn giữa hai giao thức làm cho việc quét các cổng UDP khác rất nhiều so với việc quét các cổng TCP.

UDP header có ít dữ liệu hơn nhiều so với TCP header (được hiển thị trước đó). Đơn giản chỉ có một cổng nguồn và đích, segment length, checksum và dữ liệu. Và vì các công cụ Network Scan ít có khả năng xác định xem một cổng đang mở hay đã được filter, nên nó sẽ cần đợi hết thời gian chờ và gửi nhiều gói hơn, dẫn đến thời gian quét các cổng UDP lâu hơn theo cấp số nhân so với các cổng TCP.

II. Network Monitoring

Trong quá trình thử nghiệm, bạn nên theo dõi các lần quét của mình. Điều này có thể giúp dễ dàng tìm ra vấn đề trong trường hợp các hành vi này gây ra sự cố với thiết bị của khách hàng. Bạn cũng nên theo dõi quá trình quét của mình trong khi đang thử nghiệm các kỹ thuật mới hoặc các công cụ mới. Vì vậy, trước khi bạn tìm hiểu kỹ cách thực hiện network scan, phần này giới thiệu cho bạn một số công cụ mã nguồn mở phổ biến mà bạn có thể sử dụng để theo dõi quá trình làm việc của mình: Wireshark và tcpdump. Cả hai đều được bao gồm theo mặc định với Kali Linux.

TCPDUMP

Tcpdump là một công cụ phần mềm Linux dựa trên CLI. Nó nhẹ hơn nhiều so với Wireshark, nhưng cũng có chức năng tích hợp khiến nó rất linh hoạt và hữu dụng. Để bắt đầu sử dụng tcpdump, ta sẽ đi vào một số options thường dùng:

  • h: Hiển thị các thông tin hỗ trợ
  • i: Lựa chọn interface mà tcpdump thực hiện lắng nghe
  • D: hiển thị các interface có sẵn
  • v: Hiển thị thông tin về gói tin như: IP, TTL, độ dài, vv
  • vv, -vvv: tương tự với -v nhưng in ra nhiều thông tin hơn
  • n: Không phân giải địa chỉ IP sang domain name
  • X: In ra dạng ASCII và hex
  • x: In ra dạng hex
  • s: chụp nhanh các byte dữ liệu từ mỗi gói tin thay vì mặc định là 262144 bytes.
  • w: Ghi gói tin vào file dưới định dạng PCAP format
  • r: Đọc và hiển thị file PCAP

Ví dụ về việc bắt gói tin đơn giản:

  • Hiển thị danh sách interface: tcpdump -D

  • Bắt gói tin của mạng enp1s0: tcpdump -i enp1s0

Khi thực hiện chạy lệnh tcpdump -i enp1s0, công cụ sẽ mặc định bắt tất cả lưu lượng đi qua interface enp1s0. Đôi khi quá nhiều dữ liệu đổ về khiến việc nắm bắt lưu lượng mạng trở nên khó khăn. Lúc này ta có thể sử dụng để các kỹ thuật để filter, tcpdump cũng cho phép lọc gói tin dựa trên các toán tử and, or, not. Ví dụ một vài lệnh lọc gói tin:

  • tcpdump -nnvX -i eth0 tcp port 80 or port 443 and not dst 192.168.1.x: thực hiện bắt các gói tin của interface eth0, hiển thị dạng ASCII và hex, không thực hiện phân giải địa chỉ ip, sử dụng giao thức tcp trên cổng 80 hoặc 443, và địa chỉ đích khác 192.168.1.x (x trong khoảng từ 0-255)
  • tcpdump -nnv -i eth0 portrange 137-139 and '(tcp or udp)': bắt các gói tin trong port từ 137-139 và sử dụng cả tcp lẫn udp. Lệnh này sử dụng để bắt tất các lưu lượng truy cập NetBIOS
  • tcpdump-s0 tcp portrange 20-21 -w ftp.pcap -i eth0: bắt các gói tin TCP, port từ 20-21, vô hiệu hóa chụp nhanh dữ liệu (s0), ghi dữ liệu bắt được vào file ftp.pcap. Lệnh này ghi lại toàn bộ quá trình FTP conversation
  • tcpdump -r capture.pcap: đọc file pcap có sẵn

WireShark

Wireshark là một công cụ network monitoring dựa trên GUI đi kèm với một loạt các plugin và các tính năng khác có thể trợ giúp chỉ trong về bất kỳ lĩnh vực nào của an ninh mạng, từ thử nghiệm thâm nhập đến forensic. Wireshark cung cấp mã nguồn mở, sử dụng miễn phí và là một trong những công cụ phân tích gói tin tốt nhất hiện nay.

Giao diện đầu vào của Wireshark hiển thị 1 danh sách các interface để ta có thể lựa chọn và theo dõi:

Cửa sổ chính của Wireshark bao gồm:

  • Menu được sử dụng để bắt đầu các hành động.
  • Thanh công cụ chính cung cấp khả năng truy cập nhanh vào các mục thường dùng từ menu.
  • Thanh công cụ bộ lọc cho phép người dùng đặt bộ lọc hiển thị để lọc gói nào được hiển thị.
  • The packet list pane: hiển thị bản tóm tắt của mỗi gói tin bắt được. Bằng cách nhấp vào các gói trong ngăn này, bạn kiểm soát những gì được hiển thị trong hai ngăn còn lại.
  • The packet details pane: hiển thị chi tiết hơn về gói được chọn trong ngăn danh sách gói.
  • The packet bytes pane: hiển thị dữ liệu từ gói được chọn trong ngăn danh sách gói và đánh dấu phần được chọn trong ngăn chi tiết gói.
  • Thanh trạng thái hiển thị một số thông tin chi tiết về trạng thái chương trình hiện tại và dữ liệu đã thu thập

Thực hiện bắt 1 lưu lượng bất kỳ.

Ta có thể follow theo giao thức UDP, TCP. Như hình ở dưới ta có thể bắt được request gửi tới địa chỉ của 1 trang wordpress.

Tạm kết

Trên đây là những kiến thức cơ bản về mạng và cách theo dõi, kiểm soát lưu lượng mạng trong quá trình khai thác. Trong phần tiếp theo chúng ta sẽ đi tìm hiểu bước tiếp theo trong quá trình kiểm thử xâm nhập: Scanning

Bình luận

Bài viết tương tự

- vừa được xem lúc

Hành trình pass OSCP trong lần thi đầu tiên (2020)

Vào một chiều đông 17/12/2020, tôi nhận được cái email thông báo đã pass OSCP ngay lần thử đầu tiên. Sau đó, tôi bắt đầu tìm hiểu về Security và quyết định học cái gì đó cho riêng mình.

0 0 195

- vừa được xem lúc

Segmentation penetration testing for PCI compliance

Giới thiệu – tổng quan về Network Segmentation. Các phân đoạn mạng(Network segment) hiện là một phần của cơ sở hạ tầng của bất kỳ tổ chức hoặc doanh nghiệp nào.

0 0 40

- vừa được xem lúc

Cài đặt môi trường Pentest Android trên Windows (Phần 1)

Một trong số các vấn đề khó nhất với những ai muốn tìm hiểu về Kiểm thử xâm nhập ứng dụng Android (Pentesting Android applications) là cách cài đặt môi trường kiểm thử. Kiểm thử xâm nhập ứng dụng di đ

0 0 138

- vừa được xem lúc

Một vài mẹo mà mình sử dụng với Burp Suite

Tự sự. Chuyện là có mấy thằng em hỏi mình về cách sử dụng Burp Suite như thế nào, rồi có tips and tricks nào hay hay không cho chúng nó học, tiện đây mình cũng chia sẻ kinh nghiệm của một người sử dụn

0 0 120

- vừa được xem lúc

Cài đặt môi trường Pentest Android trên Windows (Phần 2)

Sau phần 1 của series thì chúng ta đã có được môi trường java, python và máy ảo Android rồi. Trong phần 2 này chúng ta sẽ tiến hành cài đặt môi trường trong máy ảo để hỗ trợ pentest, cụ thể là cài roo

0 0 65

- vừa được xem lúc

Một vài mẹo mà mình sử dụng với Burp Suite (phần 2)

Bài này là bài nối tiếp về một bài mà mình đã viết tại Một vài mẹo mà mình sử dụng với Burp Suite. Bài đầu tiên mình đã viết về một vài tips và trick mình hay sử dụng với Burp Suite mặc định rồi, bài

0 0 84