プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

WEPとWPA【セキュリティ】

今回は、WiFiのセキュリティ(ワイヤレスセキュリティープロトコル)についてです。
WEPとWPA
WEP
RC4アルゴリズムをベースとした共通鍵暗号を採用している。
・64bitまたは128bitの共通鍵を使用
WPA
・4way Handshakeを用い、テンポラリーキー(PTK)を作成。
4way Handshakeとは、暗号鍵を交換する手順。無線AP(無線LANアクセスポイント)と無線クライアントのMACアドレス、etcの情報から一意の鍵を作る。
参考:
https://milestone-of-se.nesuke.com/nw-advanced/nw-security/krack/
無線LANの基本とセキュリティ技術 | 技術コラム集 | [技術コラム集]組込みの門 | ユークエスト株式会社

Beaconってどこかで聞いたことある用語だったのですが、定期的にAPがいるよ!って呼びかけるのためのパケットだったんですね。
WEPは弱点が多い(パケットを収集すると、WEPキーが解読できる。①秘密鍵が同じ②それが場合によって40bitしかない③IVの数値が暗号化されずデータに付加され送られる④IVに対して実際に毎回異なる数値を使用していたとしても、 データのやり取りで数時間で一巡、また同じ数値を使う)
IVというのは、initialization vectorの略で、初期値ベクターなんていう。RC4を使用して暗号化データを生成すると、同時に生成されるもの。24bitの乱数になる。
詳しくないのですが、24bitって少ないような。それが脆弱性を産むってことでしょうか。
このWEP・WPAという方法で生成される鍵を解析するために、aircrack-ngを使ってみます。
aircrack-ngはBackTrackに含まれているものです。
BackTrackとは、VMWareイメージの名前です。とうとうVMWare使わなきゃいけない時が来たか・・・。
が、現在はBackTrackはなく、後継としてKali Linuxがリリースされている。
というわけで、VMWareを入れてKali LInuxを入れた。
f:id:boa0203:20191122140154p:plain
入れました。
次に無線LANアダプラをMonitor modeにします。
無線LANアダプタはAPからの発信を受け取る機械で、Monitor modeはデータの送受信を行わず、無線LAN上を流れるパケットを監視するだけの特別なモードのことです。

airmon-ng start wlan0

これをすると、こんな文が出て来ました。
kill them using 'airmon-ng check kill' before putting the card in monitor mode, they will interfere by chaning channels and sometimes putting the interface back in managed mode.
カードをモニターモードにする前に「airmon-ng check kill」を使用してそれらを強制終了すると、チャネルを変更したり、インターフェイスをマネージモードに戻したりして干渉します。

説明ってことでいいんでしょうかね。

iwconfig

これは無線LANインターフェース設定用コマンドです。
しかし、これを叩くと
no wireless extensions.
え、拡張機能ないの・・・

ifconfig -a

で、システムが検出したすべてのネットワークインターフェイスを一覧表示。 出てくるethとかloはインターフェース名。
ethはイーサネット(データリンク名:直接接続された機器間で通信するためのプロトコルやネットワークをさす言葉)の場合振られる名前、loは説明があったので引用します。

「ローカルループバック」と呼ばれる特別な仮想インタフェースだ。eth0などとの違いはこうだ。eth0もloもホスト自身だが、eth0にはネットワークインタフェースの実体がある。loはOSのプロトコルスタックスタックが必ず提供することになっており、ネットワークインタフェースを全く設置していない場合にも、このloだけは存在する。そうした初期状態であっても仮想的にネットワークのテストなどに使えるように用意されているのだ。loのIPアドレスとして必ず127.0.0.1が割り当てられる。当然このIPアドレスを用いて外部と通信することはできない。

