渗透中,当我们拿下一个linux服务器作为跳板去进一步渗透内网时,往往需要收集内网资产以扩大攻击范围,通过扫描去收集是常用手段之一,但是考虑到对方可能部署的一些安全手段,如果扫描出现过于明显的特征将触发安全警报,导致我们前功尽弃,所以一些非常规的扫描手段是非常有必要的。
通常情况下,可以使用linux系统默认自带的旧版nmap和阉割版nc进行扫描,但是这两个工具可以说是重点关注对象了,我们需要看起来更加正常的行为去扫描,尽量使用系统常规功能去完成。
一、ping批量探测存活主机
内网环境下禁ping的不多,所以我们通过批量ping去探测存活主机是一个不错的选择,如下简单的扫描c段存活ip的shell脚本示例:
(1)扫描指定c段
#!/bin/bash
for ip in $(seq 1 254)
do
ping -c 1 10.1.0.$ip &>/dev/null
if [ $? -eq 0 ];then
echo 10.1.0.$ip >>up.txt
fi
done
(2)扫描指定ip列表
#!/bin/bash
for ip in `cat iplist.txt` #一个ip一行
do
ping -c 1 $ip &>/dev/null
if [ “$?” = 0 ];then
echo $ip >>up.txt
fi
done
这样扫描的好处是不依赖任何第三方,只需要使用系统自带功能即可完成探测,不容易触发安全规则,但是效率较低,不适合大批量的扫描,而且如果服务器禁ping或者把UDP数据包屏蔽了,就没有返回ICMP。
除了ping可以扫描之外,内网使用traceroute探测同路由下存活ip也是不错的选择,同路由下,存活的ip使用traceroute只有一节点,不存活时会尝试多个节点,所以也是一个很好的判断依据,当然使用arp -a、netstat -an也可以给出一些结果。
同路由下traceroute存活ip,只测试一节点
server:~ admin$ traceroute 192.168.0.103
traceroute to 192.168.0.103 (192.168.0.103), 64 hops max, 52 byte packets
1 192.168.0.103 (192.168.0.103) 103.589 ms 3.100 ms 13.657 ms
同路由下traceroute不存活ip,要测试多节点
server:~ admin$ traceroute 192.168.0.222
traceroute to 192.168.0.222 (192.168.0.222), 64 hops max, 52 byte packets
1 * * *
2 * *traceroute: sendto: No route to host
traceroute: wrote 192.168.0.222 52 chars, ret=-1
……
在禁ping的情况下,同样可以编写bash脚本使用traceroute进行存活主机探测,但是效率可能会更低一点。
二、telnet批量探测开放端口
探测了存活ip,那么接下来需要探测开放的端口服务,telnet再合适不过,简单的端口探测shell脚本如下:
#!/bin/bash
function sport ()
{
for ip in $(cat ips.txt) #一行一个ip
do
for port in `cat ports.txt` #一行一个端口
do
t=`echo -e ‘\n’|telnet $ip $port|grep -i “Connected”|awk ‘NR==1{print}’|awk -F ” ” ‘{print $1}’`
if [ “$t”x = “Connected”x ];then
echo $ip $port >>open.txt
fi
done
done
}
sport
exit 0
相对于专业端口扫描器,使用shell脚本去扫描效率会低很多,但是这个行为更容易被安全规则忽略。
而且,不单单是可以通过telnet协议进行扫描端口,ftp、curl、wget甚至ssh都可以用来进行端口扫描探测,能避免绝大部分安全手段的监控,让扫描更加隐蔽!
(1)利用ftp扫描判断依据
ftp探测开放的端口,立刻返回“Connected to”特征
server:~ admin$ ftp 192.168.1.1 80
Connected to 192.168.1.1.
ftp探测未开放的端口,长时间无返回信息
server:~ admin$ ftp 192.168.1.1 81
ftp: Can’t connect to `192.168.1.1′: Operation timed out
ftp: Can’t connect to `192.168.1.1′
(2)利用curl扫描判断依据
curl探测开放的端口,立刻返回”GET”特征
server:~ admin$ curl 192.168.1.1:23
??????!????GET / HTTP/1.1
Host: 192.168.1.1:23
User-Agent: curl/7.49.1
Accept: */*
curl探测未开放的端口,立刻返回”Connection refused”特征
server:~ admin$ curl 192.168.1.1:22
curl: (7) Failed to connect to 192.168.1.1 port 22: Connection refused
(3)利用wget扫描判断依据
wget探测开放的端口,立刻返回”GET”特征
server:~ admin$ wget 192.168.1.1:23
–2016-11-22 15:33:31– http://192.168.1.1:23/
Connecting to 192.168.1.1:23… connected.
HTTP request sent, awaiting response… 200 No headers, assuming HTTP/0.9
Length: unspecified
Saving to: ‘index.html’
wget探测未开放的端口,立刻返回”Connection refused”特征
server:~ admin$ wget 192.168.1.1:22
–2016-11-22 15:33:22– http://192.168.1.1:22/
Connecting to 192.168.1.1:22… failed: Connection refused.
(4)利用ssh扫描判断依据
ssh探测开放的端口,立刻返回”Connection reset by peer”特征
server:~ admin$ ssh 192.168.1.1 -p 80
ssh_exchange_identification: read: Connection reset by peer
ssh探测未开放的端口,立刻返回”Connection refused”特征
server:~ admin$ ssh 192.168.1.1 -p 81
ssh: connect to host 192.168.1.1 port 81: Connection refused
根据这些特征,可以利用telnet扫描脚本修改即可进行端口扫描。
当然linux系统自带很多其它系统工具,都可以尝试,而且基本自带python、perl,除了shell脚本,也可以写python、perl脚本,有时候更高效!
windows下编写vbs、bat也同样可以进行类似扫描!