Изображение на Джейми Макланен

Как да скриете портовете си с чукане на порт

Много от нас, особено системните / мрежовите администратори, често оставят ssh порта 22 отворен за отдалечен достъп до системата. Това оставя врата на хакерите да се опитат да се промъкнат в системата. Потребител, който не е легитимен, може просто да насилва системата да се свърже към отворения ssh порт. Един от начините за решаване на проблема в горния сценарий е да скриете ssh порта (или който и да е друг), използвайки механизма за чукване на порт. В тази статия ще ви покажа как да реализирате чукване на портове с помощта на iptables.

iptables е полезна програма, която позволява на системните администратори да конфигурират таблиците, предоставени от защитната стена на Linux ядрото.

Забележка: В случай, че искате правилата за ipv6, можете да използвате ip6tables, за да създадете правила за защитната стена. Заинтересованите читатели могат да разгледат и nftables, която е подобрена версия на iptables и се очаква да я замени в бъдеще. Уверете се, че имате инсталирани iptables във вашата система.

Две системи, които се използват:
Сървър 172.31.75.10 (Ubuntu)
Клиент: 172.31.72.153 (Kali Linux)

Избиването на порта е механизъм за отваряне на затворен порт на система в защитна стена чрез опит за свързване към някои предварително дефинирани затворени портове. Помислете за случая на ssh порт. Първоначално порт номер 22 ще бъде затворен и никой няма да може да установи връзка с него. Ще има правила на защитната стена, уточняващи, че само след като някои портове, да речем 8000, 8001 и 8002, бъдат почукани, ssh порт ще бъде отворен. Посочените номера на портове също са затворени.

За този урок ще следваме дадената последователност: 5678, 5984 и 6357. За предпочитане е изборът на портове да е възможно най-неясен. Ще разгледаме повече по-късно в публикацията. Първоначално таблицата е празна и може да бъде проверена с помощта на следната команда.

$ sudo iptables -L

Преди да започнем да видим състоянието на отворените портове с помощта на nmap. Както можете да видите на снимката по-долу, че сканирането на сървъра показва отворени четири порта, а именно 22, 80, 443 и 8000. До края на портала номер 22 на урока няма да бъде показан отворен от nmap. Питон SimpleHTTPServer работи на порт номер 8000.

Резултат от сканиране на сървъра, преди да бъдат зададени правила в защитната стена

Логическо проектиране на пристанището чукане

Първо, искаме защитната ни стена да приеме целия трафик, който не е обект на чукване на порта. Това ще включва целия трафик на уеб сървъра (за номера на порта 80, 443 и 8000).
След това трябва да препратим останалия трафик към нова верига, която ще се справи с чукането на порта. Нека да наречем тази верига СТЕННА. След това трябва да маркираме IP адресите, които се опитват да се свържат с първия легален порт. Ще ни трябва правило, което ще провери дали второто попадение е на второто правно пристанище. Ако е, тогава задаваме друг флаг, който ще показва, че два порта са чукнали правилно. В случай че второто чукване е грешно, ние изпускаме пакета и флагът се нулира. По подобен начин и други вериги ще работят по същата стратегия за проверка на подходящия флаг и предаването му, ако той продължи по правилния път. В крайна сметка, ако IP адресът правилно удари портовете в последователност, ssh портът е изложен, той ще бъде изложен на него. За предпочитане е ssh демонът да бъде изложен само за кратък период от време, което позволява IP адреса да се свърже.
Логично имаме три врати, всяка от които изисква едно чукване, за да позволи IP адрес да се свърже към работещата услуга. Това означава, че има четири различни състояния за искане на IP адрес:

  • начално състояние: Всички IP адреси първоначално ще бъдат в това състояние, освен ако не са ударили правилно първия порт. В нашия случай пристанището е 5678.
  • състояние auth1: IP адресите, които са правилно попаднали на първия порт, ще бъдат маркирани с to auth1.
  • състояние auth2: Ако IP адрес е маркиран с auth2, това означава, че IP адресът правилно е чукнал втория порт. Следващият пакет от това състояние ще определи дали да зададете флага на първоначален или auth3 за IP адреса.
  • състояние auth3: Всички IP адреси, които са маркирани auth3, успешно са чукнали трите порта в правилния ред. Всеки IP адрес с този флаг е позволен да се свърже към ssh порта.

Необходими са четири различни вериги, както следва:

  • GATE1: Определя дали адресът в първоначалното състояние трябва да бъде маркиран като „auth1“.
  • GATE2: Определя дали даден адрес в състояние „auth1“ трябва да бъде обработен до „auth2“ или да се върне в „първоначално“ състояние.
  • GATE3: Определя дали адресът в състояние „aut2“ трябва да бъде маркиран като „auth3“, за да позволи SSH връзка или да се върне до „първоначалното“ състояние.
  • PASSED: Тази верига отваря порта за SSH връзка за законни клиенти.

Изцапайте ръцете си

Винаги е добре да практикувате настройките по подразбиране в празна таблица да са „ACCEPT“, за да се поддържат текущите връзки. След това трябва да промием съществуващите правила за защитна стена и да стартираме защитната стена свежа.

