Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

脆弱性診断時のAndroidのプロキシ設定を行うコマンドラインツールを作った話+その他内製ツールの紹介

こんにちは、セキュリティエンジニアの小竹 泰一(aka tkmru)です。 アカツキでは、Webアプリケーション、ゲームアプリに対する脆弱性診断や社内ネットワークに対するペネトレーションテスト、ツール開発/検証などを担当しています。

今日は、先日作成したAndroidのプロキシ設定をコマンドラインから行うツールの紹介と、その他にもある脆弱性診断に使える内製ツールの紹介をします。 この記事は、Akatsuki Advent Calendar 2020の24日目の記事です。

脆弱性診断に使うプロキシツールとは

脆弱性を発見する方法のひとつに、対象となるWebアプリ、スマホアプリの通信内容をプロキシツール上で確認し、リクエストやレスポンスを編集するという方法があります。 脆弱性診断時に用いるプロキシツールは、Burp SuiteやPacketProxyなどが知られています。

f:id:TAKEmaru:20201217044534p:plain
中間者攻撃を行う様子

スマホアプリの通信をプロキシツールへと向ける方法

スマホアプリの通信をプロキシツール上で確認するには、端末のネットワーク設定を変更しプロキシツールへと通信を曲げる必要があります。 ここではよく用いられる2つの方法を紹介します。

プロキシのIPアドレス、ポートを指定

プロキシツールが動作しているPCのIPアドレス、ポートを端末のネットワーク設定画面で指定することでプロキシツールへと通信を向けることができます。 これは最も簡単な方法です。

Androidでは、Wi-Fiの詳細設定から、プロキシのIPアドレス、ポートを指定可能です。iOSを使用している場合も設定する項目は同じです。

Android上でプロキシを設定する画面

DNSサーバーを追加し、レコードを偽装する

PacketProxyには自由にDNSレコードを変更できるDNSサーバーが組み込まれています。 このDNSサーバー上でアプリの通信先のドメインを指定し、プロキシツールを経由して通信するようにDNSレコードを偽装することで、通信内容を取得できます。 この方法は、指定したドメインとの通信のみを取得できる点や、SSL Pinningが施されていても通信先のドメインを確認することができる点で便利です。

Androidでは、プロキシのIPアドレスを指定する場合と同じくWi-Fiの詳細設定画面から、DNSの設定を変更可能です。 ここで指定するDNSサーバーのIPアドレスはPacketProxyが動作しているPCのアドレスです。 Androidの場合は、次の画像のように端末のIPアドレス、ゲートウェイのIPアドレス、ネットワークプレフィックス長も指定する必要があります。 iOSの場合はDNSのアドレスを差し替えるだけでOKです。

Android上でDNSサーバーを設定する画面

コマンドラインからプロキシの設定を行えるツールを作成した

プロキシの設定をGUIを操作して行うのは少し手間がかかります。 特にAndroidでDNSサーバーを指定するには、DHCPをオフにして端末のIPアドレス等も指定しないといけないのでめんどくさいです。 そのため、コマンドラインからプロキシの設定を簡単に行えるよう、aprox を作成しました。

github.com

インストール方法

aproxはPythonで作成されているため、pipでインストール可能です。

$ pip install git+ssh://git@github.com/aktsk/aprox.git

使い方

サブコマンドを指定することで、機能を呼び出せます。

プロキシを指定する

proxyコマンドでプロキシが待ち受けているIPアドレス、ポートを設定できます。

$ aprox proxy 192.168.100.10:8080
Local proxy has been set up

DNSサーバーを指定する(root化端末限定)

dnsコマンドでDNSサーバーのIPアドレスを指定できます。 この機能はroot権限が必要なndcコマンドを使っているため、root化端末をPCにつないでいる場合しか使えません。

$ aprox dns 192.168.100.10
200 0 Resolver command succeeded

設定をクリアする

clearコマンドでプロキシ、DNSサーバの設定をクリアできます。

$ aprox clear
Local proxy is not configured...
Cleared local DNS settings!!

開発時に知ったデバッグテクニック

ndcコマンドに関してはあまりドキュメントがなく、扱いに苦戦しました。そのため、DNSのリクエストが本当に端末から出ているのか確かめたくなりました。 ちなみにaproxの内部では次のようにndcコマンドを使って、DNSサーバーを追加しています。

