GPT-4,有人說「好用」,當把一段雜亂的文本內容分享給它時,它會自動調優,輸出一段合理、邏輯通順的語句;有人說「沒什么幫助」,它生成的代碼片段經常引入了不存在的庫,無法快速地投入到生產環境中;也有人說「不好」,怎么都繞不開它一本正經胡說八道的圈。
在不同場景下,GPT-4 的優劣有所差異,但究竟如何,還得切身體驗了才知道。近日,美國調查新聞網站 The Intercept 信息安全部總監、DDoSecrets 顧問 Micah Lee 心血來潮,拿著 GPT-4 去 CTF(Capture The Flag,中文一般譯作“奪旗賽”,在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式)上“炸了一把場”。
慶幸的是,CTF 中(幾乎)沒有作弊這一說。在 GPT-4 的幫助下,他不僅獲得了更多的“旗幟”,也有一些不同的 GPT-4 的使用經驗想要分享。接下來,我們不妨一起來看一下。
1、解決問題與出錯并存的 GPT-4
Micah Lee 表示,“如果沒有 GPT-4 的幫助,我肯定只能得到有限的幾個旗幟。對于 GPT-4 不能獨立解決的問題,它提供了非常有用的提示,或者快速編寫了一些腳本,而這些腳本對于我自己來說,是非常乏味或耗時的。
我還發現有幾種情況,ChatGPT 可能會直接報錯并拒絕給我答案。我想這是當我明顯地想在黑客方面得到幫助時,才會發生的情況。例如,當我問它如何編寫一些可以繞過特定的 XSS 過濾器的 JavaScript 代碼,并且使用明確表示我正在嘗試繞過 XSS 過濾器的語言時,它就輸出失敗并且報錯。似乎 ChatGPT 有一些名義上的保護措施來防止人們將其用于惡意黑客攻擊,但如果你只是詢問詳細的技術問題(可用于進攻或防御),它往往會回答這些問題。”
綜上,Micah Lee 基于以下三個技術挑戰進行了經驗分享:
- Shamir 秘密共享
- perckel
- Shell 障礙
之所以選擇這個三個挑戰,Micah Lee 解釋道,部分原因是給 GPT-4 提供回答問題所需的背景并不容易描述。例如,你不能向 GPT-4 發送一個 30MB 的 APK 文件,然后要求它幫助你進行逆向工程,或者把一個網絡應用的所有源代碼復制到 GPT-4 中,然后要求它找到漏洞。不過,你可以把所有問題劃分成小模塊,然后逐個向 GPT-4 提問。
2、Shamir 秘密共享
Shamir 秘密共享(Shamir Secret Sharing,SSS)是一種加密算法,它允許不同的各方通過持有*shares* 來共同共享單個秘密的所有權。
在這個挑戰中,Micah Lee 在大賽會場上四處尋找可以掃描的 QR 碼。在 Shamir 秘密共享方案中,一個秘密被分成一定數量,如果一個人擁有這些部分的答案,他們就可以解密。

在這個背景下,秘密被分成了 7 個部分,閾值為 5。最終,Micah Lee 轉了一圈之后,找到了其中 6 個部分。然后他簡單地要求 GPT-4 來解決問題:
以下是 Shamir 秘密共享的部分內容:
Share 1 of 7 (min 5): (x1, y1) = (1, 12214173319090360239218007) Field prime = 2^89 - 1 Flag = CTF{secretasletters} Secret -> base 27 a = 1, b = 2, ... z = 26 (base 27)
Share 3 of 7 (min 5): (x3, y3) = (3, 272214528378786743506941922) Field prime = 2^89 - 1 Flag = CTF{secretasletters} Secret -> base 27 a = 1, b = 2, ... z = 26 (base 27)
Share 4 of 7 (min 5): (x4, y4) = (4, 404905998942651879217397287) Field prime = 2^89 - 1 Flag = CTF{secretasletters} Secret -> base 27 a = 1, b = 2, ... z = 26 (base 27)
Share 5 of 7 (min 5): (x5, y5) = (5, 589183787842889173793388269) Field prime = 2^89 - 1 Flag = CTF{secretasletters} Secret -> base 27 a = 1, b = 2, ... z = 26 (base 27)
Share 6 of 7 (min 5): (x6, y6) = (6, 338337360147368973687481536) Field prime = 2^89 - 1 Flag = CTF{secretasletters} Secret -> base 27 a = 1, b = 2, ... z = 26 (base 27)
Share 7 of 7 (min 5): (x7, y7) = (7, 479528534189573769684386994) Field prime = 2^89 - 1 Flag = CTF{secretasletters} Secret -> base 27 a = 1, b = 2, ... z = 26 (base 27)
我如何解密?
在提出這一問題之后,GPT-4 給出了它的回答:

這個答案有用嗎?
為了驗證,Micah Lee 把 GPT-4 給出的 Python 腳本復制到了 Decrypt.py 里面,并運行了一下:
$ python3 decrypt.py
CTF{perasperaadastra}
震驚了。特別是因為這個挑戰實際上包括一個與 base-27 有關的非常棘手的部分,但 GPT-4 在第一次嘗試時就解決了所有問題,沒有額外提示。
最終,Micah Lee 用 GPT-4 生成的答案,提交了旗幟并得到了分數。
3、perckel

在 CTF 大賽上,當系統給出這個界面時,Micah Lee 下載了這個名為 flag.bin 的文件,然后試圖運行它來弄清楚這個文件是什么。
$ file flag.bin flag.bin: perl Storable (v0.7) data (network-ordered) (major 2) (minor 11)
不過,Micah Lee 表示,“我不知道這是什么,而且我已經有十多年沒有用 Perl 寫過任何代碼了,所以我問 GPT-4。”
這個文件是什么?
flag.bin: perl Storable (v0.7) data (network-ordered) (main 2) (minor 11)
GPT-4 給出了詳細的解釋,「這個名為 "flag.bin "的文件是一個二進制文件,其中包含使用 Perl Storable 模塊序列化的數據」。

還不錯。也許 GPT-4 還能直接編寫一個 Perl 腳本,這樣我們也就可以看到那個文件里有什么。
所以,Micah Lee 進一步要求 GPT-4:
寫一個 Perl 腳本,用于顯示該文件中的內容。

成功了!在不懂 Perl 語言的情況下,GPT-4 生成腳本,Micah Lee 把腳本另存為 script.pl 并嘗試運行它:
$ perl script.pl Can't eval, please set $Storable::Eval to a true value at /System/Library/Perl/5.30/darwin-thread-multi-2level/Storable.pm line 421, at script.pl line 9
它希望能夠執行任意代碼。
當 Micah Lee 在電腦上運行這個時,他想著一直要謹慎操作,但同時讓我們看看 GPT-4 是否能幫助解決這個問題:
無法評估,請在 /System/Library/Perl/5.30/darwin-thread-multi-2level/Storable.pm 第 421 行,在 script.pl 第 9 行,將 $Storable::Eval 設為 True 值。

