Masscan với hỗ trợ HTTPS

Mar 22 2022
Bởi Konstantin Molodyakov Masscan là một máy quét mạng nhanh, rất tốt để quét một loạt các địa chỉ IP và cổng. Chúng tôi đã điều chỉnh nó theo nhu cầu của mình bằng cách chỉnh sửa một chút.

Bởi Konstantin Molodyakov

Masscan là một trình quét mạng nhanh, rất tốt để quét một loạt các địa chỉ IP và cổng. Chúng tôi đã điều chỉnh nó theo nhu cầu của mình bằng cách chỉnh sửa một chút.

Điểm bất tiện lớn nhất trong phiên bản gốc là không thể thu thập các biểu ngữ từ máy chủ HTTPS. Và web hiện đại không có HTTPS là gì? Bạn thực sự không thể quét bất cứ thứ gì. Đó là những gì đã thúc đẩy chúng tôi sửa đổi masscan. Như thường lệ, một cải tiến nhỏ dẫn đến cải tiến khác, với một số lỗi được phát hiện trong quá trình thực hiện. Bây giờ chúng tôi muốn chia sẻ công việc của mình với cộng đồng. Tất cả các sửa đổi mà chúng ta sẽ nói đến đều đã có sẵn trong kho lưu trữ của chúng tôi trên GitHub .

Máy quét mạng dùng để làm gì

Máy quét mạng là một trong những công cụ phổ biến trong nghiên cứu an ninh mạng. Chúng tôi sử dụng chúng để giải quyết các nhiệm vụ như phân tích chu vi, quét lỗ hổng bảo mật, phát hiện lừa đảo và rò rỉ dữ liệu, phát hiện C&C và thu thập thông tin máy chủ.

Cách thức hoạt động của masscan

Trước khi nói về phiên bản tùy chỉnh, chúng ta hãy hiểu cách thức hoạt động của masscan gốc. Nếu bạn đã quen thuộc với nó, bạn có thể quan tâm đến việc lựa chọn các tùy chọn máy quét hữu ích. Hoặc chuyển thẳng đến phần “Các sửa đổi của chúng tôi đối với masscan.”

Dự án masscan nhỏ và, theo ý kiến ​​của chúng tôi, được viết một cách cẩn thận và logic. Thật tuyệt khi thấy rất nhiều nhận xét - ngay cả những thiếu sót và thiếu sót cũng được đánh dấu rõ ràng trong mã:

Về mặt logic, mã có thể được chia thành nhiều phần như sau:

  • triển khai các giao thức ứng dụng
  • triển khai ngăn xếp TCP
  • xử lý gói và luồng truyền
  • thực hiện các định dạng đầu ra
  • đọc gói tin thô

Thực hiện các giao thức ứng dụng

Masscan dựa trên một khái niệm mô-đun. Do đó, nó có thể hỗ trợ bất kỳ giao thức nào, tất cả những gì bạn cần là đăng ký cấu trúc thích hợp và chỉ định việc sử dụng nó ở mọi nơi bạn cần (ha-ha):

Đây là một chút mô tả về cấu trúc.

Tên giao thức và cổng tiêu chuẩn chỉ mang tính thông tin. Trường сtrl_flagskhông được sử dụng ở bất cứ đâu.

Hàm initkhởi tạo giao thức, parselà phương thức chịu trách nhiệm xử lý nguồn cấp dữ liệu đến và tạo ra các thông báo phản hồi, và cleanuplà chức năng dọn dẹp cho kết nối.

Hàm transmit_hellođược sử dụng để tạo gói hello nếu bản thân máy chủ không truyền tải thứ gì đó trước và dữ liệu từ hellotrường được sử dụng nếu hàm không được chỉ định.

Chức năng kiểm tra chức năng có thể được chỉ định trongselftest.

Thông qua cơ chế này, chẳng hạn, có thể viết các trình xử lý trong Lua (tùy chọn --script). Tuy nhiên, chúng tôi chưa bao giờ kiểm tra xem nó có thực sự hoạt động hay không. Điều chúng tôi gặp phải với masscan là hầu hết các tùy chọn thú vị không được mô tả trong tài liệu và bản thân tài liệu này nằm rải rác ở những nơi khác nhau, chồng chéo một phần. Một phần của cờ chỉ có thể được tìm thấy trong mã nguồn ( main-conf.c). Tùy --scriptchọn là một trong số chúng, và chúng tôi đã thu thập một số chức năng hữu ích và thú vị khác trong phần "Các tùy chọn hữu ích của máy quét khối gốc".

Triển khai ngăn xếp TCP

Một trong những lý do tại sao masscan rất nhanh và có thể xử lý nhiều kết nối đồng thời là việc triển khai nguyên gốc của ngăn xếp TCP *. Nó có khoảng 1.000 dòng mã trong tệp proto-tcp.c.

