見出し画像

GoogleのOSS Tsunamiを動かしてみた

※本稿はテックブログからの転載です。

こんにちは。JDSCの筑紫です。

画像1

6/19にGoogleがTsunamiというセキュリティスキャナーをオープンソースでリリースしました。

今回ライトな話題ですが、このツールを軽く触っていければと思ってます。

Tsunamiについて

Googleの作ったネットワークスキャンエンジンです。
まずは、アプリケーションの開いているポートを検出、その後にプロトコルやサービスその他ソフトウェアを識別し、それらの収集データに基づいて脆弱性検証をしていく、という流れで脆弱性の検出を自動でやってくれるツールです。

導入方法

基本上記GithubのREADMEに従って作業していけば問題なく入れられますが、簡単に解説します。
今回はMacに導入してみます。以下環境とOSSのバージョン情報です。
最初にJavaの実行環境を整えておく必要があります。
- macOS Catalina:10.15.5
- Java:1.8.0_252
- nmap:7.80
- ncrack:0.7
まず、nmapとncrackをインストールするところから。
Homebrewで簡単に導入できます。

***

$ brew install nmap
・・・
$ nmap -version
Nmap version 7.80 ( https://nmap.org )
$ brew install ncrack
・・・
$ ncrack -version
・・・
$ Ncrack version 0.7 ( http://ncrack.org )

***

あとは、任意のディレクトリで以下シェルを実行します。

***

$ bash -c “$(curl -sfL https://raw.githubusercontent.com/google/tsunami-security-scanner/master/quick_start.sh)"

***

上記のshell内でリポジトリからコード取得、Javaコードのビルド、実行ファイル生成までやってくれます。
ビルドに成功すると、実行コマンドのサンプルをテキストで吐いてくれます。
あとは、適宜実行そのコマンドを微修正して実行するだけです。

***

$cd /Users/[YOUR HOME DIR]/tsunami && \
> java -cp “tsunami-main-0.0.2-SNAPSHOT-cli.jar:/Users/xxxxxxxxx/tsunami/plugins/*” \
> -Dtsunami-config.location=/Users/xxxxxxxxx/tsunami/tsunami.yaml \
> com.google.tsunami.main.cli.TsunamiCli \
> — ip-v4-target=xxx.xxx.xxx.xxx \
> — scan-results-local-output-format=JSON \
> — scan-results-local-output-filename=/tmp/tsunami-output.json

***

ソースコードを見る限り、ターゲットはipv4指定以外にも、「 — hostname-target」でホスト名を指定することもできるみたいです。
ちなみに、自分の環境だとはじめ実行時にエラーになりました。

***

Caused by: java.lang.IllegalArgumentException: Binary /usr/bin/nmap do not exist
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:217)
at com.google.tsunami.plugins.portscan.nmap.client.NmapClient.<init>(NmapClient.java:220)
at com.google.tsunami.plugins.portscan.nmap.client.NmapClient.<init>(NmapClient.java:211)
・・・

***

コード上のnmapの指定先とインストール先がずれており、

***

$ which nmap
/usr/local/bin/nmap

***

以下ファイルにパスをベタ書きしてあるのが原因なので、一旦このパスを修正してビルド以降を実行しなおせば正常に動作するようになります。
./repos/tsunami-security-scanner-plugins/google/portscan/nmap/src/main/java/com/google/tsunami/plugins/portscan/nmap/client/NmapClient.java

***

189 private static final String DEFAULT_NMAP_BINARY_PATH = “/usr/bin/nmap”;

***

実行結果

結果、正常に実行されると、コマンドで指定した「/tmp/tsunami-output.json」に以下のようなjson形式のレポート結果が出ます。(チュートリアルの通り、ローカルにJupyter Notebookを立ててlocalhostに対して実行)

***

$cat /tmp/tsunami-output.json | jq
{
“scanStatus”: “SUCCEEDED”,
“scanFindings”: [
{
“targetInfo”: {
“networkEndpoints”: [
{
“type”: “IP”,
“ipAddress”: {
“addressFamily”: “IPV4”,
“address”: “127.0.0.1”
}
}
]
},
“networkService”: {
“networkEndpoint”: {
“type”: “IP_PORT”,
“ipAddress”: {
“addressFamily”: “IPV4”,
“address”: “127.0.0.1”
},
“port”: {
“portNumber”: 8888
}
},
“transportProtocol”: “TCP”,
“serviceName”: “http”,
“software”: {
“name”: “Tornado httpd”
},
“versionSet”: {
“versions”: [
{
“type”: “NORMAL”,
“fullVersionString”: “6.0.4”
}
]
}
},
“vulnerability”: {
“mainId”: {
“publisher”: “GOOGLE”,
“value”: “JUPYTER_NOTEBOOK_EXPOSED_UI”
},
“severity”: “CRITICAL”,
“title”: “Jupyter Notebook Exposed Ui”,
“description”: “Jupyter Notebook is not password or token protected”
}
}
],
“scanStartTimestamp”: “2020–06–28T22:31:49.044Z”,
“scanDuration”: “25.054s”,
“fullDetectionReports”: {
“detectionReports”: [
{
“targetInfo”: {
“networkEndpoints”: [
{
“type”: “IP”,
“ipAddress”: {
“addressFamily”: “IPV4”,
“address”: “127.0.0.1”
}
}
]
},
“networkService”: {
“networkEndpoint”: {
“type”: “IP_PORT”,
“ipAddress”: {
“addressFamily”: “IPV4”,
“address”: “127.0.0.1”
},
“port”: {
“portNumber”: 8888
}
},
“transportProtocol”: “TCP”,
“serviceName”: “http”,
“software”: {
“name”: “Tornado httpd”
},
“versionSet”: {
“versions”: [
{
“type”: “NORMAL”,
“fullVersionString”: “6.0.4”
}
]
}
},
“detectionTimestamp”: “2020–06–28T22:32:14.086Z”,
“detectionStatus”: “VULNERABILITY_VERIFIED”,
“vulnerability”: {
“mainId”: {
“publisher”: “GOOGLE”,
“value”: “JUPYTER_NOTEBOOK_EXPOSED_UI”
},
“severity”: “CRITICAL”,
“title”: “Jupyter Notebook Exposed Ui”,
“description”: “Jupyter Notebook is not password or token protected”
}
}
]
}
}
$

***

このように、”fullDetectionReports”以降に脆弱性が表示されます。
ちなみに、脆弱性が未検出の場合は以下のような形の出力になります。

***

{
“scanStatus”: “SUCCEEDED”,
“scanStartTimestamp”: “2020–06–28T22:16:33.805Z”,
“scanDuration”: “41.659s”,
“fullDetectionReports”: {}
}

***

まとめ

まだリリースされたばかりでアルファ版ですが、今後RCEの脆弱性検出器なども追加予定らしく、これからどんどん機能増強されていきそうで楽しみですね。
今後も注目していきたいと思います。

採用やってます!We’re Hiring!

JDSC社内には各ロールが揃っていますので、他のSIerや自社開発している企業とはレベルが違ったスピード開発が可能になっています。
そういう開発に興味があるエンジニアを絶賛募集中です!




この記事が気に入ったらサポートをしてみませんか?