侦察脚本编写(test+cron+交互程序+函数库)3

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

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

  • test命令

条件周围的方括号意味着我们正在将内容传递到一个test命令中:
[ -f $DIRECTORY/nmap ]等同于 test -f $DIRECTORY/nmap。
test命令计算一个条件,并输出真或假。-f标志将测试文件是否存在。但是你可以测试更多的条件!
让我们来介绍一下一些有用的测试条件。-eq和-ne标志分别检验相等式和不等式。如果$3等于(equal)1,则返回true:
if [ $3 -eq 1 ]
-gt、-ge、-lt和le标志的测试值分别为大于(greater than)、大于或等于(greater equal)、小于(less than)和小于或等于(less equal):
if [ $3 -gt 1 ]if [ $3 -ge 1 ]if [ $3 -lt 1 ]if [ $3 -le 1 ]
-z(zero)和-n标志将测试一个字符串是否为空。这些条件都是真true:
if [ -z "" ]    #为空是真if [ -n "abc" ]    #不为空是真
-d、-f、-r、-w和-x标志将检查目录和文件状态。您可以在shell脚本对文件进行操作之前,使用它们来检查文件的存在性和权限。
例如,如果/bin是一个存在的目录directory,则此命令返回true:
if [ -d /bin]

如果/bin/bash是一个存在的文件file,则返回true:

if [ -f /bin/bash ]

如果/bin/bash是一个可读read的文件,则返回true:

if [ -r /bin/bash ]

或可写write文件:

if [ -w /bin/bash ]

或可执行execute文件:

if [ -x /bin/bash ]
您还可以使用&&和||来联合test表达式。如果两个表达式都为true,则此命令返回true:
if [ $3 -gt 1 ] && [ $3 -lt 3 ]

如果其中至少有一个是真的,这个就返回真:

if [ $3 -gt 1 ] || [ $3 -lt 0 ]
通过运行man test,您可以在test命令的手册中找到更多的比较标志。(如果您不确定您正在使用的命令,您总是可以始终在终端中输入命令名后面的命令名,以访问命令的手动文件。)
  • 编写函数库

随着代码库的增大,您应该考虑编写一个函数库来重用代码。我们可以将所有常用的函数存储在一个名为scan.lib的单独文件中。这样,我们就可以根据未来侦察任务的需要来调用这些函数:

文件名:scan.lib

#!/bin/bashnmap_scan(){ nmap $DOMAIN > $DIRECTORY/nmap echo "The results of nmap scan are stored in $DIRECTORY/nmap."}dirsearch_scan(){ $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(){ curl "https://crt.sh/?q=$DOMAIN&output=json" -o $DIRECTORY/crt echo "The results of cert parsing is stored in $DIRECTORY/crt."}
在另一个文件中,我们可以引入库文件,以便使用它的所有函数和变量。我们通过source命令引入一个库文件,它的参数是该库文件的路径:
#!/bin/bashsource ./scan.libPATH_TO_DIRSEARCH="/Users/vickieli/tools/dirsearch"getopts "m:" OPTIONMODE=$OPTARGfor i in "${@:$OPTIND:$#}"do DOMAIN=$i DIRECTORY=${DOMAIN}_recon echo "Creating directory $DIRECTORY." mkdir $DIRECTORY case $MODE in  nmap-only)   nmap_scan   ;;  dirsearch-only)   dirsearch_scan   ;;   crt-only)    crt_scan   ;;  *)   nmap_scan   dirsearch_scan   crt_scan   ;;  esac echo "Generating recon report for $DOMAIN..." TODAY=$(date) echo "This scan was created on $TODAY" > $DIRECTORY/report if [ -f $DIRECTORY/nmap ];then  echo "Results for Nmap:" >> $DIRECTORY/report  grep -E "^s*S+s+S+s+S+s*$" $DIRECTORY/nmap >> $DIRECTORY/report fi if [ -f $DIRECTORY/dirsearch ];then  echo "Results for Dirsearch:" >> $DIRECTORY/report  cat $DIRECTORY/dirsearch >> $DIRECTORY/report fi  if [ -f $DIRECTORY/crt ];then  echo "Results for crt.sh:" >> $DIRECTORY/report  jq -r ".[] | .name_value" $DIRECTORY/crt >> $DIRECTORY/report fidone
当您正在构建需要相同函数的多个工具时,使用一个库可能非常有用。例如,您可能构建多个都需要DNS解析的网络工具。在这种情况下,您可以简单地编写一次函数,并在所有工具中使用它。
  • 构建交互式程序

