よーでんのブログ

One for All,All for わんわんお!

kali piのインストールとsshの設定

kali piをインストールした

しました。
やり方わかれば簡単だけど、手探りでやって2日かかったので書く。

PC ラズパイ
Windows10 Raspberry Pi 3 Model b+

PCとLANケーブルで直接接続。
「PCからsshができ、ネットに繋がる」のがゴール。

IPアドレスは固定する。

インストール

まずはインストール。ipusironさんのハッキングラボの作り方を参考にしました。

  1. 公式からダウンロード、解凍
    私は RASPBERRYPI FOUNDATION / Kali Linux RaspberryPi 2, 3 and 4をダウンロードしました。
  2. SDメモリーカードフォーマッターをダウンロード、解凍
    microSDをPCに挿すと下画像のようなフォーマッターが起動しましたが、これは後々エラーが起きました f:id:y0d3n:20200630235524p:plain
  3. Win32 Disk Imagerをダウンロード
  4. SDメモリーカードフォーマッターを起動 (SD Card Formatter)
    私はE:¥が選択されていたのでそのままフォーマット。(私の場合は10秒程度) f:id:y0d3n:20200630235402p:plain
  5. Win32 Disk Imagerを起動
    先ほど解凍した、kali piのimgファイルを選択し、Write。(私の場合は15分程度) f:id:y0d3n:20200630235737p:plain

エラー無く完了すればSDカードに書き込めているはずです。

PC側の設定

設定 / ネットワークとインターネット / 状態 / ネットワークと共有センター を開く。
インターネットアクセス可能なアダプタと、インターネットアクセスなしのアダプタが書いてあるはず。

インターネットアクセス可能なアダプタを選択(私の場合はWi-Fi)
プロパティを開き、共有タブを開く。

ネットワークのほかのユーザに、このコンピュータのインターネット接続をとおしての接続を許可する

にチェックを入れ、プルダウンメニューからイーサネットを選択してOKをクリック。

ラズパイ側の設定

ssh

電源やLANケーブル、モニター、SDカードをよしなにしたら、起動する。
初期パスワードは以下。

user pass
kali kali

ip addr showipアドレスを確認。
eth0IPアドレスが割り当てられてない場合は何かが上手くいってないです。
私はsudo rebootしたり、 PC側の設定のチェックを切り替えたりしてたら上手くいきました。

私はここで、192.168.137.201/24が割り当てられたので、現状は以下のような感じ。

IP address Net mask Gateway dns-nameservers
192.168.137.201 255.255.255.0 192.168.137.1 192.168.137.1

ipアドレス

/etc/network/interfacesを編集していく。
ホスト部の3桁の数字を変えることができる。被らなければ適当で良いだろう。
個人的に115という数字に所縁があるので、私は192.168.137.115に設定する。

/etc/network/interfaces編集前

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

/etc/network/interfaces編集後 (addressなどの値は適宜書き替えてください)

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.137.115
netmask 255.255.255.0
gateway 192.168.137.1
dns-nameservers 192.168.137.1

再起動すると、192.168.137.115/24が割り当てられる。

ping 8.8.8.8で外部ネットワークにでれるか確認する。
しかしpingの権限がなく、実行できない。
sudo chmod u+s /bin/pingで権限を付与してからもう一度pingをすればうまくいくはず。

これで、PCからsshできる かつ ネットワークに接続できるようになった。

あとはパスワードとか設定とかよしなにすれば、快適なssh kali piライフが送れる。はず。

トラブルシューティング

トラブルシューティングというか、私が引っかかったところについて。

/etc/network/interfaces

まず、/etc/network/interfacesを以下のように編集していた。

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.137.115

gatewayなどが抜けている。よくよく考えたら「うん。。。」という感じ。

私「LANケーブルをPCと繋いだだけではネットワークに繋がらないのか・・?」(そんなことは無い)

eth0では無理だと勘違いしたので、Wi-Fiに繋いでwlan0でネットワークに繋げようとした。
Wi-Fiに接続後、IPアドレスが割り当てられているのを確認した。
しかし、外部ネットワークに出ることができない。

とりあえず再起動してみる。

起動中に何か出た。Enterがどうのこうの言っていたのでとりあえずEnterを押した。

ログイン画面。kali:kaliでログインしたところ、デスクトップが一瞬だけ表示され、勝手に再起動する。
以降ループ。

起動できなくなった。。。。。。

今度はエラー文をちょっと調べてみるもよくわからない。どうせ何もカスタマイズもしてないので、
SDカードへの書き込みからやり直した。

