内容纲要

这几天又看了两道题 , 其中第二道没做出来 , 研究了大佬们的WriteUp后写下文本 , 作为笔记


ICS-04

之前做过一道ICS-06 , 结果是个爆破题让人无语 , 这道ICS-04虽然没有那么无脑 , 但感觉还是比较简单的~

还是那个工控管理系统 , 题目提示在注册登录方面有漏洞 , 那么就把注册登录流程走一遍

  1. 注册页面

    png

    注册页面没有什么问题

  2. 登录页面

    png

    登录页面也没啥问题 , 不过能猜到应该有个管理员用户之类的~

  3. 找回密码页面

    png

    为啥要输入原始密码?我都知道了原始密码为啥还找回密码?搞不懂这个逻辑啊...

    png

    输入新密码后 , 提示修改密码成功

  4. 在找回密码时 , 需要先输入用户名 , 然后系统返回问题 , 输入相关信息后方可填写新密码 , 这里的回显那么明显 , 肯定要试一下有没有SQL注入之类的漏洞

    • 这个查询请求是通过POST传值的 , 所以通过BurpSuite来抓包看下参数~
      png

    • 只有一个username参数 , 直接上SQLMAP
      png

  5. 没费力气就拿到数据库了 , 直接看下有没有有用的信息

    png

    发现数据库中默认存在一个c3tlwDmIn23用户 , 这个用户应该就是我们要的特殊用户

  6. 下面仅需要拿到这个用户的密码 , 然后登录即可

    但是非常不幸 , 主流MD5解密平台都解不出来这个MD5值 , 想依赖问题修改密码 , 但是修改密码又需要输入原来的密码 ... 题目陷入僵局

  7. 发了会儿呆 , 想到在学习SQL注入时有个非常经典的案例 : SQL Column Truncation , 它的表现是 : MySQL对超出长度的值只提示Warning , 而不会提示 Error , 利用这一点可以发起截断攻击 , 这里有没有搞头呢?

  8. 回到注册界面 , 注册时用了一个特别的用户名 : c3tlwDmIn23 + ( 300 个 空格 ) + 1 , 然后再次查看数据库 .

    png

    新用户最后的" 1 "被截断 , 那么是否可以通过这个新用户代替原来的c3tlwDmIn23登陆呢?

  9. 登陆用户

    png

    成功拿到Flag !


前面这道题是开胃菜 , 没什么难度 , 第二题的难度就比较大了 ~


wtf.sh-150

FLAG1

png

  1. 首先先拿dirsearch扫一下有没有什么敏感文件

    png

    发现存在一个/css/目录 , 看了下这个目录

    png

    发现这些CSS文件并不是放在网站根目录下的 , 而是放在/tmp/wtf_runtime/目录下的 , 说明这可能是一个虚拟的临时环境 , 后面也可以查找是否有什么敏感文件在该目录下

  2. 走一遍注册与登录过程 , 看一下其中的逻辑关系

    注册页面没有什么发现 , 注册完毕后页面直接跳转到登录页面了

    登录页面故意输错密码后发现页面提示了回显( 用户名 ) , 输入正确信息后可以登录到主页面

    png

    这些地方都是常常出现注入类漏洞的地方 , 可以逐步挖掘看是否存在利用点

    png

  3. 先拿SQLMAP扫了一下几个常用的页面 , 没有找到SQL注入漏洞 , 但是发现注册和登录页面的username字段可能存在XSS . 顿时来了兴趣

    png

    随便写个payload就可以触发弹窗 , 比如 ><script>alert(/xss/)</script><

    png

    然后我就傻了 , 因为我不知道能用这里的XSS能做些什么 . XSS是一种攻击用户浏览器的技术 , 和本题好像没什么关系...

  4. 没什么好的想法 , 决定先不管这里 , 继续看登录后的主页 .

    在主页可以查看当前登录用户的Profile , 因为当前用户还没有发表任何信息 , 所以是空的 . 另外这里通过URL获取了user参数的值 , 所以值得尝试测一下是否存在目录泄露或者文件包含等漏洞

    接着发现这里存在一个任意文件读取漏洞 , 可以利用该漏洞读取所有文件的第一行

    Payload : ../../../../../etc/passwd

    png

    最初我认为这个漏洞没有什么很好的利用方式 , 因为只能读取文件的第一行 , 后来才知道是自己见识少了, 例如可以用它读取/proc/self/environ这个文件

     Google了一会儿 , 发现这个 /proc/self/environ 文件值得注意啊 , 它可以配合 LFI 完成 RCE , 直接获取WebShell !
    
     简单的说 , /proc/self/environ 文件包含了系统的一些变量 ,  但是攻击者可以通过修改浏览器的Agent信息来插入自己的内容到该文件 , 配合LFI即可实现RCE
    
     Google关键词 : Directory Traversal & Remote Code Execution Using /proc/self/environ
    

    没找到哪边存在LFI , 所以先不去管它 , 但是依旧可以从该文件中得到很多有用的信息

    png

    比如通过PWD发现我们处于之前那个临时目录环境 , 那么下面就要多注意这个目录了!

  5. 随便点开一个POST , 发现当前页面从URL中获取了POST参数的值 , 这里POST参数是否能利用呢?

    测试一下能发现可以拿到这个临时目录下文件的源码

    Payload : ../../

    png

    源码比较多 , 而且居然用的是shell脚本?为什么有的行是以$开始? 总之比较难读 . 直接搜一下看有没有与Flag相关的字段 , 然后就能找到get_flag1函数

    png

    格式化后代码如下

    png

    上面这段代码完成了如下流程

    1. 先判断当前用户是否存在( 如果用户存在会在 ./users/目录下有对应文件 )

    2. 获取当前登录用户的用户名和发表的POST , 并且输出它们

    3. 然后判断登录用户是否为 admin 用户( 用户名和Cookie认证 ) , 如果为 admin 用户则调用 get_flag 这个函数

    这个流程很清楚 , 首先我们需要一个已经存在的用户 , 然后需要得到admin账户的cookie , 最后以admin身份登录即可拿到flag

  6. 拿到Flag1

    1. 首先需要注册一个账号 , 使得系统在./user/目录下生成对应文件( 之前已经注册过asd账户了 , 这步省略 )

    2. 拿到管理员Cookie

      管理员Cookie怎么拿? 第一反应是之前那个XSS , 但又想了想觉得是不可行的 . 所以放弃这个方向 .

      因为前文一直提到这个/users/目录 , 所以看一下这个目录 . 然后发现该目录下保存了注册用户的敏感信息

      png

      经过与asd用户抓包对比 , 其中第二行为对应的Cookie值 , 第一行是啥我也不知道==反正用不到

    3. 替换Cookie后登录

    拿BurpSuite刷新了登录后的页面 , 发现该站点是用 USERNAME + TOKEN 来维持用户登录状态的~ 那么仅需要修改这两个值就可以以admin身份登录

    png

    主界面没有看到flag , 我又傻了 . 想到前面看到会输出用户名和用户的POST , 这应该是Profile页面的功能 , 所以最后profile.wtf页面找到了flag

    png

    成功拿到Flag , 当然这只是一半的Flag ...


