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


ps Завантажити скрипт описаний в статті можна з ngh.void.ru/soft/d/checklog.rar