很好, GPT-4 修復了這個腳本。
Micah Lee 成功更新了 script.pl,但他不想直接在電腦上運行它。(GPT-4 很好,分別三次警告有安全風險)。所以,Micah Lee 決定在 Docker 容器中運行這個腳本。
于是,Micah Lee 創建了一個新的 Ubuntu 容器,安裝了正確的 Perl 依賴項,然后運行它:
root@22b72f43fc3d:/src# perl ./script.pl
Name "Storable::Eval" used only once: possible typo at ./script.pl line 9.
$VAR1 = {
'shqa' => 'iryaeuxfc',
'jwjepylpxecq' => 'yfebe',
--snip--
'iruvqhgdnfstz' => 'smkohnqw',
'qcotpliscszql' => 'efzhu',
'decode_flag' => sub { "DUMMY" },
'htxj' => 'pmifolpyh',
'lftq' => 'pxqqgeqy',
'adbsjrhouqhgg' => 'srndfdboqqmfc',
'avarqfgzrufc' => 'thgzdhdstum',
'pdeqoerfqxbro' => 'grugrmrocnekt',
'ujlw' => 'ooxnyiyu',
'flag' => '??;???@??(?P??@HTX?Т?@??????@(!k?8?@??Q?
??@?,??}F?@0Z??W?@??R?J?@???JM??@?#*,?@??E~???@?A????@???Y]??@?v???@@?N
b?@???co6?@??????@??
?9?D?|?
?@?\'Mi?e?@i??^9?@',
'lquykkphh' => 'bjyrsce',
'ruybrycyo' => 'othebxvqngu',
--snip--
'zxyybaaawc' => 'kbzr',
'pojhbzugch' => 'dqxiybapwepfh'
};
root@22b72f43fc3d:/src#
這個腳本輸出了 1000 多行代碼,顯示了這個 Perl 對象的值。大多數鍵值對似乎都是垃圾,但有兩個鍵很有意思:flag 是一個二進制數據塊,另一個 decode_flag 顯然是一個 Perl 函數。聽起來,也許 flag 是被編碼的,Micah Lee 認為可以調用 decode_flag 解碼它。
$data 對象有兩個有趣的鍵,flag 是二進制數據,另一個 decode_flag 是一個函數。更新腳本調用該函數 decode_flag 并傳入flag 值。

Micah Lee 更新了腳本并再次運行它:
root@22b72f43fc3d:/src# perl script.pl
Name "Storable::Eval" used only once: possible typo at script.pl line 9.
Decoded flag: CTF{ooohhh_purrrrl_<3}
4、Shell 障礙

這個挑戰提供了一個 Web Terminal 的鏈接。Micah Lee 可以通過 netcat 進入該主機,并獲得一個 shell。下面是 Web Terminal 的樣子:

以下是一些命令的輸出(為清楚起見,對主機名進行了編輯):
ctf@shurdles:~$ ls -l total 2220 -r-x--x--x 1 root ctf 2270141 Apr 16 2020 shurdles
Micah Lee 的主文件夾shurdles 有一個調用的可執行文件。他嘗試運行它:
ctf@shurdles:~$ ./shurdles shurdle 0 failed: expected at least 1 argument
沒想到,程序運行失敗,并顯示一條錯誤消息,指出它至少需要 1 個參數。這是第一個障礙(shell 障礙),但它很容易解決——Micah Lee 只是通過一個論點:
ctf@shurdles:~$ ./shurdles ASDF shurdle 2 failed: I expected to be called /shurdles, not ./shurdles
這奏效了。于是,Micah Lee 便進入了下一個障礙。
沒想到的是,下一個障礙很難。這個程序希望 Micah Lee 運行 /shurdles,而不是 ./shurdles。那么該怎么做,再次問問 GPT-4:
我有一個 bash shell。有一個名為 /home/ctf/shurdles 的可執行文件。我可以通過以下命令來運行它:
/home/ctf/shurdles
或者通過更改為文件夾 /home/ctf,然后運行:
./shurdles
我可以使用此命令運行它,而無需創建符號鏈接嗎?
/shurdles
GPT-4 沒過多久迅速給出了回應:添加 /home/ctf 到我的 PATH 中,這樣我就可以運行 shurdles 了,盡管它并不完美。

不過,Micah Lee 還是試過了,但沒有用:
ctf@shurdles:~$ export PATH=$PATH:/home/ctf ctf@shurdles:~$ shurdles ASDF shurdle 2 failed: I expected to be called /shurdles, not shurdles
所以,Micah Lee 回到 GPT-4 并懇求額外的幫助。
可以運行:
shurdles
但是我該如何運行:
/shurdles
在這種情況下,GPT-4 告訴 Micah Lee 要創建一個 symlink ,盡管這需要root。

