0x001信息收集
由于本文的攻击机和靶机在同一个网络下,因此在kali上输入命令: arp-scan -l
由上图可以看出靶机的IP为192.168.190.134,当然也可以使用nmap去扫描192.168.190.0/24段下的所有存活机器。
使用nmap扫描器,输入命令:nmap 192.168.190.134,由上图可以看出该靶机暴露了80、22端口,80端口是提供http服务的。
我们使用浏览器访问:http://192.168190.134:80,网站的登陆图,可以看出需要账号密码,可以猜测应该有重要信息在登陆后的页面内,这个时候我们看到最下面有 Powered by Drupal,说明Drupal是该网站的CMS,猜测该网站可能存在漏洞。
0x002 漏洞检测
我们使用MSF漏洞安全检测扫描工具去扫描该网站的Drupal的潜在漏洞。
进入MSF,输入:search drupal,可以看出存在7个潜在的漏洞,经过尝试(看博客,有的博主已经验证只有geddon2 API 可以利用)。
use 1,利用这个API漏洞;show options查看是否有需要手工设置的选项,
其中requested显示为yes表示需要我们手动设置。可以从描述看出,rhosts最有可能需要我们设置,输入命令:set rhosts 192.168.190.134
接着使用run/exploit命令进行攻击,可以看出我们获得了一个meterpreter的shell,这表明我们成功入侵了该靶机。
0x003查找信息
接下来就是进入目录去查找各种有用的信息和当前用户能够使用的特殊权限的指令,如果实在没有信息提示再考虑内核版本相关的漏洞。输入ls,查看靶机文件,可以看到有一个flag1.txt文件,此时拿到第一个flag。
查看flag1.txt文件,提示需要查找CMS的配置文件,那么就在该目录下查找.
此时有两种方式查找:
一种是在该目录下遍历所有的子目录及文件,查找所有配置文件,发现在/sites/dafault/下存在settings.php文件。
另一种是开启一个shell,使用python -c "import pty;pty.spawn( ‘/bin/bash’)"开启交互模式,然后使用find命令查找settings文件,命令为:
find / -name "*settings*"
查看配置文件,我们拿到了第二个flag,并且可以看到数据库的信息 ,得到了一组用户名和密码。
使用账号密码信息,登陆数据库,mysql -udbuser -pR0ck3t
查看数据库信息,可以看到有users表。
查看用户信息,select * from users;
可以看出users表中有用户名和密码,但是该密码被加密了。我们知道哈希密码是单项不可逆的,即使我们打算使用解密软件爆破,也只能穷举,成本比较高,因此,参考大家的博客,大家都是采用替换的方式,即找到靶机的加密算法,将我们自己设定的密码转换成哈希密文,并替换users表中的密码。
0x003漏洞利用
在百度上搜索了drupal密码重置方法,发现drupal默认使用password_hash.sh生成密码。因此我们在目录下查找该文件,
输入命令行,寻找所有的hash文件,发现了在scripts下存在一个hash文件,此文件正是要找的password_hash.sh。
find ./ -name "*hash*"
使用hash文件生成新的算法,使输入命令行:cat ./scripts/password-hash.sh,发现确实是我们需要的文件。
再输入命令行 php ./scripts/password-hash.sh 123(这个并不是要生成的密码,而是密码字符的长度) ,出现password: 原密码 ------这里输入的才是要加密的原密码。
替换哈希并登陆,此时我们登陆数据库,输入命令行:update drupaldb.users set pass=“ S S SDW9NT2uqr2p26BvdSIAJQCDW/nMLyVtFCfN.7cWFjmdB1nbw7zTu” where name=“admin”;
替换users表中的hash.
接着我们用admin(密码为123)登陆
没有看到有用的信息,随便点点,发现发现dashboard,发现flag3,这句话翻译过来的意思是特殊的权限有助于发现密码,但是你需要执行一些命令去发现一些隐藏内容。这句话有两个提示,一个是提权,另一个是passwd和shadow文件。
我们尝试看看passwd,输入命令:cat /etc/passwd,发现果然存在
此外,最后一行
flag4:x:1001:1001:Flag4,,,:/home/flag4:/bin/bash也告诉了我们路径,我们打开该路径查看,找到了第4个flag文件。
0x004提权
第4个flag文件提示另一个flag文件在root里,这也再一次证明了必须要进行提权。
首先查看下当前用户能够以特殊权限使用哪些指令,输入命令行 find / -perm -4000(查找能以临时root权限执行的指令) 2>/dev/null(标准错误输出)
或者:find / -perm -u=s -type f 2>/dev/null
其中-perm表示按照权限查找;-u=s表示拥有者是s权限(临时以文件所有者权限使用文件);-type表示查找类型,f文件、d目录、c字符设备等;2>/dev/null的意思就是将标准错误stderr删掉。
s即(SUID,Set UID)设置使文件在执行阶段具有文件所有者的权限,相当于临时拥有文件所有者的身份。
这些指令都是root权限,在里面发现了/usr/bin/find已经是root权限了。基本思路借助find指令的root权限拼接一个指令进行提权操作。
接下来执行命令:touch 123,创建文件。
输入命令:find 123 -exec ls-al /root ;利用以root权限执行的查找指令同时查看/root下的文件内容。
可以看出find确实可以拥有dc-1的root权限,并且-exec后面的命令也以root权限执行,
那么就可以拼接命令行打开thefinalflag.txt了,查看下/root有什么文件。
构建命令行:find 123 -exec cat /root/thefinalflag.txt ;
成功获得最后一个flag。