web渗透第一步之信息搜集 [ 端口渗透 ]



0x01 扫描前奏

    开始正式的说明之前,我们不妨先来简单了解下telnet,这也是到目前为止,个人认为最靠谱的tcp端口扫描工具,没有之一,如果你只是想快速地探测目标的某几个tcp端口是否开放,直接telnet一下,无疑是极好的,也根本犯不着一上来就搂着专业的端口扫描工具去一通乱扫,这样做可以有效避免因某些工具动静儿过大[如,nmap之流…],而造成一些不必要的麻烦,如,触发对方防护报警[后续再搞很可能就要换ip了,tor暂时也不是想象的那么好用],简单使用实例,如下:

1
2
3
4
# telnet cc.target.edu.hk 1443
# telnet cc.target.edu.hk 3389
# telnet cc.target.edu.hk 22
...

0x02 关于端口扫描工具
    除了用telnet对某单个机器进行快速常规高危端口探测之外,如果我们想短时间内对多个目标进行批量端口扫描,又该怎么办呢,这里就简单介绍下几款经常会用到的公网端口扫描工具,masscan和zmap,同是基于无状态的的端口扫描,这里顺便科普下什么是无状态,简单来说,普通的端口扫描工具,在发出请求包以后还有一个等待数据回应的过程,然后根据回应的数据包头标志(不同系统平台的协议栈对每种标志的数据包响应状态也是不一样的)以此来判断目标的某个端口或者服务是否开放,用的什么操作系统等等……但这样做,无疑会很大程度上拖慢扫描速度,所以,后来大牛们就搞出了无状态扫描,这也就意味着,当请求包发送以后就被不再管了,也不再等待回应,所有的验证都放在数据包本身,这可能也是它快的主要原因,另外,此类工具为了减少触发目标ids的几率,都采用了分组扫描算法[这种东西其实并不算新奇],让扫描的ip随机分布[尽可能规避目标防护],而不是密麻集中在某个点……好了,简单科普就先到这里,过深的东西,也不是我目前的能力所能企及的,关键我们能把工具用起来就行,接着就来分别介绍下两款工具的一些常规用法,实际渗透中,个人还是更推荐masscan…原因我这里不多嘴了,还是留给大家,自行慢慢体会吧

0x03 masscan [扫描速度取决于你的实际带宽,默认只扫描tcp端口,但也可扫udp]:

1
https://github.com/robertdavidgraham/masscan

masscan 常用选项:

1
2
3
4
5
6
7
8
-p 指定要扫描的端口,同时指定多个端口要用逗号隔开
--rate 指定发包速率,根据你自己的实际带宽来定,我自己是20M的光纤,一般给1000足矣,一两兆的vpn,给100就差不多了,都是粗略估计的,懒的算
--open-only 仅显示开放的端口
--banners 获取banners
-c 使用自定义的扫描配置文件
--ping 扫之前是否要先ping下目标
-oL 把扫描结果存到指定文件中
--excludefile 排除不扫描的ip段

masscan 配置文件格式,如下:

1
2
3
4
5
6
7
8
9
10
# klion masscan config '#'表注释
rate =1000.00 # 指定发包速率,根据自己的实际带宽计算
output-format=list # 指定扫描结果保存的文件格式,这里我就用最普通的文本存,当然,它是支持直接输出成xml格式的,后续方便用程序处理
output-filename=/root/Desktop/port_hacking.txt # 指定要把扫描的结果文件保存到哪里
output-status=open # 只保留开放的端口信息
ports=80,443,8080,U:53 # 指定要扫描的端口,默认tcp,当然,你也可以指定UDP的端口,U即udp
range=203.174.48.0/24 # 指定要扫描的ip段,可以连续指定多个,中间记得逗号隔开就好了
ping=false # 扫描的时候要不要先ping下,true表示真,即ping
banners=true # 获取端口banner信息
excludefile=/etc/zmap/blacklist.conf # 指定不扫描的ip段,可以把不想扫描的一些ip段都加到这个文件中,如:内网ip段是不需要扫的

masscan 实例用法[支持同时进行tcp及udp扫描]:

