零基础封神!10行代码写渗透专用爬虫,一键扫遍靶场敏感资产

上一篇我们一起打破了认知壁垒,焊死了合规红线,用3行代码跑通了第一个渗透型爬虫。

很多粉丝后台私信我说,第一次跑通代码,看到命令行里打印出靶场所有链接的时候,那种实打实的成就感,比啃了半年理论书都强。还有很多人问,能不能再教点更实用的?比如怎么快速找到网站的后台?怎么扫出隐藏的敏感文件?

我太懂这种需求了。

我刚入门的时候,也踩过一模一样的坑:想找网站后台,手动一个个试admin、login、manage,试了几十次都不对;用现成的扫描工具,扫出来几百个结果,90%都是404无效垃圾数据,还有一堆看不懂的路径,我根本不知道哪个是真的后台,哪个是没用的噪音,折腾了一下午,啥也没找到,差点就放弃了。

今天这篇,我就带你用10行核心代码,写一个属于你自己的渗透专用目录扫描爬虫,精准定位后台、备份文件、robots.txt这些渗透核心目标,没有垃圾结果,没有看不懂的输出,新手复制粘贴,1分钟就能跑通,直接拥有自己的第一个渗透工具。

痛点破局:为什么现成工具,反而不如自己写的10行代码好用?

很多新手上来就问:“大佬,有没有最好用的扫描工具?给我发一个。”

但你有没有发现,那些号称“全能”的扫描工具,对你这种新手来说,反而特别难用:

  • 垃圾结果太多:工具为了覆盖所有场景,会扫几万条路径,出来90%都是404,你要一个个筛选,筛选到吐;
  • 定制化太差:你只想扫后台和备份文件,它非要给你扫一堆没用的插件路径,你想改都不知道从哪下手;
  • 特征太明显:很多工具的请求头、请求频率,早就被WAF拉黑名单了,你还没扫完,IP就被封了;
  • 看不懂原理:工具扫出来结果,你也不知道它是怎么扫的,为什么这个路径是有效的,下次遇到新场景,你还是不会。

而我们自己写的渗透型目录扫描爬虫,完全不一样:

  • 我们不追求大而全,只精准打我们关心的核心渗透目标,结果干净,没有垃圾;
  • 我们想加什么路径就加什么,想怎么过滤就怎么过滤,完全定制化;
  • 我们可以自己控制请求频率、请求头,不会被WAF拦,也不会打崩靶场;
  • 每一行代码都是你自己写的,你完全懂它的原理,下次遇到新场景,你自己就能改。

核心原理精讲:5分钟搞懂,目录扫描到底是个啥?

在写代码之前,我先给你把底层逻辑讲透,零基础也能听懂,保证你知其然,也知其所以然。

什么是目录扫描?

说白了,就是我们提前准备好一份常见的敏感路径列表(业内叫“字典”),然后我们拿着这份列表,一个个去问服务器:“你有没有这个路径啊?”

服务器会给我们返回一个状态码,我们根据状态码,就能判断这个路径到底存不存在:

  • 200 OK:路径存在,而且我们能正常访问,这就是我们要找的核心目标;
  • 403 Forbidden:路径存在,但是服务器不让我们访问,说明这个路径是真的,只是我们没权限,也是有效结果;
  • 301/302 Found:路径存在,但是会跳转到别的页面(比如后台登录页,没登录就会跳转到登录页),也是有效结果;
  • 404 Not Found:路径不存在,直接过滤掉,不用管。

我们的核心逻辑:精准打击,拒绝垃圾

普通的工具,是拿着几万条的大字典,一个个扫,扫完把所有结果都给你。

而我们的渗透型爬虫,入门阶段,只拿最常见的20条核心路径来扫:

  • 后台路径:admin、login、manage、system、admin.php、login.html这些;
  • 敏感文件:robots.txt、phpinfo.php、web.config、.git、.env这些;
  • 备份文件:backup.zip、wwwroot.zip、site.bak、sql.sql、database.sql这些。

这些都是渗透测试中,最有价值的目标,我们只扫这些,所以速度快,结果干净,没有垃圾,新手一眼就能看懂。

保姆级实战:10行代码,写一个能跑的扫描爬虫

话不多说,直接上代码。全程都是在我们上一篇搭建的本地DVWA靶场运行,100%合法合规,没有任何法律风险,新手复制粘贴,就能直接跑通。

基础版:10行核心代码,极简实现

这是我们的核心版本,只有10行代码,没有任何复杂依赖,逐行注释,零基础也能看懂每一行在干嘛:

import requests

# 目标地址:仅为本地搭建的DVWA靶场,禁止替换为任何未授权第三方网站
target = "http://localhost/dvwa/"
# 入门级敏感路径字典,只包含最高价值的核心目标
dict_list = ["admin", "login", "login.php", "robots.txt", "phpinfo.php", 
             "backup.zip", ".git", "manage", "system", "web.config"]

