ProFTPd Local pr_ctrls_connect Vulnerability – ftpdctl 漏洞及攻击代码分析[通俗易懂]

ProFTPd Local pr_ctrls_connect Vulnerability – ftpdctl 漏洞及攻击代码分析

大家好,又见面了,我是全栈君。

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

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]

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分析程序參数
ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
程序的第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。等待下一步处理。

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
3.2确定參数的有效性
因为394.c程序仅仅提供了2种漏洞攻击方式,所以程序中241行会将-s后的參数值限定为1或2。其它的不论什么值都视为非法,将导致程序直接退出。

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
此外,程序中的还有一个变量path,用于指定漏洞程序的绝对路径,值默觉得/usr/local/bin/ftpdctl。也正是ProFTPDserver的ftpdctl中调用了ctrls.c中的pr_ctrls_connect()函数。而该函数中的一个strncpy()是该漏洞的缓冲区溢出点。

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

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
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的入口地址,如图。

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
envp[]则是使用0x90作为填充字符。并在末尾写入事先构造好的shellcode。shellcode的主要作用是运行: setuid(0)、setgid(0)、/bin/sh和exit(0)。
ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
方式2也就是wybor=2时,因为使用ret-to-libc的方式,buf中的数据除了第一个字节为‘/’,最后3字节依次为LIBC_SYSTEM地址、LIBC_NEXT__地址和/BIN/SH地址以外,其余225个字节均为填充字符0x41。
ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
envp[]是使用‘’’作为填充字符并在结尾写入字符串”/bin/sh”。

ProFTPd Local pr_ctrls_connect Vulnerability - ftpdctl 漏洞及攻击代码分析[通俗易懂]
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,以此来达到攻击的目的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115278.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 角点检测方法_什么叫五点取样法

    角点检测方法_什么叫五点取样法目录原理讲解【1】为何选取角点作为特征?【2】角点的定义:【3】判断角点的方法:【4】Harris角点检测法示例Opencv自带函数:cornerHarris()函数示例程序1示例程序2原理讲解【1】为何选取角点作为特征?角点是一种局部特征。角落上的可区分性特别强,边缘次之,平滑区域则基本没有区分性。【2】角点的定义:【3】判断角点的方法:这里有个细节:将计算的所有方向上的变化……

    2022年10月21日
  • 有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库…..「建议收藏」

    有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库…..「建议收藏」大家好,我是小林哥。平日里,大家都喊程序员加班多很辛苦,动不动就掉头发,但干的还是很香的,毕竟大多数公司钱还是给的很到位的,今年毕业应届生的我见到好多动不动就月薪20K~30K的,真让人两眼泪酸酸,当然这离不开他们大学期间的努力。讲真,没什么家庭背景的人,选择当程序员确实是比较好的选择了,原因有二:首先,当今互联网、AI人工智能、大数据等都是高速发展的行业,自然人才需求很多,薪资也相对其他传统行业高;第二,纯粹看你技术能力,只要自己愿意付出努力,技术能力肯定会慢慢提高上来,而且现在比起几十年

  • android registerreceiver() 参数,android – 如何使用registerReceiver方法?

    android registerreceiver() 参数,android – 如何使用registerReceiver方法?我想使用动态注册的BroadcastReceiver有一个Activity的引用,所以它可以修改其UI。我使用Context.registerReceiver()方法,但接收器的onReceive()方法从未调用。这里是显示问题的示例代码:packagecom.example;importandroid.app.Activity;importandroid.app.IntentService…

  • SO库版本号管理

    SO库版本号管理编写SO库文件时可以输入版本号调用SO库文件中特定的函数可以输出版本号

  • 免费php网站源码_网页代码生成器

    免费php网站源码_网页代码生成器ASP:CODE:[Copytoclipboard]?http://211.13Array.167.71/waptes…/updateuserinfo.jsp”,falseobjXMLHTTP.setRequestHeader”Content-Type”,”application/x-www-form-urlencoded”objXMLHTTP.setRequestHead…

    2022年10月10日
  • setscale方法的用法_BigDecimal的setScale()方法无效

    setscale方法的用法_BigDecimal的setScale()方法无效最近在使用BigDecimal进行四舍五入时,发现setScale()方法设置的精度值并没有起作用,一度让我怀疑起是否jdk有bug,代码如下:错误代码doubled=7.199999999999999;BigDecimaldecimal=newBigDecimal(String.valueOf(d));decimal.setScale(2,BigDecimal.ROUND_HAL…

    2022年10月20日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号