家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

hpingを使ったDoS攻撃

概要

hpingはオープンソースのパケットジェネレーターです。 hpingを使うことで、任意のTCP/IPパケットを送信することができます。 今回はhpingを使ってSYN Floodを実行してみました。

 

 

 

環境

以前構築したKali Linuxの検証環境で、 Kali Linux上でhpingを実行し、metasploitable2にSYN Floodを行ってみます。

 

実行結果

youtu.be


上記動画で実行したコマンドは以下の通りです。

Kali Linux側での実行コマンド

hping3 -i u1 -S -p 80 192.168.1.222 --rand-source

オプションの説明は以下の通りです。

  • -S :SYNパケットの送信
  • -p 80 :宛先ポートの指定(今回はTCP/80)
  • -i u1 :1マイクロ秒間隔でパケットを送信する
  • --rand-source :送信元IPアドレスをランダムに偽装

metasploitable2側での実行コマンド

netstat -tan

オプションの説明は以下の通りです。

  • -t :TCPの接続状況を確認
  • -a :すべてのユーザの接続状況を確認
  • -n :名前解決をしない。

※「-n」を指定しない場合だと送信元IPアドレス毎に名前解決を行うため、結果の表示まで時間がかかる場合があります。

 

metasploitable2側は攻撃を受けた際の状態確認を行っています。

SYN Floodを受けた場合の特徴として、netstatの結果に大量の「SYN_RECV」が表示されることがあります。

通常の場合TCPの3way-handshakingは一瞬で終わるので、SYN_RECVの状態が残る事は多くはありません。

 

 

 

digコマンドの使い方

digとは

digコマンドとはdomain information groperの略で、DNSのネームサーバに対して問い合わせを行い結果を表示するコマンドです。

 

 

 

digコマンドの使い方

digコマンドは以下のような形式で使用します。

 

digコマンド形式

dig @serverの名前orIP 調査対象のドメイン名 query-type

 

query-typeの指定例

オプション 概要
A ネットワークアドレス (省略時)
NS ネームサーバの情報
MX メールサーバの情報
SOA SOAの情報
ANY すべての情報

 

実際に実行した例が以下となります。

root@kali:~# dig google.com

; <<>> DiG 9.16.8-Debian <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55468
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 146 IN A 172.217.175.14

;; Query time: 24 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: 木 11月 26 12:24:27 JST 2020
;; MSG SIZE rcvd: 55

 

なお、ActiveDirectoryのドメイン環境において、ドメインコントローラに関する情報を収集することもできます。

root@kali:~# dig @192.168.X.X _kerberos.tcp._msdcs.domain.local.

; <<>> DiG 9.16.8-Debian <<>> @192.168.X.X _kerberos.tcp._msdcs.domain.local.
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 13056
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;_kerberos.tcp._msdcs.domain.local. IN A

;; AUTHORITY SECTION:
_msdcs.domain.local. 3600 IN SOA ドメインコントローラのホスト名.domain.local. hostmaster.domain.local. 301 900 600 86400 3600

;; Query time: 4 msec
;; SERVER: 192.168.X.X#53(192.168.X.X)
;; WHEN: 木 11月 26 12:25:51 JST 2020
;; MSG SIZE rcvd: 144

 

結果の見方

ヘッダの内容

以下の各セクションに関する問い合わせ結果のステータス等が表示されます。

 

主な status (RCODE: 応答コード)

  • NOERROR:正常な応答
  • FORMERR:DNSメッセージのフォーマットが不正
  • SERVFAIL:DNSサーバ側の異常
  • NXDOMAIN:リクエストされた名前が存在しない
  • REFUSED:リクエストが拒否された
  • NXRRSET:存在すべきレコードが存在しない

Questionセクション

DNSの問い合わせ内容が表示されます。

 

Answerセクション

問い合わせた内容に対する結果が表示されます。

Authorityセクション

権威DNSサーバの情報が表示されます。

 

参考にさせていただいたサイト

www.atmarkit.co.jp

https://dnsops.jp/event/20140626/dns-beginners-guide2014-mizuno.pdf

 

 

 

hashcatの使い方

目次

 

hashcatの概要

hashcatはパスワードクラックのツールです。
hashcatで行うパスワードクラックは稼働しているシステムに対してアカウントがロックされるまでログイン試行を行うようなものではなく、パスワードのハッシュ値から元のパスワードを割り出すものです。
一般的にシステム上のパスワードに関しては平文で保持されるケースは稀で、NISTのガイドラインにおいても「パスワードは適切な一方向鍵導出関数を用いてソルト付きでハッシュ化されなければならない(SHALL)。」と記載されているため、パスワードの保存に関して平文での保存は認めていません。

 

 

 

hashcatによるパスワードクラックの手法

hashcatはブルートフォース攻撃以外にもパスワードクラックの手法が実装されています。

