labunix's blog

labunixのラボUnix

debian stretchのKVMホストにhostonly構成を構築してみる。

■debian stretchのKVMホストにhostonly構成を構築してみる。
 ホストのIPを使わなければならないような、NW構成による制限はないのでNAT構成は使わない。

 今回のように隔離構成を考えたときに、ホスト側でNAT構成していると、
 ゲストOSの個別の制御をしたいときに隔離がホスト単位になってしまう。

 どうしてもNATを使うのであればホストではなく仮想マシンで構成する方針とする。

 ホストオンリーからの制限はもちろん、ブリッジで同セグメントでもIPアドレスが異なると、
 デフォルトでは外部に接続出来ないFW構成なので意識はするけど隔離の手間は少ない。

$ lsb_release -d
Description:	Debian GNU/Linux 9.4 (stretch)

■今回の環境は以下のように構成することを想定。
 ネットワークは「192.168.0.0/24」に制限される点に注意。
 KVMでのhostonly構成(br1)は後述。

 余談だけど、攻撃側(Red Team)、防御側(Blue Team)は
 敵味方を区別する際に地図上に味方を青、敵を赤として表現していたことから、
 Red Team、Blue Teamと呼んでチーム分けをして訓練や演習をしていたことに由来する。

$ echo "[KVM(hostonly-br1)] <--> [Red Team(kali-2018.2)],[Blue Team(metasploitable-linux-2.0.0)]" | graph-easy
+-----------------------+      +---------------------------------------+
|   KVM(hostonly-br1)   | <--> | Blue Team(metasploitable-linux-2.0.0) |
+-----------------------+      +---------------------------------------+
  ^
  |
  |
  v
+-----------------------+
| Red Team(kali-2018.2) |
+-----------------------+

■防備側のイメージの最新版は2.0.0。
 以下URLよりダウンロード。
 VMWare用に構成されているのでKVM用に変換が必要。

 https://sourceforge.net/projects/metasploitable/

■攻撃側のイメージの最新版はkali-2018.2。
 国内にミラーは一つしかなく、29.1KB/s程度の速度しか出てないので気長に待つ。

 $ wget -c http://cdimage.kali.org/kali-2018.2/kali-linux-2018.2-amd64.iso

■防御側イメージをvmdk->qcow2(「-c」で圧縮)、vmx->xmlにそれぞれ変換する。
 やり方は以下とほぼ同じ。

 Convert VMware Virtual Machine to KVM
 http://linux-hacking-guide.blogspot.jp/2015/05/convert-vmware-virtual-machine-to-kvm.html

$ md5sum < metasploitable-linux-2.0.0.zip 
8825f2509a9b9a58ec66bd65ef83167f  -

$ unzip metasploitable-linux-2.0.0.zip 
Archive:  metasploitable-linux-2.0.0.zip
   creating: Metasploitable2-Linux/
  inflating: Metasploitable2-Linux/Metasploitable.nvram  
  inflating: Metasploitable2-Linux/Metasploitable.vmdk  
  inflating: Metasploitable2-Linux/Metasploitable.vmsd  
  inflating: Metasploitable2-Linux/Metasploitable.vmx  
  inflating: Metasploitable2-Linux/Metasploitable.vmxf  

$ sudo qemu-img convert -f vmdk Metasploitable2-Linux/Metasploitable.vmdk -c -O qcow2 Metasploitable.qcow2
$ sudo chown qemu:qemu Metasploitable.qcow2
$ python vmware2libvirt -f Metasploitable2-Linux/Metasploitable.vmx > Metasploitable.xml

■Metasploitable2は1コア、512MBメモリ、NICは2枚、8GBディスク。
 ディスクのパスはdefine前に変更する想定なのか。。。
 書式も違うみたいだし、要件さえ分かればvirt-managerで普通に作った方が良いかも。。。

$ cat Metasploitable.xml | awk '/vcpu|memory/'
  <memory>524288</memory>
  <vcpu>1</vcpu>

$ echo "$((524288/1024))MB"
512MB

$ cat Metasploitable.xml | awk 'BEGIN{f=0}{if($1=="<interface"||$1=="</interface>") \
                   {f+=1;print $0}else{if(f>0&&f<4){gsub(":[0-9A-F][0-9A-F]",":XX",$0);print $0}}}'
    <interface type='network'>
      <mac address='00:XX:XX:XX:XX:XX'/>
      <source network='default'/>
    </interface>
    <interface type='network'>
      <mac address='00:XX:XX:XX:XX:XX'/>
      <source network='default'/>
    </interface>

