Как я могу определить попытки подключения домена и https к sshd?

Это очень похоже на ответ @meuh, но вместо добавления цикла foreach после строки split , вам нужно добавить туда только одну строку, используя функцию grep perl или ее функцию map :

@titlewords = grep (!/^(and|if|the)$/i, @titlewords);

или

@titlewords = map { /^(and|if|the)$/i ? () : $_ } @titlewords;

См. ] perldoc -f grep и perldoc -f map для получения более подробной информации об этих функциях и различиях между ними. Они часто используются (особенно map ) во многих сценариях perl , поэтому стоит потратить время, чтобы понять, что они делают, и узнать, как они работают.


Кстати, НЕ используйте #! / Usr / bin / env perl . Использование env вроде этого достаточно плохо для скриптов python и ruby ​​ (где, к сожалению, это соглашение), но оно полностью нарушено для perl скрипты и определенно НЕ обычный способ их запуска.

perl имеет множество параметров командной строки, которые существенно изменяют его поведение в зависимости от того, какую программу вы пытаетесь написать. Использование env для запуска интерпретатора, такого как perl , полностью лишает возможности передавать параметры командной строки интерпретатору (поскольку env не поддерживает его. env даже не предназначался для использования с этой целью, это просто уродливый прием, использующий побочный эффект фактической цели env - установки переменных среды перед запуск программы).

Используйте вместо него #! / Usr / bin / perl (или любой другой путь к вашему интерпретатору perl ).


Вот еще один perl-скрипт, который делает то, что вы хотите, но он использует модули Class :: CSV и List :: Compare , а также два хэша-массива. для сравнения файлов CSV:

#! /usr/bin/perl

use strict;
use warnings;

use Class::CSV;
use List::Compare;

sub parse_csv($%) {
  my($filename,$tw) = @_;

  # exclude the following word list and the "empty word"
  my @exceptions = qw(and if the);
  my $exceptions = '^(\s*|' . join('|',@exceptions) . ')$';


  my $csv = Class::CSV->parse(
      filename => $filename,
      fields   => [qw/id title num1 num2/]
  );

  # build a hash-of-arrays (HoA), keyed by the CSV line. Each array
  # contains the individual words from each title for that line (except
  # for those matching $exceptions).  The words are all converted to
  # lowercase to enable case-insensitive matches.
  foreach my $line (@{$csv->lines()}) {

    # The following three lines are required because the input file has
    # fields separated by ', ' rather than just ',' which makes
    # Class::CSV interpret the numeric fields as strings.
    # It's easier/quicker to do this than to rewrite using Text::CSV.
    #
    # The final output will be properly-formed CSV, with only a comma as
    # field separator and quotes around the title string.
    my $key = join(',',$line->id,'"'.$line->title.'"',$line->num1,$line->num2);
    $key =~ s/([",])\s+/$1/g;   # trim whitespace immediately following " or ,
    $key =~ s/\s+([",])/$1/g;   # trim whitespace immediately preceding " or ,

    # If it wasn't for the not-quite-right CSV format, we could just use:
    #my $key = $line->string;

    push @{ $tw->{$key} }, grep (!/$exceptions/oi, split(/\s+/,$line->title));
  };
};

# two hashes to hold the titlewords HoAs
my %tw1=();
my %tw2=();

parse_csv('csv1',\%tw1);
parse_csv('csv2',\%tw2);

# now compare the HoAs
foreach my $k2 (sort keys %tw2) {
  my @matches = ();
  foreach my $k1 (sort keys %tw1) {
    my $lc = List::Compare->new('-u', \@{ $tw2{$k2} }, \@{ $tw1{$k1} });
    push @matches, $k1 if ($lc->get_intersection ge 3);
  };
  print join("\n",sort(@matches,$k2)),"\n\n" if (@matches);
};

Вывод:

11,"The Sun Still Shines in Reading",64312,464566
97,"Reading Still Shines",545464,16748967

Каждая группа совпадений сортируется, и, хотя в образце выходных данных это не отображается (потому что есть только одна группа совпадений), каждая группа печатается как отдельный абзац (т.е. разделены пустой строкой)

Кстати, если вы не хотите заключать поля заголовка в двойные кавычки, отредактируйте строку my $ key = join (...) , которая добавляет их так что это не так.

3
11.01.2017, 10:36
3 ответа

DNS через TCP-клиент можно эмулировать с помощью dig (1) , например, так (мы явно используем порт 22 , поскольку порт домена может не транслироваться на самом ящике):

dig @example.org -p22 +tcp example.org

Или примерно так :

dig @example.org -p22 axfr example.org

И это, похоже, приводит к следующим записям в / var / log / authlog :

Jan 10 15:08:41 example sshd[21075]: Did not receive identification string from 64.124.xxx.xx
Jan 10 15:08:51 example sshd[22052]: Did not receive identification string from 64.124.xxx.xx
Jan 10 15:09:01 example sshd[24980]: Did not receive identification string from 64.124.xxx.xx

Тогда как https,

curl https://example.org:22/

приводит к следующей записи (хотя количество записей на попытку различается в разных браузерах):

Jan 10 15:25:06 example sshd[9203]: Bad protocol version identification '\\026\\003\\001' from 64.124.xxx.xx

Похоже, что некоторые попытки HTTPS-подключения заканчиваются на один меньший символ:

Bad protocol version identification '\\026\\003' from

Мы можем определить все другие возможные варианты:

% fgrep " sshd[" /var/log/authlog | cut -d" " -f7-12 | grep ^Bad | sort | uniq -c | sort -rn | head
 351 Bad protocol version identification '\\026\\003\\001' from
 110 Bad protocol version identification '\\026\\003\\001\\001E\\001' from
  91 Bad protocol version identification '\\026\\003\\002' from
  63 Bad protocol version identification '\\026\\003\\001\\001=\\001' from
  52 Bad protocol version identification '\\026\\003\\001\\002' from
  44 Bad protocol version identification '\\026\\003\\003' from
  21 Bad protocol version identification '\\026\\003\\001\\001?\\001' from
  16 Bad protocol version identification '\\026\\003\\001\\001B\\001' from
  13 Bad protocol version identification '\\026\\003\\001\\0017\\001' from
  10 Bad protocol version identification '\\026\\003' from

Мы также можем увидеть возможное количество запросов домена :

% fgrep " sshd[" /var/log/authlog | cut -d" " -f7-12 | grep ^Did | sort | uniq -c
 227 Did not receive identification string from
4
27.01.2020, 21:09

Вы можете добавить правила брандмауэра на основе содержимого, которые анализируют первые несколько байтов входящих подключений. Например, в Linux с iptables:

iptables -N notssh
iptables -A input -p tcp --dport 443 -m string --algo bm --from 0 --to 7 ! --string SSH-2.0 -j notssh

Счетчик в правиле notssh показывает, сколько раз это правило срабатывало с момента его установки или с момента сброса счетчика с помощью iptables -Z notssh . Также есть счетчик на отдельные правила.

Это неправильно подсчитывает соединения, в которых первый пакет TCP-соединения содержит менее 7 байтов протокола SSH, но на практике такое случается редко.

7
27.01.2020, 21:09

Это немного более сложное решение, но вы можете попробовать sslh ssl / ssh multiplexer , но я думаю, вам придется вручную добавлять проверки для пакетов DNS, и вы должны настроить sslh в прозрачном режиме, если вам нужны исходные адреса клиентов (для просмотреть в DNS, разрешить / запретить на веб-сервере и from = в ssh authorized_keys )

0
27.01.2020, 21:09

Теги

Похожие вопросы