攻击代码网址:http://www.exploit-db.com/exploits/394/

1、执行环境:

1、ProFTPD 1.3.0/1.3.0a

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

./configure --enable-ctrls

2、执行參数:

root@kali:~# gcc 394.c -o 394

root@kali:~# ./394 –s <option> [-p <option_path>] [-o <option_offset>]

參数-s后的值是攻击的两种不同的方式,值有1和2能够选择。第1种方式使用当前环境,第2种方式是使用ret-to-libc的方式。

注:return-to-libc 攻击中。其堆栈中的返回地址被替换为还有一条指令的地址,而且堆栈的一部分被覆盖以提供其參数。这同意攻击者调用现有函数而无需注入恶意代码到程序中。

參数 -o參数-p无太大意义。

不过帮助使用该攻击代码。

3、代码分析

代码运行命令为:root@kali:~# ./394 –s 1

3.1分析程序參数



程序的第236行。是对394.c程序执行时的參数进行分析。getopt(int argc, char * const argv[ ], const char * optstring)用来分析命令行參数。

參数argc和argv是由main()传递的參数个数和内容。參数optstring 则代表欲处理的选项字符串。

选项字符串里的字母后接着冒号“:”。则表示还有相关的參数,全域变量optarg 即会指向此额外參数。然后以下就是针对不同的參数进行处理。因为终于起作用的仅仅有-s一个參数。以下将着重的分析-s參数。

getopt处理到-s參数后,因为optstring中冒号“:”的存在。optarg会指向-s的下一个參数,也就是1。

然后程序在246行将该參数值赋值给变量wybor。等待下一步处理。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFuY2hhb3Fp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

3.2确定參数的有效性

因为394.c程序仅仅提供了2种漏洞攻击方式,所以程序中241行会将-s后的參数值限定为1或2。其它的不论什么值都视为非法,将导致程序直接退出。



此外,程序中的还有一个变量path,用于指定漏洞程序的绝对路径,值默觉得/usr/local/bin/ftpdctl。也正是ProFTPDserver的ftpdctl中调用了ctrls.c中的pr_ctrls_connect()函数。而该函数中的一个strncpy()是该漏洞的缓冲区溢出点。

在394.c的267行通过fopen()打开文件的方式确定,该路径下的文件是否有效。



3.3构造溢出数据并运行攻击

终于实施攻击的语句是298行和324行的execle(path,path,"-s",buf,0,sh);

int execle(const char *path, const char *arg, ..., char * const envp[]);

用execle函数能够把当前进程替换为一个新进程,path參数表示你要启动程序的名称包含路径名,arg參数表示启动程序所带的參数,一般第一个參数为要运行命令名。

将环境变量传递给须要替换的进程envp保存环境信息的数据

变量buf用于存放溢出数据,除了大量的无意义数据,最重要的是有/bin/sh的入口地址。当缓冲区溢出后。程序会被引导,跳转到/bin/sh,从而能运行随意指令。

构造溢出数据主要涉及到两个变量:buf[229]和sh[2],因为-s后的參数(1或2)决定了利用漏洞的两种不同方式,以下将针对这两种方式分开描写叙述:

方式1也就是wybor=1时,buf中除了前两个字节数据”/A”,其余227个字节所有为/bin/sh的入口地址,如图。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFuY2hhb3Fp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

envp[]则是使用0x90作为填充字符。并在末尾写入事先构造好的shellcode。shellcode的主要作用是运行: setuid(0)、setgid(0)、/bin/sh和exit(0)。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFuY2hhb3Fp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

方式2也就是wybor=2时,因为使用ret-to-libc的方式,buf中的数据除了第一个字节为‘/’,最后3字节依次为LIBC_SYSTEM地址、LIBC_NEXT__地址和/BIN/SH地址以外,其余225个字节均为填充字符0x41。



envp[]是使用‘’’作为填充字符并在结尾写入字符串”/bin/sh”。



3、分析结果

由上面的分析,能够看出,394.c程序主要是通过直接调用ProFTPDserver的命令ftpdctl -s来对漏洞实施攻击。之所以是这样,那是由于,命令ftpdctl中须要与server建立本地socket连接来进行进程间的通信。建立socket连接的时候,ftpdctl.c调用了在ctrls.c中874行定义的函数pr_ctrls_connect(char *socket_file)。

pr_ctrls_connect(char *socket_file)的主要作用是,创建AF_UNIX类型的流式套接字,并连接到server。用于连接的本地套接字地址为ctrl_sock。而ctrl_sock是struct sockaddr_un结构,它有两个參数sun_family、sun_path。

sun_family是协议族,赋值为AF_UNIX,用于本地进程间通信。sun_path是本地文件的路径,在程序中使用socket_file对sun_path赋值。

