您的位置:首页 > Web前端

ProFTPD 1.3.0/1.3.0a (mod_ctrls support) Local Buffer Overflow Exploit漏洞及攻击代码分析(留个坑,以后自己填)

2014-09-06 15:33 811 查看
攻击代码网址:http://www.exploit-db.com/exploits/3330/



1、运行环境:

1、ProFTPD 1.3.0/1.3.0a

2、编译ProFTPD时,--enable-ctrls选项必须打开

./configure --enable-ctrls

3、本地用户需要有通过Unix Socket连接的权限

2、运行参数:

revenge@darklight~$ ./revenge_proftpd_ctrls_24.pl /usr/local/var/proftpd/proftpd.sock 1

第一个参数是客户在登陆ProFTPD服务器后生成的,用于本地进程通信的.sock文件的绝对路径,使用find / -name proftpd.sock,找到本机上该文件的路径。而proftpd.sock也是ProFTPD服务器进程间通信所使用的文件,本程序将shellcode注入该文件,以此实现缓冲区溢出攻击。



最终运行命令为:



3、代码分析:

3.1构造缓冲区溢出字符串

使用libShellCode库,生成shellcode,内容大致为:

setuid(0) setgid(0) bind(/bin/sh) on port 31337

在shellcode前连接无意义字符串,在shellcode后连接想要返回的目标地址,最终完成用于缓冲区溢出的字符串构造。

3.2建立本地socket连接并发送数据



76行,新创建描述符为SOCK的面向连接的协议族为PF_UNIX的套接字。PF_UNIX协议族,用于同一机器的进程间通信。它并非通过IP地址而是通过本地文件(通常为.sock,本程序中使用proftpd.sock)来实现进程间的通信。

77行,将变量$rsock($rsock = /usr/local/var/proftpd/proftpd.sock)打包为sockaddr结构的网络通信地址。



85行,使用connect()函数,连接到proftpd服务器主机。指定连接到proftpd.sock。



连接建立完成后,向proftpd.sock发送数据,然后关闭socket连接。

4、分析结果

4.1一个猜测

该程序的主要作用是建立socket连接,将构造好的shellcode发送给proftpd.sock,来验证CVE-2006-6563漏洞的存在。 由于是验证性的代码,在实施了攻击之后,并没做更多的攻击性操作。根据我对该程序和ProFTPD源码ftpdctl.c(/root/proftpd-1.3.0a/src/ftpdctl.c)以及ctrls.c(/root/proftpd-1.3.0a/src/ctrls.c)的理解,猜测:

proftpd.sock是ProFTPD服务器上某两个进程通信的文件。3330.pl将shellcode写入proftpd.sock后,会有进程通过本地socket连接进行数据通信,而通信的过程中会把proftpd.sock的文件内容写入内存,正是在这个过程中执行了缓冲区溢出攻击。

4.2猜测的依据

在ftpdctl.c的116行定义变量socket_file并赋值为proftpd.sock。然后在187行通过函数pr_ctrls_connect(socket_file) 函数创建本地socket连接。

而pr_ctrls_connect(char *socket_file)函数在ctrls.c的874行定义,它的主要作用是,创建AF_UNIX类型的流式套接字,并连接到服务器,用于连接的本地套接字地址为ctrl_sock。而ctrl_sock是struct sockaddr_un结构,它有两个参数sun_family、sun_path。sun_family是协议族,赋值为AF_UNIX,用于本地进程间通信。sun_path是本地文件的路径。在程序中使用socket_file对sun_path赋值。不幸的是在进行赋值时,也就是构造ctrl_sock.sun_path时,会将socket_file的文件内容一并写入大小为sizeof(ctrl_sock)的内存区域&ctrl_sock中。

ctrl_sock是在函数pr_ctrls_connect()中定义的局部变量,发生函数调用时计算机会在动态存储区为之开辟大小为sizeof(ctrl_sock)的内存存储区,与此同时动态存储区也会用于保存函数调用时的现场信息和函数返回地址,这就为缓冲区溢出攻击创造了条件。可以看到在程序的923行写入内存的函数为strncpy(ctrl_sock.sun_path,socket_file,strlen(socket_file)),很显然这个函数并没有对写入的数据进行边界检查,也就是说可以向大小为sizeof(ctrl_sock)的内存区域写入任意长度的数据,所以这就是缓冲区溢出点。

总的来说,3330.pl是伪造通信数据,构造了包含攻击指令的超长的数据,写入proftpd.sock。而在ProFTPD的服务器进程通过该文件进行通信时,利用ctrls.c中的没有进行边界检查的strncpy()函数,将shellcode写入内存,实施溢出攻击。

5、疑问

1,如果是3330.pl只负责把shellcode写入.sock,那我不通过socket,而是直接把构造好的shellcode写入.sock会不会同样能导致缓冲区溢出?如果溢出了,又能说明什么问题?是不是跟394.c的代码的方式有一定的联系,联系一下是否可以看出端倪?如果没有溢出,那就说明跟socket有关系,查看socket的receive机制是如何实现侦听数据写入的。

,2,strncpy(ctrl_sock.sun_path, socket_file, strlen(socket_file))是将路径名字写入sun_path而不是.sock文件内容,所以之前的理解有问题。在394.c中提到,可以通过控制strlen(socket_file)将用于溢出的数据copy到目标数组。跟send有关系。send SOCK, $buffer,0;是把数据发到了哪里,是.sock文件还是别的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: