#!

路上に就職!

security hobbyistのためのGoogle Hacking

はじめに

Google HackingとはGoogle検索エンジンのクエリ機能を使用して情報漏洩や脆弱性が存在するWebサイトを見つけ出すテクニックです。
Mitre AttackではReconnaissanceのSearch Open Websites/Domainsのサブテクニック(T1593.002)に該当します。
Google HackingはGoogle Dorksまたは特定の検索演算子やクエリを使用して行います。
この手法により意図せず公開してしまった機密情報や設定ファイル、ソフトウェアの管理画面などを発見することができます。

Google Dorks

Google Dorksとはデータベースのダンプ情報や認証情報などを効率的に探し出すためのテクニックやクエリのことを指します。 Exploit DatabaseにはGoogle Hackingの項目があり世界中のセキュリティ研究者や攻撃者が構築したGoogle Dorksの一覧を見ることができます。

Google Hacking Database (GHDB) - Google Dorks, OSINT, Recon

Exploit Databaseを見ればよいと考えるかもしれませんが自分で検索クエリを組み立てることができれば 状況に応じて柔軟な検索をすることができます。検索演算子を理解することはとても重要です。

Google 検索演算子

Google では検索オプションという機能があり高度な検索することができます。

www.google.com

また、検索フォームに検索演算子を入力することによって検索オプションページからではなくても 高度な検索を利用することができます。

google検索で検索演算子を利用する

以下は検索演算子の一覧です。

演算子 説明
" " ダブルクォートで囲むことで、そのフレーズを完全一致で検索します。
- 直前のワードを除外して検索します。
OR 2つのキーワードのうちいずれかが含まれるページを検索します。大文字で入力する必要があります。
* ワイルドカードとして機能します。任意のワードやフレーズに置き換えられます。
.. 2つの数字の間の範囲を指定して検索します。
site: 指定したサイト内を検索します。例: site:example.com
intitle: タイトルに指定したキーワードが含まれるページを検索します。
allintitle: タイトルに指定したすべてのキーワードが含まれるページを検索します。
inurl: URLに指定したキーワードが含まれるページを検索します。
allinurl: URLに指定したすべてのキーワードが含まれるページを検索します。
allinanchor: そのページへのリンク内に指定したすべてのキーワードが含まれるページを検索します。
intext: ページの本文に指定したキーワードが含まれるページを検索します。
allintext ページの本文に指定したすべてのキーワードが含まれるページを検索します。      
filetype: 指定したファイルタイプのドキュメントを検索します。例: filetype:pdf
related: 指定したURLに関連するウェブサイトを検索します。
info: 指定したURLの情報やキャッシュされたバージョンへのリンクを表示します。
cache: Googleがキャッシュしたページのバージョンを表示します。

たとえば、ディレクトリリスティングが有効なwebサーバでrobots.txtを検索するには以下のクエリを指定します。
intitle:"index of" "robots.txt"

また、検索クエリはChatGPTで書かせることもできますが2021年9月までの情報しか学習していないため 最新の検索オプションに対応できない可能性があります。

chatgptで検索クエリを作成する

Google検索で言語や期間を指定する。

Googleにはページの言語や検索エンジンに登録されてからの期間を指定する機能があります。この機能を使うことによって Google Hackingで古い情報や間違って表示された検索結果に振り回されないで済むようになります。

ツールを利用する

Googleのwebサイトで検索し検索結果で表示されたファイルを手動ですべてダウンロードするのは手間です。 CLI上で検索してその結果を加工したりファイルを一括でダウンロードできる方が効率が良いです。 そこでGoogle Hackingをコマンドラインベースで実行できるツール、GooFuzzを紹介します。 github.com

このツールはShell Script(bash)で実装されておりgit cloneして実行権限を付与するだけで利用することができます。

ダウンロードとインストール

$ git clone https://github.com/m3n0sd0n4ld/GooFuzz.git
$ cd GooFuzz
$ chmod +x GooFuzz
$ ./GooFuzz -h

実行する

※テストのためターゲットはexample.comを指定しています。

:~/tool/GooFuzz$ ./GooFuzz -t example.com -e pdf,doc,bak
*********************************************************
* GooFuzz 1.2.2 - The Power of Google Dorks             *
*********************************************************

Target: example.com

Sorry, no results found for pdf.

Sorry, no results found for doc.

Sorry, no results found for bak.

今回はGoogle Hackingについて整理してみました。いつも検索演算子をググっていたのでこれを機にまとめられてよかったです。

TcpViewを使ってみた

最近、詳解インシデントレスポンスを読んでます。不審な接続に注意を払えと
本書に書いてあったのでWindowsnetstatをわかりやすく表示してくれるツールを探していました。
googleさんに聞いてみるとTcpViewと呼ばれるツールがわかりやすそうだったので使ってみました。

以下のリンクからダウンロードできます。 docs.microsoft.com

f:id:x6d61:20220216190403p:plain

RemoteAddressやRemort Portはもちろん、Process NameやProcess IDも同時に見れて表示にわかりやすいです。
header部分にはtcpudpなどプロトコルで簡単にフィルターができるようになっています。

f:id:x6d61:20220216191815p:plain

通信をダブルクリックするとその通信を実行しているアプリケーションは何か表示してくれます。

f:id:x6d61:20220216192003p:plain

通信を右クリック→whoisを選択すると通信しているドメインwhoisを引いてくれるようです。

f:id:x6d61:20220216193304p:plain

Ctrl+sで現在表示している通信をcsv形式で保存もできるようです。

cmdからnetstatコマンドで通信一覧を表示するより、かなりわかりやすいのではないでしょうか。
こういったツールを積極的に使っていきたいです。

いまだに現金払い?

両替機で1000円を両替すると以下の硬貨で10円、50円、100円、500円出てきます。
使わない硬貨があっても良いが最大で15枚になるように両替されます。
1000円を入れたときに出てくる両替された硬貨の組み合わせはいくつあるでしょうか?
という問題です。

atcoder.jp

Atcoderのこの問題を思い出しました!
硬貨の最大数も15枚なので全探索で解きました。以下コードです。

count = 0
0.upto(15) do |f|
    0.upto(15) do |h|
        0.upto(15) do |fi|
            0.upto(15) do |t|
                if 15 >= f+h+fi+t
                    ans = (f*500)+(h*100)+(fi*50)+(t*10)
                    if ans == 1000
                        count+=1
                    end
                end 
            end
        end
    end
end

puts count

15枚の制限を読み落とし実装を少し間違えたりしました…😂

10進数で回文

プログラマ脳を鍛える数学パズル」という本を読んでいるのですが
解答をこのブログに載せようと思いました!。

「10進数、2進数、8進数で表現しても回文となる数の中で10進数の10以上で最小の値を求めろ」 という問題です。
ABCのA問題位の難易度ですぐに解けました。

(10..).each do |n|
    if (n.to_s == n.to_s.reverse) && (n.to_s(2) == n.to_s(2).reverse) && (n.to_s(8) == n.to_s(8).reverse)
        puts n
        exit
    end
end

問題的にそこまで時間がかからないだろうと思い10以上の数字すべてが
回文かどうか調べる方法をとりました。
本では2進数に着目し、一番右桁の桁の数字が0になると
左桁も数字も0にならなければいけず2進数としておかしいことから
右の桁が1になる奇数だけに絞って回文となる数を見つけてました。
頭いい!(^o^)

githubのcontribute数をCLIに表示するコマンドを作った。

githubのcontribute数をCLIに表示するコマンドを作成しました。
以下は自分のアカウントの1年のcontribute数です。全然少ない…
f:id:x6d61:20210113171420p:plain gem化してrubygem.orgで公開してます。

rubygems.org また、コードは以下のリポジトリに置いています。 github.com

簡単に説明するとgithubのcontribute数をスクレイピングして色を指定している部分を抜き出しています。

    html = URI(url)
    body = html.read
    body.scan(/<rect.*--color-calendar-graph-day-(bg|L1|L2|L3|L4).*>/)

スクレイピングした結果を各カラーに変更しながら2次元配列に追加しています。

    0.step(commit_data.length - 1, 7) do |index|
      oneweek_tile = commit_data.slice(index, 7)
      oneweek_tile.each_with_index do |item, index|
        @tile_table[index] << TILE_COLOR[item.to_sym]
      end
    end

各カラーに変更する処理はRainbowというgemを使いました。

TILE_COLOR = { bg: Rainbow("[]").color(235, 237, 240).background(235, 237, 240),
                 L1: Rainbow("[]").color(155, 233, 168).background(155, 233, 168),
                 L2: Rainbow("[]").color(111, 197, 100).background(111, 197, 100),
                 L3: Rainbow("[]").color(90, 162, 79).background(90, 162, 79),
                 L4: Rainbow("[]").color(59, 111, 58).background(59, 111, 58),
                 dummy: Rainbow("[]").color(0, 0, 0).background(0, 0, 0) }

CLI部分はThorというgemに頼りました。

 class CLI < Thor
        desc "show user","Shows the number of commits in git"
        option "year",aliases:"y",desc: 'Specify the year to display'
        def show(user)
            git_scrap = GitScrap.new(user)
            git_scrap.year = options["year"].to_i if options["year"]
            git_scrap.make_grass_table()
            git_scrap.tile_table.each { |t| puts t.join }
        end
    end

感想

gemを作ってrubygem.orgに上げる手順がわかってよかったです(^o^)

rubyで鏡餅

ruby鏡餅を表示させてみた。

f:id:x6d61:20210111000030p:plain
実行時
以下はコード

output = []
12.times do |y|
  output[y] = []
  18.times do |x|
    if y == 0 && x >= 10 && x <= 11
      output[y][x] = "\e[32m#\e[0m"
    elsif 1 == y && x >= 10 && x <= 10
      output[y][x] = "\e[32m#\e[0m"
    elsif y == 2 && x >= 9 && x <= 11
      output[y][x] = "\e[33m#\e[0m"
    elsif y == 3 && x >= 8 && x <= 12
      output[y][x] = "\e[33m#\e[0m"
    elsif y == 4 && x >= 9 && x <= 11
      output[y][x] = "\e[33m#\e[0m"
    elsif y == 5 && x >= 6 && x <= 13
      output[y][x] = "#"
    elsif y == 6 && x >= 5 && x <= 14
      output[y][x] = "#"
    elsif y == 7 && x >= 6 && x <= 13
      output[y][x] = "#"
    elsif y == 8 && x >= 4 && x <= 16
      output[y][x] = "#"
    elsif y == 9 && x >= 3 && x <= 17
      output[y][x] = "#"
    elsif y == 10 && x >= 4 && x <= 16
      output[y][x] = "#"
    else
      output[y][x] = " "
    end
  end
end

output.each { |x| puts x.join }

あなたの知らない超絶技巧プログラミングの世界を読んで

今回は以下の本を読んだ、前からこの本には興味があって非常に楽しめた。

www.amazon.co.jp

最初の方の章は著者が作成した作品が紹介されているどれも面白い作品ばかりで

ワクワクするが特に面白かったのは一文字を消しても動くqueneである。

普通のプログラムなら例えばevalのeを消すとSyntax Errorやundefinedなど

エラーが起こるがその作品は一文字消しても動くようになっている。

そのテクニックやアスキーアートにプログラムを埋め込む方法など多彩なテクニックを

紹介している。後半部分は私には結構難しかったがそれでも読むとワクワクした。

ちなみに自分でもアスキーアートFizzBuzzを埋め込むプログラムを書いたので

ぜひ見ていってほしい。

qiita.com