# 22 - SSH/SFTP 펜테스팅
htARTE (HackTricks AWS Red Team Expert)에서 **제로부터 영웅이 될 때까지 AWS 해킹 배우기**! 다른 방법으로 HackTricks를 지원하는 방법: * **회사를 HackTricks에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나**트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. * **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
**버그 바운티 팁**: **해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼**인 **Intigriti에 가입**하세요! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks)에서 참여하여 **최대 $100,000**의 바운티를 받으세요! {% embed url="https://go.intigriti.com/hacktricks" %} ## 기본 정보 **SSH (Secure Shell 또는 Secure Socket Shell)**는 안전하지 않은 네트워크를 통해 컴퓨터에 안전한 연결을 가능케 하는 네트워크 프로토콜입니다. 원격 시스템에 접근할 때 데이터의 기밀성과 무결성을 유지하는 데 필수적입니다. **기본 포트:** 22 ``` 22/tcp open ssh syn-ack ``` **SSH 서버:** * [openSSH](http://www.openssh.org) – OpenBSD SSH, BSD, Linux 배포 및 Windows에서 Windows 10부터 제공됨 * [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – 낮은 메모리 및 프로세서 자원 환경을 위한 SSH 구현, OpenWrt에 포함 * [PuTTY](https://www.chiark.greenend.org.uk/\~sgtatham/putty/) – Windows용 SSH 구현, 클라이언트는 일반적으로 사용되지만 서버 사용은 드물다 * [CopSSH](https://www.itefix.net/copssh) – Windows용 OpenSSH 구현 **SSH 라이브러리 (서버 측 구현):** * [libssh](https://www.libssh.org) – SSHv2 프로토콜을 구현하는 멀티플랫폼 C 라이브러리로, [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/), [R](https://github.com/ropensci/ssh)에서 바인딩을 제공; KDE에서 sftp에 사용되며 GitHub에서 git SSH 인프라에 사용됨 * [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI C로 작성된 SSHv2 서버 라이브러리로, 임베디드, RTOS 및 자원 제한 환경을 대상으로 함 * [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD java 라이브러리는 Apache MINA에 기반함 * [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2 프로토콜 라이브러리 ## 열거 ### 배너 그랩핑 ```bash nc -vn 22 ``` ### 자동화된 ssh-audit ssh-audit는 ssh 서버 및 클라이언트 구성 감사를 위한 도구입니다. [https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit)는 [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)에서 업데이트된 포크입니다. **기능:** * SSH1 및 SSH2 프로토콜 서버 지원; * SSH 클라이언트 구성 분석; * 배너 가져오기, 장치 또는 소프트웨어 및 운영 체제 인식, 압축 감지; * 키 교환, 호스트 키, 암호화 및 메시지 인증 코드 알고리즘 수집; * 알고리즘 정보 출력 (사용 가능한 시기, 제거/비활성화, 불안전한/약한/레거시 등); * 알고리즘 권장 사항 출력 (인식된 소프트웨어 버전에 따라 추가 또는 제거); * 보안 정보 출력 (관련 문제, 할당된 CVE 목록 등); * 알고리즘 정보를 기반으로 한 SSH 버전 호환성 분석; * OpenSSH, Dropbear SSH 및 libssh의 역사적 정보; * Linux 및 Windows에서 실행; * 의존성 없음 ```bash usage: ssh-audit.py [-1246pbcnjvlt] -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 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= minimum output level (info|warn|fail) -t, --timeout= timeout (in seconds) for connection and reading (default: 5) $ python3 ssh-audit ``` ### 서버의 공개 SSH 키 ```bash ssh-keyscan -t rsa -p ``` ### 취약한 암호 알고리즘 이는 기본적으로 **nmap**에 의해 발견됩니다. 그러나 **sslcan** 또는 **sslyze**를 사용할 수도 있습니다. ### Nmap 스크립트 ```bash nmap -p22 -sC # Send default nmap scripts for SSH nmap -p22 -sV # Retrieve version nmap -p22 --script ssh2-enum-algos # Retrieve supported algorythms nmap -p22 --script ssh-hostkey --script-args ssh_hostkey=full # Retrieve weak keys nmap -p22 --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 ``` ### [무차별 대입 공격](../generic-methodologies-and-resources/brute-force.md#ssh) [여기](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt)와 [여기](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt)에서 일반적인 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](https://github.com/snowdroppe/ssh-keybrute). #### 알려진 나쁜 키는 여기에서 찾을 수 있습니다: {% embed url="https://github.com/rapid7/ssh-badkeys/tree/master/authorized" %} #### 약한 SSH 키 / Debian 예측 가능한 PRNG 일부 시스템에는 암호화 자료를 생성하는 데 사용된 난수 시드에 알려진 결함이 있습니다. 이는 브루트포스로 해독될 수 있는 키 공간이 크게 줄어들 수 있습니다. 약한 PRNG에 영향을 받는 Debian 시스템에서 생성된 미리 생성된 키 세트는 여기에서 사용할 수 있습니다: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh). 피해자 머신에 대한 유효한 키를 검색하려면 여기를 참조해야 합니다. ### 케르버로스 **crackmapexec**은 `ssh` 프로토콜을 사용하여 **케르버로스를 통해 인증**할 수 있습니다.\ 자세한 정보는 `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**](https://github.com/jtesta/ssh-mitm)은 위에서 설명한 대로 작동합니다. 실제 MitM을 수행하려면 ARP 스푸핑, DNS 스푸핑 또는 [**네트워크 스푸핑 공격**](../generic-methodologies-and-resources/pentesting-network/#spoofing)에서 설명된 기타 기술을 사용할 수 있습니다. ## SSH-Snake 시스템에서 발견된 SSH 개인 키를 사용하여 각 시스템에서 새 호스트에 대해 각 개인 키를 활용하여 네트워크를 탐색하려면 [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake)가 필요합니다. SSH-Snake는 다음 작업을 자동으로 반복합니다: 1. 현재 시스템에서 SSH 개인 키를 찾습니다. 2. 현재 시스템에서 발견된 개인 키가 수락될 수 있는 모든 호스트 또는 대상 (사용자@호스트)를 찾습니다. 3. 발견된 모든 개인 키를 사용하여 모든 대상에 SSH를 시도합니다. 4. 대상에 성공적으로 연결된 경우, 연결된 시스템에서 단계 #1 - #4를 반복합니다. 이는 완전히 자체 복제 및 자체 전파되며 완전히 파일이 없습니다. ## 구성 오류 ### 루트 로그인 SSH 서버가 기본적으로 루트 사용자 로그인을 허용하는 것은 일반적이며 중요한 보안 위험을 야기합니다. **루트 로그인 비활성화**는 서버를 보호하는 중요한 단계입니다. 이 변경 사항을 통해 관리 권한이 없는 액세스 및 브루트포스 공격을 완화할 수 있습니다. **OpenSSH에서 루트 로그인 비활성화 방법:** 1. `sudoedit /etc/ssh/sshd_config`로 **SSH 구성 파일을 편집**합니다. 2. `#PermitRootLogin yes`에서 **`PermitRootLogin no`**로 설정을 **변경**합니다. 3. `sudo systemctl daemon-reload`를 사용하여 **구성을 다시로드**합니다. 4. 변경 사항을 적용하려면 SSH 서버를 **다시 시작**합니다: `sudo systemctl restart sshd` ### SFTP 브루트 포스 * [**SFTP 브루트 포스**](../generic-methodologies-and-resources/brute-force.md#sftp) ### SFTP 명령 실행 SFTP 설정에서 흔히 발생하는 실수는 사용자에게 원격 셸 액세스를 활성화하지 않고 파일을 교환할 수 있도록 하는 것을 의도하는 관리자들이 있음에도 불구하고, 비대화식 셸 (예: `/usr/bin/nologin`)로 사용자를 설정하고 특정 디렉토리로 제한하는 것입니다. 보안 구멍이 남아 있습니다. **사용자는 로그인 직후에 지정된 비대화식 셸이 작동하기 전에 (/bin/bash와 같은) 명령을 실행하도록 요청함으로써** 이러한 제한을 우회할 수 있습니다. 이는 무단 명령 실행을 허용하여 의도한 보안 조치를 약화시킵니다. [여기에서 예제](https://community.turgensec.com/ssh-hacking-guide/) ```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 서버에 액세스할 수 있다면 일반적인 포트 포워딩을 사용하여 트래픽을 터널링할 수도 있습니다. ```bash sudo ssh -L :: -N -f @ ``` ### SFTP 심볼릭 링크 **sftp**에는 "**symlink**" 명령이 있습니다. 따라서 특정 폴더에서 **쓰기 권한**이 있다면 **다른 폴더/파일의 심볼릭 링크**를 생성할 수 있습니다. 아마도 chroot 안에 **갇혀** 있기 때문에 이것은 특별히 **유용하지 않을 것**입니다. 그러나 생성된 **심볼릭 링크**에 **no-chroot 서비스**(예: 웹에서 심볼릭 링크에 액세스할 수 있는 경우)에서 액세스할 수 있다면 **웹을 통해 심볼릭 링크된 파일을 열 수 있습니다**. 예를 들어, 새 파일 **"**_**froot**_**"**에서 **"**_**/**_**"**로 **심볼릭 링크**를 생성하려면: ```bash sftp> symlink / froot ``` ### 인증 방법 고안전 환경에서는 간단한 패스워드 기반 인증보다는 키 기반 또는 이중 인증을 활성화하는 것이 일반적입니다. 그러나 종종 강력한 인증 방법을 활성화한 채로 약한 인증 방법을 비활성화하지 않는 경우가 있습니다. 자주 발생하는 경우는 openSSH 구성에서 `publickey`를 활성화하고 기본 방법으로 설정하지만 `password`를 비활성화하지 않는 것입니다. 따라서 SSH 클라이언트의 상세 모드를 사용하여 공격자는 약한 방법이 활성화되어 있는 것을 확인할 수 있습니다: ```bash 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` 옵션을 사용하여 이 방법을 강제로 사용할 수 있습니다. ```bash ssh -v 192.168.1.94 -o PreferredAuthentications=password ... debug1: Next authentication method: password ``` ### 구성 파일 SSH 서버 구성을 검토하여 예상된 메소드만 허용되는지 확인하는 것이 필요합니다. 클라이언트에서 verbose 모드를 사용하면 구성의 효과를 확인하는 데 도움이 됩니다. ```bash ssh_config sshd_config authorized_keys ssh_known_hosts known_hosts id_rsa ``` ## Fuzzing * [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt) * [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh\_version\_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh\_version\_2) ## 참고 자료 * [https://www.ssh-audit.com/hardening\_guides.html](https://www.ssh-audit.com/hardening\_guides.html) * [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide)
**버그 바운티 팁**: **Intigriti**에 가입하여 **해커들에 의해 만들어진 프리미엄 버그 바운티 플랫폼**에 가입하세요! 오늘 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) 에서 함께 하고 최대 **$100,000**의 바운티를 받아보세요! {% embed url="https://go.intigriti.com/hacktricks" %} ## 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를 지원하는 방법: * **회사가 HackTricks에서 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요. * **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.