Сравните идентификационные номера с номерами ревизий в двух файлах, и если номер ревизии для файла A меньше, чем файл B, замените строку на более новый номер ревизии?

Для меня sshd игнорировал ~/.ssh/authorized_keys, потому что раздел /home был смонтирован необычным способом. Я перепробовал все, установил правильные разрешения, и это сработало только после модификации в sshd_config:

StrictModes no
1
16.04.2019, 16:35
3 ответа

Сделал несколько предположений, чтобы получить какой-то ответ. Эти предположения:

  1. Однонаправленное обновление :обновление _правила (или входной файл 2 )является справочным файлом для того, что обновлено
  2. Справочный файл будет содержать только самую последнюю версию или, по крайней мере, ту же версию, что и файл, подлежащий обновлению. (входной файл 1 ). Это означает, что отсутствие проверки rev (IF2 )на самом деле >= rev IF1 как таковое. Ахтунг!
  3. Я полагаюсь на разницу между IF1 и IF2. Не уверен, насколько велика (разница в количестве строк )между ними, это может иметь значение

В любом случае, хватит блаблы, к мясу

#!/bin/bash
cp "$1" "copy_$1" #backup file we're going to change
#then only extract sid + rev (cut -f cols) + sort
#do that for both file and diff them with RCS format > see output of script for example
#and filter to keep only the sid (prob worth testing without grep to see output)
var=($(diff -n <(egrep -oe "sid:[0-9]{0,11}; rev:[0-9]{0,3}" $1|sort -k2) <(egrep -oe "sid:[0-9]{0,11}; rev:[0-9]{0,3}" $2|sort -k 2) | egrep -oe "sid:[0-9]{0,11};" ))
#Now loop over each SID
for i in ${var[@]}; do
  #Extract line number in IF1
  oldline=$(grep -n $i $1|cut -f1 -d:)
  #Extract replacement line in IF2
  newline=$(grep $i $2.txt)
  #awk magic see (note sed was a pain, couldn't get it to work :/) >> https://askubuntu.com/questions/434051/how-to-replace-a-string-on-the-5th-line-of-multiple-text-files
  awk -v nline="$oldline" -v repl="$newline" '(NR==nline){$0=repl}1;' "copy_$1" > "f.tmp" && mv "f.tmp" "copy_$1"
done
#then highlight diff between copy and original // you'll still need to mv "copy_$1" "$1" for it to be applied
diff -n "copy_$1" "$1"

Оберните все это в скрипт, а затем вызовите:

./my_script.sh all_rules.rules /home/path/update_rules.rules

0
28.01.2020, 00:50

Вы не упомянули perl, но я предполагаю, что это можно использовать, поскольку вы упомянули awk, sedи grep. Я выбрал perl, а не awk, главным образом потому, что гораздо проще работать с многоуровневыми ассоциативными массивами -(, а "хеш -из -хэшей" или "HoH" в perlжаргоне ), чем в awk.

#!/usr/bin/perl
use strict;

# array used to keep track of the order each sid was first seen,
# so that they can be printed out in the same order.
# Necessary because perl hashes are inherently un-ordered.
my @order=();

# hashed array to contain the highest rev seen of each sid.
my %S = ();

# count of the number of files we've read completely so far.
my $filenum=0;

while(<>) {
  s/^\s*|\s*$//g;  # strip leading and trailing spaces
  if (m/^$/) { $filenum++ if eof; next }; # skip empty lines

  # extract the sid and the rev
  my ($sid, $rev) = $_ =~ (m/^.*; sid:(\d+); rev:(\d+)/) ;

  # store or update an anonymous hash containing the rev and the entire
  # line in the hash, keyed by the sid.
  if (defined($S{$sid})) {
    $S{$sid} = { rev => $rev, line => $_ } if ( ($rev > $S{$sid}->{rev}) );
  } else {
    next if ($filenum); # only store sid if we're still reading the 1st file.
    push @order, $sid;
    $S{$sid} = { rev => $rev, line => $_ };
  };

  $filenum++ if eof;
};

# if you want output sorted by the sid, comment the first of the next
# two lines and uncomment the second
for my $sid (@order) {
#for my $sid (sort keys %S) {
     print $S{$sid}->{line}, "\n";
};

Сохраните его как, например, ./apply-update.plи запустите как./apply-update.pl all.rules update.rules > out.rules

Выходные данные из ваших новых входных файлов-образцов будут состоять всего из трех строк (с идентификаторами, показанными в all.rules, обновленными update.rules, т. е. "rev :2", а не "rev :". ] версии 1"):

alert udp $home_net any -> any 53 (msg:"et trojan copykittens? matryoshka dns lookup 1 (winupdate64. com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0b|winupdate64|03|com|00|"; nocase; distance:0; fast_pattern; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/operation_wilted_tulip.pdf; classtype:trojan- activity; sid:2024495; rev:2;)
alert udp $home_net any -> any 53 (msg:"et trojan copykittens matryoshka dns lookup 2 (twiter-statics. info)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|0e|twiter|2d|statics|04|info|00|"; nocase; distance:0; fast_pattern; metadata: former_category trojan; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/operation_wilted_tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan-activity; sid:2024496; rev:2; metadata:affected_product windows_xp_vista_7_8_10_server_32_64_bit, attack_target client_endpoint, deployment perimeter, signature_severity major, created_at 2017_07_25, malware_family matryoshka, performance_impact moderate, updated_at 2017_07_25;)
alert udp $home_net any -> any 53 (msg:"et trojan copykittens cobalt strike dns lookup (cloudflare-analyse. com)"; content:"|01 00 00 01 00 00 00 00 00 00|"; depth:10; offset:2; content:"|12|cloudflare|2d|analyse|03|com|00|"; nocase; distance:0; fast_pattern; threshold:type limit, track by_src, count 1, seconds 60; metadata: former_category trojan; reference:url,www.clearskysec.com/wp- content/uploads/2017/07/operation_wilted_tulip.pdf; reference:md5,752240cddda5acb5e8d026cef82e2b54; classtype:trojan-activity; sid:2024497; rev:2; metadata:affected_product windows_xp_vista_7_8_10_server_32_64_bit, attack_target client_endpoint, deployment perimeter, signature_severity major, created_at 2017_07_25, malware_family cobaltstrike, performance_impact moderate, updated_at 2017_07_26;)

Это будет во много раз быстрее, чем любаяbash-версия на основе -интерпретаторы оболочки просто не так быстры при обработке текста -, как perlили awkили python. Компилируемый язык, такой как C, был бы снова намного быстрее, но написание чего-то подобного на C, вероятно, потребовало бы, по крайней мере, 50 или 60, возможно, даже нескольких сотен строк кода C, а не 15 строк Perl (не подсчет комментариев или пустых строк ).

0
28.01.2020, 00:50

Это работает для меня при минимальном тестировании:

#!/bin/zsh
typeset -A rule sidrev
while read -r line; do
    sid=${${line/*sid:/}/;*/}
    rev=${${line/*rev:/}/;*/}
    if [[ "$rev" -gt "$sidrev[$sid]" ]]; then
        sidrev[$sid]="$rev"
        rule[$sid]="$line"
    fi
done
echo -E ${(F)rule}

Сценарий считывает правила snort на стандартный ввод, а на стандартный вывод выводит последнюю версию всех прочитанных правил.

0
28.01.2020, 00:50

Теги

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