1
2
手工指定选项扫描
# masscan --rate=1000 -p21,22,23,25,U:69,110,143,U:161,80,81,82,83,88,443,445,512,513,514,1433,1521,2082,2083,2181,2601,2604,3128,3690,4848,8088,8086,8081,8080,3306,5432,3389,5984,6379,7001,7002,8069,9200,9300,11211,10000,27017,27018,50000,50070,50030 --banners 202.181.132.0/24 103.15.135.0/24 203.174.48.0/24 203.124.10.0/24 202.65.218.0/24 202.181.196.0/24 -oL port_hacking.txt

1
2
直接加载自定义配置文件进行扫描
# masscan -c masscan.conf

一句话快速锁定各类敏感服务特征:

1
# cat port_hacking.txt | egrep "ProFTPD|vsFTPd|FileZilla Server|Microsoft FTP Service|Pure-FTPd|OpenSSH|Remote Management Console|User Access Verification|Welcome to the server management|imap|smtp|pop|snmp"


0x04 zmap [扫描速度依然是取决于你的实际带宽,不过,在实际测试中准确率要比masscan稍差,同样的目标,masscan能扫出来,zmap却扫不出来,内部具体原因,暂未深究]:

1
其官方站点: https://zmap.io

1
2
3
4
5
6
7
8
9
10
11
12
zmap常用选项 [选项作用其实跟masscan差不太多,只不过zmap默认是tcp模式扫描,如果要用其它的协议扫描就必须自己单独用选项指定]:
[注意:如果你要手工指定扫描选项,就务必先把zmap.conf文件中的所有选项都注释掉,不然会出错,原因暂未知,貌似它默认应该会先读取这个文件,一般我都是直接把它默认的配置文件选项全部注释掉,直接手工指定扫描选项]:
-p 指定要扫描的端口
-b 指定扫描ip黑名单,如,内网ip,我们是不需要扫的
-o 保存扫描结果到指定的文件中
-w 可以把要扫描的ip段事先都放在一个文件中,进行批量扫描,注意格式,一行对应一个ip段
-r 指定扫描发包速率
-B 指定你的实际带宽,比如你带宽10M,实际指定4-6M即可
-C 也可以直接加载自定义配置文件进行扫描
-s 在扫描完成后进行简单汇总
--probe-module=icmp_echoscan icmp模式扫描
--probe-module=udp udp模式扫描

zmap 扫描配置文件格式说明:

1
2
3
4
5
6
7
interface "eth0" # 指定用于扫描的网卡接口
probe-module tcp_synscan # 扫描模式,默认是是tcp的syn
target-port 3389 # 要扫描的端口,不知道为什么在配置文件中不能同时指定多个,难道是我格式写错了,回头抽空再好好看看帮助
rate 100 # 设置发包速率
bandwidth 1M # 设置带宽
blacklist-file "/etc/zmap/blacklist.conf" # 指定扫描黑名单ip段[如,内网ip,特殊ip,所有你不想扫描的ip...]
output-file "/root/Desktop/port_res.txt" # 指定扫描结果的存放位置


zmap 常规用法 [ 支持tcp,udp,icmp模式扫描,最好不要挂vpn扫,原因暂未知,即使加上–vpn貌似也不太好使 ]:

1
# zmap -B 1M -p [21,22,23,25,110,143,80,81,82,83,88,443,445,512,513,514,1433,1521,2082,2083,2181,2601,2604,3128,3690,4848,8088,8086,8081,8080,3306,5432,3389,5984,6379,7001,7002,8069,9200,9300,11211,10000,27017,27018,50000,50070,50030] -b /etc/zmap/blacklist.conf -r 1000 202.181.132.0/24 -o Desktop/port_res.txt


1
# zmap -C /etc/zmap/zmap.conf 202.181.132.0/24 加载自定配置文件进行扫描


0x05 在用上面两款工具时,有些地方还是需要注意下:

1
2
3
4
5
6
实际使用中,最好先根据你的实际带宽估算下最合适的发包速率,因为你的带宽和发包的速率会直接影响扫描结果的准确性
像这类的工具一般对带宽和速率的控制要求比较高,还有,在扫描之前它会预先提示你要扫描多少台机器,机器的多少也是根据你所给的掩码自动算出来的
扫完以后,先随便telnet几个ip的端口,看看精度如何,务必不要过度的依赖这些工具扫出来的结果
不单单是针对这两款工具,对所有工具都是如此,理解作者的实际编写思路比使用工具本身更重要,因为这是灵活运用的前提
即使你暂时还写不出来很优秀的代码,但总有一天你会写出来的,先把自己的基础打好
假如以后你想在这方面继续深入,这些都是很优秀的学习样板,所以过硬的编码能力在任何时候都跑不掉,贵在坚持嘛

0x06 最后再来看下老旧的 nmap,作为一款家喻户晓的探测工具,想必大家对它早已经非常熟悉 [一直为人诟病的是老版本速度非常慢,可能是发包然后等待验证的过程比较复杂吧,不过,新版本确实已经改进不少],一般在linux目标机器中稍微懂一些的运维都会把这个预先装上,这样反而极大的方便了我们:

1
# nmap -v 192.168.3.240 扫描某单个目标[目标可以是域名,ip后者ip段]

1
# nmap -iL ip.txt 同时扫描多个目标,把目标的ip/ip段事先放在一个文件中,每行对应一个
1
# nmap -Pn 192.168.3.240 扫描前先不要ping
1
# nmap -sV -v 192.168.3.240 探测远程机器上详细的服务信息,如,详细的名称版本,有banner的可能直接就把banner获取过来了,没banner的可能就慢慢的匹配特征,耗时会相对较长
1
# nmap -O -v 192.168.3.240 探测远程操作系统平台,如内核名称,版本...
1
2
3
扫描自己指定的端口,默认如果你不指定端口,它会自动扫描事先写死在程序中的1000个高危端口
# nmap -p 80,81,82,83,84,1433 192.168.3.189
# nmap -p U:53,111,137,T:21-25,80,139,8080 192.168.3.189
1
2
全面扫描目标主机的所有信息,包括操作系统,端口,服务,相当于-O -sV 的总和……
# nmap -A -v 192.168.3.240
1
2
3
4
5
快速扫描整个C段,速度级别从05,默认用icmp请求,极易被防火墙阻拦
# nmap -T5 -v 192.168.3.240
# nmap -T5 -v 192.168.3.0/24
# nmap -T5 --open 192.168.3.0/24
# nmap -v 192.168.3.1-10
1
# nmap --packet-trace 192.168.3.0/24 观察扫描时的详细发包过程
1
# nmap -sU 192.168.3.240 所谓隐蔽的UDP扫描,其实并不隐蔽
1
2
3
4
几种常用的扫描方式,tcp的syn和ack扫描另外还有connect(推荐用这个)
# nmap -sT 192.168.3.240 个人推荐的扫描方式
# nmap -sS 192.168.3.240
# nmap -sA 192.168.3.240
1
2
内网arp扫描,探测内网存活主机还是非常不错的,可轻易bypass掉各种应用层防火墙,既然是arp就没必要扫端口了,所以记得带上 -sn 选项 禁用端口扫描
# nmap -sn -PR 192.168.3.0/24
1
2
最常用的nmap组合,其实关于nmap的这些基本选项用法,不说大家也应该都早用的熟透了,每个选项参数作用在工具帮助里就已经说的非常清楚
# nmap --open -p port -Pn -v -sT -sV --script script_name ip/domain/cidr

0x07 如何快速对目标网站的一些基本情况做简要判断,如,对方用的什么web服务器,后端脚本是啥,数据库是啥,系统平台又是啥等……,下面就来简单熟悉一些常见的web架构:

1
2
3
4
5
6
asp + access + iis5.0/6.0 + win2003/03r2
aspx + mssql2005/mssql2008 + iis7.0/iis7.5 + win2008/08r2
php[5.2,5.4,5.6] + mysql[5.1,5.5]/postgresql + apache[2.2,2.4]/iis + linux/win
php/jsp + mysql + ngnix + linux/win
java/jsp + oracle/mssql + tomcat + linux/win
……

