214e688db89be99732b717ee13fac3e1 Perl, анализ HTML кода и определение CMS

Почему ?

Просто когда то я попал на блог такого человека как Afiskon.
Там он выложил несколько скриптов, которые анализировали сайт на наличие некоторых сигнатур, которые принадлежали какому то из движков.
Ну и после проверки сайта скриптами они выводили процент «попаданий».
Я решил модифицировать это дело и написал скрипт который проверял список сайтов на наличие сигнатур, после чего составлял отчёт в виде HTML страницы, и там выводил результаты сканирования для каждого сайта. Тем кому интересно можете взглянуть на этот код здесь.После некоторых размышлений понял что скрипт чересчур статичен, и решил его немного переписать.
Написав где то около половины алгоритма, код был потерян так как случайно был отформатирован диск при переустановке системы. И вот недавно я решил заново написать этот скрипт, алгоритм придумал на быструю, из за чего он оказался кривым, и попусту тратящим ресурсы в некоторый момент, но в будущем это дело буде поправлено.

Зачем и кому это нужно ?

Вполне полезная вещь для людей занимающихся пентестом, или тем кто хочет допустим проанализировать выборку сайтов на популярнейший движок допустим рунета.
С ходу конечно его не приспособить под свои нужды, но немного переписав код можно использовать как угодно.

Хватит пояснений, покажите код!

Вот собственно и код :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/usr/bin/perl -w

# CMSS (CMS Scaner) version 0.2 alpha
# Author SHok
# nig.org.ua | http://nig.org.ua/archives/38

###
use LWP::Simple ('get');
use strict;
use MIME::Base64;
use constant DEBAG => 0;
###

##
my $data;
my $site;
my @signaturs;
my @cms;
my @sign;
#

if ( $ARGV[0] eq '-l') {
target_l($ARGV[1]);
} elsif ($ARGV[0] eq '-f') {
target_f($ARGV[1]);
} elsif ($ARGV[0] eq '-ucl') {
upd_cms_list();
} elsif ($ARGV[0] eq '-h') {
help();
} elsif ($ARGV[0] eq '-help') {
help();
} else {
help();
}

sub read_db {
# Читаем список CMS
print "Считовается список движков...\n";
open (CMS, 'cms.db') or die "Нет возможности открыть список CMS [ $! ]\n";
chomp(@cms = );
close(CMS);

# Читаем список сигнатур
print "Считовается список сигнатур движков...\n";
open (SIGN, 'base.db') or die "Нет возможности открыть список сигнатур [ $! ]\n";
chomp(@sign = );
close(SIGN);
}

sub target_l {
$site = shift;
read_db();
create_s_db();
audit();
exit;
}

sub target_f {
my $file = shift;
if (-f $file) {
open (FILE, $file) or die "Не могу открыть файл со списком адресов [ $! ]\n";
read_db();
create_s_db();
audit() while ($site = );
close(FILE);
} else {
print "ERROR: $file не является файлом!\n";
exit;
}
}

sub create_s_db {
# Составляем массив сигнатур
print "Проходит построение базы сигнатур, подождите...\n\n";
for (@cms) {
my $long_sign;
foreach my $short_sign (@sign) {
$long_sign .= encode_base64($1).',' if ($short_sign =~ /\[$_\]=\[(.*)\]$/i);
}
unless ($long_sign) {
print "Сигнатуры для CMS ".$_." отсутствуют.\nHо наименование CMS присутствует в списке CMS.\nДля исправления этой неполадки выполните комаду $0 -ucl\n". "==" x 25 ."\n";
goto STOPE;
}

chop($long_sign);
$long_sign =~ s/\n//g;

$long_sign = '['.$long_sign.']=['.$_.']';
#print $long_sign."\n";
push @signaturs, $long_sign;
STOPE:
$long_sign=0;
}
}

sub audit {
print "Скачевается страница сайта...\n";
chomp($site);
$data = get($site);
if (DEBAG) {
open (DD, '> page.txt');
print DD $data;
close(DD);
}
print "Адрес сайта: ".$site."\n";
print "Информация о результатах сканирования: \n". "==" x 40 ."\n";
for (@signaturs) {
# Вовод информацыи пользователю
my ($name,$n_sign,$s_sign,$proc) = analis($_);

print ' Наименование CMS :'.$name." .\n";
print ' Всего сигнатур в базе для этой CMS :'.$n_sign." .\n";
print ' Было обнаружено сигнатур в странице сайта :'.$s_sign." .\n";
if ($proc > 0) {
print ' В этоге было обнаружено совпадений с БД на '.$proc.'% процентов.'."\n";
} else {
print ' В этоге совпадений с БД обнаружено небыло.'."\n";
}
print "==" x 40 ."\n";
}

}