# 核心扫描逻辑
for path in dict_list:
    url = target.rstrip("/") + "/" + path
    try:
        r = requests.get(url, timeout=5)
        if r.status_code != 404:
            print(f"[+] 发现有效路径:{url} 状态码:{r.status_code}")
    except:
        pass

逐行讲解:零基础也能看懂

我给你把每一行的作用都讲清楚,保证你不是只会复制,而是真的懂:

  1. import requests:导入我们上一篇安装的requests库,用来发送HTTP请求;
  2. target = "http://localhost/dvwa/":我们的目标,就是上一篇搭建的本地靶场,绝对不能改第三方地址
  3. dict_list:我们的字典,就是我们要测试的路径列表,都是最常见的敏感路径,入门足够用了;
  4. for path in dict_list::循环,把我们字典里的每个路径,都拿出来测一遍;
  5. url = target.rstrip("/") + "/" + path:拼接完整的URL,rstrip("/")是把目标末尾的斜杠去掉,防止出现http://localhost/dvwa//admin这种错误,保证路径拼接正确;
  6. try::异常捕获,防止某个路径请求出错,导致整个脚本崩溃;
  7. r = requests.get(url, timeout=5):给这个URL发请求,timeout=5是说,如果5秒没响应,就放弃这个路径,防止脚本卡着不动;
  8. if r.status_code != 404::如果状态码不是404,说明这个路径是存在的,我们就打印出来;
  9. except: pass:如果请求出错了(比如网络断了),就跳过这个路径,不要让整个脚本崩掉。

运行步骤:1分钟出结果

  1. 新建一个文本文档,把上面的代码复制进去,重命名为dir_scan.py
  2. 打开命令行,进入这个文件的文件夹,输入命令运行:
    python dir_scan.py
    
  3. 按下回车,等待10秒,你就能看到结果了!

正常情况下,你会看到类似这样的输出:

[+] 发现有效路径:http://localhost/dvwa/login.php 状态码:200
[+] 发现有效路径:http://localhost/dvwa/robots.txt 状态码:200
[+] 发现有效路径:http://localhost/dvwa/phpinfo.php 状态码:200

看到了吗?只用了10行代码,你就一键扫出了靶场的后台登录页、robots.txt、phpinfo这些核心渗透目标,没有任何垃圾结果,所有结果都是有用的,比那些工具好用10倍。

进阶优化:3个技巧,让你的脚本稳到离谱

基础版的脚本已经能用了,但是还有一些小问题,比如网络波动会丢包,或者被WAF拦截,我们加3个小优化,让你的脚本更稳,更实用。

优化1:加超时重试,解决网络波动丢包

有时候网络不好,一个请求没发出去,脚本就直接跳过了,我们加个重试机制,失败了就再试一次,保证不会漏掉有效路径:

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 创建一个带重试的会话
session = requests.Session()
retry = Retry(total=2, backoff_factor=0.1)
session.mount('http://', HTTPAdapter(max_retries=retry))
session.mount('https://', HTTPAdapter(max_retries=retry))

# 把原来的requests.get换成session.get
r = session.get(url, timeout=5)

优化2:加浏览器UA,避免被WAF拦截

默认的requests请求头,UA是python-requests/2.28.1,太明显了,WAF一眼就能认出这是爬虫,直接给你封了。我们改成浏览器的UA,模拟正常用户访问,就不会被拦了:

# 模拟Chrome浏览器的请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
}

# 发送请求时带上请求头
r = session.get(url, headers=headers, timeout=5)

优化3:加请求延迟,防止打崩靶场

新手最容易犯的错,就是上来就疯狂发请求,一秒发20个,结果直接把本地Apache服务器打崩了,靶场直接打不开,还要重启服务。我们加个0.1秒的延迟,每次请求完停一下,既不会影响速度,也不会打崩靶场:

import time

# 每次请求后延迟0.1秒
time.sleep(0.1)

优化后的完整代码

把这三个优化加进去,就是我们最终的稳定版脚本,新手直接用这个就行:

import requests
import time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 目标地址:仅为本地搭建的DVWA靶场,禁止替换为任何未授权第三方网站
target = "http://localhost/dvwa/"
# 入门级敏感路径字典,只包含最高价值的核心目标
dict_list = ["admin", "login", "login.php", "robots.txt", "phpinfo.php", 
             "backup.zip", ".git", "manage", "system", "web.config", ".env"]

# 模拟Chrome浏览器的请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
}

# 创建带重试机制的会话
session = requests.Session()
retry = Retry(total=2, backoff_factor=0.1)
session.mount('http://', HTTPAdapter(max_retries=retry))
session.mount('https://', HTTPAdapter(max_retries=retry))

print("="*50)
print("开始扫描靶场敏感路径...")
print("="*50)

