Skip to content

Level 4 To Level 8 Write-ups

Level 4

Challenge Description

website: http://natas4.natas.labs.overthewire.org/

Background Knowledges

  • HTTP 傳輸資料的型態
  • 知道網站如何判斷你從哪裡來

Solve

NOTE

本題可以使用很多方法處理。

可以用 cURLBurp Suite 等等

但是我選用 Chrome 的 extention: ModHeader >

  1. 看到畫面,得知訊息:Access disallowed. You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/",可以了解到他有在解析上一個網站的 url。

  2. 藉由 ModHeader 可以進行修改。本次修改目標是 Header 中的 Referer

  3. 重新整理後,即可得到答案。

Thoughts

本題的提示十分明顯,但是對於網站的基礎運作原理以及 HTTP 的協定特性需要稍微的掌握。

同時本題也暴露了一個重要的資安漏洞(以前的,現在真的少見):

不要把 Access 的驗證機制放在 HTTP Header 裡

Answer

答案

username: natas5

password: Z0NsrtIkJoKALBCLi5eqFfcRN82Au2oD

Level 5

Challenge Description

website: http://natas5.natas.labs.overthewire.org/index.php

Background Knowledges

  • 了解 HTTP 對於「使用者狀態」的處理。
  • 理解 Boolean 的數字型態。

