special

Приёмы программирования на перле: Пишем чекер accsess лога

Приёмы программирования на перле: Пишем чекер accsess лога.
(by Rel4nium | ngh.void.ru)

В этой статье я хочу рассказать об основах программирования на перле на конкретном примере.
Первое что тебе понадобится это интерпретатор перла.В линуксоподобных системах он имеется
по дефлоту, но если ты решил програмить под *win то тебе понадобится: ActivePerl.Скачивай,
устанавливай, проблем возникнуть не должно.Не буду долго рассусоливать, а перейду к делу,
итак, приступим.

Предназначение скрипта - зондирование сервера на наличие в системе веб шеллов, выполнения
команд через уязвимые скрипты.

После того, как мы придумали предназначение скрипта нужно определится, что он должен уметь,
составить алгоритм работы.

Способности:

- Работать с файлами, открывать/закрывать/читать/записывать
- Для того, чтобы считать нужную информацию нужно организовать правила отбора
- Поиск в нужном файле
- Занесение результатов поиска в лог файл

Алгоритм:

1) нужно открыть файл лога сервера
2) собрать базу поиска по нужным именам файлов, команд, запросов
3) ввести её в массив
4) большой массив из имён скриптов и др, занести в другой массив
5) организовать по полному массиву поиск
6) вывести результат поиска на экран
7) занести результат поиска в файл

Теперь приступим к написанию самого кода скрипта, следуя из вышеперечисленных пунктов.

#!/usr/local/bin/perl
^^^^^^^^^^^^^^^^^^^^^
Первая строка в скрипте она сообщает интерпретатору что это perl приложение.

# Чекер логов апача
^^^^^^^^^^^^^^^^^^^
символ решётка используется для вставки в тело скрипт комментарий

print "\n";
^^^^^^^^^^^
Предназначение данной команды вывести какую-либо информацию на экран, либо вывести её в
файл.В данном случае эта команда используется для того, чтобы просто была пропущена
строка, т.е \n используется для переноса строки.

