Files
metasploit-gs/api/Rex/Proto/Http/WebSocket/AmazonSsm.html
T
jenkins-metasploit c3f5bd3de2 Reboot gh-pages
2026-05-08 17:08:43 +00:00

358 lines
23 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Module: Rex::Proto::Http::WebSocket::AmazonSsm
&mdash; Documentation by YARD 0.9.37
</title>
<link rel="stylesheet" href="../../../../css/style.css" type="text/css" />
<link rel="stylesheet" href="../../../../css/common.css" type="text/css" />
<script type="text/javascript">
pathId = "Rex::Proto::Http::WebSocket::AmazonSsm";
relpath = '../../../../';
</script>
<script type="text/javascript" charset="utf-8" src="../../../../js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../../../../js/app.js"></script>
</head>
<body>
<div class="nav_wrap">
<iframe id="nav" src="../../../../class_list.html?1"></iframe>
<div id="resizer"></div>
</div>
<div id="main" tabindex="-1">
<div id="header">
<div id="menu">
<a href="../../../../_index.html">Index (A)</a> &raquo;
<span class='title'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../WebSocket.html" title="Rex::Proto::Http::WebSocket (module)">WebSocket</a></span></span>
&raquo;
<span class="title">AmazonSsm</span>
</div>
<div id="search">
<a class="full_list_link" id="class_list_link"
href="../../../../class_list.html">
<svg width="24" height="24">
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
</svg>
</a>
</div>
<div class="clear"></div>
</div>
<div id="content"><h1>Module: Rex::Proto::Http::WebSocket::AmazonSsm
</h1>
<div class="box_info">
<dl>
<dt>Included in:</dt>
<dd><span class='object_link'><a href="../../../../Msf/Handler/BindAwsSsm.html" title="Msf::Handler::BindAwsSsm (module)">Msf::Handler::BindAwsSsm</a></span></dd>
</dl>
<dl>
<dt>Defined in:</dt>
<dd>lib/rex/proto/http/web_socket/amazon_ssm.rb</dd>
</dl>
</div>
<h2>Defined Under Namespace</h2>
<p class="children">
<strong class="modules">Modules:</strong> <span class='object_link'><a href="AmazonSsm/Interface.html" title="Rex::Proto::Http::WebSocket::AmazonSsm::Interface (module)">Interface</a></span>, <span class='object_link'><a href="AmazonSsm/PayloadType.html" title="Rex::Proto::Http::WebSocket::AmazonSsm::PayloadType (module)">PayloadType</a></span>, <span class='object_link'><a href="AmazonSsm/UUID.html" title="Rex::Proto::Http::WebSocket::AmazonSsm::UUID (module)">UUID</a></span>
<strong class="classes">Classes:</strong> <span class='object_link'><a href="AmazonSsm/SsmFrame.html" title="Rex::Proto::Http::WebSocket::AmazonSsm::SsmFrame (class)">SsmFrame</a></span>
</p>
<h2>
Instance Method Summary
<small><a href="#" class="summary_toggle">collapse</a></small>
</h2>
<ul class="summary">
<li class="public ">
<span class="summary_signature">
<a href="#connect_ssm_ws-instance_method" title="#connect_ssm_ws (instance method)">#<strong>connect_ssm_ws</strong>(session_init, timeout = 20) &#x21d2; Socket </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Initiates a WebSocket session based on the params of SSM::Client#start_session.</p>
</div></span>
</li>
</ul>
<div id="instance_method_details" class="method_details_list">
<h2>Instance Method Details</h2>
<div class="method_details first">
<h3 class="signature first" id="connect_ssm_ws-instance_method">
#<strong>connect_ssm_ws</strong>(session_init, timeout = 20) &#x21d2; <tt>Socket</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Initiates a WebSocket session based on the params of SSM::Client#start_session</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>:session_init</span>
<span class='type'>(<tt>Aws::SSM::Types::StartSessionResponse</tt>)</span>
&mdash;
<div class='inline'>
<p>Parameters returned by #start_session</p>
</div>
</li>
<li>
<span class='name'>:timeout</span>
<span class='type'>(<tt>Integer</tt>)</span>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Socket</tt>)</span>
&mdash;
<div class='inline'>
<p>Socket representing the authenticates SSM WebSocket connection</p>
</div>
</li>
</ul>
<p class="tag_title">Raises:</p>
<ul class="raise">
<li>
<span class='type'>(<tt><span class='object_link'><a href="ConnectionError.html" title="Rex::Proto::Http::WebSocket::ConnectionError (class)">Rex::Proto::Http::WebSocket::ConnectionError</a></span></tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/rex/proto/http/web_socket/amazon_ssm.rb', line 333</span>
<span class='kw'>def</span> <span class='id identifier rubyid_connect_ssm_ws'>connect_ssm_ws</span><span class='lparen'>(</span><span class='id identifier rubyid_session_init'>session_init</span><span class='comma'>,</span> <span class='id identifier rubyid_timeout'>timeout</span> <span class='op'>=</span> <span class='int'>20</span><span class='rparen'>)</span>
<span class='comment'># hack-up a &quot;graceful fail-down&quot; in the caller
</span> <span class='comment'># raise Rex::Proto::Http::WebSocket::ConnectionError.new(msg: &#39;WebSocket sessions still need structs/parsing&#39;)
</span> <span class='id identifier rubyid_ws_key'>ws_key</span> <span class='op'>=</span> <span class='id identifier rubyid_session_init'>session_init</span><span class='period'>.</span><span class='id identifier rubyid_token_value'>token_value</span>
<span class='id identifier rubyid_ssm_id'>ssm_id</span> <span class='op'>=</span> <span class='id identifier rubyid_session_init'>session_init</span><span class='period'>.</span><span class='id identifier rubyid_session_id'>session_id</span>
<span class='id identifier rubyid_ws_url'>ws_url</span> <span class='op'>=</span> <span class='const'>URI</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_session_init'>session_init</span><span class='period'>.</span><span class='id identifier rubyid_stream_url'>stream_url</span><span class='rparen'>)</span>
<span class='id identifier rubyid_opts'>opts</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='id identifier rubyid_opts'>opts</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>vhost</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_ws_url'>ws_url</span><span class='period'>.</span><span class='id identifier rubyid_host'>host</span>
<span class='id identifier rubyid_opts'>opts</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>uri</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_ws_url'>ws_url</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_sub'>sub</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^.*</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_ws_url'>ws_url</span><span class='period'>.</span><span class='id identifier rubyid_host'>host</span><span class='embexpr_end'>}</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_opts'>opts</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>headers</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbrace'>{</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Connection</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Upgrade</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Upgrade</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>WebSocket</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Sec-WebSocket-Version</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='int'>13</span><span class='comma'>,</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Sec-WebSocket-Key</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_ws_key'>ws_key</span>
<span class='rbrace'>}</span>
<span class='id identifier rubyid_ctx'>ctx</span> <span class='op'>=</span> <span class='lbrace'>{</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Msf</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_framework'>framework</span><span class='comma'>,</span>
<span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>MsfExploit</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='kw'>self</span>
<span class='rbrace'>}</span>
<span class='id identifier rubyid_http_client'>http_client</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../Client.html" title="Rex::Proto::Http::Client (class)">Client</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="../Client.html#initialize-instance_method" title="Rex::Proto::Http::Client#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_ws_url'>ws_url</span><span class='period'>.</span><span class='id identifier rubyid_host'>host</span><span class='comma'>,</span> <span class='int'>443</span><span class='comma'>,</span> <span class='id identifier rubyid_ctx'>ctx</span><span class='comma'>,</span> <span class='kw'>true</span><span class='rparen'>)</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../WebSocket.html" title="Rex::Proto::Http::WebSocket (module)">WebSocket</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="ConnectionError.html" title="Rex::Proto::Http::WebSocket::ConnectionError (class)">ConnectionError</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="ConnectionError.html#initialize-instance_method" title="Rex::Proto::Http::WebSocket::ConnectionError#initialize (method)">new</a></span></span> <span class='kw'>if</span> <span class='id identifier rubyid_http_client'>http_client</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
<span class='comment'># Send upgrade request
</span> <span class='id identifier rubyid_req'>req</span> <span class='op'>=</span> <span class='id identifier rubyid_http_client'>http_client</span><span class='period'>.</span><span class='id identifier rubyid_request_raw'>request_raw</span><span class='lparen'>(</span><span class='id identifier rubyid_opts'>opts</span><span class='rparen'>)</span>
<span class='id identifier rubyid_res'>res</span> <span class='op'>=</span> <span class='id identifier rubyid_http_client'>http_client</span><span class='period'>.</span><span class='id identifier rubyid_send_recv'>send_recv</span><span class='lparen'>(</span><span class='id identifier rubyid_req'>req</span><span class='comma'>,</span> <span class='id identifier rubyid_timeout'>timeout</span><span class='rparen'>)</span>
<span class='comment'># Verify upgrade
</span> <span class='kw'>unless</span> <span class='id identifier rubyid_res'>res</span><span class='op'>&amp;.</span><span class='id identifier rubyid_code'>code</span> <span class='op'>==</span> <span class='int'>101</span>
<span class='id identifier rubyid_http_client'>http_client</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../WebSocket.html" title="Rex::Proto::Http::WebSocket (module)">WebSocket</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="ConnectionError.html" title="Rex::Proto::Http::WebSocket::ConnectionError (class)">ConnectionError</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="ConnectionError.html#initialize-instance_method" title="Rex::Proto::Http::WebSocket::ConnectionError#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='label'>http_response:</span> <span class='id identifier rubyid_res'>res</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='comment'># see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-WebSocket-Accept
</span> <span class='id identifier rubyid_accept_ws_key'>accept_ws_key</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'>Text</span><span class='period'>.</span><span class='id identifier rubyid_encode_base64'>encode_base64</span><span class='lparen'>(</span><span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>Digest</span><span class='op'>::</span><span class='const'>SHA1</span><span class='period'>.</span><span class='id identifier rubyid_digest'>digest</span><span class='lparen'>(</span><span class='id identifier rubyid_ws_key'>ws_key</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>258EAFA5-E914-47DA-95CA-C5AB0DC85B11</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='rparen'>)</span>
<span class='kw'>unless</span> <span class='id identifier rubyid_res'>res</span><span class='period'>.</span><span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Sec-WebSocket-Accept</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='id identifier rubyid_accept_ws_key'>accept_ws_key</span>
<span class='id identifier rubyid_http_client'>http_client</span><span class='period'>.</span><span class='id identifier rubyid_close'>close</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../WebSocket.html" title="Rex::Proto::Http::WebSocket (module)">WebSocket</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="ConnectionError.html" title="Rex::Proto::Http::WebSocket::ConnectionError (class)">ConnectionError</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="ConnectionError.html#initialize-instance_method" title="Rex::Proto::Http::WebSocket::ConnectionError#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='label'>msg:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Invalid Sec-WebSocket-Accept header</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>http_response:</span> <span class='id identifier rubyid_res'>res</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='comment'># Extract and extend connection object
</span> <span class='id identifier rubyid_socket'>socket</span> <span class='op'>=</span> <span class='id identifier rubyid_http_client'>http_client</span><span class='period'>.</span><span class='id identifier rubyid_conn'>conn</span>
<span class='id identifier rubyid_socket'>socket</span><span class='period'>.</span><span class='id identifier rubyid_extend'>extend</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="../../../../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../../Proto.html" title="Rex::Proto (module)">Proto</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../../Http.html" title="Rex::Proto::Http (module)">Http</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../WebSocket.html" title="Rex::Proto::Http::WebSocket (module)">WebSocket</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Interface.html" title="Rex::Proto::Http::WebSocket::Interface (module)">Interface</a></span></span><span class='rparen'>)</span>
<span class='comment'># Send initialization handshake
</span> <span class='id identifier rubyid_ssm_wsock_init'>ssm_wsock_init</span> <span class='op'>=</span> <span class='const'>JSON</span><span class='period'>.</span><span class='id identifier rubyid_generate'>generate</span><span class='lparen'>(</span><span class='lbrace'>{</span>
<span class='label'>MessageSchemaVersion:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>1.0</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
<span class='label'>RequestId:</span> <span class='const'><span class='object_link'><a href="AmazonSsm/UUID.html" title="Rex::Proto::Http::WebSocket::AmazonSsm::UUID (module)">UUID</a></span></span><span class='period'>.</span><span class='id identifier rubyid_rand'><span class='object_link'><a href="AmazonSsm/UUID.html#rand-class_method" title="Rex::Proto::Http::WebSocket::AmazonSsm::UUID.rand (method)">rand</a></span></span><span class='comma'>,</span>
<span class='label'>TokenValue:</span> <span class='id identifier rubyid_ws_key'>ws_key</span>
<span class='rbrace'>}</span><span class='rparen'>)</span>
<span class='id identifier rubyid_socket'>socket</span><span class='period'>.</span><span class='id identifier rubyid_put_wstext'>put_wstext</span><span class='lparen'>(</span><span class='id identifier rubyid_ssm_wsock_init'>ssm_wsock_init</span><span class='rparen'>)</span>
<span class='comment'># Extend with interface
</span> <span class='id identifier rubyid_socket'>socket</span><span class='period'>.</span><span class='id identifier rubyid_extend'>extend</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="AmazonSsm/Interface.html" title="Rex::Proto::Http::WebSocket::AmazonSsm::Interface (module)">Interface</a></span></span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
</div>
<div id="footer">
Generated on Fri May 8 17:03:11 2026 by
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
0.9.37 (ruby-3.1.5).
</div>
</div>
</body>
</html>