如果您想构建一个在执行期间接受用户输入的交互式程序呢?假设,如果用户输入命令行选项,-i,您希望程序进入一个交互模式,允许您指定要扫描的域:
./recon.sh -i -m nmap-only
为此,你可以使用read。此命令读取用户输入,并将输入字符串存储到一个变量中
echo "Please enter a domain!"read $DOMAIN
这命令将提示用户输入一个域名,然后将输入存储在一个名为$DOMAIN的变量中。为了反复提示用户,我们需要使用一个while循环,它将不断打印请求输入域名的提示,直到用户退出程序。
这是while循环的语法。只要条件为真,while循环将在do和done之间重复执行代码:
while 条件do    做点什么done
我们可以使用一个while循环反复提示用户输入域名,直到用户输入退出quit:
while [ $INPUT != "quit" ];do     echo "Please enter a domain!"     read INPUT      if [ $INPUT != "quit" ];then         scan_domain $INPUT         report_domain $INPUT     fidone
我们还需要一种方法来让用户实际调用-i选项,而我们的getopts命令目前还没有这样做。我们可以通过使用while循环重复用getopts来解析选项:
while getopts "m:i" OPTION; do     case $OPTION in     m)          MODE=$OPTARG         ;;      i)          INTERACTIVE=true         ;;     esacdone
在这里,我们详细说明了一个重复获取命令行选项的while循环。如果选项标志为-m,我们将MODE变量设置为用户指定的扫描模式。如果选项标志为-i,则我们将$INTERACTIVE变量设置为true。
然后,在脚本的后面,我们可以通过检查$INTERACTIVE的值来决定是否调用交互模式。把它们放在一起,我们得到了最后的脚本:
#!/bin/bashsource ./scan.libwhile getopts "m:i" OPTION; do     case $OPTION in     m)          MODE=$OPTARG         ;;      i)          INTERACTIVE=true         ;;     esacdonescan_domain(){     DOMAIN=$1     DIRECTORY=${DOMAIN}_recon     echo "Creating directory $DIRECTORY."     mkdir $DIRECTORY     case $MODE in         nmap-only)             nmap_scan             ;;         dirsearch-only)             dirsearch_scan             ;;         crt-only)             crt_scan             ;;         *)              nmap_scan             dirsearch_scan             crt_scan             ;;      esac}report_domain(){  DOMAIN=$1  DIRECTORY=${DOMAIN}_recon  echo "Generating recon report for $DOMAIN..."  TODAY=$(date)  echo "This scan was created on $TODAY" > $DIRECTORY/report  if [ -f $DIRECTORY/nmap ];then     echo "Results for Nmap:" >> $DIRECTORY/report     grep -E "^s*S+s+S+s+S+s*$" $DIRECTORY/nmap >> $DIRECTORY/report fi if [ -f $DIRECTORY/dirsearch ];then     echo "Results for Dirsearch:" >> $DIRECTORY/report     cat $DIRECTORY/dirsearch >> $DIRECTORY/report fi if [ -f $DIRECTORY/crt ];then     echo "Results for crt.sh:" >> $DIRECTORY/report     jq -r ".[] | .name_value" $DIRECTORY/crt >> $DIRECTORY/report fi}if [ $INTERACTIVE ];then 【1】  INPUT="BLANK"  while [ $INPUT != "quit" ];do 【2】     echo "Please enter a domain!"     read INPUT      if [ $INPUT != "quit" ];then 【3】         scan_domain $INPUT         report_domain $INPUT     fi  doneelse     for i in "${@:$OPTIND:$#}";do         scan_domain $i         report_domain $i     donefi
在这个程序中,【1】我们首先通过检查用户是否指定-i选项来选择交互模式。然后,【2】我们通过使用一个while循环反复提示用户输入一个域名。如果用户输入不是关键字quit,我们假设他们输入了一个目标域,因此我们扫描并生成该域的报告。
while循环将继续运行,要求用户输入域,直到用户输入quit,这将导致while循环退出,程序终止【3】。
交互式工具可以帮助您的工作流更顺利地运行。例如,您可以构建测试工具,让您根据初步结果选择继续运行的方式。
  • 使用特殊的变量和字符