$ su
# dumpsys netd # 現在の使用しているネットワークIDを確認
# ndc resolver setnetdns <ネットワークID> '' <IP アドレス> 

DNSのログは次のように確認できました。 iptablesコマンドを使い、ログの先頭にDNS_QUERIESという文字列を追加し、dmesgコマンドでログを確認しています。

3|sargo:/ $ su
sargo:/ # iptables -I OUTPUT -m udp -p udp --dport 53 -j LOG --log-prefix 'DNS_QUERIES '
sargo:/ # dmesg -w | grep 'DNS_QUERIES'
[54672.362220] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=192.168.100.15 LEN=59 TOS=0x00 PREC=0x00 TTL=64 ID=40850 DF PROTO=UDP SPT=41015 DPT=53 LEN=39 MARK=0xf0068 
[54672.525921] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=106.187.2.33 LEN=59 TOS=0x00 PREC=0x00 TTL=64 ID=50180 DF PROTO=UDP SPT=55042 DPT=53 LEN=39 MARK=0xc0068 
[54672.526507] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=106.187.2.33 LEN=59 TOS=0x00 PREC=0x00 TTL=64 ID=50181 DF PROTO=UDP SPT=26049 DPT=53 LEN=39 MARK=0xc0068 
[54672.589872] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=192.168.100.15 LEN=59 TOS=0x00 PREC=0x00 TTL=64 ID=40865 DF PROTO=UDP SPT=42598 DPT=53 LEN=39 MARK=0xf0068 
[54672.847426] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=106.187.2.33 LEN=67 TOS=0x00 PREC=0x00 TTL=64 ID=50221 DF PROTO=UDP SPT=33378 DPT=53 LEN=47 MARK=0xc0068 
[54672.848117] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=106.187.2.33 LEN=67 TOS=0x00 PREC=0x00 TTL=64 ID=50222 DF PROTO=UDP SPT=31970 DPT=53 LEN=47 MARK=0xc0068 
[54672.849920] DNS_QUERIES IN= OUT=wlan0 SRC=192.168.100.20 DST=106.187.2.33 LEN=63 TOS=0x00 PREC=0x00 TTL=64 ID=50223 DF PROTO=UDP SPT=50412 DPT=53 LEN=43 MARK=0xc0068

また、このようにログを確認することで、アプリから出るDNSのリクエストの宛先は指定したものに変更されているが、ブラウザから出るDNSのリクエストの宛先はデフォルトのままであることが分かりました。 アプリの脆弱性診断では現状のままで困らないので、このまま公開しています。

他の内製診断ツール

アカツキでは、他にも脆弱性診断時に使えるツールを作成し、OSSとして公開しています。

apk-medit

apk-meditは、root権限を必要としないメモリ改ざんツールです。 メモリ改ざんはスマホゲームの脆弱性診断時に見る項目のひとつです。 このツールに関しては、Black Hat USA Arsenalや、CODE BLUE Blueboxなどで発表しました。

github.com

以前にも社のブログに紹介記事を書いたので、興味があればこちらも読んで見てください!

hackerslab.aktsk.jp

apkutil

apkutilは、APKファイルをデコードする際にandroidmanifest.xmlをパースし様々な情報を表示したり、脆弱性診断に必要なパッチを自動で当てたりしてくれるツールです。

github.com

次のようにコマンドを実行することで、debuggable属性をtrueにしたり、networkSecurityConfigの設定をしたりしつつ、再度ビルドしてくれます。

$ apkutil all sample.apk
Decoding APK by Apktool...
I: Using Apktool 2.4.1 on sample.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
...

Potentially Sensitive Files:
sample/README.md
sample/hoge.sh

Checking AndroidManifest.xml...
Permission:
android.permission.INTERNET

Debuggable:
False

AllowBackup:
False

Custom schemas:
None

Set debuggable attribute to true in AndroidManifest!

Set networkSecurityConfig attribute to true in AndroidManifest!

Building APK by Apktool...
I: Using Apktool 2.4.1
I: Checking whether sources has changed...
...

Signing APK by apksigner...
Signed

Output: sample.patched.apk

上で挙げたapk-meditはdebuggable属性がtrueになっているアプリを前提に作られているので、apk-meditを使う際にはとても便利です。

ipautil