$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P НАПРЕД, ПРИЕМАНЕ
$ sudo iptables -P ИЗХОД НА ПРИЕМАНЕ
$ sudo iptables -F

Въведете следните команди, за да създадете допълнителни вериги, които ще използваме:

$ sudo iptables -N WALL
$ sudo iptables -N KNOCK1
$ sudo iptables -N KNOCK2
$ sudo iptables -N KNOCK3
$ sudo iptables -N PASSED

След въвеждането на тези команди имаме отворена защитна стена, която ще ограничим. Трябва да има осем различни вериги в защитната стена. Можете да ги поставите отново, като въведете следната команда:

$ sudo iptables -L

Това ще изброява всички вериги и правила.
Както вече говорихме, трябва да обработваме трафика, който не принадлежи на пристанищната част. Трябва да добавим правила за това във веригата INPUT. Опитайте следните команди:

$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT

Първата команда ще позволи на устройството да приема всички връзки от локалната машина, тъй като различните услуги и приложения често трябва да комуникират помежду си. Втората и третата команда позволява трафик за портове (http и https), работещи с уеб сървъра. Четвъртата команда е, защото оставих python SimpleHTTPServer да работи.
Всички тези команди позволяват основни връзки и вече можем да прехвърлим оставащия трафик към веригата WALL.

$ sudo iptables -A INPUT -j WALL

Конфигуриране на трите вериги KNOCK

$ sudo iptables -A KNOCK1 -p tcp --dport 5678 -m скорошно - име AUTH1 --set -j DROP
$ sudo iptables -A KNOCK1 -j DROP
$ sudo iptables -A KNOCK2 -m скорошно име - AUTH1 --ремонтиране
$ sudo iptables -A KNOCK2 -p tcp --dport 5984 -m скорошно - име AUTH2 --set -j DROP
$ sudo iptables -A KNOCK2 -j KNOCK1
$ sudo iptables -A KNOCK3 -m скорошно име - AUTH2 --ремонтиране
$ sudo iptables -A KNOCK3 -p tcp --dport 6357 -m скорошно - име AUTH3 --set -j DROP
$ sudo iptables -A KNOCK3 -j KNOCK1

Преминалата верига

$ sudo iptables -A PASSED -m скорошно - име AUTH3 --ремонтиране
$ sudo iptables -A PASSED -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A PASSED -j KNOCK1

Конфигуриране на WALL Chain

$ sudo iptables -A WALL -m скорошно --проверка --секунди 30 - име AUTH3 -j ПЪТЕН
$ sudo iptables -A WALL -m скорошно - проверка --секунди 10 - име AUTH2 -j KNOCK3
$ sudo iptables -A WALL -m скорошно --проверка --секунди 10 - име AUTH2 -j KNOCK2
$ sudo iptables -A WALL -j KNOCK1

След като приключите с всички команди, списъкът ви с iptables трябва да изглежда така:

Всички вериги с пълни правила на защитната стена

Имам скрипта на всички команди и съм предал номерата на портовете като аргументи от командния ред. Това ми позволява да променя номера на порта без да променя кода. Можете да намерите целия скрипт тук.

Сега е време да тестваме защитната стена. Първо трябва да намерите начин да ударите правилно портовете. За това можете да използвате nmap, hping или всичко, което ви е удобно. С nmap можете да направите нещо подобно.

nmap -Pn --host_timeout 201 - max-retries 0 -p портNumber sshServer

Можете просто да натиснете 3 порта с тази линия:

$ за х през 5678 5984 6357; направете nmap -Pn --host-timeout 201 - max-retries 0 -p $ x 172.31.75.10 && сън 1; Свършен
$ ssh [email protected]
Успешна връзка със затворения ssh порт

Както можете да видите от горното изображение, че можете да се свържете с друга система, използвайки ssh услугата.

Изборът на номера на портове е важен аспект, когато става въпрос за внедряване на чукване на портове. Много пъти хората често използват предсказуеми номера на портове като 1111, 2222 и 3333; или 1234, 2345, 3456. Справедливото количество време и добри предположения позволяват на хакерите да нахлуят в първия слой на отбраната. През повечето време се установява, че последователността на номерата на портовете се увеличава. За да увеличите несигурността, можете да изберете номерата на портовете по ред като: 6547, 2385, 5875; или нещо подобно.

Друга употреба на Port Knocking

Често оставям системата си с HTTP файлов сървър на python отворена. Това ми позволява отдалечен достъп до моите файлове отвсякъде. Един от начините да се уверите, че никой друг няма достъп до съдържанието ми, за да реализира чукване на порт в защитната стена на системата ми. Друг начин да направите това е добавяне на слой за удостоверяване, като този. Ще препоръчам да се използват и двата механизма за защита, повишаващи поверителността на вашето съдържание.

За да направим правилата на защитната стена устойчиви, трябва да инсталираме друг пакет в сървъра:

$ sudo apt - получите инсталиране на устойчиви iptables
Устойчив старт на $ sudo услуга iptables

Допълнителни връзки за допълнително четене

  1. http://www.microhowto.info/howto/implement_port_knocking_using_iptables.html
  2. https://www.digitalocean.com/community/tutorials/how-to-use-port-knocking-to-hide-your-ssh-daemon-from-attackers-on-ubuntu