引用元:
ifconfig 〜(IP)ネットワーク環境の確認/設定を行う:ネットワークコマンドの使い方 - @IT
プロトコルスタックは、コンピュータ上で、通信を実現するための一連の通信プロトコル群を実装しているモジュール(プログラム部品)のこと。
※色々いじる前に、sources.list(パッケージ(ソフトのこと)をどこから取得するかが書かれているファイル)を確認した方がいいかも。自分のlistは空になっていたんで、ここに書いてあるミラーサーバ指定を自分で書き込まなければいけなかった。
ifconfigでネットワークを見ると、wlanがない。よく見るとmacからwifi飛ばしているのに、debianから見ると、有線になっている。
そのあと無線にならないか試行錯誤しましたが、結局無線にすることができなかったのでaircrack-ngを使って解析することはできませんでした。
そもそも仮想PCだとできないのか?ラズパイに入れて解析したらできたのか?
消化不良なので、続編書くかもしれないです。

Windowsコマンド集など【復習】

次回からは自分で対処できるように残します。

nbtstat --NetBIOS情報の表示
nbtstat -c でIPアドレスとか、キャッシュとか見れました。
nbtstat -a でNetBIOS名で指定したリモート・コンピュータのNetBIOS名テーブルを表示します。

ipconfig Windowsのネットワーク設定が見れます

DNS
ドメイン名とIPアドレスの対応付け、メールの宛先ホストを支持するためのシステム。

UDPTCP
トランスポート層プロトコル
TCPは、コネクション型で信頼性のあるトランスポート層プロトコル。両端のホスト間で到達性を保証する。
対してUDPは信頼性はない。パケット数が少ない通信や、ブロードキャストやマルチキャストの通信、ビデオや音声などのマルチメディア通信に向いている。


参考:
DNSのしくみ - ネットワークエンジニアを目指して
インターネット10分講座 DNS - JPNIC
@IT:DNS Tips:DNSがUDPを使うのはなぜですか?

タクトスイッチを使った電子工作【ラズパイ】

勉強になりました:


https://www.fabshop.jp/lesson3-controlling-led-with-switch/


【電子工作】プルアップ回路とプルダウン回路とは?(危険回路についても) - Qiita


マイコン入門 LEDの点灯・消灯制御方法【入出力ポート機能】

参考書通りにタクトスイッチを動かしてみようと色々やっていたのですが、うまく行かないので色々調べました。

まず①通りに行いました。
f:id:boa0203:20191007154624j:plain:w300
f:id:boa0203:20191007154651j:plain:w300

抵抗が見合った大きさになっているのかが心配ですが、ちゃんと動きました。
①のプログラムの中で、以下のような分岐があります。

if GPIO.input(BtnPin) == GPIO.LOW:
print ('...led on')
GPIO.output(LedPin, GPIO.LOW)
else:
print ('led off...')
GPIO.output(LedPin, GPIO.HIGH)

ここがよくわからなかった。
①記事の中で、プルアップ抵抗をプログラム上で設定しており、ボタンが押されていない時には3.3Vがかかっている。そのため、ボタンを押さなければ入力はHigh(3.3V)になっているのでelseにいくといったような説明があります。

プルアップ抵抗というのは、②の記事の内容がわかりやすいのでみて欲しいです。
ショート回路(ボタンの抵抗値がないためショートしてしまう)・オープン回路(インプットがボタンが押されていない時にどこにもいけなくなってしまう)の説明があります。
ショート回路・オープン回路にならないために、抵抗をかませる(→プルアップ・プルダウン抵抗)が必要なのです。

プルアップ・プルダウン抵抗は理解し、疑問は再び①のプログラム分岐に戻ります。

if GPIO.input(BtnPin) == GPIO.LOW:
print ('...led on')
GPIO.output(LedPin, GPIO.LOW)
else:
print ('led off...')
GPIO.output(LedPin, GPIO.HIGH)

プルアップ抵抗を設定しているので、スイッチを押さなければ常に3.3Vが流れているのはわかりました。
しかしLOWの時、(スイッチが押されたとき)にLEDは光ります。
LOWの時は0Vになっているのに、何故outputにGPIO.LOWを入れると光るのでしょうか。

