撰写的CTFZone Quals 2019:鸡肉

尽管OFFZONE 2020会议被推迟,但仍有CTFZone决赛今年,它将首次在网上举行,并将在社交网络上积极播出。

我们将在稍后宣布详细信息,但是现在,我们建议从资格赛阶段开始探索Webtask启动。来自加拿大Devand MacLean将解决方案的分析发送给我们特别是对于哈勃(Habr),我们翻译了当地突袭文本,并邀请您了解参与者所遇到的漏洞链以及这只鸡有什么关系。



一般信息


任务的作者: Pavel Sorokin
得分: 470
解决任务的团队数: 2

有用的链接:




, - :


  • (/Home/Index);
  • (/Home/Hens);
  • (/Home/Contact);
  • (/Auth/Login).

,   , :


  • ;
  •  API ,   .


/家/母鸡页面包含下载鸡“护照”的链接。


解码Base64之后,我们找到参数文件名:1.txt。使用Cyber​​Chef,我们在Base64中/ etc / passwd进行编码,并单击以下链接:

http : //web-chicken.ctfz.one/File/Download?filename=L2V0Yy9wYXNzd2Q=

在浏览器打开服务器上/ etc / passwd文件的内容,这意味着我们有权读取系统中的任意文件。

当您尝试在系统中查找其他文件时,您可能会注意到每次请求不存在的文件(或无法使用应用程序的用户权限读取的文件)时出现的错误:


看到错误是指ASPNETCORE_ENVIRONMENT环境变量后,我们开始研究ASP.NET Core Web应用程序布局。我们看到以下内容:


为了转换必要的路径和文件名并将其提取到Base64,我们编写了一个小的Python脚本(fetch.py):


使用关于在ASP.NET Core中创建的MVC Web应用程序的结构的知识,使用fetch.py​​我们可以获得以下文件的源代码:


  • ../Views/Shared/_Layout.cshtml
  • ../Views/Home/Index.cshtml
  • ../Views/Home/Contact.cshtml
  • ../Views/Home/Hens.cshtml
  • ../Views/Auth/Login.cshtml

完成此操作并研究了每个页面的源代码后,我们在Hens.cshtml中找到了一个有趣的细节。


第1行包含使用StackHenneryMVCAppProject的包含声明@,它在ASP.NET中表示指向DLL文件的链接。

我们打开../StackHenneryMVCAppProject.dll-但不是通过Kali Linux中的Python实用程序打开,而是在Windows的浏览器中打开,因为我们将在Windows中反编译此文件。通过使用这样的URL:

http :

//web-chicken.ctfz.one/File/Download?filename=Li4vU3RhY2tIZW5uZXJ5TVZDQXBwUHJvamVjdC5kbGw=在dnSpy(.NET反编译器)中打开DLL文件,立即在方法初始化中看到该类。该配置在Web应用程序启动时运行,它读取chicken_domains_internal.txt文件的内容。使用Python脚本,我们提取该文件的内容:

web-chicken-flag
web-chicken-auth Initialize()

方法通过端口4321 连接到  web-chicken-flag,并接收几个参数:secret_tokenRSA_key和  flag 不幸的是,无法启动与web-chicken-flag的连接。但是,当我们设置本地的DNS主机记录到网络的鸡AUTH转换为服务器的外部IP地址(34.89.232.240),我们设法打开HTTP://网页鸡auth /中扬鞭UI界面,用于通过REST API描述和执行命令。




在深入研究反编译的DLL文件时,您会注意到AuthController控制器不仅具有Login()方法,而且具有Change_Password_Test()方法


当我们转到  / Auth / Change_Password_Test时,我们看到以下形式:


在研究Change_Password_Test()方法时,我们了解到它通过HTTP POST请求处理String类型的四个参数:


  • 用户名;
  • 新密码;
  • 旧密码;
  • base_url。


我们Change_Password_Test()方法中稍低一些:我们未接收到base_url的值,该方法采用conf.auth_server,即web-chicken-auth,然后base_url值的末尾添加/ auth / login,将结果字符串分配给requestUri变量


在代码的下一个重要部分中,将HTTP POST请求中的usernameold_password参数的字符串值以及  配置中secret_token与它们  插入JSON字符串中。然后,从该数据创建一个JSON StringContent对象,该对象作为HTTP POST数据发送到上一步中创建requestURI变量


现在服务器等待HTTP POST请求到  requestUri返回代码参数等于0 的JSON对象。如果没有发生,我们将转到从第6行开始的代码分支,并返回视图/ Views / Auth / Login和错误Invalid login /密码

如果HTTP POST请求仍返回 code参数等于0 的JSON对象,则转到第11行的代码分支。然后requestUri2变量获取值http:// web-chicken-auth,将创建另一个JSON StringContent对象与上一部分一样,使用原始HTTP POST请求中的参数,并将此数据发送到 HTTP PUT请求中requestUri2地址。最后,密码更改消息返回给客户端


简而言之:整个过程始于对/ Auth / Change_Password_Test的HTTP POST请求,该请求  需要一定数量的参数。它使用这些值并创建一个JSON对象以通过HTTP POST 将其发送到  <base_url> / auth / login。如果作为响应,它接收到code参数等于0的JSON,它将创建另一个JSON对象,并将HTTP PUT请求发送到  http:// web-chicken-auth / auth / change_password

在Swagger UI中学习REST API时,我们看到在反编译的DLL文件中,不仅有路由/ auth / login / auth / change_password,而且还有/ auth / password_recovery的路由


该API路由期望一个带有两个参数的JSON对象:email和  secret_token。如果接收到它,那么他将返回一个JSON对象,该对象的code属性为0,并且消息和  令牌字符串为


事实证明,如果我们以某种方式强制Check_Password_Test()方法立即请求路由/ auth / password_recovery而不是/ auth / login,那么进入密码更改分支就足以输入有效的电子邮件地址。

我们再次研究代码的一部分,其中Check_Password_Test()方法在原始HTTP POST请求中分配requestUri,并且我们理解我们需要发送值http:// web-chicken-auth / auth / password / recovery#作为base_url参数,并在最后发送requestUri结果将是http:// web-chicken-auth / auth / password_recovery#/ auth / login

HTTP URL中的#字符表示请求地址的一部分已经结束。因此,接收请求的服务器将仅忽略/ auth / login部分


当然,这很好,但是我们只需要弄清楚现在正在重定向请求的REST端点将如何接收电子邮件。没有此值,请求将失败,并且我们将不做任何进一步的工作。

我们仔细查看Check_Password_Test()方法如何创建JSON数据,并且看到输入数据完全没有清除,这意味着您可以轻松实现参数。在HTTP POST请求中发送以下参数就足够了:

username = admin
old_password = pwned“,” email“:” admin@chicken.ctf.zone“,” lol“ ::”
new_password = p0tat0
base_url = http:// web-chicken-auth / auth / password_recovery#

结果JSON对象发送到  / auth / password_recovery


使用此JSON数据,我们满足了/ auth / password_recovery应该返回响应的要求,此后服务器将进入密码更改分支(JSON对象包含email属性)。现在我们不再需要old_password在此代码分支中,我们提供了更改密码所需的所有值(username属性adminpassword属性p0tat0)。请求已完成,我们得到密码更改作为响应。


只需要在登录页面上输入新的用户名和密码即可!


这是我们的标志:


All Articles