* Ngăn xếp TCP nguyên bản cho phép bạn bỏ qua các hạn chế của Hệ điều hành, không sử dụng tài nguyên Hệ điều hành, không sử dụng các cơ chế Hệ điều hành nặng hơn và rút ngắn đường dẫn xử lý gói

Xử lý gói và luồng truyền

Masscan nhanh và đơn luồng. Cụ thể hơn, nó sử dụng hai luồng cho mỗi giao diện mạng, một trong số đó là một luồng để xử lý các gói đến. Nhưng không ai thực sự chạy trên nhiều giao diện cùng một lúc.

Một chủ đề:

  1. đọc dữ liệu thô từ giao diện mạng.
  2. xử lý dữ liệu này bằng cách chạy nó thông qua ngăn xếp TCP và trình xử lý giao thức ứng dụng của riêng nó.
  3. tạo thành dữ liệu cần thiết được truyền đi.
  4. xếp chúng trong transmit_queue.
Hình 1. Sơ đồ truyền và xử lý gói

Thực hiện các định dạng đầu ra

Phần này về mặt khái niệm tương tự như việc triển khai các giao thức theo mô-đun: nó cũng có OutputTypecấu trúc chứa các chức năng tuần tự hóa chính. Có rất nhiều định dạng đầu ra có thể sử dụng: nhị phân tùy chỉnh , hiện đạiNDJSON , khó chịuXML và có thể chuyển thành tệp . Thậm chí còn có tùy chọn lưu dữ liệu vào Redis . Hãy cho chúng tôi biết trong phần bình luận nếu bạn đã thử :)

Một số định dạng tương thích với (hoặc, như tác giả của masscan đặt nó, lấy cảm hứng từ) các tiện ích tương tự, chẳng hạn như nmap và unicornscan .

Đọc gói tin thô

Masscan cung cấp khả năng làm việc với bộ điều hợp mạng thông qua thư viện PCAP hoặc PFRING và đọc dữ liệu từ PCAP dump. Tệp rawsock.cchứa một số hàm trừu tượng mã chính từ các giao diện cụ thể.

Để chọn PFRING, bạn phải sử dụng --pfringtham số và để cho phép đọc từ kết xuất, bạn phải đặt filetiền tố trên tên bộ điều hợp.

Các tùy chọn hữu ích của máy quét khối gốc

Chúng ta hãy xem xét một số tùy chọn thú vị và hữu ích của masscan ban đầu mà hiếm khi được nói đến.

