ctfのお勉強 ksnctf #32 Simple Auth

ksnctfを解いてみた

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を解いてみた

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を解いてみた

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を解いてみた

ksnctf

#3 Crawling Chaos

ソースコード見てみるとscriptでうにょうにょしている問題。
少しググってみると出てくる出てくる。
だた、まともに一個一個仕様と照らし合わせて、コードをたどっても大変そうなので、nodejsで実行してみました。

f:id:skymay:20170202163619p:plain

平文が出てくる。
あとはコードを読んでみるとi番目の文字にi+1掛けて比較していることがわかるので、戻してやると。

#5 Onion

暗号化されている模様。
base64か。繰り返しdecodeしてみる。

for i in 0..20
  p "i:"+i.to_s
  basic_enc=Base64.decode64(basic_enc)
  p basic_enc
  p "--------"
end

15回目でbegin 666 と出てくる。
uuencodeでデコート。

ctfのお勉強 ksnctf #1 #2 Easy Cipher #8 Basic is secure? #10 #!

ksnctfを解いてみた

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.8 Basic is secure?

pcapをダウンロードしてWiresharkで眺める。
とりあえずhttpに絞り込みをして。
f:id:skymay:20170131133808p:plain

認証しているところを見るとフラグが出てくる。
f:id:skymay:20170131133847p:plain

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 人感センサーからカメラ撮影してメール送信しちゃう

ラズベリーパイで遊ぶ

少し前に買って放置されていたRaspberryPi で遊んでみました。
人感センサーをつけて、反応したらカメラ撮影してそのままGmail使ってメールを投げます。

パーツを揃える

  • ラズパイ:Raspberry Pi Model B+ (Plus)
  • ラズパイカメラ:Raspberry Pi Video Module Raspberry Pi Camera Board 775-7731
  • 人感センサー: 焦電型赤外線(人感)センサーモジュール SB412A





接続する

接続はこんな感じ。

f:id:skymay:20171211134750p:plain
接続

センサーはジャンパーケーブルで直接接続しました。5V,GPIO4,GROUND
f:id:skymay:20160904105849j:plain

f:id:skymay:20171209111656j:plain


人感センサーのデータシートはここ
焦電型赤外線(人感)センサーモジュール 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 とかその辺のエラーだった気がします。

写真をとって貯め続けるので、容量注意してください。
メールで送られるので上書きでも良いかも。

最終動作テスト

スクリプトを起動して、メールが受信されるか確認します。

まとめ

ハード部分は全然詳しくないのですが、いろいろなサイトを参考にしながら、意外に簡単にできました。
Web経由で再起動、ストリーミング操作機能とかをつけてもおもしろいかもしれない。ラズパイ可能性は無限大ですね。
いずれは自宅警備を格安ラズパイロボットへ。