sub analis {
my ($n_sign,$s_sign,$proc) = (0,0,0);
# Подготавлеваем сигнатуры
my ($long_sng,$name) = (shift) =~ /\[(.*)\]=\[(.*)\]/;
my @sng = split /,/, $long_sng;
$n_sign = scalar(@sng);
$_ = decode_base64($_) for (@sng);

# Начало обработки данных
for (@sng) {
$s_sign++ if ($data =~ /$_/i);
}

return ($name,$n_sign,$s_sign,int $s_sign * 100 / $n_sign);
}

sub help {
print "Типо это хелп О_О \n";
print "Для того чтобы просканировать один сайт следует выполнить следующюю команду:\n$0 -l \n";
print "Для того что бы просканировать список сайтов из файла следует выполнить команду:\n$0 -f \n";
print "Если вы дописали одну или несколько сигнатур в base.db, то следует выполнить команду: $0 -ucl\n";
print "Это нужно для того что бы сгенерировать новый файл со списком извесных CMS.\n";
exit;
}

sub upd_cms_list {

# Читаем список сигнатур
print "Считовается список сигнатур движков...\n";
open (SIGN, 'base.db') or die "Нет возможности открыть список сигнатур [ $! ]\n";
while (my $data = ) {
push @signaturs, $1 if ($data =~ /\[(.*)\]=\[/);
}
close(SIGN);

print "Удаляются дубликаты...\n";
use List::MoreUtils qw/uniq/;
@signaturs = uniq @signaturs;

print "Перезаписевается список CMS...\n";
open(SIGN, '> cms.db');
print SIGN join("\n",@signaturs);
close(SIGN);

exit;
}

С запуском я думаю проблем быть не должно, ибо есть встроенный хелп!
Так же в одной директории со скриптом следует положить следующие файлы:
base.db и положить в него содержимое:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[vbulletin]=[ [wp]=[UTF\-8]
[wp]=[\/wp\-content\/themes\/]
[wp]=[\/wp\-content\/plugins\/]
[wp]=[WordPress]
[wp]=[\/wp\-includes\/]
[wp]=[\/xmlrpc\.php]
[textpattern]=[UTF\-8]
[textpattern]=[TextPattern]
[textpattern]=[http\:\/\/textpattern\.com]
[textpattern]=[\/category\/]
[textpattern]=[css\.php]
[textpattern]=[\/rss\/]
[textpattern]=[\/atom\/]
[joomla]=[Joomla]
[joomla]=[templates\/]
[joomla]=[\/css\/template]
[joomla]=[src\=\"\/media\/system\/]
[joomla]=[content\/]
[joomla]=[joomla\.org]
[joomla]=[\

[joomla]=[\ [drupal]=[UTF\-8]
[drupal]=[Drupal\.settings]
[drupal]=[jQuery\.extend]
[drupal]=[Drupal]
[drupal]=[media\=\"all\" href\=\"\/sites\/]
[drupal]=[media\=\"all\" href\=\"\/[^"]*files\/css\/]
[drupal]=[\ [drupal]=[\ [drupal]=[buytaert\.net]
[dle]=[DataLife Engine ©]
[dle]=[target="_blank">DataLife Engine]
[wscms]=[if (wsDropDown\.isSupported()) {]
[wscms]=[ image1off\.src = "images\/divtabs]
[wscms]=[image2off = new Image();]
[wscms]=[wsCMS]
[wscms]=[ image2on = new Image();]
[wscms]=[image2on\.src = "images\/]
[wscms]=[target="_new">WebSolutions\.ca]
[wscms]=[www.websolutions\.ca]
[wscms]=[Website by WebSolutions\.ca | Powered by wsCMS]

При первом запуске скрипта следует запустить его с параметром :

1
start.pl -ucl

Это действие создаст файл cms.db, для того чтобы сканер знал какие CMS нам извесны, и при каждом обновлении сигнатур следует делать это действие.
Ну и как положено скачать всё одним архивом можно здесь http://zalil.ru/upload/31279101
Вот в общем то и всё, обо всех багах пишите сюда.
Используйте его как вам угодно, делайте с ним всё что ходите.
В общем мутите что хотите ))))
Обновление слудет…

tt twitter big4 Perl, анализ HTML кода и определение CMS tt digg big4 Perl, анализ HTML кода и определение CMS tt facebook big4 Perl, анализ HTML кода и определение CMS tt gmail big4 Perl, анализ HTML кода и определение CMS tt myspace big4 Perl, анализ HTML кода и определение CMS tt reddit big4 Perl, анализ HTML кода и определение CMS

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++