我正在处理一个大型私有 /8 网络,需要枚举正在侦听端口 443 并在其 HTTP HEADER 响应中声明特定版本的所有 Web 服务器。
一开始我想跑nmap
使用 connect 扫描并通过输出文件 grep 自己,但这会引发许多误报nmap
声明一个端口被“过滤”,而它实际上是“打开”的(使用连接扫描:nmap -sT -sV -Pn -n -oA foo 10.0.0.0/8 -p 443
).
所以现在我想用 bash 编写一些脚本curl
- 伪代码如下:
for each IP in 10.0.0.0/8
do:
curl --head https://{IP}:443 | grep -iE "(Server\:\ Target)" > {IP}_info.txt;
done
由于我不太熟悉 bash,我不确定如何正确编写脚本 - 我必须:
- 循环遍历所有IP
- 确保只有 X 个威胁并行运行
- 理想情况下,将输出剪切为仅在一个文件中记下匹配主机的 IP
- 最好确保只记录匹配的服务器版本
任何建议或指出方向都将受到高度赞赏。
小规模 - 迭代
for a smallerIP 地址跨度可能会建议像这样迭代:
for ip in 192.168.1.{1..10}; do ...
如本文所述类似的问题.
大规模-并行!
鉴于您的问题涉及hugeIP 地址跨度您可能应该考虑采用不同的方法。
This begs供使用gnu并行.
使用 bash 在 bash 中并行迭代大范围的 IP 地址gnu并行需要将逻辑拆分为多个文件(供并行命令使用)。
ip2int
#!/bin/bash
set -e
function ip_to_int()
{
local IP="$1"
local A=$(echo $IP | cut -d. -f1)
local B=$(echo $IP | cut -d. -f2)
local C=$(echo $IP | cut -d. -f3)
local D=$(echo $IP | cut -d. -f4)
local INT
INT=$(expr 256 "*" 256 "*" 256 "*" $A)
INT=$(expr 256 "*" 256 "*" $B + $INT)
INT=$(expr 256 "*" $C + $INT)
INT=$(expr $D + $INT)
echo $INT
}
function int_to_ip()
{
local INT="$1"
local D=$(expr $INT % 256)
local C=$(expr '(' $INT - $D ')' / 256 % 256)
local B=$(expr '(' $INT - $C - $D ')' / 65536 % 256)
local A=$(expr '(' $INT - $B - $C - $D ')' / 16777216 % 256)
echo "$A.$B.$C.$D"
}
scan_ip
#!/bin/bash
set -e
source ip2int
if [[ $# -ne 1 ]]; then
echo "Usage: $(basename "$0") ip_address_number"
exit 1
fi
CONNECT_TIMEOUT=2 # in seconds
IP_ADDRESS="$(int_to_ip ${1})"
set +e
data=$(curl --head -vs -m ${CONNECT_TIMEOUT} https://${IP_ADDRESS}:443 2>&1)
exit_code="$?"
data=$(echo -e "${data}" | grep "Server: ")
# wasn't sure what are you looking for in your servers
set -e
if [[ ${exit_code} -eq 0 ]]; then
if [[ -n "${data}" ]]; then
echo "${IP_ADDRESS} - ${data}"
else
echo "${IP_ADDRESS} - Got empty data for server!"
fi
else
echo "${IP_ADDRESS} - no server."
fi
扫描范围
#!/bin/bash
set -e
source ip2int
START_ADDRESS="10.0.0.0"
NUM_OF_ADDRESSES="16777216" # 256 * 256 * 256
start_address_num=$(ip_to_int ${START_ADDRESS})
end_address_num=$(( start_address_num + NUM_OF_ADDRESSES ))
seq ${start_address_num} ${end_address_num} | parallel -P0 ./scan_ip
# This parallel call does the same as this:
#
# for ip_num in $(seq ${start_address_num} ${end_address_num}); do
# ./scan_ip ${ip_num}
# done
#
# only a LOT faster!
迭代方法的改进:
原生 for 循环的运行时间(对于 256*256*256 个地址估计需要 200 天)改进为一天以内根据@skrskrskr。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)