special

This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Приёмы программирования на перле: Пишем чекер 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

';>