そこで③を見ます。
③でLEDの光る構造がわかります。
LEDは電位差が生じることにより、電源から電流が放出されマイコン側に流れ込みLEDが点灯します。
常に流れているのは3.3Vで、GPIOの出力を0Vにする。
そこで電位差が生じるので電流が流れてLEDが点灯する、という理解を今しています。

ここまで調べた後、参考書のタクトスイッチを動かしてみました。
プルアップ抵抗を変えるとちゃんと動作したので、良かったです。

OpenVASを使って脆弱性診断【セキュリティ】

IOTの数回続く講習会に参加しており、初回はOpenVASを使った脆弱性診断を行いました。
それを家で試してみたので、その内容です。

参考にした記事:
stqp.hatenablog.com

まずはdockerからOpenVASをインストール(これは参考記事内にコマンドがあります)
そしてOpenVASを起動。

$docker start [CONTAINER ID]

そして、 https://localhost:1234/login/login.html に接続すると、このような画面が出てきます。

f:id:boa0203:20191002181530p:plain

adminでログインし、上部にあるTaskから診断したい端末を登録します。
今回自分はラズベリーパイを登録してみました。
f:id:boa0203:20191002182018p:plain

その結果がこちら。
f:id:boa0203:20191002182759p:plain

あんまり結果が思ったようになっていない(初期設定のパスワードなどがまずいよと引っかかると思っていた)ので、ちゃんと診断できていないのではないかと何度か試してみました。
しかし、結果は同じ(pingも飛ぶし、ssh接続もできる)

後日2回目の講習会の時に聞いてみたら、この状態で診断はちゃんとなされているそうです。
ラズパイだとあんまり結果が出ないとのこと(そもそもラズパイ自体にセキュリティ入っているから、見つからないのかもしれない)

以上です。
2回目の講習会の内容もこれからやってみます。

アマチュア無線3級に合格しました

アマチュア無線3級に合格したので、使ったテキスト2冊をご紹介します。
まず1冊目

初めての3級・4級アマチュア無線技士試験 テキスト
「初めての3級・4級アマチュア無線技士試験 テキスト」
手始めにこれを1回読みました。
そもそも何故アマチュア無線受けたのかというと、今ラズベリーパイで勉強したりしてまして、回路図を見る機会が増えてきました。
ですが、回路図を見るのなんて学生時代ぶりだったので、忘れていることも多くてやりづらいかったのです。
そこで、一度基礎が暗記できそうな資格の勉強すれば少しはやりやすくなるかなと思い勉強を始めました。

次に2冊目
第3級ハム解説つき問題集-2018-2019年版-アマチュア無線技士問題集
「第3級ハム解説つき問題集 2018/2019年版 (アマチュア無線技士問題集) 」
アマチュア無線は暗記ものなので、問題集を解きまくりました。
この2冊で受かることができました。合格と言っても、この資格はそこまで難しいものではないので暗記さえすれば簡単に受かることはできるのですが・・・。

そして資格の申請をしないといけないのですが、住民票かなんか書類が必要なのでまだ申請できていないです・・・早く役所行かなくては。

ハッキングの本をはじめて読んだ【IOT】

ハッカーの学校 IoTハッキングの教科書

ハッカーの学校 IoTハッキングの教科書

セキュリティ関係も勉強したいなと思っていて、かつIOTにも興味があったので、この本を読みました。
この本の中で、ハッキングする方法として
①IOT機器とスマートフォン間の通信のみを解析する。
②基板から組み込まれたプログラムを抽出、解析してハッキングする。
この大きく2つの攻撃パターンがある。

①の方が難易度が低く、時間もコストもかからない手法です。
ですが以下のように書かれていました。(P35)

