P0pR0cK5's Blog

Pentest, Challenges, Tests and more ...

View on GitHub

Déployer un environnement jetable avec un conteneur LXC

Retour

head

Il m’arrive souvent, par manque de temps, de lancer des tests sur ma machine. Ces tests finissent par rendre mon système instable au fil du temps.

De plus, les CTF et autres challenges sont souvent particuliers, il est donc parfois intérèssant d’avoir un environnement jetable qui puisse être remonté rapidement.

Bien entendus une VM aurait fait l’affaire mais elle inclut un plus grand overhead.

Installation de LXC

Sur Debian, voici ce que j’ai installé :

sudo apt-get install lxc lxctl lxc-templates bridge-utils

Déploiement de notre conteneur

Ici mon conteneur se nomme debian

On commence par lister les templates disponibles :

ls /usr/share/lxc/templates                 
lxc-alpine     lxc-centos    lxc-fedora        lxc-oracle      lxc-sshd
lxc-altlinux   lxc-cirros    lxc-gentoo        lxc-plamo       lxc-ubuntu
lxc-archlinux  lxc-debian    lxc-openmandriva  lxc-slackware   lxc-ubuntu-cloud
lxc-busybox    lxc-download  lxc-opensuse      lxc-sparclinux

Dans mon cas, je pars sur un debian :

lxc-create -n deb -t debian

-n représente le nom du conteneur

-t représente le template choisis

L’initialisation peu prendre un peut de temps, patientez et prenez un café.

On va maintenant lancer notre conteneur :

sudo lxc-start -n debian 
lxc-start: tools/lxc_start.c: main: 366 The container failed to start.
lxc-start: tools/lxc_start.c: main: 368 To get more details, run the container in foreground mode.
lxc-start: tools/lxc_start.c: main: 370 Additional information can be obtained by setting the --logfile and --logpriority options.

Oups ! une erreur s’est produite. Cette erreur provient du fait que l’interface réseau spécifié par notre fichier de configuration est mauvaise.

Mon fix consiste a me brancher sur le bridge par défaut créé par virt-manager :

sudo vi /var/lib/lxc/debian/config
# Modifier la ligne suivante : 
lxc.network.link = br0
# avec cette ligne : 
lxc.network.link = virbr0

Puis relancer le conteneur.

Autres possibilités:

Décommentez la ligne suivent dans /etc/sysctl.conf:

# Décommentez la prochaine ligne pour activer le "packet forwarding" pour IPv4
net.ipv4.ip_forward=1

Insérez les lignes suivantes dans /etc/network/interfaces :

auto lxc-bridge-nat
iface lxc-bridge-nat inet static
        bridge_ports none
        bridge_fd 0
        bridge_maxwait 0
        address 192.168.100.1
        netmask 255.255.255.0
        up iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Enfin on modifie le fichier de configuration en conséquence :

sudo vi /var/lib/lxc/debian/config
# Modifier la ligne suivante : 
lxc.network.link = br0
# avec cette ligne : 
lxc.network.link = lxc-bridge-nat

On vient ici de créer un bridge puis un NAT, ce dernier va nous permettre d’accéder a internet depuis le conteneur.

On se lance !

Voici un workflow classique sur LXC :

# On liste les conteneurs
sudo lxc-ls
# On lance notre LXC 
sudo lxc-start -n debian
# On attache un prompt au LXC 
sudo lxc-attach -n debian
# Une fois finis, on coupe le conteneur
sudo lxc-stop -n debian
# Si on le souhaite on le supprime 
sudo lxc-destroy debian

Limitation des ressources allouées au conteneur

On va éditer notre fichier de configuration (/var/lib/lxc/debian/config) et on y ajoute ces lignes en fin de fichier :

lxc.cgroup.memory.limit_in_bytes = 250M
lxc.cgroup.cpuset.cpus = 0

Ici on assigne le CPU numéro 0 au conteneur et enfin on limite la ram alloué a 250 Mb.

On vérifie :

# nombre de cpu du conteneur  
root@debian:/> cat /proc/cpuinfo | grep "processor" | wc -l
1
# Ram alloué 
root@debian:/> free -h
              total        used        free      shared  buff/cache   available
Mem:           250M        5.9M        236M        171M        8.1M        236M
Swap:          8.0G          0B        8.0G

Comme on le voit, ici on a bien la limitation souhaitée.

Exemple de configuration type :

# Networking 
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = 00:FF:AA:00:00:01
lxc.network.ipv4 = 192.168.122.110/24
lxc.network.ipv4.gateway = 192.168.122.1

#RootFS
lxc.rootfs = /var/lib/lxc/debi/rootfs
lxc.rootfs.backend = dir

# Limitation of the host ressource usage
lxc.cgroup.memory.limit_in_bytes = 250M
lxc.cgroup.cpuset.cpus = 0

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.tty = 4
lxc.utsname = debi
lxc.arch = amd64

Edit du 17/10/2019

Il semble que sur les derniéres versions de Ubuntu la signature GPG des templates fonctionne mal. Il existe néanmoins une solution vraiment pratique car elle télécharge directement une image suivant vos besoins :

jugu@WORKSTATION:~$ sudo lxc-create -n zetta_pgsql -t download
Setting up the GPG keyring
Downloading the image index

---
DIST	RELEASE	ARCH	VARIANT	BUILD
---
debian	bullseye	s390x	default	20191017_05:24
debian	buster	amd64	default	20191017_05:24
debian	buster	arm64	default	20191017_06:13
debian	buster	armel	default	20191017_05:40
debian	buster	armhf	default	20191017_05:24
debian	buster	i386	default	20191017_05:24
funtoo	1.3	i386	default	20191017_16:45
gentoo	current	amd64	default	20191017_16:07
gentoo	current	armhf	default	20191017_16:07
gentoo	current	i386	default	20191017_16:07

---

Distribution:
debian
Release:
buster
Architecture:
amd64

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a Debian buster amd64 (20191017_05:24) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.

L’option download permet de choisir depuis une liste d’images ce qui offre un grand choix de distribution/architectures.

Note: Cela me donne envie de tester un conteneur Kali !

Conclusion

On à vue ici qu’il etait possible de créer un conteneur rapidement et que cette technique est parfois plus adapté qu’une machine virtuelle dans le cadre de CTF.

Pour ma part, cette technique fait désormais partie de ma boite à outils spécifiques aux CTF.


Written on December 4, 2017 by


Retour