mutao.net

いわゆる雑記。

Nmap(Network Mapper)

Nmapとは

nmap.org

ポートスキャンを行えるツール。

私はポートが開放されているかどうかくらいでしか、使用したことがなかったので改めて使い方を調べる。

※ポートスキャンは不正アクセス禁止法には抵触しませんが、「攻撃された」と判断する可能性もあるので自分の保有していないものに関しては実行しないほうが懸命です。

自宅のRassberry pi へとnmapを実行してみました。

ホスト名ではなく、IPアドレスでも実行可能です。

$ nmap 192.168.11.1
Starting Nmap 7.70 ( https://nmap.org ) at 2021-08-20 17:19 JST
Nmap scan report for 192.168.11.1
Host is up (0.0064s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
53/tcp    open  domain
80/tcp    open  http
443/tcp   open  https
49152/tcp open  unknown
MAC Address: 60:84:BD:F6:39:18 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.75 seconds

このように開放されているポートが確認できました。

STATEについては以下の表通りです。

state description
open ポートが開放されている
closed ポートが閉じている
filtered フィルタ処理されていて確認できない
unfiltered ポートへのアクセス可能、しかし、open closeを確認できない

TCP SYNスキャン

SYNパケットを送信し、ポートにアクセス可能な場合、SYN/ACKパケットを返します。

 $ nmap --packet-trace -sS 192.168.11.1

Nmap Script

nmap.org

nmapには現状で604個のscriptが用意されています。上記のサイトでカテゴリ毎にscriptが用意されています。

これらのscriptはNSE(Nmap Scripting Engine)上で動くLuaで書かれてたscriptです。

sctipt1つ実行することもできますし、カテゴリ指定でscript群を実行することもできます。

今回は様々な脆弱性を検出できるVlunカテゴリを実行してみました。

$ nmap --script vuln 192.168.11.1
Starting Nmap 7.70 ( https://nmap.org ) at 2021-08-20 17:37 JST
Nmap scan report for 192.168.11.1
Host is up (0.0052s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
53/tcp    open  domain
80/tcp    open  http
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
443/tcp   open  https
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_ssl-ccs-injection: No reply from server (TIMEOUT)
|_sslv2-drown:
49152/tcp open  unknown
MAC Address: 60:84:BD:F6:39:18 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 103.09 seconds

nginxを入れただけのラズパイなので脆弱性は検出されずです。

MySQLを立てて外部からのアクセスが可能にしている場合は mysql-brute 等のscriptを使ってみて検証してもいいかもしれません。

今後、何かに使えそうと思ったのでメモメモ

Golangでopenweathermapを使ってみる

openweathermap.org

天気予報の個人使用無料のAPIを使ってみたかったので作成。

気象庁が公開している非公式のAPIもありますが、1時間毎のデータを取得できる等のメリットがあるopenweathermapを使用。

openweathermap.org

FreePlanでアカウントを作成してマイページからAPP_IDをコピペしてリクエストできます。

APP_IDが発行されたばかりではリクエストできず401が帰ってきます。数時間立てばリクエストできるようになります。

openweathermap.org

試しに東京の天気を取得します。

curl "https://api.openweathermap.org/data/2.5/onecall?lat=35.681236&lon=139.767125&units=metric&lang=ja&appid=#{appId}"
{
    "lat": 35.6812,
    "lon": 139.7671,
    "timezone": "Asia/Tokyo",
    "timezone_offset": 32400,
    "current": {
        "dt": 1629008734,
        "sunrise": 1628971183,
        "sunset": 1629019889,
        "temp": 19.85,
        "feels_like": 20.37,
        "pressure": 1012,
        "humidity": 95,
        "dew_point": 19.03,
        "uvi": 0.37,
        "clouds": 75,
        "visibility": 5000,
        "wind_speed": 2.06,
        "wind_deg": 350,
        "weather": [
            {
                "id": 701,
                "main": "Mist",
                "description": "霧",
                "icon": "50d"
            }
        ]
    },
{省略}

大量のデータを取得できます。

これをGoでParseして構造体にするにはこんな感じ。

github.com

使ってみてわかったこと。

  • 大量のデータを取得できるので色んなことができそう。
  • go get で扱えるようにしたい。
  • とりあえず動くようにしただけなのでもっと作り込みがしたい。

GolangでLinebot②

mutaonet.hatenablog.com

前回の続き。もう少し意味のあるものにしていく。

作るもの

楽天市場APIを使って1日1回、楽天市場に出品されているワインの中でレビュー平均の降順でいくつかLineBotで通知しようというもの。

f:id:mutaonet:20210809155415j:plain

webservice.rakuten.co.jp

まずはRakuten DevelopersでアプリIDを発行してAPIをcallできるようにします。

公式の手順がわかりやすいので割愛します。

リクエストURLは以下のものを使用します。

https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?${params}

リクエストイメージ

Parameter Value
applicationId 自分のアプリID
genreId 100317
sort +reviewAverage
Hits 2

https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?applicationId=${applicationId}&genreId=100317&sort=+reviewCount

applicationIdはHerokuの環境変数に設定してos.Getenv()で取得できるようにしときます。

以下が作成物になります。

github.com

あとは Heroku Schedulerで定期実行させます。

USTでしか指定できないので、9時間差で指定します。

f:id:mutaonet:20210809160023p:plain

作ってみてよかったこと

  • 基本的な文法をおさらいできたこと。
    • すでに結構身についていることが確認できてうれしい。
  • Goのパッケージについて理解できたこと。
  • JsonのParse処理を実装できたこと。
    • 特にネストした配列の構造体を部分が理解できたのが大きかった。

反省点

  • もっと拡張性を持たせて作成すべきだった。
    • Line MessagingAPIを使用するpackageと楽天市場の検索部分は分けて管理したかった。
  • リクエストパラメータは動的に変更できるように工夫すべきだった。
  • callbackを使ったものではなくなってしまったので、自宅のラズパイとかでも問題なかった。
  • 構成図的なものが雑というかチープすぎるので無料で使える便利なツール知りたい。

GolangでLinebot

Herokuとは

Salesforceの提供するPaaS

価格アプリケーション起動時間の従量課金制。

マスに向けたWebサービスでなければ無料枠を超えるようなことはないと思う。

レンサバも持っていないので今回はHerokuを使っていく。

jp.heroku.com

go-Linebot

github.com

まずはgo.modの初期化をしてline-botsdkをgo getする。

go mod init github.com/${github URL}
go get github.com/line/line-bot-sdk-go/linebot
go mod tidy

一旦はmessage送信できるかどうかを確かめられればいいので、main.goの中身は以下の通り。

package main

import (
    "log"
    "os"
    "github.com/line/line-bot-sdk-go/linebot"
)

func main() {
    bot, err := linebot.New(
        os.Getenv("LINE_BOT_CHANNEL_SECRET"),
        os.Getenv("LINE_BOT_CHANNEL_TOKEN"),
    )
    if err != nil {
        log.Print(err)
    }
        // messageはLINEBOTで通知したい値を入れる。
    message := linebot.NewTextMessage("go-linebot!")
    if _, err := bot.BroadcastMessage(message).Do(); err != nil {
        log.Print(err)
    }
}

Heroku用のProcfileを作成

$ vi Procfile

web: ./bin/${directory_name}

Heroku上で使用するGoのversion指定

2パターンあります。

go.modに

// +heroku goVersion go1.16

と記載するか、環境変数での指定ができます。

### cli
$ heroku config:set GOVERSION 1.16

LINE Messaging APIの設定

developers.line.biz

channel type に Messaging API を指定して作成します。 providerがない場合はプルダウンで「Create a news provider」で作成します。

f:id:mutaonet:20210808171612p:plain

作成が終わったら、channelのBasing settingsから Channel secret tokenをコピーしておきます。Herokuの環境設定で使用します。

Messaging APIタブに移動して、Channel access tokenをコピーしておきます。これもHerokuの環境設定で使用します。

QRコードが表示されているのでLINEの友達追加から読み取って追加しておきます。

これで基本的な設定は完了です。

Herokuの設定

Heroku CLI で設定する場合と、ブラウザから設定する方法があります。

個人的にブラウザでやった方が簡単です。

Heroku CLIで設定する場合

Heroku CLI を installします。

devcenter.heroku.com

$ heroku create ${app name}

$ heroku config:set LINE_BOT_CHANNEL_SECRET ${Channel secret token}
$ heroku config:set LINE_BOT_CHANNEL_TOKEN ${Channel access token}

$ heroku git:remote -a ${app name}

ブラウザ(GUI)から設定する場合。

Herokuにログインしてダッシュボードを開きます。

Heroku

Create new appでapplicationを作成します。 f:id:mutaonet:20210808172738p:plain

f:id:mutaonet:20210808172958p:plain

Settingsタブを開いて環境変数を指定します。

GOVERSION は go.modに記載した場合不要です。 f:id:mutaonet:20210808173950p:plain

Deployタブを開いてGit Hubを選択します。

f:id:mutaonet:20210808173114p:plain

f:id:mutaonet:20210808173210p:plain

Enable Automatic Deploysは指定したブランチにpushすると自動的にbuild & deployが走るので便利です。

Deploy Branchでbuild deployが走ります。

以下のようにBotからメッセージが届けば完了です。 f:id:mutaonet:20210808174158p:plain

とりあえず、動作確認ができたのでDynoを停止します。

停止しとかないと定期的にメッセージがきます。

f:id:mutaonet:20210808174412p:plain

Grafana PrometheusでMySQL監視

f:id:mutaonet:20210727195248p:plain

アーカイブwget

## https://github.com/prometheus/mysqld_exporter/releases/tag/v0.13.0
$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-arm64.tar.gz

$ tar xvzf mysqld_exporter-0.13.0.linux-arm64.tar.gz
$ cd mysqld_exporter-0.13.0.linux-arm64
$ cp mysqld_exporter /usr/local/bin/

mysqld_exporter用のユーザ作成

## see https://github.com/prometheus/mysqld_exporter/#required-grants
$ mysql -h localhost -u {username} -p
CREATE USER 'exporter'@'localhost' IDENTIFIED BY '{password}!';

Service化

$ vi /etc/systemd/system/mysqld-exporter.service 
[Unit]
Description=mysqld_exporter

[Service]
Restart=always
User=exporter ##お好みで
Environment="DATA_SOURCE_NAME=exporter:{password}!@(localhost:3306)/"
ExecStart=/usr/local/bin/mysqld_exporter

[Install]
WantedBy=multi-user.target

## 起動
$ systemctl daemon-reload
$ systemctl start mysqld-exporter.service

prometheus.yml修正

$ vi /etc/prometheus/prometheus.yml
## 以下を追記する。
- job_name: 'mysqld_exporter'
    static_configs:
      - targets: ['localhost:9104']
## Prometheus再起動
$ systemctl restart prometheus

ダッシュボード作成

以下のtemplateをimportしてダッシュボードを作成。

github.com

f:id:mutaonet:20210727194741p:plain

「Load」ボタンを押せばダッシュボードが作成される。

すごいきれいに見れます。

gccコマンド

Linuxを使っているとgccコマンドというのをよく目にする。

実際良くわかっていなかったのでメモする。

まず、GCCとは GNU Compiler Collectionの略でC,C++,Goなどのコンパイラコレクションとのこと。

linuxize.com

gccコマンドはGNU C Compilerの実行ファイルを呼び出すコマンドなので、正確には別物である。

ちなみにCenoOS8では下記のコマンドを実行することで、make gcc g++ などのパッケージをinstallすることが可能。

$ sudo dnf group install "Development Tools"

makeがついてくるのはbuildの過程でgcc g++を使用することが多いためなのではないかなと思う。

www.gnu.org

じゃあJavaはどうなってるんだ

GNU Compiler for Java というものが存在していた。2016年から GCJGCCのtrunckから削除され、GCC7.1のリリースから含まれていない。

gcc.gnu.org

以下のBlogにGCJ削除についてのPOSTがある。

(英語が読めないので翻訳して読みましたが、間違いがあるといけないので深入りしません。) tromey.com

gcj vs javacという感じでパフォーマンスについて言及されたPOSTも見つけたりしてかなり楽しい時間を過ごせました。

RaspberryPiのCPU温度を確認したい

vcgencmdを使って確認します。

www.raspberrypi.org

$ dnf install cmake gcc gcc-c++ make

アップグレード済み:
  cpp-8.4.1-1.el8.aarch64       gcc-8.4.1-1.el8.aarch64       gcc-c++-8.4.1-1.el8.aarch64       libgcc-8.4.1-1.el8.aarch64       libgomp-8.4.1-1.el8.aarch64       libstdc++-8.4.1-1.el8.aarch64       libstdc++-devel-8.4.1-1.el8.aarch64

インストール済み:
  cmake-3.18.2-11.el8_4.aarch64     cmake-data-3.18.2-11.el8_4.noarch     cmake-filesystem-3.18.2-11.el8_4.aarch64     cmake-rpm-macros-3.18.2-11.el8_4.noarch     libuv-1:1.40.0-1.el8.aarch64     vim-filesystem-2:8.0.1763-15.el8.noarch
$ ./buildme --debug
~/work/userland/build/raspberry/debug ~/work/userland
cmake: symbol lookup error: cmake: undefined symbol: archive_write_add_filter_zstd
make: *** ターゲットが指定されておらず, makefile も見つかりません.  中止.
make: *** ターゲット 'install' を make するルールがありません.  中止.

ググるとcmakeで使用するlibarchiveのバージョンが古いとかでした。

github.com

bug reportも見つけました。 bugzilla.redhat.com

https://centos.pkgs.org/8-stream/centos-baseos-x86_64/libarchive-3.3.3-1.el8.x86_64.rpm.html

## https://github.com/ComplianceAsCode/content/issues/7016
$ dnf install libarchive

## 実行
$ ./buildme --aarch64

$ vi /etc/ld.so.conf.d/raspberrypi.conf
## 追記
/opt/vc/bin
$ ldconfig

## PATHを通す
$ vi ~/.bashrc
PATH="/opt/vc/bin:$PATH"
$ source ~/.bashrc

## CPU温度を確認
$ vcgencmd measure_temp
temp=54.0'C

こんなことをしなくても

node_exporterのmetrixで簡単にGrafanaで可視化できます。

metrixはnode_thermal_zone_tempです。

f:id:mutaonet:20210724173318p:plain

mutaonet.hatenablog.com