利用httprint 识别web目标服务器指纹 [ 其实是个比较鸡肋的一个小工具,一般看下响应头中的server字段就有了,不过,这里的并不准,很容易被改掉 ]:

1
# httprint -h 144.214.20.118 -s ./Desktop/signature.txt

1
2
web服务器指纹字典下载地址:
http://www.net-square.com/signature.txt

常用的几个相对比较实用的firefox插件,自己在配置渗透环境的时候最好都预先装上:

1
2
3
4
5
6
hackbar
tamper data
live http headers
firebug
downthemall
...

使用 whatweb [探测到的信息相对比较全面],返回的结果中大致包括以下内容:

1
2
3
4
5
6
7
8
请求返回的状态码
web服务器版本
ip所在国家
操作系统详细的版本信息
脚本语言版本信息
域名解析到的ip
截取并显示网站标题
等等……

如何快速判断目标使用的系统平台:

1
2
3
在url中尝试变化大小写,进行请求,观察页面响应,windows默认对大小写不敏感,linux则严格区分大小写,所以返回的页面肯定是不一样的
观察各种报错信息,看看里面有没有泄露服务器的相关信息
等等……

0x08 一些常见端口渗透用途汇总:

端口号 端口服务/协议简要说明 关于端口可能的一些渗透用途
tcp 20,21 ftp 默认的数据和命令传输端口[可明文亦可加密传输] 允许匿名的上传下载,爆破,嗅探,win提权,远程执行(proftpd 1.3.5),各类后门(proftpd,vsftp 2.3.4)
tcp 22 ssh[数据ssl加密传输] 可根据已搜集到的信息尝试爆破,v1版本可中间人,ssh隧道及内网代理转发,文件传输,等等…常用于linux远程管理…
tcp 23 telnet[明文传输] 爆破,嗅探,一般常用于路由,交换登陆,可尝试弱口令,也许会有意想不到的收获
tcp 25 smtp[简单邮件传输协议,多数linux发行版可能会默认开启此服务] 邮件伪造,vrfy/expn 查询邮件用户信息,可使用smtp-user-enum工具来自动跑
tcp/udp 53 dns[域名解析] 允许区域传送,dns劫持,缓存投毒,欺骗以及各种基于dns隧道的远控
tcp/udp 69 tftp[简单文件传输协议,无认证] 尝试下载目标及其的各类重要配置文件
tcp 80-89,443,8440-8450,8080-8089 web[各种常用的web服务端口] 各种常用web服务端口,可尝试经典的top n,vpn,owa,webmail,目标oa,各类java控制台,各类服务器web管理面板,各类web中间件漏洞利用,各类web框架漏洞利用等等……
tcp 110 [邮局协议,可明文可密文] 可尝试爆破,嗅探
tcp 137,139,445 samba[smb实现windows和linux间文件共享,明文] 可尝试爆破以及smb自身的各种远程执行类漏洞利用,如,ms08-067,ms17-010,嗅探等……
tcp 143 imap[可明文可密文] 可尝试爆破
udp 161 snmp[明文] 爆破默认团队字符串,搜集目标内网信息
tcp 389 ldap[轻量级目录访问协议] ldap注入,允许匿名访问,弱口令
tcp 512,513,514 linux rexec 可爆破,rlogin登陆
tcp 873 rsync备份服务 匿名访问,文件上传
tcp 1194 openvpn 想办法钓vpn账号,进内网
tcp 1352 Lotus domino邮件服务 弱口令,信息泄漏,爆破
tcp 1433 mssql数据库 注入,提权,sa弱口令,爆破
tcp 1521 oracle数据库 tns爆破,注入,弹shell…
tcp 1500 ispmanager 主机控制面板 弱口令
tcp 1025,111,2049 nfs 权限配置不当
tcp 1723 pptp 爆破,想办法钓vpn账号,进内网
tcp 2082,2083 cpanel主机管理面板登录 弱口令
tcp 2181 zookeeper 未授权访问
tcp 2601,2604 zebra路由 默认密码zerbra
tcp 3128 squid代理服务 弱口令
tcp 3312,3311 kangle主机管理登录 弱口令
tcp 3306 mysql数据库 注入,提权,爆破
tcp 3389 windows rdp远程桌面 shift后门[需要03以下的系统],爆破,ms12-020[蓝屏exp]
tcp 4848 glassfish控制台 弱口令
tcp 4899 radmin远程桌面管理工具,现在已经非常非常少了 抓密码拓展机器
tcp 5000 sybase/DB2数据库 爆破,注入
tcp 5432 postgresql数据库 爆破,注入,弱口令
tcp 5632 pcanywhere远程桌面管理工具 抓密码,代码执行,已经快退出历史舞台了
tcp 5900,5901,5902 vnc远程桌面管理工具 弱口令爆破,如果信息搜集不到位,成功几率很小
tcp 5984 CouchDB 未授权导致的任意指令执行
tcp 6379 redis未授权 可尝试未授权访问,弱口令爆破
tcp 7001,7002 weblogic控制台 java反序列化,弱口令
tcp 7778 kloxo 主机面板登录
tcp 8000 Ajenti主机控制面板 弱口令
tcp 8443 plesk主机控制面板 弱口令
tcp 8069 zabbix 远程执行,sql注入
tcp 8080-8089 Jenkins,jboss 反序列化,控制台弱口令
tcp 9080-9081,9090 websphere控制台 java反序列化/弱口令
tcp 9200,9300 elasticsearch 远程执行
tcp 10000 webmin linux主机web控制面板入口 弱口令
tcp 11211 memcached 未授权访问
tcp 27017,27018 mongodb 爆破,未授权访问
tcp 3690 svn服务 svn泄露,未授权访问
tcp 50000 SAP Management Console 远程执行
tcp 50070,50030 hadoop 默认端口未授权访问


