■kalilinux2018.2とMetaSplotable2-LinuxをKVM上で起動する。
$ lsb_release -d
Description: Debian GNU/Linux 9.4 (stretch)
■攻撃側のイメージの最新版はkali-2018.2。
CPU1コア、メモリ1GB、ディスク20GB、br0、br1に接続する構成。
カスタマイズとしてインストール時のみCPUの最大値2、メモリ最大値2GBをカレントとするように、
インストールモードで起動
$ wget -c http://cdimage.kali.org/kali-2018.2/kali-linux-2018.2-amd64.iso
$ sudo mv kali-linux-2018.2-amd64.iso /var/lib/libvirt/images/
$ sudo chown libvirt-qemu:libvirt /var/lib/libvirt/images/kali-linux-2018.2-amd64.iso
$ virsh list | grep kali
7 kali2018-2 running
■インストール後に一度「Ctrl+Alt+F2」をキー送信してシェルに落ちてコンソールを有効にする。
■ついでにgrubからコンソールが使えるように設定を変える。
echo '
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"' | sudo tee -a /etc/default/grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-kali2-amd64
Found initrd image: /boot/initrd.img-4.15.0-kali2-amd64
done
■後はホストからコンソール接続して「networking」経由で操作する。
アップデート用のネットワークの確認
GUIからの変更に邪魔されていないか再起動して確認した方が良い。
5.1. Configuring the Network
https://kali.training/topic/configuring-the-network/
$ virsh console kali2018-2
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:XX:XX:XX:XX:XX brd ff:XX:XX:XX:XX:XX
inet 172.XX.XX.XX/24 brd 172.XX.XX.XX5 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::XX54:XX:XXe7:XXd1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
172.XX.XX.XX dev eth0 lladdr 6c:XX:XX:XX:XX:XX REACHABLE
172.XX.XX.XX1 dev eth0 lladdr 00:XX:XX:XX:XX:XX STALE
default via 172.XX.XX.XX2 dev eth0 proto static metric 100
172.XX.XX.0/24 dev eth0 proto kernel scope link src 172.XX.XX.XX metric 100
■隔離用のネットワークを確認
inet 192.168.0.4/24 brd 192.168.0.255 scope global eth1
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.147 ms
64 bytes from 192.168.0.5: icmp_seq=2 ttl=64 time=0.225 ms
64 bytes from 192.168.0.5: icmp_seq=3 ttl=64 time=0.251 ms
--- 192.168.0.5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.147/0.207/0.251/0.047 ms
192.XX8.0.5 dev eth1 lladdr 76:XX:XX:XX:XX:XX STALE
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.4
■今回の環境は以下のように構成することを想定。
ネットワークは「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。
https://sourceforge.net/projects/metasploitable/
■防御側イメージをvmdk->qcow2(「-c」で圧縮)、vmx->xmlは新規作成
$ 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.img
$ sudo mv Metasploitable.img /var/lib/libvirt/images/
$ sudo chown libvirt-qemu:libvirt-qemu /var/lib/libvirt/images/Metasploitable.img
■Metasploitable2は1コア、512MBメモリ、NICは2枚(->1枚)、8GBディスク。
virt-managerで「既存のディスクをインポート」。
$ sudo ls -lh /var/lib/libvirt/images/Metasploitable.img
-rw-r--r-- 1 libvirt-qemu libvirt-qemu 906M 5月 3 18:23 /var/lib/libvirt/images/Metasploitable.img
$ sudo qemu-img info /var/lib/libvirt/images/Metasploitable.img
image: /var/lib/libvirt/images/Metasploitable.img
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 906M
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
■Metasploitable2-Linuxの構成を確認
xml作成の際、ネットワークドライバはvirtioやe1000ではなく、「rtl8139」を指定する点に注意。
$ virsh list --all | grep Meta
14 Metasploitable2-Linux running
$ virsh dumpxml 14 | awk '/vcpu/'
<vcpu placement='static'>1</vcpu>
$ virsh dominfo 14 | awk '/CPU/'
CPU(s): 1
CPU time: 35.9s
$ virsh dumpxml 14 | awk '/memory unit/'
<memory unit='KiB'>524288</memory>
$ echo $((524288/1024))"MB"
512MB
$ virsh dominfo 14 | awk '/mem/'
Max memory: 524288 KiB
Used memory: 524288 KiB
$ ssh Metasploitable2-Linux
$ ip a show dev eth0 | sed -e 's/\([.:]\)[0-9a-f][0-9a-f]/\1XX/g'
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:XX:XX:XX:XX:XX brd ff:XX:XX:XX:XX:XX
inet 192.XX8.0.2/24 scope global eth0
inet6 fe80::XXc:XXff:XXfa:XX34/64 scope link
valid_lft forever preferred_lft forever
$ ip neigh | sed -e 's/\([.:]\)[0-9a-f][0-9a-f]/\1XX/g'
192.XX8.0.5 dev eth0 lladdr 76:XX:XX:XX:XX:XX REACHABLE
$ ip route | sed -e 's/\([.:]\)[0-9a-f][0-9a-f]/\1XX/g'
192.XX8.0.0/24 dev eth0 proto kernel scope link src 192.XX8.0.2
$ 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.301 ms
64 bytes from 192.168.0.5: icmp_seq=2 ttl=64 time=0.357 ms
64 bytes from 192.168.0.5: icmp_seq=3 ttl=64 time=0.356 ms
--- 192.168.0.5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.301/0.338/0.357/0.026 ms
■ネットワーク構成の確認
$ virsh domiflist kvm-stretch | grep br1 | sed -e 's/\(52:54:00:\)[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]/\1XX:XX/'
vnet1 bridge br1 virtio 52:54:00:XX:XX:5a
$ virsh domiflist kali2018-2 | grep br1 | sed -e 's/\(52:54:00:\)[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]/\1XX:XX/'
vnet3 bridge br1 virtio 52:54:00:XX:XX:f4
$ virsh domiflist Metasploitable2-Linux | grep br1 | sed -e 's/\(52:54:00:\)[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]/\1XX:XX/'
vnet4 bridge br1 rtl8139 00:0c:29:fa:dd:34
$ ip a show dev br1 | grep inet.*192
inet 192.168.0.5/24 brd 192.168.0.255 scope global br1
■br0とbr1にまたがるインターフェイスを持つ仮想マシンの、
更新を停止して隔離を行う時にはデタッチする。
$ echo -e "kvm-stretch;1\nkali2018-2;0" | \
awk -F';' '{print "virsh domiflist "$1" | awk \047/br"$2"/{print $NF}\047 | \
virsh detach-interface --domain "$1" --type bridge --mac `xargs`"}' | sudo sh
■br0とbr1にまたがるインターフェイスを持つ仮想マシンの、
更新を再開して隔離を解除する時にはアタッチする。
$ echo -e "kvm-stretch;1\nkali2018-2;0" | \
awk -F';' '{print "virsh attach-interface --type bridge --source br"$2" --model virtio "$1}' | sudo sh
■おまけ1
vmdk->qcow2変換後、qcow2をマウントしてsda->vdaを編集しようと思ったが不要だった。。。
$ sudo modprobe nbd max_part=63
$ lsmod | grep nbd
nbd 20480 0
$ sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/Metasploitable.img
$ sudo dmesg | grep nbd
[190108.902698] nbd: registered device at major 43
$ sudo qemu-nbd --disconnect /dev/nbd0
$ sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/Metasploitable.img
$ sudo dmesg | grep nbd
[190108.902698] nbd: registered device at major 43
[190462.217987] block nbd0: NBD_DISCONNECT
[190462.218010] block nbd0: shutting down socket
[190462.218096] block nbd0: Receive control failed (result -32)
[190482.395815] nbd0: p1 p2 < p5 >
$ sudo fdisk -l /dev/nbd0
Disk /dev/nbd0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc3a20c42
Device Boot Start End Sectors Size Id Type
/dev/nbd0p1 63 481949 481887 235.3M 83 Linux
/dev/nbd0p2 481950 16771859 16289910 7.8G 5 Extended
/dev/nbd0p5 482013 16771859 16289847 7.8G 8e Linux LVM
$ sudo mkdir /media/qcow2
$ sudo mount /dev/nbd0p1 /media/qcow2/
$ ls /media/qcow2/
System.map-2.6.24-16-server config-2.6.24-16-server initrd.img-2.6.24-16-server lost+found vmlinuz-2.6.24-16-server
abi-2.6.24-16-server grub initrd.img-2.6.24-16-server.bak memtest86+.bin
$ sudo umount /media/qcow2/
$ sudo vgscan
Reading volume groups from cache.
Found volume group "metasploitable" using metadata type lvm2
$ sudo vgchange -ay
2 logical volume(s) in volume group "metasploitable" now active
$ ls -l /dev/metasploitable/
合計 0
lrwxrwxrwx 1 root root 7 5月 3 20:56 root -> ../dm-0
lrwxrwxrwx 1 root root 7 5月 3 20:56 swap_1 -> ../dm-1
$ sudo mount /dev/metasploitable/root /media/qcow2/
$ sudo grep vd /media/qcow2/etc/fstab
/dev/vda1 /boot ext3 relatime 0 2
$ sudo umount /media/qcow2
$ sudo qemu-nbd --disconnect /dev/nbd0
/dev/nbd0 disconnected
$ sudo dmesg | grep nbd | tail -3
[191233.744564] block nbd0: NBD_DISCONNECT
[191233.744587] block nbd0: shutting down socket
[191233.744684] block nbd0: Receive control failed (result -32)
$ sudo vgscan
Reading volume groups from cache.
$ sudo modprobe -r nbd
$ lsmod | grep nbd
$ ls -l /dev/nbd*
ls: '/dev/nbd*' にアクセスできません: そのようなファイルやディレクトリはありません
■KVMで動作した「Metasploitable2-Linux.xml」
virtioやe1000ではなく「rtl8139」を指定する必要があった。
$ virsh dumpxml Metasploitable2-Linux | awk '!/mac address|uuid|target dev/'
<domain type='kvm' id='14'>
<name>Metasploitable2-Linux</name>
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
<vcpu placement='static'>1</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='i686' machine='pc-i440fx-2.8'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/Metasploitable.img'/>
<backingStore/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='piix3-uhci'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='bridge'>
<source bridge='br1'/>
<model type='rtl8139'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</interface>
<input type='mouse' bus='ps2'>
<alias name='input0'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input1'/>
</input>
<graphics type='vnc' port='5902' autoport='yes' listen='127.0.0.1'>
<listen type='address' address='127.0.0.1'/>
</graphics>
<video>
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</memballoon>
</devices>
<seclabel type='none' model='none'/>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+64055:+64055</label>
<imagelabel>+64055:+64055</imagelabel>
</seclabel>
</domain>