ipautilは、IPAファイルをデコードする際にInfo.plistをパースし様々な情報を表示したり、センシティブなファイルがないか確認したりしてくれるツールです。

github.com

次のようにコマンドを実行することで、IPAファイルをデコードできます。

$ ipautil decode sample.ipa
Decoding IPA...
Archive: sample.ipa
   creating: Payload/
   creating: Payload/demo-client iOS develop.app/
   creating: Payload/demo-client iOS develop.app/_CodeSignature/
  inflating: Payload/demo-client iOS develop.app/_CodeSignature/CodeResources  
  inflating: Payload/demo-client iOS develop.app/demo-client iOS develop  
...
  inflating: Payload/demo-client iOS develop.app/Info.plist  

CFBundleName:
demo-client iOS develop

CFBundleDisplayName:
demo-dev

Checking AppTransportSecurity...
True

NSExceptionDomains:
facebook.com

Custom schemas (CFBundleURLSchemes):
None

Potentially Sensitive Files:
./Payload/demo-client iOS develop.app/README.md
./Payload/demo-client iOS develop.app/hoge.sh

Output: ./Payload

また、IPAファイルはパッチ当てた後、リザインしないとインストールできませんが、リザインは結構手間です。 ~/ipautil.jsonに証明書の情報を書いておくことで、コマンド1発でリザインする機能もあります。

$ ipautil sign Payload/
Signing IPA by codesign...
Payload/demo-client iOS develop.app/Frameworks/Hoge.framework: replacing existing signature
Payload/demo-client iOS develop.app/Frameworks/Fuga.framework: replacing existing signature
Payload/demo-client iOS develop.app: replacing existing signature
Signed

NWPentestUtils

NWPentestUtilsは、内部ネットワークでのペネトレーションテスト業務で使用しているスクリプト集です。

github.com

DBサーバーを指定したネットワークレンジから見つけるfind-db.shやブルートフォース攻撃を行うbruteforce-postgres.shbruteforce-mysql.shbruteforce-redis.shあたりは特にお気に入りです。

$ ./find-db.sh target-ip.txt 
Target: 192.168.100.0/24
172.16.0.0/12
Now Launching: nmap -p3306 -v -oX results/20201221/192.168.100.0_24_mysql_20201221_140057.xml 192.168.100.0/24
Starting Nmap 7.91 ( https://nmap.org ) at 2020-12-21 14:00 JST
Initiating Ping Scan at 14:00
Scanning 512 hosts [2 ports/host]
...
Read data files from: /usr/local/bin/../share/nmap
Nmap done: 512 IP addresses (9 hosts up) scanned in 34.01 seconds
Now Launching: nmap -p5432 -v -oX results/20201221/192.168.100.0_24_postgre_20201221_140131.xml 192.168.100.0/24
Starting Nmap 7.91 ( https://nmap.org ) at 2020-12-21 14:01 JST
Initiating Ping Scan at 14:01
Scanning 512 hosts [2 ports/host]
Completed Ping Scan at 14:01, 14.59s elapsed (512 total hosts)
Initiating Parallel DNS resolution of 9 hosts. at 14:01
Completed Parallel DNS resolution of 9 hosts. at 14:01, 11.03s elapsed
...

DBサーバーにログインできた場合、RCEにまで持ち込めるケースがあります。

hackerslab.aktsk.jp

また、Nmapが出力したXMLファイルをスプレッドシートにコピーしやすいようCSV形式に変換するnmap-xml2csv.rbは地味に便利です。

$ ruby nmap-xml2csv.rb ./results/20201204/192.168.1.0_24_20201204_072122.xml
[+] parse these xml files:
./results/20201204/192.168.1.0_24_20201204_072122.xml
-----------------------------------------------------
192.168.1.1 53(domain), 80(http)
192.168.1.17    22(ssh)
-----------------------------------------------------
[+] Output: portscan-result.csv

おわりに

aproxという最近作成したツールの紹介と、今までに作成したツールの紹介をしました。 アカツキのセキュリティチームでは脆弱性診断をただ単に行うだけではなく、効率よく行うためのツールの作成も積極的に行い、OSSとして公開することで業界に貢献していく姿勢をとっています。

一緒に脆弱性診断やツール開発を行いたい方は、ぜひ採用ページから応募してください。お待ちしています。

hrmos.co