Shi0shishi0

汐鹿生

Kaspersky Industrial CTF Quals 2017 Writeup

Kaspersky Industrial CTFに参加しました。2問解いて600点入れました。もっと頑張るぞいってしたい。

Backdoor Pi(Rev300)

f:id:echoha610:20171009115015p:plain

Raspberry Piを使ってIoT Prototypeを作ろうとしている学生が、先生から受け取ったSDカードを紛失したらしい。他のグループにデータをコピーしてもらったら、元のデータとハッシュ値が異なっていた。このコピーしてもらったデータが安全なものか調査して欲しい、というシナリオ。

与えられたzipファイルを解凍する。問題文にあった通り、Raspberry Piのイメージファイルか? ファイル数が多くてちょっと面倒くさそうだな…と思ったが、とりあえず適当に見ていくことにする。

user@user-virtual-machine:~/KLCTF2017/fs$ ls
__MACOSX  boot  etc   lib         media  opt   root  sbin     srv  tmp  var
bin       dev   home  lost+found  mnt    proc  run   selinux  sys  usr

問題名と問題文より、バックドアが仕込まれていそうなのでそれを探していく。怪しいファイルが置かれていないか、怪しいユーザが作られていないか、怪しいプロセスが実行されていないか、とかを確認したい。

怪しいファイルは闇雲に探しても時間かかるかなと思い、とりあえず存在するユーザの情報を確認すると「b4ckd00r_us3r」というユーザが存在することが分かる。

user@user-virtual-machine:~/KLCTF2017/fs/etc$ cat passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
pi:x:1000:1000:,,,:/home/pi:/bin/bash
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
ntp:x:102:104::/home/ntp:/bin/false
statd:x:103:65534::/var/lib/nfs:/bin/false
messagebus:x:104:106::/var/run/dbus:/bin/false
usbmux:x:105:46:usbmux daemon,,,:/home/usbmux:/bin/false
lightdm:x:106:109:Light Display Manager:/var/lib/lightdm:/bin/false
avahi:x:107:110:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
b4ckd00r_us3r:x:1001:1004::/home/b4ckd00r_us3r:/bin/bash


b4ckd00r_us3r が怪しい動きをしてないか調べたい。バックドアが仕込まれているのであれば、定期的に自動実行されていたりするかも?と思い、/var/spool/cron/ 配下を確認する。

user@user-virtual-machine:~/KLCTF2017/fs/var/spool/cron/crontabs$ ls
b4ckd00r_us3r  pi

b4ckd00r_us3r をcatして中身を確認する。OS起動時に python /bin/back というジョブが実行されるように登録されていた。

user@user-virtual-machine:~/KLCTF2017/fs/var/spool/cron/crontabs$ cat b4ckd00r_us3r 
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.80NKS4/crontab installed on Wed Oct  4 19:28:12 2017)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# m h  dom mon dow   command
@reboot python /bin/back

fileコマンドで確認すると、/bin/back はpycファイルだった。

user@user-virtual-machine:~/KLCTF2017/fs/bin$ file back 
back: python 2.7 byte-compiled

uncompyle2を使って逆コンパイルする。ソースコードを確認。

import sys
import os
import time
from flask import Flask
from flask import request
from flask import abort
import hashlib

def check_creds(user, pincode):
    if len(pincode) <= 8 and pincode.isdigit():
        val = '{}:{}'.format(user, pincode)
        key = hashlib.sha256(val).hexdigest()
        if key == '34c05015de48ef10309963543b4a347b5d3d20bbe2ed462cf226b1cc8fff222e':
            return 'Congr4ts, you found the b@ckd00r. The fl4g is simply : {}:{}'.format(user, pincode)
    return abort(404)


app = Flask(__name__)

@app.route('/')
def hello():
    return '<h1>HOME</h1>'


@app.route('/backdoor')
def backdoor():
    user = request.args.get('user')
    pincode = request.args.get('pincode')
    return check_creds(user, pincode)


if __name__ == '__main__':
    app.run(threaded=True, host='0.0.0.0', port=3333)

与えられた user と pincode をチェックする処理がある。PINコードは1桁~8桁の数字で、ユーザ名と合わせて「b4ckd00r_us3r:????????」の形で使用される。
この「b4ckd00r_us3r:????????」のSHA-256ハッシュ値を取得し、これがハードコードされているkeyと一致するかをチェックしている。
「Congr4ts, you found the b@ckd00r. The fl4g is simply : {}:{}'.format(user, pincode)」とあることから、これがそのままFLAGになると思われる。

総当りで sha256(b4ckd00r_us3r:????????) = 34c05015de48ef10309963543b4a347b5d3d20bbe2ed462cf226b1cc8fff222e となるPINコードを探す。

import hashlib
user = "b4ckd00r_us3r"
pincode = ""

def check_creds(user, pincode):
    for pincode in xrange(99999999):
	print "pincode :",
	print pincode
        val = '{}:{}'.format(user, pincode)
        key = hashlib.sha256(val).hexdigest()
        if key == '34c05015de48ef10309963543b4a347b5d3d20bbe2ed462cf226b1cc8fff222e':
            print 'Congr4ts, you found the b@ckd00r. The fl4g is simply : {}:{}'.format(user, pincode)
	    return 0

check_creds(user, pincode)

上のスクリプト回したら条件にマッチするpincodeが得られた。

pincode : 12171337
Congr4ts, you found the b@ckd00r. The fl4g is simply : b4ckd00r_us3r:12171337


FLAG : KLCTF{b4ckd00r_us3r:12171337}


Security home cameras(Crypt300)

f:id:echoha610:20171009114943p:plain

家庭用のネットワークカメラから家主に送られている写真を傍受したが暗号化されている、というシナリオの問題。

バイナリエディタで開いてみると、拡張子は.pngだがぐちゃぐちゃな感じ。このPNGファイルが与えられているだけなので、暗号化の方式もわかりやすいものなのかな、と推測。
適当なPNGファイルのヘッダと比較してみると、0x00の箇所が0xFFになっている事が分かる。

f:id:echoha610:20171009113705p:plain

FileInsightのXOR機能を使って0xFFでXORしてみるとPNGファイルのヘッダが見えた。

f:id:echoha610:20171009113758p:plain

生成されたファイルを開くとFLAGが書いてある。

f:id:echoha610:20171009113813p:plain

実在する家庭用のネットワークカメラで、写真のデータをXORエンコードしただけで送信する製品があったりするのだろうか?

FLAG : KLCTF{it_was_just_atbash_encryption}


挑戦したけど駄目だった問題

help me, please(For500)
BlaBlaMan(Rev700)