Tùy chọn

  • --nmap, --help
    Mô tả : Trợ giúp
    Bình luận : Ngay cả khi được kết hợp, các tùy chọn này cũng cung cấp rất ít thông tin hữu ích. Tài liệu cũng chứa thông tin không đầy đủ và nằm rải rác trong các tệp khác nhau: README.md , man , FAQ . Ngoài ra còn có một HOWTO nhỏ về cách sử dụng máy quét cùng với AFL (lop mờ của Mỹ). Nếu bạn muốn biết về tất cả các tùy chọn, bạn có thể tìm thấy danh sách đầy đủ của chúng chỉ trong mã nguồn ( main-conf.c )
  • --output-format ndjson,, Mô tả : hỗ trợ Bình luận : Hàng Gigabyte của các tệp từng dòng dễ xử lý hơn nhiều Và đầu ra trạng thái ở định dạng rất hữu ích cho việc viết các tiện ích theo dõi hiệu suất quét khối lượng lớn -oD --ndjson-status
    NDJSON
    NDJSONJSON.NDJSON
  • --output-format redis
    Mô tả : Khả năng lưu kết quả đầu ra trực tiếp vào Redis
    Bình luận : Chà, tại sao không? :) Nếu bạn chưa làm việc với công cụ này, hãy đọc về nó tại đây
  • --range fe80::/67
    Mô tả : Hỗ trợ IPv6
    Bình luận : Mọi thứ đều rõ ràng ở đây, nhưng sẽ rất thú vị khi đọc về các trường hợp sử dụng thực tế trong các nhận xét. Tôi có thể nghĩ đến việc quét một mạng cục bộ hoặc chỉ một phạm vi nhỏ của một số quốc gia cụ thể có được thông qua BGP
  • --http-*
    Mô tả : Tùy chỉnh yêu cầu HTTP
    Nhận xét : Khi tạo một yêu cầu HTTP, bạn có thể thay đổi bất kỳ phần nào của nó để phù hợp với nhu cầu của mình: phương thức, URI, phiên bản, tiêu đề và / hoặc nội dung
  • --hello-[http, ssl, smbv1]
    Mô tả : Giao thức quét trên các cổng không chuẩn
    Nhận xét : Nếu masscan không nhận được gói hello từ đích, cài đặt mặc định của nó là gửi yêu cầu trước, chọn một giao thức dựa trên cổng của mục tiêu. Nhưng đôi khi bạn có thể muốn quét HTTP trên một số cổng không chuẩn
  • --resume
    Mô tả : Tạm dừng
    Bình luận : Masscan biết cách dừng lại một cách tế nhị và tiếp tục tại nơi nó đã tạm dừng. Với Ctrl+C (SIGINT)kết thúc masscan, lưu các tham số trạng thái và khởi động, đồng thời với --resumenó đọc dữ liệu đó và tiếp tục hoạt động
  • --rotate-size
    Mô tả : Xoay tệp đầu ra
    Chú thích: Đầu ra có thể chứa nhiều dữ liệu và tham số này cho phép bạn chỉ định kích thước tệp tối đa mà tại đó đầu ra sẽ bắt đầu được ghi vào tệp tiếp theo
  • --shard
    Mô tả : Chia tỷ lệ theo chiều ngang
    Nhận xét : Masscan giả thường xuyên chọn mục tiêu từ phạm vi được quét. Nếu bạn muốn chạy masscan trên nhiều máy trong cùng một phạm vi, bạn có thể sử dụng thông số này để đạt được phân phối ngẫu nhiên giống nhau ngay cả giữa các máy
  • --top-ports
    Mô tả : Quét N cổng phổ biến ( mảngtop_tcp_ports )
    Nhận xét : Tham số này đến từ nmap
  • --script
    Mô tả : Lua scripts
    Bình luận : Tôi nghi ngờ rằng nó hoạt động, nhưng khả năng chính nó là thú vị. Có ai sử dụng nó không? Hãy cho tôi biết nếu bạn có bất kỳ ví dụ thú vị nào
  • --vuln [heartbleed, ticketbleed, poodle, ntp-monlist]
    Mô tả : Tìm kiếm các lỗ hổng nhất định đã biết
    Bình luận : Chúng tôi không thể nói gì về tính đúng đắn và hiệu quả của nó, vì cơ chế phát hiện lỗ hổng này là một loại kunk nằm rải rác trong mã và xung đột với nhiều tùy chọn khác, và chúng tôi không phải áp dụng nó trong nhiệm vụ thực tế

Các sửa đổi của chúng tôi đối với masscan

Chúng tôi đã thêm hỗ trợ HTTPS

Ngày nay, Internet là một pháo đài, ngay cả những kẻ lừa đảo lạc hậu nhất cũng đã từ bỏ HTTP không được mã hóa. Do đó, sẽ khá bất tiện nếu không hỗ trợ HTTPS - tính năng này giúp việc điều tra, chẳng hạn như tìm kiếm máy chủ C&C và lừa đảo, dễ dàng hơn nhiều. Có những công cụ khác ngoài masscan, nhưng chúng chậm hơn. Chúng tôi muốn có một công cụ toàn cầu bao gồm HTTPS mà vẫn nhanh chóng.

Điều đầu tiên cần làm là triển khai SSL chính thức. Những gì masscan ban đầu có là khả năng gửi một gói hello được xác định trước, sau đó tìm nạp và xử lý chứng chỉ máy chủ. Phiên bản của chúng tôi có thể thiết lập và duy trì kết nối SSL và phân tích nội dung của các giao thức lồng nhau, có nghĩa là nó có thể thu thập các biểu ngữ HTTP từ máy chủ HTTPS.

Đây là cách chúng tôi đạt được điều đó. Chúng tôi đã thêm một giao thức lớp ứng dụng mới vào mã nguồn và sử dụng giải pháp tiêu chuẩn, OpenSSL, để triển khai SSL. Ở đây, chúng tôi cần thực hiện một số tinh chỉnh và cấu trúc mô tả giao thức lớp ứng dụng trong máy quét tùy chỉnh trông giống như sau:

Chúng tôi đã thêm các trình xử lý để phá vỡ giao thức, khởi tạo kết nối và mở rộng tập hợp các tham số của trình xử lý. Kết quả là, có thể xử lý các giao thức lồng nhau. Chúng tôi cũng đã quản lý để thực hiện thay đổi trình xử lý giao thức ứng dụng một cách chính xác hơn. Nó là cần thiết khi không thể xử lý dữ liệu với giao thức hiện tại hoặc nếu cơ chế đó được nhúng vào chính giao thức, ví dụ, khi sử dụng STARTTLS.