然而,Micah Lee 沒有 root 權限,所以他要求 GPT-4 想想其他辦法。
有沒有辦法在不使用 symlink 鏈接和不使用 root 權限的情況下做到這一點?
然后 GPT-4 想出了一個 Micah Lee 自己可能沒有想到的好主意:使用 shell 函數。

不幸的是,這仍然不起任何作用:
ctf@shurdles:~$ function /shurdles() { /home/ctf/shurdles "$@"; }
ctf@shurdles:~$ /shurdles ASDF
shurdle 2 failed: I expected to be called /shurdles, not /home/ctf/shurdles
程序的表面看起來好像是在運行打開 /shurdles,但實際這個 shell 函數正在打開的是 /home/ctf/shurdles,所以這是進程看到的第一個參數。為此,Micah Lee 要求更多幫助:
這是一個好主意,但我實際上需要 argv 的第一個值是 /shurdles。
緊接著,GPT-4 回應了一個出乎意料的答案,用 Micah Lee 自己的話來講,就是“我甚至從來沒聽過 exec -a 這個命令”。

Micah Lee 還是決定用這個答案來試一試,不過,因為他的電腦上并沒有 vim 或 nano。因此,出于懶惰,Micah Lee 只是要求使用 echo 保存 shurdles_wrapper.sh 的命令。
如何使用 echo 而不是文本編輯器來創建 shurdles_wrapper.sh 腳本?
GPT-4 給了確切的代碼:

Micah Lee 對這段代碼稍微修改了一下,他將腳本存儲在 /tmp/wrapper.sh 而不是 /home/ctf/shurdles_wrapper.sh 中,因為他沒有 /home/ctf 的寫入訪問權限,但這段代碼仍然起作用了:
ctf@shurdles:~$ echo -e '#!/bin/bash\nexec -a /shurdles /home/ctf/shurdles "$@"' > /tmp/wrapper.sh ctf@shurdles:~$ chmod +x /tmp/wrapper.sh ctf@shurdles:~$ /tmp/wrapper.sh ASDF shurdle 3 failed: I expected the environment variable "HACKERS" to look like hack the planet on separate lines
過了這道坎之后,下一個挑戰隨之而來。熬過了那個嘈雜!為了節省時間,Micah Lee 再次劃分問題,交給了 GPT-4 給答案:
如何將環境變量“HACKERS”設置為“hack the planet”,并讓每句都在單獨的一行上?
GPT-4 回答道,「你可以通過使用換行符 "\n "將環境變量 "HACKERS "設置為 "hack the planet "的值,這讓每行都在單獨的一行里。下面是具體的操作方法.....」

不出意外,GPT-4 再次有效提供了可用的代碼:
ctf@shurdles:~$ export HACKERS=$'hack\nthe\nplanet' ctf@shurdles:~$ /tmp/wrapper.sh ASDF shurdle 5 failed: expected workdir "/run/. -- !!"
來到下一個障礙。當 Micah Lee 問 GPT-4 如何讓他當前的工作目錄看起來像:/run/. -- !!,而不需要實際創建該文件夾并對其進行修改。
GPT-4 有一些好主意,包括運行 export PWD='/run/. -- !!' ,不過這段代碼沒有起作用。
當 Micah Lee 進一步詢問 GPT-4,一個命令如何學習其工作目錄的不同方式。GPT-4 的建議是,它可以使用 PWD 環境變量,也可以用 getcwd 函數。當 Micah Lee 問 getcwd 如何在沒有 PWD 環境變量的情況下學習工作目錄時,它給出了一個詳細的答案:

Micah Lee 表示,這些 Linux 實現細節涉及了他的知識盲區。要知道,對于開發者而言,他所需要做的事情就是對 GPT-4 提問,并能看懂這款模型輸出的代碼內容,也不一定完全要掌握相關語言的每個技術點。不過,GPT-4 有時候會自信地說胡話。
在這里,由于 Micah Lee 最初找錯了 tree,當他意識到這一問題時,他也發現所有 CTF 大賽的用戶都有 /run 的寫入權限,所以可以直接創建文件夾并對它進行更改。
在這里,Micah Lee 自己解決了這個障礙問題。
ctf@shurdles:~$ mkdir '/run/. -- !!' ctf@shurdles:~$ cd /run/.\ --\ \!\!/ ctf@shurdles:/run/. -- !!$ /tmp/wrapper.sh ASDF shurdle 6 failed: fd 3 isn't open
不過,緊接著,系統便報錯了——“fd 3 isn't open”。
對于這個錯誤,Micah Lee 并不能理解,究竟是必須打開文件或是其他東西。于是,他再次求助 GPT-4:

根據 GPT-4 的解答,Micah Lee 知曉他正在運行的程序需要打開一個文件,所謂 fd 3 是指 file descriptor 3。那解決方案是什么,當以下面疑問向 GPT-4 提問時:
有什么辦法可以讓我在運行產生這個錯誤的程序時,讓它打開一個額外的資源,這樣 file descriptor 3 就會被打開?
GPT-4 建議可以使用 exec 3 命令:

在對這個命令一無所知的情況下,Micah Lee 還是嘗試著運行了:
ctf@shurdles:/run/. -- !!$ exec 3>/tmp/fd3_output.txt ctf@shurdles:/run/. -- !!$ /tmp/wrapper.sh ASDF shurdle 6 failed: expected fd 3 to be a file of 1337 bytes in length
運行結果讓跨越這個障礙的進度條再次多了一些。根據提示,接下來 Micah Lee 要做的便是需要在 /tmp/fd3_output.txt 輸入 1337 字節的內容。
Micah Lee 表示雖然他自己知道該怎么做,但是想試試 GPT-4 是否會速度更快一些。于是,他提問:
如何使 /tmp/fd3_output.txt 長度為 1337 字節?
GPT-4 如預期中那樣,推薦使用 dd 命令:

當 Micah Lee 運行 dd 命令時,/tmp/fd3_output.txt 中內容的確實現了 1337 字節。但是當他運行 exec 3>/tmp/fd3_output.txt 時,意外出現了,系統截斷了文件,顯示零字節。那該如何解決這個問題呢?
如何修改命令:
exec 3>/tmp/fd3_output.txt
所以當它創建文件 /tmp/fd3_output.txt 時,如何有 1337 字節長?

Micah Lee 用了 GPT-4 輸出的代碼試過了...但沒有用。
ctf@shurdles:/run/. -- !!$ dd if=/dev/zero of=/tmp/fd3_output.txt bs=1 count=1337 && exec 3>/tmp/fd3_output.txt 1337+0 records in 1337+0 records out 1337 bytes (1.3 kB, 1.3 KiB) copied, 0.00219604 s, 609 kB/s ctf@shurdles:/run/. -- !!$ /tmp/wrapper.sh ASDF shurdle 6 failed: expected fd 3 to be a file of 1337 bytes in length
這其中哪塊出現了偏差?把下面這個問題拋給 GPT-4:
當我運行下面代碼時:
dd if=/dev/zero of=/tmp/fd3_output.txt bs=1 count=1337 && exec 3>/tmp/fd3_output.txt
似乎 /tmp/fd3_output.txt 仍然是 0 字節。
$ ls -l /tmp/fd3_output.txt -rw-r--r-- 1 CTF CTF 0 23 月 06 日 17:3 /tmp/fd<>_output.txt
GPT-4 對于自己輸出錯誤的內容立刻進行了道歉,并給了另一個解決方案:

