编写你自己的信息收集脚本1

admin 2024年6月20日09:25:12评论10 views字数 8646阅读28分49秒阅读模式
本文由uuwan翻译《Bug Bounty Bootcamp The Guide to Finding and Reporting Web Vulnerabilities》 by Vickie Li,如果侵权还请及时联系。

      请点击文末#Bug Bounty Bootcamp标签查看合集或关注公众号点击底部【漏洞书籍】子菜单,如果对您有帮助还请点赞、在看、评论、转发、关注、打赏哦,您的互动就是我更新最大的动力!

编写你自己的侦察脚本

你现在可能已经意识到,好的侦察需要大量的步骤,但它并不一定得耗时或难以管理。我们已经讨论了几个使用自动化功能使这个过程更简单的工具。
有时您可能会发现编写自己的脚本很方便,脚本是一个设计为程序执行的命令列表。它们被用于自动化诸如数据分析、网页生成和系统管理等任务。
对于我们这些漏洞赏金猎人来说,脚本是一种快速、高效地执行侦察、测试和开发的方法。例如,您可以编写一个脚本来扫描目标以寻找新的子域,或者枚举服务器上可能敏感的文件和目录。一旦你学会了如何编写脚本,可能性就会是无穷无尽的。
本节特别介绍了bash脚本——它们是什么以及为什么应该使用它们。您将学习如何使用bash来简化侦察过程,甚至编写自己的工具。

