本模块涵盖了使用 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
正如我们所看到的,我们在这里注释了脚本的几个部分,我们可以将其拆分成几个部分。
-
检查给定的参数(Check for given arguments)
在脚本的第一部分,我们有一个 if-else 语句,用于检查我们是否指定了代表目标公司的域。 -
识别指定 IP 地址的网络范围(Identify network range for the specified IP address(es))
在这里,我们创建了一个函数,它对每个 IP 地址进行“whois”查询,并显示保留网络范围的行,并将其存储在 CIDR.txt 中。 -
Ping 发现的 IP 地址(Ping discovered IP address(es))
此附加功能用于检查是否可以使用相应的 IP 地址访问找到的主机。使用 For-Loop,我们 ping 网络范围内的每个 IP 地址并计算结果。 -
识别指定域的 IP 地址(Identify IP address(es) of the specified domain)
作为此脚本的第一步,我们确定返回给我们的域的 IPv4 地址。 -
可用选项(Available options) 然后我们决定要使用哪些功能来查找有关基础架构的更多信息。