Для меня sshd
игнорировал ~/.ssh/authorized_keys
, потому что раздел /home
был смонтирован необычным способом. Я перепробовал все, установил правильные разрешения, и это сработало только после модификации в sshd_config
:
StrictModes no
Сделал несколько предположений, чтобы получить какой-то ответ. Эти предположения:
В любом случае, хватит блаблы, к мясу
#!/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
Вы не упомянули 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 (не подсчет комментариев или пустых строк ).
Это работает для меня при минимальном тестировании:
#!/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 на стандартный ввод, а на стандартный вывод выводит последнюю версию всех прочитанных правил.