SECCON Beginners名古屋の参加記(供養)

7/1名古屋開催のSECCON Beginnersに参加してきました。

rev及びpwnが苦手なのでなんとかしようと思って参加

講義内容

Web: HTTP,SQLiのお話

Forensic:pcap,filesystem周り

Reversing: revの読み方

Forのpcapの話は知っていたのですがForのfilesystemを扱うコマンドがとっても便利でした

またReversingで小さな演習でrevを読んでくのは飽きにくく、がんばろうという気持ちに慣れました。

CTF

3問解けずの5位、ただし一問は絶対に解けるだろって感じ、flagがわかりきっていたのにpngに気を取られて死亡したのがもったいなさすぎる。

revはgdbを使い解いていったので今後も操作を忘れないように取り組んでいきたいです。

懇親会

実は今回の一番の目的だった懇親会。

今自分が学内向けにCTFの問題を差くもんしているので運営の方にお話を効くチャンスと考えてました。

れっくす氏、しふくろ氏、ちひろ氏から作問のお話を聞けて、いい感じの問題を作れそうです。

今回は開催場所が名古屋ということで普段nagoyasecにも参加しているため、色んな人からnagoyasecでのLTの方だよね。とお声をかけていただきました。

3月のnagoyasecのLTで「SHA1衝突でピンチ!」という内容をしたのですがよっぽどインパクトがあったらしく、次回のnagoyasecでもLTの登壇決定したらがんばらないとなという気持ちです。

Wirteup

正直他の問題は全部答え合わせしたのでコメントにきてたcrackme_revengeだけ

Crackme_revenge

Reversingです。当日は誰も解けていなかったやつです。これを含めてあの時間内に全完できたらたしかにBeginnerじゃないなと言う感じ。

と言っても難しい問題ではないです。ただこの問題はgdbで見ていくと辛いのでIDAで見ることをおすすめします。

バイナリは./crackme_revenge AAAAと言った感じで動きます

ここからのバイナリの動きですが

  1. 入力されたパスワードが20文字であるか確認

  2. パスワードを1文字ずつ確認してあっていれば次の文字、間違っていればWrong Password

と言った感じです。

比較する文字列は気づいた方も多いと思いますが、Y1w_5te`p-uaBfiiopesの20文字と比較しています

ここからがIDA先生の出番です

f:id:kataware8136:20170713205935p:plain

これを3個の流れのはじめはすべて一緒で

  1. Y1w_5te`p-uaBfiiopesから1文字を取得(movからmovzxまたはmovsxまで)
  2. 入力されたパスワードから1文字取得(次のmovからmovxzまたはmovsxまで)

そうすると残り二つにadd edx 1add edx 2があるのが気になります。

勘のいい人はここで気づくでしょうし実際にためせばわかるのですがasciiコードに1もしくは2をたしてから比較してる文字があるということです。

f:id:kataware8136:20170713211407p:plain

その前も見てると1足してる部分があります。まぁここの解説はほとんどする意味ないのでスルー

簡単に言ってしまうとmod 3して結果を受けてjmpしています。(実際はそれをめんどくさくやってる)

なのであとは文字列をいい感じにずらしてください。

flag自体は載せません。みなさんで試して突破してください。

パスワードがあってればflagがでてきます。Let’s Fight!!!

余談

ちなみに55はpush ebp

Ubuntuにnpmが入らない時の解決法

Ubuntuでnodejsとnpmをインストールしたときにnpmが入らなかったためその解決法

npmインストールのときに起こったこと

$ sudo apt-get install npm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 npm : 依存: nodejs しかし、インストールされようとしていません
       依存: node-abbrev (>= 1.0.4) しかし、インストールされようとしていません
       依存: node-ansi しかし、インストールされようとしていません
       依存: node-archy しかし、インストールされようとしていません
       依存: node-block-stream しかし、インストールされようとしていません
       依存: node-fstream (>= 0.1.22) しかし、インストールされようとしていません
       依存: node-fstream-ignore しかし、インストールされようとしていません
       依存: node-github-url-from-git しかし、インストールされようとしていません
       依存: node-glob (>= 3.1.21) しかし、インストールされようとしていません
       依存: node-graceful-fs (>= 2.0.0) しかし、インストールされようとしていません
       依存: node-inherits しかし、インストールされようとしていません
       依存: node-ini (>= 1.1.0) しかし、インストールされようとしていません
       依存: node-lockfile しかし、インストールされようとしていません
       依存: node-lru-cache (>= 2.3.0) しかし、インストールされようとしていません
       依存: node-minimatch (>= 0.2.11) しかし、インストールされようとしていません
       依存: node-mkdirp (>= 0.3.3) しかし、インストールされようとしていません
       依存: node-gyp (>= 0.10.9) しかし、インストールされようとしていません
       依存: node-nopt (>= 2.1.1) しかし、インストールされようとしていません
       依存: node-npmlog しかし、インストールされようとしていません
       依存: node-once しかし、インストールされようとしていません
       依存: node-osenv しかし、インストールされようとしていません
       依存: node-read しかし、インストールされようとしていません
       依存: node-read-package-json (>= 1.1.0) しかし、インストールされようとしていません
       依存: node-request (>= 2.25.0) しかし、インストールされようとしていません
       依存: node-retry しかし、インストールされようとしていません
       依存: node-rimraf (>= 2.2.2) しかし、インストールされようとしていません
       依存: node-semver (>= 2.1.0) しかし、インストールされようとしていません
       依存: node-sha しかし、インストールされようとしていません
       依存: node-slide しかし、インストールされようとしていません
       依存: node-tar (>= 0.1.18) しかし、インストールされようとしていません
       依存: node-which しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