当时写到着我已经不想写了, 好不容易解出来的Flag居然还只是一半 ... 又没找到什么利用点 , 然后我就去吃饭了

后来看了大佬们的WriteUp , 才知道第二个Flag应该怎么解


FLAG2

  1. 问题还是出在这个.wtf文件扩展名上

    虽然之前也对这个.wtf扩展名感到奇怪 , 但是解题方向不再这里 , 所以也没深究

    .wtf不是常规的网页文件 , 在之前泄露的代码中存在解析wtf文件的代码

    经过格式化后 , 代码如下

    png

    这段代码其实不难理解

         1. 导入文件 , 判断导入文件的扩展名是否为 .wtf , 若是则标记为可被执行
    
         2. 如果导入文件扩展名为wtf , 且 page_include_depth 小于64( 之前定义过的 , 实际上没发现有什么用 ) , 那么逐行读取该文件
    
         3. 如果读到一行的文件可以被执行 , 且开头为" $ " , 那么执行该行代码并通过log函数记录日志
    

    这里我们知道了后缀为.wtf的文件有什么用 , 里面某些代码为什么以$开头

    简单的说 , 就是会通过eval解析执行.wtf后缀的文件中以$开头的行 , 如何还可以上传.wtf文件 , 那么就有了执行代码的机会

  2. 这个系统中还有两个功能没有用到 , 分别是 评论功能 和 新建POST功能

  • 新建POST功能代码

    png

  • 评论功能代码

    png

    这两段代码都提到了./users_lookup/这个目录 , 并且这个目录对于我们是可读可写可执行的 !

    png

    那么只需要将我们的.wtf文件上传到./users_lookup/目录 , 再请求该文件就可以了~

  1. 分别看下这两个功能发送的数据包
  • 新建POST功能

    png

    这里上传路径直接写死 , 我们无法改变目标路径 , 也就无法将自定义的wtf文件上传到/users_lookup/这个目录

  • 评论功能

    png

    发现这里可以控制上传的目标路径 , 可以修改POST参数 , 指向./users_lookup/目录

    png

    这里直接构造POST参数为./users_lookup/*.wtf文件是不行的 , 请看下面的代码

    png

    在我们构造的POST参数后还添加了这么一部分#${next_post_id} , 因此就无法生成wtf文件了 , 所以这里需要尝试分隔它们

    可以在.wtf后添加一个水平制表符tab , 也就是url编码的%09 , 这样就把我们定义的.wtf文件和后面的内容分开了 , 单独生成了.wtf文件~

    png

  1. 再看下评论功能的代码 , 发现用户名没有经过任何检测便被写入到文件中了

    png

    如果可以构造一个以$开头的用户名 , 再上传到一个.wtf文件中 , 那么当请求这个页面时 , wtf文件中的内容就被执行

    前面已经得到get_flag1函数了 , 所以这里直接在系统中搜索get_flag2 , 因为find命令中存在多个空格 , 所以用大括号包围

    png

    使用该用户发送一条评论 , 并把它上传到./users_lookup/目录中

    png

    上传成功 , 请求一下该页面 , 使得用户名被执行

    png

    成功得到了/usr/bin/get_flag2这个程序 , 下面只需要再注册一个$/usr/bin/get_flag2账户并使得用户名被执行即可!

    png

    发送一条评论 , 上传到./users_lookup/目录

    png

    请求该页面即可~

    png

    成功拿到Flag2!

  2. 将两段Flag进行拼接 , 即可得到完整的Flag


总结

第一题和第二题的第一问还是比较简单的 , 也可以顺利做出来 . 但是第二题的第二问难度真的比较大 , 需要关注的点太多 . 又因为源码中含有大量Shell脚本 , 我对Shell不太熟练 , 读起来非常吃力 . 所以做不下去...

下次遇到这类题目还是要慢慢分析 , 不可急躁!

最后修改日期:2019年9月17日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。