常见端口:
| 端口 | 服务 |
|---|---|
| 21 | 默认是ftp端口,主要看是否支持匿名,也可以跑弱口令 |
| 22 | 默认是shh端口 |
| 23 | 默认是telnet端口 |
| 25 | 默认是smtp服务 |
| 53 | 默认是DNS |
| 123 | NTP |
| 161,162,8161 | snmp服务(8161 IBM以款产品开放的SNMP) |
| 389 | ldap团体 |
| 80 | http服务 |
| 443 | https服务 |
| 512,513 | rlogin服务或者是exec |
| 873 | rsync 主要是看是否支持匿名,也可以跑弱口令 |
| 1433 | mssql数据库 |
| 1080 | socks代理 |
| 1521 | oracle数据库 |
| 1900 | bes默认后台 |
| 2049 | nfs服务 |
| 2601,2604 | zebra路由,默认密码zebra |
| 2028,2083 | cpanel主机管理系统 |
| 3128,3312 | squid代理默认端口,如果没设置口令很可能就直接漫游内网了 |
| 3306 | mysql数据库 |
| 4899 | R-admin连接端 |
| 4440 | rundeck 参考WooYun:借用新浪某服务成功漫游新浪内网 |
| 8834 | nessus服务 |
| 4848 | glashfish |
| 3311,3312 | kangle主机管理系统 |
| 3389 | 远程登录 |
| 5672 | rabbitMQ |
| 5900 | VNC |
| 6082 | varnish 参考WooYun:Varnish HTTP accelerator CLI未授权访问易导致网站直接篡改或者作为代理进入内网 |
| 6379 | redis 一般无认证,可直接访问 |
| 7001 | weblogic |
| 8080 | tomcat |
| 8089 | jboss |
| 8161 | activeMQ |
| 8649 | ganglia集群系统监控软件 |
| 9000 | fastcgi服务 |
| 9090 | IBM服务 |
| 9200,9300 | elasticsearch 参考WooYun:多玩某服务器ElasticSearch命令执行漏洞 |
| 9999 | amg加密版 |
| 10050 | zabbix |
| 11211 | memcache未授权访问 |
| 27017,28017 | mongodb未授权访问,默认无口令登录 |
| 3777 | 大华监控设备 |
| 50000 | sap netweaver远程命令执行漏洞 |
编写自己的TCP端口扫描器,利用TCP全连接扫描来识别主机,首先导入socket模块:
socket.gethostbyname(hostname):将主机名换为IP地址;
socket.gethostbyaddr(ip_address):传入一个IP地址返回一个元组,其中包含主机名,别名列表和同一接口的IP地址列表;
socket.socket([family[,type[,proto]]]):将产生一个新的socket,通过给定的socket地址簇和socket类型,地址簇可以是AF_INET(默认),AF_INET6或者是AF_UNIX,另外,socket类型可以为一个TCP套接字即SOCK_STREAM(默认),或者是UDP套接字即SOCK_DGRAM,或者其他的套接字类型。最后协议号通常为零,再大多数情况下省略不写。
socket.connect(address):连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
socket.connect_ex(adddress):功能与connect(address)相同,但是成功返回0,失败返回error的值。
第一步要输入目标主机名和要扫描的端口列表。然后通过目标主机名得到目标的网络IP地址。用列表里的每一个端口取连接目标地址,最后确定端口上运行的特殊服务。最后将发送特定数据,并读取特定应用程序返回的标识。帮助信息确定完之后,需要对特定端口和主机进行socket连接,最终查看端口连接状态。使用多线程的方式来提升速度。
源代码如下
import optparse
import socket
import threading
import re
screenLock = threading.Semaphore(value=1)
def connScan(tgtHost, tgtPort):
try:
connSkt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = connSkt.connect_ex((tgtHost, tgtPort))
# connSkt.send(b'test')
# results = connSkt.recv(100)
screenLock.acquire()
if (result == 0):
print('[+] {0}:{1} /tcp open'.format(tgtHost, tgtPort))
# else:
# print('[-] %d/tcp closed' % tgtPort)
# print('[-] ' + str(results))
# connSkt.close()
except:
screenLock.acquire()
print('[-] error')
finally:
screenLock.release()
connSkt.close()
def portScan(tgtHost, tgtPorts):
try:
tgtIP = socket.gethostbyname(tgtHost)
except Exception as e:
print("[-] Cannot resolve '%s':Unknown host" % tgtHost)
return
# try:
# tgtName = socket.gethostbyaddr(tgtIP)
# print('\n[+]Scan Results for '+tgtName[0])
# except:
print('\n[+] Scan Results for ' + tgtIP)
socket.setdefaulttimeout(1)
for tgtPort in tgtPorts:
# print('[+] Scaningport' + str(tgtPort))
t = threading.Thread(target=connScan, args=(tgtHost, int(tgtPort)))
t.start()
# connScan(tgtHost,int(tgtPort))
def main():
parser = optparse.OptionParser('usage %prog -H <target host> -p <target port>')
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPort = options.tgtPort
if '-' in tgtPort:
Ports = re.findall(r'[0-9]{1,5}', tgtPort)
first = int(Ports[0])
last = int(Ports[1])
for i in range(first, last + 1):
args.append(i)
else:
args.append(int(tgtPort))
if (tgtHost == None) | (tgtPort == None):
print('[-] You must specify a target host and port[s]!')
exit(0)
portScan(tgtHost, args)
if __name__ == '__main__':
main()
运行结果与masscan对比:


该博客介绍了如何使用Python编写一个TCP端口扫描器,通过socket模块进行网络连接,扫描目标主机上的指定端口,识别开启的服务。扫描器采用多线程提高扫描速度,并展示了与masscan工具的对比结果。

被折叠的 条评论
为什么被折叠?