依存関係で壊れているらしい。

解決方法

ggrとUbuntuで依存関係が壊れている時の対応を見つける

aptitudeを用いて依存関係をダウンロードすることができるっぽいので試してみる。

$ sudo aptitude install npm
[sudo] password for takeuchi: 
以下の新規パッケージがインストールされます:
  gyp{a} libjs-node-uuid{a} node-abbrev{a} node-ansi{a} node-archy{a} node-async{a} node-block-stream{a} node-combined-stream{a} node-cookie-jar{a} node-delayed-stream{a} 
  node-forever-agent{a} node-form-data{a} node-fstream{a} node-fstream-ignore{a} node-github-url-from-git{a} node-glob{a} node-graceful-fs{a} node-gyp{a} node-inherits{a} node-ini{a} 
  node-json-stringify-safe{a} node-lockfile{a} node-lru-cache{a} node-mime{a} node-minimatch{a} node-mkdirp{a} node-mute-stream{a} node-node-uuid{a} node-nopt{a} 
  node-normalize-package-data{a} node-npmlog{a} node-once{a} node-osenv{a} node-qs{a} node-read{a} node-read-package-json{a} node-request{a} node-retry{a} node-rimraf{a} node-semver{a} 
  node-sha{a} node-sigmund{a} node-slide{a} node-tar{a} node-tunnel-agent{a} node-which{a} npm 
0 個のパッケージを更新、 47 個を新たにインストール、 0 個を削除予定、3 個が更新されていない。
988 k バイトのアーカイブを取得する必要があります。 展開後に 5,083 k バイトのディスク領域が新たに消費されます。
以下のパッケージには満たされていない依存関係があります:
 nodejs : 競合: npm [1.3.10~dfsg-1 がインストール予定となっています]
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージを現在のバージョンに一時固定する:
1)     npm [インストールされていません]               



この解決方法を受け入れますか? [Y/n/q/?] .
以下のアクションでこれらの依存関係の問題は解決されます:

     以下のパッケージをインストールする:                                                         
1)     libc-ares-dev [1.10.0-2 (trusty)]                                                         
2)     libv8-3.14-dev [3.14.5.8-5ubuntu2 (trusty)]                                               
3)     libv8-3.14.5 [3.14.5.8-5ubuntu2 (now, trusty)]                                            
4)     nodejs-dev [0.10.25~dfsg2-2ubuntu1 (trusty)]                                              

     以下のパッケージをダウングレードする:                                                       
5)     libc-ares2 [1.10.0-2ubuntu0.1 (now, trusty-security, trusty-updates) -> 1.10.0-2 (trusty)]
6)     nodejs [0.10.37-1chl1~trusty1 (now, trusty) -> 0.10.25~dfsg2-2ubuntu1 (trusty)]           



この解決方法を受け入れますか? [Y/n/q/?] y

最初のこの解決方法を受け入れますかで「.」を入力することで依存関係の問題を解決してくれる。この解決方法を受け入れますかで「y」を選択すればよい

するとnpmが無事インストールされてる。apt-getで確認しても問題ない

$ which npm
/usr/bin/npm
$ sudo apt-get install npm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
npm はすでに最新版です。

困ってる人の助けになれば….

Scrapyを使ったFossdroidのAPK-crawl

FossdroidというAndroidOSSのアプリを集めたサイトがある。ここにあるアプリの内HTMLハイブリッドアプリが欲しくて、集めようとした備忘録

Scrapyとshellscriptを使ったよ

Scrapyのインストー

$ sudo pip install --upgrade pip
$ sudo pip install pyopenssl
$ sudo pip install --upgrade pyopenssl
$ sudo pip install scrapy
$ sudo pip install --upgrade Scrapy

pipでいれればいいけど色々エラーが起きたのでその度調べて解決、最終的には私は上のコマンドを打ってインストール完了

Scrapyを使ったcrawl

プロジェクトの作成

