Наверняка многие знают, что с docker socket можно достаточно легко взаимодействовать при помощи curl, даже когда в контейнере нет подходящих инструментов или возможности докачать их извне:
$ curl -s --unix-socket /var/run/docker.sock http:/containers/json
Но также легко это делать, если мы имеем дело с containerd socket ?
Для начала мы можем докачать или воспользоваться имеющимся инструментами типа ctr или crictl:
$ sudo ctr --address /var/run/containerd/containerd.sock -n k8s.io containers list
CONTAINER IMAGE RUNTIME
01a91532d97f8f7162c477dd1e402520d313e9c4333827d74a93cde25dddc1cc registry.k8s.io/pause:3.6 io.containerd.runc.v2
05536e2ec91d018cdb4edac21ab613b22f0755721e082c99f81b87516bce60ec registry.k8s.io/pause:3.6 io.containerd.runc.v2
0894b4942001821ad9c36949ae7c15fc2dd9b54bf6e5d531b6e5b03e6f5e313c docker.io/calico/cni:v3.25.0 io.containerd.runc.v2
Если их нет, то можно также отправить запрос с помощью curl, правда это будет несколько сложнее:
$ echo -ne "\x00\x00\x00\x00\x00" | sudo curl -v -s --http2-prior-knowledge --unix-socket /run/containerd/containerd.sock -X POST -H "content-type: application/grpc" -H "te: trailers" -H "grpc-accept-encoding: gzip" http://localhost/containerd.services.version.v1.Version/Version --data-binary @- --output /tmp/versionresponse.bin
* Trying /run/containerd/containerd.sock:0...
* Connected to localhost (/run/containerd/containerd.sock) port 80 (#0)
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55c22b6bdec0)
> POST /containerd.services.version.v1.Version/Version HTTP/2
> Host: localhost
> user-agent: curl/7.81.0
> accept: */*
> content-type: application/grpc
> te: trailers
> grpc-accept-encoding: gzip
> content-length: 5
>
} [5 bytes data]
* We are completely uploaded and fine
* Connection state changed (MAX_CONCURRENT_STREAMS == 4294967295)!
< HTTP/2 200
< content-type: application/grpc
<
{ [55 bytes data]
< grpc-status: 0
< grpc-message:
* Connection #0 to host localhost left intact
Об этом и не только Stephen Bradshaw рассказал в своём блоге, в одноименных заметках containerd socket exploitation в трёх частях (
1,
2,
3).