ãã®ããã°ã¯ã¢ã«ãã¤ãã®seigo2016ãæ¸ãã¦ãã¾ãã ãããããã¶ããã®å 容ã¯åäººã®æè¦ã§ãã
æ¤è¨¼ã«ã¯èªèº«ã§ç®¡çããç°å¢ã使ç¨ããèªå·±è²¬ä»»ã§ãé¡ããã¾ããã¾ãããã®æ å ±ãæªç¨ãããã¨ã¯çµ¶å¯¾ã«è¡ããªãã§ãã ããã
1. ã¯ããã«
ä»åã¯ãrunZeroãå ¬éãã SSH ã»ãã¥ãªãã£æ¤æ»ãã¼ã«SSHambleã«ã¤ãã¦æ¤è¨¼ãè¡ãã¾ããã
2. ãã¼ã«æ¦è¦
runZeroãå
¬éãã¦ãããSSHã®èªè¨¼ã¾ããã®äºæãã¬ç¶æ
é·ç§»ãèªè¨¼å¾æ»æãèªè¨¼ã¿ã¤ãã³ã°ã®è§£æããã¹ãã»ãã·ã§ã³åæãªã©ã調æ»ããããã®ãã¼ã«ã§ãGoã§å®è£
ããã¦ãã¾ãã
SSHã®è¨å®ä¸åãèå¼±æ§ã«é¢ããã¹ãã£ã³ã»åæã»å¯¾è©±åã·ã§ã«ãã¼ã«ãªã©ãåãã£ã¦ãããç¶æ
é·ç§»ãèªè¨¼ã¿ã¤ãã³ã°ã«ã¤ãã¦ãæ¤è¨¼ã§ãããã¨ã大ããªç¹å¾´ã§ãã
GitHubãªãã¸ããª: https://github.com/runZeroInc/sshamble
3. æ©è½è§£èª¬
SSHambleã«ã¯ãã¹ãã£ã³ã»è§£æã»å¯¾è©±åãã¹ãã»ãã·ã§ã³ã·ã§ã«ã®å¤§ãã3ã¤ã®æ©è½ãåãã£ã¦ãã¾ãã
3.1 ã¹ãã£ã³
åãã¹ãã«å¯¾ãã¦ãæå®ãããªãã·ã§ã³ã«å¾ã£ã¦è¤æ°ã®ãã§ãã¯ãå®è¡ã§ãã¾ãã åºåã¯JSONãã¡ã¤ã«çã«ä¿åã§ãã徿®µã®è§£æã«åããè¨è¨ã¨ãªã£ã¦ãã¾ãã
ãªãã·ã§ã³
- èªè¨¼ã¹ãããã»èªè¨¼ãã¤ãã¹
skip-auth/skip-auth-none/skip-auth-method-empty/skip-auth-method-null/skip-auth-pubkeyany/auth=success
- å
¬ééµèªè¨¼é¢é£
pubkey-any/pubkey-any-half/half-auth-limit/user-key/pubkey-hunt
- ãã¹ã¯ã¼ãèªè¨¼
password-any/password-empty/password-null/password-user/password-change-empty/password-change-null
- ãã¼ãã¼ãã¤ã³ã¿ã©ã¯ãã£ã
kbd-any/kbd-empty/kbd-null/kbd-user
- GSSAPIèªè¨¼
gssapi-any
- ã¦ã¼ã¶ã¼åæã»ã¿ã¤ãã³ã°è§£æ
- å¿çæéå·®ã«ããã¦ã¼ã¶ã¼æ¨å®ã
timing-none/timing-pass/timing-pubkey
- æ¢ç¥ã®èå¼±æ§ãã§ãã¯
vuln-tcp-forward/vuln-generic-env/vuln-gogs-env/vuln-ruckus-password-escape/vuln-softserve-env/vuln-exec-skip-auth/vuln-exec-skip-userauth
- å¼±ãéµã®å©ç¨ã®æ¤ç¥ã»ãããã¯ãªã¹ã
- æ¢ç¥ã®å¼±éµããããã¯ãªã¹ãã¨ç
§å
badkeys-blocklist
3.2 è§£æ
å è¿°ã®ã¹ãã£ã³çµæãã¡ã¤ã«ãèªã¿è¾¼ã¿ãå¾ãããæ å ±ãã¨ã«éç´ã»åé¡ããåé¡ã®æç¡ããã¹ãæ¯ã®ãªã¹ã¯ãã¬ãã¼ãã«ãããã¨ãå¯è½ã§ãã
3.3 対話åãã¹ãã»ãã·ã§ã³ã·ã§ã«
ã¾ããããæè»ã§è©³ç´°ãªèªè¨¼ç¶æ ã®é·ç§»ã«é¢ãã調æ»ã®ããã«ãèªè¨¼å¾ã«çã® SSH ãªã¯ã¨ã¹ããéä¿¡ããç°å¢å¤æ°ãptyããã¼ããã©ã¯ã¼ãã£ã³ã°ãªã©ãæ¤è¨¼å¯è½ã§ãã
4. æ¤è¨¼
4.1. æ¤è¨¼ç°å¢
ubuntu:22.04ã®ãã¼ã¹ã¤ã¡ã¼ã¸ãå©ç¨ããDockerã³ã³ãããç¨æããOpenSSHãSoftServeãã¤ã³ã¹ãã¼ã«ãã¦æ¤è¨¼ãã¾ããã
5.2. åºæ¬çãªã¹ãã£ã³
ã¾ããããã©ã«ãã®ãªãã·ã§ã³ã§ãç¹ã«è¿½å ã®è¨å®ããã¦ããªãSSHãµã¼ãã¼ãèµ·åããã³ã³ããã«ã¹ãã£ã³ãè¡ãã¾ããã
- ã³ã³ãããã¼ã¹ã¤ã¡ã¼ã¸: ubuntu:22.04
- OpenSSH: SSH-2.0-OpenSSH_8.9p1 (aptã§ã¤ã³ã¹ãã¼ã«)
sshamble scan -p 2205 localhost -o scan.jsonl
åºå(æç²)
{ "host": "localhost", "port": 2205, "user": "gated", "banner": "Ubuntu 22.04.5 LTS\n", "version": "SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13", "methods": ["publickey", "password", "keyboard-interactive"], "authNoneResult": "auth-failed", "sessionOutput": "=== Custom App Login (post-session demo) ===\r\nUsername: Password: \r\nAccess denied by post-auth gate.", "sessionMethod": "keyboard-user", "vulns": [ { "id": "vuln-tcp-forward", "proof": "vulnerable to port forwarding (127.0.0.1:22)", "ref": "https://cwe.mitre.org/data/definitions/183.html" } ] }
çµææ¦è¦
ã¹ãã£ã³çµæãèªãã¨ã以ä¸ã®ãã¨ããããã¾ãã
- ãã¹ã:
localhost - ãã¼ã:
2205 - OS ããã¼:
Ubuntu 22.04.5 LTS - SSH ãã¼ã¸ã§ã³:
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13 - èªè¨¼æ¹å¼:
publickey,password,keyboard-interactive - æ¤åºãããèå¼±æ§: TCPãã¼ããã©ã¯ã¼ãã£ã³ã°ã®ä¸é©åãªè¨å® (CWE-183)
åæ
sshamble analyzeã³ãã³ããç¨ãããã¨ã§ããã®ã¹ãã£ã³çµæãçµ±è¨çã«åæã§ãã¾ãã
sshamble analyze -i scan.jsonl -o results/
çæãããCSVãã¡ã¤ã«
stats_auth_methods.csv: èªè¨¼æ¹å¼ã®ä½¿ç¨ç¶æ³stats_versions.csv: SSHãã¼ã¸ã§ã³åå¸stats_ciphers.csv: æå·åã¢ã«ã´ãªãºãstats_hostkey_algos.csv: ãã¹ãéµã¢ã«ã´ãªãºãstats_session_methods.csv: ã»ãã·ã§ã³ç¢ºç«æ¹æ³- ãã®ä»ãéµäº¤æã¢ã«ã´ãªãºã ãMACãå§ç¸®æ¹å¼ãªã©ã®çµ±è¨æ å ±
5.3. auth-none ã«ããå¿åã»ãã·ã§ã³ã®æ¤ç¥
Dockerç°å¢
- ã³ã³ãããã¼ã¹ã¤ã¡ã¼ã¸:
ubuntu:22.04 - OpenSSH: SSH-2.0-OpenSSH_8.9p1 (aptã§ã¤ã³ã¹ãã¼ã«)
testerã¦ã¼ã¶ã¼ã使ããpasswd -dã§ç©ºãã¹ã¯ã¼ãã«è¨å®sshd_configã§PermitEmptyPasswords yesãæå¹å
ã¹ãã£ã³å®è¡
sshamble scan -p 2201 localhost -o results/2201/scan.jsonl --users root,admin,tester,weak,validuser,gated,fwder
åºå
ã¹ãã£ã³çµæã¯æ¬¡ã®ããã«ãªãã¾ããã(æ¤è¨¼ã«é¢ä¿ããã¨ããã®ã¿æç²)
{ "host": "localhost", "port": 2201, "user": "tester", "version": "SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13", "methods": ["password"], "authNoneResult": "auth-failed", "sessionMethod": "password-empty", "sessionSecret": "", "vulns": [] }
ãã®çµæãããtesterã¦ã¼ã¶ã¼ã¯ç©ºãã¹ã¯ã¼ã(password-empty)ã§èªè¨¼ãå¯è½ã§ãããã¨ããããã¾ãã
ããã¯sshd_configã®PermitEmptyPasswords yesè¨å®ã«ããããã¹ã¯ã¼ããªãã§ã®ãã°ã¤ã³ã許å¯ããã¦ãããã¨ã«ããåé¡ã§ãã
æ¬æ¥ã§ããã°SSHãµã¼ãã¼ã¯ç©ºãã¹ã¯ã¼ããæå¦ãã¹ãã§ãããè¨å®ãã¹ã«ããèå¼±ãªç¶æ
ã¨ãªã£ã¦ããã¨ãããã¨ããã§ãã¯ã§ãã¾ããã
5.4 SoftServeç°å¢ã¸ã®ã¹ãã£ã³
Soft Serve v0.7.4以åã«ã¯ãç°å¢å¤æ°ã®ä¸é©åãªãã³ããªã³ã°ã«ããããªã¢ã¼ãã³ã¼ãå®è¡(RCE)ã®å¯è½æ§ãããèå¼±æ§ãåå¨ãã¾ããSSHambleã«ã¯ãããã¹ãã£ã³ãããªãã·ã§ã³ãããã®ã§ãããã使ã£ãæ¤è¨¼ãè¡ãã¾ãã
ç°å¢
softserve-vulnã®Dockerç°å¢
- ã³ã³ãããã¼ã¹ã¤ã¡ã¼ã¸:
debian:bookworm-slimãã«ãã¹ãã¼ã¸ãã«ãã§Soft Serve v0.7.4ãã³ã³ãã¤ã«ããGitãªãã¸ããªãµã¼ãã¼ã¨ãã¦åä½ããã¾ãã
ã¹ãã£ã³å®è¡
sshamble scan -p 2208 localhost -o results/softserve.jsonl
åºå
ã¹ãã£ã³çµæ(æç²):
{ "host": "localhost", "port": 2208, "user": "admin", "version": "SSH-2.0-OpenSSH_7.6p1", "methods": ["publickey", "keyboard-interactive"], "authNoneResult": "auth-failed", "sessionMethod": "keyboard-null", "sessionSecret": "\u0000", "vulns": [ { "id": "vuln-softserve-env", "proof": "ld.so error in output (ERROR: ld.so: object '/' from LD_PRELOAD cannot be preloaded)", "ref": "CVE-2024-41956", "url": "https://github.com/charmbracelet/soft-serve/security/advisories/GHSA-m445-w3xr-vp2f" } ] }
æ³å®éããLD_PRELOADç°å¢å¤æ°ã®ã¤ã³ã¸ã§ã¯ã·ã§ã³ã«ãããld.soã¨ã©ã¼ãçºçããCVE-2024-41956ãåå¨ãããã¨ã確èªã§ãã¾ããã
6. ãã°è§£æã¨ç¹å¾´çãªãã¿ã¼ã³
SSHambleã¯èªè¨¼ç¶æ ã®é·ç§»ã®ç¢ºèªãæ å ±åéã®ããã®ã¹ãã£ã³ãªã©ãè¡ããããã¹ãã£ã³ããããµã¼ãã¼ã§ã¯ããã¤ãç¹å¾´çãªãã°ãè¦ããã¾ãã
6.1 dispatch_protocol_error
dispatch_protocol_error 㯠SSH ãã¼ã¢ã³ (sshd) ããããã³ã«ä»æ§å¤ã®ã¡ãã»ã¼ã¸ãã¯ã©ã¤ã¢ã³ãããåä¿¡ããéã«åºåãããã°ã§ãã
é常ã®SSHã¯ã©ã¤ã¢ã³ãï¼OpenSSH, PuTTYçï¼ã§ã¯çºçãã¾ããããSSHambleã§ã¯ä¸»ã«ä»¥ä¸ã®èªè¨¼ã¹ãããç³»ã»ãã¤ãã¹ç³»ãã§ãã¯ã§çºçãã¾ãã
| ãã§ãã¯å | æ¦è¦ | ãã°ä¾ | æå³ |
|---|---|---|---|
skip-ssh-userauth |
èªè¨¼ãµã¼ãã¹èªä½ãã¹ããã | dispatch_protocol_error: type 90 seq 0 [preauth] |
èªè¨¼åã«ãã£ãã«éè¨è©¦è¡ (SSH_MSG_CHANNEL_OPEN) |
skip-auth |
èªè¨¼ãå®è¡ããã»ãã·ã§ã³éè¨ | åä¸ | åä¸ |
skip-auth-pubkeyany |
Half-Authå¾ã®ãã£ãã«éè¨è©¦è¡ | dispatch_protocol_error: type 90 seq 2 [preauth] |
èªè¨¼ããã¼é¸è± |
skip-auth-success |
ã¯ã©ã¤ã¢ã³ããå½ã®èªè¨¼æåã¡ãã»ã¼ã¸éä¿¡ | dispatch_protocol_error: type 52 seq 2 [preauth] |
SSH_MSG_USERAUTH_SUCCESSãã¯ã©ã¤ã¢ã³ãå´ããéä¿¡ï¼libsshç³»èå¼±æ§æ¨¡å£ï¼ |
pubkey-bulkhalf |
大éã®Half-Authè©¦è¡ | dispatch_protocol_error: type 90 seq X [preauth] |
èªè¨¼è©¦è¡å¶éã確èªä¸ |
æ¤ç¥ã®ãã¤ã³ã
- type 90 (SSH_MSG_CHANNEL_OPEN): èªè¨¼åãã£ãã«ãªã¼ãã³è©¦è¡ï¼èªè¨¼ã¹ãããï¼
- type 52 (SSH_MSG_USERAUTH_SUCCESS): ã¯ã©ã¤ã¢ã³ããå½ã®æåã¡ãã»ã¼ã¸éä¿¡ï¼libsshèå¼±æ§æ¤æ»ï¼
dispatch_protocol_error: type (90|52) seq [0-9]+ \[preauth\]
ãã®ãã°ã1è¡ã§ãåºåãããã°ãSSHambleã¾ãã¯é¡ä¼¼ã®ãããã³ã«é¸è±æ»æã®è©¦è¡ãæå³ãã¾ãã
ã¾ããæ£å¸¸ãªã¯ã©ã¤ã¢ã³ãã§ã®è©¦è¡æã¯åºç¾ããªãããã誤æ¤ç¥ãªã¹ã¯ã¯ä½ãã¨èãããã¾ãã
6.2 Half-Authããã³å ¬ééµåæã®çè·¡
次ã«ãSSHambleã® pubkey-any ã pubkey-bulkhalf ãã§ãã¯ã§ã¯ãç½²åãä¼´ããªãHalf-Authã夿°éä¿¡ãããµã¼ãã¼ã®èªè¨¼è©¦è¡å¶é (MaxAuthTries) ãéµåçãã¸ãã¯ã確èªãã¾ãã
代表çãªãã°ã¨ãã¦ã¯
Failed publickey for invaliduser from 172.31.0.1 port 35214 ssh2: RSA SHA256:abcXYZ error: maximum authentication attempts exceeded for invaliduser from 172.31.0.1 port 35214 ssh2 [preauth]
ãããã¾ãã
6.3 èªè¨¼æ¹å¼ã®åãæ¿ã試è¡
SSHambleã¯å䏿¥ç¶å ã¾ãã¯çæéã§è¤æ°ã®èªè¨¼æ¹å¼ã試è¡ãããµã¼ãã¼ã®èªè¨¼è¨å®ãèå¼±æ§ã調æ»ãã¾ãã
代表çãªãã°ã¨ãã¦ã¯
Failed none for root from 172.31.0.1 port 34412 ssh2 Failed publickey for root from 172.31.0.1 port 34412 ssh2 Failed password for root from 172.31.0.1 port 34412 ssh2
ãããã¾ãã
30ç§ä»¥å
ã«åä¸IPããè¤æ°ã®èªè¨¼æ¹å¼ã試è¡ãããå ´åãSSHambleãããã¯èªååã¹ãã£ãã®å¯è½æ§ãé«ãã¨èãããã¾ãã
6.4 ãã®ä»ã®ç¹å¾´çãã¿ã¼ã³
SSHambleã¹ãã£ã³ã§ã¯ã以ä¸ã®ãããªç¹å¾´çãªãã°ãã¿ã¼ã³ã観測ããããã¨ãããã¾ãã
| ãã°ãã¿ã¼ã³ | æå³ | æ¤ç¥å¯¾è±¡ |
|---|---|---|
authNoneResult":"auth-success" |
noneèªè¨¼æå | å¿åã»ãã·ã§ã³ |
keyboard-null accepted auth |
空ãã¹ã¯ã¼ãåç | PermitEmptyPasswords yes è¨å®ãã¹ |
vuln-tcp-forward |
èªè¨¼å¾ãã©ã¯ã¼ãè¨±å¯ | å é¨è¸ã¿å°ã»CWE-183 |
ld.so error in output |
LD_PRELOADã¨ã©ã¼ | SoftServe RCE (CVE-2024-41956) |
6.5 fail2banãSnortã§ã®æ¤ç¥å¯è½æ§
Snortãªã©ã®ãããã¯ã¼ã¯IDSã§ã¯SSHã¯æå·åã»ãã·ã§ã³ã®ãããdispatch_protocol_error ã Failed publickey ã¨ãã£ãã¢ããªã±ã¼ã·ã§ã³å±¤ã¡ãã»ã¼ã¸ã¯æ¤ç¥ã§ãã¾ããã
ãããã£ã¦ãSSHambleã®ãããªãããã³ã«ç°å¸¸æ¤ç¥ã¯ ãµã¼ãã¼ãã°ï¼auth.logï¼ãã¼ã¹ ã®åæãå¿
é ã§ãããIDSã§ã¯ãã¼ãåä½ã®æ¥ç¶é »åº¦ãç°å¸¸åææ°ã«ããæååæã«éå®ããã¾ãã
7. ãããã«
éµç®¡çãã¦ã¼ã¶éç¨ã®ã¡ãã£ã¨ããè¨å®æ¼ãããã§ãã¯ãããã¨ãã§ããã»ããèªè¨¼é·ç§»ãforwardingã«é¢ããæåã確èªã§ããåãªãã¹ãã£ã³ãã¼ã«ãã詳細ã«åæã§ãããã¨ããããã¾ããã
ããã«ããã徿¥ã®ã¹ãã£ã³ã ãã§ã¯è¦éããããã¡ãªãèªè¨¼æé ãã¿ã¤ãã³ã°å·®ããµã¼ãã¼å®è£
åºæã®å¦çã¨ãã£ãæåãä¸å¯§ã«æ¤è¨¼ã§ãã¾ãã
ã¾ããä»åã®æ¤è¨¼ãéãã¦ãSSHã¯æçãããããã³ã«ã¨ããã䏿¹ã§ãSSHãµã¼ãã¼ã«ã¯éç¨ã»å®è£
ã®å¤æ§æ§ãããããããèµ·å ã®èå¼±æ§ãåå¨ããã¨ãããã¨ãç¥ããã¨ãã§ãã¾ããã