labunix's blog

labunixのラボUnix

kalilinux2018.2とMetaSplotable2-LinuxをKVM上で起動する。

■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」をキー送信してシェルに落ちてコンソールを有効にする。

# systemctl enable serial-getty@ttyS0.service
# systemctl start serial-getty@ttyS0.service

■ついでに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

# update-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

# vim /etc/network/interface
# systemctl restart networking.service

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

# ip neigh | sed -e 's/\([.:]\)[0-9a-f][0-9a-f]/\1XX/g'
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

# ip route  | sed -e 's/\([.:]\)[0-9a-f][0-9a-f]/\1XX/g'
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 

■隔離用のネットワークを確認

# ip a show dev eth1 | grep inet.*192
    inet 192.168.0.4/24 brd 192.168.0.255 scope global eth1

# 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.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

# ip neigh | sed -e 's/\([.:]\)[0-9a-f][0-9a-f]/\1XX/g' | grep 192
192.XX8.0.5 dev eth1 lladdr 76:XX:XX:XX:XX:XX STALE

# ip route | grep 192
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  53 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  53 20:56 root -> ../dm-0
lrwxrwxrwx 1 root root 7  53 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>