print "[ Log check for Apache\t";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Выводим на экран фразу [ Log check for Apache, после этой фразы используем табуляцию (т.е как
использование кнопки таб).Обрати внимание на синтаксис написания кода, после команды принт
у нас идут двойные кавычки, а уже в них мы прописываем, что что нам нужно вывести на экран,
и поле связки кода используется точка с запятой.Если не будет какого-то из этих элементов,
перл интерпретатору это не понравится, и он выплюнет только ошибку.
Ошибка может быть вида:
syntax error at /patch/to/script.pl line 9, near "print"
Excution of /patch/to/script.pl aborted due to compilation errors.
Из данной ошибки мы можем понять следующее:
ошибка в синтаксисе, в 9 линии в функции принт,скрипт прерванный из-за ошибок компиляции.
Т.е интерпретатор нам говорит, что ему не нравится, остаётся только исправить ошибку в
9 строке.

print "(C) Next Generation Hackers Group > coded by rel4nium ]";
print " >>> Big thanks to Cr4sh and Gotius\n\n";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
О типичных связках кода я говорил выше.

$file = "access.log"; # Лог файл
^^^^^^^^^^^^^^^^^^^^^
Теперь рассмотрим код немного посложнее. В данной связке переменной $file, я присваиваю значение
access.log (дальше я уже буду работать не с именем файла, в нашем случае access.log, а с переменной
$file, что значительно повышает простоту использования кода)

###########################
#веб шеллы:

@search[0] = "nstview"; @search[1] = "remview"; @search[2] = "r57shell";
@search[3] = "nghshell"; @search[4] = "c99shell"; @search[5] = "dump_price";
@search[6] = "phpMyAdmin"; @search[7] = "bd.pl"; @search[8] = "KA_uShell";
@search[9] = "phpshell"; @search[10] = "r57pws"; @search[11] = "WebShell";
@search[12] = "shell"; @search[13] = "cmd="; @search[31] = "telnet.cgi";

# команды:

@search[14] = "ls -al"; @search[15] = "wget"; @search[16] = "curl";
@search[17] = "uname";

# Shell запросы:

@search[19] = "ac=shell"; @search[20] = "work_dir=/"; @search[21] = "tmp";
@search[22] = "img=1"; @search[23] = "img=2"; @search[24] = "d=";
@search[25] = "&ef="; @search[26] = "&shell=1"; @search[27] = "c=l&d=";
@search[28] = "c=d&d="; @search[29] = "php&var="; @search[30] = "c=v&d=";

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
В данном куске кода, я использую массив @search с переменными от [0] до [30].Т.е в массив
я заношу 30 элементов, в моём случае 30 слов.ОБЯЗАТЕЛЬНО нумерация переменных должна
начинается с 0.

############################
open(FILE,"$file") || die "Apache log File not found\n"; #Ошибка?проверь указанный путь к лог файлу апача
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
открываю файл (помнишь в начале я говорил про приравнивание переменной $file, логу файла access.log, вот
теперь то это нам и понадобилось, как видишь я не вписываю имя файла, а использую переменную).
Конструкция открытия файла проста: open(FILE,"$file")
open - команда открытия файла
FILE - хэндл файла (хэндл опять же используется для удобства, т.е в дальнейшем мы можем работать не с
переменной $file, а просто использовать её хэндл).Опять же обрати внимание на правила написания связки
кода.А || die "Apache log File not found\n"; используется для того, чтобы вывести ошибку если файл
не найден.

while( )
^^^^^^^^^^^^^^
Запускаем хэндл FILE циклом while (т.е в начале был access.log -> $file -> FILE).Цикл - это
повторяющаяся операция. В нашем случае мы просто зацикливаем файл access.log, для того, чтобы найти в
нём нужные слова.Т.е цикл выполняется до тех пор пока не будут найдены все слова (из массива @search)

{if(/(@search[0]|@search[1]|@search[2]|@search[3]|@search[4]|@search[5]|@search[6]|@search[7]|@search[8]
|@search[9]|@search[10]|@search[11]|@search[12]|@search[13]|@search[14]|@search[5]|@search[16]|@search
[17]|@search[19]|@search[20]|@search[21]|@search[22]|@search[23]|@search[24]|@search[25]|@search[25]|
@search[26]|@search[27]|@search[28]|@search[29]|@search[30]|@search[31])/i){push @matches, $_;}}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
тут используем логическую операцию если (if), заключённую в {} скобки.Сдесь и происходит процесс поиска
переменных массива @search.Т.е условие идёт таким образом: если какая-то из переменных массива @search
найдена, это заносится в другой масив, названный @matches.
в результате получаем 1 массив @matches, с найденными в файле access.log переменными массива @search.

print @matches;
^^^^^^^^^^^^^^^
выводим содержимое массива @matches на экран

print "Work is finished!\n";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
выводим на экран Work is finished!

open(LogFile, '>>logfile.txt');
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Создаём и открываем файл logfile.txt (с помощью поставленных до имени файла >>, эти квадратные скобки говорят о
том, что нужно создать файл для записи и открыть его).Тут же присваиваем хэндл LogFile

print LogFile "IP adress\t Time\t\t\t\t Script's\n";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
пишем в открытый логфайл (т.е прямо в файл logfile.txt)

print LogFile @matches;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Печатаем в лог файл содержимое массива @matches, т.е найденных запросов/имён массива @search.

print LogFile "Work is finished!\n";
^^^^^^^^^^^^^^^^^^^^^^^^
Пишем в лог файл, что работа закончена

close FILE;
^^^^^^^^^^^^^^^^^^^^^^^^
закрываем файл лога (с которым и работает этот скрипт)

close LogFile;
^^^^^^^^^^^^^^^^^^^^^^^^
закрываем лог файл


EOF
^^^^^^^^^
строка завершения программы

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

>Советую прочитать:
Clinton Pierce Освой самостоятельно Perl за 24 часа
Спецификация языка Perl

>URL:
www.wmate.ru
www.codenet.ru


p.s Скачать скрипт описанный в статье можно с ngh.void.ru/soft/d/checklog.rar


Дата створення/оновлення: 25.05.2018