難易度が低く時間もコストもかからない手法は①になるでしょう。
しかし、①の手法はホワイトボックステストソースコードや仕様書などを用いてシステムに攻撃するアプローチ)とブラックボックステスト(実際の攻撃者による視点でシステムに攻撃するアプローチ)の概念から考えると、ブラックボックステストに分類される手法で、発見される脆弱性ホワイトボックステストに比べて成果はかなり低くなると予想できます。

①の方がセキュリティの穴が見つかりにくいのか。
そして②の方法については

基板に組み込まれたプログラムを抽出することで、例えばバイナリファイルとして電子錠の挙動を調べることができます。
ここで、もしスマートフォンなどの通信からは発見できない「管理者機能」のような隠れたモードを発見できれば大きな成果となります。
また、もしスマートフォンから送信する値に関連したプログラムロジックというものが明確になります。

②の方が大きい結果が出ると。
で、この本も②のハッキングテクニックの説明が書かれてある(まえがきにも書かれてあった)

色々な方法を読んだ上で、基板の部品の名前(UARTとか)とそれが何なのかも少しわかった。
ので、自宅にあったものを分解した。

会社の忘年会ビンゴで当たったもの。
余談ですが、これ結構面白かった。思った以上に会話ができる。

中身はこうなってました。

f:id:boa0203:20190101103313j:plain:w300

裏面


f:id:boa0203:20190101103951j:plain:w200

有識者によると
黄色丸→CS8571Eという部品。オーディオ関係
緑丸→抵抗

参考書に出てくる部品のような、通信機能を司るものは反対側の

f:id:boa0203:20190101104458j:plain:w200
ここにあると思うのですが、接着剤のようなもの(グルーというらしい)で貼っつけてあって確認することができませんでした。

そうして色々考えたのですが、ハッキングできるようになるにはもっと電子部品に関する知識を身につけた方が良いなという結論になりました。

そこで、以下のようなものを購入しました。

Raspberry Pi クックブック 第2版 (Make:PROJECTS)

Raspberry Pi クックブック 第2版 (Make:PROJECTS)

買ったものが届くのが楽しみです。

以下、個人的な感想
はじめて読むには難易度が高かったです。
しかし、具体的なテクニックを見ていると自分もここまでできるようになりたいと思えたので買ってよかったなと思いました。
以前TCPIPの参考書を読んだ時、1から丁寧に説明がなされていました。
それも良本でしたが、少し難しめのものを買ってみるのも悪くはないなと。
あと、用語も調べながら読めたので少しは覚えることができたのも収穫でした。

RDBについて【正規化、論理学】

この本を読み終わったので、忘れないうちにまとめます。
断定して書いているが、間違っていることもあると思う。
「'---」が付いている行は個人的に感じたこと。

リレーショナルモデルとは、現実世界のデータを「リレーション」と呼ばれる概念を用いて表現するデータモデルのこと。
→データをリレーショナルモデルという考え方を使ってデータを表現する。

'---オブジェクト指向もプログラミングの考え方の1つというイメージだった。
'---RDBはデータの捉え方とそのデータをまとめる方法。

このRDBで最も重要な概念が、リレーション。
SQLにおいてリレーションに相当するものは、テーブル。

リレーショナルモデルでは見出し(Heading)と本体(Body)のペアで構成されている。
この見出しは属性の集合で、本体は属性値の集合である組、タプル(tuple)の集合である。
→属性というのは、名前とデータ型のこと

リレーショナルモデルは集合論に基づいたものであり、論理学に基づいたデータモデルでもある。
論理学は命題(真か偽かを問うもの)を扱う学問。
ある命題の真偽が判明している時、もっと複雑な命題の真偽はどうなのか?がテーマ。
→論理学を何故理解する必要があるのかというと、リレーションは真の命題の集合であると言えるから。

'---JOINが古いクエリではWHEREを使って使用しているのは、これが関係しているのだとわかった。
'---CASEなどの分岐も、命題の結合子(∧とか)と同じ。真のものを抽出したい。
'---量化という言葉を初めて知った。
'---量化は、集団を対象にした真偽値を問うもの。

