Ruroco - "RUn RemOte Command" UDP를 이용한 원격 명령 호출
(github.com/beac0n)- 서버에 UDP 패킷을 보내서 명령을 실행하는 도구
- 명령은 서버 측에서 구성되므로 클라이언트는 실행할 명령을 정의하지 않고 기존 명령 중에서 선택만 함
- 3개의 바이너리로 구성
- client: 컴퓨터에서 실행되어 UDP 패킷을 전송
- server: UDP 패킷을 수신하고 유효한지 확인
- commander: UDP 패킷의 데이터로 인코딩된 명령이 유효한 경우 실행
- 보안
- UDP로 보내지기 때문에 서버는 전혀 응답하지 않음 : 포트 스캐닝 불가
- 클라이언트에서 서버로 전송되는 데이터는 RSA를 사용하여 암호화
- 클라이언트는 실행할 명령만 정의하고 명령은 서버에 저장 -> 클라이언트는 명령을 선택할 수는 있지만 정의할 수는 없음
- 가능한 한 적은 운영 체제 권한을 사용하도록 서버 소프트웨어를 실행
- 서버가 수신한 모든 패킷을 차단 목록에 추가하여 replay에서 보호
- (WIP) DoS 보호
사용 예 : single packet authorization (SPA)
서버의 보안을 위해서 SSH를 완전히 차단하는 대신, SSH포트를 짧게 열었다 다시 닫는 방식을 도입 가능
address = "0.0.0.0:8080" # Ruroco 서버가 수신 대기하는 주소 (systemd/ruroco.socket 사용하지 않는 경우)
config_dir = "/etc/ruroco/" # 설정 파일이 저장되는 경로
[commands]
# SSH 열기 (요청이 온 IP 주소에 대해서만)
open_ssh = "ufw allow from $RUROCO_IP proto tcp to any port 22"
# SSH 닫기 (요청이 온 IP 주소에 대해서만)
close_ssh = "ufw delete allow from $RUROCO_IP proto tcp to any port 22"
- 서버에서 이렇게 Ruroco를 구성하고 클라이언트 측에서 다음 명령을 실행
ruroco-client send --address host.domain:8080 --private-pem-path /path/to/ruroco_private.pem --command open_ssh --deadline 5
- 서버는 RSA를 사용하여 클라이언트가 해당 명령을 실행할 수 있는 권한이 있는지 확인하고 "open_ssh" 아래에 정의된 명령을 실행
-
--deadline
인수는 명령 실행 후 5초 이내에 서버에서 명령을 시작해야 함을 의미 - SSH 포트에 대한 액세스를 UDP 패킷이 전송된 IP에 대해서만 허용
- 물론 SSH 포트가 인터넷에 노출되는 경우와 마찬가지로 다른 모든 보안 강화 작업도 수행해야 함
- 설정 파일에 더 많은 명령을 추가하여 원하는 수의 명령을 정의할 수 있음