おさかなせいざ

おさかなせいざ

プログラミングメモや日記がわりに

WSL 1 から WSL 2 への移行, LxRunOffline によるパーティション移行の失敗と修復

はじめに

 私が今使っているノートパソコンはどうも Linux のインストールに向いていないようなので,WSL をずっと使っています. 昨日は Ubuntu Mate をインストールして,Live USB でのインストールは完了したものの,Grub が入らなかったようで起動できませんでした. Linux のインストールは諦めて, 使っていた WSL 1 を WSL 2 にすることで快適にしようとしました.

 以下では,

  • LxRunOffline で WSL の UbuntuWindows が入っている SSD の C: から HDD の D: へ 移動
  • WSL 1 → WSL 2移行の方法
  • HDD だと遅く感じたので, SSD に戻した結果 WSL 上から Ubuntu が消失
  • Ubuntu が消失した問題を修復した手順

について示します.

環境

使用している WSL のディストリビューションMicrosoft Store にてインストールした Ubuntu (無印) です. 以下は WSL 2 にした状態の Ubuntu 環境です.

$ neofetch
            .-/+oossssoo+/-.               onamae
        `:+ssssssssssssssssss+:`           ----------
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 18.04.4 LTS on Windows 10 x86_64
    .ossssssssssssssssssdMMMNysssso.       Kernel: 4.19.84-microsoft-standard
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Uptime: 13 mins
  +ssssssssshmydMMMMMMMNddddyssssssss+     Packages: 1386
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Shell: bash 4.4.20
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Theme: Adwaita [GTK3]
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Icons: Adwaita [GTK3]
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Terminal: /dev/pts/0
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: Intel i7-9750H (12) @ 2.592GHz
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Memory: 92MiB / 12662MiB
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
  +sssssssssdmydMMMMMMMMddddyssssssss+
   /ssssssssssshdmNNNNmyNMMMMhssssss/
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.

また.> は管理者権限での Powershell 操作, $Ubuntu での操作です.

LxRunOffline による SSD の C: から HDD の D: への Ubuntu の移動

 はじめに SSD が残り 40 GB くらいになったので,WSL を HDD に移動させることにしました. 以下のサイトを参考にしました.

(a)WSLをCドライブ以外の場所に置き,(b)homeも別の場所に置いて,(c)chmodも使えるようにする方法.(自分用メモ) | 萌えとかプログラミングとか

WSL の場所を変更する: パソコン鳥のブログ

> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
> choco install lxrunoffline
> icacls D:\WindowsSubsystemForLinux\Ubuntu #このディレクトリは作成済み
> LxRunOffline.exe move -n Ubuntu -d D:\WindowsSubsystemForLinux\Ubuntu

1時間ほど放置して処理は完了しました. その後に, /home 以下も D: に移動させようと D:\WindowsSubsystemForLinux\Ubuntu\onamae_home を作成, とりあえず Ubuntu 上で $ cp -p * /mnt/d/WindowsSubsystemForLinux/Ubuntu/onamae_home をしてコピーだけしました. おそらくこれが後の問題の原因となりました.

WSL 1 → WSL 2移行

 ここは先人たちの情報が山のようにあるので,以下のサイト等を参考にしながら作業しました.

WSL2の環境構築手順 - Qiita

(a)WSLをCドライブ以外の場所に置き,(b)homeも別の場所に置いて,(c)chmodも使えるようにする方法.(自分用メモ) | 萌えとかプログラミングとか

http://fumiword.azurewebsites.net/2018/09/18/wslinstall/

特筆するべきことといえば,Windows Update で数ヶ月前から

デバイスに重要なセキュリティ修正プログラムと品質修正プログラムがありません。 
2020-03 x64 ベース システム用 Windows 10 Version 1903 の累積更新プログラム (KB4540673)

といった表示が出続けていた事です. 以下のページで白鳥10さんが示されているWindows 10 1909のインプレースアップグレードの実行を行った結果, この問題は解決しました.

answers.microsoft.com

その後 Insider Preview に登録をして新しいバージョンの Windows のインストールを行いました. インストールは2時間くらいかかった気がします. そして, Ubuntu を WSL 1 から WSL 2 へ移行させます.

> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
> wsl --set-version Ubuntu 2

1時間ほど放置して処理は完了しました. しかし,WSL 2 を触ってみると結果としてどうも動作が遅い. SSD から HDD に移動させたせいだろうと考え,UbuntuSSD に戻すことにしました..

LxRunOffline による D: から C: への移動と WSL の消失

 戻すにも元々どこにあったのかよくわからなかったので,C: 直下に先程同様のディレクトリを作り LxRunOffline で最初と同様の操作を行いました.

> icacls C:\WindowsSubsystemForLinux\Ubuntu  /grant "onamae:(OI)(CI)(F)"
> LxRunOffline.exe move -n Ubuntu -d C:\WindowsSubsystemForLinux\Ubuntu