正規化について

→正規化は、リレーション(テーブル)を扱いやすくするための理論。
 正規化理論自体は、リレーショナルモデルそのものの一部ではない。

→理論:ある物事に関して、原理、法則を拠り所として筋道を立てて考えた認識の行動体系。
    また、「実践を伴わない理論は役に立たない」のように、実践に対応する純粋な論理的な知識の意でもある。
 論理:思考などを進めていく筋道そのもの。また、道理、事柄間の法則的なつながりをいうこともある。

'---理論、論理という言葉は参考書の中でよく出てくる。
'--- ≒ 考え方 という感じで理解していたけども、「筋道の立てられている考え方」と改める。


ここからより本を理解するため、架空のテーブルを作成する。

・これは架空の人格を持つ生き物のの人生をまとめた集合
・連動するアプリケーションがあり、そこで追加、更新、削除ができる

①基本情報テーブル
 種別(人間かそうでないか) 
 性別(男、女、その他)
 出身地
 居住地
 生年月日
 候:名前

②エピソードテーブル
名前 →2NFで候補キー追加
西暦 →2NFで候補キー追加
エピソードタイトル
出来事(その年にこの人物の身に起こったこと)

BCNFで変更
②-1
候:名前
候:西暦
候:エピソードタイトル

4NFでさらに変更
 ②-1_A
 候:名前
 候:西暦

 ②-1_B
 候:名前
 候:エピソードタイトル



②-2
候:エピソードタイトル
出来事(その年にこの人物の身に起こったこと)


③関係性テーブル
名前
所属組織番号

④組織マスタテーブル
 候:所属組織番号
 候:所属組織名

思いついたのはこのくらい

このテーブル構造で良いのか考える

第1正規形(1NF)

各テーブルに重複が出てこないか?
→同一名の生物が出てこないので、重複はでてこない(と思う)

ちなみにリレーショナルモデルには主キーという概念がない。
候補キー(単にキー)という概念はある。候補キーは、テーブルに含まれる組の値を一位に決められる属性の集合。
また候補キーは、複数の種類を持つこともある。
候補キーは主キーと意味的・機能的には違いはない。候補キーを主キーと呼ぶかは主観の問題。

'---①基本情報テーブルの候補キーはスーパーキー?

各カラムはさらに分解できないか(値のアトミック性)
→名前は名と姓に分解できるが、名前という集合で意味を成せるのでOK

NULLはでないか?
→所属組織番号を持っていない生物がいるかもしれないが、その生物関係性テーブルには登録しない。
 また所属組織番号が複数持つ生物が出てくる場合、関係性テーブルは複数登録を可能とする。

第2正規形(2NF)

2NFは候補キーの真部分集合から非キー属性(Non-prime Attribute)への関数従属性を取り除く作業。
→関数従属性とは、Aの値がわかれば、Bの値が求められるということ。
→真部分集合は、部分集合のうちもとの集合自身以外のものを指す。
'---タプル全体としてみれば重複していなくても、一部で重複していて異常が生じそうなものを複数のテーブルへ分解する。
'---真部分集合が解りづらい。候補キー全体としてではなく、ある候補キーから求められる非キー属性の値に異常が出てきそうと言った意味合いかな。{x,y}

②エピソードテーブルが怪しいのではないかと思ったので、考える。
f:id:boa0203:20180930073618p:plain

データを入れて重複が発生しないか見てみる
大丈夫そうだけども、違うところで問題が起きそうなので名前と西暦を候補キーにする

第3正規形(3NF)

推移関数従属性(Transitive Dependency)を取り除く作業。
'---非キー(候補キーでないもの)同士で関数従属性が発生しているものを考える作業。
架空のテーブル群にはなさそうだけども、以下の状態だったとき分解した方がいい。

③関係性テーブル
 名前
 所属組織番号
 所属組織名

'---所属組織番号がわかれば、所属組織名は求めることができるので分解できる。