10回ほどこれを繰り返した結果、LANケーブルのみ、もしくはWi-Fiのみの時は普通に起動できるが、
両方接続すると起動できなくなることが判明。(原因はわからないけど)

私「eth0では無理。かといってeth0とwlan0を両立させたら毎回初期化しなきゃいけない。。。」
 「wlan0で接続してればsshできるけど、Wi-FiでIP固定するのはなんか後々面倒なことになりそう。」
 「もしかして、詰み・・・?よし、kali pi諦めてRaspbianにしよう!!!」

Raspbianをダウンロード、慣れた手つきでSDカードに書き込む。
こちらの記事を参考に、ネットワークの設定をする。

interface eth0
static ip_address=192.168.0.115/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

私「ふむふむ、ip_addressにrouters、domain_name_serversねぇ。。なるほどなるほど。」
 「ん?」(三度見くらいした)
 「routersとdomain_name_servers・・・?これじゃね???」

すぐさまシャットダウンしてSDカードをフォーマット、kali piを書き込む。
そして今回の手順でチャチャっと実現できた。

Wi-Fiが見つからない

1回目Wi-Fiに繋げようとしたとき、目当てのWi-Fiをどうしても拾ってくれなかった。
他のWi-Fiはでてきても、自分が接続しようとしているWi-Fiがでてこない。

n時間溶かした後、SDカードのフォーマットからやり直したら普通にできるようになった。
それ以降はちゃんと動いた。なんでだ。(先述の通り、よしなに接続はできなかったけどね)

電源問題

安物のUSB / AC変換アダプタを使っていると、電力不足だった。
電力不足は画面右上の雷マーク⚡。電力が不足すると、起動できなくなるので注意。
(私はこれに気づかずに半日ほど溶かしました。)

あとがき

これ2日くらい悩んでたんだけどな。こんな単純なことだったのか。悲しい。
10回以上SDカードフォーマットしてos書き込んで・・・を繰り返したので結構つらかった。

まぁネットワーク系のコマンドをいくつか知れたので結果オーライということにしておこう。

あと、書いてる途中に気づいたんですが、途中参考としてあげさせていただいたきなこのブログさんもeth0のホスト部115でした。偶然ですね。

結局、kali piが特定のWi-Fiだけ検知してくれなかったやつは何故だかわかりませんし、
windows機でモバイルホットスポットをしたとき、検知はされても接続できませんでした。
色々ガチャガチャして、家のWi-Fi等に接続できたとしてもやはり起動しなくなる。
kali piはちょっと不安定なのかもしれないですね。

最後までお読みいただき、ありがとうございました。

AtCoderの入力受取で躓いた話

ABC170_Cにて

GolangAtCoderやってるときに躓いたので書く。

ABC170のC問題を解き、自信満々に提出したときの話。
3AC,12WA。入力例にあげられているサンプルも2つ、WAをだしていた。

「提出する前に確認したはずなのにどうして」と再度確認するも、サンプルは正答できている。

手元と提出したもので結果が変わっている

試しに「コードテスト」のページで実行してみる。
(今回の件に関係ない処理を省略した、入力を受け取って出力するだけのコード)

// 警告: このコードを長時間直視しないでください。
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var n int
    scanner.Scan()
    fmt.Sscan(scanner.Text(), &n)
    p := make([]int, n)
    for i := range p {
        fmt.Scan(&p[i])
    }
    fmt.Printf(p)
}

/* input
5
4 7 10 6 5
*/

「これは酷い」と思うかもしれない。というか改めて見ると自分でも引くくらい酷い。
コードがぐちゃぐちゃなのは許してほしい。

nを受け取る時点では「scannerでサッと読み込もう」としたものの、
[]intscanerで受け取るのが面倒で結局fmt.Scanを使ってる。
(scannerだと、[]string[]intに変換する必要がある)

普通に書いてたらこんな統一性のないことにはならないだろう。
ただ、私は既に書いてあるnの受け取りを統一するのが面倒だった。

inputの値をセットして、実行してみる。
手元で出力されるのは[4 7 10 6 5]。しかし、コードテストでは[0 0 0 0 0]だった。

ちなみにこれは2つの入力受け取りをscannerfmt.Scanどちらかに統一することで解決できる。
ぐちゃぐちゃだからこそ今回の事件(?)が起きた。

なぜ結果が変わるのか

最初に疑うのはバージョンの壁。
試してみる。

$ go version
go version go1.14.4 linux/amd64

ローカルのバージョンは1.14.4。

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println(runtime.Version())
}

/* output
go1.14.1
*/

AtCoder上のバージョンは1.14.1。ちょっとだけ違う。
一応試す。