$ ls -lh Metasploitable.qcow2 
-rw-r--r-- 1 root root 891M  52 23:16 Metasploitable.qcow2

$ sudo qemu-img info Metasploitable.qcow2 
image: Metasploitable.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 886M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

$ cat Metasploitable.xml | awk 'BEGIN{f=0}{if($1=="<disk"||$1=="</disk>") \
                   {f+=1;print $0}else{if(f==1){print $0}}}'
    <disk type='file' device='disk'>
      <source file='/home/labunix/Metasploitable2-Linux/Metasploitable.vmdk'/>
      <target dev='hda' />
    </disk>

■KVMホストのデフォルトのNAT構成
 ゲストOSに何も指定せずに起動するとDHCPで割り当てられたIPアドレスが振られる。
 以下ノ場合、ホスト側(virbr0)「192.168.122.1」を介して通信する
 「192.168.122.0/24」が仮想マシンに割り当てられる。

$ virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              inactive   no            yes

$ virsh net-dumpxml --inactive default
<network>
  <name>default</name>
  <uuid>2a89061f-7fc5-4254-bc9b-a7787f15691f</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:a3:3e:e6'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

$ find /etc/libvirt/qemu/networks/ -type f -exec ls -l {} \;
-rw------- 1 root root 576  318 00:24 /etc/libvirt/qemu/networks/default.xml

■KVMホストの外部ネットワークとしてxmlを使わずに、
 ブリッジ(tap0は常に準備)、L3ルーティングする(gateway有)設定が以下。

$ grep -A 20 "iface br" /etc/network/interfaces | \
    awk '!/dns/{gsub(".[01346-9][0-46-9]",".XX",$0);print $0}'
iface br0 inet static
	address.XX2.XX.XX.XX
	netmask 255.255.255.0
	network.XX2.XX.XX.0
	broadcast.XX2.XX.XX.255
	gateway.XX2.XX.XX.252
	bridge-ports all tap0 enp2s0
	bridge_stp off
	bridge_maxwait 0
	bridge_fd      0
	pre-up ip tuntap add dev tap0 mode tap user labunix
	pre-up ip link set tap0 up
	post-down ip link set tap0 down
	post-down ip tuntap del dev tap0 mode tap

■KVMホストのhostonlyネットワークとしてxmlを使わずに、
 ブリッジ、L3ルーティングしない(gateway無)設定が以下。
 物理インターフェイスを割り当てない。「bridge_ports none」
 Metasploitable2の要件に合った「192.168.0.0/24」で被らないIPを指定。
 ※当然Metasploit2側のNWを変える方式もあるけど、今回はホスト側で対処。

$ sudo tail -12 /etc/network/interfaces
# The private bridge
auto br1
iface br1 inet static
	address 192.168.0.5
	netmask 255.255.255.0
	network 192.168.0.0
	broadcast 192.168.0.255
	bridge_ports none
	bridge_stp off
	bridge_fd 0
	bridge_maxwait 0

$ sudo ifup br1

$ sudo brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.6c626daf876c	no		enp2s0
							tap0
							vnet0
							vnet1
br1		8000.000000000000	no		

■ネットワークインターフェイスを付け替える。

$ virsh domiflist kvm-stretch | awk '/vnet1/{print $NF}' | \
    virsh detach-interface --domain kvm-stretch --type bridge --mac `xargs`
Interface detached successfully

$ virsh attach-interface --type bridge --source br1 --model virtio kvm-stretch
Interface attached successfully

$ virsh domiflist kvm-stretch | sed -e 's/[0-9a-f][0-9a-f]:/XX:/g' -e 's/ XX:XX:XX:/ 52:54:00:/'
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:XX:XX:1f
vnet1      bridge     br1        virtio      52:54:00:XX:XX:5a

$ virsh console kvm-stretch

$ sudo ip a add 192.168.0.4/24 dev ens9
$ ping -c 3 192.168.0.5
PING 192.168.0.5 (192.168.0.5) 56(84) bytes of data.
64 bytes from 192.168.0.5: icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from 192.168.0.5: icmp_seq=2 ttl=64 time=0.132 ms
64 bytes from 192.168.0.5: icmp_seq=3 ttl=64 time=0.301 ms

--- 192.168.0.5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2045ms
rtt min/avg/max/mdev = 0.127/0.186/0.301/0.082 ms