[5일차]
도커 + 테라폼 = 웹 취약점 진단 플랫폼 구축
#!/bin/bash
└> sh 처음 선언해줘야 할 것 쉐뱅(Shebang)이라고 불리는 특별한 구문으로, 스크립트가 어떤 해석기(interpreter)를 사용해 실행될지 지정하는 역할을 합니다.
127.0.0.1
└> 루프백(Loopback) 주소라고 하며, 자신의 컴퓨터를 가리키는 특수한 로컬 주소입니다. 이것을 localhost라고도 합니다. 예를 들어, 127.0.0.1에 접근하면 자신의 컴퓨터에서 실행 중인 서버나 애플리케이션과 통신하게 됩니다.
docker run --add-host <호스트명>:<IP주소> <이미지명>
--add-host
└> 신뢰할수 있게 지정하는 옵션 ( 컨테이너 내부의 /etc/hosts 파일에 특정 호스트 이름과 해당 IP 주소를 추가하는 역할 )
NFS(Network File System)는 네트워크를 통해 파일을 공유할 수 있게 해주는 파일 시스템입니다.
#!/bin/bash
set -e # error 발생시 중단 [ 선택사항 ]
sudo apt update
sudo apt install docker.io -y
sudo systemctl enable docker # 도커가 시스템 reboot 후에도 docker 데몬 자동 실행
sudo systemctl start docker
sudo apt install netcat # nc 설치
sudo apt install net-tools
mkdir -p /tmp/test/share
mkdir -p /tmp/test/nfsshare
mkdir -p /tmp/test/servershare
mkdir -p /tmp/test/johnshare
mkdir -p /tmp/test/bobshare
sudo chmod -R 777 /tmp/test # test 하위디렉토리 권한 모두 777 준다
echo secretpass > /tmp/test/share/password.txt
echo secretpass > /tmp/test/nfsshare/password.txt
# Docker Network Check
if ! docker network inspect local-network > /dev/null 2>&1; then # 기본으로 있는 네트워크를 치우고
docker network create local-network # 현 상황에 맞도록 로컬 네트워크 새로생성
fi
# Docker JuiceShop Install
sudo docker pull bkimminich/juice-shop # pull 이미지를 다운로드함
sudo docker run -d --restart always -p 80:3000 bkimminich/juice-shop # docker exec
# Docker DVWA Install
sudo docker pull vulnerables/web-dvwa
sudo docker run --name dvwa -d -p 81:80 --restart always --network local-network vulnerables/web-dvwa
# Docker XVWA Install
sudo docker pull bitnetsecdave/xvwa
sudo docker run --name xvwalocal -d -p 127.0.0.1:8082:80 --restart always --network local-network --add-host dvwa:127.0.0.1 bitnetsecdave/xvwa # dvwa를 통해서 xvwa에 들어가는
sudo docker run --name xvwa -d -p 82:80 --restart always bitnetsecdave/xvwa # port 식별해야지만 scan 식별이 되서 xvwa에 접속
# Docker dvga Install
sudo docker pull frost19k/dvga
sudo docker run --name dvga -d --restart always -p 84:5013 frost19k/dvga
# Docker vampi Install
sudo docker pull erev0s/vampi
sudo docker run --name vampi -d --restart always -p 85:5000 erev0s/vampi
# Docker samba Install
# -u : 이옵션은 유저를 설정해주는것임.
# -S : 표준모드로 동작, 자체적으로 인증정차 거침
# -p : 인증없이 접근 가능하게
# no;no;no;bob : 읽기쓰기설정;브라우징, 게스트접근,접근가능 사용자
sudo docker pull dperson/samba
sudo docker run --name samba -d --restart always -p 139:139 -p 445:445 -p 137:137/udp -p 138:138 -v /tmp/test/share:/share:ro -v /tmp/test/servershare:/servershare:ro -v /tmp/test/johnshare:/johnshare:ro -v /tmp/test/bobshare:/bobshare:ro dperson/samba -S -p \
-u "john;password1" \
-u "bob;password2" \
-s "public;/share" \
-s "servershare;/tmp/test/servershare;no;no;no;john,bob" \
-s "johnshare;/tmp/test/johnshare;yes;no;no;john" \
-s "bobshare;/tmp/test/bobshare;yes;no;no;bob"
# Docker Backdoored Install
sudo docker pull uexpl0it/vulnerable-packages:backdoored-vsftpd-2.3.4
sudo docker run --name vsftpd -d --restart always -p 21:21 -p 6200:6200 uexpl0it/vulnerable-packages:backdoored-vsftpd-2.3.4
# Docker SMTP-relay Install
sudo docker pull turgon37/smtp-relay
sudo docker run --name smtpd -d --restart always -p 25:25 -e "RELAY_POSTMASTER=postmaster@darkrelay.io" -e "RELAY_MYHOSTNAME=smtp-relay.darkrelay.io" -e "RELAY_MYDOMAIN=darkrelay.io" -e "RELAY_HOST=[127.0.0.1]:25" turgon37/smtp-relay
# Docker snmp Install #네트워크를 관리해주는
sudo docker pull ehazlett/snmpd:latest
sudo docker run --name snmpd -d --restart always -p 161:161/udp -p 199:199 ehazlett/snmpd:latest
# Docker NFS Server Install --privileged => 권한 부여 옵션
sudo docker pull itsthenetwork/nfs-server-alpine
sudo docker run --name nfs -d --restart always --privileged -v /tmp/test/nfsshare:/nfsshare -e SHARED_DIRECTORY=/nfsshare -p 2049:2049 itsthenetwork/nfs-server-alpine
# Docker SSL Vuln Install
sudo docker pull vulhub/openssl:1.0.1c-with-nginx
sudo docker run --name heartbleed -d -p 443:443 -p 8080:80 -v /var/www/html:/var/www/html vulhub/openssl:1.0.1c-with-nginx
sh 구문 작성 시
칼리 도커 설치
apt install docker.io -y
해서 명령어 한줄 씩 검증하며 작성 진행함
원래 TEST는 설치하고자 하는 환경에서 진행
여기서는 아마존 EC2에서 test 해야함
terraform apply --auto-approve
--auto-approve
└ 설치 할때 -y 안써도 되도록 자동화
provider "aws" {
region = "us-east-1"
access_key = "AKI*****************"
secret_key = "W5Yv***********************************"
}
# sh exec(실행)
data "template_file" "install_script" {
template = "${file("terralab.sh")}"
}
# ip check(확인) # 내 아이피만 접속 할 수 있게 하려고 -> SG add
data "http" "myip" {
url = "http://ipv4.icanhazip.com" #내가 사용하는 공인아이피 알려주는 사이트
}
# ssh connections
# ssh-keygen -q -t rsa -N '' -f ~/.ssh/terralab <<<y >/dev/null 2>&1
# resource "aws_key_pair" "terralab" {
# key_name = "lab021"
# public_key = file("~/.ssh/terralab.pub")
# }
resource "aws_vpc" "lab_vpc021" {
cidr_block = "10.0.0.0/16" # change 알맞게 변경해서 사용할 것
tags = {
Name = "lab_vpc021"
}
}
resource "aws_subnet" "lab_sub021" {
vpc_id = aws_vpc.lab_vpc021.id
cidr_block = "10.0.0.0/24" # change 알맞게 변경해서 사용할 것
availability_zone = "us-east-1a"
tags = {
Name = "lab_sub021"
}
}
resource "aws_internet_gateway" "lab_igw021" {
vpc_id = aws_vpc.lab_vpc021.id
tags = {
Name = "lab_igw021"
}
}
resource "aws_route_table" "lab_rt021" {
vpc_id = aws_vpc.lab_vpc021.id
route{
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.lab_igw021.id
}
tags = {
Name = "lab_rt021"
}
}
resource "aws_route_table_association" "lab_rta021" {
subnet_id = aws_subnet.lab_sub021.id
route_table_id = aws_route_table.lab_rt021.id
}
resource "aws_security_group" "lab_sg021" {
name_prefix = "lab_sg021"
description = "Leb Security Group Allow/Denny"
vpc_id = aws_vpc.lab_vpc021.id
# port allow 22,80,81,82,84,85,139,445,137(udp),138,21,25,161(udp),199,2049,443,8080,6200
# chomp가 data 가져오는것임 ex)150.123.110.11 >> 확장성 고려하여 변수로 넣음
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 81
to_port = 81
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 82
to_port = 82
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 84
to_port = 84
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 85
to_port = 85
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 139
to_port = 139
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 445
to_port = 445
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 137
to_port = 137
protocol = "udp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 138
to_port = 138
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 21
to_port = 21
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 25
to_port = 25
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 161
to_port = 161
protocol = "udp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 199
to_port = 199
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 2049
to_port = 2049
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 6200
to_port = 6200
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
# ping
ingress {
from_port = 0
to_port = 0
protocol = "icmp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1" # -1 = all protocol
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "lab_sg021"
}
}
resource "aws_network_interface" "lab_eni021" {
subnet_id = aws_subnet.lab_sub021.id
private_ips = ["10.0.0.50"]
security_groups = [aws_security_group.lab_sg021.id]
}
resource "aws_eip" "lab_eip021" {
domain = "vpc"
network_interface = aws_network_interface.lab_eni021.id
associate_with_private_ip = "10.0.0.50"
depends_on = [aws_instance.lab_ins021]
}
resource "aws_instance" "lab_ins021" {
ami = "ami-007855ac798b5175e" # ubuntu 24.04 버전이 높아서 안돼서 낮은 우분투 버전으로 작성함
instance_type = "t2.medium" # docker가 많이 돌아가서 사양이 micro보다 더 필요함
key_name = "lab021"
network_interface {
network_interface_id = aws_network_interface.lab_eni021.id
device_index = 0
}
user_data = "${data.template_file.install_script.rendered}" # sh를 받아올건데 rendered해서 받아오기
tags = {
Name = "lab_ins021"
}
}