■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 5月 2 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 3月 18 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
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