Skip to content
本模块涵盖了使用 Bash 脚本在 Linux 系统上自动执行任务所需的基础知识。对于从事技术信息安全工作的任何人来说,扎实掌握 Bash 是一项基本技能。通过自动化的力量,我们可以释放 Linux 操作系统的全部潜力并高效地执行习惯性任务。

Bourne Again Shell

Bash是我们用来与基于 Unix 的操作系统通信并向系统发出命令的脚本语言。自 2019 年 5 月起,Windows 提供了适用于 Linux 的 Windows 子系统,允许我们Bash在 Windows 环境中使用。掌握语言以有效地使用它是必不可少的。脚本和编程语言之间的主要区别在于,与编程语言相反,我们不需要编译代码来执行脚本语言。

作为渗透测试人员,我们必须能够使用任何操作系统,无论是基于 Windows 还是基于 Unix。效率主要取决于系统的知识,尤其是在权限提升领域。在基于 Unix 的系统上,必须学习如何使用终端、过滤数据和自动化这些过程。尤其是在基于 Unix 的大型企业网络中,我们将不得不处理大量数据。我们必须相应地进行分类和过滤,以尽快确定潜在的差距和信息。

学习如何组合多个命令并处理单个结果也很重要。这就是脚本的用武之地,提高了我们的速度和效率。与编程语言一样,脚本语言具有几乎相同的结构,可分为: - Input&Output - Arguments, Variables&Arrays - Conditional execution - Arithmetic - Loops - Comparison operators - Functions

脚本主要用来自动化一些流程,而不是一直手工做重复工作。还可以处理并过滤大量的信息。执行示例:

$ bash script.sh <optional arguments>

$ sh script.sh <optional arguments>

$ ./script.sh <optional arguments>

搞清楚下面这个脚本,如何创建它们以获得特定的结果。执行脚本并指定一个域,会看到脚本提供的信息。

CIDR.sh

$ ./CIDR.sh inlanefreight.com

Discovered IP address(es):
165.22.119.202

Additional options available:
    1) Identify the corresponding network range of target domain.
    2) Ping discovered hosts.
    3) All checks.
    *) Exit.

Select your option: 3

NetRange for 165.22.119.202:
NetRange:       165.22.0.0 - 165.22.255.255
CIDR:           165.22.0.0/16

Pinging host(s):
165.22.119.202 is up.

1 out of 1 hosts are up.

详细查看该脚本,并以最好的方式(way)逐行阅读。查看并分析次脚本所有部分:

#!/bin/bash

# Check for given arguments
if [ $# -eq 0 ]
then
    echo -e "You need to specify the target domain.\n"
    echo -e "Usage:"
    echo -e "\t$0 <domain>"
    exit 1
else
    domain=$1
fi

# Identify Network range for the specified IP address(es)
function network_range {
    for ip in $ipaddr
    do
        netrange=$(whois $ip | grep "NetRange\|CIDR" | tee -a CIDR.txt)
        cidr=$(whois $ip | grep "CIDR" | awk '{print $2}')
        cidr_ips=$(prips $cidr)
        echo -e "\nNetRange for $ip:"
        echo -e "$netrange"
    done
}

# Ping discovered IP address(es)
function ping_host {
    hosts_up=0
    hosts_total=0

    echo -e "\nPinging host(s):"
    for host in $cidr_ips
    do
        stat=1
        while [ $stat -eq 1 ]
        do
            ping -c 2 $host > /dev/null 2>&1
            if [ $? -eq 0 ]
            then
                echo "$host is up."
                ((stat--))
                ((hosts_up++))
                ((hosts_total++))
            else
                echo "$host is down."
                ((stat--))
                ((hosts_total++))
            fi
        done
    done

    echo -e "\n$hosts_up out of $hosts_total hosts are up."
}

# Identify IP address of the specified domain
hosts=$(host $domain | grep "has address" | cut -d" " -f4 | tee discovered_hosts.txt)

echo -e "Discovered IP address:\n$hosts\n"
ipaddr=$(host $domain | grep "has address" | cut -d" " -f4 | tr "\n" " ")

# Available options
echo -e "Additional options available:"
echo -e "\t1) Identify the corresponding network range of target domain."
echo -e "\t2) Ping discovered hosts."
echo -e "\t3) All checks."
echo -e "\t*) Exit.\n"

read -p "Select your option: " opt

case $opt in
    "1") network_range ;;
    "2") ping_host ;;
    "3") network_range && ping_host ;;
    "*") exit 0 ;;
esac

正如我们所看到的,我们在这里注释了脚本的几个部分,我们可以将其拆分成几个部分。

  1. 检查给定的参数(Check for given arguments)
    在脚本的第一部分,我们有一个 if-else 语句,用于检查我们是否指定了代表目标公司的域。

  2. 识别指定 IP 地址的网络范围(Identify network range for the specified IP address(es))
    在这里,我们创建了一个函数,它对每个 IP 地址进行“whois”查询,并显示保留网络范围的行,并将其存储在 CIDR.txt 中。

  3. Ping 发现的 IP 地址(Ping discovered IP address(es))
    此附加功能用于检查是否可以使用相应的 IP 地址访问找到的主机。使用 For-Loop,我们 ping 网络范围内的每个 IP 地址并计算结果。

  4. 识别指定域的 IP 地址(Identify IP address(es) of the specified domain)
    作为此脚本的第一步,我们确定返回给我们的域的 IPv4 地址。

  5. 可用选项(Available options) 然后我们决定要使用哪些功能来查找有关基础架构的更多信息。

bash