From b4a924cf243aa65be2ef92359234581cadc4a7fb Mon Sep 17 00:00:00 2001 From: Vlad Kamerdinerov <61966975+v-kamerdinerov@users.noreply.github.com> Date: Sun, 27 Oct 2024 21:10:04 +0300 Subject: [PATCH] Add top and num parameters, docs (#1) * Add top and num IPs configuration * Docs --- .github/workflows/lint.yml | 3 +- README-RU.md | 163 +++++++++++++++++++++++++++++++++++++ README.md | 42 ++++++---- install-go.sh | 56 +++++++++++-- main.go | 21 ++--- 5 files changed, 254 insertions(+), 31 deletions(-) create mode 100644 README-RU.md mode change 100644 => 100755 install-go.sh diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 7f3ea85..33c57fe 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,8 +1,9 @@ -name: lint +name: Lint on: push: branches: - main + - dev pull_request: env: diff --git a/README-RU.md b/README-RU.md new file mode 100644 index 0000000..1cce24a --- /dev/null +++ b/README-RU.md @@ -0,0 +1,163 @@ + +# SNI Finder + +![GitHub CI Status](https://github.com/v-kamerdinerov/SNI-Finder/actions/workflows/lint.yml/badge.svg) +![GitHub CI Status](https://github.com/v-kamerdinerov/SNI-Finder/actions/workflows/release.yml/badge.svg) +![GitHub](https://img.shields.io/github/license/v-kamerdinerov/SNI-Finder) +[![GitHub tag](https://img.shields.io/github/tag/v-kamerdinerov/SNI-Finder.svg)](https://github.com/v-kamerdinerov/SNI-Finder/tags) + +---- + +

+ + English + + / + + Русский + +

+ +Это приложение сканирует диапазон IP-адресов на наличие доменов с включенными TLS 1.3 и HTTP/2 (h2). Оно предназначено для определения полезных SNI (Server Name Indication) доменов для различных конфигураций и тестов. + +## Оглавление +- [Особенности](#Особенности) +- [Установка](#Установка) +- [Использование](#Использование) + - [Запуск на Linux/Mac OS](#Запуск-в-LinuxMac-OS) + - [Запуск на Windows](#Запуск-под-Windows) +- [Параметры](#Параметры) +- [Пример вывода](#Пример-вывода) +- [Сборка из исходников](#Сборка-из-исходного-кода) + - [Пререквизиты](#Пререквизиты) + - [Шаги сборки](#Шаги-сборки) +- [Этика использования](#Этика-использования) +- [Вклад](#Вклад) +- [Лицензия](#Лицензия) + +## Особенности + +| Характеристика | Описание | +|--------------------------|-------------------------------------------------------------------------------------------------------------------| +| **TLS 1.3 и HTTP/2** | Сканирует домены, поддерживающие TLS 1.3 и HTTP/2, чтобы определить современные безопасные конфигурации. | +| **Отображение TLS Ping** | Показывает результаты TLS Ping для просканированных доменов, помогая оценить время отклика. | +| **Топ-серверы** | Выводит топ-серверы на основе наименьших значений пинга, что полезно для определения приоритета быстрых серверов. | + +### Выходные файлы +- `results.txt`: Содержит подробный журнал сканирования. +- `domains.txt`: Содержит только обнаруженные доменные имена. + +> **Примечание:** Рекомендуется запускать этот сканер локально _(с вашим домашним интернетом)_. Запуск сканера в облаке может привести к тому, что VPS-провайдеры пометят ваш аккаунт как подозрительный. + +## Установка + +Загрузите исполняемый файл, соответствующий архитектуре вашей системы (`amd64` или `arm64`). + +## Использование + +### Запуск в Linux/Mac OS + +1. Скачайте и установите бинарник: + ```bash + wget «https://github.com/v-kamerdinerov/SNI-Finder/releases/latest/download/SNI-Finder-$(uname -s | tr A-Z a-z)-amd64» -O SNI-Finder && chmod +x SNI-Finder + ``` +2. Запустите сканер: + ```bash + ./SNI-Finder -addr + ``` + +### Запуск под Windows + +1. Загрузите `.exe` файл с сайта [Releases](https://github.com/v-kamerdinerov/SNI-Finder/releases/latest). +2. Откройте `CMD` или `Powershell` в директории загрузки. +3. Запустите сканер: + ```cmd + .\SNI-Finder-windows-amd64.exe -addr + ``` + +> Замените `` на диапазон IP-адресов, который вы хотите просканировать. + +## Параметры + +| Аргумент | Тип | Значение по умолчанию | Описание | +|-------------|--------|-----------------------|--------------------------------------------------------------| +| `-addr` | string | `0.0.0.0` | Начальный адрес для сканирования. | +| `-num` | int | `10000` | Количество IP-адресов для сканирования. | +| `-o` | bool | `true` | Включить или отключить вывод в файл `results.txt`. | +| `-port` | string | `443` | Порт для сканирования. | +| `-showFail` | bool | `false` | Показать логи для неудачных сканирований. | +| `-thread` | int | `128` | Количество потоков для параллельной работы при сканировании. | +| `-timeOut` | int | `4` | Таймаут сканирования в секундах. | +| `-top` | int | `10` | Количество отображаемых наилучших серверов. | + +## Пример вывода + +Вот пример вывода программы: + +``` +2024-09-08 22:25:49 37.139.62.38:443 TLS v1.3 ALPN: h2 pixelproof.ru Ping: 22.315ms + +2024-09-08 22:25:51 37.139.62.151:443 TLS v1.3 ALPN: h2 maelia.rs Ping: 34.011ms + +2024-09-08 22:25:51 37.139.62.192:443 TLS v1.3 ALPN: h2 doterra-challenge.ru Ping: 22.68ms + +2024-09-08 22:28:06 Scan completed. + +Top servers by TLS Ping: +1: 37.139.41.28:443 TLS v1.3 ALPN: h2 jsdaddy.tech Ping: 3.121ms +2: 37.139.42.255:443 TLS v1.3 ALPN: h2 malyi-biznes.ru Ping: 3.496ms +3: 37.139.42.35:443 TLS v1.3 ALPN: h2 88date.co Ping: 3.797ms +4: 37.139.41.247:443 TLS v1.3 ALPN: h2 you-note.ru Ping: 3.804ms +5: 37.139.43.113:443 TLS v1.3 ALPN: h2 medvuza.ru Ping: 4.029ms +6: 37.139.40.192:443 TLS v1.3 ALPN: h2 xn--8f9ac.xn--p1ai Ping: 9.772ms +7: 37.139.42.68:443 TLS v1.3 ALPN: h2 mega74.ru Ping: 11.621ms +8: 37.139.62.38:443 TLS v1.3 ALPN: h2 pixelproof.ru Ping: 22.315ms +9: 37.139.62.192:443 TLS v1.3 ALPN: h2 doterra-challenge.ru Ping: 22.68ms +10: 37.139.62.151:443 TLS v1.3 ALPN: h2 maelia.rs Ping: 34.011ms +``` + +## Сборка из исходного кода + +### Пререквизиты + +Установите `wget`: +```bash +sudo apt install -y wget +``` + +Запустите этот скрипт для установки Go и других зависимостей _(Debian & Ubuntu & RedOS $ RHEL)_: +```bash +wget «https://raw.githubusercontent.com/v-kamerdinerov/SNI-Finder/main/install-go.sh» -O install-go.sh && chmod +x install-go.sh && bash install-go.sh +``` +> **Совет:** После установки рекомендуется перезагрузить систему. + +### Шаги сборки + +1. Клонируем репозиторий: + ```bash + git clone https://github.com/v-kamerdinerov/SNI-Finder.git + ``` +2. Перейдите в каталог репозитория: + ```bash + cd SNI-Finder + ``` +3. Скачайте и установите все необходимые пакеты: + ```bash + go mod tidy + ``` +4. Соберите проект: + ```bash + CGO_ENABLED=0 go build + ``` + +## Этика использования + +Данный инструмент предназначен только для образовательных и легальных целей тестирования. Несанкционированное сканирование сетей без разрешения может нарушить законы и привести к серьезным наказаниям. Пользуйтесь ответственно. + +## Вклад + +Вклад приветствуется! Пожалуйста, сделайте форк репозитория и отправьте запрос на исправление. Убедитесь, что ваш код придерживается существующего стиля и тщательно протестирован. + +## Лицензия + +Этот проект лицензируется по лицензии MIT. Подробности смотрите в файле [LICENSE](LICENSE). diff --git a/README.md b/README.md index 0e3be01..f4c8416 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,18 @@ ![GitHub](https://img.shields.io/github/license/v-kamerdinerov/SNI-Finder) [![GitHub tag](https://img.shields.io/github/tag/v-kamerdinerov/SNI-Finder.svg)](https://github.com/v-kamerdinerov/SNI-Finder/tags) +---- + +

+ + English + + / + + Русский + +

+ This app scans a range of IP addresses for domains with TLS 1.3 and HTTP/2 (h2) enabled. It is designed to identify useful SNI (Server Name Indication) domains for various configurations and tests. ## Table of Contents @@ -15,21 +27,21 @@ This app scans a range of IP addresses for domains with TLS 1.3 and HTTP/2 (h2) - [Run on Linux/Mac OS](#run-on-linuxmac-os) - [Run on Windows](#run-on-windows) - [Parameters](#parameters) +- [Example Output](#example-output) - [Building from Source](#building-from-source) - [Prerequisites](#prerequisites) - [Build Steps](#build-steps) -- [Example Output](#example-output) - [Ethical Usage](#ethical-usage) - [Contribution](#contribution) - [License](#license) ## Features -| Feature | Description | -|---------------------|----------------------------------------------------------| -| **TLS 1.3 and HTTP/2** | Scans for domains supporting TLS 1.3 and HTTP/2 to identify modern, secure configurations. | -| **TLS Ping Display** | Shows TLS Ping results for the scanned domains, helping assess response times. | -| **Top Servers** | Outputs the top servers based on the lowest ping values, useful for prioritizing fast servers. | +| Feature | Description | +|------------------------|------------------------------------------------------------------------------------------------| +| **TLS 1.3 and HTTP/2** | Scans for domains supporting TLS 1.3 and HTTP/2 to identify modern, secure configurations. | +| **TLS Ping Display** | Shows TLS Ping results for the scanned domains, helping assess response times. | +| **Top Servers** | Outputs the top servers based on the lowest ping values, useful for prioritizing fast servers. | ### Output Files - `results.txt`: Contains the detailed scan log. @@ -67,14 +79,16 @@ Download the appropriate binary for your system architecture (`amd64` or `arm64` ## Parameters -| Argument | Type | Default Value | Description | -|----------------|---------|---------------|-----------------------------------------------------| -| `-addr` | string | `0.0.0.0` | The starting address for the scan. | -| `-port` | string | `443` | The port to scan. | -| `-thread` | int | `128` | The number of threads to run in parallel for scanning. | -| `-o` | bool | `true` | Enable or disable output to the `results.txt` file. | -| `-timeOut` | int | `4` | The scan timeout in seconds. | -| `-showFail` | bool | `false` | Show logs for failed scans. | +| Argument | Type | Default Value | Description | +|-------------|--------|---------------|--------------------------------------------------------| +| `-addr` | string | `0.0.0.0` | The starting address for the scan. | +| `-num` | int | `10000` | The number of IPs to scan. | +| `-o` | bool | `true` | Enable or disable output to the `results.txt` file. | +| `-port` | string | `443` | The port to scan. | +| `-showFail` | bool | `false` | Show logs for failed scans. | +| `-thread` | int | `128` | The number of threads to run in parallel for scanning. | +| `-timeOut` | int | `4` | The scan timeout in seconds. | +| `-top` | int | `10` | The number of top servers to display. | ## Example Output diff --git a/install-go.sh b/install-go.sh old mode 100644 new mode 100755 index aea588e..d0ec084 --- a/install-go.sh +++ b/install-go.sh @@ -1,16 +1,56 @@ #!/bin/bash +FontColor_Red="\033[31m" +FontColor_Green="\033[32m" +FontColor_Yellow="\033[33m" +FontColor_Suffix="\033[0m" + + +log() { + local LEVEL="$1" + local MSG="$2" + case "${LEVEL}" in + INFO) + local LEVEL="[${FontColor_Green}${LEVEL}${FontColor_Suffix}]" + local MSG="${LEVEL} ${MSG}" + ;; + WARN) + local LEVEL="[${FontColor_Yellow}${LEVEL}${FontColor_Suffix}]" + local MSG="${LEVEL} ${MSG}" + ;; + ERROR) + local LEVEL="[${FontColor_Red}${LEVEL}${FontColor_Suffix}]" + local MSG="${LEVEL} ${MSG}" + ;; + *) ;; + esac + echo -e "${MSG}" +} + + # Function to check if the script is being run as root check_root() { if [ "$EUID" -ne 0 ]; then echo - echo "Please run this script as root." + log ERROR "Please run this script as root." echo sleep 1 exit 1 fi } +# Function to check if golang is installed +check_go() { + if command -v go > /dev/null; then + log INFO "Golang installed!" + go version + sleep 1 + exit 0 + else + log WARN "Golang not found. Proceed..." + fi +} + # Function to install dependencies based on package manager install_package() { # Detect package manager @@ -19,12 +59,12 @@ install_package() { elif command -v yum > /dev/null; then PKG_MANAGER="yum" else - echo "Unsupported package manager. Exiting." + log ERROR "Unsupported package manager. Exiting." exit 1 fi echo - echo "Updating the OS and installing dependencies..." + log WARN "Updating the OS and installing dependencies..." echo sleep 0.5 @@ -39,7 +79,7 @@ install_package() { fi echo - echo "OS Updated & Dependencies Installed." + log WARN "OS Updated & Dependencies Installed." echo sleep 0.5 } @@ -48,7 +88,7 @@ install_package() { install_go() { local go_version="go1.21.0" echo - echo "Installing Go $go_version..." + log WARN "Installing Go $go_version..." echo sleep 0.5 local go_url="https://go.dev/dl/$go_version.linux-amd64.tar.gz" @@ -80,13 +120,17 @@ install_go() { sleep 0.5 echo - echo "Go $go_version installed successfully." + log INFO "Go $go_version installed successfully." echo } + # Check if running as root check_root +# Check if golang installed +check_go + # Install dependencies for Go and Git install_package diff --git a/main.go b/main.go index c5480e4..1bd346b 100644 --- a/main.go +++ b/main.go @@ -65,12 +65,14 @@ func main() { addrPtr := flag.String("addr", defaultAddress, "The starting address for the scan") portPtr := flag.String("port", defaultPort, "The port to scan") threadPtr := flag.Int("thread", defaultThreadCount, "The number of threads to run in parallel for scanning") + topCountPtr := flag.Int("top", defaultTopServers, "The number of top servers to display") + numIPsToCheckPtr := flag.Int("num", defaultNumIPsToCheck, "The number of IPs to scan") outPutFile := flag.Bool("o", outPutDef, "Is output to results.txt") timeOutPtr := flag.Int("timeOut", defaultTimeout, "The scan timeout in seconds") showFailPtr := flag.Bool("showFail", showFailDef, "Show logs for failed scans") flag.Parse() - scanner := newScanner(*addrPtr, *portPtr, *threadPtr, *timeOutPtr, *outPutFile, *showFailPtr) + scanner := newScanner(*addrPtr, *portPtr, *threadPtr, *timeOutPtr, *outPutFile, *showFailPtr, *numIPsToCheckPtr) defer scanner.logFile.Close() defer scanner.domainFile.Close() @@ -78,15 +80,15 @@ func main() { go scanner.logWriter() // Start the worker pool - scanner.startWorkers() + scanner.startWorkers(*numIPsToCheckPtr) log.Info("Scan completed.") // Choice best servers - findTopServers(outPutFileName) + findTopServers(outPutFileName, *topCountPtr) } -func newScanner(addr, port string, threadCount, timeout int, output, showFail bool) *Scanner { +func newScanner(addr, port string, threadCount, timeout int, output, showFail bool, numIPsToCheckPtr int) *Scanner { scanner := &Scanner{ addr: addr, port: port, @@ -96,7 +98,7 @@ func newScanner(addr, port string, threadCount, timeout int, output, showFail bo numberOfThread: threadCount, ip: net.ParseIP(addr), dialer: &net.Dialer{}, - logChan: make(chan string, defaultNumIPsToCheck), + logChan: make(chan string, numIPsToCheckPtr), } log.SetFormatter(&CustomTextFormatter{}) @@ -116,14 +118,14 @@ func newScanner(addr, port string, threadCount, timeout int, output, showFail bo return scanner } -func (s *Scanner) startWorkers() { - ipChan := make(chan net.IP, defaultNumIPsToCheck) +func (s *Scanner) startWorkers(numIPsToCheckPtr int) { + ipChan := make(chan net.IP, numIPsToCheckPtr) for i := 0; i < s.numberOfThread; i++ { go s.worker(ipChan) } - for i := 0; i < defaultNumIPsToCheck; i++ { + for i := 0; i < numIPsToCheckPtr; i++ { nextIP := s.nextIP(true) if nextIP != nil { s.wg.Add(1) @@ -349,7 +351,7 @@ func (f *CustomTextFormatter) Format(entry *logrus.Entry) ([]byte, error) { return []byte(formattedEntry), nil } -func findTopServers(fileName string) { +func findTopServers(fileName string, topCount int) { file, err := os.Open(fileName) if err != nil { log.Fatalf("Failed to open %s for reading: %v", fileName, err) @@ -399,7 +401,6 @@ func findTopServers(fileName string) { }) // Determine the number of servers to display - topCount := defaultTopServers if len(servers) < topCount { topCount = len(servers) }