こんにちは、セキュリティエンジニアの小竹 泰一(aka tkmru)です。 アカツキでは、Webアプリケーション、ゲームアプリに対する脆弱性診断や社内ネットワークに対するペネトレーションテスト、ツール開発/検証などを担当しています。
今日は、先日作成したAndroidのプロキシ設定をコマンドラインから行うツールの紹介と、その他にもある脆弱性診断に使える内製ツールの紹介をします。 この記事は、Akatsuki Advent Calendar 2020の24日目の記事です。
脆弱性診断に使うプロキシツールとは
脆弱性を発見する方法のひとつに、対象となるWebアプリ、スマホアプリの通信内容をプロキシツール上で確認し、リクエストやレスポンスを編集するという方法があります。 脆弱性診断時に用いるプロキシツールは、Burp SuiteやPacketProxyなどが知られています。
スマホアプリの通信をプロキシツールへと向ける方法
スマホアプリの通信をプロキシツール上で確認するには、端末のネットワーク設定を変更しプロキシツールへと通信を曲げる必要があります。 ここではよく用いられる2つの方法を紹介します。
プロキシのIPアドレス、ポートを指定
プロキシツールが動作しているPCのIPアドレス、ポートを端末のネットワーク設定画面で指定することでプロキシツールへと通信を向けることができます。 これは最も簡単な方法です。
Androidでは、Wi-Fiの詳細設定から、プロキシのIPアドレス、ポートを指定可能です。iOSを使用している場合も設定する項目は同じです。
DNSサーバーを追加し、レコードを偽装する
PacketProxyには自由にDNSレコードを変更できるDNSサーバーが組み込まれています。 このDNSサーバー上でアプリの通信先のドメインを指定し、プロキシツールを経由して通信するようにDNSレコードを偽装することで、通信内容を取得できます。 この方法は、指定したドメインとの通信のみを取得できる点や、SSL Pinningが施されていても通信先のドメインを確認することができる点で便利です。
Androidでは、プロキシのIPアドレスを指定する場合と同じくWi-Fiの詳細設定画面から、DNSの設定を変更可能です。 ここで指定するDNSサーバーのIPアドレスはPacketProxyが動作しているPCのアドレスです。 Androidの場合は、次の画像のように端末のIPアドレス、ゲートウェイのIPアドレス、ネットワークプレフィックス長も指定する必要があります。 iOSの場合はDNSのアドレスを差し替えるだけでOKです。
コマンドラインからプロキシの設定を行えるツールを作成した
プロキシの設定をGUIを操作して行うのは少し手間がかかります。 特にAndroidでDNSサーバーを指定するには、DHCPをオフにして端末のIPアドレス等も指定しないといけないのでめんどくさいです。 そのため、コマンドラインからプロキシの設定を簡単に行えるよう、aprox を作成しました。
インストール方法
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などで発表しました。
以前にも社のブログに紹介記事を書いたので、興味があればこちらも読んで見てください!
apkutil
apkutilは、APKファイルをデコードする際にandroidmanifest.xmlをパースし様々な情報を表示したり、脆弱性診断に必要なパッチを自動で当てたりしてくれるツールです。
次のようにコマンドを実行することで、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をパースし様々な情報を表示したり、センシティブなファイルがないか確認したりしてくれるツールです。
次のようにコマンドを実行することで、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は、内部ネットワークでのペネトレーションテスト業務で使用しているスクリプト集です。
DBサーバーを指定したネットワークレンジから見つけるfind-db.sh
やブルートフォース攻撃を行うbruteforce-postgres.sh
、bruteforce-mysql.sh
、bruteforce-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にまで持ち込めるケースがあります。
また、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として公開することで業界に貢献していく姿勢をとっています。
一緒に脆弱性診断やツール開発を行いたい方は、ぜひ採用ページから応募してください。お待ちしています。