NeverLAN CTF 2018 write-up (18/02/28更新)
23日から26日にかけて行われたNeverLAN CTFというオンラインCTFに参加しました。
僕は去年12月にCTFの存在と、その楽しさを知り、CpawCTF、ksnctfといった常設のCTFに挑戦してきましたが、オンラインCTFとしてはこのNeverLAN CTFが初めての経験です。情報を学び始めたのは去年からで、主に基本情報処理技術者試験の勉強をしていたので得点は約10000pt満点中2841pt、順位はNon-Studentの参加者中で80位、というまだまだこれからな結果でした。しかしながらたくさん知ったことがありとても熱中して楽しくできたので、備忘録的にwrite-upを載せておきます。
高得点問題はほぼ解けていないので期待はしないでください(´;ω;`)
ヒントが解放されているので、でき次第更新していきます。
---Cryptography---
・I have a message for you
問題文には二進数が書かれている。これをASCIIに変換すると、
・basic math
・more basic math
・even more basic math with some junk
下のpythonでなんとかなる。numbers.txtは数が並んでいるページの内容を写したもの。ただし三問目は、テキストエディタであらかじめ空白やコンマを取り外す。途中に数字ではない偽の"101"があるので注意。
sum=0
for line in open("numbers.txt","r"):
sum+=int(line)
print(sum)
---Reversing---
※まだアセンブリ言語を目で追う程度しかできないので、この分野の更新はないです。
・commitment issues
ダウンロードしたものをバイナリエディタで開くともろにflagがある。stringsコマンドやcatコマンドでも見れるはず。CryptoでいうROT13みたいな典型的な入門問題?
---Interweb---
・Ajax_not_sorp
Ajaxについては全く知らなかったが、「ソースを表示」させると、おそらくuser欄に入力された場合の処理を書いてある部分、26行目に
// For element with id='name', when a key is pressed run this function
$('#name').on('keypress',function(){
// get the value that is in element with id='name'
var that = $('#name');
$.ajax('webhooks/get_username.php?username='+that.val(),{
}).done(function(data){ // once the request has been completed, run this function
data = data.replace(/(\r\n|\n|\r)/gm,""); // remove newlines from returned data
if(data==MD5(that.val())){ // see if the data matches what the user typed in
that.css('border', '1px solid green'); // if it matches turn the border green
$('#output').html('Username is correct'); // state that the user was correct
}else{ // if the user typed in something incorrect
that.css('border', ''); // set input box border to default color
$('#output').html('Username is incorrect'); // say the user was incorrect
}
}
);
});
// dito ^ but for the password input now
$('#pass').on('keypress', function(){
var that = $('#pass');
$.ajax('webhooks/get_pass.php?username='+$('#name').val(),{
}).done(function(data){
data = data.replace(/(\r\n|\n|\r)/gm,""); // remove newlines from data
if(MD5(data)==MD5(that.val())){
that.css('border', '1px solid green');
$('#output').html(data);
}else{
that.css('border', '');
$('#output').html('Password is incorrect');
}
}
);
});
詳しく見ると、
ASCIIコードならば8bitのうち先頭bitが0なのであっていそう。このASCIIコードを文字に変換するとflagが手に入る。
---Passwords---
・Encoding != Hashing
与えられたpcapファイルをWiresharkで開くとたくさんのパケットが並んでおりやりづらいので、とりあえずプロトコル階層を見る。そこで極めて少ない数の通信しかない種類を確認すると、IPv6でのUDP、IPv4でのSSDP、DNS、HTTPなどがみられるが、まずはHTTPが怪しいとみる。HTTPでフィルタリングして少し探すと10464番のHTTPヘッダで認証している様子が見られる。詳しく見るとこれはBASIC認証で、認証の際入力したidやパスワードを暗号化せずに平文のままネットワークを通過させてしまう危険な認証である。そこでflagが得られる。
・Zip Attack
パスワードで暗号化されたZipファイルと、それに含まれているという1つのjpegファイルが渡される。
既知平文攻撃というものがある。これはある暗号化Zipファイルに入っているあるファイルAについて、それと同一の暗号化されていないファイルA(インターネット上に公開されているものも含む:以下「既知ファイル」)が存在すればその暗号化Zipファイルを開くことができるという攻撃である。
pkcrackは、それを行うツールである。使用方法は以下の通り。
さて、上記の公式に則ってやってみると、エラーが出てきてしまった。サイズは同じなのに…?
調べると、「問題のzipファイルを上げた出題者のOSの圧縮方式と自分のOSの圧縮方式が同じでないといけない」らしい。ためしに問題Zipファイルと、自分で画像を圧縮して作ったZipファイルについて、zipinfoしてみた。
defXとdefNで異なっている。これらが何なのかはもう少し調べたいが、これが原因だろう。
また、-Pオプションで、既知ファイルをZip化した自作のZipファイルを指定すると、これが解決できる、というような記事をみた。そして、Zipファイルを作る際に「圧縮レベル」を指定できるようだ。0が圧縮しないでただzip化するだけ、9が最高圧縮率だという。
その圧縮レベルを調整すれば、問題ファイルと同じ圧縮方式ができるかもしれない、と思ってレベル別に10個のzipファイルを作った。すると、レベル9で作った自作zipファイルについて、上記の公式に-Pオプション指定したとき、うまくいった。
成功すると、パスワードなしの状態で、-dで指定したdecrypted.zipが生成され、そこにencrypted.zipの内容がコピーされている。flag.txtを見て終了。個人的には一番きつかった。
・The WIFI Network
与えられたpcapファイルは、WPA2-PSKの4way-handshakeの様子らしい。
ヒントを見てしまったが、hashcatというツールを使うと、このハンドシェイクの通信と辞書ファイルによってパスワードを割り出してしまうという。
まず、https://hashcat.net/cap2hccapx/でこのpcapファイルをhccapxという独自の形式に変換してもらう。
つぎに、kali linuxにはデフォルトでhashcatが入っていたので、次のようなコマンドを打つ。
ただこの「辞書ファイル」が厄介で、/var/share/dictにあったデフォルトの辞書ファイルやJohnTheRipperで使ったそこそこ大きいはずのOpenwallのフリー版辞書ファイルでも結果は出ず、いろんなデモの動画で使われていたrockyou.txtという辞書ファイルでやっとパスワードが出た。時間がかかるので、解析中はほかの問題を解くとよいかも。
---Trivia---
大文字にする、略称などいろんな答えが期待できたのでおもったよりきつかった。How far can you go?というどこかでみたような問題がわからなかった。
---Blast from the Past---
唯一全部解けた問題。
・Cookie_monster
移動先のページにはHe's my favorite Red guyと書かれており、Red_Guy's_nameというcookieにNameGoesHereという値が入っている。そこをElmoに書き換えるとフラグをゲット。
・Siths use Ubuntu (Part 1 of 3)
Ubuntuに侵入されたらしい。問題文には"You've got to figure out how they keep getting in even though we've changed the password."とある。まずは与えられたovaファイルをダウンロードしてVirtualBoxなどから開く。Things-I-should-doというテキストファイルがあるが、関係ないファイル(出題者がスターウォーズ好きなのが次の問題の答えと合わせてわかる)。
part2でもpart3でもログファイルを使うが、実際侵入されるときには改竄対象にされるらしいので注意。
lastコマンドを使うと、最近のログイン履歴を見ることができる。
このうち
crontabには、以下の内容が書いてあった。一番下のファイルは、5分毎に実行するようになっており、最も怪しい。
そこで、/etc/init.d/rebelsを覗くとflagが書かれている。
シェルスクリプトについては知らないので、ここの内容はもう少し調べてみます。
nc.traditionalと-p 443から、何かを送信するのかなとは感じる。
・Siths use Ubuntu (Part 2 of 3)
かつてのパスワードを求めろ、ということでJohnTheRipperを使う。shadowファイルには提示されている/etc/shadow.backupを使う。
参考:/etc/passwdのクラックツール『John The Ripper』を使ってみた | 俺的備忘録 〜なんかいろいろ〜
・Siths use Ubuntu (Part 3 of 3)
問題文には"You've got to figure out how they broke in."つまりはどうやって侵入したかを問うている。認証関係のログファイルauth.log.1を再び見てみると、先ほどの12時52分の"Accepted password for kyrolen from 172.16.164.128"の上には大量のログイン失敗のログが並んでいる。そのなかにflagが紛れ込んでいた。ひょっとしたら1問目を解いているときに見つかるかもしれない。