不幸的是在进行赋值时,使用了没有检查数据边界的strncpy(),能够看到在程序的923行写入内存的函数为strncpy(ctrl_sock.sun_path,socket_file,strlen(socket_file)),非常显然这个函数并没有对写入的数据进行边界检查。也就是说能够向大小为sizeof(ctrl_sock)的内存区域写入随意长度的数据。

ctrl_sock是在函数pr_ctrls_connect()中定义的局部变量,发生函数调用时计算机会在动态存储区为之开辟大小为sizeof(ctrl_sock)的内存存储区,与此同一时候动态存储区也会用于保存函数调用时的现场信息和函数返回地址,这就为缓冲区溢出攻击创造了条件。也正如394.c源代码凝视中所说,我们能够通过控制socket_file的长度来使缓冲区发生溢出。

的确394.c正是利用这个漏洞,构造了含有/bin/sh返回地址的超长数据。在调用ftpdctrl时使用參数-s来替换正常的socket_file路径。当ctrls.c运行strncpy()时。这个超长的shellcode使得缓冲区溢出,从而转去运行/bin/sh,以此来达到攻击的目的。

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析的更多相关文章

  1. MS08_067漏洞渗透攻击实践

    MS08_067漏洞渗透攻击实践 实验前准备 1.两台虚拟机,其中一台为kali,一台为windows xp sp3(英文版). 2.在VMware中设置两台虚拟机网络为NAT模式,自动分配IP地址, ...

  2. 攻防:文件上传漏洞的攻击与防御,转自H3C

    WebShell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器WEB目 ...

  3. MS08_067漏洞渗透攻击

    MS08_067漏洞渗透攻击实践 前期准备 kali和winxp要ping通 kali开启msfconsole: 同时在这里可以看到目前可攻击载荷个数一共是471个,也可以看到其他攻击的数量如图. 用 ...

  4. XSS漏洞自动化攻击工具XSSer

    XSS漏洞自动化攻击工具XSSer   XSS是Web应用常见的漏洞.利用该漏洞,安全人员在网站注入恶意脚本,控制用户浏览器,并发起其他渗透操作.XSSer是Kali Linux提供的一款自动化XSS ...

  5. SQL防漏洞注入攻击小结

    3///   4/// 判断字符串中是否有SQL攻击代码  5///   6/// 传入用户提交数据  7/// true-安全:false-有注入攻击现有:  8public bool Proces ...

  6. xxe漏洞检测及代码执行过程

    这两天看了xxe漏洞,写一下自己的理解,xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目録遍历等.首先存在漏洞的web服务一定是存 ...

  7. CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)

    CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...

  8. CVE-2014-0322漏洞成因与利用分析

    CVE-2014-0322漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存,对指定内存处的值进行了加1.其特点在于攻击者结合flash实现了 ...

  9. vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

    本文简单分析了代码的结构.有助于理解. 转:http://www.freebuf.com/news/141442.html 0×01 事件分析 2017年7月19 unamer在其github上发布了 ...

随机推荐

  1. 云计算--hdfs dfs 命令

    在hadoop安装目录下:/hadoop2/hadoop-2.7.3 1.创建目录 bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/<us ...

  2. windows下nodejs服务器的安装与配置

    1下载安装 download from the link: https://nodejs.org/en/ windows下的安装直接运行exe,略过-- 注:由于用户权限的问题,最好将nodejs安装 ...

  3. C# XML 文档注释

    原文链接:http://www.shinater.com/DocsBuilder/help.html <summary>description</summary> 描述类型或类 ...

  4. 转:CSS定位属性详解

    转载:https://juejin.im/post/5a1bb35ff265da43231ab164 这篇文章对css的绝对定位和相对定位有详细的解释

  5. 动态规划(dp)专题

    航线设置   问题描述在美丽的莱茵河畔,每边都分布着N个城市,两边的城市都是唯一对应的友好城市,现需要在友好城市间开通航线以加强往来,但因为莱茵河常年大雾,如果开设的航线发生交叉就有可能出现碰船的现象 ...

  6. PHP科学计数法转换成数字

    /** * 科学计数法转换成数字 * @param $num * @param int $double * @return int */ function sctonum($num, $double ...

  7. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件.记得有人提过可能会发生什么堆栈溢出.怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送.或是发送方发送了一些数 ...

  8. Java编程的逻辑 (1) - 数据和变量

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  9. PS 切图、抠图

    PS切图https://www.cnblogs.com/xiongmanli/p/6079172.html https://tech.youzan.com/cut-boy/?hmsr=toutiao. ...

  10. eclipse调试的方法和技巧【转】

    原文:http://www.cnblogs.com/ycxyyzw/archive/2013/03/27/2983905.html eclipse调试图标所代表的含义: Step into 单步进入- ...