Тестирование безопасности с использованием Perl
Полное руководство по тестированию безопасности с использованием Perl, включая примеры скриптов и инструментов.
Внимание: Используйте эти скрипты только для тестирования систем, на которые у вас есть разрешение. Несанкционированное тестирование безопасности может быть незаконным.
1. Сканирование портов
1.1 Базовый сканер портов
use strict;
use warnings;
use IO::Socket;
sub scan_port {
my ($host, $port) = @_;
my $socket = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => 1
);
if ($socket) {
print "Port $port is open\n";
$socket->close;
return 1;
}
return 0;
}
my $host = 'example.com';
for my $port (1..1024) {
scan_port($host, $port);
}
Базовый сканер портов, проверяющий доступность TCP-портов.
1.2 Многопоточный сканер портов
use strict;
use warnings;
use IO::Socket;
use Thread::Queue;
use threads;
my $queue = Thread::Queue->new;
my $host = 'example.com';
my @threads;
sub worker {
while (my $port = $queue->dequeue) {
scan_port($host, $port);
}
}
# Создаем пул потоков
for (1..10) {
push @threads, threads->create(\&worker);
}
# Добавляем порты в очередь
for my $port (1..1024) {
$queue->enqueue($port);
}
# Завершаем потоки
$queue->end;
$_->join for @threads;
Многопоточный сканер портов для ускорения проверки.
2. Тестирование веб-приложений
2.1 Проверка уязвимостей XSS
use strict;
use warnings;
use LWP::UserAgent;
use HTML::Parser;
my $ua = LWP::UserAgent->new;
my $url = 'http://example.com/search';
my @xss_payloads = (
'<script>alert(1)</script>',
'"><script>alert(1)</script>',
'javascript:alert(1)'
);
foreach my $payload (@xss_payloads) {
my $response = $ua->get("$url?q=$payload");
if ($response->content =~ /\Q$payload\E/) {
print "Potential XSS vulnerability found with payload: $payload\n";
}
}
Скрипт для проверки уязвимостей XSS в веб-приложениях.
2.2 Проверка SQL-инъекций
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $url = 'http://example.com/login';
my @sql_payloads = (
"' OR '1'='1",
"' OR '1'='1' -- ",
"' OR '1'='1' # ",
"' OR '1'='1' /* "
);
foreach my $payload (@sql_payloads) {
my $response = $ua->post(
$url,
[
username => "admin$payload",
password => 'password'
]
);
if ($response->content =~ /welcome|success|logged in/i) {
print "Potential SQL injection vulnerability found with payload: $payload\n";
}
}
Скрипт для проверки уязвимостей SQL-инъекций.
3. Анализ сетевого трафика
3.1 Сниффер пакетов
use strict;
use warnings;
use Net::Pcap;
use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::TCP;
my $err;
my $dev = Net::Pcap::lookupdev(\$err);
my $pcap = Net::Pcap::open_live($dev, 65535, 1, 0, \$err);
sub process_packet {
my ($user_data, $header, $packet) = @_;
my $eth = NetPacket::Ethernet->decode($packet);
if ($eth->{type} == 0x0800) { # IPv4
my $ip = NetPacket::IP->decode($eth->{data});
if ($ip->{proto} == 6) { # TCP
my $tcp = NetPacket::TCP->decode($ip->{data});
print "$ip->{src_ip}:$tcp->{src_port} -> $ip->{dest_ip}:$tcp->{dest_port}\n";
}
}
}
Net::Pcap::loop($pcap, -1, \&process_packet, '');
Net::Pcap::close($pcap);
Базовый сниффер пакетов для анализа сетевого трафика.
3.2 Анализ HTTP-трафика
use strict;
use warnings;
use Net::Pcap;
use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::TCP;
sub process_http {
my ($user_data, $header, $packet) = @_;
my $eth = NetPacket::Ethernet->decode($packet);
if ($eth->{type} == 0x0800) {
my $ip = NetPacket::IP->decode($eth->{data});
if ($ip->{proto} == 6) {
my $tcp = NetPacket::TCP->decode($ip->{data});
if ($tcp->{data}) {
if ($tcp->{data} =~ /^(GET|POST|PUT|DELETE|HEAD|OPTIONS|TRACE|CONNECT)/) {
print "HTTP Request:\n$tcp->{data}\n";
}
elsif ($tcp->{data} =~ /^HTTP\/\d\.\d/) {
print "HTTP Response:\n$tcp->{data}\n";
}
}
}
}
}
my $err;
my $dev = Net::Pcap::lookupdev(\$err);
my $pcap = Net::Pcap::open_live($dev, 65535, 1, 0, \$err);
# Фильтр для HTTP-трафика
my $filter = 'tcp port 80 or tcp port 443';
Net::Pcap::compile($pcap, \$filter, $filter, 0, 0);
Net::Pcap::setfilter($pcap, $filter);
Net::Pcap::loop($pcap, -1, \&process_http, '');
Net::Pcap::close($pcap);
Скрипт для анализа HTTP-трафика в сети.
4. Брутфорс и фаззинг
4.1 Брутфорс HTTP-авторизации
use strict;
use warnings;
use LWP::UserAgent;
use Thread::Queue;
use threads;
my $url = 'http://example.com/login';
my $queue = Thread::Queue->new;
my @threads;
sub try_password {
my $ua = LWP::UserAgent->new;
while (my $password = $queue->dequeue) {
my $response = $ua->post(
$url,
[
username => 'admin',
password => $password
]
);
if ($response->is_success &&
$response->content !~ /invalid|error|failed/i) {
print "Found password: $password\n";
$queue->end;
}
}
}
# Загружаем словарь паролей
open my $fh, '<', 'passwords.txt' or die "Cannot open passwords.txt: $!";
while (my $line = $fh->getline) {
chomp $line;
$queue->enqueue($line);
}
close $fh;
# Создаем потоки
for (1..10) {
push @threads, threads->create(\&try_password);
}
$_->join for @threads;
Многопоточный брутфорсер для HTTP-авторизации.
4.2 Фаззер HTTP-запросов
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
my $ua = LWP::UserAgent->new;
my $url = 'http://example.com/api';
my @fuzz_values = (
'',
'null',
'undefined',
'true',
'false',
'NaN',
'Infinity',
'-Infinity',
'[]',
'{}',
'<script>alert(1)</script>',
'../../../../etc/passwd',
'%00',
'%0a',
'%0d'
);
foreach my $value (@fuzz_values) {
my $request = HTTP::Request->new(
POST => $url,
[
'Content-Type' => 'application/json',
'X-Test-Header' => $value
],
"{\"data\":\"$value\"}"
);
my $response = $ua->request($request);
if ($response->code >= 500) {
print "Server error with value: $value\n";
print "Response: " . $response->content . "\n";
}
}
Фаззер для тестирования обработки HTTP-запросов.
Это руководство охватывает основные аспекты тестирования безопасности с использованием Perl, включая:
- Сканирование портов и сетевых сервисов
- Тестирование веб-приложений на уязвимости
- Анализ сетевого трафика
- Брутфорс и фаззинг