0x09 说了这么多,想必大家应该很清楚这些端口具体该怎么利用了

0x10 最后,在介绍个小脚本,whatportis 专门用来查询某个端口具体作用的

0x11 如果你有兴趣,想针对某个国家网段进行大规模扫描也可以把它写成这样,当然,我这里是随便写的,你要想实际用肯定是远远不够的,单单只是提供个小demo,能自动化的事情还有很多,写个shell还是比较简单的,还是留给大家根据自己的实际需求自行发挥吧,反正工具就在那里,相互配合才能出效果,各自为战是很难有所作为的

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
while read LINE
do
masscan -p 21 --rate=100 $LINE | tee -a 21.txt
done < hk_ip.txt
# tail -f 21.txt
# awk {'print $6'} 21.txt >> result.txt
# nmap -p 21 -iL result.txt -oN ftp_anonymous.txt -v --script ftp-anon.nse


后话:
    关于端口渗透,如果不是你自己写工具的情况下,其实本身使用上并没多少技术含量,至于无状态扫描的具体内部实现还是比较复杂的,至今为止,很多东西我自己也扔在学习中,如果大家真想深入去理解,非常建议自己直接拿着wireshark一边跑一边认真观察分析,没有什么比数据包更能说明问题,篇幅限制,这里我就不一一把每种扫描方式都带着大家跑一遍了,有些东西还是需要自己亲自尝试,不然,别人的东西永远都只是别的,端口这个东西,怎么说呢,有很多运气和经验敏感度的成分在里面,可能还要外加一个高质量的字典,另外,再多说一句,在没有十足的把握的情况下,直接在公网跑字典基本是不太靠谱的,实际测试中,对一些稍有防护的目标,爆破的成率还是蛮低的[虽然低,但往往非常有效,走投无路时不妨尝试],当然啦,对于端口,爆破只是很小的一个方面,比如,当我们发现某个工具或者系统服务存在远程溢出或者代码执行[不仅限于此类的可远程利用的漏洞,任何可以直接远程主动getshell的都可以],还是那句话,如果你手里有某个主流服务的通杀远程0day,不管是你自己挖的还是买的,也许只有这时才能体现端口扫描的真正价值,另外,还有多如牛毛的小工具,这里都没提到,后续涉及到内网时我们再仔细说明,对于公网扫描,有这些,暂时足矣,祝大家好运,切记不要干坏事就好!