我假设您对编程语言的工作原理有基本的知识,包括变量、条件语句、循环和函数,所以如果您不熟悉这些概念,请在Codecademy(https://www.codecademy.com/)学习编程入门课或阅读一本编程书。

Bash脚本或任何类型的shell脚本,对于管理复杂性和自动化的需要周期执行的任务都很有用。
如果您的命令涉及多个输入参数,或者如果一个命令的输入依赖于另一个命令的输出,手动输入它可能会很快变得复杂,并增加程序错误的机会。另一方面,您可能有一个您想要多次重复执行的命令列表。脚本在这里很有用,因为它们避免了一遍又一遍地键入相同命令的麻烦,只需要每次都运行脚本,然后完成。

了解Bash脚本编写的基础知识

让我们开始写第一个脚本。打开任何文本编辑器,您编写的每个shell脚本的第一行应该是shebang line。它以一个散列(#)和一个感叹号(!)开头,并且,它还声明了要用于该脚本的解释器,这允许纯文本文件像二进制文件一样被执行,我们将用它来表示我们正在使用bash。
假设我们想编写一个执行两个命令的脚本:它应该在目标上运行Nmap,然后运行Dirsearch。我们可以像这样将命令放在脚本中:
#!/bin/bashnmap scanme.nmap.org/PATH/TO/dirsearch.py -u scanme.nmap.org -e php
这个脚本不是很有用;它只能扫描一个站点,即scanme.nmap.org。相反,我们应该让用户为bash脚本提供输入参数,以便他们可以选择要扫描的站点。
在bash语法中,$1表示传入的第一个参数,$2是第二个参数,以此类推。另外,$@表示传入的所有参数,而$#表示所有参数的总数。
让我们允许用户用第一个输入参数来指定他们的目标,分配给变量$1:
#!/bin/bashnmap $1/PATH/TO/dirsearch.py -u $1 -e php
现在,这些命令将执行用户传入第一个参数的任何域名。请注意,该脚本的第三行包含了/PATH/TO/dirsearch.py,您应该使用存储Dirsearch脚本的目录的绝对路径替换/PATH/TO/。
如果您没有指定它的位置,您的计算机将尝试在当前目录中查找它,除非您将Dirsearch文件存储在与您的shell脚本相同的目录中,否则bash不会找到它。
确保脚本能够找到要使用的命令的另一种方法是通过PATH变量,这是Unix系统中的一个环境变量,它指定可执行二进制文件的位置。
如果运行此命令将Dirsearch目录添加到路径,您可以在任何地方运行工具,而不需要指定其绝对路径:
export PATH="PATH_TO_DIRSEARCH:$PATH"

执行此命令后,您应该能够直接使用Dirsearch搜索:

#!/bin/bashnmap $1dirsearch.py -u $1 -e php
注意,在重新启动终端后,您必须再次运行export命令,以包含dirseach的路径。如果不想反复export PATH,则可以将export命令添加到~/.bash_profile文件中,该文件是存储bash预设参数配置的文件。
您可以通过使用您最喜欢的文本编辑器打开~/.bash_profile配置文件,并在文件的底部添加export命令来实现这一点。
脚本已完成!使用文件名recon.sh将其保存在当前目录中。.sh扩展是shell脚本的常规扩展名。通过运行命令cd /location/of/your/script,确保您的终端的工作目录与存储脚本的目录相同。使用以下命令在终端中执行该脚本:
$ ./recon.sh

你可能会看到这样的信息:

permission denied: ./recon.sh
这是因为当前用户没有执行该脚本的权限。出于安全目的,大多数文件在默认情况下都是不可执行的。您可以通过在终端中运行此命令,通过为每个人添加执行权限来纠正此行为:
$ chmod +x recon.sh
chmod命令编辑文件的权限,+x表示我们要添加为所有用户执行的权限。如果您希望仅授予脚本所有者的执行权限,请使用此命令:
$ chmod 700 recon.sh
现在我们就像以前一样运行这个脚本了。请尝试将scanme.nmap.org作为第一个参数传入。你应该会看到Nmap和Dirsearch的输出:

编写你自己的信息收集脚本1

将工具输出保存到一个文件中

要稍后分析侦察结果,您可能希望将脚本的输出保存在单独的文件中,这就是输入和输出重定向发挥作用的地方。
输入重定向是使用文件的内容或另一个程序的输出作为你的脚本的输入。输出重定向是指将一个程序的输出重定向到另一个位置,例如重定向到一个文件或另一个程序。

下面是一些最有用的重定向操作符:

PROGRAM > FILENAME   将程序的输出写入与FILENAME同名的文件中。 (它将首先清除文件中的所有内容。如果该文件还不存在,那么它将创建该文件。)PROGRAM >> FILENAME  将程序的输出附加到文件的结尾,而不清除文件的原始内容。PROGRAM < FILENAME   从文件中读取,并使用其内容作为程序输入。PROGRAM1 | PROGRAM2  使用PROGRAM1的输出作为PROGRAM2的输入。

例如,我们可以将Nmap和Dirsearch扫描的结果写入不同的文件中:

编写你自己的信息收集脚本1

#!/bin/bashecho "Creating directory $1_recon." 【1】mkdir $1_recon 【2】nmap $1 > $1_recon/nmap 【3】echo "The results of nmap scan are stored in $1_recon/nmap."/PATH/TO/dirsearch.py -u $1 -e php 【4】 --simple-report=$1_recon/dirsearchecho "The results of dirsearch scan are stored in $1_recon/dirsearch."
 echo命令【1】将消息打印到终端。接下来,mkdir【2】创建一个名为域名_recon的目录。【3】我们将nmap的结果存储到新创建的目录中的一个名为nmap的文件中。
【4】Dirsearch的simple-report标志在指定的位置生成一个报告。我们将直接dirsearch的结果存储到新目录中的一个名为dirsearch的文件中。
通过将变量引入到文件、名称和值中,您可以使脚本更易于管理。

bash中的变量可以使用以下语法进行指定:

VARIABLE_NAME=VARIABLE_VALUE。请注意,在等号周围没有空格,引用变量的语法是$VARIABLE_NAME。
让我们将这些内容实现到脚本中:
#!/bin/bashPATH_TO_DIRSEARCH="/Users/vickieli/tools/dirsearch"DOMAIN=$1DIRECTORY=${DOMAIN}_recon 【1】echo "Creating directory $DIRECTORY."mkdir $DIRECTORYnmap $DOMAIN > $DIRECTORY/nmapecho "The results of nmap scan are stored in $DIRECTORY/nmap."$PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php –simple-report=$DIRECTORY/dirsearch 【2】echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."

【1】我们使用${DOMAIN}_recon而不是$DOMAIN_recon,否则,bash将把整个DOMAIN_recon识别为变量名

花括号告诉bash DOMAIN是变量名,而_recon是我们要附加到它上面的文本。

【2】请注意,我们还将Dirsearch的路径存储在一个变量中,以便在将来易于更改。
使用重定向,您现在可以编写在单一命令中运行许多工具的shell脚本,并将其输出保存在单独的文件中。

将扫描的日期添加到输出中

假设您希望将当前日期添加到脚本的输出中,或者选择要运行的扫描器,而不是始终同时运行Nmap和Dirsearch。如果您想编写具有更多类似功能的工具,您必须理解一些高级的shell脚本概念。
例如,一个有用的功能是命令替换,或对命令的输出进行操作。使用$()告诉Unix执行由圆括号包围的命令,并将其输出分配给变量值。
让我们练习使用这个语法:
#!/bin/bashPATH_TO_DIRSEARCH="/Users/vickieli/tools/dirsearch"TODAY=$(date) 【1】echo "This scan was created on $TODAY" 【2】DOMAIN=$1DIRECTORY=${DOMAIN}_reconecho "Creating directory $DIRECTORY."mkdir $DIRECTORYnmap $DOMAIN > $DIRECTORY/nmapecho "The results of nmap scan are stored in $DIRECTORY/nmap."$PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php --simple-report=$DIRECTORY/dirsearchecho "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."
在【1】时,我们将date命令的输出分配给变量TODAY,date命令将显示当前的日期和时间。
【2】这可以让我们输出一个消息,指示我们执行扫描的日期。

正在添加选项以选择要运行的工具

if语句

现在,要有选择运行特定的工具,您需要使用条件句。在bash中,if语句的语法如下。请注意,条件语句以fi关键字结束:、
if [ condition 1 ]then    # 如果条件1被满足则运行elif [ condition 2 ]then    # 如果条件2满足且条件1不满足则运行else    # 如果条件1和条件2都不满足则运行fi

假设我们希望用户能够指定扫描模式,例如:

$ ./recon.sh scanmme.nmap.org MODE

我们可以像这样实现以下功能:

#!/bin/bashPATH_TO_DIRSEARCH="/Users/vickieli/tools/dirsearch"TODAY=$(date)echo "This scan was created on $TODAY"DOMAIN=$1DIRECTORY=${DOMAIN}_recon  #作者写的脚本有问题,此处的domain应该是从$1接收的,但是作者忘了写这行,本文已修改此错误echo "Creating directory $DIRECTORY."mkdir $DIRECTORY if [ $2 == "nmap-only" ] 【1】then  nmap $DOMAIN > $DIRECTORY/nmap 【2】  echo "The results of nmap scan are stored in $DIRECTORY/nmap."elif [ $2 == "dirsearch-only" ] 【3】then   $PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php –simple-report=$DIRECTORY/dirsearch 【4】  echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."else 【5】  nmap $DOMAIN > $DIRECTORY/nmap 【6】  echo "The results of nmap scan are stored in $DIRECTORY/nmap."  $PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php --simple-report=$DIRECTORY/dirsearch  echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."fi
如果用户指定nmap-only【1】,我们只运行nmap并将结果存储到名为nmap 【2】的文件中。如果用户只指定dirsearch【3】,我们只执行和存储dirsearch的结果【4】。如果用户没有指定【5】,我们将运行两个扫描【6】。现在,您可以通过在命令中指定其中一个命令,使工具只运行Nmap或Dirsearch命令:
$ ./recon.sh scanme.nmap.org nmap-only$ ./recon.sh scanme.nmap.org dirsearch-only

运行其他工具

如果您还想要从crt.sh工具中检索信息的选项呢?例如,您希望在这三种模式之间切换,或同时运行三个侦察工具:
$ ./recon.sh scanme.nmap.org nmap-only$ ./recon.sh scanme.nmap.org dirsearch-only$ ./recon.sh scanme.nmap.org crt-only
我们可以重写if-else语句,以便使用三个选项:首先,我们检查MODE是否是nmap-only。然后我们检查模式是否是dirsearch-only,最后检查模式是否是crt-only。但是这样就需要很多if-else语句,使代码变得复杂。

case语句

让我们使用bash的case语句,它允许一个变量匹配多个值,而无需经过一长串的if-else语句。case语句的语法如下所示。注意,语句以esac结束,或case backward:
case $VARIABLE_NAME in  case1)     Do something     ;;  case2)     Do something     ;;   caseN)     Do something     ;;  *)      #默认情况下,如果没有其他情况相匹配,则执行此情况。     ;; esac
我们可以通过使用case语句而不是多个if-else语句来实现该功能来改进我们的脚本:
#!/bin/bashPATH_TO_DIRSEARCH="/Users/vickieli/tools/dirsearch"TODAY=$(date)echo "This scan was created on $TODAY"DOMAIN=$1DIRECTORY=${DOMAIN}_reconecho "Creating directory $DIRECTORY."mkdir $DIRECTORYcase $2 in    nmap-only)    nmap $DOMAIN > $DIRECTORY/nmap    echo "The results of nmap scan are stored in $DIRECTORY/nmap."    ;; dirsearch-only)    $PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php --simple-report=$DIRECTORY/dirsearch    echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."    ;;  crt-only)     curl "https://crt.sh/?q=$DOMAIN&output=json" -o $DIRECTORY/crt 【1】    echo "The results of cert parsing is stored in $DIRECTORY/crt."    ;; *)    nmap $DOMAIN > $DIRECTORY/nmap    echo "The results of nmap scan are stored in $DIRECTORY/nmap."    $PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php --simple-report=$DIRECTORY/dirsearch    echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."    curl "https://crt.sh/?q=$DOMAIN&output=json" -o $DIRECTORY/crt    echo "The results of cert parsing is stored in $DIRECTORY/crt."    ;;esac
curl命令【1】将下载一个页面的内容。我们在这里使用它从crt.sh下载数据。curl的 -o选项允许您指定一个输出文件。
但是请注意,我们的代码有很多重复!运行每种类型的扫描的代码部分重复两次。让我们尝试通过使用函数来减少重复次数。bash函数的语法如下所示:
FUNCTION_NAME(){ DO_SOMETHING}

