bug bounty中常见的shell命令

admin 2022年12月25日00:48:12评论22 views字数 5329阅读17分45秒阅读模式

bug bounty中常见的shell命令

声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

前言

最近几天重感冒了,咳嗽好几天了,好在情况在好转,小编也提醒一下大家做好防护工作,今天就分享一下前几天TomNomNom的那个演讲中的一些笔记

正文

标准输入输出与错误

/dev/null 表示空设备文件

0 表示stdin标准输入

1 表示stdout标准输出

2 表示stderr标准错误

这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。

输入

stdin(标准输入)是程序从中读取输入的流。默认情况下,stdin 从键盘读取输入,但也可以将其重定向为从文件或另一个程序的输出读取输入。

$ cat
Hello, world!
^D
Hello, world!

在此示例中,cat 命令从 stdin(在本例中为键盘)读取输入并将其写入 stdout(在本例中为控制台)。当用户按下 CTRL+D 时,cat 终止,输入显示在控制台上。

输出

stdout(标准输出)是程序写入输出的流。默认情况下,stdout 在控制台上显示输出,但也可以将其重定向以将输出写入文件或另一个程序的输入。

$ ls -l > listing.txt

在此示例中,ls 命令列出当前目录的内容,并使用 > 运算符将输出重定向到名为 listing.txt 的文件。

错误

stderr(标准错误)是程序向其写入错误消息的流。默认情况下,stderr 在控制台上显示错误消息,但也可以将其重定向以将错误消息写入文件或另一个程序的输入。

$ cat nonexistent.txt 2> errors.txt
⇒  cat errors.txt
cat: nonexistent.txt: No such file or directory

在此示例中,cat 命令尝试读取一个名为 nonexistent.txt 的文件,该文件不存在。错误消息打印到 stderr,错误消息使用 2> 运算符重定向到名为 errors.txt 的文件。

⇒  ls
errors.txt    output.txt    output01.txt  stdin_out.txt
⇒  ls -l nonexistent.txt > listing.txt 2>&1
⇒  ls
errors.txt    listing.txt   output.txt    output01.txt  stdin_out.txt
⇒  cat listing.txt
ls: nonexistent.txt: No such file or directory