まずはクロールを行うプロジェクトを作成する.scrapy startproject プロジェクト名で作成

$ scrapy startproject apkcrawl

設定ファイルの編集

今回対象とするfossdroid.comのrobots.txtに従うように、かつ負荷をかけないようにDELAYをつける

ROBOTSTXT_OBEYTrueになっていること(デフォルトでTrueなので問題ないはず)

DOWNLOAD_DELAYコメントアウトをはずし3と設定する

$ cd apkcrawl/apkcrawl
$ vim settings.py


# -*- coding: utf-8 -*-

# Scrapy settings for apkcrawl project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'apkcrawl'

SPIDER_MODULES = ['apkcrawl.spiders']
NEWSPIDER_MODULE = 'apkcrawl.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'apkcrawl (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 3

(snipping)

保存するデータのクラスを作成

crawlした際に保存するデータのクラスを作成する.

今回はapkのタイトルとapkのurlを保存したいので、そういったクラスとする

$ vim items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy
    

class ApkcrawlItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field() # name of application
    url = scrapy.Field() # url of APK

crawl本体を書く

scrapy genspider クロールファイル名 集めたいデータのurlでクロール本体のスクリプトファイルを作成

クロールファイル名は何でもいいので私はapkcrawl_spider,fossdroidからデータを集めるので集めたいデータのurlはfossdroid.comとなる

$ scrapy genspider apkcrawl_spider fossdroid.com
$ vim spiders/apkcrawl_spider.py

# -*- coding: utf-8 -*-
from ..items import ApkcrawlItem
import scrapy


class ApkcrawlSpiderSpider(scrapy.Spider):
    name = 'apkcrawl_spider'
    allowed_domains = ['fossdroid.com']
    start_urls = (
            'http://fossdroid.com/c/system/whats_new.html',
            'http://fossdroid.com/c/internet/whats_new.html',
            'http://fossdroid.com/c/multimedia/whats_new.html',
            'http://fossdroid.com/c/games/whats_new.html',
            'http://fossdroid.com/c/navigation/whats_new.html',
            'http://fossdroid.com/c/time/whats_new.html',
            'http://fossdroid.com/c/writing/whats_new.html',
            'http://fossdroid.com/c/science-education/whats_new.html',
            'http://fossdroid.com/c/reading/whats_new.html',
            'http://fossdroid.com/c/connectivity/whats_new.html',
            'http://fossdroid.com/c/theming/whats_new.html',
            'http://fossdroid.com/c/security/whats_new.html',
            'http://fossdroid.com/c/development/whats_new.html',
            'http://fossdroid.com/c/money/whats_new.html',
            'http://fossdroid.com/c/sports-health/whats_new.html',
            'http://fossdroid.com/c/phone-sms/whats_new.html',
            'http://fossdroid.com/c/graphics/whats_new.html'
            )


    def parse(self, response):
        for res in response.css("h5"):
            apk = ApkcrawlItem()
            apk['title'] = res.css("a::text").extract_first()
            print(apk['title'])
            nextpage = res.css("a::attr('href')").extract_first()
            print(nextpage)
            if nextpage:
                url = response.urljoin(nextpage)
                apk['url'] = url

            yield apk

start_urlsにはクロールするurlを書いておく。start_urlsに書いてあるurl毎にparse関数を実行していくことになる.

あとはfossdroidのソースコードを確認していく。urlから更にurlを入手してcrawlしていく方法がわからなかったため、ここではアプリケーションページのurlを入手することにした.

scrapyの実行

$ scrapy crawl apkcrawl_spider -o apklist.json

-oで書き出すjsonファイルを指定する.

入手したいapkのファイルは入手したアプリケーション名.htmlのhtmlをapkに変えるだけで良いとわかったのでここからはスクリプトを書く

apkのダウンロード

文字列を置換してひたすらwgetするだけ.保存用のディレクトリapkを作成しておく

import json
import os

f = open("apklist.json","r")
apklist = []
json_data = json.load(f)
for i in range(len(json_data)):
    url = json_data[i]['url'].replace("html","apk")
    os.system("wget "+url+" -P apk")

HTMLハイブリッドアプリの判別

最後に集めたapkの中からHTMLハイブリッドアプリを判別する.apkの実体はzipファイルなのでunzipしてhtmlファイルがあるかないかで判別を行う

事前に作業ディレクトリであるtmpディレクトリとhtmlハイブリッドアプリのapkファイルを保存するhtmlapkディレクトリを作成しておく

#!/bin/bash
for file in `\find ./apk -maxdepth 1 -type f`; do
    unzip -d ./tmp $file
    htmlfile=`find ./tmp/ -type f -name "*.html"`
    for a in $htmlfile; do
        cp $file ./htmlapk/
        break
    done
    rm -r ./tmp/*
done

参考