ctfのお勉強 ksnctf #32 Simple Auth
ksnctfを解いてみた
#32 Simple Auth
ログインページとphpのソースコードがある。
まずはソースコードを見てみると、postを取り出して値をそのまま比較している。
if (strcasecmp($_POST['password'], $password) == 0)
"=="による緩やかな比較が0ということで
strcasecmpの返り値がFALSEか0か"0"かNULLか””あたりとなるとTRUEとなり突破できます。
仕様をグーグル先生に聞いてみることにします。
1. strcasecmpの仕様を調べる
strcasecmpの仕様を調べると、PHP5.3以降では引数エラー時にNULLを返す仕様に変更になっているようです。
(最新versionではどうなってるんでしょうか。。調べていません。。)
2. $_POSTの仕様を調べる
phpのPOSTの仕様を調べてみるとContributed Notesのところにヒントが。
PHP: $_POST - Manual
chromeデバッカで少し書き換えて、適当な文字列入れてsubmitするとFLAGが表示されます。
ctfのお勉強 ksnctf #17 Math2 #28 Lo-Tech Cipher
ksnctfを解いてみた
#17 Math2
数学問題。
2分探索で求める問題。
Step1. 10^n
def calc_digits(x) min = 1 max = x.size p max while max - min > 2 do ave = (max + min) / 2 if (10 ** ave) ** 101 > x max = ave else min = ave end end min end def calc_y(x, digits) min = 10 ** digits max = 10 ** (digits + 1) while max - min > 1 do ave = (min + max) / 2 if ave ** 101 > x max = ave elsif ave ** 101 < x min = ave elsif ave ** 101 == x ave end end end digits = calc_digits(x) p digits y = calc_y(x, digits) p "FLAG_#{y}"
#28 Lo-Tech Cipher
zipを解くと画像が二枚。ステガノかと適当に試してみるもなにもみつからず。
二枚の画像を合わせてみると文字列がうっすらと見えて。
"the last ::: in the ZIP.."
zipも重ねてみると答えが。
ctfのお勉強 ksnctf #20 G00913 #20 G00913
ksnctfを解いてみた
#20 G00913
πの10桁一致する初めのprime numberを見つける問題。
とりあえず、πを長めに取ってプログラムで1桁目から試してみる。
pi="31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421" def is_prime n for d in 2..(n - 1) if (n % d) == 0 return false end end true end for i in 1..pi.length-10 num=pi[i..i+9] p "check:"+num if is_prime(num.to_i) p "found:"+num.to_s break end end
しばらく放置してたら見つかりました。
#25 Reserved
何かのプログラム言語のような気がしますが、
さっぱりなのでとりあえず始めの方の文字列でググります。
length q chr uc and print chr ord uc qw q flock q and print chr oct ord q or no and print chr ord uc q each ne and print chr ord uc qw q gt q and print chr oct hex ord uc q my m and print chr ord uc q each ne and print chr ord qw q sin q and print chr oct ord uc q each le and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr ord qw q ge q and print chr ord uc q eval le and print chr ord uc qw q sin q and print chr ord uc qw q no q and print chr ord qw q use q and print chr ord q mkdir m and print chr ord q each le and print chr ord q pop and print chr oct ord q open no and print chr ord q eval le and print chr ord q eval le and print chr oct hex ord uc q gt log and print chr ord q q eq and print chr ord q q eq and print chr ord q q q and print chr ord qq q q and print chr ord uc q lt eval and print chr ord q chr lc and print chr ord q map m and print chr ord qw q ne q and print chr ord q mkdir m and print chr ord q q q and print chr ord q my alarm and print chr ord q pop and print chr ord qw q uc q and print chr oct oct ord uc qw q bind q and print chr ord q q eq and print chr ord q split s and print chr ord q open do and print chr ord q ge log and print chr ord qw q not q and print chr ord q oct no and print chr ord q xor x and print chr ord qw q die q and print chr ord q ne sin and print chr oct oct ord uc qw q fork q
どうやらperlらしいです。ppencodeというらしいです。
実行するとフラグが出てきます。
なんかググる力に依存しまくってるような。。
つづく?
ctfのお勉強 ksnctf #3 Crawling Chaos #5 Onion
ksnctfを解いてみた
#3 Crawling Chaos
ソースコード見てみるとscriptでうにょうにょしている問題。
少しググってみると出てくる出てくる。
だた、まともに一個一個仕様と照らし合わせて、コードをたどっても大変そうなので、nodejsで実行してみました。
平文が出てくる。
あとはコードを読んでみるとi番目の文字にi+1掛けて比較していることがわかるので、戻してやると。
ctfのお勉強 ksnctf #1 #2 Easy Cipher #8 Basic is secure? #10 #!
ksnctfを解いてみた
とりあえず正解者の多い問題から順番に
problem.1 Test Problem
サンプル問題なのでコピー&ペーストで終わります。
problem.2 Easy Cipher
よくある暗号ね。
回転させるやつ。ぱっと見想像できるけども、総当たりのプログラム書いてみた。
tmp="EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yr\ ggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag E\ bzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT." alph = Array('a'..'z') alph_up = Array('A'..'Z') for i in 1..26 do a="*["+i.to_s+"]" tmp.each_char {|ch| if ch!=" " && ch!="." && ch!="," if j=alph.index(ch) a << alph[(i+j)%26] elsif j=alph_up.index(ch) a << alph_up[(i+j)%26] end elsif ch==" " a << " " end } puts a end
pythonだとdecodeのrot13指定すると一行で行けるらしいよ。
他にはtranslateとか。
import string rot13 = string.maketrans( "ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm") string.translate("Hello World!", rot13) ("Hello World").decode("rot13")
problem.10 #!
"#!" をグーグルで検索するだけ。
FLAG_S??????
つづく。
freerdpを使ってPass the Hashをテストする
FreeRDP
RDPを利用する場合、通常ユーザー名と平文パスワードを入力するかと思いますが、
パスワードの代わりにNTLMハッシュ や LMハッシュを使用して、認証を行います。
コマンドラインで簡単に試してみたい場合はpth-winexeなどのツールがありますが、
今回はfreerdpの機能を用いてハッシュでログインしてみます。
FreeRDP
利用用途としては
- ハッキング理解を深める
- パスワードを忘れてしまってなんとかしたい(ハッシュ取得は別の記事で)
悪いことをしたい
まずはアップデートとインストールから
$>apt-get update $>apt-get install freerdp-x11
あとは簡単。/uでユーザー名、/ptnでハッシュ、/dドメイン名、/vで接続先を指定しアクセスします。
$>xfreerdp /u:username /ptn:ハッシュパスワード /d:domain /v:192.168.0.102
RaspberryPi 人感センサーからカメラ撮影してメール送信しちゃう
パーツを揃える
- ラズパイ:Raspberry Pi Model B+ (Plus)
- ラズパイカメラ:Raspberry Pi Video Module Raspberry Pi Camera Board 775-7731
- 人感センサー: 焦電型赤外線(人感)センサーモジュール SB412A
接続する
接続はこんな感じ。
センサーはジャンパーケーブルで直接接続しました。5V,GPIO4,GROUND
人感センサーのデータシートはここ
焦電型赤外線(人感)センサーモジュール SB412A: センサ一般 秋月電子通商 電子部品 ネット通販
ラズパイのGPIO配置はここ。
GPIO: Models A+, B+, Raspberry Pi 2 B and Raspberry Pi 3 B - Raspberry Pi Documentation
設定する
まずは、ソフトウェアを諸々アップデートします。
いろいろバグとかでハマっても面倒なので。
#パッケージアップデート $> sudo apt-get update $> sudo apt-get upgrade #アプリケーションのアップデート $> sudo rpi-update
cameraを有効化
sudo rspi-config
enable cameraでenableにします。
センサーの設定GPIO4に指しているので、export設定をします。
センサーに反応があるとgipo4のvalueファイルに1、反応がなくなると0が出力されます。
$sudo echo 25 > /sys/class/gpio/export $cd /sys/class/gpio/gpio4 $sudo echo in > direction
動作確認
センサーでうまく値が入ってくるか確認します。
カメラの動作もとりあえずコマンドで単体チェックします。
$raspistill -o test.jpg
スクリプトを書く
gpioのvalueを確認して1が入っていた場合はカメラで写真をとってメール送信します。
メールがたくさん送られてきても面倒なので、sleep入れて少し止めています。
from __future__ import print_function import socket import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(4, GPIO.IN) from contextlib import closing import time import picamera import datetime import smtplib import threading from email import Encoders from email.Utils import formatdate from email.MIMEBase import MIMEBase from email.Header import Header from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.mime.image import MIMEImage def main(): while True: inputValue = GPIO.input(4) if (inputValue == True): filename=capture() send(filename) time.sleep(300) time.sleep(1) def send(file): img = [file] send_email_img('no_reply@gmail.com', '******@gmail.com', u'Alert', u'Alert\n', img) def send_email_img(from_addr, to_addr, subject, body, imgs=[], server='smtp.gmail.com', port=587): encoding='utf-8' msg = MIMEMultipart() mt = MIMEText(body.encode(encoding), 'plain', encoding) if imgs: for fn in imgs: img = open(fn, 'rb').read() mj = MIMEImage(img, 'png', filename=fn) mj.add_header("Content-Disposition", "attachment", filename=fn) msg.attach(mj) msg.attach(mt) else: msg = mt msg['Subject'] = Header(subject, encoding) msg['From'] = from_addr msg['To'] = to_addr msg['Date'] = formatdate() ADDRESS = "******@gmail.com" _user = "*************************" _pass = "************************* " smtp = smtplib.SMTP(server, port) smtp.ehlo() smtp.starttls() smtp.ehlo() smtp.login(_user, _pass) smtp.sendmail(from_addr, [to_addr], msg.as_string()) smtp.close() def capture(): camera = picamera.PiCamera() camera.hflip = True camera.vflip = True camera.resolution = (480,360) now = datetime.datetime.now() fmt_name = "pic_{0:%Y%m%d-%H%M%S}.png".format(now) time.sleep(2) camera.capture(fmt_name) time.sleep(2) camera.close() return fmt_name if __name__ == '__main__': main()
他のサイトでcamera.close()の記載がないところがありますが、これないとエラーで止まります。
キャプチャ取り忘れたんですが、Out of resourcesとかOut of memory とかその辺のエラーだった気がします。
写真をとって貯め続けるので、容量注意してください。
メールで送られるので上書きでも良いかも。
最終動作テスト
スクリプトを起動して、メールが受信されるか確認します。