とここで文は忘れましたが,エラーが発生し D:\WindowsSubsystemForLinux\Ubuntu\onamae_home\program\hoge\.git 以下のファイルにアクセスできないようなことが書かれていました. ここで怖くなって > wsl -l を実行するもなにも表示されない.

終わった.

WSL 上から Ubuntu が消え去ってしまった問題を修復

 しかし,ほとんどは C:へ 移動できていると希望的観測をもって確認しました.

C:\WindowsSubsystemForLinux\Ubuntu
├── temp
│   ├── {[ここにUUIDが書かれたフォルダ]}
├── ext4.vhdx
├── fsserserver

ext4.vhdx が WSL 2 のパーティションということだったので,これがあればどうにかなるはず. Ubuntu に割り振られていた UUID もそれっぽいのが temp の中にあった. 後はこれを使って治せるはず. そして,以下の issue を見つけました.

github.com

Windows Registry Editor Version 5.00

[HKEY_USERS[SID]\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss{[UUID]}] "State"=dword:00000001 "DistributionName"="[DISTRO_NAME]" "Version"=dword:00000002 "BasePath"="\\?\[VHDX_PATH]" "Flags"=dword:0000000f "DefaultUid"=dword:000003e8 Below are the items you need to update in the registry script above:

[SID]: Open command prompt and run whoami /user to get your SID [UUID]: Go to this generator create a UUID [DISTRO_NAME]: Name of distro you want, for example: Ubuntu [VHDX_PATH]: Path of the distro with escaping slashes, for example: D:\WSL\Ubuntu

> whoami /user                                                                                                                
ユーザー名 SID                                                                                                          
========== ============================================== 
pc\onamae S-1-#ココにあるSIDが必要

Win+r から regedit を起動して,今回消えた Ubuntuレジスタキーと値を設定します.

f:id:p1sces:20200313041346p:plain
regedit のキーのpathと値

そして,Ubuntu が復活していることを確認しました.

> wsl -l -v                                                                                         
NAME      STATE           VERSION                                                                                      
Ubuntu    Stopped         2        

死んだかと思ったが、なんか動いてるからヨシ!

おわり

 Windows はむずい

追記

Kali Linux を入れてデフォルトの Register をスクショしました.

f:id:p1sces:20200315110429p:plain
Kali Linux の Regedit

Http proxy の壁を素直に通る

注意

Proxy の安易な突破は問題となりえますので,ここに示された方法を実践する際には担当者に問い合わせた上で,自己責任でお願い致します.

プロキシの呪縛

 皆さんのおられる職場や学校には Http proxy はありますでしょうか? Http proxy とは http や https のアクセスを行う際に, クライアントとサーバの中間に入りデータのキャッシュやアクセスログの収集, 特定のサイトのブロックなどを行う,クライアントの代理となるソフトウェアです. これによって,ユーザによらず危険なサイトのアクセスを制限したり, 就業中の無意味なネットサーフィンを管理することもできるかもしれません. Http proxy を扱う有名なソフトウェアとして Squid があげられます.

 ですがユーザからみると,ソフトウェアのアップデートも行えないということもあるかもしれませんし, 確認しなければならないのにページが見られない,なんて状況もあるかと思います. 意味のわからない理由(特定の単語がURLに含まれる等)でブロッキングが行われていることもあります.

そこで今回は Http proxy をそのまま通って,確認したいのに見られないページを一時的に見る方法を考えてみます. (安全は保証できませんが Web Proxy なんかもありますので,とりあえずサイトを見たいというかたは検索してみてください)

事前準備

以下必要となるもの

  • グローバル IP アドレス(ドメイン)を持つ制限のない外部コンピュータ(サーバ,VPS,NATによって外部 port からのアクセス転送可能なLAN内コンピュータ)
    • Port 443 への外部からのアクセスが iptables や firewalld 及び環境で許可されていること
    • sshd (ssh の待受に必要, Port 443 で待受) のインストール
    • squid (見たいサイトへ行く際に使用するプロキシ) のインストール
  • クライアントとなるコンピュータ
    • ssh (クライアントとなるコンピュータ) のインストール
    • corkscrew (proxyを通るために必要) のインストール

クライアントは Linux が使用可能な状況を想定していますが,わかる方であればどのような環境でも構いません.

環境想定です.

Proxy domain: proxy.example.jp
Proxy port: 8080
Proxy username: proxyuser
Proxy password: proxyppap

Outside domain: outside.example.com
Outside ssh port: 443
Outside ssh username: outsideuser
Outside ssh password: outsideppap

Outside proxy port: 8888

鍵等があるのであれば設定は適宜読み替えてください.

設定

基本 Http proxy は Port 80 と 443 の http と https 以外の要件では外へ行かしてくれないので, https のふりをするために,外部コンピュータの ssh は 443 で待ち受けないといけません.

.ssh/config の設定

Host proxyoutside
    Hostname outside.example.com
    Port 443
    user outsideuser
    ProxyCommand corkscrew outside.example.jp 8080 %h %p ~/.ssh/proxy.config
    LocalForward 8888 localhost:8888

.ssh/proxy.config の設定