$ goenv install -l
(snip)
 1.14.1
 1.14.2
 1.14.3
 1.14.4

1.14.1があることを確認する。

$ goenv install 1.14.1
$ goenv global 1.14.1

1.14.1をインストール、バージョンを切り替える。
goenv rehashとかで反映できるっぽいですが、私はBashを開き直しました。

$ go version
go version go1.14.1 linux/amd64

しっかりバージョンが変わっている。さて、実行してみよう。

$ go run main.go 
5
4 7 10 6 5
[4 7 10 6 5]

ちゃんと受け取れる。

ふむ。。。。

「じゃあ実行方法が違うのかな」となり、
とあるサイトで競プロ的なことをしたときに制約として以下のようなことが書いてあったことを思い出した。

提出されたコードは以下のように実行されます。
go run main.go < input.txt

(go runではなかったかも。詳しくは覚えてない)
AtCoder上でも同じかどうかはわからないが、これをローカルで試してみる。

$ cat > input.txt
5     
4 7 10 6 5
$ go run main.go < input.txt
[0 0 0 0 0]

ビンゴ。
2列目の入力が受け取れなくなってる。

これが今回の原因。

あとがき

今回のようなぐちゃぐちゃなコードでも書かない限り遭遇しないと思うので、綺麗なコードを書こう。

NahamCon CTF

NahamCon CTF参加してました

海外のバグハンターが主催らしい。
珍しく固定配点だったが、可変より安心して取り組めたかも。

結果は468/2854。参加チーム多すぎじゃない?
とはいえ、珍しくまぁまぁな位置にいるのでちょっとうれしい。

解けて嬉しかった問題があったので書く。

Rejected Sequel (150 pt, 164 Solves)

SQLiの問題。詳しいことはwriteupに書いてある。
スペースが削除されてしまうが、Tabで代用できるのは誰かのwriteupで知っていた。
やはりwriteupは読むだけでも有益だね。試せたらもっと有益
問題サーバを解放してくれているうちにガンガン試したい。

(閑話休題)

ログインしたりするだけの問題なら何個も解いてきたけど、
データベースから探すのは初めてだった。

  1. カラム数特定
  2. テーブル列挙
  3. カラム列挙
  4. データ出力

の4手。スペースが削除されるところ以外は結構シンプルな問題だと思う。
SQLi初心者におすすめできるくらいの問題だった。

" or 1=1;--しか知らなかったころと比べてだいぶ成長してる感じがして嬉しい。
\\レベルアップの音//

あとがき

梅雨に開催されてなければたぶんもっと良い順位いけたとおもう。
31時間の大会だったが、頭痛で半分くらいは寝てしまっていた。
あと、固定配点で自分の得点が下がることがないので安心して寝れた(?)

私が解けた問題ではDirbとかが必要にならなくて、個人的には結構楽しかったです。
私も、良問を作れるようになりたい。

Amazonでやらかしかけた話

Amazon

便利ですよね。
私も使わせてもらっているのですが、この間少し危ないことがあったので日記程度に。

セールに惑わされた

AmazonIKEAのサメを調べていたら、6000円程度から49%offされて、だいたい3000円。
よくよく考えれば6000円という時点でおかしいが、意識は完全に49%offの方に行ってしまっていた。

「ほぼ半額、買おうかな」

DiscordでAmazoのURLとともにこのような発言をしたら
友人がIKEA公式のURLを送ってきた。公式ページを見てみたところ

そこには税込み1999円の表示が。

PCを本格的に触り始めてから1年ほどセキュティの勉強をしているので
リテラシーや警戒力は結構ついてると思っていたが、まんまと半額の魔力にやられるところだった。

マーケットプレイスに気を付けて

結構悔しかったので少し調べてみた。
まず、Amazonの販売形態は大きく分けて3つ。

  1. 仕入れ、在庫確認、発送全てAmazonJP
  2. 仕入れのみ他社。在庫確認と発送はAmazonJP
  3. 仕入れから発注まで全て他社。支払いのみAmazon

ここでいう2と3が所謂マーケットプレイス
まぁ3の信用度が低いのは見比べた感じでわかるだろう。
ちなみに、今回私が買いかけたのは3のパターン。

見分け方

3種類あるのはわかった。ではどうやって見分けるか。。

f:id:y0d3n:20200608020803p:plain

Amazon.co.jpが販売・発送するということで1のパターンだとわかる。
ここの表示が異なればマーケットプレイスだということになるだろう。

もう一つ注意点

Amazonにはprimeマークがある。
ここで注意。

primeマークは安心マークではない

