SlideShare a Scribd company logo
Pythonを使った簡易診断
スクリプトの作り方
OWASP Kyushu Chapter Leader
服部祐一
自己紹介
• OWASP Kyushu Chapter Leader
• SECCON 実行委員
• 北九州情報セキュリティ勉強会「セキュ鉄」代表
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
はじめに
• Pythonを使って
• 情報の取得
• 自動ログイン
• 自動書き込み
• 最終的に簡易診断スクリプトを作成
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
デモ環境
• 仮想マシンをノートPC内に立ち上げて
• 仮想マシン上のWebアプリに対して
ホスト側からスクリプトを実行
ノートPC
仮想マシン
Webサーバ
対象アプリ
自動ログインスクリプト
自動書き込みスクリプト
自動診断スクリプト
対象アプリ
対象アプリ
• 攻防戦用に作成した脆弱性を多数含むPHPのWebアプリ
• https://github.com/Eidwinds/a_and_d_web_hokkaido
対象アプリ
• OWASP Broken Web Applications Project
• 脆弱なアプリケーションを集めた仮想マシンを提供しているプ
ロジェクト
• 2年近く更新されていないが、いろいろ入っていて便利なので
ここにあるWebアプリも対象に使う。
実行環境(Python)
• Python3系を用います。
使用するライブラリ
• Requests
• 人が使いやすいように設計されたHTTPのライブラリ。
• これを使ってHTMLの取得やPOSTの送信を行う。
• beautifulsoup4
• HTMLやXMLファイルからデータを取得するライブラリ。
Requests
http://requests-docs-ja.readthedocs.io/en/latest/
beautifulsoup4
http://kondou.com/BS4/
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
タイトルの取得
• まず、最初にタイトルタグに書かれている文字を
取得してみます。
流れとしては、
1. Requestsを使いGETリクエストでトップページのHTMLを取得。
2. HTMLをbeautifulsoup4を使ってパースする。
3. パースした結果からタイトルタグを取り出し、表示する。
HTMLの取得
• まず、Requestsを使ってトップページのHTMLを取得します。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
print(r.text)
指定したページに対し
てGETリクエストを
行います。
r.textでGETリクエスト
の結果のBodyをテキス
トで取得します。
HTMLの取得
Response Headerの取得
• おまけとしてResponse Headerを取る場合は、
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
print(r.headers)
r.Headersでkeyとvalue
のペアとして取得する
ことができます。
Response Headerの取得
HTMLをbeautifulsoup4を使ってパースする。
• Requestsで取得したHTMLをbeautifulsoup4を使ってパースし
てみましょう。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
bs = BeautifulSoup(r.text, "html.parser")
print(type(bs))
パースするHTMLを指定
しています。
パーサーを
指定しています。
オブジェクトのタイプ
を出力してます。
HTMLをbeautifulsoup4を使ってパースする。
タイトルタグを取り出し、表示する
• パースした結果からタイトルタグを取り出し、表示します。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
bs = BeautifulSoup(r.text, "html.parser")
print(bs.title)
bs.titleでタイトルタグ
を取得しています。
タイトルタグを取り出し、表示する
タグの中身だけを取り出す
• <title>も一緒についてきましたが今度はタグの中身だけを取り
出します。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
bs = BeautifulSoup(r.text, "html.parser")
print(bs.title.string)
.stringを付けることによ
り中身だけを取得でき
ます。
タグの中身だけを取り出す
他のタグの取得
• 今の書き方だと複数同じタグがある場合にはどうなるのか?
• ためしにAタグで試してみます。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
bs = BeautifulSoup(r.text, "html.parser")
print(bs.a)
他のタグの取得
一番最初のものだけ表示されました。
複数あるタグの取得
• 他のやり方でAタグの一覧を取得してみます。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
bs = BeautifulSoup(r.text, "html.parser")
a_list = bs.find_all(“a")
for a in a_list:
print(a) .find_allで指定したタグ
のリストを取得します。
複数あるタグの取得
タグの属性の取得
• おまけとしてAタグのhref属性だけを表示してみます。
import requests
from bs4 import BeautifulSoup
r = requests.get("http://192.168.237.130/page.php?p=index&t=TOP")
bs = BeautifulSoup(r.text, "html.parser")
a_list = bs.find_all(“a")
for a in a_list:
print(a.get(“href”))
.getで指定した属性を取
得します。
タグの属性の取得
URLをコマンドライン引数にする
• URLが固定だと毎回ソースコードをいじる必要があるので、
ここで、URLの設定をコマンドライン引数にしておきましょう。
import sys
import requests
from bs4 import BeautifulSoup
r = requests.get(sys.argv[1])
bs = BeautifulSoup(r.text, "html.parser")
a_list = bs.find_all(“a")
for a in a_list:
print(a.get(“href”))
sys.argv[1]で赤字の部分を取得します。
python test.py [argv1]
URLをコマンドライン引数にする
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
自動ログインの実装(CSRFTokenなし)
• inputタグの情報などはすべてわかってる前提での自動ログイン
を行う。
HTMLを解析し
必要な情報を取得
取得した情報を元
にログインページ
にログイン情報を
送信
ログイン成功
WackoPicko
• 脆弱性のあるWebサイト
• 画像の共有
• 画像の売買
• ゲストブック
• etc
HTMLの解析(手動)
• http://***.***.***.***/WackoPicko/users/login.php
<div class="column prepend-1 span-23 first last">
<h2>Login</h2>
<table style="width:320px" cellspacing="0">
<form action="/WackoPicko/users/login.php" method="POST">
<tr><td>Username :</td><td> <input type="text" name="username"
/></td></tr>
<tr><td>Password :</td><td> <input type="password"
name="password" /></td></tr>
<tr><td><input type="submit" value="login" /></td><td> <a
href="/WackoPicko/users/register.php">Register</a></td></tr>
</form>
</table>
</div>
送信先
ユーザ名
パスワード
自動ログインの実装(CSRFTokenなし)
import sys
import requests
payload = {
"username": "scanner1",
"password": "scanner1"
}
r = requests.post(sys.argv[1], data=payload)
print(r.text)
pyloadにログイン情報を入れます。
dataにpyloadを指定します。
自動ログインの実装(CSRFTokenなし)
ログインできているかの確認
• ログイン時にはLogoutボタンが表示されている。
• ログアウトボタンのリンクをログイン時の確認にしてみます。
ログインできているかの確認
import sys
import requests
from bs4 import BeautifulSoup
payload = {
"username": "scanner1",
"password": "scanner1"
}
r = requests.post(sys.argv[1], data=payload)
bs = BeautifulSoup(r.text, "html.parser")
a_list = bs.find_all("a")
for a in a_list:
if a.get("href") == "/WackoPicko/users/logout.php":
print("SUCCESS")
sys.exit()
print("FAILED")
ログアウトのURL
見つけたら終了
ログインできているかの確認
自動ログインの実装(CSRFTokenあり)
• CSRF対策されているログインフォームに対してログインする。
HTMLを解析し
必要な情報を取得
取得した情報を元
にログインページ
にログイン情報を
送信
ログイン成功
このフェーズで
CSRFTokenを取得する
対象アプリ
• BWAによさそうな対象がなかったのでCSRF対策されている公
開されているCTF用のスコアサーバーで試してみます。
• https://github.com/CyberSEAGame/score-server
• ユーザーは、test@example.com:test で作成しています。
先ほどのスクリプトでログインできるか
• 先ほどのCSRF対策の回避がないスクリプトでログインできな
いことを確認します。
import sys
import requests
payload = {
“email": test@example.com,
"password": “test"
}
r = requests.post(sys.argv[1], data=payload)
print(r.text)
先ほどのスクリプトでログインできるか
再度ログインフォー
ムがあるので失敗し
ているようです。
HTMLを読んでみる。
<form method="post" action="" class="normal-form">
<input name="fuel_csrf_token"
value="6eef0df3c731588c20cf6063d05c829135f82dd9becf29049a23c60c4a993
963a4cf406218a6de107b4bdc5ee3178b79ead7e61701de3ed6588d515ed998bc3
5" type="hidden" id="form_fuel_csrf_token" />
<fieldset>
<label for="email">Email:</label>
<input type="email" required="" name="email" id="email">
</fieldset>
<fieldset>
<label for="password">Password:</label>
<input type="password" required="" name="password" id="password">
</fieldset>
<button type="submit" class="normal-button center">Signin</button>
</form>
csrf tokenらしきもの
がある!
自動ログインの実装(CSRFTokenあり)
• CSRF対策されているログインフォームに対してログインする。
HTMLを解析し
必要な情報を取得
取得した情報を元
にログインページ
にログイン情報を
送信
ログイン成功
このフェーズで
CSRFTokenを取得する
CSRF Tokenの取得
• まず、CSRF Tokenを取得します。
• 対象はnameがfuel_csrf_tokenのinputタグです。
import sys
import requests
from bs4 import BeautifulSoup
r = requests.post(sys.argv[1])
bs = BeautifulSoup(r.text, "html.parser")
input_list = bs.find_all(“input”)
for input in input_list:
if input.get(“name”) == “fuel_csrf_token”:
print(input.get(“value”))
CSRF Tokenの取得
CSRF Tokenを一緒に送ってみる。
• 今度は、CSRF TokenもPyloadにいれて送信してみます。
import sys
import requests
from bs4 import BeautifulSoup
token = ""
r = requests.post(sys.argv[1])
bs = BeautifulSoup(r.text, "html.parser")
input_list = bs.find_all("input")
for input in input_list:
if input.get("name") == "fuel_csrf_token":
token = input.get("value")
payload = {
"email": "test@example.com",
"password": "test",
"fuel_csrf_token": token
}
r = requests.post(sys.argv[1], data=payload)
print(r.text)
ログインできてない?
別のところにもTokenがあるようです。
• Cookieの値も見てみましょう。
import sys
import requests
r = requests.post(sys.argv[1])
print(r.cookies)
CookieにもTokenが保存されているようだ。
fuel_csrf_tokenがある!
CookieにもTokenを設定して送る。
import sys
import requests
from bs4 import BeautifulSoup
token = ""
cookie_token = ""
r = requests.post(sys.argv[1])
cookie_token = r.cookies["fuel_csrf_token"]
bs = BeautifulSoup(r.text, "html.parser")
input_list = bs.find_all("input")
for input in input_list:
if input.get("name") == "fuel_csrf_token":
token = input.get("value")
payload = {
"email": "test@example.com",
"password": "test",
"fuel_csrf_token": token
}
cookies = dict(fuel_csrf_token=cookie_token)
r = requests.post(sys.argv[1], data=payload, cookies=cookies)
print(r.text)
Cookieをセット
辞書型のCookie一覧を作成
ログイン成功!
Logoutボタンがあるので
ログインに成功している
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
ログイン後ページでの情報の取得
• ログイン後に特定ページの情報が取得できるか試してみます。
• 今回は、ログイン後にしか見ることができないQuestionsペー
ジを取得できるかを試します。
• なお、ログインしていないと404に飛ばされます。
まず、先ほどのスクリプトの後にアクセスしてみます。
import sys
import requests
from bs4 import BeautifulSoup
token = ""
cookie_token = ""
r = requests.post(sys.argv[1])
cookie_token = r.cookies["fuel_csrf_token"]
bs = BeautifulSoup(r.text, "html.parser")
input_list = bs.find_all("input")
for input in input_list:
if input.get("name") == "fuel_csrf_token":
token = input.get("value")
payload = {
"email": "test@example.com",
"password": "test",
"fuel_csrf_token": token
}
cookies = dict(fuel_csrf_token=cookie_token)
r = requests.post(sys.argv[1], data=payload, cookies=cookies)
r = requests.post(sys.argv[2], data=payload)
print(r.text)
失敗して404が返ってきました。
ログインに関する情報はCookieに
• 今度は、ログイン後のCookieをそのまま引き継いでアクセスし
てみます。
• 長いのでソースは次のページに。
ログインに関する情報はCookieに
import sys
import requests
from bs4 import BeautifulSoup
token = ""
cookie_token = ""
r = requests.post(sys.argv[1])
cookie_token = r.cookies["fuel_csrf_token"]
bs = BeautifulSoup(r.text, "html.parser")
input_list = bs.find_all("input")
for input in input_list:
if input.get("name") == "fuel_csrf_token":
token = input.get("value")
payload = {
"email": "test@example.com",
"password": "test",
"fuel_csrf_token": token
}
cookies = dict(fuel_csrf_token=cookie_token)
r = requests.post(sys.argv[1], data=payload, cookies=cookies)
r = requests.post(sys.argv[2], data=payload, cookies=r.cookies)
print(r.text)
Questionsのページが取得できました。
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
掲示板への自動書き込み
• ここでは、
• 掲示板への書き込み
• ちゃんと書き込めたのかのチェック
• を行います。
まず書き込んでみる。
• 先ほどのログインの要領で今度は掲示板に書き込みます。
import sys
import requests
payload = {
"title": "タイトル",
"name": "名前",
"body": "本文"
}
r = requests.post(sys.argv[1], data=payload)
print(r.text)
書き込まれました!
ちゃんと書き込めたのかのチェック
• 書き込んだ内容がちゃんと反映されているか確認してみます。
かぶると面倒なのでタイトルに時間を書き込みます。
import sys
import requests
from bs4 import BeautifulSoup
from datetime import datetime
title = datetime.now().isoformat()
payload = {
"title": title,
"name": "名前",
"body": "本文"
}
r = requests.post(sys.argv[1], data=payload)
bs = BeautifulSoup(r.text, "html.parser")
h2_list = bs.find_all("h2")
for h2 in h2_list:
if h2.string == title:
print("SUCCESS")
sys.exit()
print("FAILED")
現在時刻の文字列をiso
フォーマットで取得
タイトルを確認
ちゃんと書き込めたのかのチェック
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
自動書き込みによる脆弱性診断(XSSチェック)
• 先ほどの書き込む文字列をJavaScriptの入った文字列に変えて
みましょう。
import sys
import requests
from bs4 import BeautifulSoup
from datetime import datetime
xss = '<script>console.log(1);</script>'
payload = {
"title": xss,
"name": "名前",
"body": "本文"
}
r = requests.post(sys.argv[1], data=payload)
bs = BeautifulSoup(r.text, "html.parser")
h2_list = bs.find_all("h2")
for h2 in h2_list:
if h2.string == xss:
print("SUCCESS")
sys.exit()
print("FAILED")
?
確認できなかった
• HTMLとして意味を持ったためにさっきの書き方だと破壊され
るようだ。
http://kondou.com/BS4/
別のメソッドを使ってみよう
• これだけ多くのメソッドがあるなら使えるものがあるはず!
http://kondou.com/BS4/
別のメソッドを使ってみよう
import sys
import requests
from bs4 import BeautifulSoup
from datetime import datetime
xss = '<script>console.log(1);</script>'
payload = {
"title": xss,
"name": "名前",
"body": "本文"
}
r = requests.post(sys.argv[1], data=payload)
bs = BeautifulSoup(r.text, "html.parser")
h2_list = bs.find_all("h2")
for h2 in h2_list:
for child in h2.children:
if str(child) == xss:
print("SUCCESS")
sys.exit()
print("FAILED")
HTML構造になるならそれに
ならって子要素を探索
成功!
アジェンダ
• はじめに
• デモ環境について
• 情報の取得
• 自動ログインの実装
• ログイン後ページでの情報の取得
• 掲示板への自動書き込み
• 自動書き込みによる脆弱性診断(XSSチェック)
• まとめ
まとめ
• Pythonのライブラリである
Requestsとbeautifulsoup4を使って
• Webページから情報を入手する方法
• CSRFトークンのあるページでの自動ログイン
• 自動書き込みによる脆弱性の検査

More Related Content

What's hot

エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)Hiroshi Tokumaru
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
matsu_chara
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
Etsuji Nakai
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見る
Takeru Maehara
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
Amazon Web Services Japan
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
Yuki Morishita
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
 
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
 
Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!
zaki4649
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
Masatoshi Tada
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
 
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato KinugawaCODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
 

What's hot (20)

エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
 
FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎FridaによるAndroidアプリの動的解析とフッキングの基礎
FridaによるAndroidアプリの動的解析とフッキングの基礎
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
backlogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見るbacklogsでもCI/CDする夢を見る
backlogsでもCI/CDする夢を見る
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
 
Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato KinugawaCODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
 

Similar to Pythonを使った簡易診断スクリプトの作り方

MySQL 監査システムを作った話 #mysqlcasual
MySQL 監査システムを作った話 #mysqlcasualMySQL 監査システムを作った話 #mysqlcasual
MySQL 監査システムを作った話 #mysqlcasual
Yahoo!デベロッパーネットワーク
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
VirtualTech Japan Inc.
 
[SC13] ログ管理で向上させるセキュリティ
[SC13] ログ管理で向上させるセキュリティ[SC13] ログ管理で向上させるセキュリティ
[SC13] ログ管理で向上させるセキュリティ
de:code 2017
 
すぐできるWeb制作時のセキュリティTips
すぐできるWeb制作時のセキュリティTipsすぐできるWeb制作時のセキュリティTips
すぐできるWeb制作時のセキュリティTips
yoshinori matsumoto
 
テスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめテスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめ
kinunori
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
JustSystems Corporation
 
ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎
Takahisa Kishiya
 
ゲームの自動テストを 作ってみた
ゲームの自動テストを 作ってみたゲームの自動テストを 作ってみた
ゲームの自動テストを 作ってみた
Yuusuke Takeuchi
 
Webアプリケーション脆弱性体験ハンズオン
Webアプリケーション脆弱性体験ハンズオンWebアプリケーション脆弱性体験ハンズオン
Webアプリケーション脆弱性体験ハンズオン
Yuichi Hattori
 
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
SYUE-SIANG SU
 
20140926 mt cloud_handson_seminar
20140926 mt cloud_handson_seminar20140926 mt cloud_handson_seminar
20140926 mt cloud_handson_seminar
Six Apart
 
社内勉強会 20120518
社内勉強会 20120518社内勉強会 20120518
社内勉強会 20120518
yoshinori matsumoto
 
Rablock applicatin dev_guide_v1.2
Rablock applicatin dev_guide_v1.2Rablock applicatin dev_guide_v1.2
Rablock applicatin dev_guide_v1.2
Yoshi Nagase
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説Akira Inoue
 
Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要
Masaru Horioka
 
AWSクラウドデザインパターン VPC移行編
AWSクラウドデザインパターン VPC移行編AWSクラウドデザインパターン VPC移行編
AWSクラウドデザインパターン VPC移行編Yasuhiro Araki, Ph.D
 
OpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かすOpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かす
KUNITO Atsunori
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
真吾 吉田
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
 

Similar to Pythonを使った簡易診断スクリプトの作り方 (20)

MySQL 監査システムを作った話 #mysqlcasual
MySQL 監査システムを作った話 #mysqlcasualMySQL 監査システムを作った話 #mysqlcasual
MySQL 監査システムを作った話 #mysqlcasual
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
 
[SC13] ログ管理で向上させるセキュリティ
[SC13] ログ管理で向上させるセキュリティ[SC13] ログ管理で向上させるセキュリティ
[SC13] ログ管理で向上させるセキュリティ
 
すぐできるWeb制作時のセキュリティTips
すぐできるWeb制作時のセキュリティTipsすぐできるWeb制作時のセキュリティTips
すぐできるWeb制作時のセキュリティTips
 
テスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめテスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめ
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎ライブコーディングとデモで理解するWebセキュリティの基礎
ライブコーディングとデモで理解するWebセキュリティの基礎
 
ゲームの自動テストを 作ってみた
ゲームの自動テストを 作ってみたゲームの自動テストを 作ってみた
ゲームの自動テストを 作ってみた
 
Webアプリケーション脆弱性体験ハンズオン
Webアプリケーション脆弱性体験ハンズオンWebアプリケーション脆弱性体験ハンズオン
Webアプリケーション脆弱性体験ハンズオン
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
The Amazing Toolman - Mastering the tools and propose a hackable "Swiss Army ...
 
20140926 mt cloud_handson_seminar
20140926 mt cloud_handson_seminar20140926 mt cloud_handson_seminar
20140926 mt cloud_handson_seminar
 
社内勉強会 20120518
社内勉強会 20120518社内勉強会 20120518
社内勉強会 20120518
 
Rablock applicatin dev_guide_v1.2
Rablock applicatin dev_guide_v1.2Rablock applicatin dev_guide_v1.2
Rablock applicatin dev_guide_v1.2
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要Klocwork C/C++解析チューニング 概要
Klocwork C/C++解析チューニング 概要
 
AWSクラウドデザインパターン VPC移行編
AWSクラウドデザインパターン VPC移行編AWSクラウドデザインパターン VPC移行編
AWSクラウドデザインパターン VPC移行編
 
OpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かすOpenWhisk - Docker action で MeCab を動かす
OpenWhisk - Docker action で MeCab を動かす
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 

Pythonを使った簡易診断スクリプトの作り方