proxyuser:proxyppap

proxyoutside が設定の名称です. Hostnamesshの接続先, Port が待受ているポートを表します. ProxyCommand では ssh の通信を渡すプログラムを指定し, 今回であれば corkscrew が Http proxy を通した上で, ssh 先に接続してくれます. ここに ssh を指定すれば多段アクセスを行うことも可能です. 最後の LocalForwardssh で接続している間,指定したローカルのポートへのアクセスを接続先の指定したポートへ転送する設定です. 今回は squid を Port: 8888 で待受させるのでローカルの同じポートを設定しています.

proxy.config は Http proxy に接続する際に必要となるユーザ情報を入れます.

接続

これらの設定を行ったら,

$ ssh proxyoutside

として外部コンピュータへ接続します. また,ssh で接続している間, localhost:8888 へのアクセスを 外部コンピュータのlocalhost:8888 に転送してくれます.

次に /etc/squid/squid.conf の設定です.

acl outsideproxy src 127.0.0.1/32
http_access allow outsideproxy
http_port 8888

これによって,外部コンピュータの localhost:8888squid が待ち構えてくれます. あとは squid を起動した上でクライアントとなるコンピュータのプロキシ設定に localhost:8888 を指定すれば, Http proxy の壁を素直に通ることができます.

それでは,ご利用は計画的に.

ワザップみたいな文章になったな

HackCon'19 に参加した (Writeup)

初めての CTF

 8/22,23 に某のグループワークでできた CTF グループ SCB の数人で HackCon'19

https://hackcon.online

に参加しました。 はじめての CTF は、新鮮な雰囲気を感じながら寝不足になりつつ、3問解けました。

HackCon offline

 HackCon はインドのどっかの大学?が主催してるらしく、時間もそちらにあわせて開始だったので、日本だと夜中の0時半からになっていました。 わくわくしつつ待っていましたが開始時間になっても 問題がみられず、 ググると IST とかいてあるのをインド標準時ではなくイスラエル標準時か何かと勘違いをしたようで、本当の開始は日本時間の1時半でした。 時間になり問題を確認しようとするもサイトが激重になっており、 404 が、 443 になり、 クラウドフレアさんが「落ちましたよー」って言ってきたので、寝ました。 数千チームほど登録していたようなので、運営も大変だったかと思います。

CTF スタート

 昼の4時半までが開催時刻(気づくと夜の10時まで延長されていた)なので、ここから本当のスタートです。flag は d4rk{*some-text-here*}c0de の形式で渡されました。

 朝の8時半ごろに起きサイトを確認すると、昨夜重かったのが理由かわかりませんが全チーム、アカウントの登録が解除されており登録し直しました。 すでに1000点を超えていたチームもいたので、寝て数時間後には直っていたのでしょう。

 以下解けた問題3つ(実質2つ)の Writeup です。

Discord

 とりあえずできそうな問題からということで問題をみると Misc に 1 点の問題 "Discord" があり、Discord のリンクがあったのでとぶと HackCon の Discord 鯖に参加できました。 運営用と参加者の質問用のチャンネルがあり、 d4rk で検索をかけると運営チャンネルに flag: d4rk{w3lc0m3_its_d4rk_h3r3}c0de のコメントがあり 1 点ゲットです。

 のちのち参加者用のチャンネルは開催中に、問題に関するヒント、答えっぽいもの、「その問題は楽勝だったぜw」、「誰か教えて」みたいな感じのコメントが溢れ治安を感じました。 CTF はこんな雰囲気なんですかね?(違うと思う)

Small icon much wow

 "This is not a flag" と書かれたJPEG の画像が渡されました。 nvim -b %!xxd! で画像のバイナリをみて、JFIFの文字が2つあり、画像に別の画像が埋め込まれることがわかりました。 JPEGEXIF 情報にJPEGの画像が含まれていたので、EXIF のサイズをその画像の前までに書き換えてでてきたQR を読み取り、 flag: d4rk{flAg*h1dd3n_1n_th3_thumbnail}c0de を手に入れ100点ゲットしました。

Secret Agent

 リンクをとぶと "Should d4rkc0de make their own browser" とでてきたので、 User-Agent を書き換えればいいんだなといくつか試しました。 最初の文字列をそのまま $ curl -A "Should d4rkc0de make their own browser" http://hogehoge/~ したら flag: d4rk{useragent_ftwwwwwww}c0de を手に入れ 100 数点を取った覚えがありますが、 解いた人数によってポイントが変わるようで最後は 100 点になっていました。

終わり

 チームとしての点数はほとんど BabyBlue0 (@BabyBlue0_jp) | Twitter が取ってくださいました(500点以上)。Crypto をばりばり解いてたのでかっこよかったです。 最中メンバーが解いてる問題について共有するように Tasker (@task4233) | TwitterGoogle Document を用意してくれて、他の人の進捗、やり方が見られて良かったです。

 はじめての CTF は普段考えないクイズのようで、とても楽しかったです。 参加したときには、またこんな感じで書きます。