ボイスコッド正規形(BCNF)
非キー属性から候補キーの真部分集合への関数従属性で分解した方が良いものが無いか考える。
非キーが候補キーになり得てしまわないか?
②エピソードテーブルのエピソードタイトルが候補キーになり得そう。

②エピソードテーブル
 名前 →2NFで候補キー追加
 西暦 →2NFで候補キー追加
 エピソードタイトル
 出来事(その年にこの人物の身に起こったこと)

②-1
 名前 →2NFで候補キー追加
 西暦 →2NFで候補キー追加
 エピソードタイトル →BCNFで候補キー追加

②-2
 候:エピソードタイトル
 出来事(その年にこの人物の身に起こったこと)

第4正規形、第5正規形は結合従属性を取り除く作業。
→結合従属性は、リレーションを分割して再度結合しても値が失われないもの。

第4正規形(4NF)、第5正規形(5NF)

多値従属性(MultiValued Dependency)による正規化とだが、本によるとMVDは特殊なパターンとのこと。
MVDは、テーブルRの項目A、B、Cが次の結合従属性を満たす場合かつその場合に限り、B及びCはAに多値移植するという。

{AB,AC}
'---テーブルに候補キーが3つあった場合、1つの項目によって他2つが求められる場合のことかな

4NFで取り除かれるのは上記のもので、第5正規形(5NF)で取り除かれるものは

{AB,BC,CA}

このようなもの。
'---4NFではAによってのみBとCが求められたが、5NFではA以外でも結合従属性がある時どうするかを考えるものみたい
'---本文を見ると、リレーションの条件はどうであったか、分解したリレーションがこれで良いのかも見ていた。

4NFについて見ると、②-1のテーブルがさらに分解できそう。 

 ②-1_A
 候:名前
 候:西暦

 ②-1_B
 候:名前
 候:エピソードタイトル

'---5NFで分解できそうなものは、架空のテーブルには存在しなかった。

第6正規形(6NF)
可能な限り無損失分解できるか考えるのが6NF。
6NFまで分解したリレーションは無駄な結合が多くなってしまうので、6NFを目指してリレーションの正規化を行うことはない。
'---①基本情報テーブルは6NFを使うと5つに分解できる。けれども確かにそこまでする必要はないかなと思う。
'---考えるとしたら、項目の多すぎるリレーションがあった場合、2つに分解するとか。

以上で正規化を終えた。

①基本情報テーブル
 種別(人間かそうでないか) 
 性別(男、女、その他)
 出身地
 居住地
 生年月日
 候:名前

②-1_A
 候:名前
 候:西暦

②-1_B
 候:名前
 候:エピソードタイトル

②-2
候:エピソードタイトル
出来事(その年にこの人物の身に起こったこと)


③関係性テーブル
名前
所属組織番号

④組織マスタテーブル
 候:所属組織番号
 候:所属組織名

以下、個人的な感想

本では他にも重複やNULLを排除する方法、リファクタリング等、DB設計において考える必要な要素について説明がなされている。
どれも重要な内容だが、中でも第二章と第十章が面白かった。
第十章で出てくるグラフ理論というのが、初めて知ったのでこれをさらに勉強したい。
本の中で、とても好きな文章があった(P129)のでそれだけ抜粋して終わりとする。

 ところで、ナチュラルキーという言葉は自然という名前からすると、いかにも、この宇宙に最初から存在しているような印象を受けます。
しかし、それは誤解です。
自然界に最初から宇宙の摂理として存在する、ラベルなどというものは存在しません。
物や概念の名称や番号などのラベルは、すべて人間が勝手につけたものです。歴史的経緯に差はあれど、全て人工物であるということは、認識しておいたほうがよいでしょう。
 そういう観点で見れば、ナチュラルキーもサロゲートキーも本質的な違いはありません。
 過去に他の誰かが割り当てたIDを用いるか、自分でIDを割り当てるかというだけの違いなのです。