Представлен (https://nullprogram.com/blog/2019/03/22/) проект Endlessh (https://github.com/skeeto/endlessh), в рамках которого подготовлен простой фиктивный SSH-сервер, который пытается максимально долго удерживать установленные соединения открытыми на начальной стадии подключения к SSH-серверу. Endlessh может использоваться для затруднения работы различных вредоносных систем, постоянно перебирающих пароли.Суть борьбы с данными системами в удержании одного соединения, не позволяя ему завершиться по таймайту, и, соответственно, временно блокируя проведения перебора для текущего хоста. Например, Endlessh можно запустить на 22 сетевом порту, а реальный SSH-сервер переместить на другой сетевой порт. Приложение обрабатывает лишь начальную стадию обмена данными, на этапе до аутентификации, поэтому очень просто в реализации и потребляет минимальные ресурсы в процессе работы.
Для предотвращения обрыва соединения по таймауту используется особенность протокола SSH, который допускает отправку сервером произвольного числа строк с информацией о сервере до вывода строки "SSH-", сигнализирующей о начале обмена данными для аутентификации. После подключения к Endlessh он периодически отправляет клиенту случайные строки без вывода приглашения "SSH-", что мешает удалённой стороне завершить соединение по таймауту. Таким образом соединение может оставаться открытым длительное время (несколько дней) и сеанс SSH-клиента оказывается заблокированным.
URL: https://nullprogram.com/blog/2019/03/22/
Новость: https://www.opennet.ru/opennews/art.shtml?num=50379
trollssh
Интересная идея. Запустить 10 фиктивных копий и сиди, жди, пока сбрутят
зачем 10?
Да, 10 маловато будет. N копий
N мало, надо K
Пусть число танков будет К. Нет, К — мало, возьмем М.
M+1
65535 же
А смысл? Запускаешь одну копию и на неё перебрасываешь сразу несколько ненужных портов. Или все.
Дак сканеры адаптируются да и все. Соединение не рвется 5 сек, игнорим порт, ну и идем сканить следующий порт. Рельаный порт особо защищенней не становится.
Хотя есть же системы которые дедектят скан портов и отрубают клиентв ообще?
Зато сканирование замедлится. Да, есть, например, fail2ban.
CSF гораздо лучше. https://configserver.com/cp/csf.html
> Соединение не рвется 5 сек, игнорим портТогда нужна опция в OpenSSH на задержку соединения. Вот, например, 6 секунд. Тогда брутфорсерам придётся игнорить только после, скажем, 8 секунд. Иначе им будет вообще не достучаться. (Но в любом случае, как заметили выше, начнётся замедление этого непорядка, если присоединиться к этой акции.)
Зачем детектировать сканы портов? Какая сакральная цель этого упражнения? Security through obscurity? Проверить производительность фаерволла? Если факт наличия слушающего порта нужно скрыть, то явно что-то не так в концепции. Я допускаю сущуствование каких-то пограничных случаев, когда это может быть желательно или необходимо. Но как распространённая практика, на мой взгляд, это бессмысленная трата времени администраторов системы, потенциальный генератор проблем с доступностью ресурсов из-за ложных срабатываний, потенциальный источник проблем с безопасностью из-за ошибок в самом софте, ну и заодно бесцельный расход ресурсов оборудования.
Хорошая идея. Вот только мааааленькая проблема, для того чтобы занять 22 порт её нужно будет запустить с рут правами...
Это совсем не проблема. Можно форкнуться и стать бичпользователем, как делают адекватные серверы. Хотя, конечно, не факт, что тут сделано нормально.
Не сделано.
А можно же и Capabilities
CAP_NET_BIND_SERVICE
Bind a socket to Internet domain privileged ports (port numbers less than 1024).
Это только для открытия сокета. Потом можно сбросить права
Я о том же. Но в коде ничего такого нет.
в systemd это не проблема:
DynamicUser=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
EPETИК.
Это и без systemd не проблема. Надо только, чтобы ФС поддерживала расширенные атрибуты и метки безопасности.
В sysv это не проблема:
setcap cap_net_bind_service=+ep /usr/bin/endlessh
start-stop-daemon --start <...> --chuid nobody --exec /usr/bin/endlessh
Увы, твои знания неактуальны для 2к19 года. Повсеместен именно systemd.Это как рассказывать всем, как переводится этот текст на древнегреческий.
> Это как рассказывать всем, как переводится этот текст на древнегреческий.Интересно, что Вы говорили про upstart, когда шляпа съехала на него.
Что upstart не решает концептуальной проблемы инициализации системы и переход на него чуть менее, чем бессмысленен. Systemd — первый значительный шаг в нужном направлении. К сожалению, разработчики допустили много ошибок в общении с коммьюнити (в основном в том, как доносились идеи и цели проекта), но ситуация постепенно выравнивается, да и страсти наконец поутихли.
setcap даёт cap_net_bind_service перманентно. В systemd привелегии даются динамически, при старте юнита. В определённых случаях эта разница может быть важна. В остальном, результат будет конечно же одинаковый — endlessh запущенный от nobody и слушающий порт 22.
> setcap даёт cap_net_bind_service перманентно <...>Ну я на самом деле утрирую. Вещи типа DynamicUser и setcap -- им, безусловно, место в start-stop-daemon.
Впрочем, если бы кому-то было не всё равно на динамический uid или setcap -- давно бы всё там было.
Будем реалистами: Леннарт запилил это чисто для себя любимого.
Для сумневающихся, объясняю:
root@indexer01:/lib/systemd# find . -name \*.service | wc -l
238
root@indexer01:/lib/systemd# grep -rin DynamicUser= .
./system/systemd-timesyncd.service:28:DynamicUser=yes
root@indexer01:/lib/systemd# grep -rin AmbientCapabilities= .
./system/systemd-resolved.service:30:AmbientCapabilities=CAP_SETPCAP CAP_NET_RAW CAP_NET_BIND_SERVICE
./system/systemd-networkd.service:29:AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW
./system/systemd-timesyncd.service:30:AmbientCapabilities=CAP_SYS_TIMEВсё. Из 238 сервисов только 4 используют это. И те -- systemd-шные.
> В остальном, результат будет конечно же одинаковый — endlessh запущенный от nobody и слушающий порт 22.
Ну, вообще-то... DynamicUser и специальный юзер nobody -- это несколько разные вещи... Но в целом да, почти тот же фиг.
> start-stop-daemon <...>Да вы, батенька, ретроград
#!/sbin/openrc-run
pidfile="/var/run/endlessh.pid"
command="/usr/bin/endlessh"
command_args="${ENDLESSH_OPTS}"
start_stop_daemon_args="--user nobody --make-pidfile --background"depend() {
need localmount net
after bootmisc
}
# на счёт depend'а, мягко говоря, не уверен, не разбираюсь в этом
http://man7.org/linux/man-pages/man7/capabilities.7.html CAP_NET_BIND_SERVICE
Или с помощью iptables можно сделать REDIRECT
Docker
можно запустить на любом порте выше 1024 с обычными правами, например 9876 а через iptables сделать redirect:iptables -t nat -I PREROUTING -m tcp -p tcp --dport 1:79 -j DNAT --to-destination x.x.x.x:9876
iptables -t nat -I PREROUTING -m tcp -p tcp --dport 81:442 -j DNAT --to-destination x.x.x.x:9876
идея в том, чтобы сделать ханипот, а для этого надо работать именно на 22 порту
>> а через iptables сделать redirect
> а для этого надо работать именно на 22 портуа через iptables сделать redirect
Xinetd.
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 12345Выполнить один раз и запускай потом свой фейкссш от любого пользователя хоть обзапускайся.
Надо вывесить на 22 порту своих впсок, пусть балуются. sПусть брутфорс станет ещё более бесполезным и трудозатратным.
Пока он долбится в эту заглушку, ssh живёт на другом порту и по ключу)С миру по нитке - каккеру петля :D
На другом порту + Port Knocking
+TOTP RFC 6238
Вообще, глупая затея. Быстро поправят сканеры.
Я подобным образом развлекался, в ответ на сканинг phpMyAdmina я вывод /dev/urandom посылал.
Так через несколько недель сканер перестал качать гигабайты :)
Тоже когда-то ощутил китайских ботов у себя - заменил 403 и 404 на 200 с рандомом. Не уверен, сильно ли это повлияло, но они исчезли. Давно было правда
> Тоже когда-то ощутил китайских ботов у себя - заменил 403 и 404
> на 200 с рандомом.А я 402/204 кому-то возвращал...
Надо было 418 возвращать. Пусть боты пытаются понять, что это значит.
У игрушечного веб-сервера Caddy есть прекрасный плагин nobots
https://github.com/Xumeiquer/nobots/blob/master/README.md
> в ответ на сканинг phpMyAdmina я вывод /dev/urandom посылал.Сколько времени ушло, чтобы загрузить все ядра на 100%?
Отличная идея. Хотелось запустить, но не буду так как не хочу на другой порт перевешивать ssh
fail2ban+totp для вас.
А хорошая идея, запустить сабж на другом порту, и чтоб fail2ban вместо -j DROP добавлял -j DNAT --to-destination ... <побежала строчить пулреквест>
хмм... интересная идея, и тамада хороший. И blacklistd пуллреквестов не нать, он штатно такое может.
Пулреквест на что? 0_о
Сабж умеет вешаться на любой порт, если хочется на порт <1024 - то стандартными средствами типа iptables Вам в помощь.
От сюда не понятен мне пулреквест.
Пуллреквест в fail2ban, как я понимаю. Чтобы тот незаметно для внешнего взгляда перенаправлял фейлов на нестандартный порт, где висит endlessh.
Дык всё равно не понятно ... прописать в fail2ban action ... и всё? Или я чего то не учёл?
Отличная идея. просто blocktype нужно соответствующий прописать и будет всё работать само.
И порт менять не придется.
это отличный способ самому себя зобанить побыстрому. А потом и с незабаненного ip не суметь подключиться, потому как T взять негде.неплохо работал запрет insecure ssh (то бишь коннектов с unprivileged port), но пуссиэкзешники-разработчики совершенно не понимали в чем смысл этой технологии (ведь пуссиэкзе ее не умеет), поэтому в новых версиях openssh она уничтожена.
> T взять негдеВаш пост обижает сотрудников Всероссийского НИИ Физико-технических и радиотехнических измерений.
> не хочу на другой порт перевешивать sshА зря, это в любом разе хорошая идея, даже если авторизуете только по ключам: кратно меньше спама в логах.
По ключам не авторизуют, а аутентифицируют, всезнающий ты наш.
И авторизуют тоже
и потом вдруг, на пике популярности, внезапно обнаружится наличие утечек чувствительной информации в этих вот случайных строках. никогда ещё такого не было и вот вдруг опять
Подумал о том же. Надо поглядеть, откуда он "черпает рандом".
static int
randline(char *line, int maxlen, unsigned long s[1])
{
int len = 3 + rand16(s) % (maxlen - 2);
for (int i = 0; i < len - 2; i++)
line[i] = 32 + rand16(s) % 95;
line[len - 2] = 13;
line[len - 1] = 10;
if (memcmp(line, "SSH-", 4) == 0)
line[0] = 'X';
return len;
}
Не совсем понятно зачем это нужно, если в нетфильтре есть TARPIT?
tarpit уровнем ниже работает. да и то только против ламерских ботов -- на уровне протокола намного эфективнее
Какие няши. На первое апреля пойдёт.
Есть вариант, что брутоделы быстро адаптируютя.
kippo лучше устроен. У кул-хацкеров появляется иллюзия успешного взлома и повышается ЧСВ.
kippo ж давно заброшен в пользу форка cowrie
Так а чем (в плане решения проблемы) плох fail2ban?.. Работает же, вроде эффективный...
плох тем, что новость не о нём
Эффективный он только пока к тебе ломятся с десятка хостов, а вот когда счет идет на тысячи вреда от fail2ban больше, чем пользы. Хотя сабж в этом случае тем более не нужен.
Да ладно, а мужики-то не знают. fail2ban+ipset и твои тысячи хостов курят в коридоре.
Нука-нука
А поподробнее можно?
Есть какое-то вменяемое руководство по настройке??
> Нука-нука
> А поподробнее можно?
> Есть какое-то вменяемое руководство по настройке??Открываешь jail.local, находишь там строчки с banaction и banaction_allports, меняешь с iptables-что-то там на
banaction = iptables-ipset-proto6
banaction_allports = iptables-ipset-proto6-allportsНу да, не забудь доставить ipset, если он у тебя не стоит. Все давно работает из коробки, просто по дефолту, не знаю уж почему, правило для iptables врублено.
идее 100 лет в обед. в том же постфикс давно завезли sleep, чтобы спамеры страдали.
Идиотия.
Самый простой способ борьбы с переборщиками пароля - поставить длинный RSA host key, хотя бы 16к. Тогда у того кто подключается придётся нехило напрячь проц чтобы его обработать. А раз уж мы держим фейковый сервер то нам после отдачи такого ключа можно больше вообще ничего не делать, только кипаливы слать или по одному байту в 10 секунд из рандома.
> Тогда у того кто подключается придётся нехило напрячь процэто не их проц, это проц того, кому пароль уже подобрали, им его не жаль совсем.
а вот пока он с тебя байты coceт в час по чайной ложечке - он и тебе в лог не мусорит, и на других позже перейдет.
Может хоть так тот кого ломанули как то заметит и начнёт лечение.
> Может хоть так тот кого ломанули как то заметит и начнёт лечение.Не начнет. В лучшем случае перезагрузит свой ролтор, потому что "интернет тормозит".
Самый простой способ борьбы с переборщиками паролей
PasswordAuthentication no
в твоем /etc/ssh/sshd_config и fail2ban который банит за первое же обращение. Использование пароля для ssh — признак чайника, при чем чайника тупого и агрессивного.
Ловко ты мазанул разработчиков разных ssh.Утешает, что на этом форуме не тупые и агрессивные чайники с мировыми именами, вроде них, а такие славные никому не известные парни, как ты.
... в ответ этот псевдосервер бесконечно посылает текст песни «Золотая чаша, золотая» не давая нападающему вырваться
Удачи проекту и развития. Например, признаваться удалённому коннекту, что ты - OpenSSH такой версии, которая имеет незакрытые CVE и готовые эксплойты. Если там - всего лишь человек, то просто не давать залогиниться, называя неправильными все пароли и все ключи. А если хакер, то при попытке воспользоваться эксплойтом хакнуть его самого, узнать реальный IP и отправить запрос в ФБР
> при попытке воспользоваться эксплойтом хакнуть его самого, узнать реальный IP и отправить запрос в ФБРты ещё бабушке пожалуйся
> Для предотвращения обрыва соединения по таймауту используется особенность протокола SSH, который допускает отправку сервером произвольного числа строк с информацией о сервере до вывода строки "SSH-"надеюсь во всех ssh-клиентах и клиентских библиотеках -- этот баг пофикшен..
быть ведь такого не может чтобы строка бесконечного размера (и времени) приходила бы в момент рукопожатия/авторизации. (и для случая от сервера к клиенту, и для случая от клиента к серверу)
Не надейся, это часть стандарта, о чём говорил автор в пресс релизе.
Там же говорилось, что можно слать любой мусор, кроме собственно строки "SSH-".
Пока не сработает какой-либо таймаут на транспортном уровне.
Автор придумал добавить атаку slow clients прямо на сервер.
Интересно, что из этого выйдет.
Эта фигня обходится на раз. Кроме того, требует "нестандартной" конфигурации, что уже идёт вразрез с идеей стандартов.Куда практичнее просто делать проверку: ошибка авторизации? Погоди чуток, секунд 5-10, потом отправляй ответ. Таким образом не пострадают легальные юзеры. Разумеется, 5 фэйлов с одного IP банятся нещадно - очевидный признак перебора. А таких IP у "хацкеров" не так уж много, особенно если через пару минут натравить аналитику и забанить сразу всю подсеть.
> Кроме того, требует "нестандартной" конфигурации, что уже идёт вразрез с идеей стандартов.Стандарты нужны для того, чтобы их можно было бы нарушать. Скажем пускать на 22 порт только того, кто сначала постучался на порт 1354, затем на 9999, затем на 1001 и только после этого на 22. Причём именно в этом порядке. Всем остальным говорить, что на 22 порту нет ничего, так же как и на всех остальных. Совершенно вразрез со всеми стандартами, зато фига с два кто оставит хоть одну failed авторизацию в логах.
Security through obscurity отлично работает против ботов. Если конечно, ты свои запутанные идеи не ставишь на поток и не превращаешь в стандарт. Как только ты такое решение сделаешь стандартом, так сразу оно прекратит работать.
> А таких IP у "хацкеров" не так уж много, особенно если через пару минут натравить аналитику и забанить сразу всю подсеть.
Офигенный способ вырубать подсети, достаточно поиметь один роутер там, и -- хоп -- минус подсеть. Лет 20-25 назад я бы таким занялся с громадным удовольствием. Сутками бы сидел, и выключал бы подсетки. Сейчас, правда, сломать что-нибудь ради удовольствия сломать, по-моему, не популярное развлечение в среде молодёжи. 20 лет назад дефейс сайта ради удовольствия написать "здесь был вася" крупными буквами, было нормальным, постоянно люди этим занимались. А сейчас я не вижу такого. Хотя, может быть, дело лишь в том, что я не смотрю. Давненько я не шарился по детским хакерским форумам.
> А сейчас я не вижу такого.Давно коммерциализировано.
> Офигенный способ вырубать подсети, достаточно поиметь один роутер там, и -- хоп -- минус подсеть.Всё просто - сканируешь порты по адресу брутфорсера, заходишь на найденное по http. Идентифицируешь устройство или сервер (часто это как раз роутер). Гуглишь дефолтный пароль. Всё. Ботнет почему-то не меняет пароли после захвата устройств (ну я не так много их проверил, но все, что попадались - там 100% рабочий дефолтный пароль был).
Другое дело, насколько это этично и законно грохать такие узлы, ведь в своей борьбе с ботами всегда есть риск нанести больший вред - вдруг там человеку, например, скорую нужно срочно вызвать, а роутер у него был единственной связью с миром. Или ещё что-нибудь в таком же духе. Была у меня тоже идея почистить интернет хотя бы от нескольких зараженных нод, но вот эти соображения останавливают.
> вдруг там человеку, например, скорую нужно срочно вызвать, а роутер у него был единственной связью с миром.Учитывая перевод телефонной сети на чистый VoIP (когда в выдаваемый клиенту роутер встраиваются подключалка-адаптер для аналогового телефона, а "унутрях" оно теперь работает через SIP-клиент) -- это уже давно совсем не экзотическая редкость, а реальность. Как минимум, для пары десятков миллионов человек.
>20 лет назад дефейс сайта ради удовольствия написать "здесь был вася" крупными буквами, было нормальным, постоянно люди этим занимались. А сейчас я не вижу такого.Написать "Здесь был Вася" крупными буквами мешает ст. 272 УК?
>>20 лет назад дефейс сайта ради удовольствия написать "здесь был вася" крупными буквами, было нормальным, постоянно люди этим занимались. А сейчас я не вижу такого.
> Написать "Здесь был Вася" крупными буквами мешает ст. 272 УК?Может быть. Откуда я знаю? Двадцать лет назад она не мешала никому. Может быть сейчас мешает.
я как-то для нгинкса сделал искалку ботов, которые заходят на мой гносайт. за месяц сдетектил около 5000 ип адресов и это я даже не старался их вычислять по особо по явным следам типа запроса урла без единой картинки. в общем, нужно их банить, а не коннект подольше. а еще лучше сделать единую базу данных с серверами куда попадая ип адреса будут жить сутки. бот только пернул неправильно и улетел в бан в трети инторнетов, меняй ип адрес.
Ну и выкупят просто держателя этого "списка" спамеры, как только этот "список" начнут массово использовать.Так например стало с емайл базой ботов. Мы поставив обычный деадмх первым в днс получили в грейлисте последующем несколько сот тысяч ип новых ботов в месяц (падение спама было процента 3 в месяц). Все эти блокировки автоматом попадали в блеклист для почтовиков ...
Ну и года не прошло, как авторы блек листа его продали спамерам.
я чет не понял как спамерам поможет этот офигенный список ипшников со спамо ботами и почему он должен быть обязательно централизованным для последующей его продажи. я просто намекаю на то, что несколько крупных компаний могут создать консорциум по борьбе с говном в интернете и обмениваться данными только между собой + публиковать списки для всех. получится автоматизированный ркн, но абсолютно бесплатный не за бюджетные деньги и действительно борющийся с говном в интернетах.
В свое время написал для подобных целей программку: https://github.com/ertaquo/port2ban . Тупо банит в iptables всех, кто лезет на определенные порты. Периодически по крону баны чищу и доволен.
Засуну ка ее в контейнер
имх, самый простой способ борьбы с брутфорсом это ipset и фаервол и fail2ban особенно не нужен, просто блок на час, чтоб успокоился ))
статистика iptables:[117756:6898429] -A INPUT -m set --match-set net_drop src,dst -j DROP
в net_drop по cron-у сливается файлик из https://lists.blocklist.de/lists/ssh.txt (главное в скрипте не забыть проверять, чтоб свои ip-ки не забанить :) ).
[132415:7902908] -A SSH -p tcp -m recent --update --seconds 3600 --hitcount 1 --name SSH --mask 255.255.255.255 --rsource -j DROP
[22534:1251425] -A SSH -p tcp -m recent --set --name SSH --mask 255.255.255.255 --rsource
[22534:1251425] -A SSH -j ACCEPT
минус такого подхода, что себя ограничиваешь, но к нему привыкаешь )