# 核心扫描逻辑
for path in dict_list:
    url = target.rstrip("/") + "/" + path
    try:
        r = session.get(url, headers=headers, timeout=5)
        if r.status_code != 404:
            print(f"[+] 发现有效路径:{url} 状态码:{r.status_code}")
        time.sleep(0.1)
    except Exception as e:
        pass

print("="*50)
print("扫描完成!")
print("="*50)

实战验证:一键扫出靶场所有敏感资产

我们把这个优化后的脚本,在DVWA靶场跑一遍,看看效果:

==================================================
开始扫描靶场敏感路径...
==================================================
[+] 发现有效路径:http://localhost/dvwa/login.php 状态码:200
[+] 发现有效路径:http://localhost/dvwa/robots.txt 状态码:200
[+] 发现有效路径:http://localhost/dvwa/phpinfo.php 状态码:200
[+] 发现有效路径:http://localhost/dvwa/.git/config 状态码:200
==================================================
扫描完成!
==================================================

看到了吗?10秒不到,我们就扫出了4个核心敏感资产:

  1. login.php:靶场的后台登录页,这就是我们要找的后台入口;
  2. robots.txt:网站的爬虫协议,里面通常会藏着网站不想让搜索引擎爬的隐藏路径,打开就能看到;
  3. phpinfo.php:PHP信息页面,里面会泄露服务器的所有配置信息,甚至数据库密码,是高危的敏感文件;
  4. .git/config:Git配置文件,说明网站的.git目录泄露了,我们可以直接把整个网站的源码下载下来,这是超级高危的漏洞。

这些结果,全都是渗透测试中最有价值的目标,比那些工具扫出来的一堆404,有用太多了。而且整个过程,你只用了10行核心代码,就拥有了自己的专属渗透工具。

避坑指南:新手写扫描爬虫,最容易踩的5个坑

我带过很多新手,发现大家写这个脚本的时候,总会踩同样的坑,我给你整理出来,你直接避开:

坑1:频率过快,直接打崩靶场

很多新手觉得,速度越快越好,不加延迟,一秒发几十个请求,结果直接把本地Apache服务器打崩了,靶场直接打不开,还要重启服务。
避坑方法:一定要加延迟,入门阶段,0.1秒一次就够了,哪怕扫200个路径,也才20秒,完全够快,不会打崩靶场。

坑2:默认UA,被WAF一键拦截

很多人用默认的requests UA,扫着扫着,IP就被靶场的WAF封了,所有请求都返回403,还不知道为什么。
避坑方法:一定要加浏览器UA,模拟正常用户,WAF就不会拦你了,上面的优化代码已经帮你加好了。

坑3:路径拼接错误,扫半天啥也找不到

比如目标是http://localhost/dvwa,路径是admin,结果拼接成http://localhost/dvwaadmin,少了个斜杠,所有路径都错了,扫半天全是404,还以为是靶场的问题。
避坑方法:用target.rstrip("/") + "/" + path来拼接,不管目标末尾有没有斜杠,都能拼对,上面的代码已经帮你处理好了。

坑4:用超大字典,扫几个小时没结果

新手上来就找那种几万行的大字典,想着扫的越全越好,结果扫了几个小时,还没扫完,早就没耐心了,而且还容易打崩靶场。
避坑方法:入门阶段,就用我们给的20条小字典,先拿到结果,建立信心,等你熟练了,再慢慢加字典,循序渐进。

坑5:乱扫第三方网站,踩了法律红线

这个是最致命的,很多人写完脚本,就想去扫公网的网站,试试手,结果直接踩了《刑法》285条的红线,把自己送进去了。
避坑方法:永远记住,所有的测试,都只能在你自己搭建的本地靶场,或者有对方书面授权的目标上做,公网的任何网站,没授权都绝对不能碰,这个红线,焊死在脑子里。

结尾福利 & 下期预告

恭喜你,看到这里,你已经写出了自己的第一个渗透工具,用10行代码,实现了目录扫描,一键扫出靶场的所有敏感资产,已经超过了90%只会用别人工具的脚本小子。

下一篇文章,我会带你把这个爬虫彻底升级,变成一个全功能的信息收集神器,自动爬取子域名、识别网站指纹、扫描敏感信息泄露,一键搞定渗透测试第一步的全量信息收集,让你不用再一个个工具凑,一个爬虫就够了。

粉丝专属互动

现在,把你的脚本运行结果,贴在评论区,我会抽3位粉丝,免费帮你优化定制专属脚本:

  • 如果你想加自定义的扫描路径,我帮你加;
  • 如果你想加并发加速,我帮你改;
  • 如果你想适配你自己的靶场,我帮你调。

如果你想跟着我,从零基础开始,一步步打造自己的渗透工具栈,形成自己的挖洞思路,一定要点赞+收藏+关注,不然刷着刷着,就找不到这个系列教程了。

网安之路,底线为先,实战为王。我们下一篇文章,不见不散。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