Solve

  1. 看到訊息,知道這邊開始有驗證使用者身份(是否登入)。先檢查一下 原始碼HTTP 封包,看一下怎麼驗證的:

  2. 這邊他的驗證方式似乎是直接使用 Cookie 去驗證使用者是否登入,所以就去更改 Cookie。 要改 Cookie 可以使用 ModHeader 去處理,或是用 Dev toolApplication 標籤下 Cookie 資料表中,選擇網址 (此處為 http://natas5.natas.labs.overthewire.org) 去看到瀏覽器儲存的 Cookie

  3. 確認過眼神 Cookie,我們就去動手修改 loggedin 欄位的值,這邊拿到是 0,那我們就試著變成 1

  4. 重新整理過後,就可以拿到答案。

提示

我們可以利用 Dev tool 來查看原始碼(被 瀏覽器渲染 後的結果 Elements 以及原始碼 Source)。

要看 HTTP 封包,可以使用 Network 標籤。如果沒看到,重新整理就可以看到了。

Thoughts

這一關是經典的「Cookie 驗證漏洞」。

簡單來說,由於 HTTP 是不支援「狀態紀錄」的(也就是所謂的無狀態),但是伺服器還是要驗證使用者的狀況,所以就有了用 Cookie 來紀錄使用者現在的狀態。

但是太過相信這個紀錄的狀態,本身就是會出問題...畢竟網路的世界都是假的,都可以被修改。

因此要特別注意網站身份驗證與權限控制的方式。

值得注意

不過這在網站攻防上還是值得學習,因為我們有些資訊的確會放在 Cookie 裡面,如果有用到 XSS 攻擊手法,也許可以撈出來(前提是不能被設定為 HTTP-Only)。

Answer

答案

username: natas6

password: fOIvE0MDtPTgRhqmmvvAOt2EfXR6uQgR

Level 6

Challenge Description

website: http://natas6.natas.labs.overthewire.org/

Background Knowledge

  • 程式語言的基礎知識
  • PHP 的網路語法知識
  • 網路傳輸方法 (method) 的知識

Solve

  1. 一開始看到一個 input 要輸入東西。隨便輸入東西進去後,會發現他出現 Wrong secret。
  2. 這邊他給了原始碼,所以點進去看一下。
php
<html>
    <head>
        <!-- This stuff in the header has nothing to do with the level -->
        <link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
        <link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
        <link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
        <script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
        <script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
        <script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
        <script>var wechallinfo = { "level": "natas6", "pass": "<censored>" };</script>
    </head>
    <body>
        <h1>natas6</h1>
        <div id="content">

        <?

        include "includes/secret.inc";

            if(array_key_exists("submit", $_POST)) {
                if($secret == $_POST['secret']) {
                print "Access granted. The password for natas7 is <censored>";
            } else {
                print "Wrong secret";
            }
            }
        ?>

        <form method=post>
        Input secret: <input name=secret><br>
        <input type=submit name=submit>
        </form>

        <div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
        </div>
    </body>
</html>
  1. 這邊可以注意到在第 18 - 26 行中是一個 php 的程式碼內容。
php
include "includes/secret.inc";

if(array_key_exists("submit", $_POST)) {
    if($secret == $_POST['secret']) {
    print "Access granted. The password for natas7 is <censored>";
    } else {
        print "Wrong secret";
    }
}
  1. 在第 18 行注意到他引入了一個 .inc 檔案;然後再 第 21 行有一個判斷式,試圖比較變數 secret 和從 POST 方法得到的資料 secret 是否一致。

    但是看來看去沒有看到任何的變數 secret,所以看起來應該是放在 inlcudes/secret.inc 裡面了。

php
include "includes/secret.inc"; 

if(array_key_exists("submit", $_POST)) {
    if($secret == $_POST['secret']) { 
    print "Access granted. The password for natas7 is <censored>";
    } else {
        print "Wrong secret";
    }
}
  1. 打開 /includes/secret.inc 檔案,看到 secret 是 FOEIUWGHFEEUHOFUOIU,回到 /index.php,輸入密碼,得到答案。

Thoughts

關卡推進到要來看看 php 原始碼的部分了。

如果對於 php 不熟的人,可能需要邊看邊查才行。

若是對程式語言都不熟的人...恐怕要回頭去練習程式設計才行;至少要能看懂 if/else 的結構,不然的話應該只能抓頭了...

圖片出自

圖片出自https://img.ltn.com.tw/Upload/news/600/2015/04/15/php0juDSZ.jpg

Answer

答案

username: natas7

password: jmxSiH3SP6Sonf8dv66ng8v1cIEdjXWr

Level 7

Challenge Description

website: http://natas7.natas.labs.overthewire.org/

Background Knowledges

  • 基本檔案結構
  • 基本 Injection 漏洞識別
  • 基本的 URL 解析知識

Solve

  1. 檢查原始碼,以及按鈕按按看,會發現他的頁面控制是使用 Query

    /index.php?page=home --

    /index.php?page=about --

  2. 我們嘗試看看 ?page= 不要帶任何參數,結果出現錯誤訊息。

  3. 我們可以分析錯誤碼,發現我們的參數是 php 會去 include 的檔案,所以只要在參數上帶入我們要查看的檔案,就可以攻擊成功。

Warning: include(): Filename cannot be empty in /var/www/natas/natas7/index.php on line 21

Warning: include(): Failed opening '' for inclusion (include_path='.:/usr/share/php') in /var/www/natas/natas7/index.php on line 21
  1. 但是我們要查找的檔案放在哪呢?這時候看了一下原始碼(或是你看開頭的說明也可以),會看到提示。

  2. 把提示放入 ?page= 後面,就會得到答案。

Thoughts

這一關滿考驗「情報搜集」的部分。

雖然有學生破關的方法是直接把 hint 貼上去(畢竟 hint 就在哪,實在很難忽視),但是如果以正規的攻擊手段來操作的話,我覺得滿能培養學生的情搜能力。

不過主要還是在「嘗試」的環節學生容易出問題,以及對於網路知識不熟悉,可能就無法順利破關。

Answer

答案

username: natas8

password: a6bZCNYwdKqN5cGP11ZdtPg0iImQQhAB

Level 8

Challenge Description

website: https://natas8.natas.labs.overthewire.org/

Background Knowledges

  • 基本的 php 語法。
  • 編解碼的基礎。

Solve

NOTE

本題和 Level 6 一樣,都是原始碼逆向。

但是這題的特點是「編解碼」的逆向,因此需要學習一下編解碼的內容。

php
<?
$encodedSecret = "3d3d516343746d4d6d6c315669563362"; 

function encodeSecret($secret) { 
    return bin2hex(strrev(base64_encode($secret))); 
} 

if(array_key_exists("submit", $_POST)) {
    if(encodeSecret($_POST['secret']) == $encodedSecret) { 
    print "Access granted. The password for natas9 is <censored>";
    } else {
    print "Wrong secret";
    }
}
?>

另外針對 php 語法可能要稍微查詢一下 strrev()

  1. 與 Level 6 一樣。檢查原始碼。
  2. 這邊會發現他在 php 的原始碼中出現判斷。(見上方程式碼第 9 行)
  3. 從判斷中可以掌握我們輸入的資料要轉變成跟變數 encodedSecret 一樣。
  4. 這邊查看函式 encodeSecret 是如何輸出轉變編碼的,然後逆向回去。
  5. 回到首頁,輸入進去結果就得到解答。
轉換的程式碼
php
<?php
$encodedSecret = "3d3d516343746d4d6d6c315669563362";

print base64_decode(strrev(hex2bin($encodedSecret)));

// output result is secret.

Thoughts

這一題的重點就是在 逆向編碼,所以還是要看得懂程式語言,知道基本的函式使用,才能順利破解此關。

不過在教學實務上,我想應該可以利用現在的生成式 AI 來讓學生查詢。並且請他們報告基本的「編解碼」。

應該可以作為一堂密碼學的課程初級指引。

Answer

答案

username: natas9

password: Sda6t0vkOPkM8YeOZkAGVhFoaplvlJFd