摘要
啟動 Mac 的 Wifi 的 AP mode,其他裝置就可以發 request 到你的 Mac。
在 Mac 上啟動 Apache HTTP Server,其他裝置就可以發 HTTP request 到你的 Mac。
Apache 提供 HTTP request 的 forward,常見的就是 CGI。在指定的 Apache 知道的目錄下放置 CGI handler 的可執行檔,就可以處理透過撰寫此執行檔,在裡面處理該如何回應各式 request。
啟動 Mac 的 Wifi 的 AP mode
Reference: https://www.laszlopusztai.net/2016/02/14/creating-a-wi-fi-access-point-on-os-x/
[我寫這篇時 Mac OS X 版本為 Big Sur 11.2.3]
- 在 Terminal 輸入以下兩行
$ sudo networksetup -createnetworkservice Loopback lo0
$ sudo networksetup -setmanual Loopback 172.20.42.42 255.255.255.255
- 到
系統偏好設定
的網路
,就可以看到多出回繞
- 到
系統偏好設定
的共享
,Internet 共享
中共享連線來源
選擇回繞
,共享到Wi-fi
Wi-Fi 選項
裡可以設定密碼
把 Internet 共享
打勾,其他裝置掃描 Wifi AP 該就可以看到
在 Mac 上啟動 Apache HTTP Server
Reference: https://www.mdeditor.tw/pl/24pL/zh-tw
Mac 上預設應已有 Apache 作為 http daemon,可以藉由 $ httpd -v
查看版本
$ httpd -v
Server version: Apache/2.4.46 (Unix)
Server built: Dec 21 2020 18:03:44
httpd 的配置檔在 /etc/apache2/httpd.conf
,透過 sudo
權限編輯
$ sudo vim /etc/apache2/httpd.conf
找到下行並移除起始的註釋符號
LoadModule cgi_module libexec/apache2/mod_cgi.so
在目錄 /Library/WebServer/CGI-Executables
目錄下建立檔案 hello.py
, 這集就是 CGI Handler,這裡是雖然是用 Python,但他其實就看作是一個可執行檔,他就是一個可執行腳本,腳本的第一行就定義了該怎麼執行這個腳本,hello.py
內容為
#!/usr/local/bin/python3
print("Context-type:text/html")
print("")
print("<h2>Hello Python CGI</h2>")
改變他的權限
$ sudo chmod 755 /Library/WebServer/CGI-Executables/hello.py
重啟 http daemon
$ sudo apachectl -k restart
此時就可以測看看有沒有效果,cURL
就是個可以用來發 HTTP request 的指令,我們以此做測試
$ curl -i http://localhost/cgi-bin/hello.py
結果就可以看到
HTTP/1.1 200 OK
**Date**: Thu, 18 Mar 2021 00:10:00 GMT
**Server**: Apache/2.4.46 (Unix)
**Context-type**: text/html
**Transfer-Encoding**: chunked
<h2>Hello Python CGI</h2>
為什麼 http request 是往 /cgi-bin
發,可以回頭看 httpd.conf
,裡面定義了
ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"
<Directory "/Library/WebServer/CGI-Executables">
AllowOverride None
Options None
Require all granted
</Directory>
如果過程中遇到什麼錯誤,也許可以透過查看 Apache log 來知道問題,log 位置在 /var/log/apache2/error_log
我們進一步看一下 Payload 的部分,把測試 request 改為
$ curl -i 'http://localhost/cgi-bin/hello.py?req=123' > ./test.html
把 hello.py
改為
#!/usr/local/bin/python3
import os
print("Context-type:text/html")
print("")
print("<h2>Hello Python CGI</h2>")
print("<b>Input</b><br>")
print("<ul>")
for key in os.environ.keys():
print("<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key]))
print("</ul>")
執行後打開 test.html
,就可以看到
上面就可以看到這是一個 GET 類別的 HTTP request,帶的 QUERY_STRING 是 req=123