運行試試:
ctf@shurdles:/run/. -- !!$ dd if=/dev/zero of=/tmp/fd3_output.txt bs=1 count=1337 && exec 3<>/tmp/fd3_output.txt 1337+0 records in 1337+0 records out 1337 bytes (1.3 kB, 1.3 KiB) copied, 0.0021625 s, 618 kB/s ctf@shurdles:/run/. -- !!$ /tmp/wrapper.sh ASDF shurdle 7 failed: tz Local != America/Los_Angeles
又一個障礙被跨過去了!接下來,按照運行的結果,就是更新一下時區:
如何將時區設置為 "America/Los_Angeles",以便我運行的下一個命令將其識別為時區?
GPT-4 的答案:

復制代碼,運行一下:
ctf@shurdles:/run/. -- !!$ exec 3<>/tmp/fd3_output.txt && TZ="America/Los_Angeles" /tmp/wrapper.sh ASDF shurdle 8 failed: could not find shurdles-helper
很輕松地成功了。現在,系統又提示讓找到 shurdles-helper。對于這個問題。Micah Lee 自己動手解決了,他創建一個新文件夾,將一個調用的可執行文件放入 shurdles-helper 其中,然后將其添加到 PATH 中。
ctf@shurdles:/run/. -- !!$ mkdir /tmp/bin ctf@shurdles:/run/. -- !!$ echo -e '#!/bin/bash\necho helper' > /tmp/bin/shurdles-helper ctf@shurdles:/run/. -- !!$ chmod +x /tmp/bin/shurdles-helper ctf@shurdles:/run/. -- !!$ export PATH=/tmp/bin:$PATH ctf@shurdles:/run/. -- !!$ exec 3<>/tmp/fd3_output.txt && TZ="America/Los_Angeles" /tmp/wrapper.sh ASDF shurdle 9 failed: expected /home/ctf/.cache/shurdles, does it exist?
成功!進入下一個障礙。根據提示,系統希望有 /home/ctf/.cache/shurdles 路徑的存在。Micah Lee 再次自己直接創建了一個文件解決了這個問題。
ctf@shurdles:/run/. -- !!$ mkdir -p /home/ctf/.cache ctf@shurdles:/run/. -- !!$ touch /home/ctf/.cache/shurdles ctf@shurdles:/run/. -- !!$ exec 3<>/tmp/fd3_output.txt && TZ="America/Los_Angeles" /tmp/wrapper.sh ASDF shurdle 9 failed: /home/ctf/.cache/shurdles was modified in the last day, sorry
它也成功了。現在,它需要將時區設置為 America/Los_Angeles。
提問:
你是如何更新文件的修改時間戳的?
GPT-4 回答:

好吧,很簡單。Micah Lee 把它設置為一個月前:
ctf@shurdles:/run/. -- !!$ touch -t 202303231430 /home/ctf/.cache/shurdles
ctf@shurdles:/run/. -- !!$ exec 3<>/tmp/fd3_output.txt && TZ="America/Los_Angeles" /tmp/wrapper.sh ASDF
Congratulations!!!
CTF{you_made_it_past_the_hurdles}
最后,Congratulations!
5、寫在最后
至此,借助 GPT-4,Micah Lee 在全球最高技術水平和影響力的 CTF 競賽中取得不錯的成績。而 GPT-4 在不斷地提示詞之下,雖然其中有些小差錯,但也輸出了不少非常實用的代碼,能為開發者的知識盲區提供一些技術意見。可以說,稍加利用,GPT-4 在輔助編碼上將是一股不容忽視的力量。
不過,對此也有網友表示,“這就像在數學考試中使用計算器一樣。在某些測試中雖然這項工具是被允許的,但是有些賽事中確實是明令禁止的。這也會讓大賽失去一些競技和趣味”。為此,你怎么看?
Anna艷娜
尚思卓越
RacentYY
ManageEngine卓豪
安全俠
安全內參
Anna艷娜
尚思卓越
一顆小胡椒
安全牛
看雪學苑
安全客