您现在已经具备了足够的基本知识来构建大量多功能工具。本节提供了更多有关shell脚本特性的技巧。
在Unix中,命令在成功时返回0,在失败时返回一个正整数。变量$?包含上次执行的命令的退出值。您可以使用这些来测试执行的成功和失败:
#!/bin/bashchmod 777 script.shif [ "$?" -ne "0" ]; then   echo "Chmod failed. You might not have permissions to do that!"fi
另一个特殊变量是$$,它包含当前进程的ID,当您需要为脚本创建临时文件时,这一点非常有用。
如果您同时运行同一脚本或程序的多个实例,则每个实例都可能需要自己的临时文件。在这种情况下,您可以为每个文件创建名为/tmp/script_name_$$的临时文件。
还记得我们在本章前面讨论过shell脚本中的变量作用域吗?不是输入参数的变量在整个脚本是全局的。
如果您希望其他程序也使用该变量,您需要导出该变量
export VARIABLE_NAME=VARIABLE_VALUE

假设在其中一个脚本中,你设置了变量VAR:

VAR="hello!"
如果不在其他脚本export或source它,则该值在脚本退出后将被销毁。但是,如果您在第一个脚本中export VAR,并在第一个脚本中运行第二个脚本,那么第二个脚本将能够读取VAR的值
你还应该知道bash中的特殊字符。在Unix中,通配符*代表所有内容。例如,此命令将打印出当前目录中具有文件扩展名.txt的所有文件名:
$ ls *.txt
反引号(`)表示命令替换。为了相同的目的,您可以使用反引号和$()。此echo命令将打印whoami命令的输出:
echo `whoami`
大多数特殊字符,如通配符或单引号,在双引号中时不会被解释为特殊字符。相反,它们会被当作字符串的一部分来处理。

例如,此命令将输出字符串abc '*' 123

$ echo "abc '*' 123"
另一个重要的特殊字符是反斜杠(),即bash中的转义字符。它告诉bash,某个字符应该从字面上解释,而不是作为特殊的字符解释。
某些特殊的字符,如双引号、美元符号、反引号和反斜杠即使在双引号中仍然是特殊的,所以如果你想要bash从字面上处理它们,你必须使用反斜杠来转义它们:
$ echo "" is a double quote. $ is a dollar sign. ` is a backtick. \ is a backslash."

此命令将回显

" is a double quote. $ is a dollar sign. ` is a backtick.  is a backslash.

您还可以在新行之前使用反斜杠来表示代码行尚未结束。例如,这个命令

chmod 777 script.sh

和这一个是一样的:

chmod 777 script.sh
恭喜你!现在可以编写bash脚本。Bash脚本可能在一开始看起来很可怕,但一旦你掌握了它,它将是你的黑客武器库的一个强大的补充。您将能够执行更好的侦察,进行更有效率的测试,并有一个更结构化的黑客工作流程。
如果您计划实现大量的自动化,那么从一开始就开始组织脚本是一个好主意。
设置脚本的目录,并根据功能对脚本进行排序,这将成为开发你自己的黑客方法的开始。当您收集了一些经常使用的脚本时,您可以使用脚本来自动运行它们。
例如,您可以将脚本分类为侦察脚本、模糊脚本、自动报告等等。这样,每次您找到您喜欢的脚本或工具时,您都可以以一种有组织的方式快速地将其合并到您的工作流中。
  • 定期自动扫描

现在,让我们把您的自动化提升到下一个层次,通过建立一个警报系统,让我们知道我们的扫描中是否出现了一些有趣的东西。
这使我们不必手动运行命令,并一遍又一遍地梳理结果。我们可以使用cron来安排扫描时间。Cron是基于unix的操作系统上的一个时间调度器。它允许您定期调度任务来运行。
例如,您可以运行一个脚本,每天同一时间检查特定站点上的新端点。或者你可以运行一个扫描仪,每天检查同一目标上的漏洞。

通过这种方式,您可以监视应用程序行为中的变化,并找到利用它的方法。

您可以通过编辑crontabs文件来配置Cron的行为。Unix为每个用户保留了不同的crontabs副本。通过运行以下操作来编辑您自己的用户的crontab
crontab -e

所有的crontabs都遵循相同的语法:

A B C D E 要运行的命令A: Minute (0 – 59)B: Hour (0 – 23)C: Day (1 – 31)D: Month (1 – 12)E: Weekday (0 – 7) (星期天 is 0 or 7, 星期一 is 1...)
每一行使用五个数字指定要运行的命令和应该运行的时间。第一个数字从0到59指定命令运行的分钟。第二个数字指定了命令运行的具体小时,其范围从0到23。第三个和第四个数字是命令应该运行的日期和月份。

最后一个数字是命令应该运行的星期日,范围从0到7,0和7都表示命令应该在星期天运行,1表示命令应该在星期一运行,以此类推。例如,您可以将这一行添加到您的crontab,以在每天晚上9:30运行您的侦察脚本:

30 21 * * * ./scan.sh
您还可以在目录中批运行脚本。crontabs中的run-parts命令告诉Cron运行存储在目录中的所有脚本。
例如,您可以将所有侦察工具存储在一个目录中,并定期扫描目标。下面的一行告诉Cron每天晚上9:30运行我的安全目录中的所有脚本:
30 21 * * * run-parts /Users/vickie/scripts/security
接下来,git diff是一个输出两个文件之间的差异的命令。您需要安装Git程序来使用它。您可以使用git diff来比较不同时间的扫描结果,这可以让您快速查看自您上次扫描后目标的变化:
git diff SCAN_1 SCAN_2
这将帮助您识别目标的任何新域、子域、端点和其他新资产。您可以编写这样的脚本,每天通知您目标的新变化:
#!/bin/bashDOMAIN=$1DIRECTORY=${DOMAIN}_reconecho "Checking for new changes about the target: $DOMAIN.n Found these new things."git diff <SCAN AT TIME 1> <SCAN AT TIME 2>

使用cron定期执行它

30 21 * * * ./scan_diff.sh facebook.com
这些自动化技术帮助我快速找到了新的JavaScript文件、端点和目标上的功能。我特别喜欢使用这种技术来自动发现子域接管漏洞,我们将在第20章中讨论子域接管。
或者,您也可以使用GitHub来跟踪更改。
https://github.com/new/上设置一个存储库以存储扫描结果。
GitHub有一个通知功能,它可以在存储库上发生重大事件时告诉您。它位于每个存储库页面上的设置->通知处。为GitHub提供一个电子邮件地址,它将用来通知您有关更改。然后,在存储扫描结果的目录中,运行这些命令,在目录内启动git:
git initgit remote add origin https://PATH_TO_THE_REPOSITORY

最后,使用Cron定期扫描目标并将文件上传到GitHub:

30 21 * * * ./recon.sh facebook.com40 21 * * * git add *; git commit -m "new scan"; git push -u origin master
然后GitHub会给你发送电子邮件,说明在新扫描期间更改的文件。

原文始发于微信公众号(SecurityBug):侦察脚本编写(test+cron+交互程序+函数库)3

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

发表评论

匿名网友 填写信息