アプリの通信の cookie 内のセッションキーみたいなのを取得したくて mitmproxy などを使ったりするわけですが、気軽に取得できるようにしたいと思いまして、例えばスマホの Wi-Fi の SSID 切り替えてアプリ起動すればあとは裏で勝手に取得してくれる、みたいな。それを Raspberry Pi と mitmproxy を使って実践してみたので記録として残しておきたいと思います。

これまでは VPS 上に mitmproxy をセットアップし、スマホから VPN で VPS へ接続し(VPN には strongSwan を使用)、VPN 経由であれば透過的に mitmproxy 経由でインターネットへ接続、みたいなことをしていました。mitmproxy ではアドオンスクリプトを使って特定の値(私の場合取得したいセッションキーみたいなの)を取得していました。

いちいち VPN 接続して、mitmproxy を起動して、スマホアプリ起動してみたいなのはやっぱりちょっと億劫なのと、セッションキーみたいなのが欲しいのは基本的に家にいる時なので、Raspberry Pi をアクセスポイント兼 mitmproxy にして VPN なしで取得できるようにしたいと思いました。その時の記録を簡易的ですが、 Raspberry Pi のセットアップから書き留めておきます。

構成

最終的には以下のような感じにします。我が家では普段は青色のネットワークにスマホや PC などが繋がります。時々ですが、セッションキーみたいなのが取得したい時があるので、その時はスマホの Wi-Fi の SSID を緑の方に変える事で通信が Raspberry Pi 上の mitmproxy 経由になり、かつアドオンを使って取得したセッションキーみたいなのを AWS Systems Manager の Parameter Store に保存するようにしていきたいと思います。

アーキテクチャ図

Raspberry Pi Imager から SD ストレージへイメージの書き込み

まずはじめに、Raspberry Pi のセットアップです。ヘッドレスでセットアップし、一旦、Wi-Fi 接続ができるようにします

以下を参考に Mac から Raspberry Pi の SD ストレージへイメージの書き込みを行います。
https://dev.classmethod.jp/articles/raspberry-pi-imager-introduction/

書き込みが完了したら、再度 Mac でマウントさせて、起動時の ssh の有効化と Wi-Fi 接続用の設定を行なっておきます。

ssh 有効化

このあたりを参考にセットアップします。

Mac 上で以下を実行し、 /Volumes/boot/ssh という空のファイルを作成しておきます。

cd /Volumes/boot/
touch ssh

Wi-Fi 接続

同じく Mac 上で、 /Volumes/boot/wpa_supplicant.conf というファイルを作成し、以下のように記述しておきます。

cat /Volumes/boot/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="<SSID>"
    psk="<パスワード>"
}

ここまでできたら SD カードを Raspberry Pi 本体に挿し起動します。

Raspberry Pi への ssh 接続

Raspberry Pi の IP を指定して ssh で、ユーザ pi 、パスワード raspberry として接続します。

ssh pi@<Raspberry Pi の IP>

はじめに passwd コマンドで pi ユーザのパスワードを変更しておきます。

Wi-Fi パスフレーズの暗号化

このままでは Wi-Fi のパスフレーズがプレーンテキストで保存されたままなので wpa_passphrase コマンドを使って暗号化します。