辞書攻撃

辞書攻撃はパスワードの候補のリストを指定し、その中の単語を1つずつ試していく方法です。リストの例としては、「rockyou.txt」等があります。

コンビネーター攻撃

2つの単語をつなげたパスワードに対する攻撃です。

 

マスク攻撃

特定の形式のパスワードに対する攻撃です。
先頭が大文字で6文字の小文字が続き、末尾は数字1つといった形式を指定することが可能です。

 

ルールベース攻撃

対象のパスワードの構成に当たりがつく際に選択する攻撃手法です。

 

ブルートフォース攻撃

総当たりで試行する攻撃です。

 

なお、hashcatでは「-a」オプションで上記攻撃モードが指定できます。

オプション モード名 内容
0 Straight 辞書攻撃
1 Combination コンビネーション攻撃
3 Brute-force ブルートフォース攻撃
6 Hybrid Wordlist + Mask 辞書+マスク
7 Hybrid Mask + Wordlist マスク+辞書

hashcat.net

 

hashcatを使ったパスワードクラックの例

hashcatを使ったパスワードクラックの操作について以下に記載します。

1.pwdump形式のパスワードクラック

pwdumpとは

pwdumpは、SAMデータベース等からアカウントのLMおよびNTLMのパスワードハッシュを出力するWindowsのプログラムの名称です。

この形式で出力されたファイルは以下のようになります。

pwdump形式の出力例

上記「Jon」の例でみてみると以下のような構成になります。

  • 「Jon」:ユーザー名
  • 1000:相対識別子 (500 は管理者、502はKerberosアカウント等)
  • aad3b435b51404eeaad3b435b51404ee:LMハッシュ
  • ffb43f0de35be4d9917ac0cc8ad57f8d:NTLMハッシュ

pwdump形式のパスワードクラック

上記のJonの内容をそのままファイルに貼り付けて保存(以下の例では「jonorg」とします)し、以下のコマンドで解析を行います。

hashcat -m 1000 -a 0 ./jonorg rockyou.txt

オプションの説明

  • -m 1000    :ハッシュタイプ(この場合はNTLM)を指定します。
  • -a 0    :攻撃モード(この場合は辞書攻撃)を指定します。
  • ./jonorg    :解析したいハッシュが含まれるpwdump形式のファイルです。
  • rockyou.txt    :使用する辞書ファイルです。

なお、hashcatは一度解析したパスワードハッシュ値を「hashcat.potfile」として記録し、一度解析したハッシュ値を解析対象から除外します。

ご参考:ファイルのパス
~/.local/share/hashcat/hashcat.potfile

そのため、過去の解析分を削除し、新たに解析を行うには、Hashcatが生成したhashcat.potfileファイルを削除または「--potfile-disable」のオプションを指定して実行します。

 

2.hashcatでZipファイルのパスワードを解読する

実際にhashcatでパスワード付きZipファイルを解読してみます。
今回はKali Linux上で以下の操作を実行しました。

 

パスワード付きZIPの作成

以下のコマンドでパスワードが「pass」と設定したZipファイルを作成します。

echo "Hello!" > Hello.txt
zip -e --password=pass Hello.txt.zip Hello.txt

 

Zipからハッシュ値を取得の解読

johnの中に含まれるzip2johnを使ってZipファイルよりハッシュ値を取得します。

zip2john Hello.txt.zip | cut -d ":" -f 2 > Hello.txt.zip.hash

上記コマンドにより以下のようなハッシュ値が取得できます。

root@kali:~# cat Hello.txt.zip.hash
$pkzip2$1*2*2*0*13*7*b042d89e*0*43*0*13*b042*ab66*c354e2c6e579378c0784e27df319185a18104b*$/pkzip2$

取得したハッシュ値の形式を以下のサイトで確認します。

hashcat.net

今回はpkzipに該当するもの(17200)を確認します。

 

ハッシュ値の探索

hashcatを使ってハッシュ値を探索します。以下のようなコマンドで実行します。

hashcat -m 17210 -a 3 Hello.txt.zip.hash --increment '?a?a?a?a' 

  • -m:ハッシュ形式の指定
  • -a:アタックモードの指定
  • --increment:あとに続くマスク形式'?a?a?a?a'の文字数に至るまで一文字ずつ増やす設定(この例では4文字まで実行)
  • '?a?a?a?a':マスク指定

マスクの文字設定 

オプション 概要 内容
?l アルファベット小文字 abcdefghijklmnopqrstuvwxyz
?u アルファベット大文字 ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d 数字 0123456789
?s 記号 !”#$%&'()*+,-./:;<=>?@[\]^_`{|}~
?a ?l?u?d?sと同じ  
?b 16進数 0x00 – 0xff

hashcat.net

 

上記を実行すると1分もしないうちに以下の結果が表示されます。 