Sau đó, chúng tôi gặp một số vấn đề về hiệu suất và mất gói. SSL ảnh hưởng nặng nề đến CPU. Chúng tôi có tùy chọn để thử một cái gì đó nhanh hơn OpenSSL, nhưng chúng tôi đã đi theo hướng xử lý các gói đến theo một số luồng trong một giao diện mạng. Sau khi thực hiện điều này, đường ống xử lý gói trông giống như sau:

Hình 2. Sơ đồ truyền và xử lý gói cập nhật

Luồng th_recv_readcần thiết để đọc dữ liệu từ giao diện mạng bất kể tốc độ xử lý dữ liệu. Hàng q_recv_pbđợi giúp phát hiện các trường hợp tốc độ truyền dữ liệu quá cao, không thể xử lý kịp thời các gói tin gửi đến. Luồng th_recv_schedgửi thông báo dựa trên các băm của địa chỉ IP gửi đi và đến và các cổng tới các tiểu trình th_recv_hdl_*để cùng một kết nối rơi vào cùng một trình xử lý. Các tùy chọn liên quan đến chức năng này là --num-handle-threads— số lượng luồng xử lý và --tranquility—để tự động giảm tốc độ truyền gói khi các gói đến không thể được xử lý đủ nhanh.

Hỗ trợ HTTPS được bật với tham số --dynamic-ssltrong khi --output-filename-ssl-keyscó thể được sử dụng để lưu khóa chính.

Bạn cũng có thể nhận thấy một cải tiến nhỏ về mặt thẩm mỹ - cụ thể là tên của các sợi chỉ. Trong phiên bản của chúng tôi, nó đã trở nên rõ ràng những luồng nào sử dụng tài nguyên:

Trước
Sau

Chúng tôi đã cải thiện chất lượng mã

Masscan bị phát hiện có nhiều điều kỳ lạ và sai sót. Ví dụ: việc chuyển đổi thời gian thành tích tắc ** như sau:

** Một đơn vị đo thời gian có đủ độ chính xác và không chiếm quá nhiều dung lượng

Kết nối TCP mạng thường được xử lý không chính xác, dẫn đến kết nối bị hỏng và truyền lặp lại không cần thiết:

Hình 3. Ví dụ về việc xử lý sai các kết nối TCP mạng

Chúng tôi cũng phát hiện ra các lỗi trong xử lý bộ nhớ, bao gồm cả rò rỉ bộ nhớ. Chúng tôi đã cố gắng sửa nhiều lỗi trong số đó, nhưng không phải tất cả. Ví dụ, khi quét /0:80, chúng tôi thấy một rò rỉ của một số phạm vi 2 byte mỗi.

Những lỗi này được phát hiện nhờ các đồng nghiệp của chúng tôi, những người đã sử dụng tỉ mỉ các phát triển của chúng tôi, bộ phân tích tĩnh (GCC, Clang và VS), UB và chất khử trùng bộ nhớ. Riêng tôi, tôi muốn gửi lời cảm ơn đến PVS-Studio. Những kẻ đó là vô song về chất lượng và sự tiện lợi.

Chúng tôi đã thêm một bản dựng cho các hệ điều hành khác nhau

Để hợp nhất các kết quả đầu ra, chúng tôi đã viết một bản dựng và thử nghiệm cho Windows, Linux và macOS bằng GitHub Actions.

Đường ống xây dựng trông như thế này (Hình 4):

  • kiểm tra định dạng
  • kiểm tra máy phân tích tiếng kêu tĩnh
  • gỡ lỗi lắp ráp với chất khử trùng và chạy các thử nghiệm tích hợp
  • lắp ráp và gửi dữ liệu đến các dịch vụ SonarCloud và CodeQL
  • Hình 4. Đường ống lắp ráp
Hình 5. Giải phóng hiện vật

Chúng tôi đã thêm một vài tính năng khác

Dưới đây là phần còn lại của những thứ ít quan trọng hơn đã được giới thiệu trong phiên bản của chúng tôi:

  • --regex(--regex-only-banners)là lọc thông báo mức dữ liệu trong TCP. Một biểu thức chính quy được áp dụng cho nội dung của mỗi gói TCP. Nếu biểu thức chính quy được kích hoạt, thông tin kết nối sẽ có trong đầu ra.
  • --dynamic-set-hostđược sử dụng để nhập tiêu đề hostvào một yêu cầu HTTP. Địa chỉ IP của mục tiêu đang được quét được lấy làm giá trị.
  • Đầu ra của kích hoạt chữ ký nội bộ trên các giao thức quét khối trong đầu ra.
  • Một tùy chọn để chỉ định URI trong các yêu cầu HTTP. Chúng tôi đã xóa nó sau đó vì tác giả của máy quét khối gốc đã thêm chức năng tương tự. Đây là một phần của họ --http-*tùy chọn.

© Copyright 2021 - 2023 | vngogo.com | All Rights Reserved