wpa_passphrase <SSID> <パスフレーズ>
network={
	ssid="<SSID>"
	#psk="<パスフレーズ(プレーンテキスト)>"
	psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

この結果を /etc/wpa_supplicant/wpa_supplicant.conf ファイルに書き込みます。ただし、プレーンテキストで出力された箇所は削除です。
パスフレーズを " (ダブルクォーテーション)で括らないように注意します。
nano コマンドはとりあえず Ctrl + s で保存、 Ctrl + x で終了です。

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="<SSID>"
    psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

ここまでが、Wi-Fi 環境で Raspberry Pi を使うまでのメモです。ssh 接続も公開鍵での認証方式に変えておくなど、やっておきたいことはありますが今回は触れません。

ここからは

家の中でスマホの Wi-Fi の SSID を変えたら、mitmproxy 経由でインターネットに接続する、というのをやりたいので Raspberry Pi を Wi-Fi のアクセスポイントにしつつ、mitmproxy のインストール、セットアップを行なっていきます。

アクセスポイントにするために、Raspberry Pi の有線側( eth0 )を現在の家のネットワークのインタフェースに(冒頭の構成図では青)、無線側( wlan0 )をアクセスポイントのインタフェース(冒頭の構成図では緑)にします。

ネットワーク設定

有線側( eth0 )

ifconfig コマンドなどから MAC アドレスを確認し、家のルータの DHCP 機能から固定 IP をリースするように設定します。今回の例では冒頭の構成図の通り 192.168.255.101 となるようにしました。

無線側( wlan0 )

Raspberry Pi の無線側の IP アドレスは固定にしておきたいので /etc/network/interfaces.d/wlan0 というファイルを作成し、以下のように記述しておきます。IP アドレスは冒頭の構成図の通り 172.16.0.254 となるようにしました。

sudo nano /etc/network/interfaces.d/wlan0
cat /etc/network/interfaces.d/wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 172.16.0.254
netmask 255.255.255.0

Wi-Fi 接続の無効化

Raspberry Pi 自身は Wi-Fi(青)に接続する必要はなくなったので、最初にセットアップした Wi-Fi 接続の設定を無効化しておきます。

cd /etc/wpa_supplicant
sudo mv wpa_supplicant.conf wpa_supplicant.conf.backup

sudo systemctl disable wpa_supplicant

ここまで設定できたら、Raspberry Pi を reboot します。

hostapd によるアクセスポイント化

Raspberry Pi を Wi-Fi アクセスポイントにするために hostapd というものをインストールしセットアップします。詳しくは以下のサイトを見ていただくと良いと思います。
https://www.itmedia.co.jp/news/articles/2008/14/news042.html

ここでは簡単に手順だけ。

sudo apt install hostapd
sudo nano /etc/hostapd/hostapd.conf
cat /etc/hostapd/hostapd.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface=wlan0
driver=nl80211
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
ieee80211ac=0
ieee80211d=1
ieee80211h=1
ieee80211n=1

wmm_enabled=1
country_code=JP
local_pwr_constraint=3
spectrum_mgmt_required=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ssid=<SSID>
wpa_passphrase=<PassPhrase>

ハイライト箇所は以下のようにします。

  • 4 行目 : 通信チャネルの ID です、周りと被らないようにします
  • 21-22 行目 : Wi-Fi の SSID やパスフレーズ(プレーンテキスト)を記述します

hostapd の起動、有効化

sudo systemctl status hostapd
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd

BIND

DNS サーバ機能として bind をインストールします。dnsmasq とかでも十分そうですが、せっかくなので bind にします。

BIND のインストール

sudo apt install bind9
   :
   :
E: Failed to fetch http://raspbian.raspberrypi.org/raspbian/pool/main/b/bind9/bind9utils_9.11.5.P4+dfsg-5.1+deb10u1_armhf.deb  404  Not Found [IP: 2a00:1098:0:80:1000:75:0:3 80]
E: Failed to fetch http://raspbian.raspberrypi.org/raspbian/pool/main/b/bind9/bind9_9.11.5.P4+dfsg-5.1+deb10u1_armhf.deb  404  Not Found [IP: 2a00:1098:0:80:1000:75:0:3 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

404 Not Found でエラーと出てしまいました。書いてある通り、 apt-get update を実行します。

sudo apt-get update
sudo apt install bind9

BIND の設定

/etc/bind/named.conf からインクルードされている、2つのファイル、named.conf.optionsnamed.conf.local を編集します。

まず、 /etc/bind/named.conf.options から。

sudo nano /etc/bind/named.conf.options
cat /etc/bind/named.conf.options
acl homenetwork {
	localhost;
	localnets;
};

options {
	version "unknown";
	hostname "xxx.msysh.me";
	directory "/var/cache/bind";

	listen-on port 53 {
		127.0.0.1;

        // eth0 側
		192.168.255.101;

        // wlan0 側
		172.16.0.254;
	};

	notify no;

	allow-query { homenetwork; };

	allow-transfer { none; };

	//forwarders {
	//	192.168.255.254;
	//};

	recursion yes;
	allow-recursion {
		homenetwork;
	};

	dnssec-validation auto;

	listen-on-v6 { any; };
};

続いて /etc/bind/named.conf.local ファイルを編集します。

sudo nano /etc/bind/named.conf.local
cat /etc/bind/named.conf.local
zone "msysh.me" {
	type master;
	file "msysh.me.zone";
};

zone "255.168.192.in-addr.arpa" {
	type master;
	file "192.168.255.rev";
};

ゾーンの設定

続いてゾーンの設定です。

sudo nano /var/cache/bind/msysh.me.zone
cat /var/cache/bind/msysh.me.zone
$TTL 86400
@   IN  SOA msysh.me. root.msysh.me. (
    2020092101  ; serial
    1H          ; refresh
    15M         ; retry
    1W          ; expiry
    1H          ; minimum
)

@	IN  NS  xxx
xxx     IN  A   192.168.255.101
router  IN  A   192.168.255.254

逆引き用

sudo nano /var/cache/bind/192.168.255.rev
cat /var/cache/bind/192.168.255.rev
$TTL 86400
@   IN  SOA msysh.me. root.msysh.me. (
    2020092101  ; serial
    1H          ; refresh
    15M         ; retry
    1W          ; expiry
    1H          ; minimum
)

    IN  NS  msysh.me.
101	IN	PTR	xxx.msysh.me.

設定ファイルの検証

$ named-checkconf /etc/bind/named.conf
# 問題なければ何も表示されないようです
$ named-checkzone msysh.me /var/cache/bind/msysh.me.zone
zone msysh.me/IN: loaded serial 2020092101
OK
$ named-checkzone 255.168.192.in-addr-arpa /var/cache/bind/192.168.255.rev
zone 255.168.192.in-addr-arpa/IN: loaded serial 2020092101
OK

BIND の起動

$ sudo systemctl start bind9

名前解決の確認

Mac 上で dig で内部や外部の IP が返ってこれば OK です。

dig xxx.msysh.me @192.168.255.101
dig www.google.co.jp @192.168.255.101

DHCP サーバ

アクセスポイントとして DHCP サーバには isc-dhcp-server を使います。

isc-dhcp-server のインストール

sudo apt-install isc-dhcp-server

isc-dhcp-server の設定

まずは起動時の設定(環境変数)を設定します。

sudo nano /etc/default/isc-dhcp-server
cat /etc/default/isc-dhcp-server
# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
#DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
DHCPDv4_PID=/var/run/dhcpd.pid
#DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#	Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#	Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="wlan0"
#INTERFACESv6=""

続いて、払い出す IP などの設定を /etc/dhcp/dhcpd.conf にしていきます。

sudo nano /etc/dhcp/dhcpd.conf
cat /etc/dhcp/dhcpd.conf
# コメント文は省略します
option domain-name "msysh.me";
option domain-name-servers 172.16.0.254;

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;

subnet 172.16.0.0 netmask 255.255.255.0 {
	option routers 172.16.0.254;
	option broadcast-address 172.16.0.255;
	option subnet-mask 255.255.255.0;
	range 172.16.0.1 172.16.0.31;
}

起動

起動しておきます。

sudo systemctl start isc-dhcp-server

Raspberry Pi 再起動時の dhcpd のエラー

上記の起動コマンドで起動はできたと思うのですが、Raspberry Pi を再起動すると、自動的に起動しているはずが failed で失敗してしまっています。 /var/log/syslog の中をみてみると、以下のようなメッセージが出ていました(抜粋しています)。

dhcpd[578]: No subnet declaration for wlan0 (no IPv4 addresses).
dhcpd[578]: Not configured to listen on any interfaces!
isc-dhcp-server[563]: Starting ISC DHCPv4 server: dhcpdcheck syslog for diagnostics. … failed!
isc-dhcp-server[563]: failed!

どうやら wlan0 に設定した IP が実際に割当たる前に、dhcpd が起動しようとしてしまってエラーになってしまっているようです。あまり美しくはないですが、起動スクリプト内で sleep でも入れて起動を 10秒遅延させます。

/etc/init.d/isc-dhcp-server の中に start_daemon() 関数がありますので以下のように sleep 10 を追記します。

  touch /var/lib/dhcp/$NAME.leases

  # 以下の 1行を追加
  sleep 10

  start-stop-daemon --start --quiet --pidfile $PIDFILE \
        --exec /usr/sbin/dhcpd -- $VERSION -q -cf $CONF $INTERFACES
  sleep 2

mitmproxy の導入

インストールする mitmproxy のバージョンは投稿時最新の 5.2 です。Linux バイナリでは起動させられなかったのですが、あまり深追いせず pip でインストールすることにしました。

まず、インストールするディレクトリを作成し、mitmproxy を実行するユーザ、グループを作成します。

sudo mkdir /usr/local/mitmproxy-5.2
sudo groupadd -g 601 mitmproxy
sudo useradd -u 601 -g 601 -d /usr/local/mitmproxy-5.2 mitmproxy

作成したディレクトリで pip install mitmproxy -t . などとしてしまうと、ディレクトリ内に色々ファイルなどできてしまい見栄えも悪いので、以下のようにインストールしたいと思います。

/usr/local/mitmproxy-5.2
             ┣━━ addons アドオンスクリプトをここに保存
             ┣━━ bin    起動スクリプトを作成しここに保存
			 ┗━━ lib    ここに mitmproxy を pip でインストール

どいう事でまず、フォルダの作成

sudo mkdir /usr/local/mitmproxy-5.2/{addons,bin,lib}

で、/usr/local/mitmproxy-5.2/lib ディレクトリにインストールします。

sudo pip3 install mitmproxy -t /usr/local/mitmproxy-5.2/lib

それから起動スクリプトを /usr/local/mitmproxy-5.2/bin/run.sh として作成します。甘いところもありますが、家の中でちょっと使う程度なのでよしとしています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

MITMPROXY_HOME=/usr/local/mitmproxy-5.2

PYTHONPATH=${MITMPROXY_HOME}/lib:${MITMPROXY_HOME}/addons/aws

LANG=ja_JP.UTF-8

CMD="sudo -u mitmproxy PYTHONPATH=${PYTHONPATH} LANG=${LANG} ${MITMPROXY_HOME}/lib/bin/mitmdump \
  -p 8080 \
  -q \
  -s ${MITMPROXY_HOME}/addons/script.py \
  --mode transparent \
  --showhost \
  --ssl-insecure \
  --ignore-hosts '(apple.com|icloud.com)' \
  --set confdir=${MITMPROXY_HOME}/.mitmproxy"

until eval $CMD; do
  echo "Proxy crashed with exit code $?, restarting..." >&2
  sleep 1
done

exit 0
  • 5行目 : Python のパスに mitmproxy をインストールした lib ディレクトリと、アドオンの中で aws に接続しますので boto3 をインストールする ${MITMPROXY_HOME}/addons/aws を加えています。アドオンを使用しない場合は :${MITMPROXY_HOME}/addons/aws は不要です。
  • 9行目 : デーモンのごとくバックグラウンドで起動させておきたいので mitmproxy の起動には mitmdump を使用します。
  • 12行目 : アドオンスクリプトを指定しています。不要な場合はこの行を削除指定ください。
  • 16行目 : https で覗き見しないドメインを指定します。証明書ピニングエラーなどが発生するドメインで指定します。公式ドキュメントもご参照ください : https://docs.mitmproxy.org/stable/howto-ignoredomains/
  • 17行目 : confdir に指定したフォルダは mitmproxy が起動するとホームディレクトリに作成されるディレクトリで中には証明書などが入っています。公式ドキュメント : https://docs.mitmproxy.org/stable/concepts-certificates/

ちゃんと実行権限をつけておきます。

sudo chmod 755 /usr/local/mitmproxy-5.2/bin/run.sh

このスクリプトを起動時に実行するようにするため、systemd のユニットファイルを /lib/systemd/system/mitmproxy.service として作成します。

sudo nano /lib/systemd/system/mitmproxy.service
[Unit]
Description=mitmproxy server daemon
After=network.target

[Service]
ExecStart=/usr/local/mitmproxy-5.2/bin/run.sh

[Install]
WantedBy=multi-user.target

Raspberry Pi の起動時に起動するように有効化しておきます。

sudo systemctl enable mitmproxy.service

アドオンスクリプトについて

アドオンスクリプトについても少し紹介しておきます。Python で request(flow) という関数を定義し、mitmproxy の起動時に -s オプションとともにそのスクリプトを指定すると、mitmproxy を経由するリクエスト毎にそのスクリプトの request(flow) 関数を実行することができます。私のやりたかったこととしてはあるアプリのセッションキーみたいなものを取得して、AWS Systems Manager の Prameter Store に保存したかったのでそのようなスクリプトを作成しました。

リクエストの中の cookie から欲しい値を取り出し、Parameter Store に保存しています。リクエストの都度、値が変わるようなものでもないので、取得した値は一旦ファイルなどに cache として取っておいて、変更があれば Parameter Store に新しい値で更新する、というような作りになっています。

以下がそのスクリプトで、 /usr/local/mitmproxy-5.2/addons/script.py として作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import re
import pprint
import boto3

home='/usr/local/mitmproxy-5.2'
hoge_session_file = home + '/var/temporary.txt'

pattern = r'hoge_session=([^ ;]+)'
regexp = re.compile(pattern)

current_hoge_session = ''
with open(hoge_session_file, 'r') as s:
  current_hoge_session = s.read()

ssm = boto3.client('ssm')

def request(flow):
  #debug_value(flow)
  global current_hoge_session

  if 'cookie' in flow.request.headers.keys():
    matched = regexp.match(flow.request.headers['cookie'])

    if matched:
      hoge_session = matched.group(1)

      if hoge_session != current_hoge_session:
        try:
          current_hoge_session = hoge_session
          update_hoge_session(flow.request.headers['cookie'])
          update_local_cache_hoge_session(hoge_session)
        except:
          print("Update session error.")

def debug_value(value):
  with open(home + '/var/debug_value', 'a') as d:
    d.write(pprint.pformat(value))
    d.write('-----------------------\n')

def update_hoge_session(raw_cookie):
  cookies = parse_cookie(raw_cookie)
  if 'hoge_session' in cookies:
    ssm.put_parameter(Overwrite=True, Type='SecureString', Name='/hoge_session', Value=cookies['hoge_session'])

def update_local_cache_hoge_session(hoge_session):
  with open(hoge_session_file, 'w') as s:
    s.write(hoge_session)

def parse_cookie(raw_cookie):
  dict = {}
  cookies = raw_cookie.split('; ')
  for c in cookies:
    cookie = c.split('=')
    dict[cookie[0]] = cookie[1]

  return dict

AWS に接続しているため SDK も必要になります。また、セッションキーみたいなのを保存しておくフォルダも用意します。ディレクトリの構成としては最終的に以下のようにしました。

/usr/local/mitmproxy-5.2
             ┣━━ .aws        AWS SDK が参照する認証情報などをここに保存( `config` , `credentials` ファイル)
			 ┣━━ .mitmproxy  mitmproxy が作成する証明書ファイルなどの保存場所
             ┣━━ addons      アドオンスクリプトをここに保存
             ┃     ┗━━ aws  AWS SDK (boto3) など、アドオンスクリプトの実行に必要なファイルをここにインストール
             ┣━━ bin         起動スクリプトを作成しここに保存
			 ┣━━ lib         ここに mitmproxy を pip でインストール
			 ┗━━ var         アドオンスクリプトがファイルを保存する場所
sudo mkdir /usr/local/mitmproxy-5.2/addons/aws
sudo mkdir /usr/local/mitmproxy-5.2/var
sudo chown mitmproxy /usr/local/mitmproxy-5.2/var
sudo pip3 install boto3 -t /usr/local/mitmproxy-5.2/addons/aws

フォワーディング、NAT 設定

最後にネットワーク周りの設定です。アクセスポイント化した Raspberry Pi を経由してルータ、インターネットという経路になるので、 wlan0 から eth0 へのフォワーディングや NAT の設定を入れていきます。

/etc/sysctl.conf ファイルを編集して、フォワーディングを有効化するため、 net.ipv4.ip_forward1 にします。

sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1

続いて iptable に NAT の設定を入れていきます。加えて、Raspberry Pi のアクセスポイント経由で http(s) 接続する場合に、ポート 8080 でリッスンしている mitmproxy にリクエストを流したいのでポート 80、443 宛てのパケットを 8080 へリダイレクトさせてやります。

sudo iptables -t nat -A PREROUTING -s 172.16.0.0/24 -p tcp --dport  80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -s 172.16.0.0/24 -p tcp --dport 443 -j REDIRECT --to-port 8080
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

設定した内容をファイル /etc/iptables.ipv4.nat に書き出し、、、

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

インタフェースの起動時(if-pre-up時)に読み込むようにします。

sudo nano /etc/network/if-pre-up.d/iptables
sudo chmod 755 /etc/network/if-pre-up.d/iptables
cat /etc/network/if-pre-up.d/iptables
#!/bin/sh
iptables-restore < /etc/iptables.ipv4.nat
exit 0

私の用途としては wlan0 -> eth0 にいければ良いのでこれだけです。 eth0 側から wlan0 への接続も必要な場合は、Reverse Path Filter や逆向きの NAT なども必要になるかと思います。

ここまでで、 sudo reboot で再起動しておきます。これで、スマホの Wi-Fi の SSID を Raspberry Pi のアクセスポイントのものに切り替えてアプリを起動すれば、セッションキーみたいなものを取得できるようになります。

おまけ : SWAP 無効化

Raspberry Pi の SD カードの寿命を持たせるために SWAP を使わないようにしておきます。

まず、現状の SWAP の使用状況から。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          925Mi       133Mi       559Mi       6.0Mi       232Mi       733Mi
Swap:          99Mi          0B          0B

全く使われてなさそうなので、無効化してしまってもとりあえずのところ影響はなさそうです。

以下の、コマンドで SWAP を使わないようにしていきます。

sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

もう一度、確認してみます。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          925Mi       133Mi       559Mi       6.0Mi       232Mi       733Mi
Swap:            0B          0B          0B

Swap のところが 0 になりましたのでよさげですね。念の為、再起動しても 0 のままになっているか確認しておくとなお良いです。

まとめ

かなり長くなってしまいましたが、Raspberry Pi を使って、アクセスポイントを作り、mitmproxy とそのアドオンを使う事で、Wi-Fi ネットワークを切り替えてアプリを起動すれば、欲しい値が自動的に Parameter Store に保存されるようになりました。