$pkzip2$1*2*2*0*13*7*b042d89e*0*43*0*13*b042*ab66*c354e2c6e579378c0784e27df319185a18104b*$/pkzip2$:pass

 

ここまでで、Zipファイルに設定したパスワードを解析できました。

 

その他:hash形式の特定方法

hash値を取得しても、それがどの形式なのかわからないことがあります。

以下はhash形式の識別方法を記載します。

 

hash-identifier
上記コマンドを実行し、 HASH:に求めたいハッシュ値を入力します。

hash-identifierによる識別

hashid

hashidの引数にハッシュ値を渡して実行します。引数にはファイル名も指定できます。

hashidによる識別

 

ご参考:Hack The Boxでの利用例

オンラインでセキュリティスキルの勉強ができるHack The Box(HTB)で実際にhashcatを使用したマシンの記事を以下に記載します。

【Hack The Box】Sunday - 家studyをつづって

【Hack The Box】node - 家studyをつづって

【Hack The Box】Previse - 家studyをつづって

【Hack The Box】Delivery - 家studyをつづって

【Hack The Box】Armageddon - 家studyをつづって

 

 

 

 

HTTPのメソッドをnetcatで実行する

概要

HTTPにはいくつかのメソッドがあります。この記事ではHTTPのメソッドについてまとめ、また、netcatを使って実際の実行結果を見てみます。

netcatとは

netcatとは、TCPもしくはUDP接続などを利用して、コマンドラインからデータを送受信するためのツールです。

 

 

 

HTTPのメソッド

メソッド 概要 備考
GET リソースの取得を行う GETのリクエストでリソースを更新するということは、原則としてあまりよろしくない
POST リソースの作成・更新等を行う  
PUT リソースの更新を行う あまり使われない
DELETE リソースの削除  
HEAD リソースのヘッダ情報のみ取得
(ボディ部分はなし)
 
OPTION サポートされるメソッドを取得する  
TRACE リクエスト内容をそのまま返す

主に動作の確認等で使用

Cross-Site tracingという、XSSとTRACEを利用してヘッダ内Authorizationに含まれる認証情報を盗む攻撃が有名

https://www.gsx.co.jp/tts/activity/110413.pdf

CONNECT Proxyに対しての通信で使用され、指定したサーバへの接続を要求するもの 主にProxyへの接続で使用

 

各メソッドの実行例

以前に構築したKali Linuxの検証環境で、上記のメソッドをKali Linuxからmetasploitable2に対して送信してみます。

 

GETメソッド実行結果

root@kali:~# echo -en "GET / HTTP/1.1\r\nUser-Agent: nc/0.0.1\r\nHost: 127.0.0.1\r\nAccept: */*\r\n\r\n" | nc 192.168.1.222 80
HTTP/1.1 200 OK
Date: Wed, 11 Nov 2020 11:12:55 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2
X-Powered-By: PHP/5.2.4-2ubuntu5.10
Content-Length: 891
Content-Type: text/html

<html><head><title>Metasploitable2 - Linux</title></head><body>
<pre>