在此示例中,ls 命令尝试列出名为 nonexistent.txt 的文件的内容,该文件不存在。错误消息打印到 stderr,错误消息和 ls 命令的输出都使用 > 和 `2>&1 运算符重定向到名为 listing.txt 的文件。

就是说如果nonexistent.txt这个文件存在,那么就将里面的内容重定向到listing.txt

如果nonexistent.txt这个文件不存在,就将错误消息重定向到listing.txt

#2>&1--->如果有错误就将错误输入到标准输出的地方
cmdA 2>&1

此命令运行 cmdA 并将任何 stderr 输出重定向到与 stdout 相同的位置。

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

输入输出重定向

输出重定向

⇒  who
mac      console  Dec 18 10:30
mac      ttys000  Dec 18 10:46
mac      ttys004  Dec 18 10:57
⇒  who > users.txt
⇒  cat users.txt
mac      console  Dec 18 10:30
mac      ttys000  Dec 18 10:46
mac      ttys004  Dec 18 10:57
#如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
⇒  echo "菜鸟教程:www.runoob.com" >> users.txt
⇒  cat users.txt
mac      console  Dec 18 10:30
mac      ttys000  Dec 18 10:46
mac      ttys004  Dec 18 10:57
菜鸟教程:www.runoob.com

重定向输入

将输入重定向到 inputFile

cmd < inputFile
⇒  cat users.txt
mac      console  Dec 18 10:30
mac      ttys000  Dec 18 10:46
mac      ttys004  Dec 18 10:57
菜鸟教程:www.runoob.com
⇒  wc -l users.txt
       4 users.txt
⇒  wc -l < users.txt
       4
#注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

合二为一:

command1 < infile > outfile
#同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
⇒  wc -l < users.txt >outfile.txt

⇒  cat outfile.txt
       4

在看一个例子:

⇒  ls
errors.txt    outfile.txt   output01.txt  users.txt
listing.txt   output.txt    stdin_out.txt
⇒  cat listing.txt
ls: nonexistent.txt: No such file or directory

#
读取listing.txt中内容,然后将输出写入到testlist.txt中
⇒  cat < listing.txt > testlist.txt
⇒  ls
errors.txt    outfile.txt   output01.txt  testlist.txt
listing.txt   output.txt    stdin_out.txt users.txt
⇒  cat testlist.txt
ls: nonexistent.txt: No such file or directory

cmdA |& cmdB

cmdA |& cmdB
#shell 命令 cmdA |& cmdB 是两个 shell 运算符的组合:管道运算符|和 &.

#
管道操作员 | 获取运算符左侧命令的输出(本例中为 cmdA),并将其作为输入传递给运算符右侧的命令(本例中为 cmdB)。 这类似于 | 其他编程语言中使用的运算符,用于将一个函数或方法的输出作为另一个函数或方法的输入。

#
错误重定向运算符 & 将运算符左侧的命令(在本例中为 cmdA)的标准错误输出重定向到与标准输出相同的位置。 这对于从脚本或程序中的命令捕获错误消息,或将标准输出和错误输出重定向到同一文件或流非常有用。


#
其实就是执行了两个命令,如果有错误就输出到与标准输出相同的位

<(cmd)

<(cmd) 语法称为进程替换,它允许您将一个命令的输出用作另一个命令的输入,就好像它是一个文件一样。

以下是使用进程替换对 ls 命令的输出进行排序并将其作为输入传递给 wc(字数统计)命令的示例,该命令计算输入中的行数:

⇒  ls
errors.txt    outfile.txt   output01.txt  testlist.txt
listing.txt   output.txt    stdin_out.txt users.txt

⇒  wc -l <(ls)

       8 /dev/fd/11   

使用进程替换的另一个例子是比较两个文件的内容,即使其中一个是命令的输出:

diff <(sort file1) <(sort file2)

⇒  cat output.txt
1
2
3%
⇒  cat output01.txt
1
1
3
1%

⇒  diff <(sort output.txt) <(sort output01.txt)

2c2,3
< 2
---
> 1
> 1

⇒  cat output01.txt
1
1
3

⇒  cat output.txt
1
2
3%

⇒  diff <(sort output.txt) <(sort output01.txt)

2c2
< 2
---
> 1


$(cmd)

$(cmd) - 返回cmd的结果,并将其保存与变量中

如果您希望将命令输出保存在变量中,则非常方便

tee

tee 命令是一个 Unix 实用程序,它从标准输入读取并将输出写入标准输出和一个或多个文件。

shell 命令 cmd | tee outfile 将运行 cmd 命令和 outfile。如果文件 outfile 不存在,将创建它。如果它确实存在,它将被新的输出覆盖。

ls -l | tee filelist.txt

此命令将列出当前目录中的文件并将输出写入终端和文件 filelist.txt。

  • 在终端显示
  • 写入到文件filelist.txt

shell 命令 cmd | tee -a outfile 的工作方式类似,但它将 cmd 命令的输出附加到文件 outfile 的末尾,而不是覆盖它。

Plain text

提取或者排除(grep)

grep -v pattern: grep 命令用于在一个或多个文件中搜索特定模式。-v 选项告诉 grep 反转搜索,这意味着它将返回所有与指定模式不匹配的行。

⇒  cat file.txt
I love apples.
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.
⇒  grep -v apple file.txt

I also like pears.
Apples are my favorite fruit.
I don't care for bananas.

⇒  cat file.txt | grep -v apple
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.


awk(打印删除特定字段)

awk '{print $3}':此awk命令将打印输入中每一行的第三个字段。例如,如果输入文件包含以下行:

⇒  cat file.txt
I love apples.
I also like pears.
Apples are my favorite fruit.
I don't care for bananas.

⇒  cat file.txt | awk '{print $3}'
apples.
like
my
care


awk '{print $NF}':此awk命令将打印输入中每一行的最后一个字段。例如,如果输入文件包含以下行:

⇒  cat file.txt | awk '{print $NF}'
apples.
pears.
fruit.
bananas.

在看一个删除的例子:

⇒  cat awk01.txt
apple orange banana strawberry
grapefruit kiwi mango pineapple
⇒  cat awk01.txt | awk '{$3 = "";print $0}'
apple orange  strawberry
grapefruit kiwi  pineapple

#
注意:原文是不变的
⇒  cat awk01.txt
apple orange banana strawberry
grapefruit kiwi mango pineapple

"cat input.txt | awk '{3="";print0}'" 来打印 "input.txt" 的内容,并从每一行中删除第三个字段:

参考

https://www.runoob.com/linux/linux-shell-io-redirections.html

往期回顾

xss研究笔记-从174篇writeup中得出的结论

SSRF研究笔记-从124篇writeup中得出的结论

你所不知道的sso绕过tips

赏金猎人系列-如何测试sso相关的漏洞

赏金猎人系列-如何测试sso相关的漏洞(II)

原文始发于微信公众号(迪哥讲事):bug bounty中常见的shell命令

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月25日00:48:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   bug bounty中常见的shell命令http://cn-sec.com/archives/1480012.html

发表评论

匿名网友 填写信息