在声明了一个函数之后,您可以像调用脚本中其他shell命令一样调用它。让我们在脚本中添加函数:

#!/bin/bashPATH_TO_DIRSEARCH="/Users/vickieli/tools/dirsearch"TODAY=$(date)echo "This scan was created on $TODAY"DOMAIN=$1DIRECTORY=${DOMAIN}_reconecho "Creating directory $DIRECTORY."mkdir $DIRECTORYnmap_scan() 【1】{ nmap $DOMAIN > $DIRECTORY/nmap echo "The results of nmap scan are stored in $DIRECTORY/nmap."}dirsearch_scan() 【2】{ $PATH_TO_DIRSEARCH/dirsearch.py -u $DOMAIN -e php --simple-report=$DIRECTORY/dirsearch echo "The results of dirsearch scan are stored in $DIRECTORY/dirsearch."}crt_scan() 【3】{ curl "https://crt.sh/?q=$DOMAIN&output=json" -o $DIRECTORY/crt echo "The results of cert parsing is stored in $DIRECTORY/crt."}case $2 in 【4】 nmap-only)  nmap_scan  ;; dirsearch-only)  dirsearch_scan  ;;  crt-only)   crt_scan  ;; *)   nmap_scan  dirsearch_scan  crt_scan  ;; esac
您可以看到,我们已经简化了我们的代码。我们创建了三个函数,nmap_scan 【1】、dirsearch_scan 【2】和crt_scan 【3】。我们将scan和echo命令放在这些函数中,这样我们就可以反复调用它们而无需一再编写相同的代码【4】
这种简化在这里看起来不多,但是当您编写更复杂的程序时,使用函数重用代码将为您节省很多麻烦。
请记住,除了像$1、$2和$3等输入参数外,所有的bash变量都是全局的。这意味着在声明$DOMAIN,$DIRECTORY和$PATH_TO_DIRSEARCH等的变量在整个脚本中都可用,即使它们是在函数中声明的。
另一方面,在函数中像$1、$2和$3这样的参数值只能指代函数变量,因此你不能把它当成脚本的输入变量,例如:
nmap_scan(){ nmap $1 > $DIRECTORY/nmap  echo "The results of nmap scan are stored in $DIRECTORY/nmap."}nmap_scan
在这里,函数中的$1指的是nmap_scan函数调用的第一个参数,而不是使用recon.sh脚本调用的参数。由于nmap_scan没有调用任何参数,所以$1是空白的。

编写你自己的信息收集脚本1

原文始发于微信公众号(SecurityBug):编写你自己的信息收集脚本1

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月20日09:25:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   编写你自己的信息收集脚本1https://cn-sec.com/archives/2858695.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息