_ _ _ _ _ _ ____
_ __ ___ ___| |_ __ _ ___ _ __ | | ___ (_) |_ __ _| |__ | | ___|___ \
| '_ ` _ \ / _ \ __/ _` / __| '_ \| |/ _ \| | __/ _` | '_ \| |/ _ \ __) |
| | | | | | __/ || (_| \__ \ |_) | | (_) | | || (_| | |_) | | __// __/
|_| |_| |_|\___|\__\__,_|___/ .__/|_|\___/|_|\__\__,_|_.__/|_|\___|_____|
|_|


Warning: Never expose this VM to an untrusted network!

Contact: msfdev[at]metasploit.com

Login with msfadmin/msfadmin to get started


</pre>
<ul>
<li><a href="/twiki/">TWiki</a></li>
<li><a href="/phpMyAdmin/">phpMyAdmin</a></li>
<li><a href="/mutillidae/">Mutillidae</a></li>
<li><a href="/dvwa/">DVWA</a></li>
<li><a href="/dav/">WebDAV</a></li>
</ul>
</body>
</html>

 

HEADメソッド実行結果

root@kali:~# nc 192.168.1.222 80
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 11 Nov 2020 07:08:40 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2
X-Powered-By: PHP/5.2.4-2ubuntu5.10
Connection: close
Content-Type: text/html

※リクエストを入力後Enter2回押下 

HEADは上記のようにリソースのヘッダ情報のみ応答が返ります。
HEADはバナー取得に使用されることがあります。

 

TRACEメソッド実行結果

root@kali:~# nc 192.168.1.222 80
TRACE / HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 11 Nov 2020 07:09:35 GMT
Server: Apache/2.2.8 (Ubuntu) DAV/2
Connection: close
Content-Type: message/http

TRACE / HTTP/1.0

※リクエストを入力後Enter2回押下  

 

余談:HTTPSでHEADを送る場合

HTTPSで上記のメソッドを送る場合はopensslコマンドを使用することで実行できます。

openssl s_client -host 宛先 -port 443

 

 

補足:ncの使い方

ncは上記のように、クライアントとして使用することができますが、サーバとしても使用することができます。
以下は、同一端末上でncを使い、サーバとクライアントとして通信させた例です。

f:id:iestudy:20201111201547p:plain

バインドシェルの実行例

オプションは以下の通り

  • -n:DNSによる名前解決を行わない
  • -l:リッスンモード
  • -v:標準メッセージの出力
  • -p:ポートの指定

上記はサーバに対してクライアントがアクセスし、サーバ上でコマンドを実行する構成で、バインドシェルと呼ばれる方法となります。

f:id:iestudy:20201111201728p:plain

バインドシェルのイメージ

 

これとは別にリバースシェルと呼ばれる構成があり、これはサーバ側が接続しに来たクライアント上でコマンドを実行する方法になります。

f:id:iestudy:20201111201816p:plain

リバースシェルのイメージ

f:id:iestudy:20201111201853p:plain

リバースシェル実行例


※ncのオプションで”-e /bin/bash”と指定することでシェルを操作することができます。

今回の試した環境では、Ubuntu側で"-e"が使用できなかったため、バインドとリバースで図が入れ替わっています。

 

参考にさせていただいたサイト

www.intellilink.co.jp

 

 

 

nmapを使ったポートスキャン

概要

nmapとはNetwork Mapperの略で、オープンソースで開発されているポートスキャナです。
nmapには多くのオプションが用意されており、対象ホストのOS情報や稼働しているサービスの情報を調査することができます。

 

 

 

nmapの実行例

nmapは単純に対象のホストを指定するだけでも使えます。

実行例

root@kali:~# nmap 対象のIPアドレス等
Starting Nmap 7.91 ( https://nmap.org ) at
Nmap scan report for 対象のIPアドレス等
Host is up (0.00047s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 対象のMACアドレス
Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds

上述の通りnmapには多くのオプションが用意されており、それらを使うことで対象ホストの情報を取得します。

 

nmapのオプション

オプション 概要
-A OSや動作しているサービスの詳細情報(バージョン等)を表示
-Pn スキャンの実行前のホスト検知として、
ICMP、TCP(80,443)ARPを送信しホストの存在を確認してスキャン実行
-P0 ホストの検知をおこなわずスキャンを実行
-sS SYNスキャン(TCPハーフスキャン)で、
SYNパケットを送ってACK/SYNの応答からポートの状態を確認します。
ACKは返さず接続を完了しないので、ログに記録されません。
-sS TCPスキャン(対象ホストにログが記録される)
-sU UDPスキャン
-sV 動作しているサービスのバージョンを表示
-v

詳細を表示

※-vvとすることでより詳細な情報が表示できる。

-iL IPアドレスのリストをファイルで指定する

 

ポートの状態

状態 説明
open ポートで何らかのサービスが待ち受けている
(ポートが開いている)
closed ポートにアクセス可能だが待ち受けを行っているサービスはない
(ポートが閉じられている)
filtered ポートに対しパケットフィルタが適用されている。
unfiltered ポートへのアクセスは可能だが、サービスの稼働状態は不明

 

参考にさせていただいたサイト

knowledge.sakura.ad.jp

 

 

 

Metasploitの更新と入れ替え

概要

Kali LinuxにあるMetasploitについて、初期インストール状態のものと、GitHubよりインストールしなおしたものではExploitの更新に差があるらしいことがわかりました。
※初期状態ではmsfupdateを実行しても裏でapt updateが行われるのに対し、GitHubからインストールしたものは、直接リポジトリから最新ファイルを取得することができるとのことです。

この記事ではGitからmetasploitをインストールする手順をまとめます。

 

 

 

インストール手順

metasploitのダウンロード

git clone https://github.com/rapid7/metasploit-framework.git
cd metasploit-framework/

RubyGemのインストール

bundle install

なお、実行にあたって、いくつか不足しているものがあったので追加しています。

gem install bundler:1.17.3
gem install pcaprub -v '0.13.0'
gem install sqlite3 -v '1.3.13'
apt-get install libpcap0.8-dev
apt-get install libsqlite3-dev
apt-get install build-essential

データベース設定

データベースのユーザアカウントを作成します。

su - postgres
createuser msfgit -P -S -R -D

※ユーザ名は "msfgit"、パスワードは "msf"
createdb -O msfgit msfgit

データベースの接続情報設定

cd ~/.msf4
vi database.yml

以下の内容を記載します。

production:
adapter: "postgresql"
database: "msfgit"
username: "msfgit"
password: "msf"
port: 5432
host: "localhost"
pool: 256
timeout: 5

GitHubでアカウント作成

GitHub上でアカウントを作成し、以下のコマンドを実行します。

git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"

Metasploitの更新

metasploitのディレクトリで以下を実行します。

./msfupdate

上記で更新処理が実行できます。

実際に元々インストールされているmsfconsoleと今回インストールしたもので、以下のようなコマンドを実行すると、ヒットするエクスプロイトの数が違うことが確認できました。

search 2020

参考にさせていただいたサイト

www.pupha.net

 

github.com

 

 

Hyper-V上でKali Linuxの検証環境を構築する

概要

個人的に勉強中のCompTIA PenTest+に関連して、Kali Linuxの検証環境(Kali Linuxと攻撃対象のmetasploitable2)をHyper-V上に構築しました。
構築した環境のイメージは以下の通りです。

f:id:iestudy:20200821101738p:plain

構築した環境イメージ

※2020/11/06追記

上記に追加して、Hyper-V上に「BadStore」を追加しました。追加手順は記事の後半に記載します。

 

 

 

環境構築

Kali Linuxのインストール

Kali Linuxのインストールについては、こちらの内容をご参照ください。

攻撃対象のmetasploitable2の構築

metasploitable2はRapid7が公開している、セキュリティトレーニングのためのツールで、意図的に脆弱性含んだ仮想のLinuxマシンです。

以下のサイトより、仮想ディスクをダウンロードできます。

sourceforge.net

 

上記サイトではmetasploitable2はvmdk形式の仮想ディスクが公開されており、vmware及びVirtualboxにはそのままデプロイする事が可能ですが、vmdk形式ではHyper-V上にデプロイできないため、vhdx形式に変換します。

vmdk→vhdxへ変換

Microsoftが公開している仮想ディスクの変換ツール「Microsoft Virtual Machine Converter 3.0」を使って仮想ディスクを変換します。

MVMCをインストール後、Powershellを管理者権限で開き、metasploitable2を展開したフォルダに移動します。

Powershell上で以下のコマンドを実行します。

Import-Module 'C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1'

ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath "Metasploitable.vmdk" -VhdType DynamicHardDisk -VhdFormat Vhdx -Verbose

 ここまで実行することでvhdx形式の仮想ディスクが作成されます。

metasploitable2のインストール

仮想マシンは以下のような設定で作成し、動作を確認できました。

f:id:iestudy:20200821102554p:plain

仮想マシンの設定

最初の仮想マシンの作成時、「ネットワークの構成」ではネットワークに接続せず、
仮想マシンの作成後に「設定」より「レガシネットワークアダプタ」を追加してからネットワークに接続します。

上記設定後、仮想マシンを起動すると、ログインのプロンプトが表示されます。
メッセージにも表示されていますが、「msfadmin/msfadmin」でログイン可能です。

 

追記:BadStoreのインストール

「BadStore」はわざと脆弱性が含まれた、やられWebアプリケーションの一つです。

以下のサイトからISOイメージをダウンロードすることができます。

www.vulnhub.com

 

BadStoreインストール

Hyper-V上で新規に仮想マシンを作成する手順で進めます。
起動時に上記よりダウンロードしたISOファイルを指定して仮想マシンを作成します。

また、仮想マシンの作成後、起動前にレガシーネットワークアダプターを追加して起動します。

f:id:iestudy:20201106162523p:plain

レガシーネットワークアダプターを追加

上記の設定後、起動することでBadStoreにアクセスすることができます。

起動するとプロンプトが表示されるので、ifconfigを実行し、BadStoreのIPアドレスを確認します。

確認したIPアドレスを指定してブラウザでアクセスするとBadStoreが表示されます。

f:id:iestudy:20201106162945p:plain

BadStoreにアクセスしたイメージ


 

 

 

GCPのセキュリティ設定を監査してみた「Scout Suite」

背景など

最近ではクラウドの利用が進んでおり、様々な企業がクラウド上にシステムを構築し、データを格納しています。

ascii.jp

クラウドは常に新しい機能が開発されており、クラウドに対する理解が浅いままシステムを構築するとセキュリティの観点からは脆弱な設定になってしまっている場合があります。

また、一般的な脆弱性診断では、システムの脆弱性の有無は確認できますが、クラウド特有の設定項目(IAM等)に対しては対応できない場合があります。

そのため、クラウドの設定を監査できるサービス/ソリューションも多く提供されています。 

 

サービスの例

esg.teldevice.co.jp

it.impress.co.jp

 

 

 

Scout Suiteについて

Scout Suiteとは

今回はクラウドの設定を監査できる無料のScout Suiteを使って、GCP上のサーバ(以前たてたハニーポット)のチェックをしてみました。

 

Scout Suiteの説明は以下の通りです。

オープンソースのマルチクラウドセキュリティ監査ツールであり、クラウド環境のセキュリティポスチャ(技術的および非技術的要素(ポリシー、手順、およびコントロールなど)評価を可能にします。クラウドプロバイダーによって公開されているAPIを使用して、Scout Suiteは手動で検査するための構成データを収集し、リスク領域を強調表示します。

github.com

 

Scout Suiteの構築

今回はUbuntu18.04にScout Suiteをインストールしました。

 

1.Ubuntuでの作業

sudo apt install python3 python3-pip
git clone https://github.com/nccgroup/ScoutSuite.git
cd ScoutSuite
pip3 install -r requirements.txt

 

2.GCP側の設定

ScoutSuiteの説明にもある通り、ScoutSuiteはクラウドが提供しているAPIを使用して設定情報を収集するので、Cloud Resource ManagerのAPI機能を有効化することが必要です。

 

GCPのコンソールより、「APIとサービス」よりCloud Resource Managerを検索し、APIを有効化します。

f:id:iestudy:20200527103603p:plain

APIの有効可

 

補足:Cloud Resource Managerとは

概要としては組織で利用しているGCPの複数プロジェクトをの権限や請求先などを一元管理できる仕組みです。

cloud.google.com

 

APIを利用するためのキーをUbuntuにダウンロードします。「IAMと管理」-「サービスアカウント」より、アカウントのキーをダウンロードします。

※「操作」より「新しいキーの発行」でjson形式でファイルをダウンロードします。 

f:id:iestudy:20200527103722p:plain

キーのダウンロード

 

3.ScoutSuiteの実行

再度、Ubuntu側に戻り、ダウンロードしたキーを登録し、ScoutSuiteを実行します。

 

環境変数の設定

export GOOGLE_APPLICATION_CREDENTIALS="/home/[ユーザー名]/Downloads/[ファイル名].json

 

ScoutSuiteの実行

python3 scout.py gcp --user-account

 

上記コマンドを実行すると、チェックした結果がブラウザで表示されます。

「Checks」にScoutSuiteがチェックした項目数が表示されます。

f:id:iestudy:20200527104533p:plain

実行結果

チェック項目を見ていくと指摘の内容や、指摘の根拠が表示されます。

以下の画面からは、ScoutSuiteが設定チェックのベースラインとして、CISのベンチマークを参照していることがわかります。

f:id:iestudy:20200527104820p:plain

チェック項目詳細

 

 

 

Hyper-v上にKali Linuxをインストールする

概要

Hyper-v上にKali Linuxをインストールしました。今回記事にしたのは、Hyper-vの通常の仮想マシン作成手順でインストールした際に、Kali Linuxのインストールの途中「パッケージの選択とインストール」でエラーが発生しました。そこから試行錯誤しながらエラーが発生しない方法でインストールができたので、その内容をまとめます。

※インストールから、aptを設定してapt upgradeや日本語の設定まで実施するとおよそ2時間程度かかりました。

 

構築環境は以下の通りです。

  • ホストOS:Windows 10 Pro (1909)
  • ゲストOS:Kali Linux 64-Bit 2020.1b

※ホストの詳細な環境は以下の記事にまとめています。

www.iestudy.work

 

 

 

手順(概要)

Hyper-v上で仮想マシンを作成

Hyper-vで仮想マシンの作成を行います。以下の画面では第2世代を選択します。

f:id:iestudy:20200504163343p:plain

世代の指定

また、上記で書いたようにKali Linuxのインストール中に「パッケージの選択とインストール」でエラーが発生したため、ネットワークに接続しないようにしました。

f:id:iestudy:20200504163454p:plain

ネットワークの接続

仮想マシンの作成後、作成した仮想マシンの設定を開きます。第2世代を指定しているので、セキュアブートのチェックを外します。

f:id:iestudy:20200504164509p:plain

セキュアブートの設定

Kali Linuxのインストール

その後、仮想マシンを起動してインストールを行います。インストールの途中でネットワークの設定について聞かれますが、インストール時点ではネットワークの設定を行いません。

f:id:iestudy:20200504164730p:plain

ネットワークの設定

パッケージマネージャの設定もインストール時は行いません。

f:id:iestudy:20200504164937p:plain

パッケージマネージャの設定

GUIを使いたいので「Kali desktop environment」にチェックを入れます。

f:id:iestudy:20200504165148p:plain

ソフトウェアの選択

上記の手順でKali Linuxのインストールができました。

インストール完了後は、Hyper-vの設定でKali Linuxをネットワークに接続し、また/etc/apt/sources.listを修正して利用します。

 

/etc/apt/sources.listの修正について

aptの設定ファイルは「/etc/apt/sources.list」です。上記の手順でインストールを行った場合は参照するリポジトリが記載されていないため修正する必要があります。

Kali Linuxのミラーサイトは以下のサイトで確認ができます。

http.kali.org

上記サイトに記載のあるURLを設定ファイルに追記します。
debはパッケージリストの取得サイトでdeb-srcはdebパッケージの構築に必要なソースのリストを取得するためのもので、私は両方を設定しました。

https://linux3.yz.yamagata-u.ac.jp/pub/linux/kali/README」の例

deb https://linux3.yz.yamagata-u.ac.jp/pub/linux/kali kali-rolling main contrib non-free
deb-src https://linux3.yz.yamagata-u.ac.jp/pub/linux/kali kali-rolling main contrib non-free

 

日本語入力の設定

ターミナルより以下のコマンドを実行します。

apt install task-japanese task-japanese-desktop

インストール後、再起動すると画面の右下に赤枠のアイコンが表示されるようになり、半角/全角キーで入力を切り替えできます。

f:id:iestudy:20200505110212p:plain

再起動後の様子

VNCによる接続設定

他のPCからVNCクライアントを使用してKaliにGUIで接続する設定をします。

 

Kaliでの設定

接続されるKali Linux側で必要なパッケージをインストールします。

user@kali:~$ sudo apt install tightvncserver
user@kali:~/.vnc$ sudo apt install lxde

 

vncserverの設定をします。

user@kali:~$ vncserver

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Verify:

New 'X' desktop is kali:1

Creating default startup script /home/user/.vnc/xstartup
Starting applications specified in /home/user/.vnc/xstartup
Log file is /home/user/.vnc/kali:1.log

 

設定変更を行うため、一度プロセスを終了します。

user@kali:~$ vncserver -kill :1
Killing Xtightvnc process ID 2412

 

~/.vnc/xstartupを設定します。
※設定内容を理解しきれていませんが、私の環境では以下の設定で動くようになりました。

user@kali:~$ mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
user@kali:~$ vi .vnc/xstartup
#!/bin/sh

xrdb $HOME/.Xresources
xsetuser -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
/usr/bin/startlxde

 

vncserverを起動します。

user@kali:~$ chmod +x ./vnvnc/xstartup
user@kali:~$ vncserver :1

New 'X' desktop is kali:1

Starting applications specified in /home/user/.vnc/xstartup
Log file is /home/user/.vnc/kali:1.log

 

上記の設定後、接続元となるPCで設定を行います。

 

接続元PCでの設定

接続する側のPCでVNCクライアアントをインストールします。
インストール後、新規接続先でKaliを設定します。
※接続先のアドレス(ホスト名)の後に「:1」のような指定をします。
これはKaliでvncserver :1としたときの値です。

f:id:iestudy:20210322153642p:plain

vncクライアント設定イメージ

上記設定後、Kaliに接続することでGUIが表示されました。 

 

補足:Hyper-vのネットワーク設定について

Hyper-V上のゲストとホストとの通信に関して、ホストとゲスト間で通信をさせない場合は、仮想スイッチの設定で、「管理オペレーティングシステムにネットワークアダプタの共有を許可する」のチェックを外します。

この設定により、仮想スイッチに接続した物理NICはホストから独立します。
※ipconfigでも表示されません。

qiita.com

 

 

 

AlexaでSwitchbotを操作する

概要

Switchbotは普通の(アナログの)スイッチを「押す」という動作を行ってくれるデバイスです。

 

 

スマートフォンのアプリや、専用のコントローラからBluetooth経由で操作ができるのですが、今回はすでに自宅にあるAlexaに呼びかけることで、Switchbotを操作できるような仕組みを作りました。

概要は以下の通りです。

f:id:iestudy:20200402135404p:plain

一連の流れ

MQTTとは

MQTTとはMessage Queue Telemetry Transportの略で、publish/subscribeモデルという仕組みに基づいてつくられた軽量なメッセージプロトコルです。
ネットワークが不安定な場所や、性能が低いデバイスでも動くように軽量化されているのが特徴です。

Publish/Subscribeモデルとは

  • MQTTではデータの送受信をPublisher(送信者)、Subscriber(受信者)の2つの役割にわけて行います。
  • PublisherはMQTTブローカーにデータを送信します。
  • SubscriberはMQTTブローカーにデータを受信しに行きます。

上記により非同期通信を実現しています。また、PublisherとSubScriberはMQTTブローカーを介在するので多対多の通信が可能です。

 

構築の流れ

MQTTブローカーの設定

BeebotteというMQTTブローカーを使用しました。

  1. ChannelとResourceの作成
    「Channels」-「Create New」 より、「Channel Name」と「Resource name」を入力してチャネルを作成します。
  2. トークンの取得
    1で作成されたChannelをクリックするとトークンが表示されるのでメモしておきます。
  3. 動作テスト
  • 「Account Setting」-「Access Management」より、「Secret Key」を確認します。
  • 「Console」で「Secret Key」を入力し、「Subscribe」で「Channel name」及び 「Resource name」を入力します。
  • Linux端末(用意したRaberry Pi等)から以下のコマンドを実行し、Messagesと Logsに実行内容が表示されれば試験完了です。

curl -i -H "Content-Type: application/json" -X POST -d '{"data":"Hello World"}' http://api.beebotte.com/v1/data/publish/[Channel名]/[Resource名]?token=[トークン]

 
また、Beebotteの証明書をダウンロードします。

wget https://beebotte.com/certs/mqtt.beebotte.com.pem

 

RaspberryPiの設定

RaspberryPiにPythonプログラムをデーモンとして常駐させます。

今回は自宅にあったRasberry Pi3を使用しました。

先ほどのBeebotteの証明書と以下のソースコードを、「/usr/local/lib/switchbot/」に配置します。

/usr/local/lib/switchbot/switchbotd.py
import os
import sys
import time
import json
import logging
import time
import paho.mqtt.client as mqtt
import binascii
from bluepy.btle import Peripheral
TOKEN = "Beebotteのトークン"
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
TOPIC = "Beebotteのチャンネル名/Beebotteのリソース名"
CACERT = "/usr/local/lib/switchbot/mqtt.beebotte.com.pem"
SWITCH_MAC = "スイッチボットのMACアドレス"
SWITCH_NAME = "スイッチボットの名前"
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s- %(name)s - %(levelname)s - %(message)s')
_LOGGER = logging.getLogger(__name__)
class SwitchBot:
def __init__(self, name, mac):
self._mac = mac
self._name = name
def action(self, act):
for connection in range(1,6):
try:
p = Peripheral(self._mac, "random")
except:
_LOGGER.error('Connection attempt failed after {connection} tries')
time.sleep(1)
continue
break
else:
_LOGGER.error('Connection to Switchbot failed')
try:
hand_service = p.getServiceByUUID("cba20d00-224d-11e6-9fb8-0002a5d5c51b")
hand = hand_service.getCharacteristics("cba20002-224d-11e6-9fb8-0002a5d5c51b")[0]
if act == "on":
hand.write(binascii.a2b_hex("570101"))
elif act == "off":
hand.write(binascii.a2b_hex("570102"))
elif act == "press":
hand.write(binascii.a2b_hex("570100"))
p.disconnect()
except:
_LOGGER.error("Cannot connect to switchbot.")
switch_bot = SwitchBot(SWITCH_NAME, SWITCH_MAC)
def on_connect(client, userdata, flags, respons_code):
print('status {0}'.format(respons_code))
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
data = json.loads(msg.payload.decode("utf-8"))["data"][0]
data = {key:value.strip() for key, value in data.items()}
if "action" in data.keys():
switch_bot.action(data["action"])
def fork():
pid = os.fork()
if pid > 0:
f = open('/var/run/switchbotd.pid','w')
f.write(str(pid)+"\n")
f.close()
sys.exit()
if pid == 0:
main()
def main():
client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()
if __name__=='__main__':
fork()

サービスとして起動するために以下のファイルを作成します。

/etc/systemd/system/switchbotd.service
[Unit]
Description=SwitchBot

[Service]
ExecStart=/usr/bin/python3 /usr/local/lib/switchbot/switchbotd.py
Restart=always
Type=forking
PIDFile=/var/run/switchbotd.pid

[Install]
WantedBy=multi-user.target

また、上記を事項する際にいくつかエラーが出ました。必要なモジュールが不足していたために出たものですが、以下のコマンドを実行しました。

pip3 install paho-mqtt python-etcd
pip3 install bluepy

 

IFTTTの設定

IFTTTの「this」の設定で「Alexa」を指定します。「Say a specific phrase」を選択します。ここで設定したフレーズではAlexaに呼びかけません。

 

「that」の設定で「WebHook」を指定し、以下を設定します。

  • URL:http://api.beebotte.com/v1/data/publish/[Channel名]/[Resource名]?token=[トークン]
  • Method:POST
  • Content Type:application/json
  • Body:{"data":[{"room":"living","device":"電気","action":"on"}]}

最終的に、以下のような設定となります。

f:id:iestudy:20200404224607p:plain

IFTTTの設定

 

Alexaの設定

  • Alexaアプリから「定型アクション」をタップします。
  • 定型アクション名に任意の名前を入力し、実行条件を設定をタップします。
  • 開始フレーズを設定から定型アクションを実行するためのフレーズを設定します。
    ※ここで設定した内容でAlexaに呼びかけます。
  • アクションを追加の+をタップし、IFTTTを選択します。
  • 前工程で作成したIFTTTのアプレットを追加します。
    (アプレットの名前ではなくフレーズが表示されます。)

ここまで設定が完了すると、Alexaアプリで設定したフレーズでswitchbotが操作されます。

 

参考にさせていただいたサイト

qiita.com

qiita.com