primeマークにはなんとなく特別感があるかもしれないが、「primeマーク=安心」は危険。

先ほど挙げた3つの販売形態を覚えてるだろうか。

  1. 仕入れ、在庫確認、発送全てAmazonJP
  2. 仕入れのみ他社。在庫確認と発送はAmazonJP
  3. 仕入れから発注まで全て他社。支払いのみAmazon

ここで太字にした2つの販売形態にprimeマークがつく可能性がある。
では、primeマークにはどのような意味があるのか。

primeマークとは

高い配送品質をアピールできる「primeマーク」

公式には上のように書いてある。あくまで配送品質をアピールする印なのだ。
同ページに、商品の品質についての言及は特にない。
primeマークがつくことによる恩恵は以下のような感じ。

  • 商品詳細ページ
    • primeマークの表示
    • お急ぎ便による最短お届け予定日が表示される
  • 検索結果ページ
    • primeマークの表示
    • primeマークでの絞り込み
    • 最短のお届け予定日の表示

絞り込み検索などがある影響で「不思議な安心感のあるマーク」になっているが、
先述の通り配送品質をアピールする印。品質を保証する印ではない。

まとめ

オンラインで買い物するときには評価など以外にも、仕入れなどの会社をよく見ることも大事だということが伝わっていると嬉しいです。

私がここで書いたもの以外にも気を付けるべき点はいくつもあると思うので、
オンラインショッピングは慎重に。

中にはほとんど見分けがつかないような悪質な偽物を売っている出品者もいるため、
基本的には公式ショップがあるものは公式から買うのが安定でしょう。

おまけ

Chrome拡張機能Amazonの商品の価格推移を見ることができるものがあり、
最近入れたのですが結構便利で気に入ってます。

下記ツイートは推しのボカロPが日本に帰ってきてボカロで新曲をあげたあたりから
CDの値段が10倍以上に跳ね上がったのを観測したもの。

HSCTF 7

HSCTF 7参加しました

Although anyone is free to participate in HSCTF, only teams composed entirely of middle and high school students (6-12) in the 2019-2020 school year and are permanent residents in the United States are eligible for prizes. Students attending colleges, universities, or high schools outside of the United States are not eligible for prizes.

参加は誰でも可能だけど、賞金は米国の中高生チームにしかでないよ、みたいな。
賞金狙えるほど技術力があるわけではないので関係ないが、問題は中高生向けの難易度なのかな?

一人寂しく参加しようとしていたところ、
同サークルで同学年のふたばとが参加してきてくれた為、二人での参加となった。

結果

1466チーム中337位。

少し不満なのが、1000チーム以上解いてる問題と150チームくらいしか解けてない問題が 同じ点数になっていたこと。得点の減少率がえぐすぎる。

150チームの方の問題はWebのTraffic Lights W
結局解けてないので得点減ってても影響はないんですけどね・・・
/etc/passwdとか、fileupload.phpとかは抜けたけど、その後どうすればいいのかよくわからない。

「10%問題なのでたぶん難しい」や、「解けたとしてもどうせ100点」
などの気持ちでモチベーションが下がってしまった。(わからなかったことに対する言い訳)

感想

Web

楽しかったのはBroken Token
JWT認証の回避(?)に関する問題。詳しい解法はWriteupに書いてあるが、
署名とかの問題をやるのは初めてだったのでとても良い経験になった。
JWTパッケージがエラーを吐いたとこで躓いてしまったが、
pip install pyjwt==0.4.3でバージョン指定してインストールすれば上手くいった。

あと、Very Safe Loginが追加直後に気づくことができ、即解いた。
SQLi等を試してみるも特に反応なし、続いてソースコードを見たら普通に書いてあった。
大急ぎでFlagを提出し、Solve 1の表示を見て喜んだが、ラグだったようで22番目だった。

Web以外

My First Calculatorが面白かった。入力したのが文字列としてではなく、
Pythonのコードとして解釈されることで、任意コードを実行されてしまうという物。
hogeと入力したときにNameError: name 'hoge' is not definedと表示されてたので気付いた。

エラーメッセージを読むのは大事だなと改めて認識させられた。

あくまでも計算機なので、数字の入力はintしか受け付けない。
ordが1文字ずつしかstrintに変換できなかったので1文字ずつflag.txtの中身を見ていった。
自動化するか、もっといい方法があるか。

むしろもっといい方法があって欲しい

あとがき

「ちょっと知ってれば解ける問題」以上の問題が解けるようになってきているのがとてもうれしい。

Traffic Lights Wとかは、脆弱性を見つけてからが本番って感じがする。